###
LemonLDAP::NG WebAuthn registration script
###
setMsg = (msg, level) ->
$('#msg').attr 'trspan', msg
$('#msg').html window.translate msg
$('#color').removeClass 'message-positive message-warning message-danger alert-success alert-warning alert-danger'
$('#color').addClass "message-#{level}"
level = 'success' if level == 'positive'
$('#color').addClass "alert-#{level}"
displayError = (j, status, err) ->
console.log 'Error', err
res = JSON.parse j.responseText
if res and res.error
res = res.error.replace(/.* /, '')
console.log 'Returned error', res
setMsg res, 'danger'
# Registration function (launched by "register" button)
register = ->
if !webauthnJSON.supported()
setMsg 'webAuthnUnsupported', 'warning'
return
# 1 get registration token
$.ajax
type: "POST",
url: "#{portal}2fregisters/webauthn/registrationchallenge"
data: {}
dataType: 'json'
error: displayError
success: (ch) ->
# 2 build response
request = {publicKey: ch.request}
e = jQuery.Event( "webauthnRegistrationAttempt" )
$(document).trigger e
if !e.isDefaultPrevented()
setMsg 'webAuthnRegisterInProgress', 'warning'
$('#u2fPermission').show()
webauthnJSON.create request
. then (response) ->
e = jQuery.Event( "webauthnRegistrationSuccess" )
$(document).trigger e, [ response ]
if !e.isDefaultPrevented()
$.ajax
type: "POST"
url: "#{portal}2fregisters/webauthn/registration"
data:
state_id: ch.state_id
credential: JSON.stringify response
keyName: $('#keyName').val()
dataType: 'json'
success: (resp) ->
if resp.error
if resp.error.match /badName/
setMsg resp.error, 'danger'
else setMsg 'webAuthnRegisterFailed', 'danger'
else if resp.result
e = jQuery.Event( "mfaAdded" )
$(document).trigger e, [ { "type": "webauthn" } ]
if !e.isDefaultPrevented()
window.location.href = window.portal + "2fregisters?continue=1"
error: displayError
, (error) ->
e = jQuery.Event( "webauthnRegistrationFailure" )
$(document).trigger e, [ error ]
if !e.isDefaultPrevented()
setMsg 'webAuthnBrowserFailed', 'danger'
# Verification function (launched by "verify" button)
verify = ->
if !webauthnJSON.supported()
setMsg 'webAuthnUnsupported', 'warning'
return
# 1 get challenge
$.ajax
type: "POST",
url: "#{portal}2fregisters/webauthn/verificationchallenge"
data: {}
dataType: 'json'
error: displayError
success: (ch) ->
# 2 build response
request = {publicKey: ch.request}
setMsg 'webAuthnBrowserInProgress', 'warning'
webauthnJSON.get request
. then (response) ->
$.ajax
type: "POST"
url: "#{portal}2fregisters/webauthn/verification"
data:
state_id: ch.state_id
credential: JSON.stringify response
dataType: 'json'
success: (resp) ->
if resp.error
setMsg 'webAuthnFailed', 'danger'
else if resp.result
setMsg 'yourKeyIsVerified', 'positive'
error: displayError
. catch (error) ->
setMsg 'webAuthnBrowserFailed', 'danger'
# Register "click" events
$(document).ready ->
$('#u2fPermission').hide()
$('#register').on 'click', register
$('#verify').on 'click', verify
setTimeout register, 1000
$('#retrybutton').on 'click', register
$('#goback').attr 'href', portal