diff options
Diffstat (limited to 'whitelist.py')
-rw-r--r-- | whitelist.py | 194 |
1 files changed, 111 insertions, 83 deletions
diff --git a/whitelist.py b/whitelist.py index cd0906c..7eb88cd 100644 --- a/whitelist.py +++ b/whitelist.py @@ -3,7 +3,7 @@ Author: Cosimo Alfarano Date: June 11 2000 -whitelist.py - (C) 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It> +whitelist.py - Copyright 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. @@ -12,90 +12,118 @@ Thanks to md for this useful formula. Beer is beer. whitelist manage a list of trusted user. """ -import logging import sys +import string import time +import fcntl + +import pyginfo 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='wl.pyg', 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) - - try: - wlp.setfilebyname(wlfile) - except Exception as ex: - self.logger.exception('Opening %s: %s', wlfile, ex) - sys.exit(1) - - # dict is a { ownername : {variable: value}} dictionary of dictionaries - self.wl = wlp.mkdict() - - def checkfrom(self, fromhead): - """have you permission to be here, sir?""" - for owner in self.wl.keys(): - # here colon after 'From' IS required, because binary module wl - # expects it. - # TODO: when switching to the python lexxing, remove this - # limitation. - if fromhead[:-1].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.info('\tWLOwner: ' + owner + '') - self.logger.info('\tFrom: ' + heads.get('From', 'NOT PRESENT')) - self.logger.info('\tSubject: ' + heads.get('Subject', 'NOT PRESENT')) - self.logger.info('\tSender: ' + heads.get('Sender', 'NOT PRESENT')) - self.logger.info('\tDate: ' + heads.get('Date', 'NOT PRESENT')) - - # some client create Message-Id other Message-ID. - if 'Message-ID' in heads: - self.logger.info('\tMessage-ID: ' + heads.get('Message-ID')) - else: - self.logger.info('\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.info('\tTo: ' + heads.get('To', 'NOT PRESENT')) - self.logger.info('\tX-Newsgroups: ' + heads.get('X-Newsgroups', - 'NOT PRESENT')) - else: - self.logger.info('\tNewsgroups: ' + - heads.get('Newsgroups', 'NOT PRESENT')) +class whitelist: + """whitelist handling class + + Do you really want anyone can post? Ah ah ah. + """ + + wl = {} + debug = None + log = None # filedescriptor + + # constants + DENY = 0 + ACCEPT = 1 + + def __init__(self, wlfile='wl.pyg', logfile='pyg.log', debug=0): + + self.debug = debug + + try: + wlp.setfilebyname(wlfile) + except (Exception), (errno,message): + print 'Opening %s: %s (errno %d)' % (wlfile,message,errno) + sys.exit(0) + + # dict is a { ownername : {variable: value}} dictionary of dictionaries + self.wl = wlp.mkdict() + +# print 'owner: option = value' +# for owner in self.wl.keys(): +# for option in self.wl[owner].keys(): +# print '%s: %s = %s' % (owner,option,self.wl[owner][option]) + + try: + self.log = open(logfile, 'a') + self.lock() + except (Exception), message: + print '%s\nAre you authorized to use this program? ' % message + sys.exit(1) + + def lock(self): + fcntl.flock(self.log.fileno(),fcntl.LOCK_EX) + + # to unlock fd locked, usually fd are unlocked after process exit() + def unlock(self): + fcntl.flock(self.log.fileno(),fcntl.LOCK_UN) + + def checkfrom(self, fromhead): + """have you permission to be here, sir?""" + + for owner in self.wl.keys(): +# if(self.wl[owner]['From:'] == fromhead[:-1]): # remove '\n' + if(string.find(fromhead[:-1],self.wl[owner]['From:']) >= 0): + return owner + else: + return None + + + def log(self, string): + """Captain Diary, Astral Date 962555394 from epoch. + it rawly write a line in logfile. Remeber to indent it, if you + like. + """ + + self.log.write(string + '\n') + + def logmsg(self, heads, ok=DENY,owner=None): + """who are walking through my gate? + log + """ + + ltime = time.ctime(time.time()) + + if time.daylight: + tzone = time.tzname[1] + else: + tzone = time.tzname[0] + + if(ok == self.ACCEPT): + self.log.write('Permission Accorded ') + else: + self.log.write('Permission Denied ') + + self.log.write('at %s (%s)\n' % (ltime,tzone)) + if(owner != None): + self.log.write('\tWLOwner: ' + owner + '\n') + self.log.write('\tFrom: ' + heads.get('From:','NOT PRESENT\n')) + self.log.write('\tSubject: ' + heads.get('Subject:','NOT PRESENT\n')) + self.log.write('\tSender: ' + heads.get('Sender:','NOT PRESENT\n')) + self.log.write('\tDate: ' + heads.get('Date:','NOT PRESENT\n')) + + # some client create Message-Id other Message-ID. + if(heads.has_key('Message-ID:')): + self.log.write('\tMessage-ID: ' + heads.get('Message-ID:')) + else: + self.log.write('\tMessage-Id: ' + heads.get('Message-Id:','NOT PRESENT\n')) + + # X-Newsgroups: and To: are present if user is trusted, else + # Newsgroup: exists since no changes on nntp headers are done. + if(heads.has_key('X-Newsgroups:')): + self.log.write('\tTo: ' + heads.get('To:','NOT PRESENT\n')) + self.log.write('\tX-Newsgroups: ' + heads.get('X-Newsgroups:','NOT PRESENT\n')) + else: + self.log.write('\tNewsgroups: ' + heads.get('Newsgroups:','NOT PRESENT\n')) + + + self.log.write('\n') |