Priority | medium |
---|---|
Bug ID | 57214 |
CC | syncevolution-issues@syncevolution.org |
Assignee | syncevolution-issues@syncevolution.org |
Summary | SyncEvolution blocks when the server misbehaves |
Severity | minor |
Classification | Unclassified |
OS | All |
Reporter | fdo-bugs@cryptobitch.de |
Hardware | Other |
Status | NEW |
Version | 1.3 |
Component | SyncEvolution |
Product | SyncEvolution |
I just realised, while debugging my auth problems from bug 56240 that SyncEvolution can't be interrupted if the server misbehaves. I my case, I tried to set up a simple digest auth server like so: 1) pip install -E /tmp/cyclone -e git+https://github.com/fiorix/cyclone.git/#egg=cyclone 2) apply the following diff, i.e. cd /tmp/cyclone/src/cyclone/; patch -p1 <<EOF diff --git a/demos/digest_auth/authdemo.py b/demos/digest_auth/authdemo.py index 020e6ef..e89561a 100755 --- a/demos/digest_auth/authdemo.py +++ b/demos/digest_auth/authdemo.py @@ -31,7 +31,7 @@ from twisted.internet import reactor class Application(cyclone.web.Application): def __init__(self): handlers = [ - (r"/", MainHandler), + (r".*$", MainHandler), ] settings = dict( cookie_secret="32oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=", @@ -40,8 +40,9 @@ class Application(cyclone.web.Application): ) cyclone.web.Application.__init__(self, handlers, **settings) - class MainHandler(digest.DigestAuthMixin, cyclone.web.RequestHandler): + SUPPORTED_METHODS = cyclone.web.RequestHandler.SUPPORTED_METHODS + ('PROPFIND',) + def passwordz(username): creds = { 'auth_username': 'test', EOF 3) run the authdemo.py: /tmp/cyclone/bin/python /tmp/cyclone/src/cyclone/demos/digest_auth/authdemo.py 4) Have the setup routine from bug 56263 comment #0 run with URL="http://localhost:8888/foo/bar" 5) then run syncevolution --daemon=no target-config@radicale cards1 The server should crash like this: $ ./authdemo.py 2012-11-17 02:20:22+0100 [-] Log opened. 2012-11-17 02:20:22+0100 [-] Application starting on 8889 2012-11-17 02:20:22+0100 [-] Starting factory <__main__.Application instance at 0x1464b90> 2012-11-17 02:20:23+0100 [HTTPConnection,0,127.0.0.1] 401 GET /foo/bar/cardss (127.0.0.1) 0.78ms 2012-11-17 02:20:25+0100 [HTTPConnection,1,127.0.0.1] 401 GET /foo/bar/c (127.0.0.1) 0.38ms 2012-11-17 02:20:28+0100 [HTTPConnection,2,127.0.0.1] Unhandled error in Deferred: 2012-11-17 02:20:28+0100 [HTTPConnection,2,127.0.0.1] Unhandled Error Traceback (most recent call last): File "/tmp/cyclone2/src/cyclone/cyclone/httpserver.py", line 185, in _on_request_body self.request_callback(self._request) File "/tmp/cyclone2/src/cyclone/cyclone/web.py", line 1358, in __call__ handler._execute(transforms, *args, **kwargs) File "/tmp/cyclone2/src/cyclone/cyclone/web.py", line 958, in _execute callbackArgs=(args, kwargs)) File "/tmp/cyclone2/lib/python2.7/site-packages/twisted/internet/defer.py", line 290, in addCallbacks self._runCallbacks() --- <exception caught here> --- File "/tmp/cyclone2/lib/python2.7/site-packages/twisted/internet/defer.py", line 551, in _runCallbacks current.result = callback(current.result, *args, **kw) File "/tmp/cyclone2/src/cyclone/cyclone/web.py", line 967, in _execute_handler function = getattr(self, self.request.method.lower()) exceptions.AttributeError: 'MainHandler' object has no attribute 'propfind' And syncevolution blocks, i.e. SIGINT (Ctrl+C) doesn't help it to exit. I would have expected to be able to press Ctrl+C to make it return at some stage. (gdb) bt #0 0x000000396d0e8b84 in __GI___poll (fds=0x7fffffffa1d0, nfds=1, timeout=300000) at ../sysdeps/unix/sysv/linux/poll.c:83 #1 0x00007ffff5f8ce2f in ?? () from /lib64/libneon.so.27 #2 0x00007ffff5f8d0df in ?? () from /lib64/libneon.so.27 #3 0x00007ffff5f8d26b in ?? () from /lib64/libneon.so.27 #4 0x00007ffff5f8dc54 in ne_sock_readline () from /lib64/libneon.so.27 #5 0x00007ffff5f8650f in ?? () from /lib64/libneon.so.27 #6 0x00007ffff5f86c15 in ne_begin_request () from /lib64/libneon.so.27 #7 0x00007ffff5f8630d in ne_request_dispatch () from /lib64/libneon.so.27 #8 0x00007ffff5f949ed in ?? () from /lib64/libneon.so.27 #9 0x00007ffff624e194 in SyncEvo::Neon::Session::propfindURI(std::string const&, int, ne_propname const*, boost::function<void (SyncEvo::Neon::URI const&, ne_prop_result_set_s const*)> const&, SyncEvo::Timespec const&) (this=0x6e2bd0, path="/foo/barmuelli/cards/", depth=1, props= 0x7ffff64b1ec0, callback=..., deadline=...) at src/backends/webdav/NeonCXX.cpp:422 Python Exception <type 'exceptions.IndexError'> list index out of range: #10 0x00007ffff62316fc in SyncEvo::WebDAVSource::listAllItems (this=0x6d9c20, revisions= std::map with 0 elements) at src/backends/webdav/WebDAVSource.cpp:1305 #11 0x00007ffff623e2d5 in SyncEvo::WebDAVSource::isEmpty (this=0x6d9c20) at src/backends/webdav/WebDAVSource.cpp:1138 #12 0x00000038b58d17f8 in boost::function0<bool>::operator() (this=<optimized out>) at /usr/include/boost/function/function_template.hpp:760 #13 0x00000038b58bfeb1 in SyncEvo::SyncContext::getConfigXML (this=0x6900e0, xml= "<?xml version=\"1.0\"?>\n<!-- SYNTHESIS SYNCML CLIENT Version 3.2 Configuration file -->\n\n<sysync_config version=\"1.0\">\n\n <configvar name=\"logpath\" value=\"$(defout_path)\"/>\n\n <!-- this string is output"..., configname=...) at src/syncevo/SyncContext.cpp:2527 #14 0x00000038b58bb8a9 in SyncEvo::SyncContext::initEngine (this=this@entry=0x6900e0, logXML=logXML@entry=true) at src/syncevo/SyncContext.cpp:2796 ---Type <return> to continue, or q <return> to quit--- FTR: Cyclone is not capable of doing digest auth in a manner that is reliably testable (cf. https://github.com/fiorix/cyclone/issues/72), so don't bother looking into that as lightweight, fire and forget solution