{"record":{"id":"d7ef504a2035af81","repo":"microg/GmsCore","slug":"user-verification-requirement-attachment-not-su","errorCode":null,"errorMessage":"User verification requirement ${attachment} not supported","messagePattern":"User verification requirement (.+?) not supported","errorType":"exception","errorClass":"UserVerificationRequirement.UnsupportedUserVerificationRequirementException","httpStatus":null,"severity":"error","filePath":"play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UserVerificationRequirement.java","lineNumber":45,"sourceCode":"        return value;\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(toString());\n    }\n\n    @Hide\n    public static UserVerificationRequirement fromString(String attachment) throws UnsupportedUserVerificationRequirementException {\n        for (UserVerificationRequirement value : values()) {\n            if (value.value.equals(attachment)) return value;\n        }\n        throw new UnsupportedUserVerificationRequirementException(\"User verification requirement \" + attachment + \" not supported\");\n    }\n\n    public static Creator<UserVerificationRequirement> CREATOR = new Creator<UserVerificationRequirement>() {\n        @Override\n        public UserVerificationRequirement createFromParcel(Parcel source) {\n            try {\n                return UserVerificationRequirement.fromString(source.readString());\n            } catch (UnsupportedUserVerificationRequirementException e) {\n                throw new RuntimeException(e);\n            }\n        }\n\n        @Override\n        public UserVerificationRequirement[] newArray(int size) {\n            return new UserVerificationRequirement[size];\n        }\n    };\n","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/UserVerificationRequirement.java#L27-L63","documentation":"UserVerificationRequirement.fromString() maps a user-verification string (\"required\", \"preferred\", \"discouraged\") to the enum; other values throw UnsupportedUserVerificationRequirementException. (The parameter is confusingly named 'attachment' — copy-paste from Attachment.)","triggerScenarios":"Calling fromString with a value outside {\"required\",\"preferred\",\"discouraged\"}: typos like \"optional\", case mismatches (\"Required\"), or empty strings from missing JSON keys (optString returns \"\").","commonSituations":"Relying-party JSON with userVerification values from a newer or nonstandard spec; JSON lacking the userVerification field so an empty/default string gets parsed.","solutions":["Pass exactly \"required\", \"preferred\", or \"discouraged\".","Default missing JSON fields to \"preferred\" instead of the empty string.","Validate against the enum's values() before calling fromString."],"exampleFix":"// before\nvar uv = UserVerificationRequirement.fromString(json.optString(\"userVerification\"));\n// after\nString uvStr = json.optString(\"userVerification\", \"preferred\");\nvar uv = UserVerificationRequirement.fromString(uvStr);","handlingStrategy":"validation","validationCode":"Set<String> valid = new HashSet<>(java.util.Arrays.asList(\"required\", \"preferred\", \"discouraged\"));\nif (!valid.contains(uvStr)) uvStr = \"preferred\";","typeGuard":null,"tryCatchPattern":"try { uv = UserVerificationRequirement.fromString(s); } catch (UnsupportedUserVerificationRequirementException e) { uv = UserVerificationRequirement.fromString(\"preferred\"); }","preventionTips":["Default missing userVerification JSON fields to \"preferred\" instead of an empty string.","Validate case-sensitive membership before parsing.","Use enum constants when building request options in code."],"tags":["fido","webauthn","enum-parsing","android"],"backgroundTag":"invalid-enum-value","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}