aboutsummaryrefslogtreecommitdiffstats
path: root/whitelist.py
blob: fab0824eab2a6ed5ce193a2ffc616c3bc7ca0c91 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"""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.
"""

import sys
import time
import fcntl

import wlp


class whitelist(object):
    """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 fromhead[:-1].find(self.wl[owner]['From:']) >= 0:
                return owner
            else:
                return None

    # FIXME self.log has been already defined as a variable of None value on
    # line 30.
    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 is not 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 'Message-ID:' in heads:
            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 'X-Newsgroups:' in heads:
            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')