Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 1 | /* |
| 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 | |
| 17 | package com.android.managedprovisioning; |
| 18 | |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 19 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE; |
| 20 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME; |
| 21 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE; |
| 22 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID; |
| 23 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN; |
| 24 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE; |
| 25 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD; |
| 26 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST; |
| 27 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT; |
| 28 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS; |
| 29 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL; |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 30 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE; |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 31 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 32 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE; |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 33 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM; |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 34 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION; |
Sander Alewijnse | d8dcb1f | 2014-07-24 15:24:50 +0100 | [diff] [blame] | 35 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER; |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 36 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME; |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 37 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM; |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 38 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM; |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 39 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME; |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 40 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE; |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 41 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION; |
| 42 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER; |
| 43 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM; |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 44 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM; |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 45 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS; |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 46 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED; |
Julia Reynolds | 5d47b65 | 2015-02-02 06:47:25 -0500 | [diff] [blame] | 47 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION; |
Craig Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 48 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_MAC_ADDRESS; |
| 49 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_UUID; |
| 50 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_DEVICE_ID; |
| 51 | import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_BT_USE_PROXY; |
Esteban Talavera | e917d11 | 2014-08-20 14:23:53 +0100 | [diff] [blame] | 52 | import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC; |
Craig Lafayette | a58843e | 2015-03-27 06:54:28 -0400 | [diff] [blame] | 53 | import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC_V2; |
Sander Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 54 | import static java.nio.charset.StandardCharsets.UTF_8; |
| 55 | |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 56 | import android.content.ComponentName; |
| 57 | import android.content.Context; |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 58 | import android.content.Intent; |
| 59 | import android.nfc.NdefMessage; |
| 60 | import android.nfc.NdefRecord; |
| 61 | import android.nfc.NfcAdapter; |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 62 | import android.os.Bundle; |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 63 | import android.os.Parcelable; |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 64 | import android.os.PersistableBundle; |
Sander Alewijnse | d704385 | 2014-06-17 15:50:48 +0100 | [diff] [blame] | 65 | import android.text.TextUtils; |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 66 | |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 67 | import com.android.managedprovisioning.Utils.IllegalProvisioningArgumentException; |
| 68 | |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 69 | import java.io.IOException; |
| 70 | import java.io.StringReader; |
| 71 | import java.util.Enumeration; |
| 72 | import java.util.HashMap; |
Narayan Kamath | 53ff3c0 | 2014-07-17 14:02:58 +0100 | [diff] [blame] | 73 | import java.util.IllformedLocaleException; |
Sander Alewijnse | 63254f4 | 2014-03-21 15:31:12 +0000 | [diff] [blame] | 74 | import java.util.Locale; |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 75 | import java.util.Properties; |
| 76 | |
| 77 | /** |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 78 | * 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 Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 81 | * |
| 82 | * <p> |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 83 | * 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 Talavera | e917d11 | 2014-08-20 14:23:53 +0100 | [diff] [blame] | 86 | * NfcRecord with mime type {@link MIME_TYPE_PROVISIONING_NFC}. This record stores a serialized |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 87 | * 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 Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 90 | * |
| 91 | * <p> |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 92 | * Intent was received directly. |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 93 | * The intent contains the extra {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME} or |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 94 | * {@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 Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 99 | * {@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 Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 102 | * 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 Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 106 | * {@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 Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 109 | * 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 Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 112 | * Additional information to send through to the device initializer and admin may be specified in |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 113 | * {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}. |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 114 | * 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 Alewijnse | d8dcb1f | 2014-07-24 15:24:50 +0100 | [diff] [blame] | 117 | * 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 Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 121 | * {@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 Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 126 | * A typical use case would be the {@link BootReminder} sending the intent after device encryption |
| 127 | * and reboot. |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 128 | * |
| 129 | * <p> |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 130 | * 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 Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 135 | * 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 Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 138 | */ |
Sander Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 139 | public class MessageParser { |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 140 | private static final String EXTRA_PROVISIONING_STARTED_BY_NFC = |
| 141 | "com.android.managedprovisioning.extra.started_by_nfc"; |
| 142 | |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 143 | 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 Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 152 | EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 153 | EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, |
Sander Alewijnse | d8dcb1f | 2014-07-24 15:24:50 +0100 | [diff] [blame] | 154 | EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER, |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 155 | EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 156 | EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM, |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 157 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION, |
| 158 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER, |
Craig Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 159 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM, |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 160 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM, |
Craig Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 161 | EXTRA_PROVISIONING_BT_MAC_ADDRESS, |
| 162 | EXTRA_PROVISIONING_BT_UUID, |
| 163 | EXTRA_PROVISIONING_BT_DEVICE_ID |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 164 | }; |
| 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 Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 171 | EXTRA_PROVISIONING_WIFI_PROXY_PORT, |
| 172 | EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE, |
| 173 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 174 | }; |
| 175 | |
| 176 | protected static final String[] DEVICE_OWNER_BOOLEAN_EXTRAS = { |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 177 | EXTRA_PROVISIONING_WIFI_HIDDEN, |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 178 | EXTRA_PROVISIONING_STARTED_BY_NFC, |
Julia Reynolds | 5d47b65 | 2015-02-02 06:47:25 -0500 | [diff] [blame] | 179 | EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, |
Craig Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 180 | EXTRA_PROVISIONING_SKIP_ENCRYPTION, |
| 181 | EXTRA_PROVISIONING_BT_USE_PROXY |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 182 | }; |
| 183 | |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 184 | protected static final String[] DEVICE_OWNER_PERSISTABLE_BUNDLE_EXTRAS = { |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 185 | EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, |
| 186 | EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 187 | }; |
| 188 | |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 189 | protected static final String[] DEVICE_OWNER_COMPONENT_NAME_EXTRAS = { |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 190 | EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, |
| 191 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 192 | }; |
| 193 | |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 194 | public void addProvisioningParamsToBundle(Bundle bundle, ProvisioningParams params) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 195 | 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 Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 205 | bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 206 | params.deviceAdminPackageName); |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 207 | bundle.putParcelable(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 208 | params.deviceAdminComponentName); |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 209 | bundle.putInt(EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 210 | params.deviceAdminDownloadInfo.minVersion); |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 211 | bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 212 | params.deviceAdminDownloadInfo.location); |
Sander Alewijnse | d8dcb1f | 2014-07-24 15:24:50 +0100 | [diff] [blame] | 213 | bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 214 | params.deviceAdminDownloadInfo.cookieHeader); |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 215 | bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 216 | Utils.byteArrayToString(params.deviceAdminDownloadInfo.packageChecksum)); |
| 217 | bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_CERTIFICATE_CHECKSUM, |
| 218 | Utils.byteArrayToString(params.deviceAdminDownloadInfo.certificateChecksum)); |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 219 | bundle.putParcelable(EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 220 | params.deviceInitializerComponentName); |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 221 | bundle.putInt(EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 222 | params.deviceInitializerDownloadInfo.minVersion); |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 223 | bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 224 | params.deviceInitializerDownloadInfo.location); |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 225 | bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 226 | params.deviceInitializerDownloadInfo.cookieHeader); |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 227 | bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM, |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 228 | Utils.byteArrayToString(params.deviceInitializerDownloadInfo.packageChecksum)); |
| 229 | bundle.putString(EXTRA_PROVISIONING_DEVICE_INITIALIZER_CERTIFICATE_CHECKSUM, |
| 230 | Utils.byteArrayToString(params.deviceInitializerDownloadInfo.certificateChecksum)); |
| 231 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 232 | bundle.putLong(EXTRA_PROVISIONING_LOCAL_TIME, params.localTime); |
| 233 | bundle.putBoolean(EXTRA_PROVISIONING_STARTED_BY_NFC, params.startedByNfc); |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 234 | bundle.putBoolean(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 235 | params.leaveAllSystemAppsEnabled); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 236 | bundle.putParcelable(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, params.adminExtrasBundle); |
| 237 | bundle.putBoolean(EXTRA_PROVISIONING_SKIP_ENCRYPTION, params.skipEncryption); |
Craig Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 238 | |
| 239 | // Bluetooth parameters |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 240 | 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 Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 244 | |
| 245 | bundle.putParcelable(EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS, |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 246 | params.frpChallengeBundle); |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 247 | } |
| 248 | |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 249 | public ProvisioningParams parseIntent(Intent intent) |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 250 | throws IllegalProvisioningArgumentException { |
Sander Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 251 | ProvisionLogger.logi("Processing intent."); |
| 252 | if (intent.hasExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)) { |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 253 | return parseNfcIntent(intent); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 254 | } else { |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 255 | return parseNonNfcIntent(intent); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 256 | } |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 257 | } |
| 258 | |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 259 | public ProvisioningParams parseNfcIntent(Intent nfcIntent) |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 260 | throws IllegalProvisioningArgumentException { |
Sander Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 261 | 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 Lafayette | a58843e | 2015-03-27 06:54:28 -0400 | [diff] [blame] | 271 | if (MIME_TYPE_PROVISIONING_NFC.equals(mimeType) || |
| 272 | MIME_TYPE_PROVISIONING_NFC_V2.equals(mimeType)) { |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 273 | ProvisioningParams params = parseProperties(new String(firstRecord.getPayload() |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 274 | , UTF_8)); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 275 | params.startedByNfc = true; |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 276 | return params; |
Sander Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 277 | } |
| 278 | } |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 279 | throw new IllegalProvisioningArgumentException( |
| 280 | "Intent does not contain NfcRecord with the correct MIME type."); |
Sander Alewijnse | 28bffd6 | 2014-06-05 10:54:26 +0100 | [diff] [blame] | 281 | } |
| 282 | |
Andrei Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 283 | // 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 Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 286 | private ProvisioningParams parseProperties(String data) |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 287 | throws IllegalProvisioningArgumentException { |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 288 | ProvisioningParams params = new ProvisioningParams(); |
| 289 | try { |
| 290 | Properties props = new Properties(); |
| 291 | props.load(new StringReader(data)); |
| 292 | |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 293 | String s; // Used for parsing non-Strings. |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 294 | params.timeZone |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 295 | = props.getProperty(EXTRA_PROVISIONING_TIME_ZONE); |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 296 | if ((s = props.getProperty(EXTRA_PROVISIONING_LOCALE)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 297 | params.locale = stringToLocale(s); |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 298 | } |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 299 | 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 Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 314 | = 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 Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 318 | params.deviceAdminComponentName = ComponentName.unflattenFromString( |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 319 | componentNameString); |
| 320 | } |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 321 | if ((s = props.getProperty( |
| 322 | EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 323 | params.deviceAdminDownloadInfo.minVersion = Integer.parseInt(s); |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 324 | } else { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 325 | params.deviceAdminDownloadInfo.minVersion = |
| 326 | ProvisioningParams.DEFAULT_MINIMUM_VERSION; |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 327 | } |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 328 | params.deviceAdminDownloadInfo.location |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 329 | = props.getProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 330 | params.deviceAdminDownloadInfo.cookieHeader = props.getProperty( |
Sander Alewijnse | d8dcb1f | 2014-07-24 15:24:50 +0100 | [diff] [blame] | 331 | EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER); |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 332 | if ((s = props.getProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM)) != null) { |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 333 | 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 Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 338 | } |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 339 | String name = props.getProperty( |
| 340 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME); |
| 341 | if (name != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 342 | params.deviceInitializerComponentName = ComponentName.unflattenFromString(name); |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 343 | } |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 344 | if ((s = props.getProperty( |
| 345 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 346 | params.deviceInitializerDownloadInfo.minVersion = Integer.parseInt(s); |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 347 | } else { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 348 | params.deviceInitializerDownloadInfo.minVersion = |
| 349 | ProvisioningParams.DEFAULT_MINIMUM_VERSION; |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 350 | } |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 351 | params.deviceInitializerDownloadInfo.location = props.getProperty( |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 352 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 353 | params.deviceInitializerDownloadInfo.cookieHeader = props.getProperty( |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 354 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER); |
| 355 | if ((s = props.getProperty( |
| 356 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM)) != null) { |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 357 | 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 Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 363 | } |
Sander Alewijnse | 885c349 | 2014-04-24 17:30:31 +0100 | [diff] [blame] | 364 | |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 365 | if ((s = props.getProperty(EXTRA_PROVISIONING_LOCAL_TIME)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 366 | params.localTime = Long.parseLong(s); |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 367 | } |
| 368 | |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 369 | if ((s = props.getProperty(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 370 | params.leaveAllSystemAppsEnabled = Boolean.parseBoolean(s); |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 371 | } |
Julia Reynolds | 5d47b65 | 2015-02-02 06:47:25 -0500 | [diff] [blame] | 372 | if ((s = props.getProperty(EXTRA_PROVISIONING_SKIP_ENCRYPTION)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 373 | params.skipEncryption = Boolean.parseBoolean(s); |
Julia Reynolds | 5d47b65 | 2015-02-02 06:47:25 -0500 | [diff] [blame] | 374 | } |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 375 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 376 | 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 Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 380 | if ((s = props.getProperty(EXTRA_PROVISIONING_BT_USE_PROXY)) != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 381 | params.bluetoothInfo.useProxy = Boolean.parseBoolean(s); |
Craig Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 382 | } |
| 383 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 384 | params.adminExtrasBundle = deserializeExtrasBundle(props, |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 385 | EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE); |
| 386 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 387 | params.frpChallengeBundle = deserializeExtrasBundle(props, |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 388 | EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS); |
Andrei Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 389 | |
Sander Alewijnse | 885c349 | 2014-04-24 17:30:31 +0100 | [diff] [blame] | 390 | checkValidityOfProvisioningParams(params); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 391 | return params; |
| 392 | } catch (IOException e) { |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 393 | throw new Utils.IllegalProvisioningArgumentException("Couldn't load payload", e); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 394 | } catch (NumberFormatException e) { |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 395 | throw new Utils.IllegalProvisioningArgumentException("Incorrect numberformat.", e); |
Narayan Kamath | 53ff3c0 | 2014-07-17 14:02:58 +0100 | [diff] [blame] | 396 | } catch (IllformedLocaleException e) { |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 397 | throw new Utils.IllegalProvisioningArgumentException("Invalid locale.", e); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 398 | } |
| 399 | } |
| 400 | |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 401 | /** |
| 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 Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 409 | throws IOException { |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 410 | PersistableBundle extrasBundle = null; |
| 411 | String serializedExtras = props.getProperty(extraName); |
Andrei Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 412 | if (serializedExtras != null) { |
| 413 | Properties extrasProp = new Properties(); |
| 414 | extrasProp.load(new StringReader(serializedExtras)); |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 415 | extrasBundle = new PersistableBundle(extrasProp.size()); |
Andrei Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 416 | for (String propName : extrasProp.stringPropertyNames()) { |
| 417 | extrasBundle.putString(propName, extrasProp.getProperty(propName)); |
| 418 | } |
Andrei Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 419 | } |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 420 | return extrasBundle; |
Andrei Kapishnikov | d75aebb | 2015-02-02 11:22:19 -0500 | [diff] [blame] | 421 | } |
| 422 | |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 423 | public ProvisioningParams parseNonNfcIntent(Intent intent) |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 424 | throws IllegalProvisioningArgumentException { |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 425 | ProvisionLogger.logi("Processing intent."); |
| 426 | ProvisioningParams params = new ProvisioningParams(); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 427 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 428 | params.timeZone = intent.getStringExtra(EXTRA_PROVISIONING_TIME_ZONE); |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 429 | String localeString = intent.getStringExtra(EXTRA_PROVISIONING_LOCALE); |
| 430 | if (localeString != null) { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 431 | params.locale = stringToLocale(localeString); |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 432 | } |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 433 | 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 Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 446 | EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 447 | params.deviceAdminPackageName |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 448 | = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 449 | params.deviceAdminDownloadInfo.minVersion = intent.getIntExtra( |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 450 | EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE, |
| 451 | ProvisioningParams.DEFAULT_MINIMUM_VERSION); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 452 | params.deviceAdminDownloadInfo.location |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 453 | = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 454 | params.deviceAdminDownloadInfo.cookieHeader = intent.getStringExtra( |
Sander Alewijnse | d8dcb1f | 2014-07-24 15:24:50 +0100 | [diff] [blame] | 455 | EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER); |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 456 | 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 Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 465 | } |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 466 | params.deviceInitializerComponentName = (ComponentName) intent.getParcelableExtra( |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 467 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 468 | params.deviceInitializerDownloadInfo.minVersion = intent.getIntExtra( |
Julia Reynolds | f3a5b3b | 2015-03-20 09:34:37 -0400 | [diff] [blame] | 469 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE, |
| 470 | ProvisioningParams.DEFAULT_MINIMUM_VERSION); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 471 | params.deviceInitializerDownloadInfo.location = intent.getStringExtra( |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 472 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 473 | params.deviceInitializerDownloadInfo.cookieHeader = intent.getStringExtra( |
Julia Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 474 | EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER); |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 475 | 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 Reynolds | 3f4eb37 | 2015-02-11 13:46:42 -0500 | [diff] [blame] | 485 | } |
Sander Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 486 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 487 | params.localTime = intent.getLongExtra(EXTRA_PROVISIONING_LOCAL_TIME, |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 488 | ProvisioningParams.DEFAULT_LOCAL_TIME); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 489 | params.startedByNfc = intent.getBooleanExtra(EXTRA_PROVISIONING_STARTED_BY_NFC, |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 490 | false); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 491 | params.leaveAllSystemAppsEnabled = intent.getBooleanExtra( |
Sander Alewijnse | fd13487 | 2014-11-18 13:28:06 +0000 | [diff] [blame] | 492 | EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, |
| 493 | ProvisioningParams.DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED); |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 494 | params.skipEncryption = intent.getBooleanExtra( |
Julia Reynolds | 5d47b65 | 2015-02-02 06:47:25 -0500 | [diff] [blame] | 495 | EXTRA_PROVISIONING_SKIP_ENCRYPTION, |
| 496 | ProvisioningParams.DEFAULT_EXTRA_PROVISIONING_SKIP_ENCRYPTION); |
Sander Alewijnse | 8f9bd13 | 2014-09-08 12:21:26 +0100 | [diff] [blame] | 497 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 498 | 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 Lafayette | 2fe9d99 | 2015-03-24 12:42:05 -0400 | [diff] [blame] | 504 | |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 505 | try { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 506 | params.adminExtrasBundle = (PersistableBundle) intent.getParcelableExtra( |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 507 | EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE); |
| 508 | } catch (ClassCastException e) { |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 509 | throw new IllegalProvisioningArgumentException("Extra " |
| 510 | + EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE |
| 511 | + " must be of type PersistableBundle.", e); |
Sander Alewijnse | f88f709 | 2014-08-20 16:26:09 +0100 | [diff] [blame] | 512 | } |
Sander Alewijnse | 9aff140 | 2014-07-18 17:15:32 +0100 | [diff] [blame] | 513 | |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 514 | try { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 515 | params.frpChallengeBundle = intent.getParcelableExtra( |
Craig Lafayette | 0992876 | 2015-03-29 20:48:07 -0400 | [diff] [blame] | 516 | 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 Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 523 | checkValidityOfProvisioningParams(params); |
| 524 | return params; |
Sander Alewijnse | ed0883b | 2014-03-18 15:01:13 +0000 | [diff] [blame] | 525 | } |
| 526 | |
| 527 | /** |
Sander Alewijnse | 885c349 | 2014-04-24 17:30:31 +0100 | [diff] [blame] | 528 | * Check whether necessary fields are set. |
| 529 | */ |
| 530 | private void checkValidityOfProvisioningParams(ProvisioningParams params) |
Nicolas Prevot | 0b44725 | 2015-03-09 14:59:02 +0000 | [diff] [blame] | 531 | throws IllegalProvisioningArgumentException { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 532 | if (TextUtils.isEmpty(params.deviceAdminPackageName) |
| 533 | && params.deviceAdminComponentName == null) { |
Nicolas Prevot | 668d65f | 2015-03-10 17:58:15 +0000 | [diff] [blame] | 534 | throw new IllegalProvisioningArgumentException("Must provide the name of the device" |
| 535 | + " admin package or component name"); |
| 536 | } |
Sander Alewijnse | 3efa83a | 2015-04-14 14:46:18 +0100 | [diff] [blame] | 537 | 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 Alewijnse | 885c349 | 2014-04-24 17:30:31 +0100 | [diff] [blame] | 549 | } |
Sander Alewijnse | 885c349 | 2014-04-24 17:30:31 +0100 | [diff] [blame] | 550 | } |
| 551 | } |
| 552 | |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 553 | public static Locale stringToLocale(String string) |
Narayan Kamath | 53ff3c0 | 2014-07-17 14:02:58 +0100 | [diff] [blame] | 554 | throws IllformedLocaleException { |
Sander Alewijnse | 74d6c14 | 2015-04-13 11:51:19 +0100 | [diff] [blame] | 555 | 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 Alewijnse | 56f7157 | 2014-06-23 16:21:33 +0100 | [diff] [blame] | 564 | } |
Sander Alewijnse | 226d36c | 2014-06-26 16:33:05 +0000 | [diff] [blame] | 565 | } |