Projet

Général

Profil

Bug #19106

crash sur autosave (token = None)

Ajouté par Thomas Noël il y a plus de 6 ans. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
29 septembre 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

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/wcs.ville.fr/form_tokens'
     path = '/var/lib/wcs/wcs.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 7f45204bdf50: 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 7f45204bdf50: 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 0x7f452e1b09b0>
     self = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110>

  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 0x7f452052c110>
     obj = <bound method AlternateFormPage.autosave of <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110>>
     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 = 'copie-d-acte-de-naissance'
     self = <auquotidien.modules.root.FormsRootDirectory object at 0x7f452052c510>
     obj = <auquotidien.modules.formpage.AlternateFormPage object at 0x7f452052c110>
     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 = ['copie-d-acte-de-naissance', 'autosave']
     self = <auquotidien.modules.root.FormsRootDirectory object at 0x7f452052c510>

  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 = 'etat-civil'
     self = <auquotidien.modules.root.AlternateRootDirectory object at 0x7f4523516610>
     obj = <auquotidien.modules.root.FormsRootDirectory object at 0x7f452052c510>
     name = None
     path = ['copie-d-acte-de-naissance', '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 = ['etat-civil', 'copie-d-acte-de-naissance', 'autosave']
     self = <auquotidien.modules.root.AlternateRootDirectory object at 0x7f4523516610>
     response = <wcs.qommon.http_response.HTTPResponse instance at 0x7f4520101638>

  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 = '/etat-civil/copie-d-acte-de-naissance/autosave'
     self = <wcs.compat.CompatWcsPublisher object at 0x7f45235165d0>
     request = <wcs.compat.CompatHTTPRequest instance at 0x7f4520101f38>
     components = ['etat-civil', 'copie-d-acte-de-naissance', '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 0x7f45235165d0>
     request = <wcs.compat.CompatHTTPRequest instance at 0x7f4520101f38>
     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: POST '/etat-civil/copie-d-acte-de-naissance/autosave'>
     pub = <wcs.compat.CompatWcsPublisher object at 0x7f45235165d0>

  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 0x7f4523542a90>>
     self = <django.core.handlers.wsgi.WSGIHandler object at 0x7f4526611c50>
     request = <WSGIRequest: POST '/etat-civil/copie-d-acte-de-naissance/autosave'>
     callback = <function quixote at 0x7f4524acb410>
     wrapped_callback = <function quixote at 0x7f4524acb410>
     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 = {...}
     self = <django.core.handlers.wsgi.WSGIHandler object at 0x7f4526611c50>
     request = <WSGIRequest: POST '/etat-civil/copie-d-acte-de-naissance/autosave'>

Cookies:
wcs-5b70c2      '366c842009d9af6b'

Environment:
CONTENT_LENGTH  '0'
HTTP_ACCEPT     '*/*'
HTTP_ACCEPT_ENCODING 'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3'
HTTP_CONNECTION 'close'
HTTP_COOKIE     'wcs-5b70c2="xxxxx"'
HTTP_HOST       'wcs.ville.fr'
HTTP_REFERER    'https://wcs.ville.fr/etat-civil/copie-d-acte-de-naissance/'
HTTP_X_FORWARDED_PROTO 'https'
HTTP_X_FORWARDED_PROTOCOL 'ssl'
HTTP_X_FORWARDED_SSL 'on'
HTTP_X_REQUESTED_WITH 'XMLHttpRequest'
PATH_INFO       '/etat-civil/copie-d-acte-de-naissance/autosave'
QUERY_STRING    ''
REQUEST_METHOD  'POST'
REQUEST_URI     '/etat-civil/copie-d-acte-de-naissance/autosave'
SCRIPT_NAME     ''
SERVER_NAME     'auquo'
SERVER_PORT     '80'
SERVER_PROTOCOL 'HTTP/1.0'

Demandes liées

Duplique w.c.s. - Bug #19892: crash dans has_form_token parce que token vide, lors d'un autosaveFermé06 novembre 2017

Actions

Historique

#1

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

Trace jamais vue selon moi...

Donc « get_request().form.get('_ajax_form_token') » n'existe pas sur la requête, et à partir de là, boum. Je n'arrive pas à savoir si cette absence du champ caché _ajax_form_token est normale.

#2

Mis à jour par Frédéric Péters il y a plus d'un an

  • Statut changé de Nouveau à Fermé
  • Planning mis à Non

Même trace, et corrigée, dans #19892.

#3

Mis à jour par Frédéric Péters il y a plus d'un an

  • Duplique Bug #19892: crash dans has_form_token parce que token vide, lors d'un autosave ajouté

Formats disponibles : Atom PDF