Open adp-atea opened 1 year ago
Vis dar neveikia: https://test.data.gov.lt/admin/vitrina_users/user/1144/change/
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?
Su nuasmeninta duomenų baze, ši klaida nepasireiškia, nes ten slaptažodžiai resetinti.
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$...
Š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.
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:
Atsidarant user'io redagavimo langą
Gaunama klaida