annotate MoinMoin/action/AttachFile.py @ 5102:9ae242080889

drawings/attachments: made editing support more generic (details see below) refactored AttachFile.getAttachUrl: * removed drawing param * it detects drawings now from the filename's extension (e.g. .adraw for the anywikidraw container and .tdraw for the twikidraw container) * it returns None now, if the combination of filename (extension) and do=something is not supported AttachFile.get_action looks up the action (module name) for specific combinations of filenames (extension) and do=subaction. info/history and AttachFile filelist action: Less hardcoded drawing support, it now just tries to get a do=modify URL for every file attachment. If that works, there will be an edit link for that attachment. action.anywikidraw and action.twikidraw: * they get the full container filename now and also use them in UI * they call do=modify to invoke the drawing applet multiconfig: removed drawing_action text_moin_wiki parser: use wikiutil.drawing2fname to process the given drawing name. if it looks like fully qualified (e.g. foo.tdraw, foo.adraw, foo.svg, foo.png, ...), then keep it. otherwise (e.g. foo, foo.bar, ...) append .tdraw as default drawing filename extension to be backwards compatible.
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Sun, 13 Sep 2009 16:01:09 +0200
parents d8ccac2f24c5
children 6c31e9dfdd99
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
5102
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
85
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
86 def get_action(request, filename, do):
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
87 ext_mapping = {
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
88 # file extension -> do -> action
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
89 '.tdraw': {
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
90 'modify': 'twikidraw',
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
91 },
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
92 '.adraw': {
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
93 'modify': 'anywikidraw',
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
94 },
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
95 }
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
96 generic_do_mapping = {
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
97 # do -> action
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
98 'get': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
99 'view': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
100 'move': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
101 'del': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
102 'unzip': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
103 'install': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
104 'upload_form': action_name,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
105 }
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
106 basename, ext = os.path.splitext(filename)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
107 do_mapping = ext_mapping.get(ext, {})
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
108 action = do_mapping.get(do, None)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
109 if action is None:
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
110 # we have no special support for this,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
111 # look up whether we have generic support:
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
112 action = generic_do_mapping.get(do, None)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
113 return action
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
114
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
115
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
116 def getAttachUrl(pagename, filename, request, addts=0, do='get'):
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
117 """ Get URL that points to attachment `filename` of page `pagename`.
5102
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
118 For upload url, call with do='upload_form'.
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
119 Returns the URL to do the specified "do" action or None,
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
120 if this action is not supported.
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
121 """
5102
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
122 action = get_action(request, filename, do)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
123 if action:
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
124 url = request.href(pagename, action=action, do=do, target=filename)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
125 return url
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
126
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
127
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
128 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
129 """ 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
130 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
131 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
132 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
133 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
134 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
135 return ''
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
136
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
137 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
138 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
139 return ''
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
140
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
141 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
142 attach_count = _('[%d attachments]') % len(files)
889
ad62767ffd0c pep8 style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 869
diff changeset
143 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
144 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
145 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
146 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
147 return attach_link
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
148
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
149
281
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
150 def getFilename(request, pagename, filename):
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
151 """ 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
152 @param request: request object
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
153 @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
154 @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
155 @rtype: string (in config.charset encoding)
8155e50e94ca fixed crash with non-ASCII attachment filename
Thomas Waldmann <tw@waldmann-edv.de>
parents: 280
diff changeset
156 @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
157 """
1911
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
158 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
159 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
160 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
161
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
162
1910
5c3dffe2abf1 new function AttachFile.exists to reduce code duplication
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1904
diff changeset
163 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
164 """ 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
165 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
166 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
167
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
168
1911
0b2ad3099fcf AttachFile.size to reduce code duplication, fixed docstring
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1910
diff changeset
169 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
170 """ 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
171 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
172 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
173
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
174
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
175 def info(pagename, request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
176 """ 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
177 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
178
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
179 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
180 files = []
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
181 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
182 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
183 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
184 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
185 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
186 'count': len(files),
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
187 '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
188 }
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
189 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
190
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
191
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
192 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
193 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
194 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
195 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
196 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
197 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
198 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
199 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
200 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
201
1791
6dd2e29acffe Eclipse PyDev Check: fixed lots of its errors and warnings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1777
diff changeset
202 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
203 """ 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
204
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
205 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
206 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
207 """
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
208 _ = 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
209
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
210 # replace illegal chars
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
211 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
212
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
213 # get directory, and possibly create it
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
214 attach_dir = getAttachDir(request, pagename, create=1)
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
215 # save file
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
216 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
217 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
218 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
219 raise AttachmentAlreadyExists
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
220 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
221 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
222 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
223 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
224 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
225 pass
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
226 stream = open(fpath, 'wb')
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
227 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
228 _write_stream(filecontent, stream)
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
229 finally:
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
230 stream.close()
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
231
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
232 _addLogEntry(request, 'ATTNEW', pagename, target)
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2210
diff changeset
233
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
234 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
235 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
236 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
237
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
238 return target, filesize
802
7b2e550c9660 merge moin/1.6
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 801 691
diff changeset
239
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
240
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
241 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
242 ### Internal helpers
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
243 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
244
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
245 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
246 """ 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
247
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
248 `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
249 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
250 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
251 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
252 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
253
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
254 # 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
255 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
256 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
257
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
258 # 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
259 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
260 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
261
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
262
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
263 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
264 """ 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
265 `(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
266
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
267 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
268 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
269 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
270
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
271 error = None
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
272 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
273 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
274 else:
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
275 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
276 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
277
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
278 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
279 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
280 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
281
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
282 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
283 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
284
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
285
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
286 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
287 _ = 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
288 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
289
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
290 # access directory
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
291 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
292 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
293
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
294 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
295 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
296
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
297 html = []
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
298 if files:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
299 if showheader:
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
300 html.append(fmt.rawHTML(_(
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
301 "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
302 "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
303 "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
304 "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
305 wiki=True
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
306 )))
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
307
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
308 label_del = _("del")
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
309 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
310 label_get = _("get")
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
311 label_edit = _("edit")
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
312 label_view = _("view")
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
313 label_unzip = _("unzip")
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
314 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
315
5102
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
316 may_read = request.user.may.read(pagename)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
317 may_write = request.user.may.write(pagename)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
318 may_delete = request.user.may.delete(pagename)
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
319
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
320 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
321 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
322 mt = wikiutil.MimeType(filename=file)
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
323 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
324 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
325 base, ext = os.path.splitext(file)
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
326 parmdict = {'file': wikiutil.escape(file),
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
327 'fsize': "%.1f" % (float(st.st_size) / 1024),
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
328 'fmtime': request.user.getFormattedDateTime(st.st_mtime),
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
329 }
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
330
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
331 links = []
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
332 if may_delete and not readonly:
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
333 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
334 fmt.text(label_del) +
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
335 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
336
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
337 if may_delete and not readonly:
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
338 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
339 fmt.text(label_move) +
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
340 fmt.url(0))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
341
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
342 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
343 fmt.text(label_get) +
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
344 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
345
5102
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
346 links.append(fmt.url(1, getAttachUrl(pagename, file, request, do='view')) +
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
347 fmt.text(label_view) +
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
348 fmt.url(0))
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
349
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
350 if may_write and not readonly:
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
351 edit_url = getAttachUrl(pagename, file, request, do='modify')
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
352 if edit_url:
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
353 links.append(fmt.url(1, edit_url) +
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
354 fmt.text(label_edit) +
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
355 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
356
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
357 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
358 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
359 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
360 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
361 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
362 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
363 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
364 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
365 elif (not is_package and mt.minor == 'zip' and
5102
9ae242080889 drawings/attachments: made editing support more generic (details see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5101
diff changeset
366 may_read and may_write and may_delete):
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
367 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
368 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
369 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
370 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
371 # 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
372 # 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
373 # 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
374 # 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
375 # 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
376 # 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
377 # 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
378 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
379
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
380 html.append(fmt.listitem(1))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
381 html.append("[%s]" % "&nbsp;| ".join(links))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
382 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
383 html.append(fmt.listitem(0))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
384 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
385
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
386 else:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
387 if showheader:
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
388 html.append(fmt.paragraph(1))
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
389 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
390 'pagename': pagename}))
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
391 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
392
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
393 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
394
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
395
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
396 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
397 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
398 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
399 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
400 files.sort()
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
401 else:
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
402 files = []
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
403 return files
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
404
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
405
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
406 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
407 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
408
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
409
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
410 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
411 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
412 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
413 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
414
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
415
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
416 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
417 ### 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
418 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
419
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
420 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
421 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
422 for fname in files:
5101
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
423 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
424 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
425 wikiutil.escape(fname, 1),
d8ccac2f24c5 getAttachUrl: removed escaped=... param (see below)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5098
diff changeset
426 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
427
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
428 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
429 """ 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
430 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
431 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
432 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
433
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
434 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
435 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
436 return
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
437
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
438 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
439
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
440 # 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
441 # 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
442 # 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
443 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
444 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
445 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
446 <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
447 <dl>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
448 <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
449 <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
450 <dt>%(upload_label_target)s</dt>
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
451 <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
452 <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
453 <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
454 </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
455 %(textcha)s
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
456 <p>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
457 <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
458 <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
459 <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
460 </p>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
461 </form>
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
462 """ % {
4231
a29fd3a9e91f Try using werkzeugs Href object for URL generation (first in AttachFile)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4226
diff changeset
463 '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
464 '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
465 '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
466 'upload_label_target': _('Rename to'),
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
467 '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
468 '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
469 '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
470 '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
471 '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
472 })
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
473
1635
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
474 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
475 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
476
a41c60e53ddd display upload attachment form at top, avoids lots of scrolling
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1611
diff changeset
477 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
478 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
479
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
480 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
481 ### 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
482 #############################################################################
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
483
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
484 def execute(pagename, request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
485 """ 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
486 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
487
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
488 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
489 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
490 if handler:
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
491 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
492 else:
4703
621c708ecddb merged moin/1.8
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4651 4702
diff changeset
493 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
494 if msg:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
495 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
496
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
497
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
498 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
499 upload_form(pagename, request)
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
500
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
501
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
502 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
503 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
504 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
505 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
506
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
507 # 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
508 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
509 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
510 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
511 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
512 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
513 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
514 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
515 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
516
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
517
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
518 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
519 _ = request.getText
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
520 # 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
521 # 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
522 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
523 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
524
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
525 form = request.form
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
526
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
527 file_upload = request.files.get('file')
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
528 if not file_upload:
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
529 # 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
530 # with non-ascii characters on Safari.
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
531 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
532
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
533 try:
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
534 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
535 except:
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
536 overwrite = 0
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
537
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
538 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
539 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
540
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
541 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
542 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
543
5098
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
544 target = form.get('target', u'').strip()
ff588e9e24d6 simplify getAttachUrl: remove upload parameter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 5095
diff changeset
545 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
546 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
547
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
548 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
549
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
550 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
551 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
552
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
553 # add the attachment
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
554 try:
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
555 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
556 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
557 " with %(bytes)d bytes saved.") % {
4222
f77469d98cd2 Fixed: AttachFile upload handling & some form-issues
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4210
diff changeset
558 'target': target, 'filename': file_upload.filename, 'bytes': bytes}
691
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
559 except AttachmentAlreadyExists:
f18b06c790d4 Refactored adding attachments.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 623
diff changeset
560 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
561 '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
562
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
563 # return attachment list
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
564 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
565
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
566
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
567 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
568 """ 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
569
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 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
571 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
572 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
573 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
574 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
575
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 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
577 """ 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
578 (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
579 """
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 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
581 '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
582 '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
583 '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
584 #'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
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 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
587 # 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
588
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
589 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
590 """ 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
591 """
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
592 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
593 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
594
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
595 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
596 """ 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
597 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
598 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
599 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
600 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
601 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
602 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
603 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
604 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
605 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
606 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
607 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
608 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
609 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
610 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
611 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
612
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
613 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
614 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
615 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
616
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
617 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
618 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
619
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
620 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
621 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
622
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
623 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
624 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
625 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
626 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
627 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
628
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
629 # delete file
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
630 os.remove(fpath)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
631 _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
632
1479
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
633 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
634 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
635 index = XapianIndex(request)
1479
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
636 if index.exists:
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
637 index.remove_item(pagename, filename)
b1562b232683 fix for deleting from xapian index
Franz Pletz <fpletz AT franz-pletz DOT org>
parents: 1473
diff changeset
638
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
639 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
640
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
641
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
642 def move_file(request, pagename, new_pagename, attachment, new_attachment):
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
643 _ = request.getText
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
644
1609
7f73dafb525d move attachments: remove unneeded imports
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1608
diff changeset
645 newpage = Page(request, new_pagename)
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
646 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
647 new_attachment_path = os.path.join(getAttachDir(request, new_pagename,
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
648 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
649 attachment_path = os.path.join(getAttachDir(request, pagename),
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
650 attachment).encode(config.charset)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
651
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
652 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
653 upload_form(pagename, request,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
654 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
655 'new_pagename': new_pagename,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
656 'new_filename': new_attachment})
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
657 return
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
658
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
659 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
660 # move file
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
661 filesys.rename(attachment_path, new_attachment_path)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
662 _addLogEntry(request, 'ATTDEL', pagename, attachment)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
663 _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
664 upload_form(pagename, request,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
665 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
666 'pagename': pagename,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
667 'filename': attachment,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
668 'new_pagename': new_pagename,
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
669 'new_filename': new_attachment})
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
670 else:
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
671 upload_form(pagename, request, msg=_("Nothing changed"))
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
672 else:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
673 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
674 'new_pagename': new_pagename})
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
675
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
676
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
677 def _do_attachment_move(pagename, request):
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
678 _ = request.getText
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
679
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
680 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
681 return _('Move aborted!')
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
682 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
683 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
684 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
685 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
686
1868
64507f46beb2 reduce usage of has_key()
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1866
diff changeset
687 if 'newpagename' in request.form:
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
688 new_pagename = request.form.get('newpagename')
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
689 else:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
690 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
691 if 'newattachmentname' in request.form:
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
692 new_attachment = request.form.get('newattachmentname')
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
693 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
694 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
695 'filename': new_attachment})
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
696 return
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
697 else:
3171
b23656c17a0b AttachFile: fix messages, remove unused code
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3169
diff changeset
698 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
699
4201
40acd13fb3d6 Changed form access to MultiDict forms
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4183
diff changeset
700 attachment = request.form.get('oldattachmentname')
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
701 move_file(request, pagename, new_pagename, attachment, new_attachment)
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
702
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
703
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
704 def _do_move(pagename, request):
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
705 _ = request.getText
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
706
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
707 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
708 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
709 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
710 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
711 return # error msg already sent in _access_file
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
712
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
713 # 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
714 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
715 'url': request.href(pagename),
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
716 'do': 'attachment_move',
1610
48194fc011e5 move attachments: fix ticket calls
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1609
diff changeset
717 '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
718 '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
719 'attachment_name': wikiutil.escape(filename, 1),
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
720 'move': _('Move'),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
721 'cancel': _('Cancel'),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
722 'newname_label': _("New page name"),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
723 'attachment_label': _("New attachment name"),
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
724 }
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
725 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
726 <form action="%(url)s" method="POST">
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
727 <input type="hidden" name="action" value="%(action)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
728 <input type="hidden" name="do" value="%(do)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
729 <input type="hidden" name="ticket" value="%(ticket)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
730 <table>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
731 <tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
732 <td class="label"><label>%(newname_label)s</label></td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
733 <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
734 <input type="text" name="newpagename" value="%(pagename)s" size="80">
1608
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
735 </td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
736 </tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
737 <tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
738 <td class="label"><label>%(attachment_label)s</label></td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
739 <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
740 <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
741 </td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
742 </tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
743 <tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
744 <td></td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
745 <td class="buttons">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
746 <input type="hidden" name="oldattachmentname" value="%(attachment_name)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
747 <input type="submit" name="move" value="%(move)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
748 <input type="submit" name="cancel" value="%(cancel)s">
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
749 </td>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
750 </tr>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
751 </table>
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
752 </form>''' % d
7a26b4c769f3 attachment move
ReimarBauer <R.Bauer@fz-juelich.de>
parents: 1548
diff changeset
753 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
754 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
755 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
756
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
757
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
758 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
759 _ = 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
760
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 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
762 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
763 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
764 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
765 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
766
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
767 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
768 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
769 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
770 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
771 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
772 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
773 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
774 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
775 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
776 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
777
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
778 # 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
779 # 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
780 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
781
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
782 # 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
783 # 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
784 # 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
785 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
786 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
787
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
788 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
789 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
790 #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
791 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
792 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
793
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
794 # 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
795 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
796
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
797
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
798 def _do_get(pagename, request):
3180
6ad1f133b66d AttachFile action: fix AttributeError
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3175
diff changeset
799 _ = request.getText
6ad1f133b66d AttachFile action: fix AttributeError
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3175
diff changeset
800
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
801 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
802 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
803 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
804 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
805 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
806
4226
b2df0c84140f Fixed handling of if_modified headers (threw exception on attachment-get)
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4222
diff changeset
807 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
808 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
809 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
810 request.status_code = 304
1115
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
811 else:
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
812 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
813 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
814 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
815
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
816 # 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
817 # 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
818 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
819
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
820 # 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
821 # 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
822 # 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
823 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
824 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
825
4183
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
826 request.content_type = content_type
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
827 request.last_modified = timestamp
fc20a076aad0 Accomodate for consolidation of Request/Response
Florian Krupicka <florian.krupicka@googlemail.com>
parents: 4176
diff changeset
828 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
829 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
830 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
831
1115
a349adcabffe 304 response support for attached files
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1068
diff changeset
832 # 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
833 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
834
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
835
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
836 def _do_install(pagename, request):
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
837 _ = request.getText
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
838
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
839 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
840 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
841 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
842 if not target:
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
843 return
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
844
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
845 package = packages.ZipPackage(request, targetpath)
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
846
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
847 if package.isPackage():
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
848 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
849 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
850 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
851 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
852 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
853 msg += " " + package.msg
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
854 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
855 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
856
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
857 upload_form(pagename, request, msg=msg)
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
858
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
859
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
860 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
861 _ = request.getText
3700
9426f34f07b9 AttachFile: refactored unzip subaction code:
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3603
diff changeset
862 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
863
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
864 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
865 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
866
116
de898247fbff limit file count when unzipping an attachment
Thomas Waldmann <tw@waldmann-edv.de>
parents: 113
diff changeset
867 if not filename:
de898247fbff limit file count when unzipping an attachment
Thomas Waldmann <tw@waldmann-edv.de>
parents: 113
diff changeset
868 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
869
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
870 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
871 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
872 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
873
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
874 # 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
875 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
876
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
877 # 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
878 # 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
879 # 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
880 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
881 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
882 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
883 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
884 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
885 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
886 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
887 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
888 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
889 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
890 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
891 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
892 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
893 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
894 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
895 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
896 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
897 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
898 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
899 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
900 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
901 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
902 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
903
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 # 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
905 # 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
906 # 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
907 # (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
908
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 # 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
910 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
911 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
912 total = curr_fsizes
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
913 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
914 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
915 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
916 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
917 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
918
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 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
920 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
921 "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
922 ) % {'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
923 '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
924 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
925 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
926 "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
927 '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
928 '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
929 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
930 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
931 "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
932 '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
933 '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
934 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
935 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
936 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
937 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
938 # 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
939 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
940 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
941 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
942 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
943 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
944 '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
945 '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
946 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
947 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
948 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
949 # 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
950 # 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
951 # 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
952 # 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
953 # 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
954 # 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
955 # 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
956 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
957 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
958
4699
5f51246a4df1 AttachFile XSS fixes: move escaping to error_msg / upload_form
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 4647
diff changeset
959 upload_form(pagename, request, msg=msg)
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
960
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
961
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
962 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
963 _ = 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
964 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
965
3169
a654cf294f4e AttachFile: fix _access_file return parameter count
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3164
diff changeset
966 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
967 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
968 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
969
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
970 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
971 # 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
972 label = _('Download')
3293
65adbf84a0fb AttachFile: Make the download link more prominent
Radomir Dopieralski <moindev@sheep.art.pl>
parents: 3271
diff changeset
973 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
974 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
975 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
976 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
977
801
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
978 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
979
3338
5f660b3c1cd7 moved browser_supported_images to config and exchanged it
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3307
diff changeset
980 # 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
981 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
982 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
983 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
984 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
985 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
986 return
1f8976e01c3a fix wrong import, make more use of MimeType class
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 799
diff changeset
987 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
988 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
989 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
990 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
991 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
992 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
993 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
994 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
995 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
996 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
997 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
998 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
999
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
1000 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
1001 # 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
1002 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
1003 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
1004 content = wikiutil.escape(content)
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
1005 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
1006 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
1007 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1008
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
1009 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
1010 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
1011 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
1012 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
1013 return
80
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
1014
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
1015 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
1016 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
1017 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
1018 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
1019 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
1020 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
1021 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
1022 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
1023 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
1024 # 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
1025 # 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
1026 # 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
1027 # 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
1028 # 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
1029 # 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
1030 # 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
1031 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
1032 return
99f0d19d0285 Integrated MoinMoin:PackageInstaller and zip support.
Alexander Schremmer <alex@alexanderweb.de.tla>
parents: 33
diff changeset
1033
3266
f62792cb2d24 macro.EmbedObject: adjusted to changes of argument parser, escaped output.
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 3253
diff changeset
1034 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
1035 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
1036
1952
8ab85e3711dc AttachFile:send_viewfile extended for mimetypes presentable by EmbedObject
Reimar Bauer <rb.proj AT googlemail DOT com>
parents: 1920
diff changeset
1037 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
1038 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
1039 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
1040 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
1041
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2210
diff changeset
1042 # 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
1043 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
1044 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
1045 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
1046 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
1047 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
1048 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
1049 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
1050 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
1051 return
0
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
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1054 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
1055 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1056
3152
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1057 orig_pagename = pagename
719c5bf80150 AttachFile: move ACL processing to handlers, simplify
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3151
diff changeset
1058 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
1059 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
1060 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
1061 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
1062 return
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1063
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1064 # send header & title
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1065 # 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
1066 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
1067 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
1068 '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
1069 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
1070
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1071 # send body
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
1072 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
1073 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
1074 send_uploadform(pagename, request)
1833
af0feb0e3c7b AttachFile: more usage of the formatter
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1832
diff changeset
1075 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
1076
616
3b08d9413589 move send_title/footer from wikiutil to theme.__init__
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 520
diff changeset
1077 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
1078 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
1079
3151
863d90c05507 AttachFile: more refactorings
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3150
diff changeset
1080
0
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 ### File attachment administration
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1083 #############################################################################
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 def do_admin_browser(request):
3150
8ae94675b9f9 AttachFile: some cosmetical source changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3149
diff changeset
1086 """ 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
1087 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
1088 _ = request.getText
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1089
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1090 data = TupleDataset()
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1091 data.columns = [
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1092 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
1093 Column('file', label=('Filename')),
889
ad62767ffd0c pep8 style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 869
diff changeset
1094 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
1095 ]
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1096
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1097 # 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
1098 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
1099 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
1100 # 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
1101 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
1102 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
1103 # 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
1104 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
1105 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
1106 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
1107 data.addRow((
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1108 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
1109 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
1110 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
1111 ))
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1112
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1113 if data:
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1114 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
1115
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1116 browser = DataBrowserWidget(request)
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1117 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
1118 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
1119
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1120 return ''
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1121