Projet

Général

Profil

Bug #19892

crash dans has_form_token parce que token vide, lors d'un autosave

Ajouté par Thomas Noël il y a plus de 6 ans. Mis à jour il y a plus de 5 ans.

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

Dupliqué par w.c.s. - Bug #19106: crash sur autosave (token = None)Fermé29 septembre 2017

Actions

Révisions associées

Révision ab5d1554 (diff)
Ajouté par Thomas Noël il y a plus de 6 ans

forms: don't crash on autosave if token is absent (#19892)

Historique

#1

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).

#2

Mis à jour par Thomas Noël il y a plus de 6 ans

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.

#3

Mis à jour par Frédéric Péters il y a plus de 6 ans

Ok.

#4

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)

#5

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
#6

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é

Formats disponibles : Atom PDF