~ubuntu-branches/ubuntu/oneiric/moin/oneiric-security

« back to all changes in this revision

Viewing changes to MoinMoin/action/SubscribeUser.py

  • Committer: Bazaar Package Importer
  • Author(s): Jamie Strandboge
  • Date: 2010-03-30 12:55:34 UTC
  • mfrom: (0.1.17 sid)
  • Revision ID: james.westby@ubuntu.com-20100330125534-4c2ufc1rok24447l
Tags: 1.9.2-2ubuntu1
* Merge from Debian testing (LP: #521834). Based on work by Stefan Ebner.
  Remaining changes:
 - Remove python-xml from Suggests field, the package isn't anymore in
   sys.path.
 - Demote fckeditor from Recommends to Suggests; the code was previously
   embedded in moin, but it was also disabled, so there's no reason for us
   to pull this in by default currently. Note: This isn't necessary anymore
   but needs a MIR for fckeditor, so postpone dropping this change until
   lucid+1
* debian/rules:
  - Replace hardcoded python2.5 with python* and hardcore python2.6 for ln
* debian/control.in: drop versioned depends on cdbs

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
"""
2
2
   MoinMoin - Subscribeuser - Action
3
 
   Subscribe a user to a page
 
3
   Subscribe (or unsubscribe) a user to a page.
4
4
 
5
5
   @copyright: 2003 Daniela Nicklas <nicklas@informatik.uni-stuttgart.de>,
6
 
               2005 MoinMoin:AlexanderSchremmer
 
6
               2005 MoinMoin:AlexanderSchremmer,
 
7
               2009 MoinMoin:ThomasWaldmann
7
8
   @license: GNU GPL, see COPYING for details.
8
9
"""
9
10
 
10
 
import sys, os
11
 
#sys.path.append("YOUR CONFIG DIRECTORY HERE")
 
11
import sys, os, re
12
12
 
13
13
from MoinMoin.Page import Page
14
14
from MoinMoin import user
15
15
from MoinMoin import wikiutil
16
16
 
 
17
 
17
18
def show_form(pagename, request):
18
19
    _ = request.getText
19
 
    request.emit_http_headers()
20
20
    request.theme.send_title(_("Subscribe users to the page %s") % pagename, pagename=pagename)
21
21
 
22
22
    request.write("""
23
 
<form action="%s/%s" method="POST" enctype="multipart/form-data">
 
23
<form action="%s" method="POST" enctype="multipart/form-data">
24
24
<input type="hidden" name="action" value="SubscribeUser">
25
25
%s <input type="text" name="users" size="50">
26
26
<input type="submit" value="Subscribe">
27
27
</form>
28
 
""" % (request.getScriptname(), wikiutil.quoteWikinameURL(pagename),
 
28
""" % (request.href(pagename),
29
29
      _("Enter user names (comma separated):")))
30
30
    request.theme.send_footer(pagename)
31
31
    request.theme.send_closing_html()
32
32
 
 
33
 
 
34
def parse_re(usernames):
 
35
    username_regexes = []
 
36
    for name in usernames:
 
37
        if name.startswith("re:"):
 
38
            name = name[3:]
 
39
        else:
 
40
            name = re.escape(name)
 
41
        username_regexes.append(name)
 
42
    return username_regexes
 
43
 
 
44
 
 
45
def parse_userlist(usernames):
 
46
    subscribe = []
 
47
    unsubscribe = []
 
48
    for name in usernames:
 
49
        if name.startswith("-"):
 
50
            unsubscribe.append(name[1:])
 
51
        elif name.startswith("+"):
 
52
            subscribe.append(name[1:])
 
53
        else:
 
54
            subscribe.append(name)
 
55
    return parse_re(subscribe), parse_re(unsubscribe)
 
56
 
 
57
 
33
58
def show_result(pagename, request):
34
59
    _ = request.getText
35
 
    request.emit_http_headers()
36
60
 
37
61
    request.theme.send_title(_("Subscribed for %s:") % pagename, pagename=pagename)
38
62
 
39
63
    from MoinMoin.formatter.text_html import Formatter
40
64
    formatter = Formatter(request)
41
65
 
42
 
    result = subscribe_users(request, request.form['users'][0].split(","), pagename, formatter)
 
66
    usernames = request.form['users'].split(",")
 
67
    subscribe, unsubscribe = parse_userlist(usernames)
 
68
 
 
69
    result = subscribe_users(request, subscribe, unsubscribe, pagename, formatter)
43
70
    request.write(result)
44
71
 
45
72
    request.theme.send_footer(pagename)
46
73
    request.theme.send_closing_html()
47
74
 
48
 
def subscribe_users(request, usernamelist, pagename, formatter):
 
75
 
 
76
def subscribe_users(request, subscribe, unsubscribe, pagename, formatter):
49
77
    _ = request.getText
50
78
 
51
79
    if not Page(request, pagename).exists():
52
80
        return u"Page does not exist."
53
81
 
54
82
    result = []
55
 
 
56
 
    realusers = []              # usernames that are really wiki users
 
83
    did_match = {}
57
84
 
58
85
    # get user object - only with IDs!
59
86
    for userid in user.getUserList(request):
60
 
        success = False
61
87
        userobj = user.User(request, userid)
62
 
 
63
 
        if userobj.name in usernamelist:   # found a user
64
 
            realusers.append(userobj.name)
65
 
            if userobj.isSubscribedTo([pagename]):
66
 
                success = True
67
 
            elif not userobj.email and not userobj.jid:
68
 
                success = False
69
 
            elif userobj.subscribe(pagename):
70
 
                success = True
71
 
            if success:
72
 
                result.append(formatter.smiley('{OK}'))
73
 
                result.append(formatter.text(" "))
74
 
            else:
75
 
                result.append(formatter.smiley('{X}'))
76
 
                result.append(formatter.text(" "))
77
 
            result.append(formatter.url(1, Page(request, userobj.name).url(request)))
78
 
            result.append(formatter.text(userobj.name))
79
 
            result.append(formatter.url(0))
80
 
            result.append(formatter.linebreak(preformatted=0))
81
 
 
82
 
    result.extend([''.join([formatter.smiley('{X}'), formatter.text(" " + _("Not a user:") + " " + username), formatter.linebreak(preformatted=0)]) for username in usernamelist if username not in realusers])
 
88
        name = userobj.name
 
89
 
 
90
        matched = subscribed = False
 
91
 
 
92
        for name_re in unsubscribe:
 
93
            if re.match(name_re, name, re.U):
 
94
                matched = did_match[name_re] = True
 
95
                if (not userobj.isSubscribedTo([pagename]) or
 
96
                    userobj.unsubscribe(pagename)):
 
97
                    subscribed = False
 
98
                break
 
99
 
 
100
        for name_re in subscribe:
 
101
            if re.match(name_re, name, re.U):
 
102
                matched = did_match[name_re] = True
 
103
                if (userobj.isSubscribedTo([pagename]) or
 
104
                    (userobj.email or userobj.jid) and userobj.subscribe(pagename)):
 
105
                    subscribed = True
 
106
                break
 
107
 
 
108
        if matched:
 
109
            result.extend([formatter.smiley(subscribed and '{*}' or '{o}'),
 
110
                           formatter.text(" "),
 
111
                           formatter.url(1, Page(request, name).url(request)),
 
112
                           formatter.text(name),
 
113
                           formatter.url(0),
 
114
                           formatter.linebreak(preformatted=0),
 
115
                          ])
 
116
 
 
117
    result.extend([''.join([formatter.smiley('{X}'),
 
118
                            formatter.text(" " + _("Not a user:") + " " + name_re),
 
119
                            formatter.linebreak(preformatted=0)])
 
120
                   for name_re in subscribe + unsubscribe if name_re not in did_match])
83
121
 
84
122
    return ''.join(result)
85
123
 
 
124
 
86
125
def execute(pagename, request):
87
126
    _ = request.getText
88
127
    if not request.user.may.admin(pagename):
94
133
    else:
95
134
        show_result(pagename, request)
96
135
 
 
136
 
97
137
if __name__ == '__main__':
98
138
    args = sys.argv
99
 
    if not len(args) > 1:
 
139
    if len(args) < 2:
100
140
        print >>sys.stderr, """Subscribe users
101
141
 
102
 
%(myname)s pagename username[,username[,username[,...]]] [URL]
103
 
 
104
 
Subscribes the users to a page.
 
142
%(myname)s pagename [+|-][re:]username[,username[,username[,...]]] [URL]
 
143
 
 
144
+username: subscribes user <username> to page <pagename>.
 
145
-username: unsubscribes user <username> from page <pagename>.
 
146
+re:username_re: subscribes users who match <username_re> regex.
 
147
-re:username_re: unsubscribes users who match <username_re> regex.
 
148
 
105
149
URL is just needed for a farmconfig scenario.
106
150
 
107
151
Example:
111
155
        raise SystemExit
112
156
 
113
157
    pagename = args[1]
114
 
    usernames = args[2]
 
158
    usernames = args[2].split(",")
115
159
 
116
160
    if len(args) > 3:
117
161
        request_url = args[3]
118
162
    else:
119
 
        request_url = "localhost/"
 
163
        request_url = None
120
164
 
121
165
    # Setup MoinMoin environment
122
 
    from MoinMoin.request import request_cli
123
 
    request = request_cli.Request(url=request_url)
124
 
    request.form = request.args = request.setup_args()
 
166
    from MoinMoin.web.contexts import ScriptContext
 
167
    request = ScriptContext(url=request_url)
125
168
 
126
169
    from MoinMoin.formatter.text_plain import Formatter
127
170
    formatter = Formatter(request)
128
171
 
129
 
    print subscribe_users(request, usernames.split(","), pagename, formatter)
 
172
    subscribe, unsubscribe = parse_userlist(usernames)
 
173
 
 
174
    print subscribe_users(request, subscribe, unsubscribe, pagename, formatter)
130
175