Initial implementation of POST command
This commit is contained in:
parent
abac757be2
commit
feb7fc7cce
1 changed files with 56 additions and 0 deletions
|
@ -701,6 +701,61 @@ class Session():
|
|||
|
||||
return self.respond(ResponseCode.NNTP_ARTICLE_STAT_RESPONSE, text)
|
||||
|
||||
RE_NEWSGROUPS_SPLIT = re.compile(r'\s*,\s*')
|
||||
|
||||
def _save_message(self, message: Message):
|
||||
value = message.header('Newsgroups')
|
||||
|
||||
if value is None or value == '':
|
||||
return False
|
||||
|
||||
names = map(lambda s: s.lower(), value)
|
||||
newsgroups = list()
|
||||
|
||||
for name in names:
|
||||
if name not in self.server.newsgroups:
|
||||
return False
|
||||
|
||||
newsgroups.append(self.server.newsgroups[name])
|
||||
|
||||
if len(newsgroups) == 0:
|
||||
return False
|
||||
|
||||
for newsgroup in newsgroups:
|
||||
sql = """
|
||||
insert into newsgroup_message (
|
||||
newsgroup_id, message_id
|
||||
) values (?, ?)
|
||||
"""
|
||||
|
||||
cr = self.db.execute(sql, (newsgroup.id, message.id))
|
||||
|
||||
return True
|
||||
|
||||
def _cmd_post(self):
|
||||
self.respond(ResponseCode.NNTP_INQUIRY_ARTICLE)
|
||||
|
||||
message = Message()
|
||||
|
||||
while True:
|
||||
line = self.readline()
|
||||
|
||||
if line == '':
|
||||
self.active = False
|
||||
break
|
||||
elif line == '.':
|
||||
if self._save_message(message):
|
||||
return self.respond(ResponseCode.NNTP_ARTICLE_RECEIVED)
|
||||
else:
|
||||
return self.respond(ResponseCode.NNTP_POST_FAILED)
|
||||
elif line == '..':
|
||||
line = '.'
|
||||
|
||||
try:
|
||||
message.readline(line)
|
||||
except:
|
||||
return self.respond(ResponseCode.NNTP_POST_FAILED)
|
||||
|
||||
def _cmd_date(self):
|
||||
timestamp = datetime.datetime.now(datetime.UTC)
|
||||
|
||||
|
@ -731,6 +786,7 @@ class Session():
|
|||
'OVER': _cmd_over,
|
||||
'XOVER': _cmd_over,
|
||||
'STAT': _cmd_stat,
|
||||
'POST': _cmd_post,
|
||||
'DATE': _cmd_date,
|
||||
'QUIT': _cmd_quit,
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue