diff --git a/patterns/584964c837512845d7940809_authStatesFile/recovery-preprocessing.xml b/patterns/584964c837512845d7940809_authStatesFile/recovery-preprocessing.xml index f923a11..d3f8ef6 100644 --- a/patterns/584964c837512845d7940809_authStatesFile/recovery-preprocessing.xml +++ b/patterns/584964c837512845d7940809_authStatesFile/recovery-preprocessing.xml @@ -201,16 +201,16 @@ - + - - - - - - + + + + + + - + @@ -231,4 +231,16 @@ + + + + + + + + + + + + diff --git a/patterns/584964c837512845d7940809_resources/recovery-processing.groovy b/patterns/584964c837512845d7940809_resources/recovery-processing.groovy index 064db9d..c485147 100644 --- a/patterns/584964c837512845d7940809_resources/recovery-processing.groovy +++ b/patterns/584964c837512845d7940809_resources/recovery-processing.groovy @@ -101,6 +101,8 @@ if (session['ch.adnovum.nevisidm.userDto'] != null && notes['lasterror'] == null session.setAttribute('agov.recovery.authnContextClassRef', 'urn:qa.agov.ch:names:tc:ac:classes:recovery') session.setAttribute('agov.recovery.authenticatedWith', 'urn:qa.agov.ch:names:tc:authfactor:email') + session.setAttribute('agov.recovery.codeStatus', 'notNeeded') + session.setAttribute('agov.recovery.codeDetailStatus', 'n/a') def maxLoiList = userDto.'**'.findAll { node -> node.name() == 'roles' && node.applicationName.text() == 'AGOV-Loi' }.collect({ node -> node.name.text() }) maxLoi = (maxLoiList == null || maxLoiList.isEmpty()) ? null : maxLoiList.sort().last() @@ -108,6 +110,10 @@ if (session['ch.adnovum.nevisidm.userDto'] != null && notes['lasterror'] == null def idVerification = null def agovAqValidFrom = null if (maxLoi) { + if (maxLoi != 'level100') { + session.setAttribute('agov.recovery.codeDetailStatus', '' + maxLoi) + } + idVerification = userDto.'**'.find { node -> node.name() == 'properties' && node.name.text() == 'idVerification' && node.scopeName.text() == 'AGOV-Loi,' + maxLoi}?.value?.text() idVerification = idVerification ?: 'None' agovAqValidFrom = userDto.'**'.find { node -> node.name() == 'authorizations' && node.role.name.text() == maxLoi}?.validFrom?.text() @@ -122,6 +128,7 @@ if (session['ch.adnovum.nevisidm.userDto'] != null && notes['lasterror'] == null if (mustRecover) { // attributes are defined over the mustRecover authorization session.setAttribute('agov.recovery.authnContextClassRef', 'urn:qa.agov.ch:names:tc:ac:classes:mustRecover') + session.setAttribute('agov.recovery.codeDetailStatus', 'mustRecover') idVerification = getUserIdVerificationForRecovery(maxLoi ?: 'level100') ?: idVerification @@ -144,7 +151,7 @@ if (session['ch.adnovum.nevisidm.userDto'] != null && notes['lasterror'] == null response.setSessionAttribute('agov.recovery.currentAgovAqRoleValidFrom', '' + agovAqValidFrom) if ((maxLoi == 'level100') && (mustRecover == null)) { - // AQ100 accounts need to used the recovery code, if they can + // AQ100 accounts need to use the recovery code, if they can // check the status of recoveryCode credential if (recoveryCode && !blockingCredentialStates.contains(recoveryCode.state.text())) { LOG.debug("Recovery: emailAndCode") @@ -152,11 +159,12 @@ if (session['ch.adnovum.nevisidm.userDto'] != null && notes['lasterror'] == null return } else { LOG.warn("AGOVaq100 recovery: skipped Recovery-Code check '${recoveryCode ? recoveryCode.state.text() : 'MISSING'}'") - response.setResult('ok') + session.setAttribute('agov.recovery.codeStatus', 'skipped') + session.setAttribute('agov.recovery.codeDetailStatus', "unusable (state: ${recoveryCode ? recoveryCode.state.text() : 'MISSING'})") + response.setResult('ok') return } - // mustRecover role not set, so code needs to be checked } else { LOG.debug("Recovery: email") response.setResult('ok') diff --git a/patterns/6061abea33a234fad73897b7_resources/handleRedirectRecovery.groovy b/patterns/6061abea33a234fad73897b7_resources/handleRedirectRecovery.groovy index 5af3525..49dfb99 100644 --- a/patterns/6061abea33a234fad73897b7_resources/handleRedirectRecovery.groovy +++ b/patterns/6061abea33a234fad73897b7_resources/handleRedirectRecovery.groovy @@ -8,8 +8,8 @@ if(outargs.containsKey('saml.SAMLResponse')) { def sourceIp = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown' def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown' - LOG.info("Event='GOTORECOVERY', Requester='${requester}', RequestId='${requestId}', RequestedAq=${requestedAq}, User=${user}, CredentialType='${credentialType}', SourceIp=${sourceIp}, UserAgent='${userAgent}', RecoveryInfo={ ctxClass: ${session['agov.recovery.authnContextClassRef']}, acctAq: ${session['agov.recovery.currentAgovAq']}}") - + LOG.info("Event='GOTORECOVERY', Requester='${requester}', RequestId='${requestId}', RequestedAq=${requestedAq}, User=${user}, CredentialType='${credentialType}', SourceIp=${sourceIp}, UserAgent='${userAgent}', AccountAq='${session['agov.recovery.currentAgovAq']}', AuthCtxClass='${session['agov.recovery.authnContextClassRef']}', RecoveryCodeStatus='${session['agov.recovery.codeStatus']}', RecoveryCodeDetailStatus='${session['agov.recovery.codeDetailStatus']}'") + // Redirect response.addOutArg('nevis.transfer.destination', parameters.get('agovmedirecturl')) response.addOutArg('nevis.transfer.field.SAMLResponse', outargs.getProperty('saml.SAMLResponse').bytes.encodeBase64().toString())