{"record":{"id":"d77ed0a43c9f18db","repo":"microg/GmsCore","slug":"tokenbindingstatus-str-not-supported","errorCode":null,"errorMessage":"TokenBindingStatus ${str} not supported","messagePattern":"TokenBindingStatus (.+?) not supported","errorType":"exception","errorClass":"TokenBinding.UnsupportedTokenBindingStatusException","httpStatus":null,"severity":"error","filePath":"play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/TokenBinding.java","lineNumber":154,"sourceCode":"        SUPPORTED(\"supported\"),\n        /**\n         * The client does not support token binding.\n         */\n        NOT_SUPPORTED(\"not-supported\");\n\n        @NonNull\n        private final String value;\n\n        TokenBindingStatus(@NonNull String value) {\n            this.value = value;\n        }\n\n        @Hide\n        public static TokenBindingStatus fromString(String str) throws UnsupportedTokenBindingStatusException {\n            for (TokenBindingStatus value : values()) {\n                if (value.value.equals(str)) return value;\n            }\n            throw new UnsupportedTokenBindingStatusException(\"TokenBindingStatus \" + str + \" not supported\");\n        }\n\n        @Override\n        public void writeToParcel(Parcel dest, int flags) {\n            dest.writeString(value);\n        }\n\n        @Override\n        public int describeContents() {\n            return 0;\n        }\n\n        public static final Creator<TokenBindingStatus> CREATOR = new Creator<TokenBindingStatus>() {\n            @Override\n            public TokenBindingStatus createFromParcel(Parcel in) {\n                try {\n                    return fromString(in.readString());\n                } catch (UnsupportedTokenBindingStatusException e) {","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-fido/src/main/java/com/google/android/gms/fido/fido2/api/common/TokenBinding.java#L136-L172","documentation":"TokenBinding.TokenBindingStatus.fromString() maps a token-binding status string (\"supported\" or \"present\") to the enum. Unknown strings throw UnsupportedTokenBindingStatusException. It's invoked from createFromParcel during unparceling of objects containing a TokenBinding, so it can also surface as a RuntimeException during Parcel deserialization.","triggerScenarios":"Calling fromString with a status other than \"supported\"/\"present\" (e.g. \"not-supported\", \"\", null), or parceling a TokenBinding whose status was written from an unrecognized string and later unparceled via createFromParcel.","commonSituations":"Server-side JSON carrying a tokenBinding status from a different WebAuthn revision; hand-built TokenBinding objects with typo'd statuses that blow up later at parcel-unmarshal time rather than at construction.","solutions":["Use exactly \"supported\" or \"present\" for the status string.","Prefer TokenBindingStatus enum constants over raw strings when constructing TokenBinding.","Wrap createFromParcel/fromString in try-catch for UnsupportedTokenBindingStatusException and default to null (token binding omitted) when unknown."],"exampleFix":"// before\nTokenBinding tb = TokenBinding.TokenBindingStatus.fromString(\"not-supported\");\n// after\nTokenBinding tb;\ntry {\n    tb = TokenBinding.TokenBindingStatus.fromString(status);\n} catch (UnsupportedTokenBindingStatusException e) {\n    tb = null;\n}","handlingStrategy":"try-catch","validationCode":"boolean valid = \"supported\".equals(status) || \"present\".equals(status);","typeGuard":null,"tryCatchPattern":"try { status = TokenBinding.TokenBindingStatus.fromString(s); } catch (UnsupportedTokenBindingStatusException e) { status = null; /* token binding omitted */ }","preventionTips":["Restrict status strings to \"supported\" and \"present\".","Treat token binding as optional — null out unknown statuses instead of failing the whole credential.","Test Parcel round-trips if you construct TokenBinding objects manually."],"tags":["fido","webauthn","enum-parsing","parcel"],"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-14T00:17:10.932Z"}