{"record":{"id":"6369f1882f64768b","repo":"microg/GmsCore","slug":"not-supported-err-6369f1","errorCode":"NOT_SUPPORTED_ERR","errorMessage":"null","messagePattern":"null","errorType":"error_code","errorClass":"RequestHandlingException","httpStatus":null,"severity":"error","filePath":"play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/TransportHandler.kt","lineNumber":47,"sourceCode":"import javax.crypto.KeyAgreement\nimport javax.crypto.Mac\nimport javax.crypto.spec.IvParameterSpec\nimport javax.crypto.spec.SecretKeySpec\n\nclass AuthenticatorResponseWithUser<T: AuthenticatorResponse>(val response: T, val user: PublicKeyCredentialUserEntity?)\n\nabstract class TransportHandler(val transport: Transport, val callback: TransportHandlerCallback?) {\n    open val isSupported: Boolean\n        get() = false\n\n    open suspend fun start(\n        options: RequestOptions,\n        callerPackage: String,\n        pinRequested: Boolean = false,\n        pin: String? = null,\n        credentialIdString: String? = null\n    ): AuthenticatorResponseWithUser<*> =\n        throw RequestHandlingException(ErrorCode.NOT_SUPPORTED_ERR)\n\n    open fun shouldBeUsedInstantly(options: RequestOptions, credential: String? = null): Boolean = false\n    fun invokeStatusChanged(status: String, extras: Bundle? = null) =\n        callback?.onStatusChanged(transport, status, extras)\n\n    private suspend fun ctap1DeviceHasCredential(\n        connection: CtapConnection,\n        challenge: ByteArray,\n        application: ByteArray,\n        descriptor: PublicKeyCredentialDescriptor\n    ): Boolean {\n        try {\n            connection.runCommand(U2fAuthenticationCommand(0x07, challenge, application, descriptor.id))\n            return true\n        } catch (e: CtapHidMessageStatusException) {\n            return e.status == 0x6985;\n        } catch (e: CtapNfcMessageStatusException) {\n            return e.status == 0x6985;","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-fido/core/src/main/kotlin/org/microg/gms/fido/core/transport/TransportHandler.kt#L29-L65","documentation":"This is the base TransportHandler.start() implementation, which is intentionally unimplemented: every concrete transport handler (USB, NFC, BLE, internal) must override start(). Reaching it means a request was dispatched to a transport whose handler never overrode start(), so the library immediately fails the request with NOT_SUPPORTED_ERR and no message (message \"null\").","triggerScenarios":"Authenticator flow dispatches start() to a base/abstract TransportHandler subclass that has not overridden it — i.e. the selected transport does not support the requested operation (register/sign) at all.","commonSituations":"Requesting an operation over a transport the device/handler doesn't support (e.g. new request type routed to a legacy handler); library version where a handler's start() override is missing; caller selecting a transport manually instead of letting capability checks pick one.","solutions":["Check which transport was chosen for the request and whether that transport actually supports the operation; retry over a supported transport (e.g. USB/ble).","Update microG to a version where the relevant TransportHandler implements start().","Before invoking, gate the request on connection capability flags (hasCtap1Support / hasCtap2Support / shouldBeUsedInstantly).","If implementing a custom handler, override start() instead of inheriting the throwing base."],"exampleFix":"// before (caller blindly uses handler)\nval response = handler.start(options, callerPackage)\n// after\nif (!handler.shouldBeUsedInstantly(options, credentialId)) {\n    throw RequestHandlingException(ErrorCode.NOT_SUPPORTED_ERR, \"Transport ${handler.transport} does not support this operation\")\n}\nval response = handler.start(options, callerPackage)","handlingStrategy":"type-guard","validationCode":"check(handler.javaClass.method(\"start\").declaringClass != TransportHandler::class.java) { \"transport handler does not implement start()\" }","typeGuard":"fun TransportHandler?.supportsStart(): Boolean = this != null && this::class != TransportHandler::class","tryCatchPattern":"try { handler.start(options, callerPackage) } catch (e: RequestHandlingException) { if (e.code == ErrorCode.NOT_SUPPORTED_ERR) failOverToNextTransport() }","preventionTips":["Let capability checks choose the transport instead of hardcoding one","Gate requests on shouldBeUsedInstantly()/connection support flags","Keep microG updated so all built-in handlers override start()"],"tags":["fido","webauthn","transport","unimplemented"],"backgroundTag":"method-not-implemented","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"}