~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/action/Despam.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mfrom: (0.9.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080622211713-fpo2zrq3s5dfecxg
Tags: 1.7.0-3
Simplify /etc/moin/wikilist format: "USER URL" (drop unneeded middle
CONFIG_DIR that was wrongly advertised as DATA_DIR).  Make
moin-mass-migrate handle both formats and warn about deprecation of
the old one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# -*- coding: iso-8859-1 -*-
2
2
"""
3
3
    MoinMoin - Despam action
4
 
    
 
4
 
5
5
    Mass revert changes done by some specific author / bot.
6
6
 
7
7
    @copyright: 2005 by ???, Thomas Waldmann
8
8
    @license: GNU GPL, see COPYING for details.
9
9
"""
10
10
 
 
11
DAYS = 30 # we look for spam edits in the last x days
 
12
 
11
13
import time
12
14
 
13
15
from MoinMoin.logfile import editlog
15
17
from MoinMoin.widget.browser import DataBrowserWidget
16
18
from MoinMoin import wikiutil, Page, PageEditor
17
19
from MoinMoin.macro import RecentChanges
18
 
from MoinMoin.formatter.text_html import Formatter
 
20
 
 
21
def render(editor_tuple):
 
22
    etype, evalue = editor_tuple
 
23
    if etype in ('ip', 'email', ):
 
24
        ret = evalue
 
25
    elif etype == 'interwiki':
 
26
        ewiki, euser = evalue
 
27
        if ewiki == 'Self':
 
28
            ret = euser
 
29
        else:
 
30
            ret = '%s:%s' % evalue
 
31
    else:
 
32
        ret = repr(editor_tuple)
 
33
    return ret
19
34
 
20
35
def show_editors(request, pagename, timestamp):
21
 
    _ =  request.getText
22
 
    
 
36
    _ = request.getText
 
37
 
23
38
    timestamp = int(timestamp * 1000000)
24
39
    log = editlog.EditLog(request)
25
40
    editors = {}
27
42
    for line in log.reverse():
28
43
        if line.ed_time_usecs < timestamp:
29
44
            break
30
 
        
 
45
 
31
46
        if not request.user.may.read(line.pagename):
32
47
            continue
33
 
        
34
 
        editor = line.getEditor(request)
 
48
 
 
49
        editor = line.getInterwikiEditorData(request)
35
50
        if not line.pagename in pages:
36
51
            pages[line.pagename] = 1
37
52
            editors[editor] = editors.get(editor, 0) + 1
38
 
            
 
53
 
39
54
    editors = [(nr, editor) for editor, nr in editors.iteritems()]
40
55
    editors.sort()
 
56
    editors.reverse()
41
57
 
42
58
    pg = Page.Page(request, pagename)
43
59
 
46
62
                       Column('pages', label=_("Pages"), align='right'),
47
63
                       Column('link', label='', align='left')]
48
64
    for nr, editor in editors:
49
 
        dataset.addRow((editor, unicode(nr), pg.link_to(request, text=_("Select Author"), querystr="action=Despam&editor=%s" % wikiutil.url_quote_plus(editor))))
50
 
    
 
65
        dataset.addRow((render(editor), unicode(nr),
 
66
            pg.link_to(request, text=_("Select Author"),
 
67
                querystr={
 
68
                    'action': 'Despam',
 
69
                    'editor': editor, # was: url_quote_plus()
 
70
                })))
 
71
 
51
72
    table = DataBrowserWidget(request)
52
73
    table.setData(dataset)
53
74
    table.render()
56
77
    pass
57
78
 
58
79
def show_pages(request, pagename, editor, timestamp):
59
 
    _ =  request.getText
60
 
    
 
80
    _ = request.getText
 
81
 
61
82
    timestamp = int(timestamp * 1000000)
62
83
    log = editlog.EditLog(request)
63
 
    lines = []
64
84
    pages = {}
65
85
    #  mimic macro object for use of RecentChanges subfunctions
66
86
    macro = tmp()
67
87
    macro.request = request
68
 
    macro.formatter = Formatter(request)
 
88
    macro.formatter = request.html_formatter
69
89
 
70
90
    request.write("<table>")
71
91
    for line in log.reverse():
72
92
        if line.ed_time_usecs < timestamp:
73
93
            break
74
 
        
 
94
 
75
95
        if not request.user.may.read(line.pagename):
76
96
            continue
77
97
 
78
98
        if not line.pagename in pages:
79
99
            pages[line.pagename] = 1
80
 
            if line.getEditor(request) == editor:
 
100
            if repr(line.getInterwikiEditorData(request)) == editor:
81
101
                line.time_tuple = request.user.getTime(wikiutil.version2timestamp(line.ed_time_usecs))
82
102
                request.write(RecentChanges.format_page_edits(macro, [line], timestamp))
83
103
 
95
115
 
96
116
def revert_page(request, pagename, editor):
97
117
    if not request.user.may.revert(pagename):
98
 
        return 
 
118
        return
99
119
 
100
120
    log = editlog.EditLog(request, rootpagename=pagename)
101
121
 
104
124
    for line in log.reverse():
105
125
        if first:
106
126
            first = False
107
 
            if line.getEditor(request) != editor:
 
127
            if repr(line.getInterwikiEditorData(request)) != editor:
108
128
                return
109
129
        else:
110
 
            if line.getEditor(request) != editor:
 
130
            if repr(line.getInterwikiEditorData(request)) != editor:
111
131
                rev = line.rev
112
132
                break
113
133
 
114
 
    if rev == u"00000000": # page created by spammer 
 
134
    if rev == u"00000000": # page created by spammer
115
135
        comment = u"Page deleted by Despam action"
116
136
        pg = PageEditor.PageEditor(request, pagename, do_editor_backup=0)
117
137
        try:
126
146
        except pg.SaveError, msg:
127
147
            savemsg = unicode(msg)
128
148
    return savemsg
129
 
    
 
149
 
130
150
def revert_pages(request, editor, timestamp):
131
 
    _ =  request.getText
 
151
    _ = request.getText
132
152
 
133
153
    editor = wikiutil.url_unquote(editor, want_unicode=False)
134
154
    timestamp = int(timestamp * 1000000)
144
164
 
145
165
        if not line.pagename in pages:
146
166
            pages[line.pagename] = 1
147
 
            if line.getEditor(request) == editor:
 
167
            if repr(line.getInterwikiEditorData(request)) == editor:
148
168
                revertpages.append(line.pagename)
149
169
 
150
 
    request.write("Debug: Pages to revert:<br>%s" % "<br>".join(revertpages))
 
170
    request.write("Pages to revert:<br>%s" % "<br>".join(revertpages))
151
171
    for pagename in revertpages:
152
 
        request.write("Debug: Begin reverting %s ...<br>" % pagename)
 
172
        request.write("Begin reverting %s ...<br>" % pagename)
153
173
        msg = revert_page(request, pagename, editor)
154
174
        if msg:
155
175
            request.write("<p>%s: %s</p>" % (
156
176
                Page.Page(request, pagename).link_to(request), msg))
157
 
        request.write("Debug: Finished reverting %s.<br>" % pagename)
 
177
        request.write("Finished reverting %s.<br>" % pagename)
158
178
 
159
179
def execute(pagename, request):
160
180
    _ = request.getText
161
 
    # be extra paranoid in dangerous actions
162
 
    actname = __name__.split('.')[-1]
163
 
    if actname in request.cfg.actions_excluded or \
164
 
       not request.user.isSuperUser():
165
 
        return Page.Page(request, pagename).send_page(request,
166
 
            msg = _('You are not allowed to use this action.'))
 
181
    # check for superuser
 
182
    if not request.user.isSuperUser():
 
183
        request.theme.add_msg(_('You are not allowed to use this action.'), "error")
 
184
        return Page.Page(request, pagename).send_page()
167
185
 
168
186
    editor = request.form.get('editor', [None])[0]
169
 
    timestamp = time.time() - 24 * 3600
170
 
       # request.form.get('timestamp', [None])[0]
 
187
    timestamp = time.time() - DAYS * 24 * 3600
171
188
    ok = request.form.get('ok', [0])[0]
172
189
 
173
 
    request.http_headers()
174
 
    wikiutil.send_title(request, "Despam", pagename=pagename)    
 
190
    request.emit_http_headers()
 
191
    request.theme.send_title("Despam", pagename=pagename)
175
192
    # Start content (important for RTL support)
176
193
    request.write(request.formatter.startContent("content"))
177
 
    
 
194
 
178
195
    if ok:
179
196
        revert_pages(request, editor, timestamp)
180
197
    elif editor:
184
201
 
185
202
    # End content and send footer
186
203
    request.write(request.formatter.endContent())
187
 
    wikiutil.send_footer(request, pagename)
 
204
    request.theme.send_footer(pagename)
 
205
    request.theme.send_closing_html()
188
206