Reconcile recovery by support reference and bound provider lookup
All checks were successful
Authentication acceptance / acceptance (push) Successful in 1m4s
Authentication acceptance / provider-contract (push) Successful in 14s

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a092fe-13b1-7f12-ac74-7d258af4d79c
This commit is contained in:
tegwick 2026-09-13 21:11:03 +02:00
parent cb51584f58
commit d15f4dde0b
4 changed files with 43 additions and 3 deletions

View file

@ -56,6 +56,7 @@ class ProviderStore:
if db.engine.dialect.name != 'postgresql':
yield;return
with db.engine.connect() as connection:
connection.execute(text("SET lock_timeout = '5s'"))
connection.execute(text('SELECT pg_advisory_lock(4912040036)'))
try:yield
finally:connection.execute(text('SELECT pg_advisory_unlock(4912040036)'))
@ -63,13 +64,17 @@ class ProviderStore:
def serials(self,user):
from privacyidea.lib.token import get_tokens
from privacyidea.lib.user import User
values=get_tokens(user=User(user,self.realm))
identity=User(user,self.realm)
if not identity.resolver or identity.uid in (None,''):raise RecoveryError('account_not_found')
values=get_tokens(user=identity)
if len(values)>20:raise RecoveryError('too_many_factors')
return [token.token.serial for token in values]
def _token(self,user,serial):
from privacyidea.lib.token import get_tokens
from privacyidea.lib.user import User
values=get_tokens(user=User(user,self.realm),serial=serial)
identity=User(user,self.realm)
if not identity.resolver or identity.uid in (None,''):return None
values=get_tokens(user=identity,serial=serial)
if len(values)!=1:return None
return values[0].token
def snapshot(self,user,serial):