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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
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
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
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
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
182
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
186 if name in self.actions:
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
187 action_type = self.actions[name]
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
188 elif name in self.builtin_actions:
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
189 action_type = self.builtin_actions[name]
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
190 else:
5604
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5504
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
193 action = action_type(self.db, self.translator)
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
194 return action.execute(*args)
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
195
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
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

Roundup Issue Tracker: http://roundup-tracker.org/