Skip to content

Commit a4a0ff0

Browse files
author
Leandro Mendes
committed
mais correcoes de bugs no ppsmtpd.py, @todo - processar mensagens > 4k
1 parent b13527f commit a4a0ff0

File tree

3 files changed

+60
-28
lines changed

3 files changed

+60
-28
lines changed

__main__.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@
44
from PPFilter import *
55
import syslog, os, sys, pwd
66
import ppsmtpd, socket
7-
import threading
7+
import threading, signal
88

99
syslog.openlog('ppfilter', syslog.LOG_PID|syslog.LOG_NOWAIT, syslog.LOG_MAIL)
1010

11+
def handler(signum, frame):
12+
print 'recebido'
13+
1114
class NonRootException(Exception):
1215
pass
1316

1417
class SMTPD(ppsmtpd.SMTPServer):
1518

1619
message = None
1720

18-
def process_message(self, mail_from, rcpts_to, message):
21+
def process_message(self, mail_from, rcpts_to, message_data):
1922

20-
self.message = message
23+
self.message_data = message_data
2124
filepath = None
2225

2326
try:
24-
self.message = {'mailfrom': mail_from, 'rcpts': rcpts_to, 'data': message}
27+
self.message = {'mailfrom': mail_from, 'rcpts': rcpts_to, 'data': message_data}
2528
filepath = enqueuer.enqueue(self.message)
2629
if filepath != None:
2730
sc = default.DefaultFilter(filepath)
@@ -38,13 +41,13 @@ def process_message(self, mail_from, rcpts_to, message):
3841
return
3942

4043
except scanner.ContentFilterSpamException, e:
41-
if spam_final_action == "tag":
44+
if config.spam_final_action == "tag":
4245
msg = message.Message(filepath)
4346
eml = msg.get_message()
4447
eml.add_header("X-Spam-Status", "Spam, score: %s" % (e) )
4548
msg.write_message()
4649
self.send_back(filepath)
47-
elif spam_final_action == "discard":
50+
elif config.spam_final_action == "discard":
4851
pass
4952

5053
def send_back(self, filepath):

ppfilter

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
PWD=$(pwd)
44
export PYTHONPATH=".:${PWD}/lib"
55

6-
python teste.py
6+
python .

ppsmtpd.py

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import socket
2-
import signal
32
import SocketServer
43
import threading
54
import sys
65
import re
6+
import signal
77

88
class SMTPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
99

@@ -13,57 +13,86 @@ def process_message(self, mail_from, rcpts_to, message):
1313
class SMTPRequestHandler(SocketServer.BaseRequestHandler):
1414

1515
read_data = False
16-
helo_host =
17-
mail_from =
16+
helo_host = None
17+
mail_from = None
1818
rcpts_to = []
19-
message =
19+
message = None
2020
hostname = socket.gethostname()
2121
message = ''
2222

2323
def handle(self):
24-
while True:
25-
try:
26-
if (self.read_data or self.request):
24+
try:
25+
self.f_socket = self.request.makefile()
26+
self.send_data("220 %s PPFilter ESMTP" % (self.hostname) )
27+
while True:
28+
if self.read_data:
29+
self.data = self.request.recv(4096)
30+
print self.data + '*'
31+
for text in self.data.split('\r\n'):
32+
if text and text[0] == '.':
33+
self.data = 'DOT'
34+
else:
35+
self.message += text + "\r\n"
36+
37+
# if re.match('^\.$', self.data.strip()):
38+
# self.data = 'DOT'
39+
self.parse_commands()
40+
41+
else:
2742
self.data = self.request.recv(1024)
28-
if self.parse_commands():
29-
pass
30-
except AttributeError:
31-
self.request.send('500 Unknown command\r\n')
32-
except Exception:
33-
pass
43+
print self.data + '*'
44+
self.parse_commands()
45+
46+
finally:
47+
self.request.close()
48+
# except AttributeError:
49+
# self.request.send('500 Unknown command\r\n')
50+
# except Exception:
51+
# pass
52+
53+
def send_data(self, data):
54+
print data
55+
self.request.send(data + "\r\n")
56+
self.f_socket.flush()
3457

3558
def parse_commands(self):
3659
cmd = []
3760
cmd = self.data.split(' ')
3861
if (len(cmd) < 2):
3962
cmd[0] = self.data.strip()
40-
print len(cmd)
63+
4164
method = (('self.smtp_' + cmd[0].upper().strip()) + '()')
65+
print method
4266
eval(method)
4367

4468
def smtp_MAIL(self):
4569
self.mail_from = self.data.split(':')[1].strip()
46-
self.request.send('250 Ok\r\n')
70+
self.send_data('250 Ok')
4771

72+
def smtp_EHLO(self):
73+
self.smtp_HELO()
4874

4975
def smtp_HELO(self):
5076
self.helo_host = self.data.split(' ')[1].strip()
51-
self.request.send(('250 %s\r\n' % self.hostname))
77+
self.send_data(("250 %s" % self.hostname))
5278

5379
def smtp_QUIT(self):
54-
self.request.send('221 Bye\r\n')
80+
self.send_data('221 Bye')
5581
self.request.close()
5682

5783
def smtp_DOT(self):
5884
response = self.server.process_message(self.mail_from, self.rcpts_to, self.message)
59-
if ((type(response).__name__ == 'str') and self.request.send((response + '\r\n'))):
60-
pass
85+
if type(response).__name__ == 'str':
86+
self.send_data((response))
87+
else:
88+
self.send_data('250 Ok')
6189
self.read_data = False
6290

6391
def smtp_RCPT(self):
6492
self.rcpts_to.append(self.data.split(':')[1].strip())
65-
self.request.send('250 Ok\r\n')
93+
self.send_data('250 Ok')
6694

6795
def smtp_DATA(self):
68-
self.request.send("354 Start mail input; end with '.'\r\n")
96+
print 'waiting for data'
97+
self.send_data("354 Start mail input; end with '.'")
6998
self.read_data = True

0 commit comments

Comments
 (0)