summaryrefslogtreecommitdiff
path: root/modules/mm_admin.py
blob: 2accb33710b58eea61c16ca6e6e8607ecf9f1e42 (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
130
131
132
# When an operation can't be completed, and is sent to the list admin for
# Handling, we consider that an error condition, and raise MMNeedApproval

import mm_err, mm_cfg, mm_message
import os, marshal, time, string

class ListAdmin:
    def InitVars(self):
	# Non-configurable data:
	self.requests = {}
	self.next_request_id = 1

    def AddRequest(self, request, *args):
	now = time.time()
	request_id = self.GetRequestId()
	if not self.requests.has_key(request):
	    self.requests[request] = [(request_id, now) + args]
	else:
	    self.requests[request].append( (request_id, now) + args )
	self.Save()
	if request == 'add_member':
	    raise mm_err.MMNeedApproval, "Admin approval required to subscribe"
	elif request == 'post':
	    raise mm_err.MMNeedApproval, args[1]

    def CleanRequests(self):
	for (key, val) in self.requests.items():
	    if not len(val):
		del self.requests[key]

    def GetRequest(self, id):
	for (key, val) in self.requests.items():
	    for i in range(len(val)):
		if val[i][0] == id:
		    return (key, i)
	raise mm_err.MMBadRequestId

    def RemoveRequest(self, id):
	for (key, val) in self.requests.items():
	    for item in val:
		if item[0] == id:
		    val.remove(item)
		    return
	raise mm_err.MMBadRequestId

    def RequestsPending(self):
	self.CleanRequests()
	total = 0
	for (k,v) in self.requests.items():
	    total = total + len(v)
	return total

    def HandleRequest(self, request_info, value, comment=None):
	request = request_info[0]
	index = request_info[1]
	request_data = self.requests[request][index]
	if request == 'add_member':
	    self.HandleAddMemberRequest(request_data[2:], value, comment)
	elif request == 'post':
	    self.HandlePostRequest(request_data[2:], value, comment)
	self.RemoveRequest(request_data[0])

    def HandlePostRequest(self, data, value, comment):
	destination_email = data[0][0]
	msg = mm_message.IncomingMessage(data[0][1])
	if not value:
	    request = 'Posting of your message entitled:\n\t\t %s' % \
		      msg.getheader('subject')
	    if not comment:
		comment = data[1]
	    # If there's an extra arg on data, we don't send an error message.
	    # This is because if people are posting to a moderated list, they
	    # Are expecting to wait on approval.
	    if len(data) < 3:
		if not self.dont_respond_to_post_requests:
		    self.RefuseRequest(request, destination_email, comment, msg)
	else:
	    self.Post(msg, 1)

    def HandleAddMemberRequest(self, data, value, comment):
	digest = data[0]
	destination_email = data[1]
	pw = data[2]
	if value == 0:
	    if digest:
		digest_text = 'digest'
	    else:
		digest_text = 'nodigest'
	    self.RefuseRequest('subscribe %s %s' % (pw, digest_text),
			       destination_email, comment)
	else:
	    self.ApprovedAddMember(destination_email, pw, digest)



# Don't call any methods below this point from outside this mixin.

    def GetRequestId(self):
	id = self.next_request_id
	self.next_request_id = self.next_request_id + 1
	# No need to save, we know it's about to be done.
	return id

    def RefuseRequest(self, request, destination_email, comment, msg=None):
	text = '''Your request to the '%s' mailing-list:

	%s

Has been rejected by the list moderator.
''' % (self.real_name, request)
        if comment:
	    text = text + '''
The moderator gave the following reason for rejecting your request:

        %s

''' % comment
        text = text + 'Any questions or comments should be directed to %s.\n' \
	       % self.GetAdminEmail()
        if msg:
	    text = text  + '''
Your original message follows:

%s

%s
''' % (string.join(msg.headers, ''), msg.body)
	
        self.SendTextToUser(subject = '%s request rejected' % self.real_name,
                            recipient = destination_email,
			    text = text)