diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index c4748c9..d5b9b94 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -764,6 +764,48 @@ class Session(): except: return self.respond(ResponseCode.NNTP_POST_FAILED) + def _cmd_ihave(self, message_id): + sql = """ + select + count(message_id) + from + message + where + message_id = ? + """ + + cr = self.db.execute(sql, (message_id,)) + row = cr.fetchone() + + if row is not None and row[0] > 0: + return self.respond(ResponseCode.NNTP_ARTICLE_NOT_WANTED_ID) + + self.respond(ResponseCode.NNTP_INQUIRY_ARTICLE_ID) + + message = Message() + + while True: + line = self.readline() + + if line == '': + self.active = False + break + elif line == '.': + if message.message_id != message_id: + return self.respond(ResponseCode.NNTP_POST_FAILED) + + if self._save_message(message): + return self.respond(ResponseCode.NNTP_ARTICLE_RECEIVED_ID) + 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) @@ -795,6 +837,7 @@ class Session(): 'XOVER': _cmd_over, 'STAT': _cmd_stat, 'POST': _cmd_post, + 'IHAVE': _cmd_ihave, 'DATE': _cmd_date, 'QUIT': _cmd_quit, }