Set a default for maxint that matches what xmlrpclib can handle. Also
handle marshalling errors from xmlrpclib so users don't get a backtrace.
This was discovered by a typo in a dns serial number which exceeded 4
bytes. To test try something like:
$ ipa dnszone-add --name-server=192.168.122.214
--admin-email=t...@example.com --serial=20100101010 --refresh=300
--retry=300 --expire=1200000 --minimum=3000 --maximum=9200 --ttl=100 newzone
ticket 770
rob
>From 87f53c60c0962dd9848a83c36b636f77cb7cfd9e Mon Sep 17 00:00:00 2001
From: Rob Crittenden <rcrit...@redhat.com>
Date: Mon, 17 Jan 2011 16:23:53 -0500
Subject: [PATCH] Set the default Int maxvalue to the maximum XML-RPC can handle.
Also handle marshalling errors thrown by xmlrpclib more gracefully.
ticket 770
---
ipalib/errors.py | 14 ++++++++++++++
ipalib/parameters.py | 3 ++-
ipalib/rpc.py | 4 +++-
3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/ipalib/errors.py b/ipalib/errors.py
index fd23d99..1d491fa 100644
--- a/ipalib/errors.py
+++ b/ipalib/errors.py
@@ -420,6 +420,20 @@ class JSONError(PublicError):
format = _('Invalid JSON-RPC request: %(error)s')
+class XMLRPCMarshallError(PublicError):
+ """
+ **910** Raised when the XML-RPC lib cannot marshall the request
+
+ For example:
+
+ >>> raise XMLRPCMarshallError(error='int exceeds XML-RPC limits')
+ Traceback (most recent call last):
+ ...
+ XMLRPCMarshallError: error marshalling data for XML-RPC transport: int exceeds XML-RPC limits
+ """
+
+ errno = 910
+ format = _('error marshalling data for XML-RPC transport: %(error)s')
##############################################################################
# 1000 - 1999: Authentication errors
diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index 78eacde..0d6c690 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -109,6 +109,7 @@ from errors import PasswordMismatch
from constants import NULLS, TYPE_ERROR, CALLABLE_ERROR
from text import Gettext, FixMe
import csv
+from xmlrpclib import MAXINT
class DefaultFrom(ReadOnly):
@@ -1002,7 +1003,7 @@ class Int(Number):
kwargs = Param.kwargs + (
('minvalue', int, None),
- ('maxvalue', int, None),
+ ('maxvalue', int, int(MAXINT)),
)
def __init__(self, name, *rules, **kw):
diff --git a/ipalib/rpc.py b/ipalib/rpc.py
index dd85076..3457640 100644
--- a/ipalib/rpc.py
+++ b/ipalib/rpc.py
@@ -38,7 +38,7 @@ import errno
from xmlrpclib import Binary, Fault, dumps, loads, ServerProxy, Transport, ProtocolError
import kerberos
from ipalib.backend import Connectible
-from ipalib.errors import public_errors, PublicError, UnknownError, NetworkError, KerberosError
+from ipalib.errors import public_errors, PublicError, UnknownError, NetworkError, KerberosError, XMLRPCMarshallError
from ipalib import errors
from ipalib.request import context
from ipapython import ipautil, dnsclient
@@ -373,3 +373,5 @@ class xmlclient(Connectible):
raise NetworkError(uri=server, error=e.errmsg)
except socket.error, e:
raise NetworkError(uri=server, error=str(e))
+ except (OverflowError, TypeError), e:
+ raise XMLRPCMarshallError(error=str(e))
--
1.7.3.4
_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel