From f4248dcb7382392a260fc31041d172852a206f76 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 27 Oct 2025 10:59:08 +0100 Subject: [PATCH] provide special view @@auth_select for selection of authentication method --- loops/locales/de/LC_MESSAGES/loops.mo | Bin 29286 -> 29371 bytes loops/locales/de/LC_MESSAGES/loops.po | 5 ++++- loops/organize/browser/member.py | 7 ------- loops/organize/browser/view_macros.pt | 14 -------------- loops/server/auth.py | 21 +++++++++++++++------ loops/server/loginform.pt | 19 ++++++++++++++++++- loops/server/loginform.zcml | 6 ++++++ 7 files changed, 43 insertions(+), 29 deletions(-) diff --git a/loops/locales/de/LC_MESSAGES/loops.mo b/loops/locales/de/LC_MESSAGES/loops.mo index bd212168ab978030c8a8441e1b943a413cd21b69..c4a341f8fba6b0a0e4e849d4d9b50cbddfbe3b06 100644 GIT binary patch delta 10499 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 SIx0PB=+LCp9gRms`TZB~$#@e0 delta 10419 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\n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -1478,6 +1478,9 @@ msgstr "Mit OpenID Connect (Zitadel) anmelden" msgid "edit-external-user" msgstr "Login-Einstellungen bearbeiten" +msgid "set-authentication-method" +msgstr "Login-Verfahren einstellen" + msgid "authentication-method" msgstr "Login-Verfahren" diff --git a/loops/organize/browser/member.py b/loops/organize/browser/member.py index c2b6362..278097b 100644 --- a/loops/organize/browser/member.py +++ b/loops/organize/browser/member.py @@ -61,13 +61,6 @@ class PersonalInfo(ConceptView): def view(self): return self - @Lazy - def selectAuthMethod(self): - return getattr(config, 'authentication_method', 'legacy') == 'cookie' - - def getAuthMethod(self): - return self.request.cookies.get('loops_auth_method') or 'legacy' - @Lazy def extUserLink(self): from scopes.web.auth.oidc import IExternalPrincipal diff --git a/loops/organize/browser/view_macros.pt b/loops/organize/browser/view_macros.pt index dce06ff..efb50f4 100644 --- a/loops/organize/browser/view_macros.pt +++ b/loops/organize/browser/view_macros.pt @@ -60,20 +60,6 @@
  • Edit Filters
  • -
  • - Authentication Method: - -
  • diff --git a/loops/server/auth.py b/loops/server/auth.py index 039d720..d9f151e 100644 --- a/loops/server/auth.py +++ b/loops/server/auth.py @@ -23,19 +23,18 @@ def registerAuthUtility(config): class LoginPage: index = ViewPageTemplateFile('loginform.pt') + showSelection = False def __init__(self, context, request): self.context = context self.request = request - self.authMethod = getattr(config, 'authentication_method', 'legacy') + self.authMethod = getConfigAuthMethod() if self.authMethod == 'cookie': self.authMethod = getAuthMethodCookieValue(request) - self.oidc_allowed = self.authMethod in ('oidc', 'select') + self.oidc_allowed = self.showSelection or self.authMethod in ('oidc', 'select') def __call__(self): - print('***', self.request.principal.id) - print('***', self.authMethod) - if self.authMethod == 'oidc': + if self.authMethod == 'oidc' and not self.showSelection: return self.authOidc() return self.index() @@ -43,8 +42,18 @@ class LoginPage: oidc.Authenticator(self.request).login() return '' + +class LoginPageSelect(LoginPage): + + @property + def showSelection(self): + return getConfigAuthMethod() == 'cookie' + + +def getConfigAuthMethod(): + return getattr(config, 'authentication_method', 'legacy') + def getAuthMethodCookieValue(request): - print('***', dict(request.cookies)) return request.cookies.get('loops_auth_method') or 'legacy' diff --git a/loops/server/loginform.pt b/loops/server/loginform.pt index 2f80420..120cafb 100644 --- a/loops/server/loginform.pt +++ b/loops/server/loginform.pt @@ -20,6 +20,7 @@
    +

    Please provide Login Information

    @@ -43,7 +44,6 @@

    -
    Password
    @@ -58,6 +58,23 @@ +
    +
    +

    Set Authentication Method

    + Authentication Method: + +
    diff --git a/loops/server/loginform.zcml b/loops/server/loginform.zcml index ccf6dd5..9cd04db 100644 --- a/loops/server/loginform.zcml +++ b/loops/server/loginform.zcml @@ -8,5 +8,11 @@ permission="zope.Public" layer="cybertools.browser.loops.Loops" /> + +