annotate MoinMoin/action/AttachFile.py @ 5101:d8ccac2f24c5

getAttachUrl: removed escaped=... param (see below) If one needs to escape a resulting url, one has to call wikiutil.escape(url) or wikiutil.escape(url, 1) on the result.
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Sun, 13 Sep 2009 02:44:37 +0200
parents ff588e9e24d6
children 9ae242080889
rev   line source
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1 # -*- coding: iso-8859-1 -*-
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
2 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
3 MoinMoin - AttachFile action
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
4
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
5 This action lets a page have multiple attachment files.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
6 It creates a folder <data>/pages/<pagename>/attachments
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
7 and keeps everything in there.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
8
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
9 Form values: action=Attachment
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
10 1. with no 'do' key: returns file upload form
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
11 2. do=attach: accept file upload and saves the file in
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
12 ../attachment/pagename/
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
13 3. /pagename/fname?action=Attachment&do=get[&mimetype=type]:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
14 return contents of the attachment file with the name fname.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
15 4. /pathname/fname, do=view[&mimetype=type]:create a page
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
16 to view the content of the file
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
17
3073
78c516164e01 attachment links now require double brackets
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3040
diff changeset
18 To link to an attachment, use [[attachment:file.txt]],
78c516164e01 attachment links now require double brackets
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3040
diff changeset
19 to embed an attachment, use {{attachment:file.png}}.
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
20
1911
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
21 @copyright: 2001 by Ken Sugino (sugino@mediaone.net),
1918
bb2e053067fb fixing copyright headers: remove umlauts (encoding troubles), make epydoc compatible, reformat
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1911
diff changeset
22 2001-2004 by Juergen Hermann <jh@web.de>,
1911
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
23 2005 MoinMoin:AlexanderSchremmer,
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
24 2005 DiegoOngaro at ETSZONE (diego@etszone.com),
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
25 2005-2007 MoinMoin:ReimarBauer,
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
26 2007-2008 MoinMoin:ThomasWaldmann
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
27 @license: GNU GPL, see COPYING for details.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
28 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
29
4626
25532a36f2b5 AttachFile: reordered imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4599
diff changeset
30 import os, time, zipfile, errno, datetime
4439
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
31 from StringIO import StringIO
2490
111868e5cb21 Regenerate xapian index on added attachment, fix PageDeletedEvent, fix header
Karol 'grzywacz' Nowak <grzywacz@sul.uni.lodz.pl>
parents: 2356
diff changeset
32
3591
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
33 from MoinMoin import log
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
34 logging = log.getLogger(__name__)
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
35
4626
25532a36f2b5 AttachFile: reordered imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4599
diff changeset
36 # keep both imports below as they are, order is important:
25532a36f2b5 AttachFile: reordered imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4599
diff changeset
37 from MoinMoin import wikiutil
25532a36f2b5 AttachFile: reordered imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4599
diff changeset
38 import mimetypes
25532a36f2b5 AttachFile: reordered imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4599
diff changeset
39
25532a36f2b5 AttachFile: reordered imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4599
diff changeset
40 from MoinMoin import config, packages
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
41 from MoinMoin.Page import Page
1115
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
42 from MoinMoin.util import filesys, timefuncs
2983
7b0aadb97d01 new antispam stuff: textchas (text CAPTCHAs), cleanup AttachFile handler (port from 1.6)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2966
diff changeset
43 from MoinMoin.security.textcha import TextCha
2106
1577663f6354 Notify when a new attachment is added to a page. s/JabberBot/jabberbot/.
Karol 'grzywacz' Nowak <grzywacz@sul.uni.lodz.pl>
parents: 2017
diff changeset
44 from MoinMoin.events import FileAttachedEvent, send_event
4439
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
45 from MoinMoin.support import tarfile
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
46
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
47 action_name = __name__.split('.')[-1]
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
48
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
49 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
50 ### External interface - these are called from the core code
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
51 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
52
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
53 class AttachmentAlreadyExists(Exception):
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
54 pass
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
55
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
56
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
57 def getBasePath(request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
58 """ Get base path where page dirs for attachments are stored. """
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
59 return request.rootpage.getPagePath('pages')
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
60
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
61
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
62 def getAttachDir(request, pagename, create=0):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
63 """ Get directory where attachments for page `pagename` are stored. """
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
64 if request.page and pagename == request.page.page_name:
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
65 page = request.page # reusing existing page obj is faster
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
66 else:
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
67 page = Page(request, pagename)
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
68 return page.getPagePath("attachments", check_create=create)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
69
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
70
143
11df1156d432 fixed MoinMoinBugs/BrokenAttachmentPaths
Florian Festi <Florian.Festi@trick.informatik.uni-stuttgart.de>
parents: 118
diff changeset
71 def absoluteName(url, pagename):
281
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
72 """ Get (pagename, filename) of an attachment: link
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
73 @param url: PageName/filename.ext or filename.ext (unicode)
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
74 @param pagename: name of the currently processed page (unicode)
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
75 @rtype: tuple of unicode
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
76 @return: PageName, filename.ext
143
11df1156d432 fixed MoinMoinBugs/BrokenAttachmentPaths
Florian Festi <Florian.Festi@trick.informatik.uni-stuttgart.de>
parents: 118
diff changeset
77 """
3084
a6aaae4bded0 fix relative attachment targets
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3073
diff changeset
78 url = wikiutil.AbsPageName(pagename, url)
281
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
79 pieces = url.split(u'/')
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
80 if len(pieces) == 1:
143
11df1156d432 fixed MoinMoinBugs/BrokenAttachmentPaths
Florian Festi <Florian.Festi@trick.informatik.uni-stuttgart.de>
parents: 118
diff changeset
81 return pagename, pieces[0]
11df1156d432 fixed MoinMoinBugs/BrokenAttachmentPaths
Florian Festi <Florian.Festi@trick.informatik.uni-stuttgart.de>
parents: 118
diff changeset
82 else:
145
b11bb396654e make Attachment fix run with Py 2.3
Florian Festi <Florian.Festi@trick.informatik.uni-stuttgart.de>
parents: 143
diff changeset
83 return u"/".join(pieces[:-1]), pieces[-1]
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
84
5101
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
85 def getAttachUrl(pagename, filename, request, addts=0, do='get', drawing=''):
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
86 """ Get URL that points to attachment `filename` of page `pagename`.
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
87 For upload url (files, not drawings), call with do='upload_form'.
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
88 """
5095
6024628e8d60 refactored getAttachURL
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5089
diff changeset
89 if not drawing:
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
90 url = request.href(pagename, action=action_name, do=do, target=filename)
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
91 else:
5095
6024628e8d60 refactored getAttachURL
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5089
diff changeset
92 url = request.href(pagename, action=request.cfg.drawing_action, target=drawing)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
93 return url
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
94
2701
398af77c7ede fixed attachment_link api - it now has a 'on' parameter like most of the other methods
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2601
diff changeset
95
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
96 def getIndicator(request, pagename):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
97 """ Get an attachment indicator for a page (linked clip image) or
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
98 an empty string if not attachments exist.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
99 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
100 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
101 attach_dir = getAttachDir(request, pagename)
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
102 if not os.path.exists(attach_dir):
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
103 return ''
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
104
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
105 files = os.listdir(attach_dir)
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
106 if not files:
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
107 return ''
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
108
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
109 fmt = request.formatter
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
110 attach_count = _('[%d attachments]') % len(files)
889
ad62767ffd0c pep8 style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 869
diff changeset
111 attach_icon = request.theme.make_icon('attach', vars={'attach_count': attach_count})
4231
a29fd3a9e91f Try using werkzeugs Href object for URL generation (first in AttachFile)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4226
diff changeset
112 attach_link = (fmt.url(1, request.href(pagename, action=action_name), rel='nofollow') +
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
113 attach_icon +
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
114 fmt.url(0))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
115 return attach_link
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
116
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
117
281
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
118 def getFilename(request, pagename, filename):
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
119 """ make complete pathfilename of file "name" attached to some page "pagename"
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
120 @param request: request object
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
121 @param pagename: name of page where the file is attached to (unicode)
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
122 @param filename: filename of attached file (unicode)
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
123 @rtype: string (in config.charset encoding)
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
124 @return: complete path/filename of attached file
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
125 """
1911
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
126 if isinstance(filename, unicode):
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
127 filename = filename.encode(config.charset)
2885
48a1f6b6b6c5 AttachFile.getFilename: creates attachment dir on requesting filename
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 2846
diff changeset
128 return os.path.join(getAttachDir(request, pagename, create=1), filename)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
129
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
130
1910
5c3dffe2abf1 new function AttachFile.exists to reduce code duplication
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1904
diff changeset
131 def exists(request, pagename, filename):
5c3dffe2abf1 new function AttachFile.exists to reduce code duplication
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1904
diff changeset
132 """ check if page <pagename> has a file <filename> attached """
5c3dffe2abf1 new function AttachFile.exists to reduce code duplication
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1904
diff changeset
133 fpath = getFilename(request, pagename, filename)
5c3dffe2abf1 new function AttachFile.exists to reduce code duplication
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1904
diff changeset
134 return os.path.exists(fpath)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
135
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
136
1911
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
137 def size(request, pagename, filename):
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
138 """ return file size of file attachment """
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
139 fpath = getFilename(request, pagename, filename)
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
140 return os.path.getsize(fpath)
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
141
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
142
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
143 def info(pagename, request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
144 """ Generate snippet with info on the attachment for page `pagename`. """
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
145 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
146
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
147 attach_dir = getAttachDir(request, pagename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
148 files = []
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
149 if os.path.isdir(attach_dir):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
150 files = os.listdir(attach_dir)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
151 page = Page(request, pagename)
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
152 link = page.url(request, {'action': action_name})
3122
a1322262398a refactored _() getText calls to match new api
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3084
diff changeset
153 attach_info = _('There are <a href="%(link)s">%(count)s attachment(s)</a> stored for this page.') % {
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
154 'count': len(files),
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
155 'link': wikiutil.escape(link)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
156 }
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
157 return "\n<p>\n%s\n</p>\n" % attach_info
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
158
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
159
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
160 def _write_stream(content, stream, bufsize=8192):
3603
43aa566b0ec7 AttachFile: fix uploading of < 1K files (FieldStorage seems to behave different for that case)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3595
diff changeset
161 if hasattr(content, 'read'): # looks file-like
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
162 import shutil
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
163 shutil.copyfileobj(content, stream, bufsize)
3603
43aa566b0ec7 AttachFile: fix uploading of < 1K files (FieldStorage seems to behave different for that case)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3595
diff changeset
164 elif isinstance(content, str):
43aa566b0ec7 AttachFile: fix uploading of < 1K files (FieldStorage seems to behave different for that case)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3595
diff changeset
165 stream.write(content)
43aa566b0ec7 AttachFile: fix uploading of < 1K files (FieldStorage seems to behave different for that case)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3595
diff changeset
166 else:
43aa566b0ec7 AttachFile: fix uploading of < 1K files (FieldStorage seems to behave different for that case)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3595
diff changeset
167 logging.error("unsupported content object: %r" % content)
43aa566b0ec7 AttachFile: fix uploading of < 1K files (FieldStorage seems to behave different for that case)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3595
diff changeset
168 raise
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
169
1791
6dd2e29acffe Eclipse PyDev Check: fixed lots of its errors and warnings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1777
diff changeset
170 def add_attachment(request, pagename, target, filecontent, overwrite=0):
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
171 """ save <filecontent> to an attachment <target> of page <pagename>
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
172
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
173 filecontent can be either a str (in memory file content),
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
174 or an open file object (file content in e.g. a tempfile).
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
175 """
1797
25c93ded258b AttachFile: getText of add_attachment fixed, Load:only PageEditor restricts uploading of pages
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1796
diff changeset
176 _ = request.getText
25c93ded258b AttachFile: getText of add_attachment fixed, Load:only PageEditor restricts uploading of pages
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1796
diff changeset
177
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
178 # replace illegal chars
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
179 target = wikiutil.taintfilename(target)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
180
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
181 # get directory, and possibly create it
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
182 attach_dir = getAttachDir(request, pagename, create=1)
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
183 # save file
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
184 fpath = os.path.join(attach_dir, target).encode(config.charset)
1765
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
185 exists = os.path.exists(fpath)
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
186 if exists and not overwrite:
3591
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
187 raise AttachmentAlreadyExists
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
188 else:
1765
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
189 if exists:
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
190 try:
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
191 os.remove(fpath)
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
192 except:
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
193 pass
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
194 stream = open(fpath, 'wb')
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
195 try:
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
196 _write_stream(filecontent, stream)
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
197 finally:
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
198 stream.close()
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
199
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
200 _addLogEntry(request, 'ATTNEW', pagename, target)
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2210
diff changeset
201
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
202 filesize = os.path.getsize(fpath)
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
203 event = FileAttachedEvent(request, pagename, target, filesize)
2490
111868e5cb21 Regenerate xapian index on added attachment, fix PageDeletedEvent, fix header
Karol 'grzywacz' Nowak <grzywacz@sul.uni.lodz.pl>
parents: 2356
diff changeset
204 send_event(event)
1473
b5864c9492fb ensure new attachments trigger an index update, doc update for MoinMoin.search.Xapian
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1318
diff changeset
205
3568
6fe1ea4d9d1a use the open temporary file for file uploads (fixes big memory consumption for big file uploads) - Twisted and mod_python is completely untested
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3553
diff changeset
206 return target, filesize
802
7b2e550c9660 merge moin/1.6
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 801 691
diff changeset
207
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
208
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
209 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
210 ### Internal helpers
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
211 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
212
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
213 def _addLogEntry(request, action, pagename, filename):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
214 """ Add an entry to the edit log on uploads and deletes.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
215
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
216 `action` should be "ATTNEW" or "ATTDEL"
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
217 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
218 from MoinMoin.logfile import editlog
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
219 t = wikiutil.timestamp2version(time.time())
4569
3caaa8c74c41 wikiutil: replace moin's cgi/urllib wrappers by calls to werkzeug.utils code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4549
diff changeset
220 fname = wikiutil.url_quote(filename)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
221
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
222 # Write to global log
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
223 log = editlog.EditLog(request)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
224 log.add(request, t, 99999999, action, pagename, request.remote_addr, fname)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
225
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
226 # Write to local log
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
227 log = editlog.EditLog(request, rootpagename=pagename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
228 log.add(request, t, 99999999, action, pagename, request.remote_addr, fname)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
229
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
230
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
231 def _access_file(pagename, request):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
232 """ Check form parameter `target` and return a tuple of
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
233 `(pagename, filename, filepath)` for an existing attachment.
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
234
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
235 Return `(pagename, None, None)` if an error occurs.
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
236 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
237 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
238
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
239 error = None
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
240 if not request.values.get('target'):
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
241 error = _("Filename of attachment not specified!")
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
242 else:
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
243 filename = wikiutil.taintfilename(request.values['target'])
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
244 fpath = getFilename(request, pagename, filename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
245
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
246 if os.path.isfile(fpath):
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
247 return (pagename, filename, fpath)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
248 error = _("Attachment '%(filename)s' does not exist!") % {'filename': filename}
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
249
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
250 error_msg(pagename, request, error)
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
251 return (pagename, None, None)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
252
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
253
1653
5b15b6e010cf AttachList can list files of given mimetype now (ported from 1.5)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1635
diff changeset
254 def _build_filelist(request, pagename, showheader, readonly, mime_type='*'):
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
255 _ = request.getText
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
256 fmt = request.html_formatter
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
257
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
258 # access directory
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
259 attach_dir = getAttachDir(request, pagename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
260 files = _get_files(request, pagename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
261
1653
5b15b6e010cf AttachList can list files of given mimetype now (ported from 1.5)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1635
diff changeset
262 if mime_type != '*':
5b15b6e010cf AttachList can list files of given mimetype now (ported from 1.5)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1635
diff changeset
263 files = [fname for fname in files if mime_type == mimetypes.guess_type(fname)[0]]
5b15b6e010cf AttachList can list files of given mimetype now (ported from 1.5)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1635
diff changeset
264
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
265 html = []
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
266 if files:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
267 if showheader:
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
268 html.append(fmt.rawHTML(_(
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
269 "To refer to attachments on a page, use '''{{{attachment:filename}}}''', \n"
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
270 "as shown below in the list of files. \n"
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
271 "Do '''NOT''' use the URL of the {{{[get]}}} link, \n"
3122
a1322262398a refactored _() getText calls to match new api
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3084
diff changeset
272 "since this is subject to change and can break easily.",
a1322262398a refactored _() getText calls to match new api
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3084
diff changeset
273 wiki=True
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
274 )))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
275
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
276 label_del = _("del")
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
277 label_move = _("move")
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
278 label_get = _("get")
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
279 label_edit = _("edit")
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
280 label_view = _("view")
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
281 label_unzip = _("unzip")
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
282 label_install = _("install")
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
283
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
284 html.append(fmt.bullet_list(1))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
285 for file in files:
1985
eb5328be394e AttachFile:destinguish between zip and other fileformats using zip archives
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1967
diff changeset
286 mt = wikiutil.MimeType(filename=file)
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
287 fullpath = os.path.join(attach_dir, file).encode(config.charset)
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
288 st = os.stat(fullpath)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
289 base, ext = os.path.splitext(file)
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
290 parmdict = {'file': wikiutil.escape(file),
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
291 'fsize': "%.1f" % (float(st.st_size) / 1024),
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
292 'fmtime': request.user.getFormattedDateTime(st.st_mtime),
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
293 }
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
294
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
295 links = []
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
296 may_delete = request.user.may.delete(pagename)
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
297 if may_delete and not readonly:
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
298 links.append(fmt.url(1, getAttachUrl(pagename, file, request, do='del')) +
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
299 fmt.text(label_del) +
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
300 fmt.url(0))
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
301
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
302 if may_delete and not readonly:
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
303 links.append(fmt.url(1, getAttachUrl(pagename, file, request, do='move')) +
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
304 fmt.text(label_move) +
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
305 fmt.url(0))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
306
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
307 links.append(fmt.url(1, getAttachUrl(pagename, file, request)) +
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
308 fmt.text(label_get) +
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
309 fmt.url(0))
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
310
4439
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
311 if ext == '.tdraw':
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
312 links.append(fmt.url(1, getAttachUrl(pagename, file, request, drawing=base)) +
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
313 fmt.text(label_edit) +
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
314 fmt.url(0))
5089
899b4b2cd7d5 AttachFile: offer editing for .adraw (anywikidraw container)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5059
diff changeset
315 elif ext == '.adraw':
899b4b2cd7d5 AttachFile: offer editing for .adraw (anywikidraw container)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5059
diff changeset
316 links.append(fmt.url(1, getAttachUrl(pagename, file, request, drawing=base)) +
899b4b2cd7d5 AttachFile: offer editing for .adraw (anywikidraw container)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5059
diff changeset
317 fmt.text(label_edit) +
899b4b2cd7d5 AttachFile: offer editing for .adraw (anywikidraw container)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5059
diff changeset
318 fmt.url(0))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
319 else:
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
320 links.append(fmt.url(1, getAttachUrl(pagename, file, request, do='view')) +
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
321 fmt.text(label_view) +
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
322 fmt.url(0))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
323
3705
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
324 try:
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
325 is_zipfile = zipfile.is_zipfile(fullpath)
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
326 if is_zipfile:
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
327 is_package = packages.ZipPackage(request, fullpath).isPackage()
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
328 if is_package and request.user.isSuperUser():
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
329 links.append(fmt.url(1, getAttachUrl(pagename, file, request, do='install')) +
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
330 fmt.text(label_install) +
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
331 fmt.url(0))
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
332 elif (not is_package and mt.minor == 'zip' and
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
333 may_delete and
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
334 request.user.may.read(pagename) and
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
335 request.user.may.write(pagename)):
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
336 links.append(fmt.url(1, getAttachUrl(pagename, file, request, do='unzip')) +
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
337 fmt.text(label_unzip) +
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
338 fmt.url(0))
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
339 except RuntimeError:
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
340 # We don't want to crash with a traceback here (an exception
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
341 # here could be caused by an uploaded defective zip file - and
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
342 # if we crash here, the user does not get a UI to remove the
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
343 # defective zip file again).
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
344 # RuntimeError is raised by zipfile stdlib module in case of
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
345 # problems (like inconsistent slash and backslash usage in the
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
346 # archive).
ac48fad2e117 AttachFile action: catch runtime error raised by zipfile to not make attachments list unusable if someone attached a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3700
diff changeset
347 logging.exception("An exception within zip file attachment handling occurred:")
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
348
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
349 html.append(fmt.listitem(1))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
350 html.append("[%s]" % "&nbsp;| ".join(links))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
351 html.append(" (%(fmtime)s, %(fsize)s KB) [[attachment:%(file)s]]" % parmdict)
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
352 html.append(fmt.listitem(0))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
353 html.append(fmt.bullet_list(0))
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
354
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
355 else:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
356 if showheader:
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
357 html.append(fmt.paragraph(1))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
358 html.append(fmt.text(_("No attachments stored for %(pagename)s") % {
3270
e06e15e90ba7 fix some wrong wikiutil.escape usage causing double-escaping
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3253
diff changeset
359 'pagename': pagename}))
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
360 html.append(fmt.paragraph(0))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
361
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
362 return ''.join(html)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
363
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
364
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
365 def _get_files(request, pagename):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
366 attach_dir = getAttachDir(request, pagename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
367 if os.path.isdir(attach_dir):
1866
0194beaf511e reduce reduce, filter and map usage
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1864
diff changeset
368 files = [fn.decode(config.charset) for fn in os.listdir(attach_dir)]
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
369 files.sort()
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
370 else:
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
371 files = []
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
372 return files
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
373
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
374
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
375 def _get_filelist(request, pagename):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
376 return _build_filelist(request, pagename, 1, 0)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
377
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
378
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
379 def error_msg(pagename, request, msg):
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
380 msg = wikiutil.escape(msg)
2966
ba14d391c2ba Refactor all modules to use the new add_msg interface in 1.7 (done by Frederico Lorenzi). Should not be backported to 1.6 but
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2885
diff changeset
381 request.theme.add_msg(msg, "error")
ba14d391c2ba Refactor all modules to use the new add_msg interface in 1.7 (done by Frederico Lorenzi). Should not be backported to 1.6 but
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2885
diff changeset
382 Page(request, pagename).send_page()
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
383
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
384
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
385 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
386 ### Create parts of the Web interface
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
387 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
388
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
389 def send_link_rel(request, pagename):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
390 files = _get_files(request, pagename)
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
391 for fname in files:
5101
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
392 url = getAttachUrl(pagename, fname, request, do='view')
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
393 request.write(u'<link rel="Appendix" title="%s" href="%s">\n' % (
5101
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
394 wikiutil.escape(fname, 1),
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
395 wikiutil.escape(url, 1)))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
396
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
397 def send_uploadform(pagename, request):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
398 """ Send the HTML code for the list of already stored attachments and
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
399 the file upload form.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
400 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
401 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
402
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
403 if not request.user.may.read(pagename):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
404 request.write('<p>%s</p>' % _('You are not allowed to view this page.'))
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
405 return
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
406
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
407 writeable = request.user.may.write(pagename)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
408
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
409 # First send out the upload new attachment form on top of everything else.
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
410 # This avoids usability issues if you have to scroll down a lot to upload
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
411 # a new file when the page already has lots of attachments:
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
412 if writeable:
3586
35366465d4fe AttachFile/Load: remove misleading/outdated text, Load: fix UI cosmetics, reuse i18n texts
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3572
diff changeset
413 request.write('<h2>' + _("New Attachment") + '</h2>')
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
414 request.write("""
4231
a29fd3a9e91f Try using werkzeugs Href object for URL generation (first in AttachFile)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4226
diff changeset
415 <form action="%(url)s" method="POST" enctype="multipart/form-data">
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
416 <dl>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
417 <dt>%(upload_label_file)s</dt>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
418 <dd><input type="file" name="file" size="50"></dd>
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
419 <dt>%(upload_label_target)s</dt>
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
420 <dd><input type="text" name="target" size="50" value="%(target)s"></dd>
1765
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
421 <dt>%(upload_label_overwrite)s</dt>
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
422 <dd><input type="checkbox" name="overwrite" value="1" %(overwrite_checked)s></dd>
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
423 </dl>
2983
7b0aadb97d01 new antispam stuff: textchas (text CAPTCHAs), cleanup AttachFile handler (port from 1.6)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2966
diff changeset
424 %(textcha)s
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
425 <p>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
426 <input type="hidden" name="action" value="%(action_name)s">
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
427 <input type="hidden" name="do" value="upload">
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
428 <input type="submit" value="%(upload_button)s">
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
429 </p>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
430 </form>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
431 """ % {
4231
a29fd3a9e91f Try using werkzeugs Href object for URL generation (first in AttachFile)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4226
diff changeset
432 'url': request.href(pagename),
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
433 'action_name': action_name,
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
434 'upload_label_file': _('File to upload'),
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
435 'upload_label_target': _('Rename to'),
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
436 'target': wikiutil.escape(request.values.get('target', ''), 1),
1765
6e438de156d9 AttachFile: allow overwriting files when user chooses that option (ported from 1.5-802)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1662
diff changeset
437 'upload_label_overwrite': _('Overwrite existing attachment of same name'),
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
438 'overwrite_checked': ('', 'checked')[request.form.get('overwrite', '0') == '1'],
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
439 'upload_button': _('Upload'),
2983
7b0aadb97d01 new antispam stuff: textchas (text CAPTCHAs), cleanup AttachFile handler (port from 1.6)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2966
diff changeset
440 'textcha': TextCha(request).render(),
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
441 })
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
442
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
443 request.write('<h2>' + _("Attached Files") + '</h2>')
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
444 request.write(_get_filelist(request, pagename))
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
445
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
446 if not writeable:
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
447 request.write('<p>%s</p>' % _('You are not allowed to attach a file to this page.'))
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
448
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
449 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
450 ### Web interface for file upload, viewing and deletion
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
451 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
452
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
453 def execute(pagename, request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
454 """ Main dispatcher for the 'AttachFile' action. """
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
455 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
456
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
457 do = request.values.get('do', 'upload_form')
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
458 handler = globals().get('_do_%s' % do)
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
459 if handler:
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
460 msg = handler(pagename, request)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
461 else:
4703
621c708ecddb merged moin/1.8
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4651 4702
diff changeset
462 msg = _('Unsupported AttachFile sub-action: %s') % do
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
463 if msg:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
464 error_msg(pagename, request, msg)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
465
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
466
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
467 def _do_upload_form(pagename, request):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
468 upload_form(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
469
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
470
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
471 def upload_form(pagename, request, msg=''):
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
472 if msg:
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
473 msg = wikiutil.escape(msg)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
474 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
475
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
476 # Use user interface language for this generated page
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
477 request.setContentLanguage(request.lang)
2966
ba14d391c2ba Refactor all modules to use the new add_msg interface in 1.7 (done by Frederico Lorenzi). Should not be backported to 1.6 but
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2885
diff changeset
478 request.theme.add_msg(msg, "dialog")
ba14d391c2ba Refactor all modules to use the new add_msg interface in 1.7 (done by Frederico Lorenzi). Should not be backported to 1.6 but
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2885
diff changeset
479 request.theme.send_title(_('Attachments for "%(pagename)s"') % {'pagename': pagename}, pagename=pagename)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
480 request.write('<div id="content">\n') # start content div
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
481 send_uploadform(pagename, request)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
482 request.write('</div>\n') # end content div
616
3b08d9413589 move send_title/footer from wikiutil to theme.__init__
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 520
diff changeset
483 request.theme.send_footer(pagename)
617
cf420addd95c removed MoinMoinNoFooter at many places, added call to theme.send_closing_html() where needed
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 616
diff changeset
484 request.theme.send_closing_html()
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
485
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
486
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
487 def _do_upload(pagename, request):
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
488 _ = request.getText
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
489 # Currently we only check TextCha for upload (this is what spammers ususally do),
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
490 # but it could be extended to more/all attachment write access
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
491 if not TextCha(request).check_answer_from_form():
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
492 return _('TextCha: Wrong answer! Go back and try again...')
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
493
3591
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
494 form = request.form
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
495
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
496 file_upload = request.files.get('file')
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
497 if not file_upload:
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
498 # This might happen when trying to upload file names
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
499 # with non-ascii characters on Safari.
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
500 return _("No file content. Delete non ASCII characters from the file name and try again.")
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
501
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
502 try:
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
503 overwrite = int(form.get('overwrite', '0'))
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
504 except:
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
505 overwrite = 0
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
506
3595
1dcf6a261c2a AttachFile: make error msg less confusing when trying to overwrite a file attachment without having acl delete rights
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3591
diff changeset
507 if not request.user.may.write(pagename):
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
508 return _('You are not allowed to attach a file to this page.')
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
509
3595
1dcf6a261c2a AttachFile: make error msg less confusing when trying to overwrite a file attachment without having acl delete rights
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3591
diff changeset
510 if overwrite and not request.user.may.delete(pagename):
1dcf6a261c2a AttachFile: make error msg less confusing when trying to overwrite a file attachment without having acl delete rights
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3591
diff changeset
511 return _('You are not allowed to overwrite a file attachment of this page.')
1dcf6a261c2a AttachFile: make error msg less confusing when trying to overwrite a file attachment without having acl delete rights
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3591
diff changeset
512
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
513 target = form.get('target', u'').strip()
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
514 if not target:
4651
aa481a3b6a60 AttachFile: fix another exception when someone just clicks on upload, without giving a file
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4650
diff changeset
515 target = file_upload.filename or u''
3591
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
516
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
517 target = wikiutil.clean_input(target)
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
518
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
519 if not target:
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
520 return _("Filename of attachment not specified!")
15e5ca7240ab Load action: remove duplicated code, add comment field, refactor. AttachFile action: refactor. Fix bugs.
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3586
diff changeset
521
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
522 # add the attachment
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
523 try:
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
524 target, bytes = add_attachment(request, pagename, target, file_upload.stream, overwrite=overwrite)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
525 msg = _("Attachment '%(target)s' (remote name '%(filename)s')"
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
526 " with %(bytes)d bytes saved.") % {
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
527 'target': target, 'filename': file_upload.filename, 'bytes': bytes}
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
528 except AttachmentAlreadyExists:
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
529 msg = _("Attachment '%(target)s' (remote name '%(filename)s') already exists.") % {
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
530 'target': target, 'filename': file_upload.filename}
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
531
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
532 # return attachment list
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
533 upload_form(pagename, request, msg)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
534
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
535
4439
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
536 class ContainerItem:
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
537 """ A storage container (multiple objects in 1 tarfile) """
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
538
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
539 def __init__(self, request, pagename, containername):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
540 self.request = request
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
541 self.pagename = pagename
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
542 self.containername = containername
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
543 self.container_filename = getFilename(request, pagename, containername)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
544
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
545 def member_url(self, member):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
546 """ return URL for accessing container member
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
547 (we use same URL for get (GET) and put (POST))
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
548 """
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
549 url = Page(self.request, self.pagename).url(self.request, {
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
550 'action': 'AttachFile',
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
551 'do': 'box', # shorter to type than 'container'
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
552 'target': self.containername,
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
553 #'member': member,
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
554 })
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
555 return url + '&member=%s' % member
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
556 # member needs to be last in qs because twikidraw looks for "file extension" at the end
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
557
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
558 def get(self, member):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
559 """ return a file-like object with the member file data
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
560 """
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
561 tf = tarfile.TarFile(self.container_filename)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
562 return tf.extractfile(member)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
563
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
564 def put(self, member, content, content_length=None):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
565 """ save data into a container's member """
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
566 tf = tarfile.TarFile(self.container_filename, mode='a')
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
567 if isinstance(member, unicode):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
568 member = member.encode('utf-8')
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
569 ti = tarfile.TarInfo(member)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
570 if isinstance(content, str):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
571 if content_length is None:
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
572 content_length = len(content)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
573 content = StringIO(content) # we need a file obj
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
574 elif not hasattr(content, 'read'):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
575 logging.error("unsupported content object: %r" % content)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
576 raise
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
577 assert content_length >= 0 # we don't want -1 interpreted as 4G-1
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
578 ti.size = content_length
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
579 tf.addfile(ti, content)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
580 tf.close()
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
581
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
582 def truncate(self):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
583 f = open(self.container_filename, 'w')
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
584 f.close()
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
585
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
586 def exists(self):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
587 return os.path.exists(self.container_filename)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
588
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
589 def _do_del(pagename, request):
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
590 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
591
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
592 pagename, filename, fpath = _access_file(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
593 if not request.user.may.delete(pagename):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
594 return _('You are not allowed to delete attachments on this page.')
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
595 if not filename:
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
596 return # error msg already sent in _access_file
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
597
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
598 # delete file
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
599 os.remove(fpath)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
600 _addLogEntry(request, 'ATTDEL', pagename, filename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
601
1479
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
602 if request.cfg.xapian_search:
5057
e30bd336a8f3 fix XapianIndex import at some forgotten places
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4703
diff changeset
603 from MoinMoin.search.Xapian import XapianIndex
e30bd336a8f3 fix XapianIndex import at some forgotten places
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4703
diff changeset
604 index = XapianIndex(request)
1479
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
605 if index.exists:
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
606 index.remove_item(pagename, filename)
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
607
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
608 upload_form(pagename, request, msg=_("Attachment '%(filename)s' deleted.") % {'filename': filename})
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
609
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
610
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
611 def move_file(request, pagename, new_pagename, attachment, new_attachment):
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
612 _ = request.getText
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
613
1609
7f73dafb525d move attachments: remove unneeded imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1608
diff changeset
614 newpage = Page(request, new_pagename)
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
615 if newpage.exists(includeDeleted=1) and request.user.may.write(new_pagename) and request.user.may.delete(pagename):
1609
7f73dafb525d move attachments: remove unneeded imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1608
diff changeset
616 new_attachment_path = os.path.join(getAttachDir(request, new_pagename,
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
617 create=1), new_attachment).encode(config.charset)
1609
7f73dafb525d move attachments: remove unneeded imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1608
diff changeset
618 attachment_path = os.path.join(getAttachDir(request, pagename),
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
619 attachment).encode(config.charset)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
620
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
621 if os.path.exists(new_attachment_path):
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
622 upload_form(pagename, request,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
623 msg=_("Attachment '%(new_pagename)s/%(new_filename)s' already exists.") % {
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
624 'new_pagename': new_pagename,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
625 'new_filename': new_attachment})
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
626 return
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
627
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
628 if new_attachment_path != attachment_path:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
629 # move file
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
630 filesys.rename(attachment_path, new_attachment_path)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
631 _addLogEntry(request, 'ATTDEL', pagename, attachment)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
632 _addLogEntry(request, 'ATTNEW', new_pagename, new_attachment)
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
633 upload_form(pagename, request,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
634 msg=_("Attachment '%(pagename)s/%(filename)s' moved to '%(new_pagename)s/%(new_filename)s'.") % {
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
635 'pagename': pagename,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
636 'filename': attachment,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
637 'new_pagename': new_pagename,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
638 'new_filename': new_attachment})
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
639 else:
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
640 upload_form(pagename, request, msg=_("Nothing changed"))
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
641 else:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
642 upload_form(pagename, request, msg=_("Page '%(new_pagename)s' does not exist or you don't have enough rights.") % {
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
643 'new_pagename': new_pagename})
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
644
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
645
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
646 def _do_attachment_move(pagename, request):
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
647 _ = request.getText
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
648
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
649 if 'cancel' in request.form:
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
650 return _('Move aborted!')
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
651 if not wikiutil.checkTicket(request, request.form['ticket']):
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
652 return _('Please use the interactive user interface to move attachments!')
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
653 if not request.user.may.delete(pagename):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
654 return _('You are not allowed to move attachments from this page.')
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
655
1868
64507f46beb2 reduce usage of has_key()
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1866
diff changeset
656 if 'newpagename' in request.form:
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
657 new_pagename = request.form.get('newpagename')
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
658 else:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
659 upload_form(pagename, request, msg=_("Move aborted because new page name is empty."))
1868
64507f46beb2 reduce usage of has_key()
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1866
diff changeset
660 if 'newattachmentname' in request.form:
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
661 new_attachment = request.form.get('newattachmentname')
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
662 if new_attachment != wikiutil.taintfilename(new_attachment):
1662
3338af3c3867 update i18n, fix i18n tools
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1653
diff changeset
663 upload_form(pagename, request, msg=_("Please use a valid filename for attachment '%(filename)s'.") % {
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
664 'filename': new_attachment})
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
665 return
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
666 else:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
667 upload_form(pagename, request, msg=_("Move aborted because new attachment name is empty."))
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
668
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
669 attachment = request.form.get('oldattachmentname')
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
670 move_file(request, pagename, new_pagename, attachment, new_attachment)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
671
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
672
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
673 def _do_move(pagename, request):
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
674 _ = request.getText
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
675
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
676 pagename, filename, fpath = _access_file(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
677 if not request.user.may.delete(pagename):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
678 return _('You are not allowed to move attachments from this page.')
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
679 if not filename:
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
680 return # error msg already sent in _access_file
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
681
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
682 # move file
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
683 d = {'action': action_name,
4235
a6c315ff8d66 Make more use of werkzeugs Href object for URL-generation in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4231
diff changeset
684 'url': request.href(pagename),
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
685 'do': 'attachment_move',
1610
48194fc011e5 move attachments: fix ticket calls
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1609
diff changeset
686 'ticket': wikiutil.createTicket(request),
4700
269a1fbc3ed7 AttachFile move: add more escaping (maybe not XSS exploitable though)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4699
diff changeset
687 'pagename': wikiutil.escape(pagename, 1),
269a1fbc3ed7 AttachFile move: add more escaping (maybe not XSS exploitable though)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4699
diff changeset
688 'attachment_name': wikiutil.escape(filename, 1),
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
689 'move': _('Move'),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
690 'cancel': _('Cancel'),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
691 'newname_label': _("New page name"),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
692 'attachment_label': _("New attachment name"),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
693 }
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
694 formhtml = '''
4235
a6c315ff8d66 Make more use of werkzeugs Href object for URL-generation in MoinMoin
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4231
diff changeset
695 <form action="%(url)s" method="POST">
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
696 <input type="hidden" name="action" value="%(action)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
697 <input type="hidden" name="do" value="%(do)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
698 <input type="hidden" name="ticket" value="%(ticket)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
699 <table>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
700 <tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
701 <td class="label"><label>%(newname_label)s</label></td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
702 <td class="content">
2708
5092edd82058 bug fix for non css browsers like w3m: for input fields set size of textarea and text to cols="80"
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 2701
diff changeset
703 <input type="text" name="newpagename" value="%(pagename)s" size="80">
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
704 </td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
705 </tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
706 <tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
707 <td class="label"><label>%(attachment_label)s</label></td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
708 <td class="content">
2708
5092edd82058 bug fix for non css browsers like w3m: for input fields set size of textarea and text to cols="80"
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 2701
diff changeset
709 <input type="text" name="newattachmentname" value="%(attachment_name)s" size="80">
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
710 </td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
711 </tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
712 <tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
713 <td></td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
714 <td class="buttons">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
715 <input type="hidden" name="oldattachmentname" value="%(attachment_name)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
716 <input type="submit" name="move" value="%(move)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
717 <input type="submit" name="cancel" value="%(cancel)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
718 </td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
719 </tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
720 </table>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
721 </form>''' % d
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
722 thispage = Page(request, pagename)
2966
ba14d391c2ba Refactor all modules to use the new add_msg interface in 1.7 (done by Frederico Lorenzi). Should not be backported to 1.6 but
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2885
diff changeset
723 request.theme.add_msg(formhtml, "dialog")
ba14d391c2ba Refactor all modules to use the new add_msg interface in 1.7 (done by Frederico Lorenzi). Should not be backported to 1.6 but
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2885
diff changeset
724 return thispage.send_page()
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
725
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
726
4439
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
727 def _do_box(pagename, request):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
728 _ = request.getText
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
729
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
730 pagename, filename, fpath = _access_file(pagename, request)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
731 if not request.user.may.read(pagename):
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
732 return _('You are not allowed to get attachments from this page.')
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
733 if not filename:
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
734 return # error msg already sent in _access_file
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
735
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
736 timestamp = datetime.datetime.fromtimestamp(os.path.getmtime(fpath))
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
737 if_modified = request.if_modified_since
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
738 if if_modified and if_modified >= timestamp:
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
739 request.status_code = 304
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
740 else:
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
741 ci = ContainerItem(request, pagename, filename)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
742 filename = wikiutil.taintfilename(request.values['member'])
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
743 mt = wikiutil.MimeType(filename=filename)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
744 content_type = mt.content_type()
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
745 mime_type = mt.mime_type()
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
746
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
747 # TODO: fix the encoding here, plain 8 bit is not allowed according to the RFCs
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
748 # There is no solution that is compatible to IE except stripping non-ascii chars
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
749 filename_enc = filename.encode(config.charset)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
750
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
751 # for dangerous files (like .html), when we are in danger of cross-site-scripting attacks,
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
752 # we just let the user store them to disk ('attachment').
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
753 # For safe files, we directly show them inline (this also works better for IE).
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
754 dangerous = mime_type in request.cfg.mimetypes_xss_protect
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
755 content_dispo = dangerous and 'attachment' or 'inline'
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
756
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
757 request.content_type = content_type
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
758 request.last_modified = timestamp
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
759 #request.content_length = os.path.getsize(fpath)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
760 content_dispo_string = '%s; filename="%s"' % (content_dispo, filename_enc)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
761 request.headers.add('Content-Disposition', content_dispo_string)
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
762
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
763 # send data
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
764 request.send_file(ci.get(filename))
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
765
ec62380ae400 store a drawing as a single file foo.tdraw (is a tar file with foo.draw, foo.map and foo.png inside)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4433
diff changeset
766
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
767 def _do_get(pagename, request):
3180
6ad1f133b66d AttachFile action: fix AttributeError
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3175
diff changeset
768 _ = request.getText
6ad1f133b66d AttachFile action: fix AttributeError
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3175
diff changeset
769
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
770 pagename, filename, fpath = _access_file(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
771 if not request.user.may.read(pagename):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
772 return _('You are not allowed to get attachments from this page.')
801
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
773 if not filename:
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
774 return # error msg already sent in _access_file
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
775
4226
b2df0c84140f Fixed handling of if_modified headers (threw exception on attachment-get)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4222
diff changeset
776 timestamp = datetime.datetime.fromtimestamp(os.path.getmtime(fpath))
b2df0c84140f Fixed handling of if_modified headers (threw exception on attachment-get)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4222
diff changeset
777 if_modified = request.if_modified_since
b2df0c84140f Fixed handling of if_modified headers (threw exception on attachment-get)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4222
diff changeset
778 if if_modified and if_modified >= timestamp:
4183
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
779 request.status_code = 304
1115
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
780 else:
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
781 mt = wikiutil.MimeType(filename=filename)
1548
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
782 content_type = mt.content_type()
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
783 mime_type = mt.mime_type()
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
784
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
785 # TODO: fix the encoding here, plain 8 bit is not allowed according to the RFCs
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
786 # There is no solution that is compatible to IE except stripping non-ascii chars
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
787 filename_enc = filename.encode(config.charset)
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
788
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
789 # for dangerous files (like .html), when we are in danger of cross-site-scripting attacks,
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
790 # we just let the user store them to disk ('attachment').
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
791 # For safe files, we directly show them inline (this also works better for IE).
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
792 dangerous = mime_type in request.cfg.mimetypes_xss_protect
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
793 content_dispo = dangerous and 'attachment' or 'inline'
2eb5117aa7de content-disposition for AttachFile downloads either inline or attachment depending on mimetype in cfg.mimetypes_xss_protect list
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1510
diff changeset
794
4183
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
795 request.content_type = content_type
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
796 request.last_modified = timestamp
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
797 request.content_length = os.path.getsize(fpath)
4176
85884c67228d Replaced/removed calls to request.emit_http_headers
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4168
diff changeset
798 content_dispo_string = '%s; filename="%s"' % (content_dispo, filename_enc)
4183
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
799 request.headers.add('Content-Disposition', content_dispo_string)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
800
1115
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
801 # send data
3553
1052c105b16f new request.send_file() call, making it possible to use server-specific optimizations
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3525
diff changeset
802 request.send_file(open(fpath, 'rb'))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
803
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
804
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
805 def _do_install(pagename, request):
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
806 _ = request.getText
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
807
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
808 pagename, target, targetpath = _access_file(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
809 if not request.user.isSuperUser():
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
810 return _('You are not allowed to install files.')
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
811 if not target:
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
812 return
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
813
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
814 package = packages.ZipPackage(request, targetpath)
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
815
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
816 if package.isPackage():
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
817 if package.installPackage():
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
818 msg = _("Attachment '%(filename)s' installed.") % {'filename': target}
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
819 else:
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
820 msg = _("Installation of '%(filename)s' failed.") % {'filename': target}
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
821 if package.msg:
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
822 msg += " " + package.msg
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
823 else:
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
824 msg = _('The file %s is not a MoinMoin package file.') % target
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
825
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
826 upload_form(pagename, request, msg=msg)
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
827
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
828
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
829 def _do_unzip(pagename, request, overwrite=False):
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
830 _ = request.getText
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
831 pagename, filename, fpath = _access_file(pagename, request)
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
832
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
833 if not (request.user.may.delete(pagename) and request.user.may.read(pagename) and request.user.may.write(pagename)):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
834 return _('You are not allowed to unzip attachments of this page.')
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
835
116
de898247fbff limit file count when unzipping an attachment
Thomas Waldmann <tw@waldmann-edv.de>
parents: 113
diff changeset
836 if not filename:
de898247fbff limit file count when unzipping an attachment
Thomas Waldmann <tw@waldmann-edv.de>
parents: 113
diff changeset
837 return # error msg already sent in _access_file
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
838
3712
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
839 try:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
840 if not zipfile.is_zipfile(fpath):
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
841 return _('The file %(filename)s is not a .zip file.') % {'filename': filename}
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
842
3712
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
843 # determine how which attachment names we have and how much space each is occupying
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
844 curr_fsizes = dict([(f, size(request, pagename, f)) for f in _get_files(request, pagename)])
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
845
3712
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
846 # Checks for the existance of one common prefix path shared among
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
847 # all files in the zip file. If this is the case, remove the common prefix.
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
848 # We also prepare a dict of the new filenames->filesizes.
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
849 zip_path_sep = '/' # we assume '/' is as zip standard suggests
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
850 fname_index = None
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
851 mapping = []
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
852 new_fsizes = {}
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
853 zf = zipfile.ZipFile(fpath)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
854 for zi in zf.infolist():
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
855 name = zi.filename
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
856 if not name.endswith(zip_path_sep): # a file (not a directory)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
857 if fname_index is None:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
858 fname_index = name.rfind(zip_path_sep) + 1
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
859 path = name[:fname_index]
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
860 if (name.rfind(zip_path_sep) + 1 != fname_index # different prefix len
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
861 or
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
862 name[:fname_index] != path): # same len, but still different
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
863 mapping = [] # zip is not acceptable
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
864 break
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
865 if zi.file_size >= request.cfg.unzip_single_file_size: # file too big
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
866 mapping = [] # zip is not acceptable
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
867 break
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
868 finalname = name[fname_index:] # remove common path prefix
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
869 finalname = finalname.decode(config.charset, 'replace') # replaces trash with \uFFFD char
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
870 mapping.append((name, finalname))
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
871 new_fsizes[finalname] = zi.file_size
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
872
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
873 # now we either have an empty mapping (if the zip is not acceptable),
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
874 # an identity mapping (no subdirs in zip, just all flat), or
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
875 # a mapping (origname, finalname) where origname is the zip member filename
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
876 # (including some prefix path) and finalname is a simple filename.
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
877
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
878 # calculate resulting total file size / count after unzipping:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
879 if overwrite:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
880 curr_fsizes.update(new_fsizes)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
881 total = curr_fsizes
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
882 else:
3712
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
883 new_fsizes.update(curr_fsizes)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
884 total = new_fsizes
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
885 total_count = len(total)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
886 total_size = sum(total.values())
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
887
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
888 if not mapping:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
889 msg = _("Attachment '%(filename)s' not unzipped because some files in the zip "
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
890 "are either not in the same directory or exceeded the single file size limit (%(maxsize_file)d kB)."
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
891 ) % {'filename': filename,
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
892 'maxsize_file': request.cfg.unzip_single_file_size / 1000, }
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
893 elif total_size > request.cfg.unzip_attachments_space:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
894 msg = _("Attachment '%(filename)s' not unzipped because it would have exceeded "
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
895 "the per page attachment storage size limit (%(size)d kB).") % {
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
896 'filename': filename,
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
897 'size': request.cfg.unzip_attachments_space / 1000, }
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
898 elif total_count > request.cfg.unzip_attachments_count:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
899 msg = _("Attachment '%(filename)s' not unzipped because it would have exceeded "
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
900 "the per page attachment count limit (%(count)d).") % {
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
901 'filename': filename,
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
902 'count': request.cfg.unzip_attachments_count, }
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
903 else:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
904 not_overwritten = []
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
905 for origname, finalname in mapping:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
906 try:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
907 # Note: reads complete zip member file into memory. ZipFile does not offer block-wise reading:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
908 add_attachment(request, pagename, finalname, zf.read(origname), overwrite)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
909 except AttachmentAlreadyExists:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
910 not_overwritten.append(finalname)
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
911 if not_overwritten:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
912 msg = _("Attachment '%(filename)s' partially unzipped (did not overwrite: %(filelist)s).") % {
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
913 'filename': filename,
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
914 'filelist': ', '.join(not_overwritten), }
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
915 else:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
916 msg = _("Attachment '%(filename)s' unzipped.") % {'filename': filename}
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
917 except RuntimeError, err:
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
918 # We don't want to crash with a traceback here (an exception
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
919 # here could be caused by an uploaded defective zip file - and
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
920 # if we crash here, the user does not get a UI to remove the
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
921 # defective zip file again).
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
922 # RuntimeError is raised by zipfile stdlib module in case of
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
923 # problems (like inconsistent slash and backslash usage in the
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
924 # archive).
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
925 logging.exception("An exception within zip file attachment handling occurred:")
b6dcdf55795e AttachFile action: catch RuntimeError when someone tries to unzip a defective archive
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3708
diff changeset
926 msg = _("A severe error occurred:") + ' ' + str(err)
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
927
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
928 upload_form(pagename, request, msg=msg)
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
929
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
930
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
931 def send_viewfile(pagename, request):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
932 _ = request.getText
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
933 fmt = request.html_formatter
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
934
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
935 pagename, filename, fpath = _access_file(pagename, request)
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
936 if not filename:
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
937 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
938
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
939 request.write('<h2>' + _("Attachment '%(filename)s'") % {'filename': filename} + '</h2>')
2736
2ffae6c847fd change the default link target for attachments to 'do=view', add a download link at top of the view page
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2733
diff changeset
940 # show a download link above the content
2ffae6c847fd change the default link target for attachments to 'do=view', add a download link at top of the view page
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2733
diff changeset
941 label = _('Download')
3293
65adbf84a0fb AttachFile: Make the download link more prominent
Radomir Dopieralski <moindev@sheep.art.pl>
parents: 3271
diff changeset
942 link = (fmt.url(1, getAttachUrl(pagename, filename, request, do='get'), css_class="download") +
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
943 fmt.text(label) +
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
944 fmt.url(0))
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
945 request.write('%s<br><br>' % link)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
946
801
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
947 mt = wikiutil.MimeType(filename=filename)
3307
f4212fb5ecb0 EmbedObject: fixed bug for image mimetype and configured when to call EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3293
diff changeset
948
3338
5f660b3c1cd7 moved browser_supported_images to config and exchanged it
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3307
diff changeset
949 # destinguishs if browser need a plugin in place
5f660b3c1cd7 moved browser_supported_images to config and exchanged it
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3307
diff changeset
950 if mt.major == 'image' and mt.minor in config.browser_supported_images:
5101
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
951 url = getAttachUrl(pagename, filename, request)
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
952 request.write('<img src="%s" alt="%s">' % (
5101
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
953 wikiutil.escape(url, 1),
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
954 wikiutil.escape(filename, 1)))
801
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
955 return
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
956 elif mt.major == 'text':
1989
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
957 ext = os.path.splitext(filename)[1]
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
958 Parser = wikiutil.getParserForExtension(request.cfg, ext)
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
959 if Parser is not None:
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
960 try:
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
961 content = file(fpath, 'r').read()
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
962 content = wikiutil.decodeUnknownInput(content)
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
963 colorizer = Parser(content, request, filename=filename)
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
964 colorizer.format(request.formatter)
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
965 return
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
966 except IOError:
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
967 pass
6d6379c9a1c9 AttachFile.send_viewfile: uses now colorizing parsers on view for mimetype text
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1988
diff changeset
968
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
969 request.write(request.formatter.preformatted(1))
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2210
diff changeset
970 # If we have text but no colorizing parser we try to decode file contents.
801
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
971 content = open(fpath, 'r').read()
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
972 content = wikiutil.decodeUnknownInput(content)
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
973 content = wikiutil.escape(content)
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
974 request.write(request.formatter.text(content))
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
975 request.write(request.formatter.preformatted(0))
801
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
976 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
977
3706
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
978 try:
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
979 package = packages.ZipPackage(request, fpath)
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
980 if package.isPackage():
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
981 request.write("<pre><b>%s</b>\n%s</pre>" % (_("Package script:"), wikiutil.escape(package.getScript())))
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
982 return
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
983
3706
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
984 if zipfile.is_zipfile(fpath) and mt.minor == 'zip':
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
985 zf = zipfile.ZipFile(fpath, mode='r')
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
986 request.write("<pre>%-46s %19s %12s\n" % (_("File Name"), _("Modified")+" "*5, _("Size")))
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
987 for zinfo in zf.filelist:
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
988 date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
989 request.write(wikiutil.escape("%-46s %s %12d\n" % (zinfo.filename, date, zinfo.file_size)))
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
990 request.write("</pre>")
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
991 return
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
992 except RuntimeError:
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
993 # We don't want to crash with a traceback here (an exception
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
994 # here could be caused by an uploaded defective zip file - and
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
995 # if we crash here, the user does not get a UI to remove the
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
996 # defective zip file again).
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
997 # RuntimeError is raised by zipfile stdlib module in case of
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
998 # problems (like inconsistent slash and backslash usage in the
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
999 # archive).
f0532fa90c6d AttachFile action: catch runtime error raised by zipfile when trying to view a defective zip
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3705
diff changeset
1000 logging.exception("An exception within zip file attachment handling occurred:")
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
1001 return
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
1002
3266
f62792cb2d24 macro.EmbedObject: adjusted to changes of argument parser, escaped output.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3253
diff changeset
1003 from MoinMoin import macro
f62792cb2d24 macro.EmbedObject: adjusted to changes of argument parser, escaped output.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3253
diff changeset
1004 from MoinMoin.parser.text import Parser
f62792cb2d24 macro.EmbedObject: adjusted to changes of argument parser, escaped output.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3253
diff changeset
1005
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1006 macro.request = request
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1007 macro.formatter = request.html_formatter
3266
f62792cb2d24 macro.EmbedObject: adjusted to changes of argument parser, escaped output.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3253
diff changeset
1008 p = Parser("##\n", request)
f62792cb2d24 macro.EmbedObject: adjusted to changes of argument parser, escaped output.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3253
diff changeset
1009 m = macro.Macro(p)
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1010
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2210
diff changeset
1011 # use EmbedObject to view valid mime types
1967
3bc30cdc4555 AttachFile, EmbedObject: code optimisation to use wikiutil.MimeType and refactoring of EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1952
diff changeset
1012 if mt is None:
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1013 request.write('<p>' + _("Unknown file type, cannot display this attachment inline.") + '</p>')
3149
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
1014 link = (fmt.url(1, getAttachUrl(pagename, filename, request)) +
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
1015 fmt.text(filename) +
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
1016 fmt.url(0))
6749e003d7e2 remove attachments direct serving (cfg.attachments), refactor AttachFile to use formatter for link generation
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3122
diff changeset
1017 request.write('For using an external program follow this link %s' % link)
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1018 return
4632
81598e8c735b AttachFile do=view: quote filename and pagename params for EmbedObject macro call
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4540
diff changeset
1019 request.write(m.execute('EmbedObject', u'target="%s", pagename="%s"' % (filename, pagename)))
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1020 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1021
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1022
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1023 def _do_view(pagename, request):
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1024 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1025
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1026 orig_pagename = pagename
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1027 pagename, filename, fpath = _access_file(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1028 if not request.user.may.read(pagename):
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1029 return _('You are not allowed to view attachments of this page.')
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
1030 if not filename:
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
1031 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1032
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1033 # send header & title
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1034 # Use user interface language for this generated page
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1035 request.setContentLanguage(request.lang)
3122
a1322262398a refactored _() getText calls to match new api
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3084
diff changeset
1036 title = _('attachment:%(filename)s of %(pagename)s') % {
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1037 'filename': filename, 'pagename': pagename}
616
3b08d9413589 move send_title/footer from wikiutil to theme.__init__
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 520
diff changeset
1038 request.theme.send_title(title, pagename=pagename)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1039
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1040 # send body
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
1041 request.write(request.formatter.startContent())
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
1042 send_viewfile(orig_pagename, request)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1043 send_uploadform(pagename, request)
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
1044 request.write(request.formatter.endContent())
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1045
616
3b08d9413589 move send_title/footer from wikiutil to theme.__init__
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 520
diff changeset
1046 request.theme.send_footer(pagename)
617
cf420addd95c removed MoinMoinNoFooter at many places, added call to theme.send_closing_html() where needed
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 616
diff changeset
1047 request.theme.send_closing_html()
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1048
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
1049
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1050 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1051 ### File attachment administration
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1052 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1053
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1054 def do_admin_browser(request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
1055 """ Browser for SystemAdmin macro. """
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1056 from MoinMoin.util.dataset import TupleDataset, Column
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1057 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1058
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1059 data = TupleDataset()
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1060 data.columns = [
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1061 Column('page', label=('Page')),
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1062 Column('file', label=('Filename')),
889
ad62767ffd0c pep8 style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 869
diff changeset
1063 Column('size', label=_('Size'), align='right'),
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1064 ]
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1065
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1066 # iterate over pages that might have attachments
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1067 pages = request.rootpage.getPageList()
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1068 for pagename in pages:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1069 # check for attachments directory
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1070 page_dir = getAttachDir(request, pagename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1071 if os.path.isdir(page_dir):
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1072 # iterate over files of the page
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1073 files = os.listdir(page_dir)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1074 for filename in files:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1075 filepath = os.path.join(page_dir, filename)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1076 data.addRow((
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1077 Page(request, pagename).link_to(request, querystr="action=AttachFile"),
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1078 wikiutil.escape(filename.decode(config.charset)),
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1079 os.path.getsize(filepath),
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1080 ))
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1081
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1082 if data:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1083 from MoinMoin.widget.browser import DataBrowserWidget
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1084
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1085 browser = DataBrowserWidget(request)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1086 browser.setData(data)
4093
742cabb168b9 browser._format: refactored input parameter "method". The default value is changed from "GET" to None. Now it does not add a form tag to the table on default. You have to give a value of "GET" or "POST" to add a form tag using the given method.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3907
diff changeset
1087 return browser.render(method="GET")
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1088
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1089 return ''
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1090