Home | History | Annotate | Download | only in parser
      1 /*
      2  * Copyright 2016, 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 
     17 package com.android.managedprovisioning.parser;
     18 
     19 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
     20 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
     21 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
     22 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE;
     23 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
     24 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER;
     25 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION;
     26 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
     27 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM;
     28 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED;
     29 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE;
     30 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME;
     31 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR;
     32 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION;
     33 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_USER_SETUP;
     34 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE;
     35 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN;
     36 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL;
     37 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD;
     38 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS;
     39 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST;
     40 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT;
     41 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE;
     42 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID;
     43 import static android.nfc.NfcAdapter.ACTION_NDEF_DISCOVERED;
     44 import static com.android.internal.util.Preconditions.checkNotNull;
     45 import static com.android.managedprovisioning.common.Globals.ACTION_RESUME_PROVISIONING;
     46 
     47 import android.content.Context;
     48 import android.content.Intent;
     49 import android.os.Bundle;
     50 import android.support.annotation.VisibleForTesting;
     51 
     52 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException;
     53 import com.android.managedprovisioning.common.Utils;
     54 import com.android.managedprovisioning.model.ProvisioningParams;
     55 
     56 import java.util.IllformedLocaleException;
     57 import java.util.Locale;
     58 import java.util.Properties;
     59 
     60 /**
     61  * This class can initialize a {@link ProvisioningParams} object from an intent.
     62  *
     63  * <p>A {@link ProvisioningParams} object stores various parameters both for the device owner
     64  * provisioning and profile owner provisioning.
     65  */
     66 public class MessageParser implements ProvisioningDataParser {
     67     public static final String EXTRA_PROVISIONING_ACTION =
     68             "com.android.managedprovisioning.extra.provisioning_action";
     69     @VisibleForTesting
     70     static final String EXTRA_PROVISIONING_DEVICE_ADMIN_SUPPORT_SHA1_PACKAGE_CHECKSUM =
     71             "com.android.managedprovisioning.extra.device_admin_support_sha1_package_checksum";
     72     @VisibleForTesting
     73     static final String EXTRA_PROVISIONING_STARTED_BY_TRUSTED_SOURCE  =
     74             "com.android.managedprovisioning.extra.started_by_trusted_source";
     75 
     76     private final Utils mUtils;
     77 
     78     /**
     79      * Converts {@link ProvisioningParams} to {@link Intent}.
     80      *
     81      * <p/>One of the use cases is to store {@link ProvisioningParams} before device-encryption
     82      * takes place. After device encryption is completed, the managed provisioning is resumed by
     83      * sending this intent.
     84      */
     85     public Intent getIntentFromProvisioningParams(ProvisioningParams params) {
     86         Intent intent = new Intent(ACTION_RESUME_PROVISIONING)
     87                 .putExtra(EXTRA_PROVISIONING_ACTION, params.provisioningAction)
     88                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
     89                         params.deviceAdminPackageName)
     90                 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
     91                         params.deviceAdminComponentName)
     92                 .putExtra(EXTRA_PROVISIONING_TIME_ZONE, params.timeZone)
     93                 .putExtra(EXTRA_PROVISIONING_LOCALE, localeToString(params.locale))
     94                 .putExtra(EXTRA_PROVISIONING_LOCAL_TIME, params.localTime)
     95                 .putExtra(EXTRA_PROVISIONING_STARTED_BY_TRUSTED_SOURCE,
     96                         params.startedByTrustedSource)
     97                 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
     98                         params.leaveAllSystemAppsEnabled)
     99                 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, params.adminExtrasBundle)
    100                 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, params.skipEncryption)
    101                 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, params.accountToMigrate)
    102                 .putExtra(EXTRA_PROVISIONING_SKIP_USER_SETUP, params.skipUserSetup);
    103         if (params.wifiInfo != null) {
    104             intent.putExtra(EXTRA_PROVISIONING_WIFI_SSID, params.wifiInfo.ssid)
    105                     .putExtra(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, params.wifiInfo.securityType)
    106                     .putExtra(EXTRA_PROVISIONING_WIFI_PASSWORD, params.wifiInfo.password)
    107                     .putExtra(EXTRA_PROVISIONING_WIFI_PROXY_HOST, params.wifiInfo.proxyHost)
    108                     .putExtra(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, params.wifiInfo.proxyBypassHosts)
    109                     .putExtra(EXTRA_PROVISIONING_WIFI_PAC_URL, params.wifiInfo.pacUrl)
    110                     .putExtra(EXTRA_PROVISIONING_WIFI_PROXY_PORT, params.wifiInfo.proxyPort)
    111                     .putExtra(EXTRA_PROVISIONING_WIFI_HIDDEN, params.wifiInfo.hidden);
    112         }
    113         if (params.deviceAdminDownloadInfo != null) {
    114             intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE,
    115                     params.deviceAdminDownloadInfo.minVersion)
    116                     .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION,
    117                             params.deviceAdminDownloadInfo.location)
    118                     .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER,
    119                             params.deviceAdminDownloadInfo.cookieHeader)
    120                     .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
    121                             mUtils.byteArrayToString(
    122                                     params.deviceAdminDownloadInfo.packageChecksum))
    123                     .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_SUPPORT_SHA1_PACKAGE_CHECKSUM,
    124                             params.deviceAdminDownloadInfo.packageChecksumSupportsSha1)
    125                     .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM,
    126                             mUtils.byteArrayToString(
    127                                     params.deviceAdminDownloadInfo.signatureChecksum));
    128         }
    129         if (params.mainColor != null) {
    130             intent.putExtra(EXTRA_PROVISIONING_MAIN_COLOR, params.mainColor);
    131         }
    132         return intent;
    133     }
    134 
    135     public MessageParser() {
    136         this(new Utils());
    137     }
    138 
    139     @VisibleForTesting
    140     MessageParser(Utils utils) {
    141         mUtils = checkNotNull(utils);
    142     }
    143 
    144     @Override
    145     public ProvisioningParams parse(Intent provisioningIntent, Context context)
    146             throws IllegalProvisioningArgumentException {
    147         return getParser(provisioningIntent).parse(provisioningIntent, context);
    148     }
    149 
    150     @VisibleForTesting
    151     ProvisioningDataParser getParser(Intent provisioningIntent) {
    152         if (ACTION_NDEF_DISCOVERED.equals(provisioningIntent.getAction())) {
    153             return new PropertiesProvisioningDataParser(mUtils);
    154         } else {
    155             return new ExtrasProvisioningDataParser(mUtils);
    156         }
    157     }
    158 
    159     static Locale stringToLocale(String string) throws IllformedLocaleException {
    160         if (string != null) {
    161             return new Locale.Builder().setLanguageTag(string.replace("_", "-")).build();
    162         } else {
    163             return null;
    164         }
    165     }
    166 
    167     static String localeToString(Locale locale) {
    168         if (locale != null) {
    169             return locale.getLanguage() + "_" + locale.getCountry();
    170         } else {
    171             return null;
    172         }
    173     }
    174 }
    175