new configuration version

This commit is contained in:
haburger 2024-08-20 13:22:05 +00:00
parent 8c35dcea34
commit 14e6676dfb
18 changed files with 118 additions and 80 deletions

View File

@ -40,7 +40,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-95871349e8265b00ad7b2829249e4f29cab5d6ab"
tag: "r-97c309f84e290a99578b1666c8e6fbb2cde07963"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/auth"
credentials: "git-credentials"
keystores:

View File

@ -379,15 +379,11 @@
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="email" type="text" label="prompt.email" value="#{(inargs.getProperty('userInputValue_prompt.email') != null) ? inargs.getProperty('userInputValue_prompt.email') : session.get('ch.nevis.idm.User.email')}" optional="true"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="accountUrl" type="hidden" value="${sess:agov.fido2.json.accountUrl}" optional="true"/>
<GuiElem name="captchaSettings.enabled" type="hidden" value="${sess:agov.fido2.captchaSettings.enabled}" optional="true"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="registrationUrl" type="hidden" value="${sess:agov.fido2.json.registrationUrl}" optional="true"/>
<GuiElem name="friendlyCaptchaSettings.siteKey" type="hidden" value="${sess:agov.fido2.captchaSettings.siteKey}" optional="true"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="captchaSettings.enabled" type="hidden" value="${sess:agov.fido2.json.captchaSettings.enabled}" optional="true"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="friendlyCaptchaSettings.siteKey" type="hidden" value="${sess:agov.fido2.json.captchaSettings.siteKey}" optional="true"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="friendlyCaptchaSettings.puzzleUrl" type="hidden" value="${sess:agov.fido2.json.captchaSettings.puzzleUrl}" optional="true"/>
<GuiElem name="friendlyCaptchaSettings.puzzleUrl" type="hidden" value="${sess:agov.fido2.captchaSettings.puzzleUrl}" optional="true"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
<GuiElem name="cancelFido2" type="submit" label="cancel.button.label" value="cancelFido2"/>
<!-- source: pattern://e3cac41e75980361d7d26bde -->
@ -1566,26 +1562,18 @@
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="cancel, hasCaptchaInfos" next="Auth_Realm_Recovery_Recovery_handleCode"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="cancel, hasCaptchaInfos, visible" next="Auth_Realm_Recovery_Recovery_handleCode"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="default" next="Auth_Realm_Recovery_Recovery_fetchCaptchaInfos"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCaptchaInfos" next="Auth_Realm_Recovery_Recovery_Auth_loginFactorQuestion"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCaptchaInfos, continue" next="Auth_Realm_Recovery_Recovery_fetchCaptchaResult"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCaptchaInfos, continue, visible" next="Auth_Realm_Recovery_Recovery_Auth_enterEmail"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCaptchaInfos, invalidUrlTicket" next="Auth_Realm_Recovery_Recovery_Auth_enterEmail"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCaptchaInfos, invalidUrlTicket, visible" next="Auth_Realm_Recovery_Recovery_Auth_enterEmail"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCode" next="Auth_Realm_Recovery_Recovery_handleCode"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCode, hasCaptchaInfos" next="Auth_Realm_Recovery_Recovery_handleCode"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCode, hasCaptchaInfos, visible" next="Auth_Realm_Recovery_Recovery_handleCode"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasCode, hasSessionCode" next="Auth_Realm_Recovery_Recovery_handleCode"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="hasSessionCode" next="Auth_Realm_Recovery_Recovery_Auth_verifyUrlTicketIntro"/>
@ -1596,8 +1584,6 @@
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="invalidUrl, hasCaptchaInfos" next="Auth_Realm_Recovery_Recovery_Auth_ticketInvalid"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="invalidUrl, hasCaptchaInfos, visible" next="Auth_Realm_Recovery_Recovery_Auth_ticketInvalid"/>
<!-- source: pattern://584964c837512845d7940809 -->
<ResultCond name="invalidUrlTicket" next="Auth_Realm_Recovery_Recovery_fetchCaptchaInfos"/>
<!-- source: pattern://584964c837512845d7940809 -->
<Response value="AUTH_CONTINUE">
@ -1611,15 +1597,11 @@
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:hasSessionCode" value="#{sess.get('agov.recovery.code')}"/>
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:hasCaptchaInfos" value="#{sess.get('agov.recovery.json.accountUrl')}"/>
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:continue" value="#{inargs.containsKey('continue')}"/>
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:visible" value="#{sess.get('agov.recovery.X-ReCAPTCHA-Integration') eq 'VISIBLE'}"/>
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:invalidUrl" value="#{!inctx.getProperty('connection.actualURL').matches('((https://.*/AUTH/RECOVERY/\\?$)|(https://.*/AUTH/RECOVERY/$)|(https://.*/AUTH/RECOVERY/\\?language=(de|fr|it|en))|(https://.*/AUTH/RECOVERY/\\?cd=.*))')}"/>
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:invalidUrlTicket" value="${notes:invalidUrlTicket}"/>
<!-- source: pattern://584964c837512845d7940809 -->
<property name="condition:hasCaptchaInfos" value="#{sess.get('agov.recovery.captchaSettings.puzzleUrl')}"/>
</AuthState>
<AuthState name="Auth_Realm_Recovery_Recovery_handleCode" class="ch.nevis.esauth.auth.states.scripting.ScriptState" final="false">
<!-- source: pattern://db4acd487dc7e8b82de8abb4 -->
@ -1649,6 +1631,8 @@
<!-- source: pattern://bea3ca0c85381d07d632be52 -->
<property name="parameter.url" value="https://utility.agov-d.azure.adnovum.net/utility/api/v1/configinfo"/>
<!-- source: pattern://bea3ca0c85381d07d632be52 -->
<property name="scriptTraceGroup" value="AgovCaptcha"/>
<!-- source: pattern://bea3ca0c85381d07d632be52 -->
<property name="script" value="file:///var/opt/nevisauth/default/conf/recovery_fetchcaptchainfos.groovy"/>
</AuthState>
<AuthState name="Auth_Realm_Recovery_Recovery_Auth_loginFactorQuestion" class="ch.nevis.esauth.auth.states.standard.ConditionalDispatcherState" final="true" resumeState="true">
@ -1692,11 +1676,9 @@
<Arg name="ch.nevis.isiweb4.response.status" value="403"/>
</Response>
<!-- source: pattern://717094cbd4ddbadeab4b2cc1 -->
<property name="parameter.ip" value="#{inctx.get('connection.HttpHeader.X-Real-IP')}"/>
<!-- source: pattern://717094cbd4ddbadeab4b2cc1 -->
<property name="parameter.url" value="https://utility.agov-d.azure.adnovum.net/utility/api/v2/captcha/"/>
<!-- source: pattern://717094cbd4ddbadeab4b2cc1 -->
<property name="parameter.userAgent" value="#{inctx.get('connection.HttpHeader.user-agent')}"/>
<property name="scriptTraceGroup" value="AgovCaptcha"/>
<!-- source: pattern://717094cbd4ddbadeab4b2cc1 -->
<property name="script" value="file:///var/opt/nevisauth/default/conf/recovery_fetchcaptcharesult.groovy"/>
</AuthState>
@ -1720,17 +1702,11 @@
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="email" type="text" label="prompt.email" value="#{(sess.containsKey('agov.recovery.email'))?sess.get('agov.recovery.email'):inargs.getProperty('email', '')}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="accountUrl" type="hidden" value="${sess:agov.recovery.json.accountUrl}" optional="true"/>
<GuiElem name="captchaSettings.enabled" type="hidden" value="${sess:agov.recovery.captchaSettings.enabled}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="registrationUrl" type="hidden" value="${sess:agov.recovery.json.registrationUrl}" optional="true"/>
<GuiElem name="friendlyCaptchaSettings.siteKey" type="hidden" value="${sess:agov.recovery.captchaSettings.siteKey}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="captchaSettings.enabled" type="hidden" value="${sess:agov.recovery.json.captchaSettings.enabled}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="captchaSettings.reCaptchaInvisibleSiteKey" type="hidden" value="${sess:agov.recovery.json.captchaSettings.reCaptchaInvisibleSiteKey}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="captchaSettings.reCaptchaVisibleSiteKey" type="hidden" value="${sess:agov.recovery.json.captchaSettings.reCaptchaVisibleSiteKey}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="X-ReCAPTCHA-Integration" type="hidden" value="${sess:agov.recovery.X-ReCAPTCHA-Integration}" optional="true"/>
<GuiElem name="friendlyCaptchaSettings.puzzleUrl" type="hidden" value="${sess:agov.recovery.captchaSettings.puzzleUrl}" optional="true"/>
<!-- source: pattern://584964c837512845d7940809 -->
<GuiElem name="cancel" type="submit" label="cancel.button.label" value="cancel"/>
<!-- source: pattern://584964c837512845d7940809 -->

View File

@ -15,8 +15,6 @@ try {
if (httpResponse.code() == 200) {
def json = jsonSlurper.parseText(httpResponse.bodyAsString())
response.setSessionAttribute('agov.fido2.json.accountUrl', json.accountUrl)
response.setSessionAttribute('agov.fido2.json.registrationUrl', json.registrationUrl)
// TODO/haburger/2024-AUG-20: remove if reCaptcha is not needed anymore
// response.setSessionAttribute('agov.fido2.json.captchaSettings.enabled', String.valueOf(json.captchaSettings.enabled))
@ -29,9 +27,9 @@ try {
// response.setSessionAttribute('agov.fido2.X-ReCAPTCHA-Integration', 'VISIBLE')
// }
response.setSessionAttribute('agov.fido2.json.captchaSettings.enabled', String.valueOf(json.friendlyCaptureClientSettings.enabled))
response.setSessionAttribute('agov.fido2.json.captchaSettings.siteKey', json.friendlyCaptureClientSettings.siteKey)
response.setSessionAttribute('agov.fido2.json.captchaSettings.puzzleUrl', json.friendlyCaptureClientSettings.puzzleUrl)
response.setSessionAttribute('agov.fido2.captchaSettings.enabled', String.valueOf(json.friendlyCaptureClientSettings.enabled))
response.setSessionAttribute('agov.fido2.captchaSettings.siteKey', json.friendlyCaptureClientSettings.siteKey)
response.setSessionAttribute('agov.fido2.captchaSettings.puzzleUrl', json.friendlyCaptureClientSettings.puzzleUrl)
response.setResult('ok')
} else {

View File

@ -1,5 +1,3 @@
//import ch.nevis.esauth.util.httpclient.api.HttpClients
//import ch.nevis.esauth.util.httpclient.api.Http
import groovy.json.JsonSlurper
def url = parameters.get('url')
@ -8,22 +6,30 @@ try {
def jsonSlurper = new JsonSlurper()
def httpClient = HttpClients.create(parameters)
def httpResponse = Http.get().url(url).build().send(httpClient)
LOG.info('Response Message: ' + httpResponse.reasonPhrase())
LOG.info('Response Status Code: ' + httpResponse.code())
LOG.info('Response: ' + httpResponse.bodyAsString())
LOG.debug('Response Message: ' + httpResponse.reasonPhrase())
LOG.debug('Response Status Code: ' + httpResponse.code())
LOG.debug('Response: ' + httpResponse.bodyAsString())
if (httpResponse.code() == 200) {
def json = jsonSlurper.parseText(httpResponse.bodyAsString())
response.setSessionAttribute('agov.recovery.json.accountUrl', json.accountUrl)
response.setSessionAttribute('agov.recovery.json.registrationUrl', json.registrationUrl)
response.setSessionAttribute('agov.recovery.json.captchaSettings.enabled', String.valueOf(json.captchaSettings.enabled))
response.setSessionAttribute('agov.recovery.json.captchaSettings.reCaptchaInvisibleSiteKey', json.captchaSettings.reCaptchaInvisibleSiteKey)
response.setSessionAttribute('agov.recovery.json.captchaSettings.reCaptchaVisibleSiteKey', json.captchaSettings.reCaptchaVisibleSiteKey)
if (session.get('agov.recovery.X-ReCAPTCHA-Integration') == null) {
response.setSessionAttribute('agov.recovery.X-ReCAPTCHA-Integration', 'INVISIBLE')
} else {
response.setSessionAttribute('agov.recovery.X-ReCAPTCHA-Integration', 'VISIBLE')
}
// TODO/haburger/2024-AUG-20: remove if reCaptcha is not needed anymore
// response.setSessionAttribute('agov.recovery.json.accountUrl', json.accountUrl)
// response.setSessionAttribute('agov.recovery.json.registrationUrl', json.registrationUrl)
// response.setSessionAttribute('agov.recovery.json.captchaSettings.enabled', String.valueOf(json.captchaSettings.enabled))
// response.setSessionAttribute('agov.recovery.json.captchaSettings.reCaptchaInvisibleSiteKey', json.captchaSettings.reCaptchaInvisibleSiteKey)
// response.setSessionAttribute('agov.recovery.json.captchaSettings.reCaptchaVisibleSiteKey', json.captchaSettings.reCaptchaVisibleSiteKey)
// if (session.get('agov.recovery.X-ReCAPTCHA-Integration') == null) {
// response.setSessionAttribute('agov.recovery.X-ReCAPTCHA-Integration', 'INVISIBLE')
// } else {
// response.setSessionAttribute('agov.recovery.X-ReCAPTCHA-Integration', 'VISIBLE')
// }
response.setSessionAttribute('agov.recovery.captchaSettings.enabled', String.valueOf(json.captchaSettings.enabled))
response.setSessionAttribute('agov.recovery.captchaSettings.siteKey', json.friendlyCaptureClientSettings.siteKey)
response.setSessionAttribute('agov.recovery.json.captchaSettings.puzzleUrl', json.friendlyCaptureClientSettings.puzzleUrl)
response.setResult('ok')
} else {
LOG.error('Unexcpected HTTP response code: ' + httpResponse.code())

View File

@ -1,13 +1,15 @@
//import ch.nevis.esauth.util.httpclient.api.HttpClients
//import ch.nevis.esauth.util.httpclient.api.Http
def url = parameters.get('url')
def email = inargs['email']
def payload = '{ "email": "' + inargs['email'] + '", "action": "LOGIN", "userIp": "' + session.get('agov.recovery.ip') + '", "userAgent": "' + session.get('agov.recovery.userAgent') + '"}'
LOG.info('Token: ' + inargs['recaptcha_response'])
LOG.info('Integration: ' + session['agov.recovery.X-ReCAPTCHA-Integration'])
LOG.info('Payload: ' + payload)
def email = inargs['email']
def token = inargs['captcha_response']?: 'MISSING'
def ip = request.getLoginContext()['connection.HttpHeader.X-Real-IP'] ?: 'unknown'
def userAgent = request.getLoginContext()['connection.HttpHeader.user-agent'] ?: request.getLoginContext()['connection.HttpHeader.User-Agent'] ?: 'unknown'
def payload = "{ \"userIp\": \"${ip}\", \"email\": \"${email}\", \"userAgent\": \"${userAgent}\" }"
LOG.debug('Token: ' + token)
LOG.debug('Payload: ' + payload)
try {
@ -15,38 +17,86 @@ try {
def httpResponse = Http.post()
.url(url)
.header("Accept", "application/json")
.header("X-ReCAPTCHA-Token", inargs['recaptcha_response'])
.header("X-ReCAPTCHA-Integration", session['agov.recovery.X-ReCAPTCHA-Integration'])
.header("X-FriendlyCAPTCHA-Token", token)
.entity(Http.entity()
.content(payload)
.contentType("application/json")
// .charSet("utf-8")
.build())
.build()
.send(httpClient)
LOG.info('Response Message: ' + httpResponse.reasonPhrase())
LOG.info('Response Status Code: ' + httpResponse.code())
LOG.info('Response: ' + httpResponse.bodyAsString())
LOG.debug('Response Message: ' + httpResponse.reasonPhrase())
LOG.debug('Response Status Code: ' + httpResponse.code())
LOG.debug('Response: ' + httpResponse.bodyAsString())
if (httpResponse.code() == 200) {
if (httpResponse.bodyAsString().contains('SUCCESSFUL')) {
response.setResult('ok')
return
} else {
response.setSessionAttribute('agov.recovery.X-ReCAPTCHA-Integration', 'VISIBLE')
LOG.warn("Friendly captcha not successful for '{ \"userIp\": \"${ip}\", \"email\": \"${email}\", \"userAgent\": \"${userAgent}\" }'")
response.setResult('exit.1')
return
}
} else {
LOG.error('Unexcpected HTTP response code: ' + httpResponse.code())
LOG.error("Friendly captcha failed with statuscode ${httpResponse.code()} for '{ \"userIp\": \"${ip}\", \"email\": \"${email}\", \"userAgent\": \"${userAgent}\" }'")
response.setResult('error')
response.setError(1, 'Unexpected HTTP reponse')
}
} catch (all) {
// Handle exception and set the transition
LOG.error('error: ' + all, all)
LOG.error("Friendly captcha failed with a general error '${all}' for '{ \"userIp\": \"${ip}\", \"email\": \"${email}\", \"userAgent\": \"${userAgent}\" }', service-url: ${url}")
response.setResult('error')
response.setError(1, 'Exception during HTTP call')
}
}
// TODO/haburger/2024-AUG-20: remove if reCaptcha is not needed anymore
// def payload = '{ "email": "' + inargs['email'] + '", "action": "LOGIN", "userIp": "' + session.get('agov.recovery.ip') + '", "userAgent": "' + session.get('agov.recovery.userAgent') + '"}'
//
// LOG.info('Token: ' + inargs['recaptcha_response'])
// LOG.info('Integration: ' + session['agov.recovery.X-ReCAPTCHA-Integration'])
// LOG.info('Payload: ' + payload)
//
// try {
//
// def httpClient = HttpClients.create(parameters)
// def httpResponse = Http.post()
// .url(url)
// .header("Accept", "application/json")
// .header("X-ReCAPTCHA-Token", inargs['recaptcha_response'])
// .header("X-ReCAPTCHA-Integration", session['agov.recovery.X-ReCAPTCHA-Integration'])
// .entity(Http.entity()
// .content(payload)
// .contentType("application/json")
// // .charSet("utf-8")
// .build())
// .build()
// .send(httpClient)
//
// LOG.info('Response Message: ' + httpResponse.reasonPhrase())
// LOG.info('Response Status Code: ' + httpResponse.code())
// LOG.info('Response: ' + httpResponse.bodyAsString())
//
// if (httpResponse.code() == 200) {
// if (httpResponse.bodyAsString().contains('SUCCESSFUL')) {
// response.setResult('ok')
// return
// } else {
//
// response.setSessionAttribute('agov.recovery.X-ReCAPTCHA-Integration', 'VISIBLE')
// response.setResult('exit.1')
// return
// }
// } else {
// LOG.error('Unexcpected HTTP response code: ' + httpResponse.code())
// response.setResult('error')
// response.setError(1, 'Unexpected HTTP reponse')
// }
// } catch (all) {
// // Handle exception and set the transition
// LOG.error('error: ' + all, all)
// response.setResult('error')
// response.setError(1, 'Exception during HTTP call')
// }

View File

@ -40,7 +40,7 @@ spec:
podDisruptionBudget:
maxUnavailable: "50%"
git:
tag: "r-76a9542c5c919177c7b3c1903a1140c1e7274683"
tag: "r-97c309f84e290a99578b1666c8e6fbb2cde07963"
dir: "DEFAULT-ADN-AGOV-PROJECT/DEFAULT-ADN-AGOV-INV/logrend"
credentials: "git-credentials"
podSecurity:

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

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.6.0.local-20240814T114715Z-haburger: Tue Aug 20 09:49:43 CEST 2024</p>
<p>1.6.0.local-20240820T093331Z-haburger: Tue Aug 20 13:19:21 CEST 2024</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -82,6 +82,7 @@
}
</script>
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"

View File

@ -53,6 +53,7 @@
}
</script>
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

View File

@ -1,3 +1,4 @@
document.addEventListener('DOMContentLoaded', function() {
document.dispatchEvent(new Event('initEmail'));
document.dispatchEvent(new Event('initCaptcha'));
});

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.6.0.local-20240814T114715Z-haburger: Tue Aug 20 09:49:43 CEST 2024</p>
<p>1.6.0.local-20240820T093331Z-haburger: Tue Aug 20 13:19:21 CEST 2024</p>
</footer>
<script src="${login.appDataPath}/static/bundle.js"></script>
</body>

View File

@ -82,6 +82,7 @@
}
</script>
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"

View File

@ -53,6 +53,7 @@
}
</script>
<div class="frc-captcha"
id="frc-captcha"
data-puzzle-endpoint="$puzzleUrl.value"
data-sitekey="$siteKey.value"
data-start="auto"