index koincidence pro kratke zpravy
[krypto.git] / robot.py
1 #!/usr/bin/env python
2
3 """Mailove rozhrani pro sadu kryptoanalytickych nastroju."""
4
5 import os
6 import sys
7 import re
8 import smtplib
9 import email
10 from email.mime.text import MIMEText
11 from time import asctime
12 import pickle
13
14 from ocesavac import ocesat
15 from spolecne import ABECEDA
16 import krypto
17
18 class settings:
19     pass
20
21 settings = pickle.load(open('./robot_settings'))
22 os.chdir(settings.path)
23
24 def posli_mail(komu, predmet, text, loguj=None):
25     msg = MIMEText(text)
26     msg['Subject'] = predmet
27     msg['From'] = settings.name + " <" + settings.mail  + ">"
28     msg['To'] = komu
29     smtplib.SMTP('localhost').sendmail(settings.mail, komu, msg.as_string())
30     if loguj:
31         soubor = open(loguj, 'w')
32         soubor.write(msg.as_string())
33         soubor.close()
34
35 # Cteni mailu
36 mail = email.message_from_file(sys.stdin)
37 predmet, _, opsny = mail['Subject'].strip().upper().partition(' ')
38 odesilatel = mail['From']
39 if predmet != settings.subject:
40     sys.exit()
41
42 if opsny == 'H':
43     #TODO dokumentace k Vigenerovi
44     posli_mail(odesilatel, "Napoveda", ''.join(["Napoveda:\n"
45                "Prikazy robotovi vkladejte do predmetu zpravy "
46                "zaslane na adresu ", 
47                settings.mail, ".\nNa velikosti pismen nezalezi."
48                "\n\nSeznam prikazu:\n"
49                "\"", settings.subject, "\"   Analyza zpravy z tela mailu.\n" 
50                "\"", settings.subject, " X\" Vynuti analyzu bez mezer.\n"
51                "\"", settings.subject, " M\" Vynuti analyzu s mezerami.\n"
52                "\"", settings.subject, " B\" Vypise cetnost vsech bigramu.\n"
53                "\"", settings.subject, " P\" Vypise vsechny posunuti textu.\n"
54                "\"", settings.subject, " A\" Vypise uplne vsechno co dava "
55                "alespon trochu smysl (nedoporucuji).\n"
56                "\"", settings.subject, " H\" Tato napoveda.\n"
57                "\nVolby (mimo \"H\") je mozno libovolne kombinovat.\n"
58                "Napriklad \"", settings.subject, " LXB\" analyzuje posledni "
59                "prijatou zpravu s vynucenim analyzy bez mezer a navic vypise "
60                "cetnosti bigramu.\n"
61                "\nS pozdravem\nVas Robot\n"]))
62     sys.exit()
63
64 if 'L' in opsny:
65     mail = pickle.load(open('./msg_last.tmp'))
66     m1 = re.match(r".*\<(.*)\>.*", mail['From'])
67     m2 = re.match(r".*\<(.*)\>.*", odesilatel)
68     if m1:
69         f1 = m1.group(1)
70     else:
71         f1 = mail['From']
72     if m2:
73         f2 = m2.group(1)
74     else:
75         f2 = odesilatel
76     if (f1 != f2):
77         posli_mail(odesilatel, "Omluva", "Omlouvam se,"
78                    " ale Vase zprava uz bohuzel neni na serveru ulozena.\n")
79         sys.exit()
80
81 if mail.is_multipart():
82     telo = mail.get_payload(0).get_payload().strip()
83 else:
84     telo = mail.get_payload().strip()
85
86 if len(ocesat(telo, False)) < 2:
87     posli_mail(odesilatel, "Omluva", "Omlouvam se,"
88                    " ale Vase zprava je prilis kratka.\n")
89     sys.exit()
90 zprava = telo.upper()
91
92 analyza = krypto.analyza(zprava, opsny)
93
94
95 posli_mail(odesilatel,
96            "Analyza Vasi zpravy",
97            analyza + "\nS pozdravem\nVas Robot",
98            './robot_last.tmp')
99
100 f = open('./msg_last.tmp', 'w')
101 pickle.dump(mail, f)
102 f.close()
103
104 f = open('./robot.log', 'a')
105 m = re.match(r".*\<(.*)\>.*", odesilatel)
106 if m:
107     odesilatel2 = m.group(1)
108 else:
109     odesilatel2 = odesilatel
110 f.write(asctime() + " " +  odesilatel2 + " " + opsny + "\n")
111 f.close()