aboutsummaryrefslogtreecommitdiffstats
path: root/src/whitelist.py
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@cepl.eu>2023-05-25 10:15:47 +0200
committerMatěj Cepl <mcepl@cepl.eu>2023-05-25 11:01:18 +0200
commitec4b49d843e67b31b33ac81bef55346353f1d04c (patch)
tree5f60ffae4d6ebe180c5ee4d51d468bf154535251 /src/whitelist.py
parent8006d981ce26fe8c1140e33b9476c08470d59f30 (diff)
downloadpygn-ec4b49d843e67b31b33ac81bef55346353f1d04c.tar.gz
refactor: rearrange the project to the src/ layout.0.10.3
Fix also pyproject.toml to generate what seems right. Add the explicit dependency on nntplib for Python >= 3.12 (gh#python/cpython!104894). Fixes: https://todo.sr.ht/~mcepl/pygn/7
Diffstat (limited to 'src/whitelist.py')
-rw-r--r--src/whitelist.py99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/whitelist.py b/src/whitelist.py
new file mode 100644
index 0000000..4e02f0e
--- /dev/null
+++ b/src/whitelist.py
@@ -0,0 +1,99 @@
+"""News to mail gateway script. Copyright 2000 Cosimo Alfarano
+
+Author: Cosimo Alfarano
+Date: June 11 2000
+
+whitelist.py - (C) 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It>
+You can use this software under the terms of the GPL. If we meet some day,
+and you think this stuff is worth it, you can buy me a beer in return.
+
+Thanks to md for this useful formula. Beer is beer.
+
+whitelist manage a list of trusted user.
+"""
+
+from __future__ import absolute_import
+import logging
+# logging.basicConfig(level=logging.DEBUG)
+import sys
+import time
+
+import wlp
+
+
+class whitelist(object):
+ """whitelist handling class
+
+ Do you really want anyone can post? Ah ah ah.
+ """
+ wl = {}
+
+ # constants
+ DENY = 0
+ ACCEPT = 1
+
+ def __init__(self, wlfile, logfile='pyg.log'):
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.INFO)
+ log_fh = logging.FileHandler(logfile)
+ log_fmt = logging.Formatter(
+ '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+ log_fh.setFormatter(log_fmt)
+ self.logger.addHandler(log_fh)
+
+ # dict is a { ownername : {variable: value}} dictionary of dictionaries
+ with open(wlfile) as inf:
+ self.wl = wlp.mkdict(inf)
+
+ def checkfrom(self, fromhead):
+ """have you permission to be here, sir?"""
+ for owner in self.wl:
+ # here colon after 'From' IS required, because binary module wl
+ # expects it.
+ # TODO: when switching to the python lexxing, remove this
+ # limitation.
+ if fromhead.find(self.wl[owner]['From:']) >= 0:
+ return owner
+ else:
+ return None
+
+ def logmsg(self, heads, ok=DENY, owner=None):
+ """who are walking through my gate?
+ """
+
+ ltime = time.ctime(time.time())
+
+ if time.daylight:
+ tzone = time.tzname[1]
+ else:
+ tzone = time.tzname[0]
+
+ if ok == self.ACCEPT:
+ self.logger.info('Permission Accorded ')
+ else:
+ self.logger.info('Permission Denied ')
+
+ self.logger.info('at %s (%s)', ltime, tzone)
+ if owner is not None:
+ self.logger.debug('\tWLOwner: ' + owner + '')
+ self.logger.debug('\tFrom: ' + heads.get('From', 'NOT PRESENT'))
+ self.logger.debug('\tSubject: ' + heads.get('Subject', 'NOT PRESENT'))
+ self.logger.debug('\tSender: ' + heads.get('Sender', 'NOT PRESENT'))
+ self.logger.debug('\tDate: ' + heads.get('Date', 'NOT PRESENT'))
+
+ # some client create Message-Id other Message-ID.
+ if 'Message-ID' in heads:
+ self.logger.debug('\tMessage-ID: ' + heads.get('Message-ID'))
+ else:
+ self.logger.debug('\tMessage-Id: ' + heads.get('Message-Id',
+ 'NOT PRESENT'))
+
+ # X-Newsgroups: and To: are present if user is trusted, else
+ # Newsgroup: exists since no changes on nntp headers are done.
+ if 'X-Newsgroups' in heads:
+ self.logger.debug('\tTo: ' + heads.get('To', 'NOT PRESENT'))
+ self.logger.debug('\tX-Newsgroups: ' + heads.get('X-Newsgroups',
+ 'NOT PRESENT'))
+ else:
+ self.logger.debug('\tNewsgroups: ' +
+ heads.get('Newsgroups', 'NOT PRESENT'))