3
3
MoinMoin - Package Installer
5
@copyright: 2005 by MoinMoin:AlexanderSchremmer
5
@copyright: 2005 MoinMoin:AlexanderSchremmer,
6
2007 MoinMoin:ReimarBauer
6
7
@license: GNU GPL, see COPYING for details.
13
from MoinMoin import config, wikiutil, caching
13
from MoinMoin import config, wikiutil, caching, user
14
14
from MoinMoin.Page import Page
15
15
from MoinMoin.PageEditor import PageEditor
16
from MoinMoin.logfile import editlog, eventlog
17
18
MOIN_PACKAGE_FILE = 'MOIN_PACKAGE'
21
23
class PackageException(Exception):
22
24
""" Raised if the package is broken. """
38
40
class ScriptExit(Exception):
39
41
""" Raised by the script commands when the script should quit. """
43
def event_logfile(self, pagename, pagefile):
46
mtime_usecs = wikiutil.timestamp2version(os.path.getmtime(pagefile))
47
elog = eventlog.EventLog(self.request)
48
elog.add(self.request, eventtype, {'pagename': pagename}, 1, mtime_usecs)
50
def edit_logfile_append(self, pagename, pagefile, rev, action, logname='edit-log', comment=u'', author=u"Scripting Subsystem"):
51
glog = editlog.EditLog(self.request, uid_override=author)
52
pagelog = Page(self.request, pagename).getPagePath(logname, use_underlay=0, isfile=1)
53
llog = editlog.EditLog(self.request, filename=pagelog,
55
mtime_usecs = wikiutil.timestamp2version(os.path.getmtime(pagefile))
58
glog.add(self.request, mtime_usecs, rev, action, pagename, host, comment)
59
llog.add(self.request, mtime_usecs, rev, action, pagename, host, extra, comment)
60
event_logfile(self, pagename, pagefile)
41
62
# Parsing and (un)quoting for script files
42
def packLine(list, separator="|"):
43
""" Packs a list into a string that is separated by `separator`. """
44
return '|'.join([x.replace('\\', '\\\\').replace(separator, '\\' + separator) for x in list])
63
def packLine(items, separator="|"):
64
""" Packs a list of items into a string that is separated by `separator`. """
65
return '|'.join([item.replace('\\', '\\\\').replace(separator, '\\' + separator) for item in items])
46
67
def unpackLine(string, separator="|"):
47
68
""" Unpacks a string that was packed by packLine. """
91
112
self.themename = None
92
113
self.ignoreExceptions = False
96
117
self.msg = getattr(self, "msg", "")
97
118
self.request = getattr(self, "request", None)
120
def do_addattachment(self, zipname, filename, pagename, author=u"Scripting Subsystem", comment=u""):
122
Installs an attachment
124
@param pagename: Page where the file is attached. Or in 2.0, the file itself.
125
@param zipname: Filename of the attachment from the zip file
126
@param filename: Filename of the attachment (just applicable for MoinMoin < 2.0)
128
if self.request.user.may.write(pagename):
129
_ = self.request.getText
131
attachments = Page(self.request, pagename).getPagePath("attachments", check_create=1)
132
filename = wikiutil.taintfilename(filename)
133
zipname = wikiutil.taintfilename(zipname)
134
target = os.path.join(attachments, filename)
135
page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
136
rev = page.current_rev()
137
path = page.getPagePath(check_create=0)
138
if not os.path.exists(target):
139
self._extractToFile(zipname, target)
140
if os.path.exists(target):
141
os.chmod(target, config.umask )
143
edit_logfile_append(self, pagename, path, rev, action, logname='edit-log',
144
comment=u'%(filename)s' % {"filename": filename}, author=author)
145
self.msg += u"%(filename)s attached \n" % {"filename": filename}
147
self.msg += u"%(filename)s not attached \n" % {"filename": filename}
149
self.msg += u"action add attachment: not enough rights - nothing done \n"
151
def do_delattachment(self, filename, pagename, author=u"Scripting Subsystem", comment=u""):
153
Removes an attachment
155
@param pagename: Page where the file is attached. Or in 2.0, the file itself.
156
@param filename: Filename of the attachment (just applicable for MoinMoin < 2.0)
158
if self.request.user.may.write(pagename):
159
_ = self.request.getText
161
attachments = Page(self.request, pagename).getPagePath("attachments", check_create=1)
162
filename = wikiutil.taintfilename(filename)
163
target = os.path.join(attachments, filename)
164
page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
165
rev = page.current_rev()
166
path = page.getPagePath(check_create=0)
167
if os.path.exists(target):
170
edit_logfile_append(self, pagename, path, rev, action, logname='edit-log',
171
comment=u'%(filename)s' % {"filename": filename}, author=author)
172
self.msg += u"%(filename)s removed \n" % {"filename": filename}
174
self.msg += u"%(filename)s does not exist \n" % {"filename": filename}
176
self.msg += u"action delete attachment: not enough rights - nothing done \n"
99
178
def do_print(self, *param):
100
179
""" Prints the parameters into output of the script. """
101
180
self.msg += '; '.join(param) + "\n"
200
279
raise RuntimeScriptException(_("Installation of '%(filename)s' failed.") % {
201
280
'filename': filename} + "\n" + package.msg)
203
raise RuntimeScriptException(_('The file %s is not a MoinMoin package file.' % filename))
282
raise RuntimeScriptException(_('The file %s is not a MoinMoin package file.') % filename)
205
284
self.msg += package.msg
207
def do_addrevision(self, filename, pagename, author=u"Scripting Subsystem", comment=u"", trivial = u"No"):
286
def do_addrevision(self, filename, pagename, author=u"Scripting Subsystem", comment=u"", trivial=u"No"):
208
287
""" Adds a revision to a page.
210
289
@param filename: name of the file in this package
213
292
@param comment: comment related to this revision (optional)
214
293
@param trivial: boolean, if it is a trivial edit
216
_ = self.request.getText
217
trivial = str2boolean(trivial)
219
page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
221
page.saveText(self.extract_file(filename).decode("utf-8"), 0, trivial=trivial, comment=comment)
222
except PageEditor.Unchanged:
225
page.clean_acl_cache()
295
if self.request.user.may.write(pagename):
296
_ = self.request.getText
297
trivial = str2boolean(trivial)
298
uid = user.getUserId(self.request, author)
299
theuser = user.User(self.request, uid)
300
save_user = self.request.user
301
self.request.user = theuser
302
page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
304
page.saveText(self.extract_file(filename).decode("utf-8"), 0, trivial=trivial, comment=comment)
305
self.msg += u"%(pagename)s added \n" % {"pagename": pagename}
306
except PageEditor.Unchanged:
308
self.request.user = save_user
309
page.clean_acl_cache()
311
self.msg += u"action add revision: not enough rights - nothing done \n"
313
def do_renamepage(self, pagename, newpagename, author=u"Scripting Subsystem", comment=u"Renamed by the scripting subsystem."):
316
@param pagename: name of the target page
317
@param newpagename: name of the new page
318
@param author: user name of the editor (optional)
319
@param comment: comment related to this revision (optional)
321
if self.request.user.may.write(pagename):
322
_ = self.request.getText
323
page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
324
if not page.exists():
325
raise RuntimeScriptException(_("The page %s does not exist.") % pagename)
326
newpage = PageEditor(self.request, newpagename)
327
page.renamePage(newpage.page_name, comment=u"Renamed from '%s'" % (pagename))
328
self.msg += u'%(pagename)s renamed to %(newpagename)s\n' % {
329
"pagename": pagename,
330
"newpagename": newpagename}
332
self.msg += u"action rename page: not enough rights - nothing done \n"
227
334
def do_deletepage(self, pagename, comment="Deleted by the scripting subsystem."):
228
335
""" Marks a page as deleted (like the DeletePage action).
230
337
@param pagename: page to delete
231
338
@param comment: the related comment (optional)
233
_ = self.request.getText
234
page = PageEditor(self.request, pagename, do_editor_backup=0)
235
if not page.exists():
236
raise RuntimeScriptException(_("The page %s does not exist.") % pagename)
238
page.deletePage(comment)
340
if self.request.user.may.write(pagename):
341
_ = self.request.getText
342
page = PageEditor(self.request, pagename, do_editor_backup=0)
343
if not page.exists():
344
raise RuntimeScriptException(_("The page %s does not exist.") % pagename)
345
page.deletePage(comment)
347
self.msg += u"action delete page: not enough rights - nothing done \n"
240
349
def do_replaceunderlay(self, filename, pagename):