Compare commits

...

8 Commits

Author SHA1 Message Date
aca 07286b9fb4 new configuration version 2025-04-01 09:56:29 +00:00
aca 81e7ad3071 new configuration version 2025-04-01 07:45:40 +00:00
aca 2ef76e0d1b new configuration version 2025-03-31 16:02:59 +00:00
aca 35d7325a20 new configuration version 2025-03-31 15:37:27 +00:00
aca 10b146e346 new configuration version 2025-03-31 14:10:09 +00:00
aca 6c3b7e672a new configuration version 2025-03-31 09:06:25 +00:00
haburger b938bd429b new configuration version 2025-03-25 10:21:02 +00:00
haburger 1c1010d832 new configuration version 2025-03-24 14:06:20 +00:00
77 changed files with 1804 additions and 717 deletions

View File

@ -11,7 +11,7 @@ metadata:
spec:
type: "NevisAuth"
replicas: 1
version: "8.2411.1"
version: "8.2411.3"
gitInitVersion: "1.3.0"
runAsNonRoot: true
ports:
@ -45,7 +45,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-654fc77cfe9eeb743896b19166144c379a1ad337"
tag: "r-ba39848d1c443859cdedb92e5cb503a09a1feaca"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/auth-sts"
credentials: "git-credentials"
keystores:

View File

@ -13,7 +13,7 @@ JAVA_OPTS=(
"-javaagent:/opt/agent/opentelemetry-javaagent.jar"
"-Dotel.javaagent.logging=application"
"-Dotel.javaagent.configuration-file=/var/opt/nevisauth/default/conf/otel.properties"
"-Dotel.resource.attributes=service.version=8.2411.1,service.instance.id=$HOSTNAME"
"-Dotel.resource.attributes=service.version=8.2411.3,service.instance.id=$HOSTNAME"
"-Djavax.net.ssl.trustStore=/var/opt/keys/trust/auth-sts-default-tls-trust/truststore.p12"
"-Djavax.net.ssl.trustStorePassword=\${exec:/var/opt/keys/trust/auth-sts-default-tls-trust/keypass}"
)

View File

@ -1,7 +1,7 @@
apiVersion: "operator.nevis-security.ch/v1"
kind: "NevisTrustStore"
metadata:
name: "auth-default-default-signer-trust"
name: "auth-internal-idp-auth-signer-trust"
namespace: "adn-agov-nevisidm-01-uat"
labels:
deploymentTarget: "auth"
@ -10,5 +10,7 @@ metadata:
patternId: "7022472ae407577ae604bbb8"
spec:
keystores:
- name: "auth-sts-sh4r3d-internal-idp-auth-signer"
namespace: "adn-agov-nevisidm-01-uat"
- name: "auth-sh4r3d-internal-idp-auth-signer"
namespace: "adn-agov-nevisidm-01-uat"

View File

@ -12,6 +12,8 @@ spec:
keystores:
- name: "proxy-idp-notused-auth-realm-identity"
namespace: "adn-agov-nevisidm-01-uat"
- name: "proxy-idp-auth-realm-main-idp-identity"
namespace: "adn-agov-nevisidm-01-uat"
- name: "proxy-idp-auth-realm-mobile-fido-uaf-identity"
namespace: "adn-agov-nevisidm-01-uat"
- name: "proxy-idp-auth-realm-recovery-identity"

View File

@ -11,7 +11,7 @@ metadata:
spec:
type: "NevisAuth"
replicas: 1
version: "8.2411.1"
version: "8.2411.3"
gitInitVersion: "1.3.0"
runAsNonRoot: true
ports:
@ -45,7 +45,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-e00a9c4734572d2d12c47637bd8775b8447b2904"
tag: "r-ba39848d1c443859cdedb92e5cb503a09a1feaca"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/auth"
credentials: "git-credentials"
keystores:
@ -55,7 +55,7 @@ spec:
truststores:
- "auth-default-tls-trust"
- "auth-auth-realm-mobile-fido-uaf-tls-trust-nevisfido"
- "auth-default-default-signer-trust"
- "auth-internal-idp-auth-signer-trust"
- "auth-technical-trust-store"
podSecurity:
policy: "baseline"

View File

@ -96,7 +96,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -224,6 +224,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -96,7 +96,7 @@ language.it=Italiano
languageDropdown.aria.label=Sprache w&auml;hlen
loainfo.description.200=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben verifizieren. Der Vorgang kann bis zu 2 - 3 Tage dauern.
loainfo.description.300=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben durch einen von zwei Vorg&auml;ngen verifizieren. Sie k&ouml;nnen die bevorzugte Methode im n&auml;chsten Schritt ausw&auml;hlen.
loainfo.description.400=F&uuml;r den Zugang zu dieser Anwendung m&uuml;ssen Sie Ihre AHV-Nummer angeben.
loainfo.description.400=Bitte AHV-Nummer angeben, um auf die Applikation zuzugreifen.
loainfo.helper=Ihre pers&ouml;nlichen Daten m&uuml;ssen &uuml;berpr&uuml;ft werden!
loainfo.later=Sp&auml;ter
loainfo.startNow=M&ouml;chten Sie den Prozess jetzt starten?
@ -224,6 +224,8 @@ recovery_check_code.invalid.code.tooLong=Eingegebener Code ist zu lang
recovery_check_code.noAccess=Ich kann auf meinen Code nicht zugreifen
recovery_check_code.noCodeAccess=Sind Sie sicher, dass Sie auf Ihren Wiederherstellungscode nicht zugreifen k&ouml;nnen?
recovery_check_code.noCodeAccessInstructions=Wenn Sie auf Ihren Wiederherstellungscode nicht mehr zugreifen k&ouml;nnen, gehen Sie bitte zur AGOV-Hilfe, um jemanden vom AGOV-Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_code.too_many_tries.instruction1=Der von Ihnen eingegebene Wiederherstellungscode ist m&ouml;glicherweise abgelaufen oder Sie haben zu oft versucht, einen Code einzugeben.
recovery_check_code.too_many_tries.instruction2=Gehen Sie bitte zur AGOV-Hilfe, um jemanden vom Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_noCode.banner.error=Zu viele Versuche.
recovery_check_noCode.instruction1=M&ouml;glicherweise haben Sie zu oft versucht, den Wiederherstellungscode einzugeben.
recovery_check_noCode.instruction2=Bitte schliessen Sie den Webbrowser und starten Sie die Kontowiederherstellung in zehn Minuten erneut auf <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -96,7 +96,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -224,6 +224,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -96,7 +96,7 @@ language.it=Italiano
languageDropdown.aria.label=S&eacute;lectionner la langue
loainfo.description.200=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es. Ce processus peut prendre jusqu'&agrave; 2 ou 3 jours.
loainfo.description.300=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es par le biais de l'une des deux proc&eacute;dures suivantes. Vous pouvez choisir la proc&eacute;dure que vous pr&eacute;f&eacute;rez &agrave; l'&eacute;tape suivante.
loainfo.description.400=Pour acc&eacute;der &agrave; l'application, vous devez ajouter votre num&eacute;ro AVS.
loainfo.description.400=Veuillez saisir votre num&eacute;ro AVS pour acc&eacute;der &agrave; l'application.
loainfo.helper=Vos donn&eacute;es doivent &ecirc;tre v&eacute;rifi&eacute;es!
loainfo.later=Plus tard
loainfo.startNow=Voulez-vous commencer le processus maintenant?
@ -224,6 +224,8 @@ recovery_check_code.invalid.code.tooLong=Le code est trop long
recovery_check_code.noAccess=Je n&rsquo;ai pas acc&egrave;s &agrave; mon code de r&eacute;cup&eacute;ration
recovery_check_code.noCodeAccess=&Ecirc;tes-vous s&ucirc;r de ne pas avoir acc&egrave;s &agrave; votre code de r&eacute;cup&eacute;ration ?
recovery_check_code.noCodeAccessInstructions=En cas de perte de votre code de r&eacute;cup&eacute;ration, veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance AGOV. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_code.too_many_tries.instruction1=Le code de r&eacute;cup&eacute;ration que vous avez saisi a peut-&ecirc;tre expir&eacute; ou vous avez peut-&ecirc;tre essay&eacute; de le saisir trop de fois.
recovery_check_code.too_many_tries.instruction2=Veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_noCode.banner.error=Trop de tentatives.
recovery_check_noCode.instruction1=Vous avez peut-&ecirc;tre essay&eacute; de saisir le code de r&eacute;cup&eacute;ration trop de fois.
recovery_check_noCode.instruction2=Veuillez fermer le navigateur web et recommencer la r&eacute;cup&eacute;ration du compte dans dix minutes &agrave; partir de <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -96,7 +96,7 @@ language.it=Italiano
languageDropdown.aria.label=Selezionare la lingua
loainfo.description.200=Per accedere all'app &egrave; necessaria una verifica dei dati. La procedura pu&ograve; richiedere fino a 2&ndash;3 giorni lavorativi.
loainfo.description.300=Per accedere all'app dobbiamo verificare i suoi dati tramite uno dei due processi. Al prossimo passaggio, pu&ograve; selezionare la procedura di verifica desiderata.
loainfo.description.400=Per acceddere all'applicazione deve inserire il numero AVS.
loainfo.description.400=Per accedere all'applicazione &egrave; necessario inserire il numero AVS.
loainfo.helper=I dati devono essere verificati!
loainfo.later=Pi&ugrave; tardi
loainfo.startNow=Iniziare la procedura?
@ -224,6 +224,8 @@ recovery_check_code.invalid.code.tooLong=Il codice &egrave; troppo lungo
recovery_check_code.noAccess=Non ho il mio codice.
recovery_check_code.noCodeAccess=Conferma di non avere il codice di ripristino?
recovery_check_code.noCodeAccessInstructions=Se non ha pi&ugrave; il codice di ripristino, acceda ad AGOV help per contattare il supporto AGOV, che la assister&agrave; nel processo di ripristino.
recovery_check_code.too_many_tries.instruction1=Il codice di ripristino inserito pu&ograve; essere scaduto o &egrave; stato inserito troppe volte.
recovery_check_code.too_many_tries.instruction2=Si prega di andare alla guida di AGOV aiuto per contattare un agente dell'assistenza. Saranno in grado di aiutarla con il processo di recupero.
recovery_check_noCode.banner.error=Troppi tentativi.
recovery_check_noCode.instruction1=Potresti aver tentato di inserire il codice di ripristino troppe volte.
recovery_check_noCode.instruction2=Chiudi il browser web e inizia nuovamente il processo di ripristino dell'account tra dieci minuti da <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -10,6 +10,20 @@ def tAuth = System.currentTimeMillis() - (request.getSession(true).getCreationTi
LOG.info("Event='AUTHENTICATION', Requester='${requester}', RequestId='${requestId}', RequestedAq=${requestedAq}, User=${user}, CredentialType='${credentialType}', tAuth=${tAuth}ms, SourceIp=${sourceIp}, UserAgent='${userAgent}'")
// BUNDBITBK-4824: Address was missing after bmid verification
def session = request.getAuthSession(true)
int loa = session.get('agov.actualRoleLevel') as int
// Best Token Available only if account's AQlevel is high enough
if ((session.getAttribute('agov.appAddressRequired') == 'true') && (loa < 200)) {
LOG.debug("Best Token: Address requested but account has to low AQ (${loa})")
session.setAttribute('agov.appAddressRequired', 'false')
}
if ((session.getAttribute('agov.appSvnrAllowed') == 'true') && (loa < 400)) {
LOG.debug("Best Token: SVNr requested but account has to low AQ (${loa})")
session.setAttribute('agov.appSvnrAllowed', 'false')
}
// BUNDBITBK-4824 END
// delete the login cookie
def agovLoginCookie = "agovLogin=deleted; Domain=${parameters.get('cookie.domain')}; Path=/; Max-Age=0; SameSite=Strict; Secure; HttpOnly"

View File

@ -167,8 +167,8 @@ def i2r = [:]
// issuer to ResultCond name
def i2e = [:]
i2e.put('https://trustbroker.agov-d.azure.adnovum.net', 'forbidden_0')
i2e.put('https://trustbroker-idp.agov-w.azure.adnovum.net', 'forbidden_1')
i2e.put('https://trustbroker.agov-epr-lab.azure.adnovum.net', 'forbidden_0')
i2e.put('https://trustbroker-idp.agov-epr-lab.azure.adnovum.net', 'forbidden_1')
if (!i2r.isEmpty() && !hasAnyRequiredRole(i2r, issuer)) {

View File

@ -162,33 +162,22 @@ try {
for (String role : getUserAGOVLoiRoles()) {
if (role.startsWith('level')) {
def roleLevel = role.substring(5)
int roleLevelNumber = Integer.parseInt(roleLevel)
if (highestRoleLevelNumber< roleLevelNumber) {
highestRoleLevelNumber=roleLevelNumber
}
if (role.startsWith('level')) {
def roleLevel = role.substring(5)
int roleLevelNumber = Integer.parseInt(roleLevel)
if (highestRoleLevelNumber< roleLevelNumber) {
highestRoleLevelNumber=roleLevelNumber
}
}
}
}
LOG.debug('CheckLoa: Highest role Level ' + highestRoleLevelNumber.toString() +' contextclassref ' + requestedRoleLevelNumber.toString())
LOG.debug('CheckLoa: Compare ' + (highestRoleLevelNumber>=requestedRoleLevelNumber))
LOG.debug('CheckLoa: Compare ' + (highestRoleLevelNumber>=requestedRoleLevelNumber))
//set attribute Actual Role Level
session.setAttribute('agov.actualRoleLevel', '' + highestRoleLevelNumber)
LOG.debug('CheckLoa: actual role level (agov) '+ highestRoleLevelNumber)
// Best Token Available only if account's AQlevel is high enough
if ((session.getAttribute('agov.appAddressRequired') == 'true') && (highestRoleLevelNumber < 200)) {
LOG.debug("Best Token: Address requested but account has to low AQ (${highestRoleLevelNumber})")
session.setAttribute('agov.appAddressRequired', 'false')
}
if ((session.getAttribute('agov.appSvnrAllowed') == 'true') && (highestRoleLevelNumber < 400)) {
LOG.debug("Best Token: SVNr requested but account has to low AQ (${highestRoleLevelNumber})")
session.setAttribute('agov.appSvnrAllowed', 'false')
}
if (highestRoleLevelNumber > 0) {
// set attribute contextClassRefToSet
session.setAttribute('contextClassRefToSet','urn:qa.agov.ch:names:tc:ac:classes:' .concat(highestRoleLevelNumber.toString()))

View File

@ -0,0 +1,326 @@
import ch.nevis.esauth.auth.engine.AuthResponse
import ch.nevis.esauth.util.httpclient.api.HttpClient
import groovy.json.JsonSlurper
import io.opentelemetry.api.trace.Span
def getHeader(String name) {
def inctx = request.getLoginContext()
// case-insensitive lookup of HTTP headers
def map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER)
map.putAll(inctx)
return map['connection.HttpHeader.' + name]
}
def verification_request_template = '''
{ "presentation_definition": {
"id": "{{UUID}}",
"name": "AGOV Verification",
"purpose": "AGOV Login",
"format": {
"vc+sd-jwt": {
"sd-jwt_alg_values": [
"ES256"
],
"kb-jwt_alg_values": [
"ES256"
]
}
},
"input_descriptors": [
{
"id": "agov-all-attributes",
"name": "AGOV Identity Verification",
"purpose": "verification and authentication",
"format": {
"vc+sd-jwt": {
"sd-jwt_alg_values": [
"ES256"
],
"kb-jwt_alg_values": [
"ES256"
]
}
},
"constraints": {
"fields": [
{
"path": [
"$.family_name"
]
},
{
"path": [
"$.given_name"
]
},
{
"path": [
"$.birth_date"
]
},
{
"path": [
"$.sex"
]
},
{
"path": [
"$.place_of_origin"
]
},
{
"path": [
"$.birth_place"
]
},
{
"path": [
"$.nationality"
]
},
{
"path": [
"$.personal_administrative_number"
]
},
{
"path": [
"$.document_number"
]
},
{
"path": [
"$.issuance_date"
]
},
{
"path": [
"$.expiry_date"
]
},
{
"path": [
"$.issuing_authority"
]
},
{
"path": [
"$.issuing_country"
]
}
]
}
}
]
}
}
'''
def ERROR_CODE_TO_STATUS_MAPPER = [
'CREDENTIAL_INVALID' : 'FAILED',
'JWT_EXPIRED' : 'ERROR',
'INVALID_FORMAT' : 'ERROR',
'CREDENTIAL_EXPIRED' : 'FAILED',
'MISSING_NONCE' : 'ERROR',
'UNSUPPORTED_FORMAT' : 'ERROR',
'CREDENTIAL_REVOKED' : 'FAILED',
'CREDENTIAL_SUSPENDED' : 'FAILED',
'HOLDER_BINDING_MISMATCH' : 'ERROR',
'CREDENTIAL_MISSING_DATA' : 'FAILED',
'UNRESOLVABLE_STATUS_LIST' : 'ERROR',
'PUBLIC_KEY_OF_ISSUER_UNRESOLVABLE': 'ERROR',
'CLIENT_REJECTED' : 'CANCELED',
'ISSUER_NOT_ACCEPTED' : 'ERROR'
]
// ---------------
// check, whether we are still processing the correct AuthnRequest
if (inargs.containsKey('authRequestId') && (inargs['authRequestId'] != session['ch.nevis.auth.saml.request.id'])) {
// wrong request, "force" a timeout
LOG.debug('authentication timeout enforced, due to concurrent requests -> return a 408')
response.setIsDirectResponse(true)
response.setContentType('text/html; charset=UTF-8')
response.setContent('Timeout')
response.setHttpStatusCode(205)
response.setHeader('IDP-AUTH', 'Timeout')
// CONTINUE to keep the other request beeing processed
response.setStatus(AuthResponse.AUTH_CONTINUE)
return
}
if (inargs['oid4vp'] == 'ERROR') {
response.setResult('error')
return
}
if (inargs['oid4vp'] == 'SUCCEEDED') {
response.setResult('ok')
return
}
def sess = request.getAuthSession(true)
HttpClient httpClient = HttpClients.create(parameters)
def spanCtxt = Span.current().getSpanContext()
def traceparent = "00-${spanCtxt.getTraceId()}-${spanCtxt.getSpanId()}-${spanCtxt.getTraceFlags().asHex()}"
if (!session['agov.eid.verification']) {
// Initialize the verification session on the verifier
def endPoint = "${parameters.get('eidVerifierBaseUrl')}/api/v1/verifications"
try {
def httpResponse = Http.post()
.url(endPoint)
.header("Accept", "application/json")
.header("traceparent", traceparent)
.entity(Http.entity()
.content(verification_request_template.replaceAll("\\{\\{UUID}}", UUID.randomUUID().toString()))
.contentType("application/json")
.build())
.build()
.send(httpClient)
if (httpResponse.code() != 200) {
LOG.debug("Result: ${httpResponse}")
response.setResult('error')
return
}
def json = new JsonSlurper().parseText(httpResponse.bodyAsString())
LOG.debug("Result: ${json}")
sess.setAttribute('agov.eid.verification', 'true')
sess.setAttribute('agov.eid.verification.id', json.id)
sess.setAttribute('agov.eid.verification.link', json.verification_url)
if (json.state != 'PENDING') {
response.setResult('error')
return
}
}
catch (Exception e) {
LOG.error("Eid verification failed: $e")
response.setResult('error')
return
}
}
if (getHeader('Content-Type') == 'application/json' && inargs.containsKey('o.id.v')) {
// request for a status update from the verifier
def result
// TODO/haburger/2025-03-24: we should make sure, that we have an actual session on the verifier with id.v
// and that authRequestId is correct
def idvalue = (!inargs['o.id.v'] || inargs['o.id.v'] == 'NEW') ? session['agov.eid.verification.id'] : inargs['o.id.v']
try {
def endPoint = "${parameters.get('eidVerifierBaseUrl')}/api/v1/verifications/${idvalue}"
def httpResponse = Http.get()
.url(endPoint)
.header("Accept", "application/json")
.header("traceparent", traceparent)
.build()
.send(httpClient)
if (httpResponse.code() != 200) {
// TODO/haburger/2025-03-25: 404 we should create a new verification request
LOG.debug("Result: ${httpResponse}")
result = """{
"oid4vp": {
"status": "ERROR",
"verification_url": "${session['agov.eid.verification.link']}",
"id": "${idvalue}",
"error_code": "HTTP-ERROR",
"error_message": "failed to verify status of verification ${idvalue}, http status: ${httpResponse.code()}"
}}"""
LOG.warn("<== Response: ${responseCode}")
}
else {
def json = new JsonSlurper().parseText(httpResponse.bodyAsString())
if (json.state == 'SUCCESS') {
def claims = json.wallet_response.credential_subject_data
// TODO/haburger/2025-03-25: format changes to align with IDM read data
sess.setAttribute('ch.nevis.idm.User.firstName', claims.given_name)
sess.setAttribute('ch.nevis.idm.User.lastName', claims.family_name)
sess.setAttribute('ch.nevis.idm.User.birthDate', claims.birth_date)
sess.setAttribute('ch.nevis.idm.User.gender', claims.sex)
sess.setAttribute('ch.nevis.idm.User.prop.svnr', claims.personal_administrative_number)
sess.setAttribute('ch.nevis.idm.User.prop.placeOfBirth', claims.birth_place)
sess.setAttribute('ch.nevis.idm.User.prop.eIdNumber', claims.personal_administrative_number)
sess.setAttribute('ch.nevis.idm.User.prop.nationality', claims.nationality.toString())
sess.setAttribute('ValidFrom', claims.issuance_date)
sess.setAttribute('ValidTo', claims.expiry_date)
sess.setAttribute('authenticatedWith', "urn:qa.agov.ch:names:tc:authfactor:eid")
sess.setAttribute('idVerification', "Eid")
sess.setAttribute('contextClassRefToSet', "urn:qa.agov.ch:names:tc:ac:classes:600")
response.setUserId(claims.personal_administrative_number)
response.setLoginId(claims.document_number)
response.setAuthLevel("EID")
result = """{
"oid4vp": {
"status": "SUCCEEDED",
"verification_url": "${session['agov.eid.verification.link']}",
"id": "${idvalue}",
"error_code": "NONE"
}}"""
}
else if (json.state == 'FAILED') {
// TODO/haburger/2025-03-25: ERROR_CODE_TO_STATUS_MAPPER[json.wallet_response.error_code] == 'FAILED' we should
// initiate a new verification and return the new id, url together with the message
LOG
.error("Eid verification failed: ${json.wallet_response.error_code} (${json.wallet_response.error_description})")
result = """{
"oid4vp": {
"status": "${ERROR_CODE_TO_STATUS_MAPPER[json.wallet_response.error_code] ?: 'ERROR'}",
"verification_url": "${session['agov.eid.verification.link']}",
"id": "${idvalue}",
"error_code": "${json.wallet_response.error_code}",
"error_message": "${json.wallet_response.error_description}"
}}"""
}
else {
result = """{
"oid4vp": {
"status": "${inargs['o.id.v'] == 'NEW' ? 'INITIATED' : 'PENDING'}",
"verification_url": "${session['agov.eid.verification.link']}",
"id": "${idvalue}",
"error_code": "NONE"
}}"""
}
}
}
catch (Exception e) {
LOG.error("Eid verification failed: ${e}")
result = """{
"oid4vp": {
"status": "ERROR",
"verification_url": "${session['agov.eid.verification.link']}",
"id": "${idvalue}",
"error_code": "HTTP-ERROR",
"error_message": "failed to verify status of verification ${idvalue}, http exception"
}}"""
}
response.setContent(result.toString())
response.setContentType('application/json')
response.setHttpStatusCode(200)
response.setIsDirectResponse(true)
response.setStatus(AuthResponse.AUTH_CONTINUE)
return
}
// if we reach this place, display GUI
response.setStatus(AuthResponse.AUTH_CONTINUE)
return

View File

@ -13,7 +13,7 @@ JAVA_OPTS=(
"-javaagent:/opt/agent/opentelemetry-javaagent.jar"
"-Dotel.javaagent.logging=application"
"-Dotel.javaagent.configuration-file=/var/opt/nevisauth/default/conf/otel.properties"
"-Dotel.resource.attributes=service.version=8.2411.1,service.instance.id=$HOSTNAME"
"-Dotel.resource.attributes=service.version=8.2411.3,service.instance.id=$HOSTNAME"
"-Djavax.net.ssl.trustStore=/var/opt/keys/trust/auth-default-tls-trust/truststore.p12"
"-Djavax.net.ssl.trustStorePassword=\${exec:/var/opt/keys/trust/auth-default-tls-trust/keypass}"
)

View File

@ -75,9 +75,18 @@ def dispatchIssuer(i2s, String issuer) {
if (result == null) {
LOG.info("No SP found for issuer '$issuer'. Hint: check SAML SP Connector patterns.")
}
// dispatch different idp if artifact binding is enabled
if(parameters.get('epdMode') == 'artifact' && result == 'epd'){
LOG.debug("EPD: Artifact mode")
result = result + "_artifact"
}else{
LOG.debug("EPD: POST mode")
}
response.setResult(result)
session.put("saml.inbound.issuer", issuer)
session.put('saml.idp.result', result) // remember decision for sub-sequent requests without a SAML message
}
def dispatchMessage(i2s, String message) {
@ -108,8 +117,8 @@ if (request.getSession(false) == null) {
def i2s = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER)
i2s.put('https://trustbroker.agov-d.azure.adnovum.net', 'state0')
i2s.put('https://trustbroker-idp.agov-w.azure.adnovum.net', 'state1')
i2s.put(parameters.get('atb'), 'main')
i2s.put(parameters.get('epd_atb'), 'epd')
if (parameters.get('spInitiated') == 'true' && inargs.containsKey('SAMLRequest')) { // SP-initiated authentication
LOG.debug("found SAMLRequest parameter for SP-initiated authentication")

View File

@ -26,7 +26,7 @@ int getRequestedLevel(String authnContextClassRef, def roleList){
def session = request.getAuthSession(true)
def context = session.get('ch.nevis.auth.saml.request.authnContextClassRef')
def roleLevels = [100,200,300,400]
def roleLevels = [100,200,300,400,500,600]
def requestedRoleLevelNumber = getRequestedLevel(context, roleLevels)
//set attribute Requested Role Level
@ -58,6 +58,13 @@ if (requestedRoleLevelNumber == 0 || session.get('ch.nevis.auth.saml.request.sco
return
}
// TODO/haburger/2024-03-21: move this later, now here for a simple start
if (requestedRoleLevelNumber == 600 || session.get('ch.nevis.auth.saml.request.scoping.requesterId') == 'OidcPlaygroundWork') {
session.setAttribute('agov.appSvnrAllowed', 'true')
response.setResult('exit.1');
return
}
try {
def spanCtxt = Span.current().getSpanContext()
def traceparent = "00-${spanCtxt.getTraceId()}-${spanCtxt.getSpanId()}-${spanCtxt.getTraceFlags().asHex()}"

View File

@ -11,7 +11,7 @@ metadata:
spec:
type: "NevisFIDO"
replicas: 1
version: "8.2411.1"
version: "8.2411.2"
gitInitVersion: "1.3.0"
runAsNonRoot: true
ports:
@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-ba0282a303be16d9f91b594506c93c0ad7c1eefb"
tag: "r-ba39848d1c443859cdedb92e5cb503a09a1feaca"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/fido-uaf"
credentials: "git-credentials"
database:

View File

@ -7,5 +7,5 @@ JAVA_OPTS=(
"-javaagent:/opt/agent/opentelemetry-javaagent.jar"
"-Dotel.javaagent.logging=application"
"-Dotel.javaagent.configuration-file=/var/opt/nevisfido/default/conf/otel.properties"
"-Dotel.resource.attributes=service.version=8.2411.1,service.instance.id=$HOSTNAME"
"-Dotel.resource.attributes=service.version=8.2411.2,service.instance.id=$HOSTNAME"
)

View File

@ -11,7 +11,7 @@ metadata:
spec:
type: "NevisFIDO"
replicas: 1
version: "8.2411.1"
version: "8.2411.2"
gitInitVersion: "1.3.0"
runAsNonRoot: true
ports:
@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-b0ee5bf8f21b6deb852634ece4565dee10c29032"
tag: "r-ba39848d1c443859cdedb92e5cb503a09a1feaca"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/fido2"
credentials: "git-credentials"
keystores:

View File

@ -6,5 +6,5 @@ JAVA_OPTS=(
"-javaagent:/opt/agent/opentelemetry-javaagent.jar"
"-Dotel.javaagent.logging=application"
"-Dotel.javaagent.configuration-file=/var/opt/nevisfido/default/conf/otel.properties"
"-Dotel.resource.attributes=service.version=8.2411.1,service.instance.id=$HOSTNAME"
"-Dotel.resource.attributes=service.version=8.2411.2,service.instance.id=$HOSTNAME"
)

View File

@ -29,7 +29,7 @@ fido2:
rp-name: "AGOV-RelPartName"
rp-id: "adnovum.net"
origins:
- "https://me.agov-w.azure.adnovum.net"
- "https://ob.agov-w.azure.adnovum.net"
- "https://nevisidm.agov-w.azure.adnovum.net"
- "https://auth.agov-w.azure.adnovum.net"
signature-algorithms:

View File

@ -11,7 +11,7 @@ metadata:
spec:
type: "NevisIDM"
replicas: 1
version: "8.2411.1"
version: "8.2411.2"
gitInitVersion: "1.3.0"
runAsNonRoot: true
ports:
@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-35527ce0c286b4891eee379a626de7c5db786735"
tag: "r-ba39848d1c443859cdedb92e5cb503a09a1feaca"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/idm"
credentials: "git-credentials"
database:

View File

@ -4,5 +4,5 @@ JAVA_OPTS=(
"-javaagent:/opt/agent/opentelemetry-javaagent.jar"
"-Dotel.javaagent.logging=application"
"-Dotel.javaagent.configuration-file=/var/opt/nevisidm/default/conf/otel.properties"
"-Dotel.resource.attributes=service.version=8.2411.1,service.instance.id=$HOSTNAME"
"-Dotel.resource.attributes=service.version=8.2411.2,service.instance.id=$HOSTNAME"
)

View File

@ -11,7 +11,7 @@ metadata:
spec:
type: "NevisLogrend"
replicas: 1
version: "8.2411.1"
version: "8.2411.2"
gitInitVersion: "1.3.0"
runAsNonRoot: true
ports:
@ -44,7 +44,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-2931fda661a24a257860d215bc321d6c0b494511"
tag: "r-ba39848d1c443859cdedb92e5cb503a09a1feaca"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/logrend"
credentials: "git-credentials"
podSecurity:

View File

@ -10,5 +10,5 @@ JAVA_OPTS=(
"-javaagent:/opt/agent/opentelemetry-javaagent.jar"
"-Dotel.javaagent.logging=application"
"-Dotel.javaagent.configuration-file=/var/opt/nevislogrend/default/conf/otel.properties"
"-Dotel.resource.attributes=service.version=8.2411.1,service.instance.id=$HOSTNAME"
"-Dotel.resource.attributes=service.version=8.2411.2,service.instance.id=$HOSTNAME"
)

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Sprache w&auml;hlen
loainfo.description.200=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben verifizieren. Der Vorgang kann bis zu 2 - 3 Tage dauern.
loainfo.description.300=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben durch einen von zwei Vorg&auml;ngen verifizieren. Sie k&ouml;nnen die bevorzugte Methode im n&auml;chsten Schritt ausw&auml;hlen.
loainfo.description.400=F&uuml;r den Zugang zu dieser Anwendung m&uuml;ssen Sie Ihre AHV-Nummer angeben.
loainfo.description.400=Bitte AHV-Nummer angeben, um auf die Applikation zuzugreifen.
loainfo.helper=Ihre pers&ouml;nlichen Daten m&uuml;ssen &uuml;berpr&uuml;ft werden!
loainfo.later=Sp&auml;ter
loainfo.startNow=M&ouml;chten Sie den Prozess jetzt starten?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Eingegebener Code ist zu lang
recovery_check_code.noAccess=Ich kann auf meinen Code nicht zugreifen
recovery_check_code.noCodeAccess=Sind Sie sicher, dass Sie auf Ihren Wiederherstellungscode nicht zugreifen k&ouml;nnen?
recovery_check_code.noCodeAccessInstructions=Wenn Sie auf Ihren Wiederherstellungscode nicht mehr zugreifen k&ouml;nnen, gehen Sie bitte zur AGOV-Hilfe, um jemanden vom AGOV-Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_code.too_many_tries.instruction1=Der von Ihnen eingegebene Wiederherstellungscode ist m&ouml;glicherweise abgelaufen oder Sie haben zu oft versucht, einen Code einzugeben.
recovery_check_code.too_many_tries.instruction2=Gehen Sie bitte zur AGOV-Hilfe, um jemanden vom Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_noCode.banner.error=Zu viele Versuche.
recovery_check_noCode.instruction1=M&ouml;glicherweise haben Sie zu oft versucht, den Wiederherstellungscode einzugeben.
recovery_check_noCode.instruction2=Bitte schliessen Sie den Webbrowser und starten Sie die Kontowiederherstellung in zehn Minuten erneut auf <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=S&eacute;lectionner la langue
loainfo.description.200=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es. Ce processus peut prendre jusqu'&agrave; 2 ou 3 jours.
loainfo.description.300=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es par le biais de l'une des deux proc&eacute;dures suivantes. Vous pouvez choisir la proc&eacute;dure que vous pr&eacute;f&eacute;rez &agrave; l'&eacute;tape suivante.
loainfo.description.400=Pour acc&eacute;der &agrave; l'application, vous devez ajouter votre num&eacute;ro AVS.
loainfo.description.400=Veuillez saisir votre num&eacute;ro AVS pour acc&eacute;der &agrave; l'application.
loainfo.helper=Vos donn&eacute;es doivent &ecirc;tre v&eacute;rifi&eacute;es!
loainfo.later=Plus tard
loainfo.startNow=Voulez-vous commencer le processus maintenant?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Le code est trop long
recovery_check_code.noAccess=Je n&rsquo;ai pas acc&egrave;s &agrave; mon code de r&eacute;cup&eacute;ration
recovery_check_code.noCodeAccess=&Ecirc;tes-vous s&ucirc;r de ne pas avoir acc&egrave;s &agrave; votre code de r&eacute;cup&eacute;ration ?
recovery_check_code.noCodeAccessInstructions=En cas de perte de votre code de r&eacute;cup&eacute;ration, veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance AGOV. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_code.too_many_tries.instruction1=Le code de r&eacute;cup&eacute;ration que vous avez saisi a peut-&ecirc;tre expir&eacute; ou vous avez peut-&ecirc;tre essay&eacute; de le saisir trop de fois.
recovery_check_code.too_many_tries.instruction2=Veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_noCode.banner.error=Trop de tentatives.
recovery_check_noCode.instruction1=Vous avez peut-&ecirc;tre essay&eacute; de saisir le code de r&eacute;cup&eacute;ration trop de fois.
recovery_check_noCode.instruction2=Veuillez fermer le navigateur web et recommencer la r&eacute;cup&eacute;ration du compte dans dix minutes &agrave; partir de <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Selezionare la lingua
loainfo.description.200=Per accedere all'app &egrave; necessaria una verifica dei dati. La procedura pu&ograve; richiedere fino a 2&ndash;3 giorni lavorativi.
loainfo.description.300=Per accedere all'app dobbiamo verificare i suoi dati tramite uno dei due processi. Al prossimo passaggio, pu&ograve; selezionare la procedura di verifica desiderata.
loainfo.description.400=Per acceddere all'applicazione deve inserire il numero AVS.
loainfo.description.400=Per accedere all'applicazione &egrave; necessario inserire il numero AVS.
loainfo.helper=I dati devono essere verificati!
loainfo.later=Pi&ugrave; tardi
loainfo.startNow=Iniziare la procedura?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Il codice &egrave; troppo lungo
recovery_check_code.noAccess=Non ho il mio codice.
recovery_check_code.noCodeAccess=Conferma di non avere il codice di ripristino?
recovery_check_code.noCodeAccessInstructions=Se non ha pi&ugrave; il codice di ripristino, acceda ad AGOV help per contattare il supporto AGOV, che la assister&agrave; nel processo di ripristino.
recovery_check_code.too_many_tries.instruction1=Il codice di ripristino inserito pu&ograve; essere scaduto o &egrave; stato inserito troppe volte.
recovery_check_code.too_many_tries.instruction2=Si prega di andare alla guida di AGOV aiuto per contattare un agente dell'assistenza. Saranno in grado di aiutarla con il processo di recupero.
recovery_check_noCode.banner.error=Troppi tentativi.
recovery_check_noCode.instruction1=Potresti aver tentato di inserire il codice di ripristino troppe volte.
recovery_check_noCode.instruction2=Chiudi il browser web e inizia nuovamente il processo di ripristino dell'account tra dieci minuti da <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -0,0 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEidVerification'));
document.dispatchEvent(new Event('initCantonalBranding'));
});

View File

@ -0,0 +1,224 @@
#parse("${templatePath}/header.vm")
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-2 sm:max-w-full flex h-full sm:h-auto">
<div class="flex flex-col items-start gap-4 w-full rounded-[36px] sm:p-6 mx-auto
max-w-[600px] md:max-w-[1200px] sm:bg-lily-blue dark:sm:bg-purple-black">
<div id="cantonalBranding"
class="flex items-center rounded-xl gap-5 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white rounded sm:rounded-xl w-16 h-16" id="logo"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
<div class="flex flex-col md:flex-row w-full gap-6">
<div id="registerCard" class="w-full md:min-h-[689px] flex flex-col justify-between">
<div id="swiyuLoginImage"
class="relative md:max-w-[520px] max-w-[350px] sm:max-w-[300px] mb-10 w-full mx-auto hidden md:block">
<img alt="" src="${login.appDataPath}/static/images/login.svg"
class="hidden md:block dark:hidden w-full">
<img alt="" src="${login.appDataPath}/static/images/login-dark.svg"
class="hidden md:hidden dark:md:block w-full">
</div>
</div>
<div id="loginModal"
class="flex flex-col bg-white dark:bg-surface-black rounded-[20px] sm:min-h-[700px] p-6 sm:pb-8 sm:pt-10 sm:px-10
max-w-[550px] w-full">
<div class="flex mb-4 sm:mb-6 items-baseline">
<h1 class="font-header text-h4 text-space-blue dark:text-white mr-3">$text.get("eid_verification.login")</h1>
</div>
<div id="cantonalBrandingMobile"
class="flex items-center rounded-xl gap-5 mb-4 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white dark:bg-black rounded sm:rounded-xl w-16 h-16"
id="logoMobile"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
<div id="swiyuWalletAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.info")
</p>
</div>
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.success")
</p>
</div>
</div>
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center
p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4
z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center
p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.info")
</p>
</div>
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.success")
</p>
</div>
</div>
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background
items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.error")
</p>
</div>
</div>
<div id="swiyuLoginImageMobile"
class="hidden max-w-[200px] sm:max-w-full sm:w-full basis-1/2 mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block dark:hidden w-full">
<img alt=""
src="${login.appDataPath}/static/images/login-dark.svg"
class="hidden dark:block w-full">
</div>
<div id="QRCodeHolder">
<div class="relative">
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="swiyu_qrcode"
class="mb-6 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2
z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
</span>
</div>
<a id="swiyuWalletAppLinkIpad" href="" class="hidden">
<agov-button
class="block basis-full mb-6"
data-name="swiyuWalletApp"
data-value="swiyuWalletApp"
data-id="swiyuWalletAppIpad"
data-label="$text.get("general.goSwiyuWalletApp")"
data-type="button"
data-fullwidth="true">
</agov-button>
</a>
<div class="swiyuWalletAppInstructions flex bg-indigo-light rounded-xl p-4 mb-2 items-center
dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("eid_verification.instructions")
</p>
</div>
</div>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full sm:static mt-auto mb-20 sm:mb-0">
<div id="mobileButtons" class="hidden w-full">
<div class="flex flex-col">
<a id="swiyuWalletAppLink" href="">
<agov-button
class="block basis-full mb-4"
data-name="swiyuWalletApp"
data-value="swiyuWalletApp"
data-id="swiyuWalletApp"
data-label="$text.get("general.goSwiyuWalletApp")"
data-type="button"
data-fullwidth="true">
</agov-button>
</a>
<agov-button
id="showQR"
class="block basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"eid_verification.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
id="hideQR"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"eid_verification.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
</div>
</div>
<input class="hidden" name="authRequestId" type="hidden"
value="$gui.getGuiElem('authRequestId').value"/>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="${login.appDataPath}/static/js-code/eid_verification.js" defer>
</script>
<div id="appSamlRpEntityId" class="hidden" data-value="$gui.getGuiElem('agov.appSamlRpEntityId').value"
data-language="$login.language">
</div>
#parse("${templatePath}/footer.vm")

View File

@ -3,7 +3,7 @@
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-dark-hyperlink underline' href='$text.get("footer.link")'>$text.get("footer.link.label")</a>
</div>
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -150,15 +150,15 @@
</p>
</div>
</div>
<div id="agovLoginImageMobile" class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full
mx-auto mb-6">
<div id="agovLoginImageMobile"
class="hidden max-w-[200px] sm:max-w-full sm:w-full basis-1/2 mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block sm:hidden md:block dark:hidden w-full">
class="block dark:hidden w-full">
<img alt=""
src="${login.appDataPath}/static/images/login-dark.svg"
class="dark:sm:hidden dark:md:block hidden dark:block w-full">
class="hidden dark:block w-full">
</div>
<div id="QRCodeHolder">
<div class="relative">
@ -242,7 +242,7 @@
</form>
</div>
</div>
<div id="securityKeyModal" class="hidden mt-16">
<div id="securityKeyModal" class="hidden sm:mt-16">
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-4 text-center">
$text.get("mauth_usernameless.useSecurityKey")
@ -253,7 +253,7 @@
</p>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8">
accept-charset="UTF-8" class="mb-20 sm:mb-0">
<agov-button
class="mb-4 block"
data-name="fallback"

View File

@ -82,14 +82,14 @@
</div>
</div>
<div id="agovLoginImageMobile"
class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
class="hidden max-w-[200px] sm:max-w-full sm:w-full basis-1/2 mx-auto mb-4">
<img alt=""
src="${login.appDataPath}/static/images/recovery.svg"
class="block sm:hidden md:block dark:hidden w-full">
class="block w-full">
<img alt=""
src="${login.appDataPath}/static/images/recovery_dark.svg"
class="dark:sm:hidden dark:md:block hidden dark:block w-full">
class="hidden dark:block w-full">
</div>
<div id="QRCodeHolder">
<div class="relative">

View File

@ -2,116 +2,151 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2 min-h-[535px]">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col gap-8">
<div class="flex items-baseline">
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col gap-8">
<div class="flex items-baseline">
#set($error = $gui.getGuiElem("lasterror"))
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">
$text.get("general.recovery")
</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">
</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">
$text.get("general.entryCode")
</h4>
</div>
</h4>
</div>
#if (($error.value && $error.value != ""))
#if (($error.value == "locked"))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.banner.lockedError")
</p>
</div>
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.too_many_tries.instruction1")
</p>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.too_many_tries.instruction2")
</p>
#else
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.codeIncorrect")
</p>
</div>
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.instruction")
</p>
#end
#else
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.instruction")
</p>
#end
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.instruction")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block">
<agov-input
id="recovery_code_input"
class="py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
data-placeholder=""
data-id="code"
data-name="code"
data-value=""
data-type="text"
data-autofocus="true"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
</agov-input>
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
data-value="cancelFido2"
data-id="cancelFido2"
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false">
</agov-button>
</div>
</div>
<input class="hidden" name="authRequestId" type="hidden" value="$gui.getGuiElem('authRequestId').value"/>
</form>
</div>
<form class="hidden"
id="$gui.name"
name="$gui.name"
method="POST"
target="_self"
action="$formTarget"
autocomplete="off"
accept-charset="UTF-8">
<agov-button
data-name="submit"
data-id="submitFormButton"
data-value="submit"
data-type="submit"
data-fullwidth="true">
</agov-button>
<input class="hidden" name="no_code" id="noCodeCheckbox" type="checkbox" value="true">
<input class="hidden" name="authRequestId" type="hidden" value="$gui.getGuiElem('authRequestId').value"/>
</form>
<img alt="" src="${login.appDataPath}/static/images/recovery.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 dark:hidden hidden md:block">
<img alt="" src="${login.appDataPath}/static/images/recovery_dark.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 hidden dark:md:block">
</div>
#if (($error.value && $error.value != "locked") || !($error.value))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block">
<agov-input
id="recovery_code_input"
class="py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
data-placeholder=""
data-id="code"
data-name="code"
data-value=""
data-type="text"
data-autofocus="true"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
</agov-input>
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
data-value="cancelFido2"
data-id="cancelFido2"
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false">
</agov-button>
<input class="hidden" name="authRequestId" type="hidden"
value="$gui.getGuiElem('authRequestId').value"/>
</div>
</div>
</form>
#else
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block">
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-name="cancelFido2"
data-value="cancelFido2"
data-id="cancelFido2"
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false">
</agov-button>
<input class="hidden" name="authRequestId" type="hidden"
value="$gui.getGuiElem('authRequestId').value"/>
</div>
</div>
</form>
#end
</div>
<form class="hidden"
id="$gui.name"
name="$gui.name"
method="POST"
target="_self"
action="$formTarget"
autocomplete="off"
accept-charset="UTF-8">
<agov-button
data-name="submit"
data-id="submitFormButton"
data-value="submit"
data-type="submit"
data-fullwidth="true">
</agov-button>
<input class="hidden" name="no_code" id="noCodeCheckbox" type="checkbox" value="true">
<input class="hidden" name="authRequestId" type="hidden" value="$gui.getGuiElem('authRequestId').value"/>
</form>
<img alt="" src="${login.appDataPath}/static/images/recovery.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 dark:hidden hidden md:block">
<img alt="" src="${login.appDataPath}/static/images/recovery_dark.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 hidden dark:md:block">
</div>
</div>
<script src="${login.appDataPath}/static/js-code/recovery_check_code.js">

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Sprache w&auml;hlen
loainfo.description.200=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben verifizieren. Der Vorgang kann bis zu 2 - 3 Tage dauern.
loainfo.description.300=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben durch einen von zwei Vorg&auml;ngen verifizieren. Sie k&ouml;nnen die bevorzugte Methode im n&auml;chsten Schritt ausw&auml;hlen.
loainfo.description.400=F&uuml;r den Zugang zu dieser Anwendung m&uuml;ssen Sie Ihre AHV-Nummer angeben.
loainfo.description.400=Bitte AHV-Nummer angeben, um auf die Applikation zuzugreifen.
loainfo.helper=Ihre pers&ouml;nlichen Daten m&uuml;ssen &uuml;berpr&uuml;ft werden!
loainfo.later=Sp&auml;ter
loainfo.startNow=M&ouml;chten Sie den Prozess jetzt starten?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Eingegebener Code ist zu lang
recovery_check_code.noAccess=Ich kann auf meinen Code nicht zugreifen
recovery_check_code.noCodeAccess=Sind Sie sicher, dass Sie auf Ihren Wiederherstellungscode nicht zugreifen k&ouml;nnen?
recovery_check_code.noCodeAccessInstructions=Wenn Sie auf Ihren Wiederherstellungscode nicht mehr zugreifen k&ouml;nnen, gehen Sie bitte zur AGOV-Hilfe, um jemanden vom AGOV-Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_code.too_many_tries.instruction1=Der von Ihnen eingegebene Wiederherstellungscode ist m&ouml;glicherweise abgelaufen oder Sie haben zu oft versucht, einen Code einzugeben.
recovery_check_code.too_many_tries.instruction2=Gehen Sie bitte zur AGOV-Hilfe, um jemanden vom Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_noCode.banner.error=Zu viele Versuche.
recovery_check_noCode.instruction1=M&ouml;glicherweise haben Sie zu oft versucht, den Wiederherstellungscode einzugeben.
recovery_check_noCode.instruction2=Bitte schliessen Sie den Webbrowser und starten Sie die Kontowiederherstellung in zehn Minuten erneut auf <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=S&eacute;lectionner la langue
loainfo.description.200=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es. Ce processus peut prendre jusqu'&agrave; 2 ou 3 jours.
loainfo.description.300=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es par le biais de l'une des deux proc&eacute;dures suivantes. Vous pouvez choisir la proc&eacute;dure que vous pr&eacute;f&eacute;rez &agrave; l'&eacute;tape suivante.
loainfo.description.400=Pour acc&eacute;der &agrave; l'application, vous devez ajouter votre num&eacute;ro AVS.
loainfo.description.400=Veuillez saisir votre num&eacute;ro AVS pour acc&eacute;der &agrave; l'application.
loainfo.helper=Vos donn&eacute;es doivent &ecirc;tre v&eacute;rifi&eacute;es!
loainfo.later=Plus tard
loainfo.startNow=Voulez-vous commencer le processus maintenant?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Le code est trop long
recovery_check_code.noAccess=Je n&rsquo;ai pas acc&egrave;s &agrave; mon code de r&eacute;cup&eacute;ration
recovery_check_code.noCodeAccess=&Ecirc;tes-vous s&ucirc;r de ne pas avoir acc&egrave;s &agrave; votre code de r&eacute;cup&eacute;ration ?
recovery_check_code.noCodeAccessInstructions=En cas de perte de votre code de r&eacute;cup&eacute;ration, veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance AGOV. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_code.too_many_tries.instruction1=Le code de r&eacute;cup&eacute;ration que vous avez saisi a peut-&ecirc;tre expir&eacute; ou vous avez peut-&ecirc;tre essay&eacute; de le saisir trop de fois.
recovery_check_code.too_many_tries.instruction2=Veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_noCode.banner.error=Trop de tentatives.
recovery_check_noCode.instruction1=Vous avez peut-&ecirc;tre essay&eacute; de saisir le code de r&eacute;cup&eacute;ration trop de fois.
recovery_check_noCode.instruction2=Veuillez fermer le navigateur web et recommencer la r&eacute;cup&eacute;ration du compte dans dix minutes &agrave; partir de <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Selezionare la lingua
loainfo.description.200=Per accedere all'app &egrave; necessaria una verifica dei dati. La procedura pu&ograve; richiedere fino a 2&ndash;3 giorni lavorativi.
loainfo.description.300=Per accedere all'app dobbiamo verificare i suoi dati tramite uno dei due processi. Al prossimo passaggio, pu&ograve; selezionare la procedura di verifica desiderata.
loainfo.description.400=Per acceddere all'applicazione deve inserire il numero AVS.
loainfo.description.400=Per accedere all'applicazione &egrave; necessario inserire il numero AVS.
loainfo.helper=I dati devono essere verificati!
loainfo.later=Pi&ugrave; tardi
loainfo.startNow=Iniziare la procedura?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Il codice &egrave; troppo lungo
recovery_check_code.noAccess=Non ho il mio codice.
recovery_check_code.noCodeAccess=Conferma di non avere il codice di ripristino?
recovery_check_code.noCodeAccessInstructions=Se non ha pi&ugrave; il codice di ripristino, acceda ad AGOV help per contattare il supporto AGOV, che la assister&agrave; nel processo di ripristino.
recovery_check_code.too_many_tries.instruction1=Il codice di ripristino inserito pu&ograve; essere scaduto o &egrave; stato inserito troppe volte.
recovery_check_code.too_many_tries.instruction2=Si prega di andare alla guida di AGOV aiuto per contattare un agente dell'assistenza. Saranno in grado di aiutarla con il processo di recupero.
recovery_check_noCode.banner.error=Troppi tentativi.
recovery_check_noCode.instruction1=Potresti aver tentato di inserire il codice di ripristino troppe volte.
recovery_check_noCode.instruction2=Chiudi il browser web e inizia nuovamente il processo di ripristino dell'account tra dieci minuti da <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Sprache w&auml;hlen
loainfo.description.200=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben verifizieren. Der Vorgang kann bis zu 2 - 3 Tage dauern.
loainfo.description.300=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben durch einen von zwei Vorg&auml;ngen verifizieren. Sie k&ouml;nnen die bevorzugte Methode im n&auml;chsten Schritt ausw&auml;hlen.
loainfo.description.400=F&uuml;r den Zugang zu dieser Anwendung m&uuml;ssen Sie Ihre AHV-Nummer angeben.
loainfo.description.400=Bitte AHV-Nummer angeben, um auf die Applikation zuzugreifen.
loainfo.helper=Ihre pers&ouml;nlichen Daten m&uuml;ssen &uuml;berpr&uuml;ft werden!
loainfo.later=Sp&auml;ter
loainfo.startNow=M&ouml;chten Sie den Prozess jetzt starten?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Eingegebener Code ist zu lang
recovery_check_code.noAccess=Ich kann auf meinen Code nicht zugreifen
recovery_check_code.noCodeAccess=Sind Sie sicher, dass Sie auf Ihren Wiederherstellungscode nicht zugreifen k&ouml;nnen?
recovery_check_code.noCodeAccessInstructions=Wenn Sie auf Ihren Wiederherstellungscode nicht mehr zugreifen k&ouml;nnen, gehen Sie bitte zur AGOV-Hilfe, um jemanden vom AGOV-Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_code.too_many_tries.instruction1=Der von Ihnen eingegebene Wiederherstellungscode ist m&ouml;glicherweise abgelaufen oder Sie haben zu oft versucht, einen Code einzugeben.
recovery_check_code.too_many_tries.instruction2=Gehen Sie bitte zur AGOV-Hilfe, um jemanden vom Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_noCode.banner.error=Zu viele Versuche.
recovery_check_noCode.instruction1=M&ouml;glicherweise haben Sie zu oft versucht, den Wiederherstellungscode einzugeben.
recovery_check_noCode.instruction2=Bitte schliessen Sie den Webbrowser und starten Sie die Kontowiederherstellung in zehn Minuten erneut auf <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=S&eacute;lectionner la langue
loainfo.description.200=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es. Ce processus peut prendre jusqu'&agrave; 2 ou 3 jours.
loainfo.description.300=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es par le biais de l'une des deux proc&eacute;dures suivantes. Vous pouvez choisir la proc&eacute;dure que vous pr&eacute;f&eacute;rez &agrave; l'&eacute;tape suivante.
loainfo.description.400=Pour acc&eacute;der &agrave; l'application, vous devez ajouter votre num&eacute;ro AVS.
loainfo.description.400=Veuillez saisir votre num&eacute;ro AVS pour acc&eacute;der &agrave; l'application.
loainfo.helper=Vos donn&eacute;es doivent &ecirc;tre v&eacute;rifi&eacute;es!
loainfo.later=Plus tard
loainfo.startNow=Voulez-vous commencer le processus maintenant?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Le code est trop long
recovery_check_code.noAccess=Je n&rsquo;ai pas acc&egrave;s &agrave; mon code de r&eacute;cup&eacute;ration
recovery_check_code.noCodeAccess=&Ecirc;tes-vous s&ucirc;r de ne pas avoir acc&egrave;s &agrave; votre code de r&eacute;cup&eacute;ration ?
recovery_check_code.noCodeAccessInstructions=En cas de perte de votre code de r&eacute;cup&eacute;ration, veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance AGOV. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_code.too_many_tries.instruction1=Le code de r&eacute;cup&eacute;ration que vous avez saisi a peut-&ecirc;tre expir&eacute; ou vous avez peut-&ecirc;tre essay&eacute; de le saisir trop de fois.
recovery_check_code.too_many_tries.instruction2=Veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_noCode.banner.error=Trop de tentatives.
recovery_check_noCode.instruction1=Vous avez peut-&ecirc;tre essay&eacute; de saisir le code de r&eacute;cup&eacute;ration trop de fois.
recovery_check_noCode.instruction2=Veuillez fermer le navigateur web et recommencer la r&eacute;cup&eacute;ration du compte dans dix minutes &agrave; partir de <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Selezionare la lingua
loainfo.description.200=Per accedere all'app &egrave; necessaria una verifica dei dati. La procedura pu&ograve; richiedere fino a 2&ndash;3 giorni lavorativi.
loainfo.description.300=Per accedere all'app dobbiamo verificare i suoi dati tramite uno dei due processi. Al prossimo passaggio, pu&ograve; selezionare la procedura di verifica desiderata.
loainfo.description.400=Per acceddere all'applicazione deve inserire il numero AVS.
loainfo.description.400=Per accedere all'applicazione &egrave; necessario inserire il numero AVS.
loainfo.helper=I dati devono essere verificati!
loainfo.later=Pi&ugrave; tardi
loainfo.startNow=Iniziare la procedura?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Il codice &egrave; troppo lungo
recovery_check_code.noAccess=Non ho il mio codice.
recovery_check_code.noCodeAccess=Conferma di non avere il codice di ripristino?
recovery_check_code.noCodeAccessInstructions=Se non ha pi&ugrave; il codice di ripristino, acceda ad AGOV help per contattare il supporto AGOV, che la assister&agrave; nel processo di ripristino.
recovery_check_code.too_many_tries.instruction1=Il codice di ripristino inserito pu&ograve; essere scaduto o &egrave; stato inserito troppe volte.
recovery_check_code.too_many_tries.instruction2=Si prega di andare alla guida di AGOV aiuto per contattare un agente dell'assistenza. Saranno in grado di aiutarla con il processo di recupero.
recovery_check_noCode.banner.error=Troppi tentativi.
recovery_check_noCode.instruction1=Potresti aver tentato di inserire il codice di ripristino troppe volte.
recovery_check_noCode.instruction2=Chiudi il browser web e inizia nuovamente il processo di ripristino dell'account tra dieci minuti da <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -0,0 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEidVerification'));
document.dispatchEvent(new Event('initCantonalBranding'));
});

View File

@ -0,0 +1,224 @@
#parse("${templatePath}/header.vm")
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-2 sm:max-w-full flex h-full sm:h-auto">
<div class="flex flex-col items-start gap-4 w-full rounded-[36px] sm:p-6 mx-auto
max-w-[600px] md:max-w-[1200px] sm:bg-lily-blue dark:sm:bg-purple-black">
<div id="cantonalBranding"
class="flex items-center rounded-xl gap-5 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white rounded sm:rounded-xl w-16 h-16" id="logo"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
<div class="flex flex-col md:flex-row w-full gap-6">
<div id="registerCard" class="w-full md:min-h-[689px] flex flex-col justify-between">
<div id="swiyuLoginImage"
class="relative md:max-w-[520px] max-w-[350px] sm:max-w-[300px] mb-10 w-full mx-auto hidden md:block">
<img alt="" src="${login.appDataPath}/static/images/login.svg"
class="hidden md:block dark:hidden w-full">
<img alt="" src="${login.appDataPath}/static/images/login-dark.svg"
class="hidden md:hidden dark:md:block w-full">
</div>
</div>
<div id="loginModal"
class="flex flex-col bg-white dark:bg-surface-black rounded-[20px] sm:min-h-[700px] p-6 sm:pb-8 sm:pt-10 sm:px-10
max-w-[550px] w-full">
<div class="flex mb-4 sm:mb-6 items-baseline">
<h1 class="font-header text-h4 text-space-blue dark:text-white mr-3">$text.get("eid_verification.login")</h1>
</div>
<div id="cantonalBrandingMobile"
class="flex items-center rounded-xl gap-5 mb-4 p-2 sm:p-0 sm:w-auto w-full hidden bg-pale-blue dark:bg-purple-black sm:bg-transparent">
<div class="flex items-center p-2 bg-white dark:bg-black rounded sm:rounded-xl w-16 h-16"
id="logoMobile"></div>
<h1 class="font-header text-h6 sm:text-h4 text-space-blue dark:text-white">
#if ($login.language =="en")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameEN').value)
#elseif ($login.language =="de")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameDE').value)
#elseif ($login.language =="fr")
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameFR').value)
#else
$utils.escapeHtmlAttribute($gui.getGuiElem('agov.appDisplayNameIT').value)
#end
</h1>
</div>
<div id="swiyuWalletAppModal" class="h-full">
<div class="desktopBanner" aria-live="assertive">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center p-4
mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.info")
</p>
</div>
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.success")
</p>
</div>
</div>
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center
p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.error")
</p>
</div>
</div>
<div class="relative flex flex-col h-full">
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-8 -left-4 -right-4
z-10"></div>
<div class="mobileBanner relative z-20" aria-live="assertive">
<div class="hidden info flex rounded-xl bg-info-background dark:bg-dark-info-background items-center
p-4 mb-4">
<i class="fa-regular fa-info-circle rounded-full p-3 text-info dark:text-dark-info bg-info/10 dark:bg-dark-info-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.info")
</p>
</div>
<div class="hidden success flex rounded-xl bg-success-background dark:bg-dark-success-background
items-center p-4 mb-4">
<i class="fa-regular fa-check-circle rounded-full p-3 text-success dark:text-dark-success bg-success/10 dark:bg-dark-success-icon mr-4 text-xl leading-none"></i>
<div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.success")
</p>
</div>
</div>
<div class="hidden error flex rounded-xl bg-error-background dark:bg-dark-error-background
items-center p-4 mb-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("eid_verification.banner.error")
</p>
</div>
</div>
<div id="swiyuLoginImageMobile"
class="hidden max-w-[200px] sm:max-w-full sm:w-full basis-1/2 mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block dark:hidden w-full">
<img alt=""
src="${login.appDataPath}/static/images/login-dark.svg"
class="hidden dark:block w-full">
</div>
<div id="QRCodeHolder">
<div class="relative">
<canvas role="img" aria-labelledby="labelQRCodeInstructions" id="swiyu_qrcode"
class="mb-6 mx-auto"></canvas>
<div class="hidden" id="QRcodeHiddenLink"></div>
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2
z-20">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg"
class="animate-spin hidden dark:block">
</span>
</div>
<a id="swiyuWalletAppLinkIpad" href="" class="hidden">
<agov-button
class="block basis-full mb-6"
data-name="swiyuWalletApp"
data-value="swiyuWalletApp"
data-id="swiyuWalletAppIpad"
data-label="$text.get("general.goSwiyuWalletApp")"
data-type="button"
data-fullwidth="true">
</agov-button>
</a>
<div class="swiyuWalletAppInstructions flex bg-indigo-light rounded-xl p-4 mb-2 items-center
dark:bg-purple-black">
<img alt="" src="${login.appDataPath}/static/images/access-app.svg" class="h-12 mr-4">
<p id="labelQRCodeInstructions" class="font-header text-h5 text-space-blue dark:text-white">
$text.get("eid_verification.instructions")
</p>
</div>
</div>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8" class="w-full sm:static mt-auto mb-20 sm:mb-0">
<div id="mobileButtons" class="hidden w-full">
<div class="flex flex-col">
<a id="swiyuWalletAppLink" href="">
<agov-button
class="block basis-full mb-4"
data-name="swiyuWalletApp"
data-value="swiyuWalletApp"
data-id="swiyuWalletApp"
data-label="$text.get("general.goSwiyuWalletApp")"
data-type="button"
data-fullwidth="true">
</agov-button>
</a>
<agov-button
id="showQR"
class="block basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"eid_verification.showQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
<agov-button
id="hideQR"
class="hidden basis-full"
data-style="frameless"
data-name="EID"
data-value="EID"
data-id="EID"
data-label="<i class='fa-regular fa-eye-slash align-middle text-xl text-indigo dark:text-lilac mr-2'></i>$text.get(
"eid_verification.hideQR")"
data-type="button"
data-fullwidth="true">
</agov-button>
</div>
</div>
<input class="hidden" name="authRequestId" type="hidden"
value="$gui.getGuiElem('authRequestId').value"/>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="${login.appDataPath}/static/js-code/eid_verification.js" defer>
</script>
<div id="appSamlRpEntityId" class="hidden" data-value="$gui.getGuiElem('agov.appSamlRpEntityId').value"
data-language="$login.language">
</div>
#parse("${templatePath}/footer.vm")

View File

@ -3,7 +3,7 @@
$text.get("footer.text")
<a target="_blank" class='text-hyperlink dark:text-dark-hyperlink underline' href='$text.get("footer.link")'>$text.get("footer.link.label")</a>
</div>
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -150,15 +150,15 @@
</p>
</div>
</div>
<div id="agovLoginImageMobile" class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full
mx-auto mb-6">
<div id="agovLoginImageMobile"
class="hidden max-w-[200px] sm:max-w-full sm:w-full basis-1/2 mx-auto mb-6">
<img alt=""
src="${login.appDataPath}/static/images/login.svg"
class="block sm:hidden md:block dark:hidden w-full">
class="block dark:hidden w-full">
<img alt=""
src="${login.appDataPath}/static/images/login-dark.svg"
class="dark:sm:hidden dark:md:block hidden dark:block w-full">
class="hidden dark:block w-full">
</div>
<div id="QRCodeHolder">
<div class="relative">
@ -242,7 +242,7 @@
</form>
</div>
</div>
<div id="securityKeyModal" class="hidden mt-16">
<div id="securityKeyModal" class="hidden sm:mt-16">
<h2 class="font-header text-h5 text-space-blue dark:text-white mt-4 text-center">
$text.get("mauth_usernameless.useSecurityKey")
@ -253,7 +253,7 @@
</p>
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8">
accept-charset="UTF-8" class="mb-20 sm:mb-0">
<agov-button
class="mb-4 block"
data-name="fallback"

View File

@ -82,14 +82,14 @@
</div>
</div>
<div id="agovLoginImageMobile"
class="hidden md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full basis-1/2 mx-auto mb-4">
class="hidden max-w-[200px] sm:max-w-full sm:w-full basis-1/2 mx-auto mb-4">
<img alt=""
src="${login.appDataPath}/static/images/recovery.svg"
class="block sm:hidden md:block dark:hidden w-full">
class="block w-full">
<img alt=""
src="${login.appDataPath}/static/images/recovery_dark.svg"
class="dark:sm:hidden dark:md:block hidden dark:block w-full">
class="hidden dark:block w-full">
</div>
<div id="QRCodeHolder">
<div class="relative">

View File

@ -2,116 +2,151 @@
<agov-backdrop></agov-backdrop>
<div id="mainContent" class="container mx-auto sm:mt-32 sm:max-w-full flex flex-auto sm:block">
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
<div class="flex flex-col-reverse sm:flex-row justify-evenly items-center gap-5 w-full">
<div class="flex flex-col sm:bg-white sm:dark:bg-surface-black rounded-[20px] sm:px-10 sm:py-10 max-w-[550px] w-full
basis-full md:basis-1/2 min-h-[535px]">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<span id="spinner" class="hidden absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-30">
<img src="${login.appDataPath}/static/images/spinner.svg" class="animate-spin block dark:hidden">
<img src="${login.appDataPath}/static/images/spinner-dark.svg" class="animate-spin hidden dark:block">
</span>
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col gap-8">
<div class="flex items-baseline">
<div id="blurBackdrop" class="hidden absolute backdrop-blur-sm -top-1 -bottom-96 -left-4 -right-4 z-20"></div>
<div class="flex flex-col gap-8">
<div class="flex items-baseline">
#set($error = $gui.getGuiElem("lasterror"))
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">
<h3 class="font-header text-h3 text-space-blue dark:text-white mr-3">
$text.get("general.recovery")
</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">
</h3>
<h4 class="font-header text-h4 text-disabled-grey dark:text-silver">
$text.get("general.entryCode")
</h4>
</div>
</h4>
</div>
#if (($error.value && $error.value != ""))
#if (($error.value == "locked"))
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.banner.lockedError")
</p>
</div>
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.too_many_tries.instruction1")
</p>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.too_many_tries.instruction2")
</p>
#else
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
<div class="error flex rounded-xl bg-error-background dark:bg-dark-error-background items-center p-4">
<i class="fa-regular fa-exclamation-circle rounded-full p-3 text-error dark:text-dark-error bg-error/10 dark:bg-dark-error-icon mr-4 text-xl leading-none"></i>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.codeIncorrect")
</p>
</div>
</p>
</div>
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.instruction")
</p>
#end
#else
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.instruction")
</p>
#end
<p class="font-body text-body-l text-space-blue dark:text-white">
$text.get("recovery_check_code.instruction")
</p>
</div>
</div>
#set ($formTarget = $utils.escapeHtmlAttribute($gui.target.replaceAll('&?language=[^&]*','')))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block">
<agov-input
id="recovery_code_input"
class="py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
data-placeholder=""
data-id="code"
data-name="code"
data-value=""
data-type="text"
data-autofocus="true"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
</agov-input>
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
data-value="cancelFido2"
data-id="cancelFido2"
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false">
</agov-button>
</div>
</div>
<input class="hidden" name="authRequestId" type="hidden" value="$gui.getGuiElem('authRequestId').value"/>
</form>
</div>
<form class="hidden"
id="$gui.name"
name="$gui.name"
method="POST"
target="_self"
action="$formTarget"
autocomplete="off"
accept-charset="UTF-8">
<agov-button
data-name="submit"
data-id="submitFormButton"
data-value="submit"
data-type="submit"
data-fullwidth="true">
</agov-button>
<input class="hidden" name="no_code" id="noCodeCheckbox" type="checkbox" value="true">
<input class="hidden" name="authRequestId" type="hidden" value="$gui.getGuiElem('authRequestId').value"/>
</form>
<img alt="" src="${login.appDataPath}/static/images/recovery.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 dark:hidden hidden md:block">
<img alt="" src="${login.appDataPath}/static/images/recovery_dark.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 hidden dark:md:block">
</div>
#if (($error.value && $error.value != "locked") || !($error.value))
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block">
<agov-input
id="recovery_code_input"
class="py-16"
data-label="$text.get("recovery_check_code.enterRecoveryCode")"
data-isLabelHidden="true"
data-placeholder=""
data-id="code"
data-name="code"
data-value=""
data-type="text"
data-autofocus="true"
data-email_invalid="$text.get("recovery_check_code.invalid.code")"
data-email_too_long="$text.get("recovery_check_code.invalid.code.tooLong")"
data-email_required="$text.get("recovery_check_code.invalid.code.required")">
</agov-input>
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn"
class="block basis-full"
data-name="confirm"
data-value="confirm"
data-id="confirm"
data-label="$text.get("general.confirm")"
data-type="submit"
data-fullwidth="true">
</agov-button>
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-style="frameless"
data-name="cancelFido2"
data-value="cancelFido2"
data-id="cancelFido2"
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false">
</agov-button>
<input class="hidden" name="authRequestId" type="hidden"
value="$gui.getGuiElem('authRequestId').value"/>
</div>
</div>
</form>
#else
<form id="$gui.name" name="$gui.name" method="POST" target="_self" action="$formTarget" autocomplete="off"
accept-charset="UTF-8"
class="flex flex-col flex-auto block">
<div class="w-full sm:static mt-auto mb-6 sm:mb-0">
<div class="flex flex-col flex-row-reverse gap-4">
<agov-button
id="recovery_code_btn_cancel"
class="block basis-full"
data-name="cancelFido2"
data-value="cancelFido2"
data-id="cancelFido2"
data-label="$text.get("recovery_check_code.noAccess")"
data-type="button"
data-fullwidth="true"
data-validate="false">
</agov-button>
<input class="hidden" name="authRequestId" type="hidden"
value="$gui.getGuiElem('authRequestId').value"/>
</div>
</div>
</form>
#end
</div>
<form class="hidden"
id="$gui.name"
name="$gui.name"
method="POST"
target="_self"
action="$formTarget"
autocomplete="off"
accept-charset="UTF-8">
<agov-button
data-name="submit"
data-id="submitFormButton"
data-value="submit"
data-type="submit"
data-fullwidth="true">
</agov-button>
<input class="hidden" name="no_code" id="noCodeCheckbox" type="checkbox" value="true">
<input class="hidden" name="authRequestId" type="hidden" value="$gui.getGuiElem('authRequestId').value"/>
</form>
<img alt="" src="${login.appDataPath}/static/images/recovery.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 dark:hidden hidden md:block">
<img alt="" src="${login.appDataPath}/static/images/recovery_dark.svg"
class="md:max-w-[520px] max-w-[350px] sm:max-w-[300px] w-full md:basis-1/2 hidden dark:md:block">
</div>
</div>
<script src="${login.appDataPath}/static/js-code/recovery_check_code.js">

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Sprache w&auml;hlen
loainfo.description.200=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben verifizieren. Der Vorgang kann bis zu 2 - 3 Tage dauern.
loainfo.description.300=Um auf diese Applikation zuzugreifen, m&uuml;ssen wir Ihre Angaben durch einen von zwei Vorg&auml;ngen verifizieren. Sie k&ouml;nnen die bevorzugte Methode im n&auml;chsten Schritt ausw&auml;hlen.
loainfo.description.400=F&uuml;r den Zugang zu dieser Anwendung m&uuml;ssen Sie Ihre AHV-Nummer angeben.
loainfo.description.400=Bitte AHV-Nummer angeben, um auf die Applikation zuzugreifen.
loainfo.helper=Ihre pers&ouml;nlichen Daten m&uuml;ssen &uuml;berpr&uuml;ft werden!
loainfo.later=Sp&auml;ter
loainfo.startNow=M&ouml;chten Sie den Prozess jetzt starten?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Eingegebener Code ist zu lang
recovery_check_code.noAccess=Ich kann auf meinen Code nicht zugreifen
recovery_check_code.noCodeAccess=Sind Sie sicher, dass Sie auf Ihren Wiederherstellungscode nicht zugreifen k&ouml;nnen?
recovery_check_code.noCodeAccessInstructions=Wenn Sie auf Ihren Wiederherstellungscode nicht mehr zugreifen k&ouml;nnen, gehen Sie bitte zur AGOV-Hilfe, um jemanden vom AGOV-Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_code.too_many_tries.instruction1=Der von Ihnen eingegebene Wiederherstellungscode ist m&ouml;glicherweise abgelaufen oder Sie haben zu oft versucht, einen Code einzugeben.
recovery_check_code.too_many_tries.instruction2=Gehen Sie bitte zur AGOV-Hilfe, um jemanden vom Support zu kontaktieren. Die Person wird Sie beim Wiederherstellungsprozess unterst&uuml;tzen.
recovery_check_noCode.banner.error=Zu viele Versuche.
recovery_check_noCode.instruction1=M&ouml;glicherweise haben Sie zu oft versucht, den Wiederherstellungscode einzugeben.
recovery_check_noCode.instruction2=Bitte schliessen Sie den Webbrowser und starten Sie die Kontowiederherstellung in zehn Minuten erneut auf <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Select language
loainfo.description.200=To access the application, we need to verify your data. The process can take up to 2 - 3 days.
loainfo.description.300=To access the application we need to verify your data through one of two processes. You can choose your preferred process in the next step.
loainfo.description.400=To access the application we need you to add your AHV Number (Swiss Social Security number).
loainfo.description.400=To access the application we need you to add your SSN (AHV) number.
loainfo.helper=Your data needs to be verified!
loainfo.later=Later
loainfo.startNow=Do you want to start the process now?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=The code is too long
recovery_check_code.noAccess=I do not have access to my code
recovery_check_code.noCodeAccess=Are you sure you don't have access to your recovery code?
recovery_check_code.noCodeAccessInstructions=If you have lost access to your recovery code please go to AGOV help in order to contact a AGOV support agent. They will be able to help you with the recovery process.
recovery_check_code.too_many_tries.instruction1=The recovery code you have entered might have expired or you might have tried to enter it too many times.
recovery_check_code.too_many_tries.instruction2=Please go to AGOV help in order to contact a support agent. They will be able to help you with the recovery process.
recovery_check_noCode.banner.error=Too many attempts.
recovery_check_noCode.instruction1=You might have tried to enter the recovery code too many times.
recovery_check_noCode.instruction2=Please close the web browser and start the account recovery again in ten minutes from <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=S&eacute;lectionner la langue
loainfo.description.200=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es. Ce processus peut prendre jusqu'&agrave; 2 ou 3 jours.
loainfo.description.300=Pour acc&eacute;der &agrave; l'application, nous devons v&eacute;rifier vos donn&eacute;es par le biais de l'une des deux proc&eacute;dures suivantes. Vous pouvez choisir la proc&eacute;dure que vous pr&eacute;f&eacute;rez &agrave; l'&eacute;tape suivante.
loainfo.description.400=Pour acc&eacute;der &agrave; l'application, vous devez ajouter votre num&eacute;ro AVS.
loainfo.description.400=Veuillez saisir votre num&eacute;ro AVS pour acc&eacute;der &agrave; l'application.
loainfo.helper=Vos donn&eacute;es doivent &ecirc;tre v&eacute;rifi&eacute;es!
loainfo.later=Plus tard
loainfo.startNow=Voulez-vous commencer le processus maintenant?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Le code est trop long
recovery_check_code.noAccess=Je n&rsquo;ai pas acc&egrave;s &agrave; mon code de r&eacute;cup&eacute;ration
recovery_check_code.noCodeAccess=&Ecirc;tes-vous s&ucirc;r de ne pas avoir acc&egrave;s &agrave; votre code de r&eacute;cup&eacute;ration ?
recovery_check_code.noCodeAccessInstructions=En cas de perte de votre code de r&eacute;cup&eacute;ration, veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance AGOV. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_code.too_many_tries.instruction1=Le code de r&eacute;cup&eacute;ration que vous avez saisi a peut-&ecirc;tre expir&eacute; ou vous avez peut-&ecirc;tre essay&eacute; de le saisir trop de fois.
recovery_check_code.too_many_tries.instruction2=Veuillez vous rendre sur AGOV help et contacter le service d&rsquo;assistance. Un agent pourra vous aider dans le processus de r&eacute;cup&eacute;ration.
recovery_check_noCode.banner.error=Trop de tentatives.
recovery_check_noCode.instruction1=Vous avez peut-&ecirc;tre essay&eacute; de saisir le code de r&eacute;cup&eacute;ration trop de fois.
recovery_check_noCode.instruction2=Veuillez fermer le navigateur web et recommencer la r&eacute;cup&eacute;ration du compte dans dix minutes &agrave; partir de <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -87,7 +87,7 @@ language.it=Italiano
languageDropdown.aria.label=Selezionare la lingua
loainfo.description.200=Per accedere all'app &egrave; necessaria una verifica dei dati. La procedura pu&ograve; richiedere fino a 2&ndash;3 giorni lavorativi.
loainfo.description.300=Per accedere all'app dobbiamo verificare i suoi dati tramite uno dei due processi. Al prossimo passaggio, pu&ograve; selezionare la procedura di verifica desiderata.
loainfo.description.400=Per acceddere all'applicazione deve inserire il numero AVS.
loainfo.description.400=Per accedere all'applicazione &egrave; necessario inserire il numero AVS.
loainfo.helper=I dati devono essere verificati!
loainfo.later=Pi&ugrave; tardi
loainfo.startNow=Iniziare la procedura?
@ -174,6 +174,8 @@ recovery_check_code.invalid.code.tooLong=Il codice &egrave; troppo lungo
recovery_check_code.noAccess=Non ho il mio codice.
recovery_check_code.noCodeAccess=Conferma di non avere il codice di ripristino?
recovery_check_code.noCodeAccessInstructions=Se non ha pi&ugrave; il codice di ripristino, acceda ad AGOV help per contattare il supporto AGOV, che la assister&agrave; nel processo di ripristino.
recovery_check_code.too_many_tries.instruction1=Il codice di ripristino inserito pu&ograve; essere scaduto o &egrave; stato inserito troppe volte.
recovery_check_code.too_many_tries.instruction2=Si prega di andare alla guida di AGOV aiuto per contattare un agente dell'assistenza. Saranno in grado di aiutarla con il processo di recupero.
recovery_check_noCode.banner.error=Troppi tentativi.
recovery_check_noCode.instruction1=Potresti aver tentato di inserire il codice di ripristino troppe volte.
recovery_check_noCode.instruction2=Chiudi il browser web e inizia nuovamente il processo di ripristino dell'account tra dieci minuti da <a class='link' href='https://agov.ch/me'>https://agov.ch/me</a>.

View File

@ -46,7 +46,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-2931fda661a24a257860d215bc321d6c0b494511"
tag: "r-d9f8becba9a6acfa30f490d16e18038ab79e9d92"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/proxy-idp"
credentials: "git-credentials"
keystores:

View File

@ -507,7 +507,7 @@
trace = request:getTracer()
if request:getHeader("Origin") then
if not response:getHeader("Access-Control-Allow-Origin") then
domains = {"trustbroker.agov-d.azure.adnovum.net", "auth.agov-w.azure.adnovum.net", "ob.agov-w.azure.adnovum.net"}
domains = {"trustbroker.agov-d.azure.adnovum.net", "auth.agov-w.azure.adnovum.net", "trustbroker-idp.agov-w.azure.adnovum.net", "ob.agov-w.azure.adnovum.net"}
for k, v in pairs(domains) do
trace:info("Accepted domains="..v)
end
@ -1597,10 +1597,10 @@
<param-value>true</param-value>
</init-param>
</servlet>
<!-- source: pattern://e0fda9336be9c69dafc9b69e, pattern://c642107fde6b2e07f16bfedb, pattern://decb9b3f88d430fb5c95f466 -->
<!-- source: pattern://e0fda9336be9c69dafc9b69e, pattern://a6f6dc6affdc7c692ff857b9, pattern://decb9b3f88d430fb5c95f466 -->
<servlet>
<servlet-name>Hosting_Default</servlet-name>
<!-- source: pattern://e0fda9336be9c69dafc9b69e, pattern://c642107fde6b2e07f16bfedb, pattern://decb9b3f88d430fb5c95f466 -->
<!-- source: pattern://e0fda9336be9c69dafc9b69e, pattern://a6f6dc6affdc7c692ff857b9, pattern://decb9b3f88d430fb5c95f466 -->
<servlet-class>ch::nevis::isiweb4::servlet::defaults::DefaultServlet</servlet-class>
</servlet>
<!-- source: pattern://cb8c63274fe346280de0ffd5 -->
@ -1671,7 +1671,7 @@
<servlet-name>Hosting_Default</servlet-name>
<url-pattern>/AUTH/RECOVERY/*</url-pattern>
</servlet-mapping>
<!-- source: pattern://c642107fde6b2e07f16bfedb -->
<!-- source: pattern://a6f6dc6affdc7c692ff857b9 -->
<servlet-mapping>
<servlet-name>Hosting_Default</servlet-name>
<url-pattern>/SAML2/SSO/*</url-pattern>

View File

@ -63,7 +63,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="/resources/static/bundle.js"></script>
</body>

View File

@ -60,7 +60,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="/resources/static/bundle.js"></script>
</body>

View File

@ -61,7 +61,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="/resources/static/bundle.js"></script>
</body>

View File

@ -62,7 +62,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="/resources/static/bundle.js"></script>
</body>

View File

@ -64,7 +64,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
</body>
<script src="/resources/static/bundle.js"></script>
@ -74,7 +74,11 @@
});
function loginAgain() {
window.location.href = window.location.origin;
if (window.history.length > 0) {
window.history.back();
} else {
window.location.href = window.location.origin;
}
}
</script>
</html>

View File

@ -66,7 +66,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="/resources/static/bundle.js"></script>
</body>

View File

@ -63,7 +63,7 @@
</div>
</div>
<footer class="hidden sm:flex mt-auto font-body text-body-s text-disabled-grey dark:text-silver w-full p-2 justify-end">
<p>1.9.0.2666-20250221T161345Z</p>
<p>1.10.0.local-20250321T164316Z-haburger: Tue Mar 25 11:16:24 CET 2025</p>
</footer>
<script src="/resources/static/bundle.js"></script>
</body>