Sorry, I made a mistake. Where I say: passwordAux = db.auth_user.password.validate(password) if passwordAux[1] *!=* None ...insert(..., password=password[0])
I should say: passwordAux = db.auth_user.password.validate(password) if passwordAux[1] *==* None ...insert(..., password=password[0]) El lunes, 24 de diciembre de 2012 10:42:13 UTC+1, Wonton escribió: > > Hello, Massimo gave me some clues and I think I've found the solution: > > I was debugging my code and saw that this line: > db.auth_user.password.validate(password) > returns a 2-tupla: (crypter password, error) > > In my code (and in all examples I've seen through Internet), this 2-tuple > is stored in the database. So what you see in the database is: > > |pbkdf2(1000,20,sha512)$90718911d716ab40$9ab041ebf5432bb9432cef16165865d320123e0a|None| > The password and the error are stored in the same field. > Everything is ok, but I am storing the wrong thing. So when I try to log > in, the password field is not a password but a 2-tuple, it's strange to > web2py and it crashes. > > What I've done is: > passwordAux = db.auth_user.password.validate(password) > if passwordAux[1] != None > ...insert(..., password=password[0]) > And now, this is working. Now, what is stored in the databse is the > password only: > > pbkdf2(1000,20,sha512)$90718911d716ab40$9ab041ebf5432bb9432cef16165865d320123e0a > and the log in works perfectly. > > Kind regards! > > El jueves, 20 de diciembre de 2012 20:10:41 UTC+1, Wonton escribió: >> >> If you don't mind I could send you my project to your email directly. >> >> El jueves, 20 de diciembre de 2012 16:14:12 UTC+1, Massimo Di Pierro >> escribió: >>> >>> If your data is not confidential, any chance you send me your >>> application? >>> >>> To me this looks like corrupted data in database as if the password >>> field was at some pointed treated as type='list:string' and than changed >>> back to type='password'. Is it possible? >>> >>> Massimo >>> >>> On Wednesday, 19 December 2012 11:28:15 UTC-6, Wonton wrote: >>>> >>>> Yes, of course. This is my ticket: >>>> >>>> Error ticket for "dianaappv1" Ticket ID >>>> >>>> 127.0.0.1.2012-12-19.18-24-12.5d2b292c-7e9a-4281-a9f7-bb9aa17bbd0c >>>> <type 'exceptions.ValueError'> unsupported hash type >>>> |pbkdf2(1000,20,sha512) Versión web2py™ (2, 2, 1, >>>> datetime.datetime(2012, 10, 21, 16, 57, 4), 'stable') Python Python >>>> 2.7.1: /usr/bin/python Traceback >>>> >>>> 1. >>>> 2. >>>> 3. >>>> 4. >>>> 5. >>>> 6. >>>> 7. >>>> 8. >>>> 9. >>>> 10. >>>> 11. >>>> 12. >>>> 13. >>>> 14. >>>> 15. >>>> 16. >>>> 17. >>>> 18. >>>> 19. >>>> 20. >>>> 21. >>>> 22. >>>> 23. >>>> 24. >>>> 25. >>>> 26. >>>> 27. >>>> 28. >>>> >>>> Traceback (most recent call last): >>>> File "/Applications/web2py/gluon/restricted.py", line 212, in restricted >>>> exec ccode in environment >>>> File >>>> "/Applications/web2py/applications/dianaappv1/controllers/default.py" >>>> <https://127.0.0.1:8000/admin/default/edit/dianaappv1/controllers/default.py>, >>>> line 101, in <module> >>>> File "/Applications/web2py/gluon/globals.py", line 188, in <lambda> >>>> self._caller = lambda f: f() >>>> File >>>> "/Applications/web2py/applications/dianaappv1/controllers/default.py" >>>> <https://127.0.0.1:8000/admin/default/edit/dianaappv1/controllers/default.py>, >>>> line 27, in public_call >>>> return servicios_publicos() >>>> File "/Applications/web2py/gluon/tools.py", line 4387, in __call__ >>>> return self.serve_json(request.args[1:]) >>>> File "/Applications/web2py/gluon/tools.py", line 4197, in serve_json >>>> s = universal_caller(self.json_procedures[args[0]], *args[1:], **d) >>>> File "/Applications/web2py/gluon/tools.py", line 3889, in >>>> universal_caller >>>> return f(**arg_dict) >>>> File >>>> "/Applications/web2py/applications/dianaappv1/controllers/default.py" >>>> <https://127.0.0.1:8000/admin/default/edit/dianaappv1/controllers/default.py>, >>>> line 65, in login >>>> user = auth.login_bare(usuario, password) >>>> File "/Applications/web2py/gluon/tools.py", line 1789, in login_bare >>>> if not user.registration_key and password == user[passfield]: >>>> File "/Applications/web2py/gluon/validators.py", line 2636, in __eq__ >>>> h = simple_hash(self.password, key, salt, digest_alg) >>>> File "/Applications/web2py/gluon/utils.py", line 74, in simple_hash >>>> h = hashlib.new(digest_alg) >>>> File >>>> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", >>>> line 121, in __hash_new >>>> return __get_builtin_constructor(name)(string) >>>> File >>>> "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", >>>> line 88, in __get_builtin_constructor >>>> raise ValueError('unsupported hash type %s' % name) >>>> ValueError: unsupported hash type |pbkdf2(1000,20,sha512) >>>> >>>> Error snapshot [image: help] >>>> >>>> <type 'exceptions.ValueError'>(unsupported hash type >>>> |pbkdf2(1000,20,sha512)) >>>> >>>> inspect attributes >>>> Frames >>>> >>>> - >>>> >>>> *File /Applications/web2py/gluon/restricted.py in restricted at >>>> line 212* código argumentos variables >>>> - >>>> >>>> *File >>>> /Applications/web2py/applications/dianaappv1/controllers/default.py in >>>> <module> at line 101* código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/globals.py in <lambda> at line 188* >>>> código argumentos variables >>>> - >>>> >>>> *File >>>> /Applications/web2py/applications/dianaappv1/controllers/default.py in >>>> public_call at line 27* código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/tools.py in __call__ at line 4387* >>>> código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/tools.py in serve_json at line 4197 >>>> * código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/tools.py in universal_caller at >>>> line 3889* código argumentos variables >>>> - >>>> >>>> *File >>>> /Applications/web2py/applications/dianaappv1/controllers/default.py in >>>> login at line 65* código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/tools.py in login_bare at line 1789 >>>> * código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/validators.py in __eq__ at line >>>> 2636* código argumentos variables >>>> - >>>> >>>> *File /Applications/web2py/gluon/utils.py in simple_hash at line 74* >>>> código argumentos variables >>>> - >>>> >>>> *File >>>> >>>> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py >>>> >>>> in __hash_new at line 121* código argumentos variables >>>> - >>>> >>>> *File >>>> >>>> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py >>>> >>>> in __get_builtin_constructor at line 88* código argumentos variables >>>> Function argument list >>>> >>>> (name='|pbkdf2(1000,20,sha512)') >>>> Code listing >>>> >>>> 83. >>>> 84. >>>> 85. >>>> 86. >>>> 87. >>>> 88. >>>> >>>> 89. >>>> 90. >>>> 91. >>>> 92. >>>> >>>> if bs == '512': >>>> return _sha512.sha512 >>>> elif bs == '384': >>>> return _sha512.sha384 >>>> >>>> raise ValueError('unsupported hash type %s' % name) >>>> >>>> >>>> >>>> def __get_openssl_constructor(name): >>>> try: >>>> >>>> Variables name '|pbkdf2(1000,20,sha512)' builtinValueError <type >>>> 'exceptions.ValueError'> >>>> >>>> Context >>>> >>>> locals request session response >>>> In file: >>>> /Applications/web2py/applications/dianaappv1/controllers/default.py >>>> >>>> 1. >>>> 2. >>>> 3. >>>> 4. >>>> 5. >>>> 6. >>>> 7. >>>> 8. >>>> 9. >>>> 10. >>>> 11. >>>> 12. >>>> 13. >>>> 14. >>>> 15. >>>> 16. >>>> 17. >>>> 18. >>>> 19. >>>> 20. >>>> 21. >>>> 22. >>>> 23. >>>> 24. >>>> 25. >>>> 26. >>>> 27. >>>> 28. >>>> 29. >>>> 30. >>>> 31. >>>> 32. >>>> 33. >>>> 34. >>>> 35. >>>> 36. >>>> 37. >>>> 38. >>>> 39. >>>> 40. >>>> 41. >>>> 42. >>>> 43. >>>> 44. >>>> 45. >>>> 46. >>>> 47. >>>> 48. >>>> 49. >>>> 50. >>>> 51. >>>> 52. >>>> 53. >>>> 54. >>>> 55. >>>> 56. >>>> 57. >>>> 58. >>>> 59. >>>> 60. >>>> 61. >>>> 62. >>>> 63. >>>> 64. >>>> 65. >>>> 66. >>>> 67. >>>> 68. >>>> 69. >>>> 70. >>>> 71. >>>> 72. >>>> 73. >>>> 74. >>>> 75. >>>> 76. >>>> 77. >>>> 78. >>>> 79. >>>> 80. >>>> 81. >>>> 82. >>>> 83. >>>> 84. >>>> 85. >>>> 86. >>>> 87. >>>> 88. >>>> 89. >>>> 90. >>>> 91. >>>> 92. >>>> 93. >>>> 94. >>>> 95. >>>> 96. >>>> 97. >>>> 98. >>>> 99. >>>> 100. >>>> 101. >>>> 102. >>>> >>>> # -*- coding: utf-8 -*- >>>> # this file is released under public domain and you can use without >>>> limitations >>>> >>>> ######################################################################### >>>> ## This is a samples controller >>>> ## - index is the default action of any application >>>> ## - user is required for authentication and authorization >>>> ## - download is for downloading files uploaded in the db (does streaming) >>>> ## - call exposes all registered services (none by default) >>>> ######################################################################### >>>> servicios_publicos=Service() >>>> servicios_privados=Service() >>>> >>>> def random_password(): >>>> import string >>>> import random >>>> password = '' >>>> specials=r'!...@#$*?' >>>> for i in range(0,2): >>>> password += random.choice(string.lowercase) >>>> password += random.choice(string.uppercase) >>>> password += random.choice(string.digits) >>>> # password += random.choice(specials) >>>> return ''.join(random.sample(password,len(password))) >>>> >>>> def public_call(): >>>> return servicios_publicos() >>>> >>>> @auth.requires_login() >>>> def private_call(): >>>> return servicios_privados() >>>> >>>> @servicios_publicos.json >>>> def registra(usuario, email, password): >>>> respuesta = {} >>>> estado = 'OK' >>>> mensaje = '' >>>> tipoError = 0 >>>> #Comprueba si hay otro usuario con el mismo nombre >>>> if db(db.auth_user.username == usuario).count() != 0: >>>> estado = 'Error' >>>> tipoError = 1 >>>> #Comprueba si hay otro usuario con el mismo email >>>> if db(db.auth_user.email == email).count() != 0: >>>> estado = 'Error' >>>> tipoError = tipoError + 2 >>>> #Registrar >>>> if estado == 'OK': >>>> db.auth_user.insert(username=usuario, email=email, >>>> password=db.auth_user.password.validate(password)) >>>> mensaje = 'El registro se ha realizado correctamente.' >>>> else: >>>> if tipoError == 1: >>>> mensaje = 'El usuario ya existe.' >>>> elif tipoError == 2: >>>> mensaje = 'El email ya existe.' >>>> else: >>>> mensaje = 'El usuario y el email ya existen.' >>>> respuesta['estado'] = estado >>>> respuesta['mensaje'] = mensaje >>>> return respuesta >>>> >>>> @servicios_publicos.json >>>> def login(usuario, password): >>>> respuesta = {} >>>> user = auth.login_bare(usuario, password) >>>> if not user: >>>> respuesta['estado'] = 'Error' >>>> respuesta['mensaje'] = 'Nombre de usuario o contraseña incorrecta' >>>> else: >>>> respuesta['estado'] = 'OK' >>>> respuesta['mensaje'] = 'Login correcto' >>>> return respuesta >>>> >>>> @servicios_publicos.json >>>> def recupera_contrasenya(usuario): >>>> nueva_contrasenya = random_password() >>>> respuesta = {} >>>> fila = db(db.auth_user.username == usuario) >>>> if fila.count() == 0: >>>> respuesta['estado'] = 'Error' >>>> respuesta['mensaje'] = 'No existe el usuario' >>>> else: >>>> >>>> fila.update(password=db.auth_user.password.validate(nueva_contrasenya)) >>>> datosFila = fila.select() >>>> destino = datosFila[0].email >>>> enviado = mail.send(to=[destino], >>>> subject='Recuperación de contraseña', >>>> message='Se te ha creado una nueva contraseña. Es esta ' + >>>> nueva_contrasenya) >>>> if enviado: >>>> respuesta['estado'] = 'OK' >>>> respuesta['mensaje'] = 'Se ha enviado la contraseña a su >>>> correo electrónico.' >>>> else: >>>> respuesta['estado'] = 'Error' >>>> respuesta['mensaje'] = 'La contraseña no se ha podido enviar, >>>> reinténtelo más tarde' >>>> return respuesta >>>> >>>> #@servicios_privados.json >>>> #def metodo_privado(): >>>> # return 'private' >>>> >>>> response >>>> <https://127.0.0.1:8000/examples/global/vars/response>._vars=response >>>> <https://127.0.0.1:8000/examples/global/vars/response>._caller(public_call) >>>> >>>> >>>> >>>> El miércoles, 19 de diciembre de 2012 18:09:25 UTC+1, Massimo Di Pierro >>>> escribió: >>>>> >>>>> Can you please show me the complete traceback? >>>>> I cannot reproduce this and I this error is not generated from a >>>>> web2py function. >>>>> >>>>> On Tuesday, 18 December 2012 11:11:51 UTC-6, Massimo Di Pierro wrote: >>>>>> >>>>>> Can I see you models? Are you changing the validator for >>>>>> db.auth_user.password? >>>>>> Your error says: >>>>>> >>>>>> <type 'exceptions.ValueError'> unsupported hash type >>>>>> |pbkdf2(1000,20,sha512) >>>>>> >>>>>> I do not understand where | in |pbkdf2 would come from. >>>>>> >>>>>> >>>>>> On Tuesday, 18 December 2012 09:33:12 UTC-6, Wonton wrote: >>>>>>> >>>>>>> Hi Massimo!! >>>>>>> >>>>>>> I'm using version 2.2.1 (2012-10-21 16:57:04) stable. I dowloaded it >>>>>>> last week. >>>>>>> >>>>>>> El martes, 18 de diciembre de 2012 16:26:29 UTC+1, Massimo Di Pierro >>>>>>> escribió: >>>>>>>> >>>>>>>> Which web2py version? The error suggests you are using an older >>>>>>>> web2py version with newly created database of records. >>>>>>>> >>>>>>>> Massimo >>>>>>>> >>>>>>>> On Monday, 17 December 2012 14:59:02 UTC-6, Wonton wrote: >>>>>>>>> >>>>>>>>> Hello everyone, >>>>>>>>> >>>>>>>>> I'm developing a backend site with web2py. I have 2 web services, >>>>>>>>> one to register a user and a second one to login the user. >>>>>>>>> This is the first one: >>>>>>>>> >>>>>>>>> def register(user, email, password): >>>>>>>>> db.auth_user.insert(username=user, email=email, >>>>>>>>> password=db.auth_user.password.validate(password)) >>>>>>>>> ... >>>>>>>>> return 'OK' >>>>>>>>> >>>>>>>>> It's working ok and the users are created without problem. >>>>>>>>> >>>>>>>>> This is the second one: >>>>>>>>> >>>>>>>>> def login(user, password): >>>>>>>>> response = auth.login_bare(user, password) >>>>>>>>> if not response: >>>>>>>>> message = 'Error' >>>>>>>>> else: >>>>>>>>> message = 'OK' >>>>>>>>> return message >>>>>>>>> >>>>>>>>> With this service I have the following error: >>>>>>>>> <type 'exceptions.ValueError'> unsupported hash type >>>>>>>>> |pbkdf2(1000,20,sha512) >>>>>>>>> >>>>>>>>> I've tried to find any solution to this problem without success. >>>>>>>>> >>>>>>>>> Any of you has any idea of what is happening? >>>>>>>>> >>>>>>>>> Thank you very much and kind regards! >>>>>>>>> >>>>>>>>> Wonton >>>>>>>>> >>>>>>>> --

