mirror of
https://github.com/element-hq/element-android
synced 2024-11-27 03:48:12 +03:00
Support for stable MSC3882 (#8299)
This commit is contained in:
parent
2f1a7b76ad
commit
61d4e468cb
6 changed files with 40 additions and 5 deletions
1
changelog.d/8299.feature
Normal file
1
changelog.d/8299.feature
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Updates to protocol used for Sign in with QR code
|
|
@ -301,6 +301,9 @@ internal class DefaultAuthenticationService @Inject constructor(
|
||||||
val oidcCompatibilityFlow = loginFlowResponse.flows.orEmpty().firstOrNull { it.type == "m.login.sso" && it.delegatedOidcCompatibilty == true }
|
val oidcCompatibilityFlow = loginFlowResponse.flows.orEmpty().firstOrNull { it.type == "m.login.sso" && it.delegatedOidcCompatibilty == true }
|
||||||
val flows = if (oidcCompatibilityFlow != null) listOf(oidcCompatibilityFlow) else loginFlowResponse.flows
|
val flows = if (oidcCompatibilityFlow != null) listOf(oidcCompatibilityFlow) else loginFlowResponse.flows
|
||||||
|
|
||||||
|
val supportsGetLoginTokenFlow = loginFlowResponse.flows.orEmpty().firstOrNull { it.type == "m.login.token" && it.getLoginToken == true } != null
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
return LoginFlowResult(
|
return LoginFlowResult(
|
||||||
supportedLoginTypes = flows.orEmpty().mapNotNull { it.type },
|
supportedLoginTypes = flows.orEmpty().mapNotNull { it.type },
|
||||||
ssoIdentityProviders = flows.orEmpty().firstOrNull { it.type == LoginFlowTypes.SSO }?.ssoIdentityProvider,
|
ssoIdentityProviders = flows.orEmpty().firstOrNull { it.type == LoginFlowTypes.SSO }?.ssoIdentityProvider,
|
||||||
|
@ -309,7 +312,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
||||||
isOutdatedHomeserver = !versions.isSupportedBySdk(),
|
isOutdatedHomeserver = !versions.isSupportedBySdk(),
|
||||||
hasOidcCompatibilityFlow = oidcCompatibilityFlow != null,
|
hasOidcCompatibilityFlow = oidcCompatibilityFlow != null,
|
||||||
isLogoutDevicesSupported = versions.doesServerSupportLogoutDevices(),
|
isLogoutDevicesSupported = versions.doesServerSupportLogoutDevices(),
|
||||||
isLoginWithQrSupported = versions.doesServerSupportQrCodeLogin(),
|
isLoginWithQrSupported = supportsGetLoginTokenFlow || versions.doesServerSupportQrCodeLogin(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,5 +51,13 @@ internal data class LoginFlow(
|
||||||
* See [MSC3824](https://github.com/matrix-org/matrix-spec-proposals/pull/3824)
|
* See [MSC3824](https://github.com/matrix-org/matrix-spec-proposals/pull/3824)
|
||||||
*/
|
*/
|
||||||
@Json(name = "org.matrix.msc3824.delegated_oidc_compatibility")
|
@Json(name = "org.matrix.msc3824.delegated_oidc_compatibility")
|
||||||
val delegatedOidcCompatibilty: Boolean? = null
|
val delegatedOidcCompatibilty: Boolean? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether a login flow of type m.login.token could accept a token issued using /login/get_token.
|
||||||
|
*
|
||||||
|
* See https://spec.matrix.org/v1.7/client-server-api/#post_matrixclientv1loginget_token
|
||||||
|
*/
|
||||||
|
@Json(name = "get_login_token")
|
||||||
|
val getLoginToken: Boolean? = null
|
||||||
)
|
)
|
||||||
|
|
|
@ -54,6 +54,7 @@ private const val FEATURE_ID_ACCESS_TOKEN = "m.id_access_token"
|
||||||
private const val FEATURE_SEPARATE_ADD_AND_BIND = "m.separate_add_and_bind"
|
private const val FEATURE_SEPARATE_ADD_AND_BIND = "m.separate_add_and_bind"
|
||||||
private const val FEATURE_THREADS_MSC3440 = "org.matrix.msc3440"
|
private const val FEATURE_THREADS_MSC3440 = "org.matrix.msc3440"
|
||||||
private const val FEATURE_THREADS_MSC3440_STABLE = "org.matrix.msc3440.stable"
|
private const val FEATURE_THREADS_MSC3440_STABLE = "org.matrix.msc3440.stable"
|
||||||
|
@Deprecated("The availability of stable get_login_token is now exposed as a capability and part of login flow")
|
||||||
private const val FEATURE_QR_CODE_LOGIN = "org.matrix.msc3882"
|
private const val FEATURE_QR_CODE_LOGIN = "org.matrix.msc3882"
|
||||||
private const val FEATURE_THREADS_MSC3771 = "org.matrix.msc3771"
|
private const val FEATURE_THREADS_MSC3771 = "org.matrix.msc3771"
|
||||||
private const val FEATURE_THREADS_MSC3773 = "org.matrix.msc3773"
|
private const val FEATURE_THREADS_MSC3773 = "org.matrix.msc3773"
|
||||||
|
@ -94,7 +95,9 @@ internal fun Versions.doesServerSupportThreadUnreadNotifications(): Boolean {
|
||||||
return getMaxVersion() >= HomeServerVersion.v1_4_0 || (msc3771 && msc3773)
|
return getMaxVersion() >= HomeServerVersion.v1_4_0 || (msc3771 && msc3773)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated("The availability of stable get_login_token is now exposed as a capability and part of login flow")
|
||||||
internal fun Versions.doesServerSupportQrCodeLogin(): Boolean {
|
internal fun Versions.doesServerSupportQrCodeLogin(): Boolean {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
return unstableFeatures?.get(FEATURE_QR_CODE_LOGIN) ?: false
|
return unstableFeatures?.get(FEATURE_QR_CODE_LOGIN) ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,14 @@ internal data class Capabilities(
|
||||||
* True if the user can use m.thread relation, false otherwise.
|
* True if the user can use m.thread relation, false otherwise.
|
||||||
*/
|
*/
|
||||||
@Json(name = "m.thread")
|
@Json(name = "m.thread")
|
||||||
val threads: BooleanCapability? = null
|
val threads: BooleanCapability? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capability to indicate if the server supports login token issuance for signing in another device.
|
||||||
|
* True if the user can use /login/get_token, false otherwise.
|
||||||
|
*/
|
||||||
|
@Json(name = "m.get_login_token")
|
||||||
|
val getLoginToken: BooleanCapability? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
|
|
|
@ -151,8 +151,6 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
||||||
getVersionResult.doesServerSupportThreads()
|
getVersionResult.doesServerSupportThreads()
|
||||||
homeServerCapabilitiesEntity.canUseThreadReadReceiptsAndNotifications =
|
homeServerCapabilitiesEntity.canUseThreadReadReceiptsAndNotifications =
|
||||||
getVersionResult.doesServerSupportThreadUnreadNotifications()
|
getVersionResult.doesServerSupportThreadUnreadNotifications()
|
||||||
homeServerCapabilitiesEntity.canLoginWithQrCode =
|
|
||||||
getVersionResult.doesServerSupportQrCodeLogin()
|
|
||||||
homeServerCapabilitiesEntity.canRemotelyTogglePushNotificationsOfDevices =
|
homeServerCapabilitiesEntity.canRemotelyTogglePushNotificationsOfDevices =
|
||||||
getVersionResult.doesServerSupportRemoteToggleOfPushNotifications()
|
getVersionResult.doesServerSupportRemoteToggleOfPushNotifications()
|
||||||
homeServerCapabilitiesEntity.canRedactEventWithRelations =
|
homeServerCapabilitiesEntity.canRedactEventWithRelations =
|
||||||
|
@ -169,10 +167,25 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
||||||
}
|
}
|
||||||
homeServerCapabilitiesEntity.externalAccountManagementUrl = getWellknownResult.wellKnown.unstableDelegatedAuthConfig?.accountManagementUrl
|
homeServerCapabilitiesEntity.externalAccountManagementUrl = getWellknownResult.wellKnown.unstableDelegatedAuthConfig?.accountManagementUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
homeServerCapabilitiesEntity.canLoginWithQrCode = canLoginWithQrCode(getCapabilitiesResult, getVersionResult)
|
||||||
|
|
||||||
homeServerCapabilitiesEntity.lastUpdatedTimestamp = Date().time
|
homeServerCapabilitiesEntity.lastUpdatedTimestamp = Date().time
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun canLoginWithQrCode(getCapabilitiesResult: GetCapabilitiesResult?, getVersionResult: Versions?): Boolean {
|
||||||
|
// in r0 of MSC3882 an unstable feature was exposed. In stable it is done via /capabilities and /login
|
||||||
|
|
||||||
|
// in stable 1.7 a capability is exposed for the authenticated user
|
||||||
|
if (getCapabilitiesResult?.capabilities?.getLoginToken != null) {
|
||||||
|
return getCapabilitiesResult.capabilities.getLoginToken.enabled == true
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
return getVersionResult?.doesServerSupportQrCodeLogin() == true
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
// 8 hours like on Element Web
|
// 8 hours like on Element Web
|
||||||
private const val MIN_DELAY_BETWEEN_TWO_REQUEST_MILLIS = 8 * 60 * 60 * 1000
|
private const val MIN_DELAY_BETWEEN_TWO_REQUEST_MILLIS = 8 * 60 * 60 * 1000
|
||||||
|
|
Loading…
Reference in a new issue