atviriduomenys / katalogas

Lietuvos atvirų duomenų katalogas (data.gov.lt).
14 stars 2 forks source link

Naudotojų administravimas neveikia #431

Open adp-atea opened 1 year ago

adp-atea commented 1 year ago

Atsidarant user'io redagavimo langą

image

Gaunama klaida

Image

sirex commented 1 year ago

Vis dar neveikia: https://test.data.gov.lt/admin/vitrina_users/user/1144/change/

sirex commented 1 year ago

Atidarius: https://test.data.gov.lt/admin/vitrina_users/user/1144/change/

Serverio logai rodo:

Traceback (most recent call last):
  File "django/template/base.py", line 973, in render_value_in_context
    value = str(value)
  File "django/utils/html.py", line 376, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "django/forms/boundfield.py", line 34, in __str__
    return self.as_widget()
  File "django/forms/boundfield.py", line 93, in as_widget
    return widget.render(
  File "django/forms/widgets.py", line 246, in render
    context = self.get_context(name, value, attrs)
  File "django/contrib/auth/forms.py", line 48, in get_context
    for key, value_ in hasher.safe_summary(value).items():
  File "django/contrib/auth/hashers.py", line 475, in safe_summary
    decoded = self.decode(encoded)
  File "django/contrib/auth/hashers.py", line 458, in decode
    algorithm, empty, algostr, work_factor, data = encoded.split('$', 4)
ValueError: not enough values to unpack (expected 5, got 2)

Panašu, kad klaida susijusi su slaptažodžio šifravimu.

Gal būt tai susiję su šia migracija?

https://github.com/atviriduomenys/katalogas/blob/cc9eb3b3d87fd6892d44a6183963134c6e4dfdb7/vitrina/users/migrations/0004_auto_20220909_1301.py#L7-L12

Su nuasmeninta duomenų baze, ši klaida nepasireiškia, nes ten slaptažodžiai resetinti.

adp-atea commented 1 year ago

Migracija tik prideda šifravimo pavadinimą (bcrypt$), prie pačio slaptažodžio, nes tai reikalinga django, kad galėtų nustatyti šifravimo būdą. Bet čia panašu, kad slaptažodis yra išsaugotas ne su bcrypt šifravimu, jeigu algorithm, empty, algostr, work_factor, data = encoded.split('$', 4) grąžina tik 2 reikšmes, kai tikimasi 5.

Reikėtų pamatyti pavyzdį slaptažodžio, kaip jis išsaugotas, nes turėtų būti kažkas tokio: bcrypt$$2b$10$...

sirex commented 1 year ago

Štai ką radau:

>>> user = User.objects.get()
>>> user.password
'bcrypt$viisp'
>>> User.objects.count()
1945
>>> User.objects.filter(password='bcrypt$viisp').count()
971

Panašu, kad didelė dalis naudotojų, neturi iš vis slaptažodžio ir jungiasi per VIISP. Jei slaptažodis nustatytas į bcrypt$viisp, tai reiškia, kad slaptažodis iš vis nenustatytas. Tokiu atveju reikia naudoti set_unusable_password(), kad Django atpažintu, kad nėra slaptažodžio.

sirex commented 1 year ago

Vėl gaunu panašią klaidą:

Internal Server Error: /admin/vitrina_users/user/204/change/
Traceback (most recent call last):
  File "django/forms/widgets.py", line 246, in render
    context = self.get_context(name, value, attrs)
  File "django/contrib/auth/forms.py", line 48, in get_context
    for key, value_ in hasher.safe_summary(value).items():
  File "django/contrib/auth/hashers.py", line 475, in safe_summary
    decoded = self.decode(encoded)
  File "django/contrib/auth/hashers.py", line 458, in decode
    algorithm, empty, algostr, work_factor, data = encoded.split('$', 4)
ValueError: not enough values to unpack (expected 5, got 2)

Tik šį kartą slaptažodis yra bcrypt$None.

Reikėtų dar vienos migracijos, kuri patikrina, jei slaptažodis yra '', bcrypt$None, tada pakeistų į unusable slaptažodį.

Susijęs pakeitimas: