1
1
# -*- coding: iso-8859-1 -*-
3
3
MoinMoin - Despam action
5
5
Mass revert changes done by some specific author / bot.
7
7
@copyright: 2005 by ???, Thomas Waldmann
8
8
@license: GNU GPL, see COPYING for details.
11
DAYS = 30 # we look for spam edits in the last x days
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
21
def render(editor_tuple):
22
etype, evalue = editor_tuple
23
if etype in ('ip', 'email', ):
25
elif etype == 'interwiki':
30
ret = '%s:%s' % evalue
32
ret = repr(editor_tuple)
20
35
def show_editors(request, pagename, timestamp):
23
38
timestamp = int(timestamp * 1000000)
24
39
log = editlog.EditLog(request)
27
42
for line in log.reverse():
28
43
if line.ed_time_usecs < timestamp:
31
46
if not request.user.may.read(line.pagename):
34
editor = line.getEditor(request)
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
39
54
editors = [(nr, editor) for editor, nr in editors.iteritems()]
42
58
pg = Page.Page(request, pagename)
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))))
65
dataset.addRow((render(editor), unicode(nr),
66
pg.link_to(request, text=_("Select Author"),
69
'editor': editor, # was: url_quote_plus()
51
72
table = DataBrowserWidget(request)
52
73
table.setData(dataset)
58
79
def show_pages(request, pagename, editor, timestamp):
61
82
timestamp = int(timestamp * 1000000)
62
83
log = editlog.EditLog(request)
65
85
# mimic macro object for use of RecentChanges subfunctions
67
87
macro.request = request
68
macro.formatter = Formatter(request)
88
macro.formatter = request.html_formatter
70
90
request.write("<table>")
71
91
for line in log.reverse():
72
92
if line.ed_time_usecs < timestamp:
75
95
if not request.user.may.read(line.pagename):
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))
104
124
for line in log.reverse():
107
if line.getEditor(request) != editor:
127
if repr(line.getInterwikiEditorData(request)) != editor:
110
if line.getEditor(request) != editor:
130
if repr(line.getInterwikiEditorData(request)) != editor:
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)
126
146
except pg.SaveError, msg:
127
147
savemsg = unicode(msg)
130
150
def revert_pages(request, editor, timestamp):
133
153
editor = wikiutil.url_unquote(editor, want_unicode=False)
134
154
timestamp = int(timestamp * 1000000)
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)
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)
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)
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()
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]
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"))
179
196
revert_pages(request, editor, timestamp)
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()