From feb7fc7cce4bef4e1426449a5510a7e070c32965 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sat, 30 Nov 2024 17:11:27 -0500 Subject: [PATCH] Initial implementation of POST command --- lib/nntp/tiny/session.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index 62a524e..33f4edb 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -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, }