diff --git a/LICENSE b/LICENSE index 261eeb9..d645695 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,4 @@ + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ diff --git a/README.md b/README.md index f46dacc..f7cdb39 100644 --- a/README.md +++ b/README.md @@ -1 +1,157 @@ -# agama-passkey \ No newline at end of file +# Agama Passkey Project + + +[![Contributors][contributors-shield]][contributors-url] +[![Forks][forks-shield]][forks-url] +[![Stargazers][stars-shield]][stars-url] +[![Issues][issues-shield]][issues-url] +[![Apache License][license-shield]][license-url] + +Use this project to authenticate using security devices (Android Touch, iOS Face Id, Yubico Key, Windows Hello, Touch ID on Mac, etc.) + +## How it works at a glance + +When a main flow of this project is launched (namely `org.gluu.agama.passkey.main`) the user's browser is +redirected to a view where he/she must first enter your username and password, then show a list of passkeys that you have +registered, in case you do not have one you must register one, once you have registered your passkey you can complete +the authentication step with passkey. +But you can also log in from the initial screen without entering a c redential. + +## Project Deployment + +To deploy this project we need to meet the requirements. + +### Requirements + +1. Running instance of `Jans Auth Server`, `Jans Fido2`, `Jans Casa` and `Jans Scim` + +### Add Java dependencies + +1. Download + latest [agama-passkey-custom.jar](https://github.com/GluuFederation/agama-passkey/releases/latest/download/agama-passkey-custom.jar) + from [Releases](https://github.com/GluuFederation/agama-passkey/releases) +2. `scp` the jar file to `/opt/jans/jetty/jans-auth/custom/libs/` on Auth Server +3. On Auth Server, edit `/opt/jans/jetty/jans-auth/webapps/jans-auth.xml` and + add the jar file to the `...` element. For example: + +``` + + /jans-auth + + /jans-auth.war + + true + + ... + /opt/jans/jetty/jans-auth/custom/libs/agama-passkey-custom.jar, + ... + + +``` + +4. Restart Auth Server to load the new jar: + +``` +systemctl restart jans-auth +```` + +### Deployment + +Download the +latest [agama-passkey.gama](https://github.com/GluuFederation/agama-passkey/releases/latest/download/agama-passkey.gama) +file and deploy it in Auth Sever. + +Follow the steps below: + +- Copy (SCP/SFTP) the gama file of this project to a location in your `Jans Server` +- Connect (SSH) to your `Jans Server` and open TUI: `python3 /opt/jans/jans-cli/jans_cli_tui.py` +- Navigate to the `Agama` tab and then select `"Upload project"`. Choose the gama file +- Wait for about one minute and then select the row in the table corresponding to this project +- Press `d` and ensure there were not deployment errors +- Pres `ESC` to close the dialog + +![TUI_AGAMA_DEPLOY](https://github.com/GluuFederation/agama-passkey/assets/86965029/1d6b8cab-ddad-451c-b620-d19be1b7f9e3) + +### Configure Jans Scim + +- Once we have deployed the `agama project`, we need to configure the `jans scim` parameters, then we proceed to create a new user `jans scim` with scope `https://jans.io/scim/fido2.read` and `https://jans.io/scim/fido2.write`. +- Now that we have the jans scim client, we proceed to configure this client using TUI. +- We open TUI and we are located in agama, we select in the table where our application is deployed and press `c`, this will open a configuration panel, where we must first hit `Export Sample Config` and save the file in some path. +- Now we go to the exported file and edit it and enter the credentials + +``` +{ + "org.gluu.agama.passkey.add": {}, + "org.gluu.agama.passkey.nickname": {}, + "org.gluu.agama.passkey.list": {}, + "org.gluu.agama.passkey.main": { + "scimClientId": "YOUR_SCIM_CLIENT_ID", + "scimClientSecret": "YOUR_SCIM_CLIENT_SECRET" + } +} +``` + +- We go back to the TUI and click on `Import Configuration` and select the modified configuration file with our parameters. +- With this, our `agama project` is now configured and we can start testing. + +![TUI_SCIM_CONFIGURATION](https://github.com/GluuFederation/agama-passkey/assets/86965029/404b066e-a6f3-4c1e-9bf8-afe3f63121e7) + +## Testing + +You'll need an OpenID Connect test RP. You can try [oidcdebugger](https://oidcdebugger.com/), +[jans-tarp](https://github.com/JanssenProject/jans/tree/main/demos/jans-tarp) +or [jans-tent](https://github.com/JanssenProject/jans/tree/main/demos/jans-tent). Check out this video to see an example +of **agama-passkey** in action: + +### Use case 1: + +Login with credentials and configure your first passkey device and as a last step complete the login with your new configured key. + +![TEST_USE_CASE_1](https://github.com/GluuFederation/agama-passkey/assets/86965029/0e5cc346-a576-499a-a9e3-6069d6932a4b) + +### Use case 2: + +Log in without credentials, use the `Login with passkey` button. + + +![TEST_USE_CASE_2](https://github.com/GluuFederation/agama-passkey/assets/86965029/200328ec-888a-4767-8242-1c50a126a979) + +# Contributors + + + + + +
+ + Milton +
+ Milton Ch. +
+
+ +# License + +This project is licensed under the [Apache 2.0](https://github.com/GluuFederation/agama-security-key/blob/main/LICENSE) + + + +[contributors-shield]: https://img.shields.io/github/contributors/GluuFederation/agama-passkey.svg?style=for-the-badge + +[contributors-url]: https://github.com/GluuFederation/agama-passkey/graphs/contributors + +[forks-shield]: https://img.shields.io/github/forks/GluuFederation/agama-passkey.svg?style=for-the-badge + +[forks-url]: https://github.com/GluuFederation/agama-passkey/network/members + +[stars-shield]: https://img.shields.io/github/stars/GluuFederation/agama-passkey?style=for-the-badge + +[stars-url]: https://github.com/GluuFederation/agama-passkey/stargazers + +[issues-shield]: https://img.shields.io/github/issues/GluuFederation/agama-passkey.svg?style=for-the-badge + +[issues-url]: https://github.com/GluuFederation/agama-passkey/issues + +[license-shield]: https://img.shields.io/github/license/GluuFederation/agama-passkey.svg?style=for-the-badge + +[license-url]: https://github.com/GluuFederation/agama-passkey/blob/main/LICENSE diff --git a/code/README.md b/code/README.md new file mode 100644 index 0000000..dd58691 --- /dev/null +++ b/code/README.md @@ -0,0 +1 @@ +### Web folder \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.add.flow b/code/org.gluu.agama.passkey.add.flow new file mode 100644 index 0000000..45ad9dc --- /dev/null +++ b/code/org.gluu.agama.passkey.add.flow @@ -0,0 +1,35 @@ +Flow org.gluu.agama.passkey.add + Basepath "" + Inputs userData +inum = userData.inum +fidoEnroller = Call org.gluu.agama.passkey.enroll.FidoEnroller#new +obj = { attestation: "{}", isAttestation: false, showError: false, errorTitle: "", errorMessage: "" } +Repeat 50 times max + addDeviceForm = RRF "passkey-add.ftlh" obj + When addDeviceForm.addPasskeyBtn is "" + detestable = Call fidoEnroller getAttestationMessage inum + obj.isAttestation = true + obj.attestation = detestable + obj.showError = false + When addDeviceForm.skipped is "skipped" + obj.isAttestation = false + obj.showError = true + obj.errorTitle = "Passkey registration failed." + obj.errorMessage = addDeviceForm.errorMessage + When addDeviceForm.tokenResponse is not "" + key | E = Call fidoEnroller verifyRegistration inum addDeviceForm.tokenResponse + When E is null and key is not null + nicknameTrigger = Trigger org.gluu.agama.passkey.nickname key userData + obj.isAttestation = false + it_lyocp = {success:true, data: { userId: inum, response: nicknameTrigger }} + Finish it_lyocp + When E is not null + obj.isAttestation = false + obj.showError = true + obj.errorTitle = "Passkey registration failed." + obj.errorMessage = E.message + When addDeviceForm.cancelBtn is "" + it_bksml = {success:false, error: "Cancel event"} + Finish it_bksml +it_zodfn = {success:false, error: "Passkey registration attempt exceeded."} +Finish it_zodfn \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.add.json b/code/org.gluu.agama.passkey.add.json new file mode 100644 index 0000000..07cd818 --- /dev/null +++ b/code/org.gluu.agama.passkey.add.json @@ -0,0 +1,1552 @@ +{ + "nodes": [ + { + "width": 170, + "height": 124, + "id": "finish-aa9b5b7b-1306-4e1b-ac11-bc113973efcc", + "position": { + "x": 3147.929153619497, + "y": 550.0203304705267 + }, + "type": "finish", + "data": { + "id": "finish-aa9b5b7b-1306-4e1b-ac11-bc113973efcc", + "type": "Agama-finish-Flow", + "parentId": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "whenCondition": "", + "inRepeatBlock": true, + "handles": [], + "position": { + "x": 3147.929153619497, + "y": 550.0203304705267 + }, + "agamaData": { + "id": "finish-aa9b5b7b-1306-4e1b-ac11-bc113973efcc", + "parentId": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "{ userId: inum, response: nicknameTrigger }", + "nodeIcon": "material-symbols:line-end-square-rounded", + "finishMode": "withSuccess", + "displayName": "Response success" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 3147.929153619497, + "y": 550.0203304705267 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "position": { + "x": 2947.929153619497, + "y": 551.3813347221254 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "type": "Agama-assignment-Node", + "parentId": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 2947.929153619497, + "y": 551.3813347221254 + }, + "agamaData": { + "id": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "parentId": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAttestation" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 2947.929153619497, + "y": 551.3813347221254 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "position": { + "x": 2732.929153619497, + "y": 551.3813347221254 + }, + "type": "trigger", + "data": { + "id": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "type": "Agama-trigger-Node", + "parentId": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2747.929153619497, + "y": 551.3813347221254 + }, + "agamaData": { + "id": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "parentId": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "type": "Agama-trigger-Node", + "displayName": "Nickname trigger view", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "nodeIcon": "fluent-mdl2:trigger-approval", + "flowFileName": "org.gluu.agama.passkey.nickname", + "arguments": [ + "key", + "userData" + ], + "asssignedVariableName": "nicknameTrigger", + "exceptionVariableField": "" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2732.929153619497, + "y": 551.3813347221254 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "finish-66411d62-3b1a-41c1-a1c1-991409763972", + "position": { + "x": 1106.4271181503207, + "y": 305.17520891631307 + }, + "type": "finish", + "data": { + "id": "finish-66411d62-3b1a-41c1-a1c1-991409763972", + "type": "Agama-finish-Flow", + "parentId": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "whenCondition": "", + "inRepeatBlock": false, + "handles": [ + "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InFlow", + "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InRepeatBlock" + ], + "position": { + "x": 1106.4271181503207, + "y": 305.17520891631307 + }, + "agamaData": { + "id": "finish-66411d62-3b1a-41c1-a1c1-991409763972", + "parentId": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "Passkey registration attempt exceeded.", + "finishMode": "withFailure", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response error with attempt exceeded" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1106.4271181503207, + "y": 305.17520891631307 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-30e73be7-0542-4a65-a91e-afe17fb7e07a", + "position": { + "x": 1825.6734620832526, + "y": 453.95111383169495 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-30e73be7-0542-4a65-a91e-afe17fb7e07a", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 1825.6734620832526, + "y": 453.95111383169495 + }, + "agamaData": { + "id": "Agama-assignment-Node-30e73be7-0542-4a65-a91e-afe17fb7e07a", + "parentId": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.isAttestation" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "detestable", + "assignedVariableName": "obj.attestation" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1825.6734620832526, + "y": 453.95111383169495 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "position": { + "x": 1541.468231853858, + "y": 453.1735954585718 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 1541.468231853858, + "y": 453.1735954585718 + }, + "agamaData": { + "id": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "parentId": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "type": "Agama-call-Node", + "displayName": "Attestation request", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "getAttestationMessage", + "javaVariableName": "fidoEnroller", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "inum" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "detestable" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1541.468231853858, + "y": 453.1735954585718 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-a6c6a912-328f-437b-8f2e-e919d507dea8", + "position": { + "x": 1971.6532737181922, + "y": 294.14663172508125 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-a6c6a912-328f-437b-8f2e-e919d507dea8", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 1971.6532737181922, + "y": 294.14663172508125 + }, + "agamaData": { + "id": "Agama-assignment-Node-a6c6a912-328f-437b-8f2e-e919d507dea8", + "parentId": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAttestation" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey registration failed.", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "addDeviceForm.errorMessage", + "assignedVariableName": "obj.errorMessage" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1971.6532737181922, + "y": 294.14663172508125 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-0736a836-5e6e-467a-a039-1b78c39b2191", + "position": { + "x": 3256.135588177542, + "y": 282.98761951264976 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-0736a836-5e6e-467a-a039-1b78c39b2191", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 3256.135588177542, + "y": 282.98761951264976 + }, + "agamaData": { + "id": "Agama-assignment-Node-0736a836-5e6e-467a-a039-1b78c39b2191", + "parentId": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAttestation" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey registration failed.", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "E.message", + "assignedVariableName": "obj.errorMessage" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3256.135588177542, + "y": 282.98761951264976 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "position": { + "x": 2237.637495839028, + "y": 289.20501285234945 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2237.637495839028, + "y": 289.20501285234945 + }, + "agamaData": { + "id": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "parentId": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "type": "Agama-call-Node", + "displayName": "Attestation verify", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "verifyRegistration", + "javaVariableName": "fidoEnroller", + "exceptionVariableField": "E", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "inum", + "addDeviceForm.tokenResponse" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "key" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 2237.637495839028, + "y": 289.20501285234945 + } + }, + { + "width": 170, + "height": 124, + "id": "finish-56b9136c-5cdc-4ef4-8943-92479fe7d895", + "position": { + "x": 2819.3665260302632, + "y": 24.13464683370222 + }, + "type": "finish", + "data": { + "id": "finish-56b9136c-5cdc-4ef4-8943-92479fe7d895", + "type": "Agama-finish-Flow", + "parentId": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "handles": [ + "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e.FAILURE", + "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e.SUCCESS" + ], + "position": { + "x": 2819.3665260302632, + "y": 24.13464683370222 + }, + "agamaData": { + "id": "finish-56b9136c-5cdc-4ef4-8943-92479fe7d895", + "parentId": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "Cancel event", + "finishMode": "withFailure", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response error with cancel event" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2819.3665260302632, + "y": 24.13464683370222 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "position": { + "x": 1111.2312188408016, + "y": 34.300565596259844 + }, + "type": "rrf", + "data": { + "id": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "type": "Agama-rrf-Node", + "parentId": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 1111.2312188408016, + "y": 34.300565596259844 + }, + "agamaData": { + "id": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "parentId": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "type": "Agama-rrf-Node", + "displayName": "Render passkey add view", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [], + "nodeIcon": "ph:globe-simple", + "templatePath": "passkey-add.ftlh", + "asssignedVariableName": "addDeviceForm", + "arguments": [ + "obj" + ] + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1111.2312188408016, + "y": 34.300565596259844 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "position": { + "x": 836.4714909797192, + "y": 27 + }, + "type": "repeat", + "data": { + "id": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "type": "Agama-repeat-Node", + "parentId": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "whenCondition": "", + "inRepeatBlock": false, + "handles": [ + "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InFlow", + "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InRepeatBlock" + ], + "position": { + "x": 836.4714909797192, + "y": 27 + }, + "agamaData": { + "id": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "parentId": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "type": "Agama-repeat-Node", + "nodeIcon": "material-symbols:event-repeat-outline-rounded", + "maxIteration": "50", + "maxIterationVariableName": "", + "hasComment": true, + "hasNoRepeat": true, + "displayName": "Repeat 50 times" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 836.4714909797192, + "y": 27 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "position": { + "x": 628, + "y": 28 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 628, + "y": 28 + }, + "agamaData": { + "id": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "parentId": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "{ attestation: \"{}\", isAttestation: false, showError: false, errorTitle: \"\", errorMessage: \"\" }", + "assignedVariableName": "obj" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 628, + "y": 28 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "position": { + "x": 428, + "y": 28 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "type": "Agama-call-Node", + "parentId": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 428, + "y": 28 + }, + "agamaData": { + "id": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "parentId": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "type": "Agama-call-Node", + "displayName": "FidoEnroller instance", + "hasComment": true, + "comment": "", + "javaClassName": "org.gluu.agama.passkey.enroll.FidoEnroller", + "javaMethodName": "", + "javaVariableName": "org.gluu.agama.passkey.enroll.FidoEnroller", + "exceptionVariableField": "", + "callType": "Create an instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "fidoEnroller" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 428, + "y": 28 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "position": { + "x": 229, + "y": 29 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "type": "Agama-assignment-Node", + "parentId": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 229, + "y": 29 + }, + "agamaData": { + "id": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "parentId": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "userData.inum", + "assignedVariableName": "inum" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 229, + "y": 29 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "start", + "sourcePosition": "right", + "data": { + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "Agama-start-Flow", + "position": { + "x": 29, + "y": 29 + }, + "inRepeatBlock": false, + "agamaData": { + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "Agama-start-Flow", + "displayName": "Passkey Add", + "hasComment": true, + "comment": "", + "isTopLevelFlow": true, + "basepath": "", + "configParams": "{}", + "nodeIcon": "material-symbols:line-start-square", + "timeout": "", + "inputs": "userData", + "configs": "", + "flowname": "org.gluu.agama.passkey.add" + }, + "skake": false + }, + "position": { + "x": 29, + "y": 29 + }, + "selected": false, + "positionAbsolute": { + "x": 29, + "y": 29 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "position": { + "x": 2376.5159236786, + "y": 76.859370077025 + }, + "parentId": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "type": "when", + "data": { + "id": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2376.5159236786, + "y": 76.859370077025 + }, + "agamaData": { + "id": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "parentId": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "addDeviceForm.cancelBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 1529.977459344481 + } + }, + "handles": [ + "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e.FAILURE", + "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2376.5159236786, + "y": 76.859370077025 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "position": { + "x": 2054.2699127694164, + "y": 78.61618817178942 + }, + "parentId": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "type": "when", + "data": { + "id": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2054.2699127694164, + "y": 78.61618817178942 + }, + "agamaData": { + "id": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "parentId": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "addDeviceForm.tokenResponse", + "operator": "is not", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 1522.8396830800157 + } + }, + "handles": [ + "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b.FAILURE", + "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b.SUCCESS" + ], + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 2054.2699127694164, + "y": 78.61618817178942 + }, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "position": { + "x": 1377.7935000141124, + "y": 85.877591218139 + }, + "parentId": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "type": "when", + "data": { + "id": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "type": "Agama-when-Node", + "parentId": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "whenCondition": "WhenFalse", + "inRepeatBlock": true, + "position": { + "x": 1377.7935000141124, + "y": 85.877591218139 + }, + "agamaData": { + "id": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "parentId": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "addDeviceForm.addPasskeyBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b.FAILURE", + "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1377.7935000141124, + "y": 85.877591218139 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "position": { + "x": 1750.8942003984787, + "y": 82.76513591151473 + }, + "parentId": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "type": "when", + "data": { + "id": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 1750.8942003984787, + "y": 82.76513591151473 + }, + "agamaData": { + "id": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "parentId": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "addDeviceForm.skipped", + "operator": "is", + "dataValue": "\"skipped\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 1750.8942003984787 + } + }, + "handles": [ + "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8.FAILURE", + "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8.SUCCESS" + ], + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 1750.8942003984787, + "y": 82.76513591151473 + }, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "position": { + "x": 2554.4883489450567, + "y": 343.39671284355114 + }, + "parentId": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "type": "when", + "data": { + "id": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "type": "Agama-when-Node", + "parentId": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "whenCondition": "WhenFalse", + "inRepeatBlock": true, + "position": { + "x": 2554.4883489450567, + "y": 343.39671284355114 + }, + "agamaData": { + "id": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "parentId": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "E", + "operator": "is", + "dataValue": "null", + "combinator": "and" + }, + { + "variable": "key", + "operator": "is not", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6.FAILURE", + "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2554.4883489450567, + "y": 343.39671284355114 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "position": { + "x": 2921.3596598374193, + "y": 337.55318742631744 + }, + "parentId": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "type": "when", + "data": { + "id": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2921.3596598374193, + "y": 337.55318742631744 + }, + "agamaData": { + "id": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "parentId": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "E", + "operator": "is not", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2678.795896610424 + } + }, + "handles": [ + "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db.FAILURE", + "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2921.3596598374193, + "y": 337.55318742631744 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + } + ], + "edges": [ + { + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818-Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48-6e915cae-5642-4e94-90d9-764554790137", + "type": "straight", + "source": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "target": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48-Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f-dc7ab7b9-a86e-4253-a1cf-a8f239d5acb9", + "type": "straight", + "source": "Agama-assignment-Node-2be4f846-c4e3-4d45-9744-56c5bd003e48", + "target": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f-Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af-b03264a3-19ba-4b47-b743-4736db2f7c20", + "type": "straight", + "source": "Agama-call-Node-da704b03-6407-46b0-8581-7043512bbc7f", + "target": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af-Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f-9bc0970d-499a-4de7-8ed0-eb5c114c6acd", + "type": "straight", + "source": "Agama-assignment-Node-7e42631b-09bc-404a-9ece-46a8793778af", + "target": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8e-Agama-assignment-Node-a0b1a5b9-45c4-417b-8669-f19fc558969c-c6c9de92-9847-4fa5-8fb6-cae5d6df2e8d", + "type": "straight", + "source": "Agama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8e", + "target": "Agama-assignment-Node-a0b1a5b9-45c4-417b-8669-f19fc558969c", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8e.SUCCESS" + }, + { + "id": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e-Agama-call-Node-97e742a1-d368-499f-9218-da5ffa4bf462-74ab1804-9b48-4e99-b889-1093f5123a03", + "type": "straight", + "source": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e", + "target": "Agama-call-Node-97e742a1-d368-499f-9218-da5ffa4bf462", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e.SUCCESS" + }, + { + "id": "Agama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0e-finish-26b494b4-182d-419e-b9df-1805008ad0cd-5342fd1d-2028-4633-a946-1da825a75697", + "type": "straight", + "source": "Agama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0e", + "target": "finish-26b494b4-182d-419e-b9df-1805008ad0cd", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0e.SUCCESS" + }, + { + "source": "Agama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8e", + "sourceHandle": "Agama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8e.FAILURE", + "target": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e", + "targetHandle": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e.left", + "id": "reactflow__edge-Agama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8eAgama-when-Node-02e66a15-35d7-47a8-b7c1-a8448aa4ae8e.FAILURE-Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02eAgama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e.left" + }, + { + "source": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e", + "sourceHandle": "Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e.FAILURE", + "target": "Agama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0e", + "targetHandle": "Agama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0e.left", + "id": "reactflow__edge-Agama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02eAgama-when-Node-5955b8ab-0e7e-4a9f-bc7e-d9e9a425d02e.FAILURE-Agama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0eAgama-when-Node-624211b8-212c-4ef7-bcad-791ce1054f0e.left" + }, + { + "type": "straight", + "source": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "target": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "label": "In Block", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InFlow", + "selected": false, + "id": "reactflow__edge-Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704fAgama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InFlow-Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "targetHandle": null + }, + { + "id": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b-Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e-381a22e9-8592-4707-a715-8bbf8194e8e7", + "type": "straight", + "source": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "target": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b.FAILURE" + }, + { + "type": "straight", + "source": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e", + "target": "finish-56b9136c-5cdc-4ef4-8943-92479fe7d895", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e.FAILURE", + "selected": false, + "id": "reactflow__edge-Agama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79eAgama-when-Node-0b0ddd5b-abf4-40c7-8ae6-7ed797b6e79e.FAILURE-finish-56b9136c-5cdc-4ef4-8943-92479fe7d895", + "targetHandle": null + }, + { + "type": "straight", + "source": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "target": "Agama-assignment-Node-0736a836-5e6e-467a-a039-1b78c39b2191", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db.FAILURE", + "selected": false, + "id": "reactflow__edge-Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9dbAgama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db.FAILURE-Agama-assignment-Node-0736a836-5e6e-467a-a039-1b78c39b2191", + "targetHandle": null + }, + { + "type": "straight", + "source": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "target": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b.SUCCESS", + "selected": false, + "id": "reactflow__edge-Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7bAgama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b.SUCCESS-Agama-call-Node-c8192fec-7f06-447d-b680-556c680072adAgama-call-Node-c8192fec-7f06-447d-b680-556c680072ad.righta", + "targetHandle": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad.righta" + }, + { + "id": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8-Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b-e0c64b96-5cb4-4465-8125-143d769f2e42", + "type": "straight", + "source": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "target": "Agama-when-Node-b5e9fd3e-71c5-454c-a0bd-527066555b7b", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8.FAILURE" + }, + { + "id": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8-Agama-assignment-Node-a6c6a912-328f-437b-8f2e-e919d507dea8-899565fb-775d-4de3-9472-33d326e89bbb", + "type": "straight", + "source": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "target": "Agama-assignment-Node-a6c6a912-328f-437b-8f2e-e919d507dea8", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8.SUCCESS" + }, + { + "id": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847-Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b-1ab40b46-4b1c-4b3e-b720-9b630cc10b36", + "type": "straight", + "source": "Agama-rrf-Node-ae26dbde-6160-4efd-b78b-580f9e92c847", + "target": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b-Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8-52cb4c27-f1a1-417f-b8f8-dc7e0220ba7f", + "type": "straight", + "source": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "target": "Agama-when-Node-54662547-493b-47bf-aba2-02655f80abd8", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b.FAILURE" + }, + { + "id": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b-Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079-8b9615c9-2dad-4fb4-8f1c-86e127cf2aa5", + "type": "straight", + "source": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b", + "target": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-29f9a2a0-4165-49d2-a90c-42cc4653d99b.SUCCESS", + "selected": false + }, + { + "id": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079-Agama-assignment-Node-30e73be7-0542-4a65-a91e-afe17fb7e07a-da108b76-0414-434f-bed9-fed18de764d0", + "type": "straight", + "source": "Agama-call-Node-89618ba3-e6c2-4a38-83a3-9830374d4079", + "target": "Agama-assignment-Node-30e73be7-0542-4a65-a91e-afe17fb7e07a", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "type": "straight", + "source": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f", + "target": "finish-66411d62-3b1a-41c1-a1c1-991409763972", + "label": "Not In Block", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InRepeatBlock", + "id": "reactflow__edge-Agama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704fAgama-repeat-Node-671e5a55-a960-43e8-8ddb-8b4e7fbd704f.InRepeatBlock-finish-66411d62-3b1a-41c1-a1c1-991409763972", + "targetHandle": null + }, + { + "id": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad-Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6-5767e69a-1835-4fd6-b600-c182e6b6c7e0", + "type": "straight", + "source": "Agama-call-Node-c8192fec-7f06-447d-b680-556c680072ad", + "target": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6-Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db-2756b3df-aa7c-40ab-b14d-de50a6e45cbb", + "type": "straight", + "source": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "target": "Agama-when-Node-5d7551be-273f-48d3-b36f-dfc94fe5e9db", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6.FAILURE" + }, + { + "id": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6-Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445-51302ae1-1825-45fa-b822-5964c8bda3d0", + "type": "straight", + "source": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6", + "target": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-29b9deb9-9961-4936-a8f8-d1ff6e8b7ec6.SUCCESS" + }, + { + "id": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445-Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da-ebf9765a-38cb-460f-bc6c-419d7dbb5f05", + "type": "straight", + "source": "Agama-trigger-Node-eec22f1d-a92f-4cab-88a0-c202a9fc6445", + "target": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da-finish-aa9b5b7b-1306-4e1b-ac11-bc113973efcc-9f347cce-26fc-43d8-8d19-f8ffec11377e", + "type": "straight", + "source": "Agama-assignment-Node-d325f7dc-ec4f-4278-a2b9-e5f6b12e10da", + "target": "finish-aa9b5b7b-1306-4e1b-ac11-bc113973efcc", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + } + ], + "viewport": { + "x": -2060, + "y": 52, + "zoom": 1 + } +} \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.list.flow b/code/org.gluu.agama.passkey.list.flow new file mode 100644 index 0000000..ddfa03b --- /dev/null +++ b/code/org.gluu.agama.passkey.list.flow @@ -0,0 +1,58 @@ +Flow org.gluu.agama.passkey.list + Basepath "" + Inputs userData scimSetting +inum = userData.inum +uid = userData.uid +fidoValidator = Call org.gluu.agama.passkey.authn.FidoValidator#new +scimFido2Helper = Call org.gluu.agama.passkey.ScimFido2Helper#new scimSetting +fidoDevice = Call scimFido2Helper getFidoDeviceByUser inum +obj = { fidoDevice: fidoDevice, assertion: "{}", isAssertion: false, showError: false, errorTitle: "", errorMessage: "", canEdit: false } +Repeat 50 times max + listForm = RRF "passkey-list.ftlh" obj + When listForm.deviceId is not "" + obj.canEdit = false + obj.isAssertion = false + obj.showError = false + nickNamed | E = Call scimFido2Helper updateDevice inum listForm.deviceId listForm.nickname + When E is null + obj.fidoDevice = Call scimFido2Helper getFidoDeviceByUser inum + When E is not null + obj.showError = false + obj.errorTitle = "Passkey failed to set a new nickname" + obj.errorMessage = E.message + When listForm.cancelItemBtn is "" + obj.canEdit = false + obj.isAssertion = false + obj.showError = false + When listForm.editItemBtn is "" + obj.canEdit = true + obj.isAssertion = false + obj.showError = false + When listForm.addAPasskeyBtn is "" + addTrigger = Trigger org.gluu.agama.passkey.add userData + obj.showError = false + obj.isAssertion = false + When addTrigger.success is true + obj.fidoDevice = Call scimFido2Helper getFidoDeviceByUser inum + When listForm.loginWithPasskeyBtn is "" + detestable = Call fidoValidator assertionRequest uid + obj.showError = false + obj.isAssertion = true + obj.assertion = detestable + When listForm.skipped is "skipped" + obj.isAssertion = false + obj.showError = true + obj.errorTitle = "Passkey authentication failed." + obj.errorMessage = listForm.errorMessage + When listForm.tokenResponse is not "" and listForm.tokenResponse is not null + verifyResponse | E = Call fidoValidator verify listForm.tokenResponse + When E is not null + obj.showError = true + obj.errorTitle = "Passkey authentication failed." + obj.errorMessage = E.message + obj.isAssertion = false + When E is null + it_epblz = {success:true, data: { userId: inum }} + Finish it_epblz +it_jqsex = {success:false, error: "Passkey registration attempt exceeded"} +Finish it_jqsex \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.list.json b/code/org.gluu.agama.passkey.list.json new file mode 100644 index 0000000..626f67b --- /dev/null +++ b/code/org.gluu.agama.passkey.list.json @@ -0,0 +1,2488 @@ +{ + "nodes": [ + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-57260680-3c35-4170-88a1-4922d8e4369b", + "position": { + "x": 2564.95538382441, + "y": 915.9972759293865 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-57260680-3c35-4170-88a1-4922d8e4369b", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 2564.95538382441, + "y": 915.9972759293865 + }, + "agamaData": { + "id": "Agama-call-Node-57260680-3c35-4170-88a1-4922d8e4369b", + "parentId": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "type": "Agama-call-Node", + "displayName": "Reload all devices by user", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "getFidoDeviceByUser", + "javaVariableName": "scimFido2Helper", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "arguments": [ + "inum" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "obj.fidoDevice" + }, + "skake": false + }, + "selected": true, + "positionAbsolute": { + "x": 2564.95538382441, + "y": 915.9972759293865 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-25a40e2e-a391-421e-b22d-e60d98d5b438", + "position": { + "x": 2893.061976758117, + "y": 911.4320454716011 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-25a40e2e-a391-421e-b22d-e60d98d5b438", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 2893.061976758117, + "y": 911.4320454716011 + }, + "agamaData": { + "id": "Agama-assignment-Node-25a40e2e-a391-421e-b22d-e60d98d5b438", + "parentId": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey failed to set a new nickname", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "E.message", + "assignedVariableName": "obj.errorMessage" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2893.061976758117, + "y": 911.4320454716011 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "position": { + "x": 2110.289956450588, + "y": 708.9410023366776 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "type": "Agama-call-Node", + "parentId": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "whenCondition": "WhenFalse", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 2110.289956450588, + "y": 708.9410023366776 + }, + "agamaData": { + "id": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "parentId": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "type": "Agama-call-Node", + "displayName": "Update device", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "updateDevice", + "javaVariableName": "scimFido2Helper", + "exceptionVariableField": "E", + "callType": "Call method on instance", + "whenCondition": "WhenFalse", + "inRepeatBlock": false, + "inIterateBlock": false, + "arguments": [ + "inum", + "listForm.deviceId", + "listForm.nickname" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "nickNamed" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2110.289956450588, + "y": 708.9410023366776 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "position": { + "x": 1804.0691859113633, + "y": 509.4588061387449 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 1804.0691859113633, + "y": 509.4588061387449 + }, + "agamaData": { + "id": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "parentId": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.canEdit" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1804.0691859113633, + "y": 509.4588061387449 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-1ebf9991-e326-48c9-8008-2d3eb681447b", + "position": { + "x": 2104.747386940735, + "y": 498.70108462594385 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-1ebf9991-e326-48c9-8008-2d3eb681447b", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 2104.747386940735, + "y": 498.70108462594385 + }, + "agamaData": { + "id": "Agama-assignment-Node-1ebf9991-e326-48c9-8008-2d3eb681447b", + "parentId": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.canEdit" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2104.747386940735, + "y": 498.70108462594385 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-e4d3b6b1-d8fa-4513-80fb-f87055fba7d8", + "position": { + "x": 2390.5427152189905, + "y": 493.4707554699006 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-e4d3b6b1-d8fa-4513-80fb-f87055fba7d8", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 2390.5427152189905, + "y": 493.4707554699006 + }, + "agamaData": { + "id": "Agama-assignment-Node-e4d3b6b1-d8fa-4513-80fb-f87055fba7d8", + "parentId": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "inIterateBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.canEdit" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2390.5427152189905, + "y": 493.4707554699006 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "finish-b0459236-3083-40d4-9892-2a5ff3bc7a94", + "position": { + "x": 1480, + "y": 27 + }, + "type": "finish", + "data": { + "id": "finish-b0459236-3083-40d4-9892-2a5ff3bc7a94", + "type": "Agama-finish-Flow", + "parentId": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "whenCondition": "", + "inRepeatBlock": false, + "handles": [ + "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43.InFlow", + "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43.InRepeatBlock" + ], + "position": { + "x": 1480, + "y": 27 + }, + "agamaData": { + "id": "finish-b0459236-3083-40d4-9892-2a5ff3bc7a94", + "parentId": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "Passkey registration attempt exceeded", + "finishMode": "withFailure", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response error attempt exceeded" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1480, + "y": 27 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-22d1db2a-c501-4f0e-8c37-0edf0a02b781", + "position": { + "x": 3585.2246307455057, + "y": 933.4486292614022 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-22d1db2a-c501-4f0e-8c37-0edf0a02b781", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 3585.2246307455057, + "y": 933.4486292614022 + }, + "agamaData": { + "id": "Agama-call-Node-22d1db2a-c501-4f0e-8c37-0edf0a02b781", + "parentId": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "type": "Agama-call-Node", + "displayName": "Reload all devices by user", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "getFidoDeviceByUser", + "javaVariableName": "scimFido2Helper", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "inum" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "obj.fidoDevice" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3585.2246307455057, + "y": 933.4486292614022 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "position": { + "x": 3307.720649291367, + "y": 847.5443958682695 + }, + "parentId": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "type": "when", + "data": { + "id": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "type": "Agama-when-Node", + "parentId": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 3307.720649291367, + "y": 847.5443958682695 + }, + "agamaData": { + "id": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "parentId": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "addTrigger.success", + "operator": "is", + "dataValue": "true", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594.FAILURE", + "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3307.720649291367, + "y": 847.5443958682695 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "position": { + "x": 3010.2470095432354, + "y": 665.2572339807367 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "type": "Agama-assignment-Node", + "parentId": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 3010.2470095432354, + "y": 665.2572339807367 + }, + "agamaData": { + "id": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "parentId": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 3010.2470095432354, + "y": 665.2572339807367 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "position": { + "x": 2665.680964791252, + "y": 500.7288759648635 + }, + "type": "trigger", + "data": { + "id": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "type": "Agama-trigger-Node", + "parentId": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2665.680964791252, + "y": 500.7288759648635 + }, + "agamaData": { + "id": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "parentId": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "type": "Agama-trigger-Node", + "displayName": "Passkey add flow", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "nodeIcon": "fluent-mdl2:trigger-approval", + "flowFileName": "org.gluu.agama.passkey.add", + "arguments": [ + "userData" + ], + "asssignedVariableName": "addTrigger", + "exceptionVariableField": "" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2665.680964791252, + "y": 500.7288759648635 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-642689a4-66e6-4b5a-ad29-aaf82dee374b", + "position": { + "x": 3326.067916618345, + "y": 674.5981908895046 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-642689a4-66e6-4b5a-ad29-aaf82dee374b", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 3326.067916618345, + "y": 674.5981908895046 + }, + "agamaData": { + "id": "Agama-assignment-Node-642689a4-66e6-4b5a-ad29-aaf82dee374b", + "parentId": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "detestable", + "assignedVariableName": "obj.assertion" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3326.067916618345, + "y": 674.5981908895046 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "position": { + "x": 3011.8460953878557, + "y": 505.69124437849075 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 3011.8460953878557, + "y": 505.69124437849075 + }, + "agamaData": { + "id": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "parentId": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "type": "Agama-call-Node", + "displayName": "Assertion request", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "assertionRequest", + "javaVariableName": "fidoValidator", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "uid" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "detestable" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3011.8460953878557, + "y": 505.69124437849075 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-f23696fa-95f5-4af0-9b48-1f7872b9b137", + "position": { + "x": 3368.4307956204625, + "y": 497.89228595299915 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-f23696fa-95f5-4af0-9b48-1f7872b9b137", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 3368.4307956204625, + "y": 497.89228595299915 + }, + "agamaData": { + "id": "Agama-assignment-Node-f23696fa-95f5-4af0-9b48-1f7872b9b137", + "parentId": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey authentication failed.", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "listForm.errorMessage", + "assignedVariableName": "obj.errorMessage" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3368.4307956204625, + "y": 497.89228595299915 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-c30a51f2-cf52-4bcb-a34d-2af5259a7689", + "position": { + "x": 4193.750508438159, + "y": 743.2163614281676 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-c30a51f2-cf52-4bcb-a34d-2af5259a7689", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 4193.750508438159, + "y": 743.2163614281676 + }, + "agamaData": { + "id": "Agama-assignment-Node-c30a51f2-cf52-4bcb-a34d-2af5259a7689", + "parentId": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey authentication failed.", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "E.message", + "assignedVariableName": "obj.errorMessage" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 4193.750508438159, + "y": 743.2163614281676 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "finish-e1de5f45-5633-466e-aebf-fe817f5cafb2", + "position": { + "x": 4570.247074232178, + "y": 744.8914840661624 + }, + "type": "finish", + "data": { + "id": "finish-e1de5f45-5633-466e-aebf-fe817f5cafb2", + "type": "Agama-finish-Flow", + "parentId": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "handles": [ + "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae.FAILURE", + "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae.SUCCESS" + ], + "position": { + "x": 4570.247074232178, + "y": 744.8914840661624 + }, + "agamaData": { + "id": "finish-e1de5f45-5633-466e-aebf-fe817f5cafb2", + "parentId": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "{ userId: inum }", + "finishMode": "withSuccess", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response success" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 4570.247074232178, + "y": 744.8914840661624 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "position": { + "x": 3707.772143393334, + "y": 490.82038306666027 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 3707.772143393334, + "y": 490.82038306666027 + }, + "agamaData": { + "id": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "parentId": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "type": "Agama-call-Node", + "displayName": "Assertion verify", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "verify", + "javaVariableName": "fidoValidator", + "exceptionVariableField": "E", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "listForm.tokenResponse" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "verifyResponse" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3707.772143393334, + "y": 490.82038306666027 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "position": { + "x": 1406.7638521255665, + "y": 229.85239971192976 + }, + "type": "rrf", + "data": { + "id": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "type": "Agama-rrf-Node", + "parentId": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 1406.7638521255665, + "y": 229.85239971192976 + }, + "agamaData": { + "id": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "parentId": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "type": "Agama-rrf-Node", + "displayName": "Render passkey list view", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [], + "nodeIcon": "ph:globe-simple", + "templatePath": "passkey-list.ftlh", + "asssignedVariableName": "listForm", + "arguments": "obj" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1406.7638521255665, + "y": 229.85239971192976 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "position": { + "x": 1230, + "y": 28 + }, + "type": "repeat", + "data": { + "id": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "type": "Agama-repeat-Node", + "parentId": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "whenCondition": "", + "inRepeatBlock": false, + "handles": [ + "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43.InFlow", + "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43.InRepeatBlock" + ], + "position": { + "x": 1230, + "y": 28 + }, + "agamaData": { + "id": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "parentId": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "type": "Agama-repeat-Node", + "nodeIcon": "material-symbols:event-repeat-outline-rounded", + "maxIteration": "50", + "displayName": "Repeat 50 times", + "hasComment": true, + "hasNoRepeat": true + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1230, + "y": 28 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "position": { + "x": 1029, + "y": 29 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 1029, + "y": 29 + }, + "agamaData": { + "id": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "parentId": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "type": "Agama-assignment-Node", + "displayName": "Declare obj", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "{ fidoDevice: fidoDevice, assertion: \"{}\", isAssertion: false, showError: false, errorTitle: \"\", errorMessage: \"\", canEdit: false }", + "assignedVariableName": "obj" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 1029, + "y": 29 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "position": { + "x": 829, + "y": 29 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "type": "Agama-call-Node", + "parentId": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 829, + "y": 29 + }, + "agamaData": { + "id": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "parentId": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "type": "Agama-call-Node", + "displayName": "Get fido devices by user", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "getFidoDeviceByUser", + "javaVariableName": "scimFido2Helper", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [ + "inum" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "fidoDevice" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 829, + "y": 29 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "position": { + "x": 629, + "y": 30 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "type": "Agama-call-Node", + "parentId": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 629, + "y": 30 + }, + "agamaData": { + "id": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "parentId": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "type": "Agama-call-Node", + "displayName": "ScimFido2Helper instance", + "hasComment": true, + "comment": "", + "javaClassName": "org.gluu.agama.passkey.ScimFido2Helper", + "javaMethodName": "", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Create an instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": "scimSetting", + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "scimFido2Helper" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 629, + "y": 30 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "position": { + "x": 429, + "y": 31 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "type": "Agama-call-Node", + "parentId": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 429, + "y": 31 + }, + "agamaData": { + "id": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "parentId": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "type": "Agama-call-Node", + "displayName": "FidoValidator instance", + "hasComment": true, + "comment": "", + "javaClassName": "org.gluu.agama.passkey.authn.FidoValidator", + "javaMethodName": "", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Create an instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "fidoValidator" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 429, + "y": 31 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "position": { + "x": 229, + "y": 30 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "type": "Agama-assignment-Node", + "parentId": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 229, + "y": 30 + }, + "agamaData": { + "id": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "parentId": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "userData.inum", + "assignedVariableName": "inum" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "userData.uid", + "assignedVariableName": "uid" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 229, + "y": 30 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32", + "type": "start", + "sourcePosition": "right", + "data": { + "id": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32", + "type": "Agama-start-Flow", + "position": { + "x": 29, + "y": 31 + }, + "inRepeatBlock": false, + "agamaData": { + "id": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32", + "type": "Agama-start-Flow", + "displayName": "Passkey List", + "hasComment": true, + "comment": "", + "isTopLevelFlow": true, + "basepath": "", + "configParams": "{}", + "nodeIcon": "material-symbols:line-start-square", + "timeout": "", + "inputs": "userData scimSetting", + "configs": "", + "flowname": "org.gluu.agama.passkey.list" + }, + "skake": false + }, + "position": { + "x": 29, + "y": 31 + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 29, + "y": 31 + } + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "position": { + "x": 3996.7255676875034, + "y": 544.7126690196598 + }, + "parentId": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "type": "when", + "data": { + "id": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "type": "Agama-when-Node", + "parentId": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "whenCondition": "WhenFalse", + "inRepeatBlock": true, + "position": { + "x": 3996.7255676875034, + "y": 544.7126690196598 + }, + "agamaData": { + "id": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "parentId": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "E", + "operator": "is not", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3.FAILURE", + "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3996.7255676875034, + "y": 544.7126690196598 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "position": { + "x": 4364.362684318713, + "y": 548.5689908572639 + }, + "parentId": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "type": "when", + "data": { + "id": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 4364.362684318713, + "y": 548.5689908572639 + }, + "agamaData": { + "id": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "parentId": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "E", + "operator": "is", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 3350.7504788709116 + } + }, + "handles": [ + "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae.FAILURE", + "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 4364.362684318713, + "y": 548.5689908572639 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "position": { + "x": 3469.6612871314683, + "y": 296.27345052587714 + }, + "parentId": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "type": "when", + "data": { + "id": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 3469.6612871314683, + "y": 296.27345052587714 + }, + "agamaData": { + "id": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "parentId": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "listForm.tokenResponse", + "operator": "is not", + "dataValue": "\"\"", + "combinator": "and" + }, + { + "variable": "listForm.tokenResponse", + "operator": "is not", + "dataValue": "null", + "combinator": "none" + } + ], + "comment": "", + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2569.6612871314683 + } + }, + "handles": [ + "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5.FAILURE", + "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3469.6612871314683, + "y": 296.27345052587714 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "position": { + "x": 3129.555044510517, + "y": 294.2306257329059 + }, + "parentId": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "type": "when", + "data": { + "id": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 3129.555044510517, + "y": 294.2306257329059 + }, + "agamaData": { + "id": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "parentId": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "listForm.skipped", + "operator": "is", + "dataValue": "\"skipped\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2379.555044510517 + } + }, + "handles": [ + "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e.FAILURE", + "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3129.555044510517, + "y": 294.2306257329059 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "position": { + "x": 2759.8904094846243, + "y": 290.6876477486175 + }, + "parentId": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "type": "when", + "data": { + "id": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2759.8904094846243, + "y": 290.6876477486175 + }, + "agamaData": { + "id": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "parentId": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "listForm.loginWithPasskeyBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2159.8904094846243 + } + }, + "handles": [ + "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3.FAILURE", + "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2759.8904094846243, + "y": 290.6876477486175 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "position": { + "x": 2459.337116551404, + "y": 292.3133527242651 + }, + "parentId": "Agama-assignment-Node-0f6c297a-3fe7-4844-8007-6533ff5b9e07", + "type": "when", + "data": { + "id": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2459.337116551404, + "y": 292.3133527242651 + }, + "agamaData": { + "id": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "parentId": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "listForm.addAPasskeyBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "position": { + "x": 2102.0357010730263 + } + }, + "handles": [ + "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da.FAILURE", + "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da.SUCCESS" + ], + "skake": false, + "inIterateBlock": "" + }, + "selected": false, + "positionAbsolute": { + "x": 2459.337116551404, + "y": 292.3133527242651 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "position": { + "x": 2160.6585187885403, + "y": 291.2119269032086 + }, + "parentId": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "type": "when", + "data": { + "id": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "", + "position": { + "x": 2160.6585187885403, + "y": 291.2119269032086 + }, + "agamaData": { + "id": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "parentId": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "listForm.editItemBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": false, + "position": { + "x": 1800.1656564010102 + } + }, + "handles": [ + "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b.FAILURE", + "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2160.6585187885403, + "y": 291.2119269032086 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "position": { + "x": 1628.3542424853433, + "y": 287.68371675199336 + }, + "parentId": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "type": "when", + "data": { + "id": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "type": "Agama-when-Node", + "parentId": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "whenCondition": "WhenFalse", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 1628.3542424853433, + "y": 287.68371675199336 + }, + "agamaData": { + "id": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "parentId": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "listForm.deviceId", + "operator": "is not", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": false + }, + "handles": [ + "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19.FAILURE", + "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1628.3542424853433, + "y": 287.68371675199336 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "position": { + "x": 1894.495469547029, + "y": 290.4189646818993 + }, + "parentId": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "type": "when", + "data": { + "id": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "", + "position": { + "x": 1894.495469547029, + "y": 290.4189646818993 + }, + "agamaData": { + "id": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "parentId": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "listForm.cancelItemBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": false, + "position": { + "x": 1741.306509375275 + } + }, + "handles": [ + "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8.FAILURE", + "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8.SUCCESS" + ], + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 1894.495469547029, + "y": 290.4189646818993 + }, + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "position": { + "x": 2375.8749606518613, + "y": 766.3762354662987 + }, + "parentId": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "type": "when", + "data": { + "id": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "type": "Agama-when-Node", + "parentId": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "whenCondition": "WhenFalse", + "inRepeatBlock": false, + "inIterateBlock": false, + "position": { + "x": 2375.8749606518613, + "y": 766.3762354662987 + }, + "agamaData": { + "id": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "parentId": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "E", + "operator": "is", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": false + }, + "handles": [ + "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e.FAILURE", + "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2375.8749606518613, + "y": 766.3762354662987 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "position": { + "x": 2682.5530198930405, + "y": 766.7712260965981 + }, + "parentId": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "type": "when", + "data": { + "id": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "", + "position": { + "x": 2682.5530198930405, + "y": 766.7712260965981 + }, + "agamaData": { + "id": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "parentId": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "E", + "operator": "is not", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": false, + "position": { + "x": 2719.8358563414517 + } + }, + "handles": [ + "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94.FAILURE", + "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2682.5530198930405, + "y": 766.7712260965981 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "", + "inIterateBlock": "" + } + ], + "edges": [ + { + "id": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32-Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2-d557d6c0-80de-45b7-9ef3-3bb611008e82", + "type": "straight", + "source": "Agama-start-Flow-93ffac5b-aaa9-472e-a1c9-783c54a54b32", + "target": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2-Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028-39681149-cb24-459c-9b4d-642a16fd2533", + "type": "straight", + "source": "Agama-assignment-Node-7f9fc2f6-5137-4bb3-acee-421851b701e2", + "target": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028-Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44-e7a0b076-9384-4b36-a66c-b4485f6d4c23", + "type": "straight", + "source": "Agama-call-Node-b9aa2445-9141-4b46-b6a1-e4a296842028", + "target": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44-Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c-4bd8cf8b-7857-4795-8b42-6b5e443bd61e", + "type": "straight", + "source": "Agama-call-Node-0d001f9c-34e2-43c1-a75c-260734e65c44", + "target": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c-Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285-50483089-0edb-474e-80f8-2145da0ede82", + "type": "straight", + "source": "Agama-call-Node-6fcad667-fb9f-4d49-bf9f-412a4d28e20c", + "target": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285-Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43-304741f2-7ba8-4172-8da2-f00803ba05db", + "type": "straight", + "source": "Agama-assignment-Node-7f3fcf18-ea17-4e81-aa51-6fbf89b15285", + "target": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43-Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2-2522d5b5-a87c-4a9d-be5d-0e272a4a9f53", + "type": "straight", + "source": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "target": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "label": "In Block", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43.InRepeatBlock" + }, + { + "id": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5-Agama-when-Node-57120ce1-4a7f-4858-a608-60f849d1ef48-dd8f17e3-2f41-4d51-b7ca-272ca0f70ce4", + "type": "straight", + "source": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "target": "Agama-when-Node-57120ce1-4a7f-4858-a608-60f849d1ef48", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5.SUCCESS" + }, + { + "id": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5-Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191-a127dc09-4c07-4829-832e-6895608e189c", + "type": "straight", + "source": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "target": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5.SUCCESS" + }, + { + "id": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae-finish-e1de5f45-5633-466e-aebf-fe817f5cafb2-cfea2fef-19a1-4e6a-a16a-16e87649d330", + "type": "straight", + "source": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "target": "finish-e1de5f45-5633-466e-aebf-fe817f5cafb2", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae.SUCCESS" + }, + { + "id": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191-Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3-1a157e0d-aeb3-44bd-8c41-d850a303fe34", + "type": "straight", + "source": "Agama-call-Node-a417cb5f-611c-4eb0-97c7-ca19d0828191", + "target": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3-Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae-7bc8c093-ddb1-4f8b-9ea0-c207628240c5", + "type": "straight", + "source": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "target": "Agama-when-Node-2ad0d068-ef15-4590-9e78-17c25e264eae", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3.FAILURE" + }, + { + "id": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3-Agama-assignment-Node-c30a51f2-cf52-4bcb-a34d-2af5259a7689-785dafd3-d5e7-4a9e-b9d0-4667acf39664", + "type": "straight", + "source": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3", + "target": "Agama-assignment-Node-c30a51f2-cf52-4bcb-a34d-2af5259a7689", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-7f67819c-e50e-426e-97d8-cc7a988342a3.SUCCESS" + }, + { + "id": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e-Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5-e3cc81e2-14e7-41f7-ae56-148494c45c08", + "type": "straight", + "source": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "target": "Agama-when-Node-ce5621e5-11f9-4f9c-b05e-d9292150f7e5", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e.FAILURE" + }, + { + "id": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e-Agama-assignment-Node-f23696fa-95f5-4af0-9b48-1f7872b9b137-b2c69be6-256e-485b-a459-adf98dbfcfdb", + "type": "straight", + "source": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "target": "Agama-assignment-Node-f23696fa-95f5-4af0-9b48-1f7872b9b137", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e.SUCCESS" + }, + { + "id": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3-Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e-3aac07af-681c-4987-b9f7-baad13723205", + "type": "straight", + "source": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "target": "Agama-when-Node-6786557b-5a46-40f6-a2d7-a70b4241649e", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3.FAILURE" + }, + { + "id": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3-Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0-898551d0-96f0-49a5-aa3b-1d0f88b9999d", + "type": "straight", + "source": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "target": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3.SUCCESS" + }, + { + "id": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0-Agama-assignment-Node-642689a4-66e6-4b5a-ad29-aaf82dee374b-ee254b4f-f315-4610-aba2-2e1f74665d57", + "type": "straight", + "source": "Agama-call-Node-8ea24826-c6dc-4436-b3a3-6a67dca112c0", + "target": "Agama-assignment-Node-642689a4-66e6-4b5a-ad29-aaf82dee374b", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da-Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3-f5cbefbd-b24d-44c5-b0b8-02d84a215497", + "type": "straight", + "source": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "target": "Agama-when-Node-1c6dd4a0-70db-46ac-acd4-4c4ce4d8d9f3", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da.FAILURE" + }, + { + "id": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da-Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3-7382f69d-3852-43df-badf-38c78f492f9c", + "type": "straight", + "source": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "target": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da.SUCCESS" + }, + { + "id": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3-Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5-d2c8a784-d56b-4e31-9b40-7d5b1aa54d05", + "type": "straight", + "source": "Agama-trigger-Node-5b164c31-747d-413a-8669-bb1cd7219bf3", + "target": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5-Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594-759884d8-1ebe-444c-ae73-20c470b4daff", + "type": "straight", + "source": "Agama-assignment-Node-822bb243-1b06-46dc-95a8-f9bcc91683b5", + "target": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594-Agama-call-Node-22d1db2a-c501-4f0e-8c37-0edf0a02b781-260ba8be-1b31-4f5d-8590-dbcb4051d7d6", + "type": "straight", + "source": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594", + "target": "Agama-call-Node-22d1db2a-c501-4f0e-8c37-0edf0a02b781", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-359dc929-bddc-402c-94d0-1c37b8461594.SUCCESS" + }, + { + "id": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43-finish-b0459236-3083-40d4-9892-2a5ff3bc7a94-395f0bc4-6dad-4aa0-8d7d-162c7fed9c4f", + "type": "straight", + "source": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43", + "target": "finish-b0459236-3083-40d4-9892-2a5ff3bc7a94", + "label": "Not In Block", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-repeat-Node-e9662d07-f37f-45fe-a764-9c29d1e9cd43.InFlow" + }, + { + "id": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b->Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da", + "source": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "target": "Agama-when-Node-aabe4891-06a1-4e4f-b537-981a856e53da" + }, + { + "id": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b-Agama-assignment-Node-e4d3b6b1-d8fa-4513-80fb-f87055fba7d8-891175db-270c-4b90-a037-2d804de15e1c", + "type": "straight", + "source": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "target": "Agama-assignment-Node-e4d3b6b1-d8fa-4513-80fb-f87055fba7d8", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b.SUCCESS" + }, + { + "id": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8-Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b-16eb1982-d093-4d55-8e7f-4121d90f91ac", + "type": "straight", + "source": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "target": "Agama-when-Node-e5569247-f616-49dc-a77c-6ccc231d3b4b", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8.FAILURE" + }, + { + "id": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8-Agama-assignment-Node-1ebf9991-e326-48c9-8008-2d3eb681447b-4d894dc2-24b2-4966-8b18-d8c011e566e2", + "type": "straight", + "source": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "target": "Agama-assignment-Node-1ebf9991-e326-48c9-8008-2d3eb681447b", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8.SUCCESS" + }, + { + "id": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2-Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19-1a1cd309-e0a0-4011-a24c-fec764450809", + "type": "straight", + "source": "Agama-rrf-Node-88cdeffc-e4a7-46cb-a159-29bac8d3f8f2", + "target": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19-Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8-dc7e7d48-6902-4b0d-9a66-785a95c5d884", + "type": "straight", + "source": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "target": "Agama-when-Node-9efcefb0-fa12-4ba3-bab3-2b68b02b31a8", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19.FAILURE" + }, + { + "id": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19-Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091-73b39df5-c918-4694-862b-43e540baa6ee", + "type": "straight", + "source": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19", + "target": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-525e0948-e085-4c64-acb0-46cd30b47e19.SUCCESS" + }, + { + "id": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091-Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17-61c1c26d-b1a4-401e-ad4c-ce3b60706990", + "type": "straight", + "source": "Agama-assignment-Node-a49ce286-d0ef-4070-903f-43aff111c091", + "target": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94-Agama-assignment-Node-25a40e2e-a391-421e-b22d-e60d98d5b438-77ab14d0-e1a5-4dac-9c40-db4a077e258c", + "type": "straight", + "source": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "target": "Agama-assignment-Node-25a40e2e-a391-421e-b22d-e60d98d5b438", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94.SUCCESS" + }, + { + "id": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17-Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e-2da06514-aa18-438c-8f04-742996c1ac4c", + "type": "straight", + "source": "Agama-call-Node-668d617c-b558-4979-b8ad-625daac60b17", + "target": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e-Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94-e5058e6f-f614-4b6e-af7c-c4d1332e43ca", + "type": "straight", + "source": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "target": "Agama-when-Node-c663e76a-575b-46cb-8e2c-29b830441f94", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e.FAILURE" + }, + { + "id": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e-Agama-call-Node-57260680-3c35-4170-88a1-4922d8e4369b-efdcf3c3-effe-488a-9c7f-e03c0cf28b4e", + "type": "straight", + "source": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e", + "target": "Agama-call-Node-57260680-3c35-4170-88a1-4922d8e4369b", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-7da83847-0a02-4f3b-8368-8bd94429600e.SUCCESS" + } + ], + "viewport": { + "x": -1645, + "y": -428, + "zoom": 1 + } +} \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.main.flow b/code/org.gluu.agama.passkey.main.flow new file mode 100644 index 0000000..c2c531f --- /dev/null +++ b/code/org.gluu.agama.passkey.main.flow @@ -0,0 +1,41 @@ +Flow org.gluu.agama.passkey.main + Basepath "" + Configs conf +authService = Call io.jans.as.server.service.AuthenticationService#class +cdiUtil = Call io.jans.service.cdi.util.CdiUtil#bean authService +fidoValidator = Call org.gluu.agama.passkey.authn.FidoValidator#new +authResult = {} +obj = { success: true, assertion: "{}", isAssertion: false, showError: false, errorTitle: "", errorMessage: "" } +Repeat 50 times max + mainForm = RRF "main.ftlh" obj + When mainForm.loginBtn is "" + authResult.success = Call cdiUtil authenticate mainForm.username mainForm.password + authResult.uid = mainForm.username + When authResult.success is true + userData = Call org.gluu.agama.passkey.IdentityProcessor#accountFromUid authResult.uid + listTrigger = Trigger org.gluu.agama.passkey.list userData conf + When listTrigger.success is true + it_daszz = {success:true, data: { userId: userData.uid }} + Finish it_daszz + When mainForm.loginWithPasskeyBtn is "" + detestable = Call fidoValidator assertionRequest null + obj.showError = false + obj.isAssertion = true + obj.assertion = detestable + When mainForm.tokenResponse is not "" + verifyResponse | E = Call fidoValidator verify mainForm.tokenResponse + When E is not null + obj.isAssertion = false + obj.showError = true + obj.errorTitle = "Passkey authentication failed." + obj.errorMessage = E.message + When E is null + it_jydzs = {success:true, data: { userId: verifyResponse }} + Finish it_jydzs + When mainForm.skipped is "skipped" + obj.isAssertion = false + obj.showError = true + obj.errorTitle = "Passkey authentication failed." + obj.errorMessage = mainForm.errorMessage +it_jtnxk = {success:false, error: "Login attempt exceeded"} +Finish it_jtnxk \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.main.json b/code/org.gluu.agama.passkey.main.json new file mode 100644 index 0000000..ac0eb4a --- /dev/null +++ b/code/org.gluu.agama.passkey.main.json @@ -0,0 +1,1799 @@ +{ + "nodes": [ + { + "width": 170, + "height": 124, + "id": "finish-0ec140a8-d576-4116-9e5b-5099ba614fdc", + "position": { + "x": 1322.3267328979139, + "y": 28.785805115604973 + }, + "type": "finish", + "data": { + "id": "finish-0ec140a8-d576-4116-9e5b-5099ba614fdc", + "type": "Agama-finish-Flow", + "parentId": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "whenCondition": "", + "inRepeatBlock": false, + "handles": [ + "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745.InFlow", + "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745.InRepeatBlock" + ], + "position": { + "x": 1322.3267328979139, + "y": 28.785805115604973 + }, + "agamaData": { + "id": "finish-0ec140a8-d576-4116-9e5b-5099ba614fdc", + "parentId": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "Login attempt exceeded", + "finishMode": "withFailure", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response error" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1322.3267328979139, + "y": 28.785805115604973 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "finish-b3590c97-7f78-47ac-9fb4-c8ef7e830c0d", + "position": { + "x": 3093.80392980574, + "y": 1242.3409483097557 + }, + "type": "finish", + "data": { + "id": "finish-b3590c97-7f78-47ac-9fb4-c8ef7e830c0d", + "type": "Agama-finish-Flow", + "parentId": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "handles": [ + "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b.FAILURE", + "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b.SUCCESS" + ], + "position": { + "x": 3093.80392980574, + "y": 1242.3409483097557 + }, + "agamaData": { + "id": "finish-b3590c97-7f78-47ac-9fb4-c8ef7e830c0d", + "parentId": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "{ userId: userData.uid }", + "finishMode": "withSuccess", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response success" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3093.80392980574, + "y": 1242.3409483097557 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "position": { + "x": 2894.4359079447627, + "y": 1082.774063923483 + }, + "parentId": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "type": "when", + "data": { + "id": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "type": "Agama-when-Node", + "parentId": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 2894.4359079447627, + "y": 1082.774063923483 + }, + "agamaData": { + "id": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "parentId": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "listTrigger.success", + "operator": "is", + "dataValue": "true", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b.FAILURE", + "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2894.4359079447627, + "y": 1082.774063923483 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "position": { + "x": 2638.550717328836, + "y": 1027.816090494094 + }, + "type": "trigger", + "data": { + "id": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "type": "Agama-trigger-Node", + "parentId": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 2638.550717328836, + "y": 1027.816090494094 + }, + "agamaData": { + "id": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "parentId": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "type": "Agama-trigger-Node", + "displayName": "Passkey list trigger", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "nodeIcon": "fluent-mdl2:trigger-approval", + "flowFileName": "org.gluu.agama.passkey.list", + "arguments": "userData conf", + "asssignedVariableName": "listTrigger", + "exceptionVariableField": "" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 2638.550717328836, + "y": 1027.816090494094 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "position": { + "x": 2439.397462641198, + "y": 1027.816090494094 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2439.397462641198, + "y": 1027.816090494094 + }, + "agamaData": { + "id": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "parentId": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "type": "Agama-call-Node", + "displayName": "Get account from UID", + "hasComment": true, + "comment": "", + "javaClassName": "org.gluu.agama.passkey.IdentityProcessor", + "javaMethodName": "accountFromUid", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Call static method", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "authResult.uid" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "userData" + }, + "skake": false + }, + "selected": true, + "positionAbsolute": { + "x": 2439.397462641198, + "y": 1027.816090494094 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "position": { + "x": 2232.408732968958, + "y": 847.774063923483 + }, + "parentId": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "type": "when", + "data": { + "id": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "type": "Agama-when-Node", + "parentId": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 2232.408732968958, + "y": 847.774063923483 + }, + "agamaData": { + "id": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "parentId": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "authResult.success", + "operator": "is", + "dataValue": "true", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42.FAILURE", + "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2232.408732968958, + "y": 847.774063923483 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "position": { + "x": 1938.4200032967178, + "y": 648.7889155182895 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 1938.4200032967178, + "y": 648.7889155182895 + }, + "agamaData": { + "id": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "parentId": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "mainForm.username", + "assignedVariableName": "authResult.uid" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1938.4200032967178, + "y": 648.7889155182895 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "position": { + "x": 1665.5999064335406, + "y": 487.9073061694096 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 1665.5999064335406, + "y": 487.9073061694096 + }, + "agamaData": { + "id": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "parentId": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "type": "Agama-call-Node", + "displayName": "Authenticate with credentials", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "authenticate", + "javaVariableName": "cdiUtil", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "mainForm.username", + "mainForm.password" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "authResult.success" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 1665.5999064335406, + "y": 487.9073061694096 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-fe14556e-f0e4-4362-867e-0d599d071721", + "position": { + "x": 2453.3672329249666, + "y": 666.5705670779025 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-fe14556e-f0e4-4362-867e-0d599d071721", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 2453.3672329249666, + "y": 666.5705670779025 + }, + "agamaData": { + "id": "Agama-assignment-Node-fe14556e-f0e4-4362-867e-0d599d071721", + "parentId": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "detestable", + "assignedVariableName": "obj.assertion" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2453.3672329249666, + "y": 666.5705670779025 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "position": { + "x": 2117.8879829469624, + "y": 464.1984374232589 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2117.8879829469624, + "y": 464.1984374232589 + }, + "agamaData": { + "id": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "parentId": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "type": "Agama-call-Node", + "displayName": "Assertion request", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "assertionRequest", + "javaVariableName": "fidoValidator", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": [ + "null" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "detestable" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2117.8879829469624, + "y": 464.1984374232589 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-3444c2b9-4561-493d-9018-7f434fec2b36", + "position": { + "x": 3002.043716249156, + "y": 838.5287999353517 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-3444c2b9-4561-493d-9018-7f434fec2b36", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 3002.043716249156, + "y": 838.5287999353517 + }, + "agamaData": { + "id": "Agama-assignment-Node-3444c2b9-4561-493d-9018-7f434fec2b36", + "parentId": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey authentication failed.", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "E.message", + "assignedVariableName": "obj.errorMessage" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3002.043716249156, + "y": 838.5287999353517 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "finish-69c30941-5be8-4eb4-aa60-d0a53d630d66", + "position": { + "x": 3353.198067154377, + "y": 832.2284101106668 + }, + "type": "finish", + "data": { + "id": "finish-69c30941-5be8-4eb4-aa60-d0a53d630d66", + "type": "Agama-finish-Flow", + "parentId": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "handles": [ + "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50.FAILURE", + "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50.SUCCESS" + ], + "position": { + "x": 3353.198067154377, + "y": 832.2284101106668 + }, + "agamaData": { + "id": "finish-69c30941-5be8-4eb4-aa60-d0a53d630d66", + "parentId": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "{ userId: verifyResponse }", + "finishMode": "withSuccess", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response username" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3353.198067154377, + "y": 832.2284101106668 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "position": { + "x": 2455.342010037099, + "y": 464.5820968337224 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "type": "Agama-call-Node", + "parentId": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2455.342010037099, + "y": 464.5820968337224 + }, + "agamaData": { + "id": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "parentId": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "type": "Agama-call-Node", + "displayName": "Assertion verify", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "verify", + "javaVariableName": "fidoValidator", + "exceptionVariableField": "E", + "callType": "Call method on instance", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "arguments": "mainForm.tokenResponse", + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "verifyResponse" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2455.342010037099, + "y": 464.5820968337224 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-0b8e9487-19b4-4d39-a1c4-eefb74936a2c", + "position": { + "x": 2745.799023390952, + "y": 443.15157203514866 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-0b8e9487-19b4-4d39-a1c4-eefb74936a2c", + "type": "Agama-assignment-Node", + "parentId": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "position": { + "x": 2745.799023390952, + "y": 443.15157203514866 + }, + "agamaData": { + "id": "Agama-assignment-Node-0b8e9487-19b4-4d39-a1c4-eefb74936a2c", + "parentId": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "WhenTrue", + "inRepeatBlock": true, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "false", + "assignedVariableName": "obj.isAssertion" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "true", + "assignedVariableName": "obj.showError" + }, + { + "variableTypeCheck": true, + "assignmentExpression": "Passkey authentication failed.", + "assignedVariableName": "obj.errorTitle" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "mainForm.errorMessage", + "assignedVariableName": "obj.errorMessage" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2745.799023390952, + "y": 443.15157203514866 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "position": { + "x": 1221.354383017349, + "y": 218.1102764883709 + }, + "type": "rrf", + "data": { + "id": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "type": "Agama-rrf-Node", + "parentId": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "whenCondition": "", + "inRepeatBlock": true, + "position": { + "x": 1221.354383017349, + "y": 218.1102764883709 + }, + "agamaData": { + "id": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "parentId": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "type": "Agama-rrf-Node", + "displayName": "Render main view", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": true, + "assignments": [], + "nodeIcon": "ph:globe-simple", + "templatePath": "main.ftlh", + "asssignedVariableName": "mainForm", + "arguments": "obj" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1221.354383017349, + "y": 218.1102764883709 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "position": { + "x": 1029, + "y": 29.285805115604944 + }, + "type": "repeat", + "data": { + "id": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "type": "Agama-repeat-Node", + "parentId": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "whenCondition": "", + "inRepeatBlock": false, + "handles": [ + "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745.InFlow", + "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745.InRepeatBlock" + ], + "position": { + "x": 1029, + "y": 29.285805115604944 + }, + "agamaData": { + "id": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "parentId": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "type": "Agama-repeat-Node", + "nodeIcon": "material-symbols:event-repeat-outline-rounded", + "maxIteration": "50", + "displayName": "Repeat 50 times", + "hasComment": true, + "hasNoRepeat": true, + "hasSuccess": "", + "hasFailure": "", + "hasRepeat": false + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 1029, + "y": 29.285805115604944 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "position": { + "x": 830, + "y": 28.785805115604944 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "type": "Agama-assignment-Node", + "parentId": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 830, + "y": 28.785805115604944 + }, + "agamaData": { + "id": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "parentId": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "{}", + "assignedVariableName": "authResult" + }, + { + "variableTypeCheck": false, + "assignmentExpression": "{ success: true, assertion: \"{}\", isAssertion: false, showError: false, errorTitle: \"\", errorMessage: \"\" }", + "assignedVariableName": "obj" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 830, + "y": 28.785805115604944 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "position": { + "x": 630, + "y": 28.785805115604944 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "type": "Agama-call-Node", + "parentId": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 630, + "y": 28.785805115604944 + }, + "agamaData": { + "id": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "parentId": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "type": "Agama-call-Node", + "displayName": "FidoValidator instance", + "hasComment": true, + "comment": "", + "javaClassName": "org.gluu.agama.passkey.authn.FidoValidator", + "javaMethodName": "", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Create an instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "fidoValidator" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 630, + "y": 28.785805115604944 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "position": { + "x": 430, + "y": 28.785805115604944 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "type": "Agama-call-Node", + "parentId": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 430, + "y": 28.785805115604944 + }, + "agamaData": { + "id": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "parentId": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "type": "Agama-call-Node", + "displayName": "CdiUtil static instance", + "hasComment": true, + "comment": "", + "javaClassName": "io.jans.service.cdi.util.CdiUtil", + "javaMethodName": "bean", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Call static method", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [ + "authService" + ], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "cdiUtil" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 430, + "y": 28.785805115604944 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "position": { + "x": 230, + "y": 29.392902557802472 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "type": "Agama-call-Node", + "parentId": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 230, + "y": 29.392902557802472 + }, + "agamaData": { + "id": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "parentId": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420", + "type": "Agama-call-Node", + "displayName": "Authentication service class", + "hasComment": true, + "comment": "", + "javaClassName": "io.jans.as.server.service.AuthenticationService", + "javaMethodName": "", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Get class object", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "authService" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 230, + "y": 29.392902557802472 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420", + "type": "start", + "sourcePosition": "right", + "data": { + "id": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420", + "type": "Agama-start-Flow", + "position": { + "x": 30, + "y": 30 + }, + "inRepeatBlock": false, + "agamaData": { + "id": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420", + "type": "Agama-start-Flow", + "displayName": "Passkey Main", + "hasComment": true, + "comment": "", + "isTopLevelFlow": true, + "basepath": "", + "configParams": "{}", + "nodeIcon": "material-symbols:line-start-square", + "timeout": "", + "inputs": "", + "configs": "conf", + "flowname": "org.gluu.agama.passkey.main" + }, + "skake": false + }, + "position": { + "x": 30, + "y": 30 + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 30, + "y": 30 + } + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "position": { + "x": 2555.3814677678, + "y": 270.80294324387864 + }, + "parentId": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "type": "when", + "data": { + "id": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2555.3814677678, + "y": 270.80294324387864 + }, + "agamaData": { + "id": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "parentId": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "mainForm.skipped", + "operator": "is", + "dataValue": "\"skipped\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2255.3814677678 + } + }, + "handles": [ + "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9.FAILURE", + "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2555.3814677678, + "y": 270.80294324387864 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "position": { + "x": 2753.564466271152, + "y": 652.559556178203 + }, + "parentId": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "type": "when", + "data": { + "id": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "type": "Agama-when-Node", + "parentId": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "whenCondition": "WhenFalse", + "inRepeatBlock": true, + "position": { + "x": 2753.564466271152, + "y": 652.559556178203 + }, + "agamaData": { + "id": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "parentId": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "E", + "operator": "is not", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true + }, + "handles": [ + "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef.FAILURE", + "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2753.564466271152, + "y": 652.559556178203 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "position": { + "x": 3180.899513911112, + "y": 653.008030805264 + }, + "parentId": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "type": "when", + "data": { + "id": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 3180.899513911112, + "y": 653.008030805264 + }, + "agamaData": { + "id": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "parentId": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "E", + "operator": "is", + "dataValue": "null", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2880.899513911112 + } + }, + "handles": [ + "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50.FAILURE", + "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 3180.899513911112, + "y": 653.008030805264 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "position": { + "x": 2269.8660005175525, + "y": 270.82010159349556 + }, + "parentId": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "type": "when", + "data": { + "id": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 2269.8660005175525, + "y": 270.82010159349556 + }, + "agamaData": { + "id": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "parentId": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "mainForm.tokenResponse", + "operator": "is not", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 2119.8660005175525 + } + }, + "handles": [ + "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c.FAILURE", + "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 2269.8660005175525, + "y": 270.82010159349556 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "position": { + "x": 1511.9561314401394, + "y": 270.52801398067237 + }, + "parentId": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "type": "when", + "data": { + "id": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "type": "Agama-when-Node", + "parentId": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "whenCondition": "WhenFalse", + "inRepeatBlock": true, + "position": { + "x": 1511.9561314401394, + "y": 270.52801398067237 + }, + "agamaData": { + "id": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "parentId": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "mainForm.loginBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true + }, + "handles": [ + "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3.FAILURE", + "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1511.9561314401394, + "y": 270.52801398067237 + }, + "dragging": false + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "position": { + "x": 1930.3743954590598, + "y": 272.3019764795726 + }, + "parentId": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "type": "when", + "data": { + "id": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "type": "Agama-when-Node", + "parentId": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 1930.3743954590598, + "y": 272.3019764795726 + }, + "agamaData": { + "id": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "parentId": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "type": "Agama-when-Node", + "hasFailure": true, + "conditions": [ + { + "variable": "mainForm.loginWithPasskeyBtn", + "operator": "is", + "dataValue": "\"\"", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": true, + "hasSuccess": true, + "position": { + "x": 1930.3743954590598 + } + }, + "handles": [ + "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db.FAILURE", + "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1930.3743954590598, + "y": 272.3019764795726 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + } + ], + "edges": [ + { + "id": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420-Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46-1e7d2d04-69cb-4113-8dde-998c3e4082dc", + "type": "straight", + "source": "Agama-start-Flow-2e3f09bf-fd7b-47cf-b55a-6519d9ee4420", + "target": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46-Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718-0228fdc2-3cc6-4f40-90da-148a9489f312", + "type": "straight", + "source": "Agama-call-Node-c166c478-2040-4e2e-8967-a59d5da5ac46", + "target": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718-Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324-fba834a6-4995-412c-957b-db80f68f3647", + "type": "straight", + "source": "Agama-call-Node-2ffc4a8d-7ebc-451f-a491-37072013d718", + "target": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324-Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94-2e21bb63-de8a-452f-b0f0-290b8a2ab0aa", + "type": "straight", + "source": "Agama-call-Node-f3074067-fd6f-4547-8348-c66a511fd324", + "target": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94-Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745-84abc826-15a2-4254-8a43-4ae98401c8be", + "type": "straight", + "source": "Agama-assignment-Node-6437c169-3f8e-4a5a-81c4-0a9549a14f94", + "target": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745-Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78-3424337d-77c0-4df2-b46c-75d34d1cb64b", + "type": "straight", + "source": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "target": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "label": "In Block", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745.InRepeatBlock" + }, + { + "id": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9-Agama-assignment-Node-0b8e9487-19b4-4d39-a1c4-eefb74936a2c-381a9c6e-e5d0-46c2-accb-bd1f960251bb", + "type": "straight", + "source": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "target": "Agama-assignment-Node-0b8e9487-19b4-4d39-a1c4-eefb74936a2c", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9.SUCCESS" + }, + { + "id": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c-Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9-28d0f236-1d1a-4fe5-8075-0991adbd204e", + "type": "straight", + "source": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "target": "Agama-when-Node-297e4309-03d5-42e7-b49f-0d5a13d290e9", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c.FAILURE" + }, + { + "id": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c-Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0-8e8af2a6-e0d9-49b5-8b56-015b68c06e3b", + "type": "straight", + "source": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "target": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c.SUCCESS" + }, + { + "id": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50-finish-69c30941-5be8-4eb4-aa60-d0a53d630d66-d9ad46d7-c492-4ac7-9cf1-ac38b2b29789", + "type": "straight", + "source": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "target": "finish-69c30941-5be8-4eb4-aa60-d0a53d630d66", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50.SUCCESS" + }, + { + "id": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0-Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef-80ba61c5-e05a-4468-91be-f4f679543d11", + "type": "straight", + "source": "Agama-call-Node-2564883c-a538-4c63-81c5-2a25154448c0", + "target": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef-Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50-da025c85-46d8-46df-aeaa-1e2163d0f28f", + "type": "straight", + "source": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "target": "Agama-when-Node-03fbac87-d255-4ea7-bcd1-a7d142f2ab50", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef.FAILURE" + }, + { + "id": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef-Agama-assignment-Node-3444c2b9-4561-493d-9018-7f434fec2b36-21b6ed64-d77b-4866-9899-6a08efa91057", + "type": "straight", + "source": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef", + "target": "Agama-assignment-Node-3444c2b9-4561-493d-9018-7f434fec2b36", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-a2cfe299-fc78-4739-839e-ab74a1ed8eef.SUCCESS" + }, + { + "id": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db-Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c-948b827c-f797-4543-a8e9-487e483f2ebf", + "type": "straight", + "source": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "target": "Agama-when-Node-f52ef8e3-bd28-437d-b699-15fd23fd663c", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db.FAILURE" + }, + { + "id": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db-Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53-ca51f247-d43d-46c7-ab49-980d2b0053f8", + "type": "straight", + "source": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "target": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db.SUCCESS" + }, + { + "id": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53-Agama-assignment-Node-fe14556e-f0e4-4362-867e-0d599d071721-ac8e7f71-8aeb-4b48-8091-f38242aa32f9", + "type": "straight", + "source": "Agama-call-Node-3eebfff1-071d-47e5-9b57-ba7fa2697b53", + "target": "Agama-assignment-Node-fe14556e-f0e4-4362-867e-0d599d071721", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78-Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3-5054bb32-2ae5-4116-99be-d0149ff9aa69", + "type": "straight", + "source": "Agama-rrf-Node-212f9d24-4203-469c-ade1-fcd7b8557a78", + "target": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3-Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db-3f97615c-48c6-4eab-8de1-91c32ff308ab", + "type": "straight", + "source": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "target": "Agama-when-Node-904352e8-24f8-42ab-bde4-56af3dd195db", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3.FAILURE" + }, + { + "id": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3-Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff-38aa3d8e-f6d4-42f1-810d-04372d30a89f", + "type": "straight", + "source": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3", + "target": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-90ce65ec-a034-4b39-a5e9-4266069cc3d3.SUCCESS" + }, + { + "id": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff-Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30-020c60e9-c687-4d8f-86b4-97482e7d4356", + "type": "straight", + "source": "Agama-call-Node-bc0fa067-0129-4cc0-bf6d-6391cea027ff", + "target": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30-Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42-7be78b80-0fa0-4438-8246-9316f3587b75", + "type": "straight", + "source": "Agama-assignment-Node-35b5a76b-bba7-4c0f-bb72-439d94467c30", + "target": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42-Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b-e2a5be17-24de-4858-8a12-1323255d37cc", + "type": "straight", + "source": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42", + "target": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-d72a821d-13ea-40ff-94b2-ecb094f2ff42.SUCCESS" + }, + { + "id": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b-Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f-cfe2dcaa-ef4c-4d33-a69f-c535e57ad265", + "type": "straight", + "source": "Agama-call-Node-38b6f190-4dff-478d-852d-967c2d51b60b", + "target": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f-Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b-b242e47d-54ed-4f51-8e44-43e0e7aaa93e", + "type": "straight", + "source": "Agama-trigger-Node-c2baf16d-2fe3-4b88-852f-eec08f53423f", + "target": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b-finish-b3590c97-7f78-47ac-9fb4-c8ef7e830c0d-d96e1075-dc73-4e6c-ac9b-4f9b13006e9c", + "type": "straight", + "source": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b", + "target": "finish-b3590c97-7f78-47ac-9fb4-c8ef7e830c0d", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-1e9f7568-075a-42eb-984a-2544bafabc1b.SUCCESS" + }, + { + "id": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745-finish-0ec140a8-d576-4116-9e5b-5099ba614fdc-c28e0c4c-087c-4de9-bda1-3e8840df5278", + "type": "straight", + "source": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745", + "target": "finish-0ec140a8-d576-4116-9e5b-5099ba614fdc", + "label": "Not In Block", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-repeat-Node-cb2c4b3b-58fa-4cfa-8df7-196eda6ea745.InFlow" + } + ], + "viewport": { + "x": -1903, + "y": -660, + "zoom": 1 + } +} \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.nickname.flow b/code/org.gluu.agama.passkey.nickname.flow new file mode 100644 index 0000000..14fe3b2 --- /dev/null +++ b/code/org.gluu.agama.passkey.nickname.flow @@ -0,0 +1,12 @@ +Flow org.gluu.agama.passkey.nickname + Basepath "" + Inputs key userData +inum = userData.inum +nicknameForm = RRF "nickname.ftlh" +fidoEnroller = Call org.gluu.agama.passkey.enroll.FidoEnroller#new +nickNamed = Call fidoEnroller nameIt inum nicknameForm.nickname key +When nickNamed is false + it_prlmb = {success:false, error: "Nickname passkey failed to save"} + Finish it_prlmb +it_xcwsi = {success:true, data: { userId: inum, message: "Nickname passkey saved"}} +Finish it_xcwsi \ No newline at end of file diff --git a/code/org.gluu.agama.passkey.nickname.json b/code/org.gluu.agama.passkey.nickname.json new file mode 100644 index 0000000..4513f7e --- /dev/null +++ b/code/org.gluu.agama.passkey.nickname.json @@ -0,0 +1,502 @@ +{ + "nodes": [ + { + "width": 170, + "height": 124, + "id": "finish-2dd91a73-7ce4-480a-8ecb-31aee5748398", + "position": { + "x": 1477, + "y": 22.605256333649606 + }, + "type": "finish", + "data": { + "id": "finish-2dd91a73-7ce4-480a-8ecb-31aee5748398", + "type": "Agama-finish-Flow", + "parentId": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "whenCondition": "WhenFalse", + "inRepeatBlock": false, + "handles": [ + "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.FAILURE", + "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.SUCCESS" + ], + "position": { + "x": 1477, + "y": 22.605256333649606 + }, + "agamaData": { + "id": "finish-2dd91a73-7ce4-480a-8ecb-31aee5748398", + "parentId": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "{ userId: inum, message: \"Nickname passkey saved\"}", + "finishMode": "withSuccess", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response success" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1477, + "y": 22.605256333649606 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "finish-64bedf04-d03b-41d8-9f9f-989a0692aa0e", + "position": { + "x": 1415, + "y": 287 + }, + "type": "finish", + "data": { + "id": "finish-64bedf04-d03b-41d8-9f9f-989a0692aa0e", + "type": "Agama-finish-Flow", + "parentId": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "whenCondition": "WhenTrue", + "inRepeatBlock": false, + "handles": [ + "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.FAILURE", + "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.SUCCESS" + ], + "position": { + "x": 1415, + "y": 287 + }, + "agamaData": { + "id": "finish-64bedf04-d03b-41d8-9f9f-989a0692aa0e", + "parentId": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "type": "Agama-finish-Flow", + "hasSuccess": false, + "hasFailure": false, + "hasComment": true, + "comment": "", + "flowfilename": "", + "returnVariable": "Nickname passkey failed to save", + "finishMode": "withFailure", + "nodeIcon": "material-symbols:line-end-square-rounded", + "displayName": "Response error" + }, + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1415, + "y": 287 + }, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "position": { + "x": 630, + "y": 30 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "type": "Agama-call-Node", + "parentId": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 630, + "y": 30 + }, + "agamaData": { + "id": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "parentId": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "type": "Agama-call-Node", + "displayName": "FidoEnroller instance", + "hasComment": true, + "comment": "", + "javaClassName": "org.gluu.agama.passkey.enroll.FidoEnroller", + "javaMethodName": "", + "javaVariableName": "", + "exceptionVariableField": "", + "callType": "Create an instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": [], + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "fidoEnroller" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 630, + "y": 30 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "position": { + "x": 430, + "y": 30 + }, + "type": "rrf", + "data": { + "id": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "type": "Agama-rrf-Node", + "parentId": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 430, + "y": 30 + }, + "agamaData": { + "id": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "parentId": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "type": "Agama-rrf-Node", + "displayName": "Render nickname input view", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [], + "nodeIcon": "ph:globe-simple", + "templatePath": "nickname.ftlh", + "asssignedVariableName": "nicknameForm" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 430, + "y": 30 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "position": { + "x": 230, + "y": 30 + }, + "type": "assignment", + "data": { + "id": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "type": "Agama-assignment-Node", + "parentId": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 230, + "y": 30 + }, + "agamaData": { + "id": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "parentId": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "Agama-assignment-Node", + "displayName": "", + "hasComment": true, + "comment": "", + "whenCondition": "", + "inRepeatBlock": false, + "assignments": [ + { + "variableTypeCheck": false, + "assignmentExpression": "userData.inum", + "assignedVariableName": "inum" + } + ], + "nodeIcon": "material-symbols:equal" + }, + "skake": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 230, + "y": 30 + } + }, + { + "width": 170, + "height": 124, + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "start", + "sourcePosition": "right", + "data": { + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "Agama-start-Flow", + "position": { + "x": 30, + "y": 30 + }, + "inRepeatBlock": false, + "agamaData": { + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "type": "Agama-start-Flow", + "displayName": "Passkey Nickname", + "hasComment": true, + "comment": "", + "isTopLevelFlow": true, + "basepath": "", + "configParams": "{}", + "nodeIcon": "material-symbols:line-start-square", + "timeout": "", + "inputs": "key userData", + "configs": "", + "flowname": "org.gluu.agama.passkey.nickname" + }, + "skake": false + }, + "position": { + "x": 30, + "y": 30 + }, + "positionAbsolute": { + "x": 30, + "y": 30 + }, + "selected": false, + "dragging": false + }, + { + "width": 170, + "height": 124, + "id": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "position": { + "x": 863, + "y": 27 + }, + "type": "call", + "data": { + "id": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "type": "Agama-call-Node", + "parentId": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "whenCondition": "", + "inRepeatBlock": false, + "position": { + "x": 863, + "y": 27 + }, + "agamaData": { + "id": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "parentId": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "type": "Agama-call-Node", + "displayName": "Save nickname", + "hasComment": true, + "comment": "", + "javaClassName": "", + "javaMethodName": "nameIt", + "javaVariableName": "fidoEnroller", + "exceptionVariableField": "", + "callType": "Call method on instance", + "whenCondition": "", + "inRepeatBlock": false, + "arguments": "inum nicknameForm.nickname key", + "nodeIcon": "material-symbols:code", + "asssignedVariableName": "nickNamed" + } + }, + "selected": true, + "dragging": false, + "positionAbsolute": { + "x": 863, + "y": 27 + } + }, + { + "width": 210, + "height": 140, + "id": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "position": { + "x": 1106, + "y": 84 + }, + "parentId": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "type": "when", + "data": { + "id": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "type": "Agama-when-Node", + "parentId": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "whenCondition": "", + "inRepeatBlock": "", + "position": { + "x": 1106, + "y": 84 + }, + "agamaData": { + "id": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "parentId": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "type": "Agama-when-Node", + "conditions": [ + { + "variable": "nickNamed", + "operator": "is", + "dataValue": "false", + "combinator": "none" + } + ], + "hasComment": true, + "inRepeatBlock": false, + "hasFailure": true, + "hasSuccess": true, + "hasNoRepeat": false, + "hasRepeat": false, + "position": { + "x": 1106 + } + }, + "handles": [ + "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.FAILURE", + "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.SUCCESS" + ], + "skake": false + }, + "selected": false, + "positionAbsolute": { + "x": 1106, + "y": 84 + }, + "dragging": false, + "whenCondition": "", + "inRepeatBlock": "" + } + ], + "edges": [ + { + "id": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818-Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4-b8c57c37-1ed1-46e2-9536-9fc91c2e77c5", + "type": "straight", + "source": "Agama-start-Flow-6c1c7061-0c95-4167-b910-dfaba3878818", + "target": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4-Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24-5149d2ba-ac0b-4c04-8924-d36e532b4a08", + "type": "straight", + "source": "Agama-assignment-Node-74fba559-7aaf-415d-a7b6-dcde2be6f6c4", + "target": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24-Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a-8e0f7ecb-a154-471f-b494-f65ede326114", + "type": "straight", + "source": "Agama-rrf-Node-480fe837-8db9-4474-9fcd-e5cd09bb1d24", + "target": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248-finish-64bedf04-d03b-41d8-9f9f-989a0692aa0e-01647453-a7c6-4554-a612-ccee6211c701", + "type": "straight", + "source": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "target": "finish-64bedf04-d03b-41d8-9f9f-989a0692aa0e", + "label": "Condition met", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.SUCCESS" + }, + { + "id": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248-finish-2dd91a73-7ce4-480a-8ecb-31aee5748398-6f21091f-f9c8-4488-a780-f7395ce32909", + "type": "straight", + "source": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "target": "finish-2dd91a73-7ce4-480a-8ecb-31aee5748398", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + }, + "sourceHandle": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248.FAILURE" + }, + { + "id": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a-Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b-a11ad81c-bff0-40a9-ad89-ff80432c1afd", + "type": "straight", + "source": "Agama-call-Node-8ed1325d-5c01-45bb-8be1-fcedf293705a", + "target": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + }, + { + "id": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b-Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248-62b189e1-e7ea-455e-a475-3a4beb7e50c9", + "type": "straight", + "source": "Agama-call-Node-afbeff50-1e92-4a19-be6a-df6f7ada5c8b", + "target": "Agama-when-Node-ab55f7db-7275-4b2f-99fe-d199109d2248", + "label": "", + "labelBgPadding": [ + 8, + 4 + ], + "labelBgBorderRadius": 4, + "labelBgStyle": { + "fill": "#FFCC00", + "color": "#fff", + "fillOpacity": 0.7 + } + } + ], + "viewport": { + "x": -379, + "y": 117, + "zoom": 1 + } +} \ No newline at end of file diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..13f6385 --- /dev/null +++ b/lib/README.md @@ -0,0 +1 @@ +### Library folder \ No newline at end of file diff --git a/lib/org/gluu/agama/passkey/CasaWSBase.java b/lib/org/gluu/agama/passkey/CasaWSBase.java new file mode 100644 index 0000000..39f06dd --- /dev/null +++ b/lib/org/gluu/agama/passkey/CasaWSBase.java @@ -0,0 +1,131 @@ +package org.gluu.agama.passkey; + +import com.nimbusds.oauth2.sdk.ParseException; +import com.nimbusds.oauth2.sdk.http.HTTPRequest; +import com.nimbusds.oauth2.sdk.http.HTTPResponse; +import io.jans.casa.conf.OIDCClientSettings; +import io.jans.casa.model.ApplicationConfiguration; +import io.jans.orm.PersistenceEntryManager; +import io.jans.service.cdi.util.CdiUtil; +import io.jans.util.NetworkUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Base64; +import java.util.Map; +import java.util.StringJoiner; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class CasaWSBase { + + public static final String SCOPE_PREFIX = "https://jans.io/"; + + private static final int TOKEN_EXP_GAP = 299; + + //making it static prevents a serialization error... + protected static final Logger log = LoggerFactory.getLogger(CasaWSBase.class); + + private String basicAuthnHeader; + private String serverBase; + private String token; + private long tokenExp; + private String scope; + protected String apiBase; + + public CasaWSBase() throws IOException { + this(false); + } + + //constructor added to prevent serialization error... + public CasaWSBase(boolean doHealthCheck) throws IOException { + OIDCClientSettings clSettings = null; + try { + PersistenceEntryManager entryManager = CdiUtil.bean(PersistenceEntryManager.class); + clSettings = entryManager.find(ApplicationConfiguration.class, "ou=casa,ou=configuration,o=jans").getSettings().getOidcSettings().getClient(); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new IOException("Unable to retrieve Casa configuration. Is Casa installed?"); + } + + serverBase = NetworkUtils.urlBeforeContextPath(); + apiBase = serverBase + "/jans-casa/rest"; + + if (doHealthCheck) { + ensureCasaAvailability(); + } + + String authz = clSettings.getClientId() + ":" + clSettings.getClientSecret(); + authz = new String(Base64.getEncoder().encode(authz.getBytes(UTF_8)), UTF_8); + basicAuthnHeader = "Basic " + authz; + } + + protected void setScope(String scope) { + this.scope = scope; + } + + protected String getApiBase() { + return apiBase; + } + + protected HTTPResponse sendRequest(HTTPRequest request, boolean checkOK, boolean withToken) + throws IOException, ParseException { + setTimeouts(request); + if (withToken) { + refreshToken(); + request.setAuthorization("Bearer " + token); + } + + HTTPResponse r = request.send(); + if (checkOK) { + r.ensureStatusCode(200); + } + return r; + } + + protected String encode(String str) { + return URLEncoder.encode(str, UTF_8); + } + + private void ensureCasaAvailability() throws IOException { + try { + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.GET, + new URL(serverBase + "/jans-casa/health-check")); + sendRequest(request, true, false); + } catch (Exception e) { + log.warn("Casa not installed or not running?"); + throw new IOException("Casa health-check request did not succeed", e); + } + } + + private void refreshToken() throws IOException { + if (System.currentTimeMillis() < tokenExp - TOKEN_EXP_GAP) return; + + StringJoiner joiner = new StringJoiner("&"); + Map.of("grant_type", "client_credentials", "scope", scope) + .forEach((k, v) -> joiner.add(k + "=" + v)); + + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.POST, new URL(serverBase + "/jans-auth/restv1/token")); + setTimeouts(request); + request.setQuery(joiner.toString()); + request.setAuthorization(basicAuthnHeader); + + try { + Map jobj = request.send().getContentAsJSONObject(); + + long exp = Long.parseLong(jobj.get("expires_in").toString()) * 1000; + tokenExp = System.currentTimeMillis() + exp; + token = jobj.get("access_token").toString(); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + private void setTimeouts(HTTPRequest request) { + request.setConnectTimeout(3500); + request.setReadTimeout(3500); + } +} diff --git a/lib/org/gluu/agama/passkey/EnrollmentHelper.java b/lib/org/gluu/agama/passkey/EnrollmentHelper.java new file mode 100644 index 0000000..1aaed9c --- /dev/null +++ b/lib/org/gluu/agama/passkey/EnrollmentHelper.java @@ -0,0 +1,41 @@ +package org.gluu.agama.passkey; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.nimbusds.oauth2.sdk.http.HTTPRequest; + +import java.io.IOException; +import java.net.URL; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.StringJoiner; + +public class EnrollmentHelper extends CasaWSBase { + + private static final String SCOPE_CONFIG = SCOPE_PREFIX + "casa.config"; + private static final String SCOPE_2FA = SCOPE_PREFIX + "casa.2fa"; + + public EnrollmentHelper() throws IOException { + super(true); + setScope(SCOPE_CONFIG + " " + SCOPE_2FA); + } + + public MFAUserInfo getMFAUserInfo(String personUid, Set methods) throws IOException { + try { + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.GET, new URL(apiBase + "/v2/2fa/user-info/" + encode(personUid))); + StringJoiner joiner = new StringJoiner("&"); + methods.forEach(m -> joiner.add("m=" + m)); + request.setQuery(joiner.toString()); + Map response = sendRequest(request, true, true).getContentAsJSONObject(); + ObjectMapper mapper = new ObjectMapper(); + return mapper.convertValue(response, MFAUserInfo.class); + + } catch (Exception e) { + throw new IOException("Unable to determine the amount of enrolled credentials", e); + } + } + + public MFAUserInfo getMFAUserInfoByFido2(String personUid) throws IOException { + return getMFAUserInfo(personUid, Collections.singleton("fido2")); + } +} diff --git a/lib/org/gluu/agama/passkey/IdentityProcessor.java b/lib/org/gluu/agama/passkey/IdentityProcessor.java new file mode 100644 index 0000000..fa16043 --- /dev/null +++ b/lib/org/gluu/agama/passkey/IdentityProcessor.java @@ -0,0 +1,56 @@ +package org.gluu.agama.passkey; + +import io.jans.as.common.model.common.User; +import io.jans.as.common.service.common.UserService; +import io.jans.as.model.exception.InvalidClaimException; +import io.jans.service.cdi.util.CdiUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +import static io.jans.inbound.Attrs.*; + +public class IdentityProcessor { + + private static final Logger log = LoggerFactory.getLogger(IdentityProcessor.class); + + private static final String INUM_ATTR = "inum"; + + public static Map accountFromUid(String uid) throws InvalidClaimException { + User user = getUser(UID, uid); + boolean local = user != null; + log.debug("There is {} local account for {}", local ? "a" : "no", uid); + + if (local) { + String inum = getSingleValuedAttr(user, INUM_ATTR); + String name = getSingleValuedAttr(user, GIVEN_NAME); + String email = getSingleValuedAttr(user, MAIL); + + if (name == null) { + name = getSingleValuedAttr(user, DISPLAY_NAME); + + if (name == null) { + name = email.substring(0, email.indexOf("@")); + } + } + return Map.of(UID, uid, INUM_ATTR, inum, "name", name, "email", email); + } + return null; + } + + private static User getUser(String attributeName, String value) { + UserService userService = CdiUtil.bean(UserService.class); + return userService.getUserByAttribute(attributeName, value, true); + } + + private static String getSingleValuedAttr(User user, String attribute) throws InvalidClaimException { + Object value; + if (attribute.equals(UID)) { + value = user.getUserId(); + } else { + value = user.getAttribute(attribute, true, false); + } + return value == null ? null : value.toString(); + } +} diff --git a/lib/org/gluu/agama/passkey/MFAUserInfo.java b/lib/org/gluu/agama/passkey/MFAUserInfo.java new file mode 100644 index 0000000..1c29b32 --- /dev/null +++ b/lib/org/gluu/agama/passkey/MFAUserInfo.java @@ -0,0 +1,63 @@ +package org.gluu.agama.passkey; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class MFAUserInfo { + + @JsonProperty("enrolled_methods") + private List enrolledMethods; + + @JsonProperty("total_creds") + private int count; + + @JsonProperty("turned_on") + private boolean turnedOn; + + private String preference; + + public boolean isTurnedOn() { + return turnedOn; + } + + public List getEnrolledMethods() { + return enrolledMethods; + } + + public int getCount() { + return count; + } + + public String getPreference() { + return preference; + } + + public void setTurnedOn(boolean turnedOn) { + this.turnedOn = turnedOn; + } + + public void setEnrolledMethods(List enrolledMethods) { + this.enrolledMethods = enrolledMethods; + } + + public void setCount(int count) { + this.count = count; + } + + public void setPreference(String preference) { + this.preference = preference; + } + + @Override + public String toString() { + return "MFAUserInfo{" + + "enrolledMethods=" + enrolledMethods + + ", count=" + count + + ", turnedOn=" + turnedOn + + ", preference='" + preference + '\'' + + '}'; + } +} diff --git a/lib/org/gluu/agama/passkey/ScimFido2Helper.java b/lib/org/gluu/agama/passkey/ScimFido2Helper.java new file mode 100644 index 0000000..9943e90 --- /dev/null +++ b/lib/org/gluu/agama/passkey/ScimFido2Helper.java @@ -0,0 +1,80 @@ +package org.gluu.agama.passkey; + +import com.nimbusds.oauth2.sdk.http.HTTPRequest; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.IOException; +import java.net.URL; +import java.util.*; + +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + +public class ScimFido2Helper extends ScimWSBase { + + private static final String SCOPE_FIDO2_READ = SCOPE_PREFIX + "/fido2.read"; + private static final String SCOPE_FIDO2_WRITE = SCOPE_PREFIX + "/fido2.write"; + + public ScimFido2Helper() throws IOException { + super(false, null); + } + + public ScimFido2Helper(ScimSetting scimSetting) throws IOException { + super(true, scimSetting); + setScope(SCOPE_FIDO2_READ + " " + SCOPE_FIDO2_WRITE); + } + + public Map getFidoDeviceByUser(String userInum) throws IOException { + try { + URL url = new URL(apiBase + "/v2/Fido2Devices"); + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.GET, url); + request.setAccept("application/json"); + + StringJoiner joiner = new StringJoiner("&"); + Map.of("userId", userInum).forEach((k, v) -> joiner.add(k + "=" + v)); + request.setQuery(joiner.toString()); + + String response = sendRequest(request, true, true).getContentAsJSONObject().toJSONString(); + log.debug("Response scim fido2 devices: {}", response); + JSONObject resObject = new JSONObject(response); + int count = resObject.getInt("totalResults"); + List> mapList = new ArrayList<>(); + if (count > 0) { + JSONArray jsonArray = resObject.getJSONArray("Resources"); + int i = 0; + while (i < jsonArray.length()) { + JSONObject item = jsonArray.getJSONObject(i); + Map result = new HashMap<>(); + result.put("id", item.getString("id")); + result.put("displayName", item.has("displayName") ? item.getString("displayName") : "Registered without name"); + result.put("creationDate", item.getString("creationDate")); + mapList.add(result); + i++; + } + } + return Map.of("count", count, "devices", mapList); + + } catch (Exception e) { + throw new IOException("Could not obtain the user's list of fido devices: " + userInum, e); + } + } + + public String updateDevice(String userId, String deviceId, String displayName) throws Exception { + try { + URL url = new URL(apiBase + "/v2/Fido2Devices/" + encode(deviceId)); + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.PUT, url); + request.setAccept(APPLICATION_JSON); + request.setContentType(APPLICATION_JSON); + String body = net.minidev.json.JSONObject.toJSONString(Map.of("userId", userId, "displayName", displayName)); + log.debug("Request updateDevice body: {}", body); + request.setQuery(body); + + String response = sendRequest(request, true, true).getContentAsJSONObject().toJSONString(); + log.debug("Response update device: {}", response); + return "UPDATED"; + + } catch (Exception e) { + throw new IOException("Could not update device: " + e.getMessage(), e); + } + } +} diff --git a/lib/org/gluu/agama/passkey/ScimSetting.java b/lib/org/gluu/agama/passkey/ScimSetting.java new file mode 100644 index 0000000..b79e37a --- /dev/null +++ b/lib/org/gluu/agama/passkey/ScimSetting.java @@ -0,0 +1,32 @@ +package org.gluu.agama.passkey; + +public class ScimSetting { + + private String scimClientId; + + private String scimClientSecret; + + public String getScimClientId() { + return scimClientId; + } + + public void setScimClientId(String scimClientId) { + this.scimClientId = scimClientId; + } + + public String getScimClientSecret() { + return scimClientSecret; + } + + public void setScimClientSecret(String scimClientSecret) { + this.scimClientSecret = scimClientSecret; + } + + @Override + public String toString() { + return "ScimSetting{" + + "scimClientId='" + scimClientId + '\'' + + ", scimClientSecret='" + scimClientSecret + '\'' + + '}'; + } +} diff --git a/lib/org/gluu/agama/passkey/ScimWSBase.java b/lib/org/gluu/agama/passkey/ScimWSBase.java new file mode 100644 index 0000000..a30e32d --- /dev/null +++ b/lib/org/gluu/agama/passkey/ScimWSBase.java @@ -0,0 +1,123 @@ +package org.gluu.agama.passkey; + +import com.nimbusds.oauth2.sdk.ParseException; +import com.nimbusds.oauth2.sdk.http.HTTPRequest; +import com.nimbusds.oauth2.sdk.http.HTTPResponse; +import io.jans.util.NetworkUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Base64; +import java.util.Map; +import java.util.StringJoiner; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class ScimWSBase { + + public static final String SCOPE_PREFIX = "https://jans.io/scim"; + + private static final int TOKEN_EXP_GAP = 2000; + + //making it static prevents a serialization error... + protected static final Logger log = LoggerFactory.getLogger(ScimWSBase.class); + + private String basicAuthnHeader; + private String serverBase; + private String token; + private long tokenExp; + private String scope; + protected String apiBase; + + public ScimWSBase() throws IOException { + this(false, null); + } + + //constructor added to prevent serialization error... + public ScimWSBase(boolean doHealthCheck, ScimSetting scimSetting) throws IOException { + serverBase = NetworkUtils.urlBeforeContextPath(); + apiBase = serverBase + "/jans-scim/restv1"; + + if (doHealthCheck) { + ensureScimAvailability(); + } + + if (scimSetting != null) { + String authz = scimSetting.getScimClientId() + ":" + scimSetting.getScimClientSecret(); + String authzEncoded = new String(Base64.getEncoder().encode(authz.getBytes(UTF_8)), UTF_8); + basicAuthnHeader = "Basic " + authzEncoded; + log.debug("Scim loaded successfully, basicAuthnHeader: {}, apiBase: {}", authz, apiBase); + } + } + + protected void setScope(String scope) { + this.scope = scope; + } + + + protected String getApiBase() { + return apiBase; + } + + protected HTTPResponse sendRequest(HTTPRequest request, boolean checkOK, boolean withToken) throws IOException, ParseException { + setTimeouts(request); + if (withToken) { + refreshToken(); + request.setAuthorization("Bearer " + token); + log.debug("--> Header Authorization: Bearer {}", token); + } + + HTTPResponse r = request.send(); + if (checkOK) { + r.ensureStatusCode(200); + } + return r; + } + + protected String encode(String str) { + return URLEncoder.encode(str, UTF_8); + } + + private void ensureScimAvailability() throws IOException { + try { + URL url = new URL(serverBase + "/jans-scim/sys/health-check"); + log.debug("Scim health-check url: {}", url); + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.GET, url); + sendRequest(request, true, false); + } catch (Exception e) { + log.warn("SCIM not installed or not running?"); + throw new IOException("SCIM health-check request did not succeed", e); + } + } + + private void refreshToken() throws IOException { + if (System.currentTimeMillis() < tokenExp - TOKEN_EXP_GAP) return; + + StringJoiner joiner = new StringJoiner("&"); + Map.of("grant_type", "client_credentials", "scope", scope) + .forEach((k, v) -> joiner.add(k + "=" + v)); + + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.POST, new URL(serverBase + "/jans-auth/restv1/token")); + setTimeouts(request); + request.setQuery(joiner.toString()); + request.setAuthorization(basicAuthnHeader); + + try { + Map jobj = request.send().getContentAsJSONObject(); + + long exp = Long.parseLong(jobj.get("expires_in").toString()) * 1000; + tokenExp = System.currentTimeMillis() + exp; + token = jobj.get("access_token").toString(); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + private void setTimeouts(HTTPRequest request) { + request.setConnectTimeout(3500); + request.setReadTimeout(3500); + } +} diff --git a/lib/org/gluu/agama/passkey/authn/FidoValidator.java b/lib/org/gluu/agama/passkey/authn/FidoValidator.java new file mode 100644 index 0000000..1ebf0a1 --- /dev/null +++ b/lib/org/gluu/agama/passkey/authn/FidoValidator.java @@ -0,0 +1,86 @@ +package org.gluu.agama.passkey.authn; + +import io.jans.fido2.client.AssertionService; +import io.jans.fido2.client.Fido2ClientFactory; +import io.jans.util.NetworkUtils; +import jakarta.ws.rs.core.Response; +import net.minidev.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Map; + +public class FidoValidator { + + private static final Logger logger = LoggerFactory.getLogger(FidoValidator.class); + + private final String metadataConfiguration; + + public FidoValidator() throws IOException { + logger.debug("Inspecting fido2 configuration discovery URL"); + String metadataUri = NetworkUtils.urlBeforeContextPath() + "/.well-known/fido2-configuration"; + + try (Response response = Fido2ClientFactory.instance().createMetaDataConfigurationService(metadataUri).getMetadataConfiguration()) { + metadataConfiguration = response.readEntity(String.class); + int status = response.getStatus(); + + if (status != Response.Status.OK.getStatusCode()) { + String msg = "Problem retrieving fido metadata (code: " + status + ")"; + logger.error(msg + "; response was: " + metadataConfiguration); + throw new IOException(msg); + } + } + } + + public String assertionRequest(String uid) throws IOException { + logger.debug("Building an assertion request for {}", uid); + // Using assertionService as a private class field gives serialization trouble... + AssertionService assertionService = Fido2ClientFactory.instance().createAssertionService(metadataConfiguration); + String content; + if (uid == null) { + content = JSONObject.toJSONString(Map.of("timeout", 90000)); + } else { + content = JSONObject.toJSONString(Map.of("timeout", 90000, "username", uid)); + } + + try (Response response = (uid == null ? assertionService.generateAuthenticate(content) : assertionService.authenticate(content))) { + content = response.readEntity(String.class); + int status = response.getStatus(); + + if (status != Response.Status.OK.getStatusCode()) { + String msg = "Assertion request building failed (code: " + status + ")"; + logger.error(msg + "; response was: " + content); + throw new IOException(msg); + } + return content; + } + } + + public String verify(String tokenResponse) throws IOException { + logger.debug("Verifying fido token response"); + AssertionService assertionService = Fido2ClientFactory.instance().createAssertionService(metadataConfiguration); + + Response response = assertionService.verify(tokenResponse); + int status = response.getStatus(); + if (status != Response.Status.OK.getStatusCode()) { + org.json.JSONObject jsonNode = new org.json.JSONObject(response.readEntity(String.class)); + StringBuilder sb = new StringBuilder(String.format("Verification step failed, status: %s", status)); + if (jsonNode.has("error_description")) { + sb.append(String.format(", description: %s", jsonNode.getString("error_description"))); + } + logger.error(sb.toString()); + throw new IOException(sb.toString()); + } + + String resString = response.readEntity(String.class); + org.json.JSONObject jsonNode = new org.json.JSONObject(resString); + logger.error("Status: {}, Response: {}", status, jsonNode); + if (jsonNode.has("username")) { + String user = jsonNode.getString("username"); + logger.debug("User returned: {}", user); + return user; + } + return ""; + } +} diff --git a/lib/org/gluu/agama/passkey/enroll/FidoEnroller.java b/lib/org/gluu/agama/passkey/enroll/FidoEnroller.java new file mode 100644 index 0000000..da453b1 --- /dev/null +++ b/lib/org/gluu/agama/passkey/enroll/FidoEnroller.java @@ -0,0 +1,88 @@ +package org.gluu.agama.passkey.enroll; + +import com.nimbusds.oauth2.sdk.http.HTTPRequest; +import com.nimbusds.oauth2.sdk.http.HTTPResponse; +import net.minidev.json.JSONObject; +import org.gluu.agama.passkey.CasaWSBase; + +import java.io.IOException; +import java.net.URL; +import java.util.Map; +import java.util.StringJoiner; + +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; + +public class FidoEnroller extends CasaWSBase { + + public FidoEnroller() throws IOException { + super(); + setScope(SCOPE_PREFIX + "casa.enroll"); + } + + public String getAttestationMessage(String id) throws IOException { + try { + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.GET, new URL(getApiBase() + "/enrollment/fido2/attestation")); + + StringJoiner joiner = new StringJoiner("&"); + Map.of("userid", id, "platformAuthn", "false").forEach((k, v) -> joiner.add(k + "=" + encode(v))); + request.setQuery(joiner.toString()); + + log.debug("Generating an attestation message for {}", id); + HTTPResponse response = sendRequest(request, false, true); + String responseContent = response.getContent(); + int status = response.getStatusCode(); + + if (status != 200) { + log.error("Attestation response was: ({}) {}", status, responseContent); + throw new Exception(response.getContentAsJSONObject().get("code").toString()); + } + return responseContent; + + } catch (Exception e) { + throw new IOException("Failed to build an attestation message", e); + } + } + + public String verifyRegistration(String id, String tokenResponse) throws IOException { + try { + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.POST, + new URL(getApiBase() + "/enrollment/fido2/registration/" + encode(id))); + request.setQuery(tokenResponse); + + log.debug("Verifying registration"); + HTTPResponse response = sendRequest(request, false, true); + int status = response.getStatusCode(); + Map map = response.getContentAsJSONObject(); + + if (status != 201) { + log.error("Verification response was: ({}) {}", status, response.getContent()); + throw new Exception(map.get("code").toString()); + } + return map.get("id").toString(); + + } catch (Exception e) { + throw new IOException("Failed to verify fido registration", e); + } + } + + public boolean nameIt(String id, String nickname, String key) throws IOException { + try { + String apiBase = getApiBase(); + String body = JSONObject.toJSONString(Map.of("key", key, "nickName", nickname)); + + HTTPRequest request = new HTTPRequest(HTTPRequest.Method.POST, + new URL(apiBase + "/enrollment/fido2/creds/" + encode(id))); + request.setContentType(APPLICATION_JSON); + request.setQuery(body); + + log.debug("Naming fido credential for {}", nickname); + HTTPResponse response = sendRequest(request, false, true); + int status = response.getStatusCode(); + + log.debug("Response was ({}): {}", status, response.getContent()); + return status == 200; + } catch (Exception e) { + throw new IOException("Failed to name fido credential", e); + } + } +} diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..354621a Binary files /dev/null and b/logo.png differ diff --git a/project.json b/project.json new file mode 100644 index 0000000..aef2452 --- /dev/null +++ b/project.json @@ -0,0 +1,29 @@ +{ + "projectName": "agama-passkey", + "description": "Agama Passkey", + "type": "community", + "author": "Milton-Ch", + "version": "0.0.1", + "authorWebsite": "https://github.com/GluuFederation/agama-passkey", + "githubUri": "https://github.com/GluuFederation/agama-passkey", + "license": "apache-2.0", + "lastUpdated": "1702086312720", + "tags": [ + "usb", + "fido", + "fido2", + "authentication", + "passkey" + ], + "noDirectLaunch": [], + "configs": { + "org.gluu.agama.passkey.add": {}, + "org.gluu.agama.passkey.nickname": {}, + "org.gluu.agama.passkey.list": {}, + "org.gluu.agama.passkey.main": { + "scimClientId": "YOUR_SCIM_CLIENT_ID", + "scimClientSecret": "YOUR_SCIM_CLIENT_SECRET" + } + }, + "name": "agama-passkey" +} \ No newline at end of file diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..d476de1 --- /dev/null +++ b/web/README.md @@ -0,0 +1 @@ +### Code folder \ No newline at end of file diff --git a/web/main.ftlh b/web/main.ftlh new file mode 100644 index 0000000..6cb1dfc --- /dev/null +++ b/web/main.ftlh @@ -0,0 +1,144 @@ + + + + Agama passkey + + + + + + + + + + +
+
+
+ logo +
+
+
+

+ Agama Passkey +

+ +
+
+ + +
+
+ + +
+
+ + + +
+
+
+
+
+ + Or + +
+
+ + + + + + <#if showError == true> + + + + +
+
+
+
+ + diff --git a/web/nickname.ftlh b/web/nickname.ftlh new file mode 100644 index 0000000..acb16e6 --- /dev/null +++ b/web/nickname.ftlh @@ -0,0 +1,65 @@ + + + + Passkey nickname + + + + + + +
+
+
+ logo +
+
+
+
+ +
+ +

+ Successfully added a passkey +

+ +

+ From now on, you can use this passkey to sign-in. +

+ +
+ +
+ +

+ This is a hardware passkey - you may want to nickname it by its manufacturer or device model. +

+
+ + + + +
+
+
+
+ + diff --git a/web/passkey-add.ftlh b/web/passkey-add.ftlh new file mode 100644 index 0000000..f5f08ea --- /dev/null +++ b/web/passkey-add.ftlh @@ -0,0 +1,134 @@ + + + + Passkey add + + + + + + + + + + +
+
+
+ logo +
+
+
+
+ +
+ +

+ Add a passkey +

+ +

+ Passkeys can be used for sign-in as a simple and secure alternative to your password and + two-factor credentials. +

+ + + + + + <#if showError == true> + + + +
+ + + +
+
+
+
+
+ + diff --git a/web/passkey-list.ftlh b/web/passkey-list.ftlh new file mode 100644 index 0000000..81e2d7d --- /dev/null +++ b/web/passkey-list.ftlh @@ -0,0 +1,217 @@ + + + + Passkey list + + + + + + + + + + +
+
+
+ logo +
+
+
+ <#if fidoDevice.count == 0> +
+ +
+ +

+ Passwordless sign-in with passkeys +

+ +

+ Passkeys are a password replacement that validates your identity using touch, facial + recognition, a device password, or a PIN. +

+

+ Passkeys can be used for sign-in as a simple and + secure alternative to your password and two-factor credentials. +

+ +
+ +
+ <#else> +

+ Your Passkeys +

+ +
+
    + <#list fidoDevice.devices as device> +
  • +
    +
    + +
    +
    + <#if canEdit == true> + + <#else> +

    + ${device.displayName} +

    +

    + ${device.creationDate?datetime.iso?string.medium} +

    + +
    + +
    + <#if canEdit == true> + + + <#else> + + +
    +
    +
  • + +
+
+ +
+ +
+ +
+
+
+
+
+ + Or + +
+
+ + + + + + + <#if showError == true> + + + +
+ +
+ +
+
+
+
+ +