Mercurial > p > roundup > code
annotate roundup/xmlrpc.py @ 4587:a2eb4fb3e6d8
New Chameleon templating engine, engine is now configurable.
We now have two configurable templating engines, the old Zope TAL
templates (called zopetal in the config) and the new Chameleon (called
chameleon in the config). A new config-option "template_engine" under
[main] can take these config-options, the default is zopetal.
Thanks to Cheer Xiao for the idea of making this configurable *and*
for the actual implementation!
Cheer Xiao commit log:
- The original TAL engine ported from Zope is thereafter referred to as
"zopetal", in speech and in code
- A new option "template_engine" under [main] introduced
- Zopetal-specific code stripped from cgi/templating.py to form the new
cgi/engine_zopetal.py
- Interface to Chameleon in cgi/engine_chameleon.py
- Engines are supposed to provide a Templates class that mimics the
behavior of the old cgi.templating.Templates. The Templates class is
preferably subclassed from cgi.templating.TemplatesBase.
- New function cgi.templating.get_templates to get the appropriate engine's
Templates instance according to the engine name
| author | Ralf Schlatterbeck <rsc@runtux.com> |
|---|---|
| date | Thu, 23 Feb 2012 18:10:03 +0100 |
| parents | 3f251efd5f48 |
| children | c9b85ca1f985 |
| rev | line source |
|---|---|
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
1 # |
|
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
2 # Copyright (C) 2007 Stefan Seefeld |
|
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
3 # All rights reserved. |
| 3839 | 4 # For license terms see the file COPYING.txt. |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
5 # |
|
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
6 |
|
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
7 from roundup import hyperdb |
|
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
8 from roundup.cgi.exceptions import * |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
9 from roundup.exceptions import UsageError |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
10 from roundup.date import Date, Range, Interval |
| 4083 | 11 from roundup import actions |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
12 from SimpleXMLRPCServer import * |
|
4371
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
13 from xmlrpclib import Binary |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
14 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
15 def translate(value): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
16 """Translate value to becomes valid for XMLRPC transmission.""" |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
17 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
18 if isinstance(value, (Date, Range, Interval)): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
19 return repr(value) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
20 elif type(value) is list: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
21 return [translate(v) for v in value] |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
22 elif type(value) is tuple: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
23 return tuple([translate(v) for v in value]) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
24 elif type(value) is dict: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
25 return dict([[translate(k), translate(value[k])] for k in value]) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
26 else: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
27 return value |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
28 |
|
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
29 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
30 def props_from_args(db, cl, args, itemid=None): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
31 """Construct a list of properties from the given arguments, |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
32 and return them after validation.""" |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
33 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
34 props = {} |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
35 for arg in args: |
|
4371
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
36 if isinstance(arg, Binary): |
|
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
37 arg = arg.data |
|
4369
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
38 try : |
|
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
39 key, value = arg.split('=', 1) |
|
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
40 except ValueError : |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
41 raise UsageError, 'argument "%s" not propname=value'%arg |
|
4371
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
42 if isinstance(key, unicode): |
|
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
43 try: |
|
4369
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
44 key = key.encode ('ascii') |
|
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
45 except UnicodeEncodeError: |
|
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
46 raise UsageError, 'argument %r is no valid ascii keyword'%key |
|
4371
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
47 if isinstance(value, unicode): |
|
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
48 value = value.encode('utf-8') |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
49 if value: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
50 try: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
51 props[key] = hyperdb.rawToHyperdb(db, cl, itemid, |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
52 key, value) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
53 except hyperdb.HyperdbValueError, message: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
54 raise UsageError, message |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
55 else: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
56 props[key] = None |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
57 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
58 return props |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
59 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
60 class RoundupInstance: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
61 """The RoundupInstance provides the interface accessible through |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
62 the Python XMLRPC mapping.""" |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
63 |
| 4083 | 64 def __init__(self, db, actions, translator): |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
65 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
66 self.db = db |
| 4083 | 67 self.actions = actions |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
68 self.translator = translator |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
69 |
|
4140
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
70 def schema(self): |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
71 s = {} |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
72 for c in self.db.classes: |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
73 cls = self.db.classes[c] |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
74 props = [(n,repr(v)) for n,v in cls.properties.items()] |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
75 s[c] = props |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
76 return s |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
77 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
78 def list(self, classname, propname=None): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
79 cl = self.db.getclass(classname) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
80 if not propname: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
81 propname = cl.labelprop() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
82 result = [cl.get(itemid, propname) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
83 for itemid in cl.list() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
84 if self.db.security.hasPermission('View', self.db.getuid(), |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
85 classname, propname, itemid) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
86 ] |
| 3839 | 87 return result |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
88 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
89 def filter(self, classname, search_matches, filterspec, |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
90 sort=[], group=[]): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
91 cl = self.db.getclass(classname) |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
92 uid = self.db.getuid() |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
93 security = self.db.security |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
94 filterspec = security.filterFilterspec (uid, classname, filterspec) |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
95 sort = security.filterSortspec (uid, classname, sort) |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
96 group = security.filterSortspec (uid, classname, group) |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
97 result = cl.filter(search_matches, filterspec, sort=sort, group=group) |
|
4437
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
98 check = security.hasPermission |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
99 x = [id for id in result if check('View', uid, classname, itemid=id)] |
|
261c9f913ff7
- Add explicit "Search" permissions, see Security Fix below.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4371
diff
changeset
|
100 return x |
|
3985
f7f3068b32a1
Add filter() to XML-RPC interface [SF#966456]
Richard Jones <richard@users.sourceforge.net>
parents:
3973
diff
changeset
|
101 |
|
4449
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
102 def lookup(self, classname, key): |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
103 cl = self.db.getclass(classname) |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
104 uid = self.db.getuid() |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
105 prop = cl.getkey() |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
106 check = self.db.security.hasSearchPermission |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
107 if not check(uid, classname, 'id') or not check(uid, classname, prop): |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
108 raise Unauthorised('Permission to search %s denied'%classname) |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
109 return cl.lookup(key) |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
110 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
111 def display(self, designator, *properties): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
112 classname, itemid = hyperdb.splitDesignator(designator) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
113 cl = self.db.getclass(classname) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
114 props = properties and list(properties) or cl.properties.keys() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
115 props.sort() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
116 for p in props: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
117 if not self.db.security.hasPermission('View', self.db.getuid(), |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
118 classname, p, itemid): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
119 raise Unauthorised('Permission to view %s of %s denied'% |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
120 (p, designator)) |
|
3973
85cbaa50eba1
xml-rpc security checks and tests across all backends [SF#1907211]
Richard Jones <richard@users.sourceforge.net>
parents:
3937
diff
changeset
|
121 result = [(prop, cl.get(itemid, prop)) for prop in props] |
| 3839 | 122 return dict(result) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
123 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
124 def create(self, classname, *args): |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
125 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
126 if not self.db.security.hasPermission('Create', self.db.getuid(), classname): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
127 raise Unauthorised('Permission to create %s denied'%classname) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
128 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
129 cl = self.db.getclass(classname) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
130 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
131 # convert types |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
132 props = props_from_args(self.db, cl, args) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
133 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
134 # check for the key property |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
135 key = cl.getkey() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
136 if key and not props.has_key(key): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
137 raise UsageError, 'you must provide the "%s" property.'%key |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
138 |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
139 for key in props: |
|
4311
7291130fad82
- fix create permission for xmlrpc, too
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4256
diff
changeset
|
140 if not self.db.security.hasPermission('Create', self.db.getuid(), |
|
7291130fad82
- fix create permission for xmlrpc, too
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4256
diff
changeset
|
141 classname, property=key): |
|
7291130fad82
- fix create permission for xmlrpc, too
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4256
diff
changeset
|
142 raise Unauthorised('Permission to create %s.%s denied'%(classname, key)) |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
143 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
144 # do the actual create |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
145 try: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
146 result = cl.create(**props) |
|
4224
3f6cadb98c2f
Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents:
4140
diff
changeset
|
147 self.db.commit() |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
148 except (TypeError, IndexError, ValueError), message: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
149 raise UsageError, message |
| 3839 | 150 return result |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
151 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
152 def set(self, designator, *args): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
153 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
154 classname, itemid = hyperdb.splitDesignator(designator) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
155 cl = self.db.getclass(classname) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
156 props = props_from_args(self.db, cl, args, itemid) # convert types |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
157 for p in props.iterkeys(): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
158 if not self.db.security.hasPermission('Edit', self.db.getuid(), |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
159 classname, p, itemid): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
160 raise Unauthorised('Permission to edit %s of %s denied'% |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
161 (p, designator)) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
162 try: |
|
4224
3f6cadb98c2f
Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents:
4140
diff
changeset
|
163 result = cl.set(itemid, **props) |
|
3f6cadb98c2f
Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents:
4140
diff
changeset
|
164 self.db.commit() |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
165 except (TypeError, IndexError, ValueError), message: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
166 raise UsageError, message |
|
4224
3f6cadb98c2f
Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents:
4140
diff
changeset
|
167 return result |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
168 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
169 |
| 4083 | 170 builtin_actions = {'retire': actions.Retire} |
| 171 | |
| 172 def action(self, name, *args): | |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
173 """Execute a named action.""" |
| 4083 | 174 |
| 175 if name in self.actions: | |
| 176 action_type = self.actions[name] | |
| 177 elif name in self.builtin_actions: | |
| 178 action_type = self.builtin_actions[name] | |
| 179 else: | |
| 180 raise Exception('action "%s" is not supported %s' % (name, ','.join(self.actions.keys()))) | |
| 181 action = action_type(self.db, self.translator) | |
| 182 return action.execute(*args) | |
| 183 | |
| 184 | |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
185 class RoundupDispatcher(SimpleXMLRPCDispatcher): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
186 """RoundupDispatcher bridges from cgi.client to RoundupInstance. |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
187 It expects user authentication to be done.""" |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
188 |
| 4083 | 189 def __init__(self, db, actions, translator, |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
190 allow_none=False, encoding=None): |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
191 |
|
4256
712549bb7fe5
Small fix for CGI-handling of XMLRPC requests for python2.4...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4224
diff
changeset
|
192 try: |
|
712549bb7fe5
Small fix for CGI-handling of XMLRPC requests for python2.4...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4224
diff
changeset
|
193 # python2.5 and beyond |
|
712549bb7fe5
Small fix for CGI-handling of XMLRPC requests for python2.4...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4224
diff
changeset
|
194 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) |
|
712549bb7fe5
Small fix for CGI-handling of XMLRPC requests for python2.4...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4224
diff
changeset
|
195 except TypeError: |
|
712549bb7fe5
Small fix for CGI-handling of XMLRPC requests for python2.4...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4224
diff
changeset
|
196 # python2.4 |
|
712549bb7fe5
Small fix for CGI-handling of XMLRPC requests for python2.4...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4224
diff
changeset
|
197 SimpleXMLRPCDispatcher.__init__(self) |
| 4083 | 198 self.register_instance(RoundupInstance(db, actions, translator)) |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
199 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
200 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
201 def dispatch(self, input): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
202 return self._marshaled_dispatch(input) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
203 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
204 def _dispatch(self, method, params): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
205 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
206 retn = SimpleXMLRPCDispatcher._dispatch(self, method, params) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
207 retn = translate(retn) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
208 return retn |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
209 |
