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