Home | History | Annotate | Download | only in tester
      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
     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
     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 
     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 
     85         public Authenticator(Context context) {
     86             super(context);
     87             mContxet = context;
     88         }
     89 
     90         @Override
     91         public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
     92                 String authTokenType, String[] requiredFeatures, Bundle options) {
     93             return new Bundle();
     94         }
     95 
     96         @Override
     97         public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
     98             return new Bundle();
     99         }
    100 
    101         @Override
    102         public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
    103                 String authTokenType, Bundle options) throws NetworkErrorException {
    104             return new Bundle();
    105         }
    106 
    107         @Override
    108         public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
    109                 Bundle options) throws NetworkErrorException {
    110             return new Bundle();
    111         }
    112 
    113         @Override
    114         public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
    115                 String authTokenType, Bundle options) throws NetworkErrorException {
    116             return new Bundle();
    117         }
    118 
    119         @Override
    120         public String getAuthTokenLabel(String authTokenType) {
    121             return "token_label";
    122         }
    123 
    124         @Override
    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