Skip to content

Surface FIDO2 credential errors as DaVinci action events - #227

Closed
witrisna wants to merge 1 commit into
developfrom
FIDO_ERROR_PROTOTYPE
Closed

Surface FIDO2 credential errors as DaVinci action events#227
witrisna wants to merge 1 commit into
developfrom
FIDO_ERROR_PROTOTYPE

Conversation

@witrisna

@witrisna witrisna commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Add a Failable interface so collectors can report a DOM/credential
error alongside their payload. AbstractFidoCollector now maps
CreateCredential/GetCredential exceptions (cancellation, unsupported,
DOM errors) to their corresponding error names and switches its event
type from "submit" to "action" when an error is present, allowing the
Journey server to handle FIDO2 failures without treating them as a
generic submit failure.

JIRA Ticket

Please link jira ticket here

Description

Briefly describe the change and any information that would help speedup the review and testing.

Summary by CodeRabbit

  • New Features

    • Added standardized error reporting for FIDO authentication and registration failures.
    • FIDO failures now produce actionable event responses with specific error types, including unsupported, not-allowed, and unknown errors.
    • Cleared previous errors before starting new FIDO operations.
  • Bug Fixes

    • FIDO failures are now correctly reflected in emitted event data instead of being omitted.
  • Tests

    • Added comprehensive coverage for collector serialization, request interception, event handling, and FIDO error mapping.

  Add a Failable interface so collectors can report a DOM/credential
  error alongside their payload. AbstractFidoCollector now maps
  CreateCredential/GetCredential exceptions (cancellation, unsupported,
  DOM errors) to their corresponding error names and switches its event
  type from "submit" to "action" when an error is present, allowing the
  Journey server to handle FIDO2 failures without treating them as a
  generic submit failure.
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

FIDO collectors now map failures to error codes, expose failure state through Failable, and emit action events. DaVinci collector aggregation recognizes these errors and serializes them into actionKey, with expanded unit coverage.

Changes

FIDO failure flow

Layer / File(s) Summary
Failure contract and event types
foundation/davinci-plugin/..., mfa/fido/.../Constants.kt
Adds the nullable Failable.error() contract and the EVENT_TYPE_ACTION constant.
FIDO error state and mapping
mfa/fido/.../AbstractFidoCollector.kt, mfa/fido/.../Fido*Collector.kt, mfa/fido/.../*Test.kt
FIDO collectors reset errors, map credential exceptions to error codes, expose error state, and select submit or action events; authentication and registration failure cases are tested.
Failure-aware collector output
davinci/src/main/.../Collectors.kt, davinci/src/test/.../CollectorsTest.kt
Collector event selection and JSON serialization now include non-null Failable errors, with coverage for requests, payloads, and JSON structures.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Suggested reviewers: vibhorgoswami

Sequence Diagram(s)

sequenceDiagram
  participant FidoAuthenticationCollector
  participant FidoClient
  participant AbstractFidoCollector
  participant Collectors
  FidoAuthenticationCollector->>FidoClient: authenticate()
  FidoClient-->>FidoAuthenticationCollector: Result failure
  FidoAuthenticationCollector->>AbstractFidoCollector: handleError(exception)
  AbstractFidoCollector-->>FidoAuthenticationCollector: mapped error code
  Collectors->>AbstractFidoCollector: error()
  AbstractFidoCollector-->>Collectors: action error
Loading

Poem

A rabbit hops through errors bright,
Maps each FIDO fail just right.
“action” blooms where submits were,
JSON carries the answer fur.
Tests thump paws: the flow is clear!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is mostly a change summary, but the required JIRA ticket and description sections are left as placeholders. Replace the placeholders with the actual JIRA link and a brief review/testing description that explains the change and any validation performed.
Docstring Coverage ⚠️ Warning Docstring coverage is 8.70% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: exposing FIDO2 credential errors as action events.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch FIDO_ERROR_PROTOTYPE

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
davinci/src/main/kotlin/com/pingidentity/davinci/collector/Collectors.kt (1)

68-70: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Avoid double-evaluation of error().

You can use ?.let to evaluate the error once and simplify the block safely.

♻️ Proposed refactor
-                if (it is Failable && it.error() != null) {
-                    put("actionKey", it.error())
-                }
+                if (it is Failable) {
+                    it.error()?.let { error -> put("actionKey", error) }
+                }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@davinci/src/main/kotlin/com/pingidentity/davinci/collector/Collectors.kt`
around lines 68 - 70, Update the Failable handling block in Collectors to
evaluate it.error() only once, using a nullable-safe let-style flow to add the
"actionKey" entry only when an error exists; preserve the current behavior for
non-Failable values and null errors.
mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt (2)

69-76: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Stale docstring.

The docstring still states the return is "always \"submit\" for FIDO2 collectors", but the implementation now conditionally returns the action event type when error is set. Update the doc to reflect the new branching behavior.

📝 Proposed fix
-    /**
-     * Returns the event type that this collector handles.
-     *
-     * `@return` The event type string, always "submit" for FIDO2 collectors
-     */
+    /**
+     * Returns the event type that this collector handles.
+     *
+     * `@return` "submit" when there is no error, or the action event type when an error has been recorded
+     */
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt`
around lines 69 - 76, Update the KDoc for AbstractFidoCollector.eventType() to
describe that it returns Constants.EVENT_TYPE_SUBMIT when error is null and
Constants.EVENT_TYPE_ACTION when error is set, replacing the stale claim that it
always returns "submit".

66-67: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Restrict error mutation to internal.

error is fully public and mutable, unlike the other collector properties (key, label, trigger, required) which all use private set. Since the only intended public contract is the Failable.error(): String? getter, external consumers outside this module can currently overwrite collector state directly. Kotlin test source sets can access internal members of the main source set by default, so this would not break AbstractFidoCollectorTest.

🔒 Proposed fix
-    var error: String? = null
+    var error: String? = null
+        internal set
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt`
around lines 66 - 67, Change the error property in AbstractFidoCollector from
publicly mutable to internal-settable, preserving its public getter and existing
Failable.error() contract. Keep internal collector code and tests able to update
error while preventing external consumers from overwriting it.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt`:
- Around line 95-109: Clear the previous success payload at the start of each
retry: update FidoAuthenticationCollector.authenticate to reset assertionValue
alongside error, and update FidoRegistrationCollector’s corresponding
authentication flow to reset attestationValue alongside error. Apply the changes
at
mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt
lines 95-109 and
mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt
lines 68-82.

---

Nitpick comments:
In `@davinci/src/main/kotlin/com/pingidentity/davinci/collector/Collectors.kt`:
- Around line 68-70: Update the Failable handling block in Collectors to
evaluate it.error() only once, using a nullable-safe let-style flow to add the
"actionKey" entry only when an error exists; preserve the current behavior for
non-Failable values and null errors.

In
`@mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt`:
- Around line 69-76: Update the KDoc for AbstractFidoCollector.eventType() to
describe that it returns Constants.EVENT_TYPE_SUBMIT when error is null and
Constants.EVENT_TYPE_ACTION when error is set, replacing the stale claim that it
always returns "submit".
- Around line 66-67: Change the error property in AbstractFidoCollector from
publicly mutable to internal-settable, preserving its public getter and existing
Failable.error() contract. Keep internal collector code and tests able to update
error while preventing external consumers from overwriting it.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4afdbc1d-aaa0-42e4-a8f5-33afefdb23c7

📥 Commits

Reviewing files that changed from the base of the PR and between 5f1e47f and d5f843e.

📒 Files selected for processing (10)
  • davinci/src/main/kotlin/com/pingidentity/davinci/collector/Collectors.kt
  • davinci/src/test/kotlin/com/pingidentity/davinci/collector/CollectorsTest.kt
  • foundation/davinci-plugin/src/main/kotlin/com/pingidentity/davinci/plugin/Failable.kt
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/Constants.kt
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt
  • mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollectorTest.kt
  • mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollectorTest.kt
  • mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollectorTest.kt

Comment on lines 95 to 109
suspend fun authenticate(
block: FidoAuthenticateCustomizer.() -> Unit = {}
): Result<JsonObject> {
error = null
logger.d("Starting FIDO2 authentication")
return FidoClient { logger = this@FidoAuthenticationCollector.logger }.authenticate(
publicKeyCredentialRequestOptions, block
).onSuccess {
logger.d("FIDO2 authentication successful")
assertionValue = it
}.onFailure { exception ->
handleError(exception)
logger.e("FIDO2 authentication failed", exception)
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

set -euo pipefail

printf '\n== Files ==\n'
git ls-files 'mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/*' 'mfa/**/Collectors*' 'mfa/**/collector*' | sed -n '1,120p'

printf '\n== Outline: FidoAuthenticationCollector.kt ==\n'
ast-grep outline mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt --view expanded || true

printf '\n== Outline: FidoRegistrationCollector.kt ==\n'
ast-grep outline mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt --view expanded || true

printf '\n== Search for payload/error/asJson ==\n'
rg -n "fun (payload|error|asJson)|payload\\(|error\\(" mfa -g '*.kt'

Repository: ForgeRock/ping-android-sdk

Length of output: 7677


🏁 Script executed:

set -euo pipefail

printf '\n== Collectors-related file names ==\n'
fd -a 'Collectors|Collector' mfa -t f | sed -n '1,200p'

Repository: ForgeRock/ping-android-sdk

Length of output: 1529


🏁 Script executed:

set -euo pipefail

printf '\n== Read targeted sections ==\n'
for f in \
  mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt \
  mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt
do
  echo "--- $f ---"
  nl -ba "$f" | sed -n '1,220p'
done

Repository: ForgeRock/ping-android-sdk

Length of output: 328


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
from pathlib import Path
for path in [
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt'),
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt'),
]:
    print(f"\n== {path} ==")
    for i, line in enumerate(path.read_text().splitlines(), 1):
        if 1 <= i <= 220:
            if any(k in line for k in ['assertionValue', 'attestationValue', 'error = null', 'payload(', 'error(', 'asJson']):
                print(f"{i}: {line}")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 1001


🏁 Script executed:

set -euo pipefail

echo '## File list'
git ls-files 'mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/*' | sed -n '1,80p'

echo
echo '## Targeted lines in collectors'
for f in \
  mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt \
  mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt
do
  echo "--- $f ---"
  nl -ba "$f" | sed -n '1,220p' | sed -n '/error = null\|assertionValue\|attestationValue\|fun payload\|fun error\|fun authenticate\|fun register/p'
done

echo
echo '## Search for serializer and state plumbing'
rg -n "class Collectors|fun asJson|fun payload\\(|fun error\\(|assertionValue|attestationValue|error =" mfa -g '*.kt'

echo
echo '## Candidate serializer file(s)'
fd -a 'Collectors.kt' mfa -t f | sed -n '1,20p'

Repository: ForgeRock/ping-android-sdk

Length of output: 746


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
from pathlib import Path

targets = [
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt'),
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt'),
]

for path in targets:
    print(f"\n== {path} ==")
    text = path.read_text()
    for needle in ['assertionValue', 'attestationValue', 'error = null', 'fun payload', 'fun error', 'asJson', 'data class', 'var ']:
        if needle in text:
            print(f"FOUND: {needle}")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 496


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
from pathlib import Path

paths = [
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt'),
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoCollector.kt'),
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt'),
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt'),
]

for path in paths:
    print(f"\n== {path} ==")
    lines = path.read_text().splitlines()
    for i, line in enumerate(lines, 1):
        if any(key in line for key in [
            'class ', 'interface ', 'override fun payload', 'override fun error',
            'fun asJson', 'error = null', 'assertionValue', 'attestationValue',
            'close()', 'init(', 'register(', 'authenticate(',
        ]):
            start = max(1, i - 5)
            end = min(len(lines), i + 8)
            print(f"\n-- around line {i} --")
            for j in range(start, end + 1):
                print(f"{j:4}: {lines[j-1]}")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 22016


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
from pathlib import Path

for path in [
    Path('mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollectorTest.kt'),
    Path('mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollectorTest.kt'),
    Path('mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollectorTest.kt'),
]:
    print(f"\n== {path} ==")
    lines = path.read_text().splitlines()
    for i, line in enumerate(lines, 1):
        if any(k in line for k in ['payload', 'error', 'retry', 'close', 'init', 'assertNull', 'assertNotNull']):
            start = max(1, i - 4)
            end = min(len(lines), i + 4)
            print(f"\n-- around line {i} --")
            for j in range(start, end + 1):
                print(f"{j:4}: {lines[j-1]}")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 50382


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
from pathlib import Path

targets = [
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollector.kt'),
    Path('mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoCollector.kt'),
    Path('mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollectorTest.kt'),
    Path('mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollectorTest.kt'),
    Path('mfa/fido/src/test/kotlin/com/pingidentity/fido/davinci/AbstractFidoCollectorTest.kt'),
]

for path in targets:
    print(f"\n== {path} ==")
    lines = path.read_text().splitlines()
    for i, line in enumerate(lines, 1):
        if any(k in line for k in [
            'class ', 'interface ', 'fun asJson', 'override fun payload', 'override fun error',
            'error = null', 'assertionValue', 'attestationValue', 'close()', 'retry',
            'payload()', 'error()', 'init(', 'authenticate(', 'register(', 'assertNull', 'assertNotNull'
        ]):
            start = max(1, i - 4)
            end = min(len(lines), i + 5)
            print(f"\n-- around line {i} --")
            for j in range(start, end + 1):
                print(f"{j:4}: {lines[j-1]}")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 50382


🏁 Script executed:

set -euo pipefail

rg -n "asJson|Collectors" mfa -g '*.kt'

Repository: ForgeRock/ping-android-sdk

Length of output: 164


🏁 Script executed:

set -euo pipefail

printf '== asJson / payload / error search (repo-wide) ==\n'
rg -n --hidden --glob '*.kt' --glob '*.kts' --glob '*.java' \
  'fun asJson|asJson\(|payload\(\)|error\(\)|eventType\(\)' .

printf '\n== Collector interface / serializer candidates ==\n'
rg -n --hidden --glob '*.kt' \
  'interface Collector|class .*Collectors|object .*Collectors|Collectors' mfa .

Repository: ForgeRock/ping-android-sdk

Length of output: 40916


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
import subprocess, shlex

patterns = [
    r'fun asJson|asJson\(|payload\(\)|error\(\)|eventType\(\)',
    r'interface Collector|class .*Collectors|object .*Collectors|Collectors',
]
for pat in patterns:
    print(f"\n## pattern: {pat}")
    p = subprocess.run(
        ["rg", "-n", "--hidden", "--glob", "*.kt", "--glob", "*.kts", "--glob", "*.java", pat, "."],
        text=True, capture_output=True
    )
    lines = p.stdout.splitlines()
    for line in lines[:120]:
        print(line)
    if len(lines) > 120:
        print(f"... truncated {len(lines)-120} more lines")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 23969


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
import subprocess

queries = [
    r'Collectors\.asJson|asJson\(',
    r'field.*actionKey|actionKey',
    r'formData|payload\(\).*error\(\)|error\(\).*payload\(\)',
]
for q in queries:
    print(f"\n## {q}")
    p = subprocess.run(["rg", "-n", "--hidden", "--glob", "*.kt", q, "."],
                       text=True, capture_output=True)
    lines = p.stdout.splitlines()
    for line in lines[:80]:
        print(line)
    if len(lines) > 80:
        print(f"... truncated {len(lines)-80} more lines")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 16966


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
import subprocess

queries = [
    r'formData',
    r'actionKey',
    r'payload\(\)',
    r'eventType\(\)',
    r'error\(\)',
]

for q in queries:
    print(f"\n## {q}")
    p = subprocess.run(
        ["rg", "-n", "--hidden", "--glob", "*.kt", q, "mfa"],
        text=True, capture_output=True
    )
    lines = p.stdout.splitlines()
    for line in lines[:80]:
        print(line)
    if len(lines) > 80:
        print(f"... truncated {len(lines)-80} more lines")
PY

Repository: ForgeRock/ping-android-sdk

Length of output: 6885


Clear the previous success payload before retrying
error = null leaves the last successful payload() in place, so a later failure can serialize stale formData together with actionKey in Collectors.asJson().

  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt#L95-L109: clear assertionValue with error.
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt#L68-L82: clear attestationValue with error.
📍 Affects 2 files
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt#L95-L109 (this comment)
  • mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt#L68-L82
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt`
around lines 95 - 109, Clear the previous success payload at the start of each
retry: update FidoAuthenticationCollector.authenticate to reset assertionValue
alongside error, and update FidoRegistrationCollector’s corresponding
authentication flow to reset attestationValue alongside error. Apply the changes
at
mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoAuthenticationCollector.kt
lines 95-109 and
mfa/fido/src/main/kotlin/com/pingidentity/fido/davinci/FidoRegistrationCollector.kt
lines 68-82.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

1 participant