Skip to content

Commit 32bc895

Browse files
authored
Merge commit from fork
1 parent 88231e3 commit 32bc895

10 files changed

Lines changed: 133 additions & 293 deletions

File tree

‎play-services-auth-workaccount/core/src/main/AndroidManifest.xml‎

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,5 @@
1919
</intent-filter>
2020
</service>
2121

22-
<service
23-
android:name="com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticatorService"
24-
android:process=":persistent"
25-
android:enabled="false"
26-
android:exported="false">
27-
28-
<intent-filter>
29-
<action android:name="android.accounts.AccountAuthenticator"/>
30-
</intent-filter>
31-
32-
<meta-data
33-
android:name="android.accounts.AccountAuthenticator"
34-
android:resource="@xml/auth_work_authenticator"/>
35-
36-
<meta-data
37-
android:name="android.accounts.AccountAuthenticator.customTokens"
38-
android:value="1"/>
39-
40-
</service>
41-
4222
</application>
4323
</manifest>

‎play-services-auth-workaccount/core/src/main/kotlin/com/google/android/gms/auth/account/authenticator/WorkAccountAuthenticator.kt‎

Lines changed: 0 additions & 218 deletions
This file was deleted.

‎play-services-auth-workaccount/core/src/main/kotlin/org/microg/gms/auth/workaccount/WorkAccountService.kt‎

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,26 @@ import android.content.Context
1313
import android.content.Intent
1414
import android.content.pm.PackageManager
1515
import android.os.Build.VERSION.SDK_INT
16+
import android.os.Bundle
1617
import android.os.Parcel
1718
import android.util.Log
1819
import com.google.android.gms.auth.account.IWorkAccountCallback
1920
import com.google.android.gms.auth.account.IWorkAccountService
20-
import com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticator
21-
import com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticator.Companion.WORK_ACCOUNT_CHANGED_BOARDCAST
22-
import com.google.android.gms.auth.account.authenticator.WorkAccountAuthenticatorService
2321
import com.google.android.gms.common.Feature
2422
import com.google.android.gms.common.api.CommonStatusCodes
2523
import com.google.android.gms.common.internal.ConnectionInfo
2624
import com.google.android.gms.common.internal.GetServiceRequest
2725
import com.google.android.gms.common.internal.IGmsCallbacks
2826
import org.microg.gms.BaseService
27+
import org.microg.gms.auth.AuthConstants
28+
import org.microg.gms.auth.AuthRequest
2929
import org.microg.gms.common.GmsService
3030
import org.microg.gms.common.PackageUtils
3131

3232
private const val TAG = "GmsWorkAccountService"
3333

34+
const val WORK_ACCOUNT_CHANGED_BROADCAST = "org.microg.vending.WORK_ACCOUNT_CHANGED"
35+
3436
class WorkAccountService : BaseService(TAG, GmsService.WORK_ACCOUNT_API) {
3537
override fun handleServiceRequest(
3638
callback: IGmsCallbacks,
@@ -84,7 +86,7 @@ class WorkAccountServiceImpl(val context: Context) : IWorkAccountService.Stub()
8486

8587
val componentName = ComponentName(
8688
context,
87-
WorkAccountAuthenticatorService::class.java
89+
"org.microg.gms.auth.WorkAccountAuthenticatorService"
8890
)
8991
packageManager.setComponentEnabledSetting(
9092
componentName,
@@ -93,13 +95,72 @@ class WorkAccountServiceImpl(val context: Context) : IWorkAccountService.Stub()
9395
)
9496
}
9597

98+
/**
99+
* @return `null` if account creation fails, the newly created account otherwise
100+
*/
101+
fun addAccountInternal(
102+
accountCreationToken: String
103+
): Account? {
104+
105+
if (!WorkProfileSettings(context).allowCreateWorkAccount) {
106+
// TODO: communicate error to user (use `R.string.auth_work_authenticator_disabled_error`)
107+
Log.w(TAG, "creating a work account is disabled in microG settings")
108+
return null
109+
}
110+
111+
return try {
112+
val authResponse = AuthRequest().fromContext(context)
113+
.appIsGms()
114+
.callerIsGms()
115+
.service("ac2dm")
116+
.token(accountCreationToken).isAccessToken()
117+
.addAccount()
118+
.getAccountId()
119+
.droidguardResults("null") // TODO
120+
.response
121+
122+
val accountManager = AccountManager.get(context)
123+
val account = Account(authResponse.email, AuthConstants.WORK_ACCOUNT_TYPE)
124+
val accountAdded = accountManager.addAccountExplicitly(
125+
account,
126+
authResponse.token, Bundle().apply {
127+
// Work accounts have no SID / LSID ("BAD_COOKIE") and no first/last name.
128+
if (authResponse.accountId.isNotBlank()) {
129+
putString(AuthConstants.GOOGLE_USER_ID, authResponse.accountId)
130+
}
131+
putString(AuthConstants.KEY_ACCOUNT_CAPABILITIES, authResponse.capabilities)
132+
putString(AuthConstants.KEY_ACCOUNT_SERVICES, authResponse.services)
133+
if (authResponse.services != "android") {
134+
Log.i(
135+
TAG,
136+
"unexpected 'services' value ${authResponse.services} (usually 'android')"
137+
)
138+
}
139+
})
140+
141+
if (accountAdded) {
142+
143+
// Notify vending package
144+
context.sendBroadcast(
145+
Intent(WORK_ACCOUNT_CHANGED_BROADCAST).setPackage("com.android.vending")
146+
)
147+
148+
// Report successful creation to caller
149+
account
150+
} else null
151+
} catch (exception: Exception) {
152+
Log.w(TAG, "Failed to add work account.", exception)
153+
null
154+
}
155+
}
156+
96157
override fun addWorkAccount(
97158
callback: IWorkAccountCallback?,
98159
token: String
99160
) {
100161
Log.d(TAG, "addWorkAccount with token $token")
101162
Thread {
102-
WorkAccountAuthenticator(context).addAccountInternal(token)?.let {
163+
addAccountInternal(token)?.let {
103164
callback?.onAccountAdded(it)
104165
}
105166
}.start()
@@ -117,7 +178,7 @@ class WorkAccountServiceImpl(val context: Context) : IWorkAccountService.Stub()
117178

118179
// Notify vending package
119180
context.sendBroadcast(
120-
Intent(WORK_ACCOUNT_CHANGED_BOARDCAST).setPackage("com.android.vending")
181+
Intent(WORK_ACCOUNT_CHANGED_BROADCAST).setPackage("com.android.vending")
121182
)
122183

123184
callback?.onAccountRemoved(success)

0 commit comments

Comments
 (0)