Mercurial > p > roundup > code
annotate roundup/xmlrpc.py @ 8408:e882a5d52ae5
refactor: move RateLimitExceeded to roundup.cgi.exceptions
RateLimitExceeded is an HTTP exception that raises code 429. Move it
to roundup.cgi.exceptions where all the other exceptions that result
in http status codes are located. Also make it inherit from
HTTPException since it is one.
Also add docstrings for all HTTP exceptions and order HTTPExceptions
by status code.
BREAKING CHANGE: if somebody is importing RateLimitExceeded they will
need to change their import. I consider it unlikely anybody is using
RateLimitExceeded. Detectors and extensions are unlikely to raise
RateLimitExceeded. So I am leaving it out of the upgrading doc. Just
doc in change log.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sun, 10 Aug 2025 21:27:06 -0400 |
| parents | f7bd22bdef9d |
| children |
| 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 |
|
5326
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
7 import logging |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
8 from roundup import hyperdb |
|
5072
1c792cf0a574
Remove 'import *' statement from xmlrpc.py
John Kristensen <john@jerrykan.com>
parents:
5012
diff
changeset
|
9 from roundup.exceptions import Unauthorised, UsageError |
|
4079
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 |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
12 from roundup.anypy.strings import us2s |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
13 from traceback import format_exc |
|
5408
e46ce04d5bbc
Python 3 preparation: update xmlrpclib / SimpleXMLRPCServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
14 from roundup.anypy import xmlrpc_ |
|
e46ce04d5bbc
Python 3 preparation: update xmlrpclib / SimpleXMLRPCServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
15 SimpleXMLRPCDispatcher = xmlrpc_.server.SimpleXMLRPCDispatcher |
|
e46ce04d5bbc
Python 3 preparation: update xmlrpclib / SimpleXMLRPCServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5395
diff
changeset
|
16 Binary = xmlrpc_.client.Binary |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
17 |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
18 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
19 def translate(value): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
20 """Translate value to becomes valid for XMLRPC transmission.""" |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
21 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
22 if isinstance(value, (Date, Range, Interval)): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
23 return repr(value) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
24 elif type(value) is list: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
25 return [translate(v) for v in value] |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
26 elif type(value) is tuple: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
27 return tuple([translate(v) for v in value]) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
28 elif type(value) is dict: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
29 return dict([[translate(k), translate(value[k])] for k in value]) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
30 else: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
31 return value |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
32 |
|
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 def props_from_args(db, cl, args, itemid=None): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
35 """Construct a list of properties from the given arguments, |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
36 and return them after validation.""" |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
37 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
38 props = {} |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
39 for arg in args: |
|
4371
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
40 if isinstance(arg, Binary): |
|
40d7414592ac
- fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4369
diff
changeset
|
41 arg = arg.data |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
42 try: |
|
4369
2188c9de5bdd
xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4311
diff
changeset
|
43 key, value = arg.split('=', 1) |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
44 except ValueError: |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
45 raise UsageError('argument "%s" not propname=value' % arg) |
|
5416
56c9bcdea47f
Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5408
diff
changeset
|
46 key = us2s(key) |
|
56c9bcdea47f
Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5408
diff
changeset
|
47 value = us2s(value) |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
48 if value: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
49 try: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
50 props[key] = hyperdb.rawToHyperdb(db, cl, itemid, |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
51 key, value) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5072
diff
changeset
|
52 except hyperdb.HyperdbValueError as message: |
|
5378
35ea9b1efc14
Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5326
diff
changeset
|
53 raise UsageError(message) |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
54 else: |
|
5326
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
55 # If we're syncing a file the contents may not be None |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
56 if key == 'content': |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
57 props[key] = '' |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
58 else: |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
59 props[key] = None |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
60 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
61 return props |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
62 |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
63 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
64 class RoundupInstance: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
65 """The RoundupInstance provides the interface accessible through |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
66 the Python XMLRPC mapping.""" |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
67 |
| 4083 | 68 def __init__(self, db, actions, translator): |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
69 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
70 self.db = db |
| 4083 | 71 self.actions = actions |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
72 self.translator = translator |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
73 |
|
4140
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
74 def schema(self): |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
75 s = {} |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
76 for c in self.db.classes: |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
77 cls = self.db.classes[c] |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
78 props = [(n, repr(v)) for n, v in sorted(cls.properties.items())] |
|
4140
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
79 s[c] = props |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
80 return s |
|
3c4545f55949
Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents:
4124
diff
changeset
|
81 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
82 def list(self, classname, propname=None): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
83 cl = self.db.getclass(classname) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
84 if not propname: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
85 propname = cl.labelprop() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
86 result = [cl.get(itemid, propname) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
87 for itemid in cl.list() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
88 if self.db.security.hasPermission('View', self.db.getuid(), |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
89 classname, propname, |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
90 itemid) |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
91 ] |
| 3839 | 92 return result |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
93 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
94 def filter(self, classname, search_matches, filterspec, |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
95 sort=[], group=[]): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
96 cl = self.db.getclass(classname) |
|
8126
f7bd22bdef9d
Move permission check code to hyperdb
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6015
diff
changeset
|
97 return cl.filter_with_permissions( |
|
f7bd22bdef9d
Move permission check code to hyperdb
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6015
diff
changeset
|
98 search_matches, filterspec, sort=sort, group=group |
|
f7bd22bdef9d
Move permission check code to hyperdb
Ralf Schlatterbeck <rsc@runtux.com>
parents:
6015
diff
changeset
|
99 ) |
|
3985
f7f3068b32a1
Add filter() to XML-RPC interface [SF#966456]
Richard Jones <richard@users.sourceforge.net>
parents:
3973
diff
changeset
|
100 |
|
4449
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
101 def lookup(self, classname, key): |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
102 cl = self.db.getclass(classname) |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
103 uid = self.db.getuid() |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
104 prop = cl.getkey() |
|
4670
c9b85ca1f985
Fix xmlrpc permissions for lookup method.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4449
diff
changeset
|
105 search = self.db.security.hasSearchPermission |
|
c9b85ca1f985
Fix xmlrpc permissions for lookup method.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4449
diff
changeset
|
106 access = self.db.security.hasPermission |
|
c9b85ca1f985
Fix xmlrpc permissions for lookup method.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4449
diff
changeset
|
107 if (not search(uid, classname, prop) |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
108 and not access('View', uid, classname, prop)): |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
109 raise Unauthorised('Permission to lookup %s denied' % classname) |
|
4449
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
110 return cl.lookup(key) |
|
3f251efd5f48
Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4437
diff
changeset
|
111 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
112 def display(self, designator, *properties): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
113 classname, itemid = hyperdb.splitDesignator(designator) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
114 cl = self.db.getclass(classname) |
|
5395
23b8e6067f7c
Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5381
diff
changeset
|
115 props = properties and list(properties) or list(cl.properties.keys()) |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
116 props.sort() |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
117 for p in props: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
118 if not self.db.security.hasPermission('View', self.db.getuid(), |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
119 classname, p, itemid): |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
120 raise Unauthorised('Permission to view %s of %s denied' % |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
121 (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
|
122 result = [(prop, cl.get(itemid, prop)) for prop in props] |
| 3839 | 123 return dict(result) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
124 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
125 def create(self, classname, *args): |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
126 if not self.db.security.hasPermission('Create', self.db.getuid(), |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
127 classname): |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
128 raise Unauthorised('Permission to create %s denied' % classname) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
129 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
130 cl = self.db.getclass(classname) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
131 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
132 # convert types |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
133 props = props_from_args(self.db, cl, args) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
134 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
135 # check for the key property |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
136 key = cl.getkey() |
|
5381
0942fe89e82e
Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
137 if key and key not in props: |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
138 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
|
139 |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
140 for key in props: |
|
4311
7291130fad82
- fix create permission for xmlrpc, too
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4256
diff
changeset
|
141 if not self.db.security.hasPermission('Create', self.db.getuid(), |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
142 classname, property=key): |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
143 raise Unauthorised('Permission to create %s.%s denied' % |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
144 (classname, key)) |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
145 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
146 # do the actual create |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
147 try: |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
148 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
|
149 self.db.commit() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5072
diff
changeset
|
150 except (TypeError, IndexError, ValueError) as message: |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
151 # The exception we get may be a real error, log the traceback |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
152 # if we're debugging |
|
5326
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
153 logger = logging.getLogger('roundup.xmlrpc') |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
154 for l in format_exc().split('\n'): |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
155 logger.debug(l) |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
156 raise UsageError(message) |
| 3839 | 157 return result |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
158 |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
159 def set(self, designator, *args): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
160 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
161 classname, itemid = hyperdb.splitDesignator(designator) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
162 cl = self.db.getclass(classname) |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
163 props = props_from_args(self.db, cl, args, itemid) # convert types |
|
5395
23b8e6067f7c
Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5381
diff
changeset
|
164 for p in props.keys(): |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
165 if not self.db.security.hasPermission('Edit', self.db.getuid(), |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
166 classname, p, itemid): |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
167 raise Unauthorised('Permission to edit %s of %s denied' % |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
168 (p, designator)) |
|
3828
ba6ba8d6bcc1
Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff
changeset
|
169 try: |
|
4224
3f6cadb98c2f
Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents:
4140
diff
changeset
|
170 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
|
171 self.db.commit() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5072
diff
changeset
|
172 except (TypeError, IndexError, ValueError) as message: |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
173 # The exception we get may be a real error, log the |
|
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
174 # traceback if we're debugging |
|
5326
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
175 logger = logging.getLogger('roundup.xmlrpc') |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
176 for l in format_exc().split('\n'): |
|
db8659c4e8eb
xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5248
diff
changeset
|
177 logger.debug(l) |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
178 raise UsageError(message) |
|
4224
3f6cadb98c2f
Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents:
4140
diff
changeset
|
179 return result |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
180 |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
181 builtin_actions = dict(retire=actions.Retire, restore=actions.Restore) |
| 4083 | 182 |
| 183 def action(self, name, *args): | |
|
4124
0ad79301f055
Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
4083
diff
changeset
|
184 """Execute a named action.""" |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
185 |
| 4083 | 186 if name in self.actions: |
| 187 action_type = self.actions[name] | |
| 188 elif name in self.builtin_actions: | |
| 189 action_type = self.builtin_actions[name] | |
| 190 else: | |
| 5604 | 191 raise Exception('action "%s" is not supported %s' |
|
6015
af1067e0f6d9
flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents:
5604
diff
changeset
|
192 % (name, ','.join(self.actions.keys()))) |
| 4083 | 193 action = action_type(self.db, self.translator) |
| 194 return action.execute(*args) | |
| 195 | |
| 196 | |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
197 class RoundupDispatcher(SimpleXMLRPCDispatcher): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
198 """RoundupDispatcher bridges from cgi.client to RoundupInstance. |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
199 It expects user authentication to be done.""" |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
200 |
| 4083 | 201 def __init__(self, db, actions, translator, |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
202 allow_none=False, encoding=None): |
|
5012
6b7f257e5de8
Simplify SimpleXMLRPCDispatcher initialisation
John Kristensen <john@jerrykan.com>
parents:
4793
diff
changeset
|
203 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) |
| 4083 | 204 self.register_instance(RoundupInstance(db, actions, translator)) |
|
4793
d9e5539303bd
Implement XMLRPC MultiCall (including test), see
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4670
diff
changeset
|
205 self.register_multicall_functions() |
|
4079
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
206 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
207 def dispatch(self, input): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
208 return self._marshaled_dispatch(input) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
209 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
210 def _dispatch(self, method, params): |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
211 |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
212 retn = SimpleXMLRPCDispatcher._dispatch(self, method, params) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
213 retn = translate(retn) |
|
edf526c91412
* Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents:
3985
diff
changeset
|
214 return retn |
