Skip to content

Commit dea90c3

Browse files
committed
Fix SetAsterismConsent handling
1 parent 581d9b6 commit dea90c3

5 files changed

Lines changed: 122 additions & 101 deletions

File tree

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package com.google.android.gms.asterism
22

33
import org.microg.gms.constellation.core.proto.AsterismClient
4+
import org.microg.gms.constellation.core.proto.AsterismConsent.DeviceConsentVersion
45
import org.microg.gms.constellation.core.proto.Consent
56
import org.microg.gms.constellation.core.proto.ConsentSource
67
import org.microg.gms.constellation.core.proto.ConsentVersion
7-
import org.microg.gms.constellation.core.proto.FlowContext
88

99
enum class SetAsterismConsentRequestStatus(val value: Int) {
10-
RCS_DEFAULT(0),
11-
RCS_LEGAL_FYI(1),
12-
DEVICE_PNVR(2),
10+
RESOURCE_TOS(0),
11+
STATIC_STRING(1),
12+
RCS(2),
1313
ON_DEMAND(3),
14-
EXPIRED(4);
14+
RESOURCE_TOS_FALLBACK(4);
1515

1616
companion object {
1717
fun fromValue(value: Int): SetAsterismConsentRequestStatus =
18-
entries.find { it.value == value } ?: EXPIRED
18+
entries.find { it.value == value } ?: RESOURCE_TOS_FALLBACK
1919
}
2020
}
2121

@@ -25,16 +25,16 @@ val SetAsterismConsentRequest.asterismClient: AsterismClient
2525
val SetAsterismConsentRequest.consent: Consent
2626
get() = Consent.fromValue(consentValue) ?: Consent.CONSENT_UNKNOWN
2727

28-
val SetAsterismConsentRequest.rcsFlowContext: FlowContext
29-
get() = FlowContext.fromValue(rcsFlowContextValue) ?: FlowContext.FLOW_CONTEXT_UNSPECIFIED
28+
val SetAsterismConsentRequest.consentVersion: ConsentVersion?
29+
get() = ConsentVersion.fromValue(consentVersionValue)
3030

3131
val SetAsterismConsentRequest.deviceConsentSource: ConsentSource
3232
get() = ConsentSource.fromValue(deviceConsentSourceValue) ?: ConsentSource.SOURCE_UNSPECIFIED
3333

34-
val SetAsterismConsentRequest.deviceConsentVersion: ConsentVersion
35-
get() = ConsentVersion.fromValue(deviceConsentVersionValue).let {
36-
if (it == null || it == ConsentVersion.CONSENT_VERSION_UNSPECIFIED) {
37-
ConsentVersion.PHONE_VERIFICATION_DEFAULT
34+
val SetAsterismConsentRequest.deviceConsentVersion: DeviceConsentVersion
35+
get() = DeviceConsentVersion.fromValue(deviceConsentVersionValue).let {
36+
if (it == null || it == DeviceConsentVersion.UNKNOWN) {
37+
DeviceConsentVersion.PHONE_VERIFICATION_DEFAULT
3838
} else {
3939
it
4040
}
@@ -47,4 +47,4 @@ fun SetAsterismConsentRequest.isDevicePnvrFlow(): Boolean {
4747
return asterismClient == AsterismClient.CONSTELLATION &&
4848
deviceConsentSourceValue > 0 &&
4949
deviceConsentVersionValue > 0
50-
}
50+
}

play-services-asterism/core/src/main/kotlin/org/microg/gms/asterism/core/SetAsterismConsentHandler.kt

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ import com.google.android.gms.asterism.SetAsterismConsentRequestStatus
1111
import com.google.android.gms.asterism.SetAsterismConsentResponse
1212
import com.google.android.gms.asterism.asterismClient
1313
import com.google.android.gms.asterism.consent
14+
import com.google.android.gms.asterism.consentVersion
1415
import com.google.android.gms.asterism.deviceConsentSource
1516
import com.google.android.gms.asterism.deviceConsentVersion
1617
import com.google.android.gms.asterism.internal.IAsterismCallbacks
1718
import com.google.android.gms.asterism.isDevicePnvrFlow
18-
import com.google.android.gms.asterism.rcsFlowContext
1919
import com.google.android.gms.asterism.status
2020
import com.google.android.gms.common.api.Status
2121
import com.squareup.wire.GrpcException
@@ -29,10 +29,10 @@ import org.microg.gms.constellation.core.RpcClient
2929
import org.microg.gms.constellation.core.authManager
3030
import org.microg.gms.constellation.core.proto.AsterismClient
3131
import org.microg.gms.constellation.core.proto.AsterismConsent
32+
import org.microg.gms.constellation.core.proto.AsterismConsent.DeviceConsentVersion
3233
import org.microg.gms.constellation.core.proto.AuditToken
3334
import org.microg.gms.constellation.core.proto.Consent
3435
import org.microg.gms.constellation.core.proto.ConsentVersion
35-
import org.microg.gms.constellation.core.proto.FlowContext
3636
import org.microg.gms.constellation.core.proto.OnDemandConsent
3737
import org.microg.gms.constellation.core.proto.Param
3838
import org.microg.gms.constellation.core.proto.RcsConsent
@@ -62,40 +62,44 @@ suspend fun handleSetAsterismConsent(
6262
return@withContext
6363
}
6464

65-
val isRcsSpecificContext = request.rcsFlowContext in listOf(
66-
FlowContext.FLOW_CONTEXT_RCS_CONSENT,
67-
FlowContext.FLOW_CONTEXT_RCS_DEFAULT_ON_OUT_OF_BOX,
68-
FlowContext.FLOW_CONTEXT_RCS_SAMSUNG_UNFREEZE
69-
)
70-
71-
if (request.asterismClient != AsterismClient.RCS && isRcsSpecificContext) {
72-
Log.e(TAG, "RCS-only flow context cannot be used with non-RCS client")
65+
if (request.asterismClient != AsterismClient.CONSTELLATION &&
66+
request.asterismClient != AsterismClient.RCS
67+
) {
68+
Log.e(TAG, "Invalid asterismClientValue: ${request.asterismClientValue}")
7369
callbacks.onConsentRegistered(
7470
Status.INTERNAL_ERROR,
7571
SetAsterismConsentResponse(request.requestCode, "", "")
7672
)
7773
return@withContext
7874
}
7975

80-
if (request.status == SetAsterismConsentRequestStatus.ON_DEMAND) {
81-
if (request.accountName.isNullOrBlank() && request.extras?.getString("gaia_access_token")
82-
.isNullOrBlank()
83-
) {
84-
Log.e(TAG, "ODC missing accountName and no gaia_access_token in extras")
85-
callbacks.onConsentRegistered(
86-
Status.INTERNAL_ERROR,
87-
SetAsterismConsentResponse(request.requestCode, "", "")
88-
)
89-
return@withContext
90-
}
76+
val isRcsSpecificConsentVersion = request.consentVersion in listOf(
77+
ConsentVersion.RCS_CONSENT,
78+
ConsentVersion.RCS_DEFAULT_ON_LEGAL_FYI,
79+
ConsentVersion.RCS_DEFAULT_ON_OUT_OF_BOX
80+
)
81+
val hasRcsFastPath = request.asterismClient == AsterismClient.RCS &&
82+
request.consentVersion in listOf(
83+
ConsentVersion.RCS_DEFAULT_ON_LEGAL_FYI,
84+
ConsentVersion.RCS_DEFAULT_ON_OUT_OF_BOX,
85+
ConsentVersion.RCS_DEFAULT_ON_LEGAL_FYI_IN_SETTINGS
86+
)
87+
88+
if (request.asterismClient != AsterismClient.RCS && isRcsSpecificConsentVersion) {
89+
Log.e(TAG, "RCS-only consent version cannot be used with non-RCS client")
90+
callbacks.onConsentRegistered(
91+
Status.INTERNAL_ERROR,
92+
SetAsterismConsentResponse(request.requestCode, "", "")
93+
)
94+
return@withContext
9195
}
9296

9397
val apiParams = Param.getList(request.extras)
9498

9599
var deviceConsent: AsterismConsent? = null
96100
var rcsConsent: RcsConsent? = null
97101
var onDemandConsent: OnDemandConsent? = null
98-
var flowContext: FlowContext = FlowContext.FLOW_CONTEXT_UNSPECIFIED
102+
var consentVersion: ConsentVersion? = null
99103

100104
when {
101105
request.isDevicePnvrFlow() -> {
@@ -107,6 +111,24 @@ suspend fun handleSetAsterismConsent(
107111
}
108112

109113
request.status == SetAsterismConsentRequestStatus.ON_DEMAND -> {
114+
if (
115+
request.language.isNullOrBlank() ||
116+
request.field11.isNullOrBlank() ||
117+
request.accountName.isNullOrBlank() ||
118+
request.consentVariant.isNullOrBlank() ||
119+
request.consentTrigger.isNullOrBlank()
120+
) {
121+
Log.e(
122+
TAG,
123+
"ODC requires language, field11, accountName, consentVariant, and consentTrigger"
124+
)
125+
callbacks.onConsentRegistered(
126+
Status.INTERNAL_ERROR,
127+
SetAsterismConsentResponse(request.requestCode, "", "")
128+
)
129+
return@withContext
130+
}
131+
110132
onDemandConsent = OnDemandConsent(context, request, request.extras)
111133
if (onDemandConsent == null) {
112134
Log.e(TAG, "ODC Flow missing required fields, aborting.")
@@ -119,36 +141,43 @@ suspend fun handleSetAsterismConsent(
119141
}
120142

121143
else -> {
122-
if (request.asterismClient == AsterismClient.CONSTELLATION) {
123-
if (request.language.isNullOrBlank() || request.consentVariant.isNullOrBlank()) {
124-
Log.w(
125-
TAG,
126-
"CONSTELLATION client requires language and consentVariant"
127-
)
128-
Log.w(
129-
TAG,
130-
" language=${request.language}, consentVariant=${request.consentVariant}"
131-
)
144+
if (request.status == SetAsterismConsentRequestStatus.RESOURCE_TOS ||
145+
request.status == SetAsterismConsentRequestStatus.RESOURCE_TOS_FALLBACK
146+
) {
147+
if (request.tosResourceIds?.isEmpty() != false) {
148+
Log.w(TAG, "Resource ToS requires tosResourceIds")
132149
callbacks.onConsentRegistered(
133150
Status.INTERNAL_ERROR,
134151
SetAsterismConsentResponse(request.requestCode, "", "")
135152
)
136153
return@withContext
137154
}
155+
} else if (!hasRcsFastPath &&
156+
(request.language.isNullOrBlank() || request.field11.isNullOrBlank())
157+
) {
158+
Log.w(TAG, "Static string ToS requires language and field11")
159+
Log.w(
160+
TAG,
161+
"language=${request.language}, field11=${request.field11}"
162+
)
163+
callbacks.onConsentRegistered(
164+
Status.INTERNAL_ERROR,
165+
SetAsterismConsentResponse(request.requestCode, "", "")
166+
)
167+
return@withContext
138168
}
139169

140170
val rcsConsentVersion = if (request.consent == Consent.CONSENTED) {
141171
ConsentVersion.RCS_CONSENT
142172
} else {
143-
ConsentVersion.RCS_OUT_OF_BOX
173+
ConsentVersion.CONSENT_VERSION_UNSPECIFIED
144174
}
145175

146176
rcsConsent = RcsConsent(
147177
consent = request.consent,
148178
consent_version = rcsConsentVersion
149179
)
150-
151-
flowContext = request.rcsFlowContext
180+
consentVersion = request.consentVersion
152181
}
153182
}
154183

@@ -173,7 +202,7 @@ suspend fun handleSetAsterismConsent(
173202
device_consent = deviceConsent,
174203
rcs_consent = rcsConsent,
175204
on_demand_consent = onDemandConsent,
176-
flow_context = flowContext,
205+
consent_version = consentVersion ?: ConsentVersion.CONSENT_VERSION_UNSPECIFIED,
177206
api_params = apiParams,
178207
audit_record = auditRecordBytes
179208
)
@@ -193,7 +222,7 @@ suspend fun handleSetAsterismConsent(
193222
throw e
194223
}
195224

196-
if (deviceConsent?.consent_version == ConsentVersion.PHONE_VERIFICATION_REACHABILITY_INTL_SMS_CALLS) {
225+
if (deviceConsent?.consent_version == DeviceConsentVersion.PHONE_VERIFICATION_REACHABILITY_INTL_SMS_CALLS) {
197226
ConstellationStateStore.storePnvrNotice(
198227
context,
199228
deviceConsent.consent,

play-services-asterism/core/src/main/kotlin/org/microg/gms/constellation/core/proto/builder/OnDemandConsentBuilder.kt

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,32 @@ operator fun OnDemandConsent.Companion.invoke(
2222
request: SetAsterismConsentRequest,
2323
extras: Bundle?
2424
): OnDemandConsent? {
25-
val isOnDemand = request.status == SetAsterismConsentRequestStatus.ON_DEMAND ||
26-
extras?.containsKey("consent_variant_key") == true ||
27-
extras?.containsKey("consent_trigger_key") == true ||
28-
extras?.containsKey("gaia_access_token") == true
25+
if (request.status != SetAsterismConsentRequestStatus.ON_DEMAND) return null
2926

30-
if (!isOnDemand) return null
27+
val consentVariant = request.consentVariant
28+
val consentTrigger = request.consentTrigger
29+
val accountName = request.accountName
3130

32-
val consentVariant = extras?.getString("consent_variant_key")
33-
?: request.consentVariant
34-
35-
val consentTrigger = extras?.getString("consent_trigger_key")
36-
?: request.consentTrigger
37-
38-
var gaiaAccessToken = extras?.getString("gaia_access_token")
31+
if (
32+
accountName.isNullOrBlank() ||
33+
consentVariant.isNullOrBlank() ||
34+
consentTrigger.isNullOrBlank()
35+
) {
36+
Log.w(TAG, "ODC missing required request fields")
37+
return null
38+
}
3939

40-
if (gaiaAccessToken.isNullOrBlank()) {
41-
val accountName = request.accountName
42-
if (!accountName.isNullOrBlank()) {
43-
gaiaAccessToken = try {
44-
val account = Account(accountName, "com.google")
45-
val accountManager = AccountManager.get(context)
46-
val future = accountManager.getAuthToken(
47-
account, "oauth2:https://www.googleapis.com/auth/numberer",
48-
null, false, null, null
49-
)
50-
future.result?.getString(AccountManager.KEY_AUTHTOKEN)
51-
} catch (e: Exception) {
52-
Log.w(TAG, "Failed to get auth token for account $accountName: ${e.message}")
53-
null
54-
}
55-
}
40+
val gaiaAccessToken = try {
41+
val account = Account(accountName, "com.google")
42+
val accountManager = AccountManager.get(context)
43+
val future = accountManager.getAuthToken(
44+
account, "oauth2:https://www.googleapis.com/auth/numberer",
45+
null, false, null, null
46+
)
47+
future.result?.getString(AccountManager.KEY_AUTHTOKEN)
48+
} catch (e: Exception) {
49+
Log.w(TAG, "Failed to get auth token for account $accountName: ${e.message}")
50+
null
5651
}
5752

5853
if (gaiaAccessToken.isNullOrBlank()) {
@@ -69,7 +64,7 @@ operator fun OnDemandConsent.Companion.invoke(
6964
return OnDemandConsent(
7065
consent = consentValue,
7166
gaia_token = GaiaToken(token = gaiaAccessToken),
72-
consent_variant = consentVariant ?: "",
73-
trigger = consentTrigger ?: ""
67+
consent_variant = consentVariant,
68+
trigger = consentTrigger
7469
)
7570
}

0 commit comments

Comments
 (0)