Bug #19892
crash dans has_form_token parce que token vide, lors d'un autosave
Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
06 novembre 2017
Echéance:
% réalisé:
0%
Temps estimé:
Patch proposed:
Oui
Planning:
Description
Première fois que je vois cette trace :
Exception: type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'startswith'' Stack trace (most recent call first): File "/usr/lib/python2.7/posixpath.py", line 75, in join 73 path = a 74 for b in p: > 75 if b.startswith('/'): 76 path = b 77 elif path == '' or path.endswith('/'): locals: a = '/var/lib/wcs/eservices.ville.fr/form_tokens' path = '/var/lib/wcs/eservices.ville.fr/form_tokens' b = None p = (None,) File "/usr/lib/python2.7/dist-packages/wcs/qommon/sessions.py", line 134, in get_form_token_filepath 132 133 def get_form_token_filepath(self, token): > 134 return os.path.join(get_publisher().form_tokens_dir, token) 135 136 def create_form_token(self): locals: token = None self = <BasicSession at 7f7beb1fbc50: None> File "/usr/lib/python2.7/dist-packages/wcs/qommon/sessions.py", line 143, in has_form_token 141 def has_form_token(self, token): 142 has_form_token = super(Session, self).has_form_token(token) > 143 if not os.path.exists(self.get_form_token_filepath(token)): 144 has_form_token = False 145 return has_form_token locals: has_form_token = False token = None self = <BasicSession at 7f7beb1fbc50: None> File "/usr/lib/python2.7/dist-packages/wcs/forms/root.py", line 915, in autosave 913 return json.dumps({'result': 'error', 'reason': reason}) 914 > 915 if not get_session().has_form_token(get_request().form.get('_ajax_form_token')): 916 return result_error('obsolete ajax form token') 917 locals: result_error = <function result_error at 0x7f7beb75a8c0> self = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f7beb6f3990> File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 67, in _q_traverse 65 raise TraversalError 66 elif hasattr(obj, '__call__'): > 67 return obj() 68 else: 69 return obj locals: component = 'autosave' self = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f7beb6f3990> obj = <bound method AlternateFormPage.autosave of <auquotidien.modules.formpage.AlternateFormPage object at 0x7f7beb6f3990>> name = 'autosave' path = [] File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 63, in _q_traverse 61 if path: 62 if hasattr(obj, '_q_traverse'): > 63 return obj._q_traverse(path) 64 else: 65 raise TraversalError locals: component = 'rdv' self = <auquotidien.modules.root.FormsRootDirectory object at 0x7f7beba76150> obj = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f7beb6f3990> name = None path = ['autosave'] File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 91, in _q_traverse 89 def _q_traverse(self, path): 90 self._q_access() > 91 return super(AccessControlled, self)._q_traverse(path) 92 93 locals: path = ['rdv', 'autosave'] self = <auquotidien.modules.root.FormsRootDirectory object at 0x7f7beba76150> File "/usr/lib/pymodules/python2.7/quixote/directory.py", line 63, in _q_traverse 61 if path: 62 if hasattr(obj, '_q_traverse'): > 63 return obj._q_traverse(path) 64 else: 65 raise TraversalError locals: component = 'passeports-et-cartes-d-identite' self = <auquotidien.modules.root.AlternateRootDirectory object at 0x7f7beeef3dd0> obj = <auquotidien.modules.root.FormsRootDirectory object at 0x7f7beba76150> name = None path = ['rdv', 'autosave'] File "/usr/lib/python2.7/dist-packages/auquotidien/modules/root.py", line 847, in _q_traverse 845 return redirect('%s%s/%s' % (base_url, f.category.url_name, uri_rest)) 846 > 847 raise e 848 849 locals: path = ['passeports-et-cartes-d-identite', 'rdv', 'autosave'] self = <auquotidien.modules.root.AlternateRootDirectory object at 0x7f7beeef3dd0> response = <wcs.qommon.http_response.HTTPResponse instance at 0x7f7bebe7e098> File "/usr/lib/pymodules/python2.7/quixote/publish.py", line 253, in try_publish 251 permanent=True) 252 components = path[1:].split('/') > 253 output = self.root_directory._q_traverse(components) 254 # The callable ran OK, commit any changes to the session 255 self.finish_successful_request() locals: path = '/passeports-et-cartes-d-identite/rdv/autosave' self = <wcs.compat.CompatWcsPublisher object at 0x7f7beeef3e10> request = <wcs.compat.CompatHTTPRequest instance at 0x7f7bebe7ed88> components = ['passeports-et-cartes-d-identite', 'rdv', 'autosave'] File "/usr/lib/python2.7/dist-packages/wcs/compat.py", line 184, in process_request 182 output = self.finish_interrupted_request(exc) 183 except Exception, exc: > 184 output = self.finish_failed_request() 185 response = request.response 186 locals: self = <wcs.compat.CompatWcsPublisher object at 0x7f7beeef3e10> request = <wcs.compat.CompatHTTPRequest instance at 0x7f7bebe7ed88> exc = AttributeError("'NoneType' object has no attribute 'startswith'",) File "/usr/lib/python2.7/dist-packages/wcs/compat.py", line 216, in quixote 214 def quixote(request): 215 pub = get_publisher() > 216 return pub.process_request(pub.get_request()) 217 218 locals: request = <WSGIRequest: GET '/passeports-et-cartes-d-identite/rdv/autosave'> pub = <wcs.compat.CompatWcsPublisher object at 0x7f7beeef3e10> File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 132, in get_response 130 wrapped_callback = self.make_view_atomic(callback) 131 try: > 132 response = wrapped_callback(request, *callback_args, **callback_kwargs) 133 except Exception as e: 134 # If the view raised an exception, run it through exception locals: callback_args = () resolver_match = ResolverMatch(func=wcs.compat.quixote, args=(), kwargs={}, url_name=quixote, app_name=None, namespaces=[]) middleware_method = <bound method PublisherInitialisationMiddleware.process_request of <wcs.middleware.PublisherInitialisationMiddleware object at 0x7f7beeebd590>> self = <django.core.handlers.wsgi.WSGIHandler object at 0x7f7bf5fd2ed0> request = <WSGIRequest: GET '/passeports-et-cartes-d-identite/rdv/autosave'> callback = <function quixote at 0x7f7bf03d5de8> wrapped_callback = <function quixote at 0x7f7bf03d5de8> resolver = <RegexURLResolver 'wcs.urls' (None:None) ^/> callback_kwargs = {} response = None urlconf = 'wcs.urls' File "/usr/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 189, in __call__ 187 response = http.HttpResponseBadRequest() 188 else: > 189 response = self.get_response(request) 190 191 response._handler_class = self.__class__ locals: start_response = <built-in function uwsgi_spit> environ = {'SERVER_PROTOCOL': 'HTTP/1.0', 'uwsgi.version': '2.0.7-debian', 'SCRIPT_NAME': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/passeports-et-cartes-d-identite/rdv/autosave', 'HTTP_X_FORWARDED_SSL': 'on', 'QUERY_STRING': '', 'HTTP_X_REAL_IP': '1.2.3.4', 'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50728)', 'HTTP_CONNECTION': 'close', 'SERVER_NAME': 'auquo', 'REMOTE_ADDR': '1.2.3.4', 'HTTP_X_FORWARDED_PROTOCOL': 'ssl', 'wsgi.url_scheme': 'https', 'SERVER_PORT': '80', 'uwsgi.node': 'auquo', 'HTTP_X_FORWARDED_PROTO': 'https', 'wsgi.input': <uwsgi._Input object at 0x7f7bebfc18e8>, 'HTTP_HOST': 'eservices.ville.fr', 'wsgi.multithread': False, 'REQUEST_URI': '/passeports-et-cartes-d-identite/rdv/autosave', 'HTTP_ACCEPT': '*/*', 'wsgi.version': (1, 0), 'HTTP_X_FORWARDED_FOR': '1.2.3.4', 'wsgi.errors': <open file 'wsgi_errors', mode 'w' at 0x7f7bf03d2f60>, 'wsgi.multiprocess': True, 'wsgi.run_once': False, 'wsgi.file_wrapper': <built-in function uwsgi_sendfile>} self = <django.core.handlers.wsgi.WSGIHandler object at 0x7f7bf5fd2ed0> request = <WSGIRequest: GET '/passeports-et-cartes-d-identite/rdv/autosave'> Cookies: Environment: HTTP_ACCEPT '*/*' HTTP_CONNECTION 'close' HTTP_HOST 'eservices.ville.fr' HTTP_USER_AGENT 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50728)' HTTP_X_FORWARDED_FOR '1.2.3.4' HTTP_X_FORWARDED_PROTO 'https' HTTP_X_FORWARDED_PROTOCOL 'ssl' HTTP_X_FORWARDED_SSL 'on' HTTP_X_REAL_IP '1.2.3.4' PATH_INFO '/passeports-et-cartes-d-identite/rdv/autosave' QUERY_STRING '' REMOTE_ADDR '1.2.3.4' REQUEST_METHOD 'GET' REQUEST_URI '/passeports-et-cartes-d-identite/rdv/autosave' SCRIPT_NAME '' SERVER_NAME 'auquo' SERVER_PORT '80' SERVER_PROTOCOL 'HTTP/1.0' uwsgi.node 'auquo' uwsgi.version '2.0.7-debian' wsgi.errors <open file 'wsgi_errors', mode 'w' at 0x7f7bf03d2f60> wsgi.file_wrapper <built-in function uwsgi_sendfile> wsgi.input <uwsgi._Input object at 0x7f7bebfc18e8> wsgi.multiprocess True wsgi.multithread False wsgi.run_once False wsgi.url_scheme 'https' wsgi.version (1, 0)
En première lecture, difficile de comprendre la raison d'un get_request().form.get('_ajax_form_token')
inexistant lors d'un autosave.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a plus de 6 ans
HTTP_USER_AGENT 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50728)'
Fait sans doute n'importe quoi. (donc on peut assurer qu'on ne plante pas mais ça ne va pas faire marcher le navigo).
Mis à jour par Thomas Noël il y a plus de 6 ans
- Fichier 0001-forms-don-t-crash-on-autosave-if-token-is-absent-198.patch 0001-forms-don-t-crash-on-autosave-if-token-is-absent-198.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Ouaip, ie6... bon, comme c'était assez facile, au cas où, voilà un patch pour éviter un crash ; mais on peut attendre aussi d'en voir d'autres.
Mis à jour par Thomas Noël il y a plus de 6 ans
- Statut changé de En cours à Résolu (à déployer)
commit ab5d1554e62631751e37b199cb073d9b26fe797f Author: Thomas NOEL <tnoel@entrouvert.com> Date: Mon Nov 6 13:30:25 2017 +0100 forms: don't crash on autosave if token is absent (#19892)
Mis à jour par Frédéric Péters il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Frédéric Péters il y a plus d'un an
- Dupliqué par Bug #19106: crash sur autosave (token = None) ajouté
forms: don't crash on autosave if token is absent (#19892)