1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.cts.devicepolicy.accountcheck.tester; 17 18 import android.accounts.AbstractAccountAuthenticator; 19 import android.accounts.Account; 20 import android.accounts.AccountAuthenticatorResponse; 21 import android.accounts.AccountManager; 22 import android.accounts.NetworkErrorException; 23 import android.app.Service; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.os.Bundle; 27 import android.os.IBinder; 28 import android.os.SystemClock; 29 import android.text.TextUtils; 30 import android.util.Log; 31 32 import java.util.Arrays; 33 import java.util.List; 34 35 public class TestAuthenticator extends Service { 36 private static final String TAG = "TestAuthenticator"; 37 38 private static final String ACCOUNT_TYPE = "com.android.cts.devicepolicy.authcheck.tester"; 39 40 41 private static Authenticator sInstance; 42 43 @Override onBind(Intent intent)44 public IBinder onBind(Intent intent) { 45 if (sInstance == null) { 46 sInstance = new Authenticator(getApplicationContext()); 47 48 } 49 return sInstance.getIBinder(); 50 } 51 52 @Override onStartCommand(Intent intent, int flags, int startId)53 public int onStartCommand(Intent intent, int flags, int startId) { 54 if ("add_account".equals(intent.getAction())) { 55 final String[] features = intent.getStringArrayExtra("features"); 56 createAccount(this, ACCOUNT_TYPE, features); 57 } 58 59 stopSelf(); 60 return 0; 61 } 62 createAccount(Context context, String accountType, String[] requiredFeatures)63 private static Account createAccount(Context context, String accountType, 64 String[] requiredFeatures) { 65 if (requiredFeatures == null) { 66 requiredFeatures = new String[0]; 67 } 68 69 final String name = SystemClock.elapsedRealtimeNanos() 70 + ":" + TextUtils.join(",", requiredFeatures); 71 72 Log.i(TAG, "Adding account '" + name + "' for " + accountType 73 + "... " + Arrays.asList(requiredFeatures)); 74 75 final Account account = new Account(name, accountType); 76 context.getSystemService(AccountManager.class).addAccountExplicitly( 77 account, "password", new Bundle()); 78 return account; 79 } 80 81 public static class Authenticator extends AbstractAccountAuthenticator { 82 83 private final Context mContxet; 84 Authenticator(Context context)85 public Authenticator(Context context) { 86 super(context); 87 mContxet = context; 88 } 89 90 @Override addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options)91 public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, 92 String authTokenType, String[] requiredFeatures, Bundle options) { 93 return new Bundle(); 94 } 95 96 @Override editProperties(AccountAuthenticatorResponse response, String accountType)97 public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { 98 return new Bundle(); 99 } 100 101 @Override updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options)102 public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, 103 String authTokenType, Bundle options) throws NetworkErrorException { 104 return new Bundle(); 105 } 106 107 @Override confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options)108 public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, 109 Bundle options) throws NetworkErrorException { 110 return new Bundle(); 111 } 112 113 @Override getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options)114 public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, 115 String authTokenType, Bundle options) throws NetworkErrorException { 116 return new Bundle(); 117 } 118 119 @Override getAuthTokenLabel(String authTokenType)120 public String getAuthTokenLabel(String authTokenType) { 121 return "token_label"; 122 } 123 124 @Override hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features)125 public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, 126 String[] features) throws NetworkErrorException { 127 128 final int p = account.name.indexOf(':'); 129 130 boolean hasAll = true; 131 final List<String> hasFeatures = 132 Arrays.asList(TextUtils.split(account.name.substring(p + 1), ",")); 133 for (String requested : features) { 134 if (!hasFeatures.contains(requested)) { 135 hasAll = false; 136 break; 137 } 138 } 139 140 Log.i(TAG, "Checking feature for account '" + account + "' for features=" 141 + Arrays.asList(features) + " result=" + hasAll); 142 143 Bundle result = new Bundle(); 144 result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, hasAll); 145 return result; 146 } 147 } 148 } 149