aboutsummaryrefslogtreecommitdiffstats
path: root/whitelist.py
diff options
context:
space:
mode:
Diffstat (limited to 'whitelist.py')
-rw-r--r--whitelist.py194
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')