blob: 4865cbd9510b1a5deebaa421908eac1a91fc028a [file] [log] [blame]
Sander Alewijnseed0883b2014-03-18 15:01:13 +00001/*
2 * Copyright 2014, 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
17package com.android.managedprovisioning;
18
Sander Alewijnse56f71572014-06-23 16:21:33 +010019import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE;
20import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME;
21import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE;
22import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID;
23import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN;
24import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE;
25import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD;
26import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST;
27import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT;
28import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS;
29import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL;
Sander Alewijnsef88f7092014-08-20 16:26:09 +010030import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
Nicolas Prevot0b447252015-03-09 14:59:02 +000031import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -040032import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE;
Nicolas Prevot0b447252015-03-09 14:59:02 +000033import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
Sander Alewijnse56f71572014-06-23 16:21:33 +010034import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION;
Sander Alewijnsed8dcb1f2014-07-24 15:24:50 +010035import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER;
Nicolas Prevot0b447252015-03-09 14:59:02 +000036import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
Julia Reynolds3f4eb372015-02-11 13:46:42 -050037import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
Sander Alewijnse3efa83a2015-04-14 14:46:18 +010038import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM;
Julia Reynolds3f4eb372015-02-11 13:46:42 -050039import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME;
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -040040import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE;
Julia Reynolds3f4eb372015-02-11 13:46:42 -050041import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION;
42import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER;
43import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM;
Sander Alewijnse3efa83a2015-04-14 14:46:18 +010044import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM;
Craig Lafayette09928762015-03-29 20:48:07 -040045import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS;
Sander Alewijnsefd134872014-11-18 13:28:06 +000046import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED;
Julia Reynolds5d47b652015-02-02 06:47:25 -050047import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION;
Craig Lafayette2fe9d992015-03-24 12:42:05 -040048import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_MAC_ADDRESS;
49import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_UUID;
50import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_DEVICE_ID;
51import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_USE_PROXY;
Esteban Talaverae917d112014-08-20 14:23:53 +010052import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC;
Craig Lafayettea58843e2015-03-27 06:54:28 -040053import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC_V2;
Sander Alewijnse28bffd62014-06-05 10:54:26 +010054import static java.nio.charset.StandardCharsets.UTF_8;
55
Nicolas Prevot0b447252015-03-09 14:59:02 +000056import android.content.ComponentName;
57import android.content.Context;
Sander Alewijnseed0883b2014-03-18 15:01:13 +000058import android.content.Intent;
59import android.nfc.NdefMessage;
60import android.nfc.NdefRecord;
61import android.nfc.NfcAdapter;
Sander Alewijnse9aff1402014-07-18 17:15:32 +010062import android.os.Bundle;
Sander Alewijnseed0883b2014-03-18 15:01:13 +000063import android.os.Parcelable;
Sander Alewijnsef88f7092014-08-20 16:26:09 +010064import android.os.PersistableBundle;
Sander Alewijnsed7043852014-06-17 15:50:48 +010065import android.text.TextUtils;
Sander Alewijnseed0883b2014-03-18 15:01:13 +000066
Nicolas Prevot0b447252015-03-09 14:59:02 +000067import com.android.managedprovisioning.Utils.IllegalProvisioningArgumentException;
68
Sander Alewijnseed0883b2014-03-18 15:01:13 +000069import java.io.IOException;
70import java.io.StringReader;
71import java.util.Enumeration;
72import java.util.HashMap;
Narayan Kamath53ff3c02014-07-17 14:02:58 +010073import java.util.IllformedLocaleException;
Sander Alewijnse63254f42014-03-21 15:31:12 +000074import java.util.Locale;
Sander Alewijnseed0883b2014-03-18 15:01:13 +000075import java.util.Properties;
76
77/**
Sander Alewijnse8f9bd132014-09-08 12:21:26 +010078 * This class can initialize a {@link ProvisioningParams} object from an intent.
79 * A {@link ProvisioningParams} object stores various parameters for the device owner provisioning.
80 * There are two kinds of intents that can be parsed it into {@link ProvisioningParams}:
Sander Alewijnse28bffd62014-06-05 10:54:26 +010081 *
82 * <p>
Sander Alewijnse56f71572014-06-23 16:21:33 +010083 * Intent was received via Nfc.
84 * The intent contains the extra {@link NfcAdapter.EXTRA_NDEF_MESSAGES}, which indicates that
85 * provisioning was started via Nfc bump. This extra contains an NDEF message, which contains an
Esteban Talaverae917d112014-08-20 14:23:53 +010086 * NfcRecord with mime type {@link MIME_TYPE_PROVISIONING_NFC}. This record stores a serialized
Sander Alewijnse56f71572014-06-23 16:21:33 +010087 * properties object, which contains the serialized extra's described in the next option.
88 * A typical use case would be a programmer application that sends an Nfc bump to start Nfc
89 * provisioning from a programmer device.
Sander Alewijnse28bffd62014-06-05 10:54:26 +010090 *
91 * <p>
Sander Alewijnse56f71572014-06-23 16:21:33 +010092 * Intent was received directly.
Nicolas Prevot0b447252015-03-09 14:59:02 +000093 * The intent contains the extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} or
Julia Reynolds3f4eb372015-02-11 13:46:42 -050094 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME} (which is deprecated and supported for
95 * legacy reasons only), and may contain {@link #EXTRA_PROVISIONING_TIME_ZONE},
96 * {@link #EXTRA_PROVISIONING_LOCAL_TIME}, {@link #EXTRA_PROVISIONING_LOCALE}, and
97 * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME}. A download
98 * location for the device admin may be specified in
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -040099 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}, together with an optional
100 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE}, an optional
101 * http cookie header {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, and
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100102 * the SHA-1 hash of the target file {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM} or
103 * the SHA-1 hash of any certificate of the android package in the target file
104 * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM}. A download location for the device
105 * initializer may be specified in
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400106 * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}, together with an
107 * optional (@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE}, an optional http
108 * cookie header {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER} , and
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100109 * the SHA-1 hash of the target file {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM}
110 * or the SHA-1 hash of any certificate of the android package in the target file
111 * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM}.
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500112 * Additional information to send through to the device initializer and admin may be specified in
Sander Alewijnsef88f7092014-08-20 16:26:09 +0100113 * {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}.
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500114 * The optional boolean {@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED} indicates whether
115 * system apps should not be disabled. The optional boolean
116 * {@link #EXTRA_PROVISIONING_SKIP_ENCRYPTION} specifies whether the device should be encrypted.
Sander Alewijnsed8dcb1f2014-07-24 15:24:50 +0100117 * Furthermore a wifi network may be specified in {@link #EXTRA_PROVISIONING_WIFI_SSID}, and if
118 * applicable {@link #EXTRA_PROVISIONING_WIFI_HIDDEN},
119 * {@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, {@link #EXTRA_PROVISIONING_WIFI_PASSWORD},
120 * {@link #EXTRA_PROVISIONING_WIFI_PROXY_HOST}, {@link #EXTRA_PROVISIONING_WIFI_PROXY_PORT},
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400121 * {@link #EXTRA_PROVISIONING_WIFI_PROXY_BYPASS}. The optional fields
122 * {@link #EXTRA_PROVISIONING_BT_MAC_ADDRESS}, {@link #EXTRA_PROVISIONING_BT_UUID}, and
123 * {@link #EXTRA_PROVISIONING_BT_DEVICE_ID} define how to connect to a remote device over Bluetooth.
124 * The boolean {@link #EXTRA_PROVISIONING_BT_USE_PROXY}, if true, will allow this device to proxy
125 * network activity over the defined Bluetooth connection during initial setup.
Sander Alewijnse56f71572014-06-23 16:21:33 +0100126 * A typical use case would be the {@link BootReminder} sending the intent after device encryption
127 * and reboot.
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100128 *
129 * <p>
Craig Lafayette09928762015-03-29 20:48:07 -0400130 * If factory reset protection is enabled, the extra {@link
131 * #EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} may hold data necessary to clear factory reset
132 * protection challenges.
133 *
134 * <p>
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100135 * Furthermore this class can construct the bundle of extras for the second kind of intent given a
136 * {@link ProvisioningParams}, and it keeps track of the types of the extras in the
137 * DEVICE_OWNER_x_EXTRAS, with x the appropriate type.
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000138 */
Sander Alewijnse28bffd62014-06-05 10:54:26 +0100139public class MessageParser {
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100140 private static final String EXTRA_PROVISIONING_STARTED_BY_NFC =
141 "com.android.managedprovisioning.extra.started_by_nfc";
142
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100143 protected static final String[] DEVICE_OWNER_STRING_EXTRAS = {
144 EXTRA_PROVISIONING_TIME_ZONE,
145 EXTRA_PROVISIONING_LOCALE,
146 EXTRA_PROVISIONING_WIFI_SSID,
147 EXTRA_PROVISIONING_WIFI_SECURITY_TYPE,
148 EXTRA_PROVISIONING_WIFI_PASSWORD,
149 EXTRA_PROVISIONING_WIFI_PROXY_HOST,
150 EXTRA_PROVISIONING_WIFI_PROXY_BYPASS,
151 EXTRA_PROVISIONING_WIFI_PAC_URL,
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000152 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100153 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION,
Sander Alewijnsed8dcb1f2014-07-24 15:24:50 +0100154 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER,
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500155 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100156 EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM,
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500157 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION,
158 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER,
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400159 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM,
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100160 EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM,
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400161 EXTRA_PROVISIONING_BT_MAC_ADDRESS,
162 EXTRA_PROVISIONING_BT_UUID,
163 EXTRA_PROVISIONING_BT_DEVICE_ID
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100164 };
165
166 protected static final String[] DEVICE_OWNER_LONG_EXTRAS = {
167 EXTRA_PROVISIONING_LOCAL_TIME
168 };
169
170 protected static final String[] DEVICE_OWNER_INT_EXTRAS = {
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400171 EXTRA_PROVISIONING_WIFI_PROXY_PORT,
172 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE,
173 EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100174 };
175
176 protected static final String[] DEVICE_OWNER_BOOLEAN_EXTRAS = {
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100177 EXTRA_PROVISIONING_WIFI_HIDDEN,
Sander Alewijnsefd134872014-11-18 13:28:06 +0000178 EXTRA_PROVISIONING_STARTED_BY_NFC,
Julia Reynolds5d47b652015-02-02 06:47:25 -0500179 EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400180 EXTRA_PROVISIONING_SKIP_ENCRYPTION,
181 EXTRA_PROVISIONING_BT_USE_PROXY
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100182 };
183
Sander Alewijnsef88f7092014-08-20 16:26:09 +0100184 protected static final String[] DEVICE_OWNER_PERSISTABLE_BUNDLE_EXTRAS = {
Craig Lafayette09928762015-03-29 20:48:07 -0400185 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE,
186 EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
Sander Alewijnsef88f7092014-08-20 16:26:09 +0100187 };
188
Nicolas Prevot0b447252015-03-09 14:59:02 +0000189 protected static final String[] DEVICE_OWNER_COMPONENT_NAME_EXTRAS = {
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500190 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
191 EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME
Nicolas Prevot0b447252015-03-09 14:59:02 +0000192 };
193
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100194 public void addProvisioningParamsToBundle(Bundle bundle, ProvisioningParams params) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100195 bundle.putString(EXTRA_PROVISIONING_TIME_ZONE, params.timeZone);
196 bundle.putString(EXTRA_PROVISIONING_LOCALE, localeToString(params.locale));
197 bundle.putString(EXTRA_PROVISIONING_WIFI_SSID, params.wifiInfo.ssid);
198 bundle.putString(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, params.wifiInfo.securityType);
199 bundle.putString(EXTRA_PROVISIONING_WIFI_PASSWORD, params.wifiInfo.password);
200 bundle.putString(EXTRA_PROVISIONING_WIFI_PROXY_HOST, params.wifiInfo.proxyHost);
201 bundle.putString(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, params.wifiInfo.proxyBypassHosts);
202 bundle.putString(EXTRA_PROVISIONING_WIFI_PAC_URL, params.wifiInfo.pacUrl);
203 bundle.putInt(EXTRA_PROVISIONING_WIFI_PROXY_PORT, params.wifiInfo.proxyPort);
204 bundle.putBoolean(EXTRA_PROVISIONING_WIFI_HIDDEN, params.wifiInfo.hidden);
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000205 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100206 params.deviceAdminPackageName);
Nicolas Prevot0b447252015-03-09 14:59:02 +0000207 bundle.putParcelable(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100208 params.deviceAdminComponentName);
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400209 bundle.putInt(EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100210 params.deviceAdminDownloadInfo.minVersion);
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100211 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100212 params.deviceAdminDownloadInfo.location);
Sander Alewijnsed8dcb1f2014-07-24 15:24:50 +0100213 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100214 params.deviceAdminDownloadInfo.cookieHeader);
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100215 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100216 Utils.byteArrayToString(params.deviceAdminDownloadInfo.packageChecksum));
217 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM,
218 Utils.byteArrayToString(params.deviceAdminDownloadInfo.certificateChecksum));
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500219 bundle.putParcelable(EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100220 params.deviceInitializerComponentName);
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400221 bundle.putInt(EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100222 params.deviceInitializerDownloadInfo.minVersion);
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500223 bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100224 params.deviceInitializerDownloadInfo.location);
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500225 bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100226 params.deviceInitializerDownloadInfo.cookieHeader);
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500227 bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM,
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100228 Utils.byteArrayToString(params.deviceInitializerDownloadInfo.packageChecksum));
229 bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM,
230 Utils.byteArrayToString(params.deviceInitializerDownloadInfo.certificateChecksum));
231
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100232 bundle.putLong(EXTRA_PROVISIONING_LOCAL_TIME, params.localTime);
233 bundle.putBoolean(EXTRA_PROVISIONING_STARTED_BY_NFC, params.startedByNfc);
Sander Alewijnsefd134872014-11-18 13:28:06 +0000234 bundle.putBoolean(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100235 params.leaveAllSystemAppsEnabled);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100236 bundle.putParcelable(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, params.adminExtrasBundle);
237 bundle.putBoolean(EXTRA_PROVISIONING_SKIP_ENCRYPTION, params.skipEncryption);
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400238
239 // Bluetooth parameters
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100240 bundle.putString(EXTRA_PROVISIONING_BT_MAC_ADDRESS, params.bluetoothInfo.mac);
241 bundle.putString(EXTRA_PROVISIONING_BT_UUID, params.bluetoothInfo.uuid);
242 bundle.putString(EXTRA_PROVISIONING_BT_DEVICE_ID, params.bluetoothInfo.deviceIdentifier);
243 bundle.putBoolean(EXTRA_PROVISIONING_BT_USE_PROXY, params.bluetoothInfo.useProxy);
Craig Lafayette09928762015-03-29 20:48:07 -0400244
245 bundle.putParcelable(EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS,
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100246 params.frpChallengeBundle);
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100247 }
248
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000249 public ProvisioningParams parseIntent(Intent intent)
Nicolas Prevot0b447252015-03-09 14:59:02 +0000250 throws IllegalProvisioningArgumentException {
Sander Alewijnse28bffd62014-06-05 10:54:26 +0100251 ProvisionLogger.logi("Processing intent.");
252 if (intent.hasExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)) {
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000253 return parseNfcIntent(intent);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000254 } else {
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000255 return parseNonNfcIntent(intent);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000256 }
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000257 }
258
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000259 public ProvisioningParams parseNfcIntent(Intent nfcIntent)
Nicolas Prevot0b447252015-03-09 14:59:02 +0000260 throws IllegalProvisioningArgumentException {
Sander Alewijnse28bffd62014-06-05 10:54:26 +0100261 ProvisionLogger.logi("Processing Nfc Payload.");
262 // Only one first message with NFC_MIME_TYPE is used.
263 for (Parcelable rawMsg : nfcIntent
264 .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)) {
265 NdefMessage msg = (NdefMessage) rawMsg;
266
267 // Assume only first record of message is used.
268 NdefRecord firstRecord = msg.getRecords()[0];
269 String mimeType = new String(firstRecord.getType(), UTF_8);
270
Craig Lafayettea58843e2015-03-27 06:54:28 -0400271 if (MIME_TYPE_PROVISIONING_NFC.equals(mimeType) ||
272 MIME_TYPE_PROVISIONING_NFC_V2.equals(mimeType)) {
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100273 ProvisioningParams params = parseProperties(new String(firstRecord.getPayload()
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000274 , UTF_8));
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100275 params.startedByNfc = true;
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100276 return params;
Sander Alewijnse28bffd62014-06-05 10:54:26 +0100277 }
278 }
Nicolas Prevot0b447252015-03-09 14:59:02 +0000279 throw new IllegalProvisioningArgumentException(
280 "Intent does not contain NfcRecord with the correct MIME type.");
Sander Alewijnse28bffd62014-06-05 10:54:26 +0100281 }
282
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500283 // Note: EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE property contains a Properties object
284 // serialized into String. See Properties.store() and Properties.load() for more details.
285 // The property value is optional.
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000286 private ProvisioningParams parseProperties(String data)
Nicolas Prevot0b447252015-03-09 14:59:02 +0000287 throws IllegalProvisioningArgumentException {
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000288 ProvisioningParams params = new ProvisioningParams();
289 try {
290 Properties props = new Properties();
291 props.load(new StringReader(data));
292
Sander Alewijnse56f71572014-06-23 16:21:33 +0100293 String s; // Used for parsing non-Strings.
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100294 params.timeZone
Sander Alewijnse56f71572014-06-23 16:21:33 +0100295 = props.getProperty(EXTRA_PROVISIONING_TIME_ZONE);
Sander Alewijnse56f71572014-06-23 16:21:33 +0100296 if ((s = props.getProperty(EXTRA_PROVISIONING_LOCALE)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100297 params.locale = stringToLocale(s);
Sander Alewijnse56f71572014-06-23 16:21:33 +0100298 }
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100299 params.wifiInfo.ssid = props.getProperty(EXTRA_PROVISIONING_WIFI_SSID);
300 params.wifiInfo.securityType = props.getProperty(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE);
301 params.wifiInfo.password = props.getProperty(EXTRA_PROVISIONING_WIFI_PASSWORD);
302 params.wifiInfo.proxyHost = props.getProperty(EXTRA_PROVISIONING_WIFI_PROXY_HOST);
303 params.wifiInfo.proxyBypassHosts =
304 props.getProperty(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS);
305 params.wifiInfo.pacUrl = props.getProperty(EXTRA_PROVISIONING_WIFI_PAC_URL);
306 if ((s = props.getProperty(EXTRA_PROVISIONING_WIFI_PROXY_PORT)) != null) {
307 params.wifiInfo.proxyPort = Integer.parseInt(s);
308 }
309 if ((s = props.getProperty(EXTRA_PROVISIONING_WIFI_HIDDEN)) != null) {
310 params.wifiInfo.hidden = Boolean.parseBoolean(s);
311 }
312
313 params.deviceAdminPackageName
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000314 = props.getProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
315 String componentNameString = props.getProperty(
316 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME);
317 if (componentNameString != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100318 params.deviceAdminComponentName = ComponentName.unflattenFromString(
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000319 componentNameString);
320 }
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400321 if ((s = props.getProperty(
322 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100323 params.deviceAdminDownloadInfo.minVersion = Integer.parseInt(s);
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400324 } else {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100325 params.deviceAdminDownloadInfo.minVersion =
326 ProvisioningParams.DEFAULT_MINIMUM_VERSION;
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400327 }
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100328 params.deviceAdminDownloadInfo.location
Sander Alewijnse56f71572014-06-23 16:21:33 +0100329 = props.getProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100330 params.deviceAdminDownloadInfo.cookieHeader = props.getProperty(
Sander Alewijnsed8dcb1f2014-07-24 15:24:50 +0100331 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER);
Sander Alewijnse56f71572014-06-23 16:21:33 +0100332 if ((s = props.getProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM)) != null) {
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100333 params.deviceAdminDownloadInfo.packageChecksum = Utils.stringToByteArray(s);
334 }
335 if ((s = props.getProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM))
336 != null) {
337 params.deviceAdminDownloadInfo.certificateChecksum = Utils.stringToByteArray(s);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000338 }
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500339 String name = props.getProperty(
340 EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME);
341 if (name != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100342 params.deviceInitializerComponentName = ComponentName.unflattenFromString(name);
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500343 }
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400344 if ((s = props.getProperty(
345 EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100346 params.deviceInitializerDownloadInfo.minVersion = Integer.parseInt(s);
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400347 } else {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100348 params.deviceInitializerDownloadInfo.minVersion =
349 ProvisioningParams.DEFAULT_MINIMUM_VERSION;
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400350 }
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100351 params.deviceInitializerDownloadInfo.location = props.getProperty(
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500352 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100353 params.deviceInitializerDownloadInfo.cookieHeader = props.getProperty(
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500354 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER);
355 if ((s = props.getProperty(
356 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM)) != null) {
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100357 params.deviceInitializerDownloadInfo.packageChecksum = Utils.stringToByteArray(s);
358 }
359 if ((s = props.getProperty(EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM))
360 != null) {
361 params.deviceInitializerDownloadInfo.certificateChecksum =
362 Utils.stringToByteArray(s);
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500363 }
Sander Alewijnse885c3492014-04-24 17:30:31 +0100364
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100365 if ((s = props.getProperty(EXTRA_PROVISIONING_LOCAL_TIME)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100366 params.localTime = Long.parseLong(s);
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100367 }
368
Sander Alewijnsefd134872014-11-18 13:28:06 +0000369 if ((s = props.getProperty(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100370 params.leaveAllSystemAppsEnabled = Boolean.parseBoolean(s);
Sander Alewijnsefd134872014-11-18 13:28:06 +0000371 }
Julia Reynolds5d47b652015-02-02 06:47:25 -0500372 if ((s = props.getProperty(EXTRA_PROVISIONING_SKIP_ENCRYPTION)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100373 params.skipEncryption = Boolean.parseBoolean(s);
Julia Reynolds5d47b652015-02-02 06:47:25 -0500374 }
Sander Alewijnsefd134872014-11-18 13:28:06 +0000375
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100376 params.bluetoothInfo.mac = props.getProperty(EXTRA_PROVISIONING_BT_MAC_ADDRESS);
377 params.bluetoothInfo.uuid = props.getProperty(EXTRA_PROVISIONING_BT_UUID);
378 params.bluetoothInfo.deviceIdentifier =
379 props.getProperty(EXTRA_PROVISIONING_BT_DEVICE_ID);
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400380 if ((s = props.getProperty(EXTRA_PROVISIONING_BT_USE_PROXY)) != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100381 params.bluetoothInfo.useProxy = Boolean.parseBoolean(s);
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400382 }
383
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100384 params.adminExtrasBundle = deserializeExtrasBundle(props,
Craig Lafayette09928762015-03-29 20:48:07 -0400385 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
386
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100387 params.frpChallengeBundle = deserializeExtrasBundle(props,
Craig Lafayette09928762015-03-29 20:48:07 -0400388 EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS);
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500389
Sander Alewijnse885c3492014-04-24 17:30:31 +0100390 checkValidityOfProvisioningParams(params);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000391 return params;
392 } catch (IOException e) {
Nicolas Prevot0b447252015-03-09 14:59:02 +0000393 throw new Utils.IllegalProvisioningArgumentException("Couldn't load payload", e);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000394 } catch (NumberFormatException e) {
Nicolas Prevot0b447252015-03-09 14:59:02 +0000395 throw new Utils.IllegalProvisioningArgumentException("Incorrect numberformat.", e);
Narayan Kamath53ff3c02014-07-17 14:02:58 +0100396 } catch (IllformedLocaleException e) {
Nicolas Prevot0b447252015-03-09 14:59:02 +0000397 throw new Utils.IllegalProvisioningArgumentException("Invalid locale.", e);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000398 }
399 }
400
Craig Lafayette09928762015-03-29 20:48:07 -0400401 /**
402 * Get a {@link PersistableBundle} from a String property in a Properties object.
403 * @param props the source of the extra
404 * @param extraName key into the Properties object
405 * @return the bundle or {@code null} if there was no property with the given name
406 * @throws IOException if there was an error parsing the propery
407 */
408 private PersistableBundle deserializeExtrasBundle(Properties props, String extraName)
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500409 throws IOException {
Craig Lafayette09928762015-03-29 20:48:07 -0400410 PersistableBundle extrasBundle = null;
411 String serializedExtras = props.getProperty(extraName);
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500412 if (serializedExtras != null) {
413 Properties extrasProp = new Properties();
414 extrasProp.load(new StringReader(serializedExtras));
Craig Lafayette09928762015-03-29 20:48:07 -0400415 extrasBundle = new PersistableBundle(extrasProp.size());
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500416 for (String propName : extrasProp.stringPropertyNames()) {
417 extrasBundle.putString(propName, extrasProp.getProperty(propName));
418 }
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500419 }
Craig Lafayette09928762015-03-29 20:48:07 -0400420 return extrasBundle;
Andrei Kapishnikovd75aebb2015-02-02 11:22:19 -0500421 }
422
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000423 public ProvisioningParams parseNonNfcIntent(Intent intent)
Nicolas Prevot0b447252015-03-09 14:59:02 +0000424 throws IllegalProvisioningArgumentException {
Sander Alewijnse56f71572014-06-23 16:21:33 +0100425 ProvisionLogger.logi("Processing intent.");
426 ProvisioningParams params = new ProvisioningParams();
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000427
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100428 params.timeZone = intent.getStringExtra(EXTRA_PROVISIONING_TIME_ZONE);
Sander Alewijnse56f71572014-06-23 16:21:33 +0100429 String localeString = intent.getStringExtra(EXTRA_PROVISIONING_LOCALE);
430 if (localeString != null) {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100431 params.locale = stringToLocale(localeString);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000432 }
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100433 params.wifiInfo.ssid = intent.getStringExtra(EXTRA_PROVISIONING_WIFI_SSID);
434 params.wifiInfo.securityType = intent.getStringExtra(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE);
435 params.wifiInfo.password = intent.getStringExtra(EXTRA_PROVISIONING_WIFI_PASSWORD);
436 params.wifiInfo.proxyHost = intent.getStringExtra(EXTRA_PROVISIONING_WIFI_PROXY_HOST);
437 params.wifiInfo.proxyBypassHosts =
438 intent.getStringExtra(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS);
439 params.wifiInfo.pacUrl = intent.getStringExtra(EXTRA_PROVISIONING_WIFI_PAC_URL);
440 params.wifiInfo.proxyPort = intent.getIntExtra(EXTRA_PROVISIONING_WIFI_PROXY_PORT,
441 ProvisioningParams.DEFAULT_WIFI_PROXY_PORT);
442 params.wifiInfo.hidden = intent.getBooleanExtra(EXTRA_PROVISIONING_WIFI_HIDDEN,
443 ProvisioningParams.DEFAULT_WIFI_HIDDEN);
444
445 params.deviceAdminComponentName = (ComponentName) intent.getParcelableExtra(
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000446 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100447 params.deviceAdminPackageName
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000448 = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100449 params.deviceAdminDownloadInfo.minVersion = intent.getIntExtra(
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400450 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE,
451 ProvisioningParams.DEFAULT_MINIMUM_VERSION);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100452 params.deviceAdminDownloadInfo.location
Sander Alewijnse56f71572014-06-23 16:21:33 +0100453 = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100454 params.deviceAdminDownloadInfo.cookieHeader = intent.getStringExtra(
Sander Alewijnsed8dcb1f2014-07-24 15:24:50 +0100455 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER);
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100456 String packageHash =
457 intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM);
458 if (packageHash != null) {
459 params.deviceAdminDownloadInfo.packageChecksum = Utils.stringToByteArray(packageHash);
460 }
461 String certHash =
462 intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM);
463 if (certHash != null) {
464 params.deviceAdminDownloadInfo.certificateChecksum = Utils.stringToByteArray(certHash);
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000465 }
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100466 params.deviceInitializerComponentName = (ComponentName) intent.getParcelableExtra(
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500467 EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100468 params.deviceInitializerDownloadInfo.minVersion = intent.getIntExtra(
Julia Reynoldsf3a5b3b2015-03-20 09:34:37 -0400469 EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE,
470 ProvisioningParams.DEFAULT_MINIMUM_VERSION);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100471 params.deviceInitializerDownloadInfo.location = intent.getStringExtra(
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500472 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100473 params.deviceInitializerDownloadInfo.cookieHeader = intent.getStringExtra(
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500474 EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER);
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100475 packageHash = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM);
476 if (packageHash != null) {
477 params.deviceInitializerDownloadInfo.packageChecksum =
478 Utils.stringToByteArray(packageHash);
479 }
480 certHash =
481 intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM);
482 if (certHash != null) {
483 params.deviceInitializerDownloadInfo.certificateChecksum =
484 Utils.stringToByteArray(certHash);
Julia Reynolds3f4eb372015-02-11 13:46:42 -0500485 }
Sander Alewijnse56f71572014-06-23 16:21:33 +0100486
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100487 params.localTime = intent.getLongExtra(EXTRA_PROVISIONING_LOCAL_TIME,
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100488 ProvisioningParams.DEFAULT_LOCAL_TIME);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100489 params.startedByNfc = intent.getBooleanExtra(EXTRA_PROVISIONING_STARTED_BY_NFC,
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100490 false);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100491 params.leaveAllSystemAppsEnabled = intent.getBooleanExtra(
Sander Alewijnsefd134872014-11-18 13:28:06 +0000492 EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
493 ProvisioningParams.DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED);
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100494 params.skipEncryption = intent.getBooleanExtra(
Julia Reynolds5d47b652015-02-02 06:47:25 -0500495 EXTRA_PROVISIONING_SKIP_ENCRYPTION,
496 ProvisioningParams.DEFAULT_EXTRA_PROVISIONING_SKIP_ENCRYPTION);
Sander Alewijnse8f9bd132014-09-08 12:21:26 +0100497
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100498 params.bluetoothInfo.mac = intent.getStringExtra(EXTRA_PROVISIONING_BT_MAC_ADDRESS);
499 params.bluetoothInfo.uuid = intent.getStringExtra(EXTRA_PROVISIONING_BT_UUID);
500 params.bluetoothInfo.deviceIdentifier =
501 intent.getStringExtra(EXTRA_PROVISIONING_BT_DEVICE_ID);
502 params.bluetoothInfo.useProxy =
503 intent.getBooleanExtra(EXTRA_PROVISIONING_BT_USE_PROXY, false);
Craig Lafayette2fe9d992015-03-24 12:42:05 -0400504
Sander Alewijnsef88f7092014-08-20 16:26:09 +0100505 try {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100506 params.adminExtrasBundle = (PersistableBundle) intent.getParcelableExtra(
Sander Alewijnsef88f7092014-08-20 16:26:09 +0100507 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
508 } catch (ClassCastException e) {
Nicolas Prevot0b447252015-03-09 14:59:02 +0000509 throw new IllegalProvisioningArgumentException("Extra "
510 + EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
511 + " must be of type PersistableBundle.", e);
Sander Alewijnsef88f7092014-08-20 16:26:09 +0100512 }
Sander Alewijnse9aff1402014-07-18 17:15:32 +0100513
Craig Lafayette09928762015-03-29 20:48:07 -0400514 try {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100515 params.frpChallengeBundle = intent.getParcelableExtra(
Craig Lafayette09928762015-03-29 20:48:07 -0400516 EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS);
517 } catch (ClassCastException e) {
518 throw new IllegalProvisioningArgumentException("Extra "
519 + EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
520 + " must be of type PersistableBundle.", e);
521 }
522
Sander Alewijnse56f71572014-06-23 16:21:33 +0100523 checkValidityOfProvisioningParams(params);
524 return params;
Sander Alewijnseed0883b2014-03-18 15:01:13 +0000525 }
526
527 /**
Sander Alewijnse885c3492014-04-24 17:30:31 +0100528 * Check whether necessary fields are set.
529 */
530 private void checkValidityOfProvisioningParams(ProvisioningParams params)
Nicolas Prevot0b447252015-03-09 14:59:02 +0000531 throws IllegalProvisioningArgumentException {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100532 if (TextUtils.isEmpty(params.deviceAdminPackageName)
533 && params.deviceAdminComponentName == null) {
Nicolas Prevot668d65f2015-03-10 17:58:15 +0000534 throw new IllegalProvisioningArgumentException("Must provide the name of the device"
535 + " admin package or component name");
536 }
Sander Alewijnse3efa83a2015-04-14 14:46:18 +0100537 checkDownloadInfoHasChecksum(params.deviceAdminDownloadInfo, "device admin");
538 checkDownloadInfoHasChecksum(params.deviceInitializerDownloadInfo, "device initializer");
539 }
540
541 private void checkDownloadInfoHasChecksum(ProvisioningParams.PackageDownloadInfo info,
542 String downloadName) throws IllegalProvisioningArgumentException {
543 if (!TextUtils.isEmpty(info.location)) {
544 if ((info.packageChecksum == null || info.packageChecksum.length == 0)
545 && (info.certificateChecksum == null || info.certificateChecksum.length == 0)) {
546 throw new IllegalProvisioningArgumentException("Checksum of installer file"
547 + " or its certificate is required for downloading " + downloadName
548 + ", but neither is provided.");
Sander Alewijnse885c3492014-04-24 17:30:31 +0100549 }
Sander Alewijnse885c3492014-04-24 17:30:31 +0100550 }
551 }
552
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100553 public static Locale stringToLocale(String string)
Narayan Kamath53ff3c02014-07-17 14:02:58 +0100554 throws IllformedLocaleException {
Sander Alewijnse74d6c142015-04-13 11:51:19 +0100555 return new Locale.Builder().setLanguageTag(string.replace("_", "-")).build();
556 }
557
558 public static String localeToString(Locale locale) {
559 if (locale != null) {
560 return locale.getLanguage() + "_" + locale.getCountry();
561 } else {
562 return null;
563 }
Sander Alewijnse56f71572014-06-23 16:21:33 +0100564 }
Sander Alewijnse226d36c2014-06-26 16:33:05 +0000565}