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
+
+
+
+# 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+