Merge "Notify the users if a user installed SSL CA Cert is present." into klp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f4e8eb8342
BIN
packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png
Normal file
BIN
packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png
Normal file
BIN
packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 918 B |
BIN
packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png
Normal file
BIN
packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
@@ -500,4 +500,20 @@
|
|||||||
|
|
||||||
<!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. -->
|
<!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. -->
|
||||||
<string name="battery_meter_very_low_overlay_symbol">!</string>
|
<string name="battery_meter_very_low_overlay_symbol">!</string>
|
||||||
|
|
||||||
|
<!-- Shows up when there is a user SSL CA Cert installed on the
|
||||||
|
device. Indicates to the user that SSL traffic can be intercepted. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="ssl_ca_cert_warning">Network may be monitored</string>
|
||||||
|
<!-- Button to close the SSL CA cert warning dialog box. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="done_button">Done</string>
|
||||||
|
<!-- Title of Dialog warning users of SSL monitoring. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="ssl_ca_cert_dialog_title">Network Monitoring</string>
|
||||||
|
<!-- Text of message to show to users whose administrator has installed a SSL CA Cert.
|
||||||
|
[CHAR LIMIT=NONE] -->
|
||||||
|
<string name="ssl_ca_cert_info_message">This device is managed by: <xliff:g id="managing_domain">%s</xliff:g>.\n\nYour administrator is capable of monitoring your network activity, including emails, apps, and secure websites.\n\nFor more information,contact your administrator.</string>
|
||||||
|
<!-- Text of warning to show to users that have a SSL CA Cert installed. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="ssl_ca_cert_warning_message">A third party is capable of monitoring your network\nactivity, including emails, apps, and secure websites.\n\nA trusted credential installed on your device is making this possible.</string>
|
||||||
|
<!-- Label on button that will take the user to the Trusted Credentials settings page.
|
||||||
|
[CHAR LIMIT=NONE]-->
|
||||||
|
<string name="ssl_ca_cert_settings_button">Check trusted credentials</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import android.app.ActivityManagerNative;
|
|||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@@ -49,6 +50,7 @@ import android.provider.ContactsContract;
|
|||||||
import android.provider.ContactsContract.CommonDataKinds.Phone;
|
import android.provider.ContactsContract.CommonDataKinds.Phone;
|
||||||
import android.provider.ContactsContract.Profile;
|
import android.provider.ContactsContract.Profile;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
import android.security.KeyChain;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@@ -89,6 +91,7 @@ class QuickSettings {
|
|||||||
private ViewGroup mContainerView;
|
private ViewGroup mContainerView;
|
||||||
|
|
||||||
private DisplayManager mDisplayManager;
|
private DisplayManager mDisplayManager;
|
||||||
|
private DevicePolicyManager mDevicePolicyManager;
|
||||||
private WifiDisplayStatus mWifiDisplayStatus;
|
private WifiDisplayStatus mWifiDisplayStatus;
|
||||||
private PhoneStatusBar mStatusBarService;
|
private PhoneStatusBar mStatusBarService;
|
||||||
private BluetoothState mBluetoothState;
|
private BluetoothState mBluetoothState;
|
||||||
@@ -100,6 +103,7 @@ class QuickSettings {
|
|||||||
private LocationController mLocationController;
|
private LocationController mLocationController;
|
||||||
|
|
||||||
private AsyncTask<Void, Void, Pair<String, Drawable>> mUserInfoTask;
|
private AsyncTask<Void, Void, Pair<String, Drawable>> mUserInfoTask;
|
||||||
|
private AsyncTask<Void, Void, Pair<Boolean, Boolean>> mQueryCertTask;
|
||||||
|
|
||||||
private LevelListDrawable mBatteryLevels;
|
private LevelListDrawable mBatteryLevels;
|
||||||
private LevelListDrawable mChargingBatteryLevels;
|
private LevelListDrawable mChargingBatteryLevels;
|
||||||
@@ -116,6 +120,8 @@ class QuickSettings {
|
|||||||
|
|
||||||
public QuickSettings(Context context, QuickSettingsContainerView container) {
|
public QuickSettings(Context context, QuickSettingsContainerView container) {
|
||||||
mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
|
mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
|
||||||
|
mDevicePolicyManager
|
||||||
|
= (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mContainerView = container;
|
mContainerView = container;
|
||||||
mModel = new QuickSettingsModel(context);
|
mModel = new QuickSettingsModel(context);
|
||||||
@@ -137,6 +143,7 @@ class QuickSettings {
|
|||||||
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
|
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
|
||||||
filter.addAction(Intent.ACTION_USER_SWITCHED);
|
filter.addAction(Intent.ACTION_USER_SWITCHED);
|
||||||
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
||||||
|
filter.addAction(KeyChain.ACTION_STORAGE_CHANGED);
|
||||||
mContext.registerReceiver(mReceiver, filter);
|
mContext.registerReceiver(mReceiver, filter);
|
||||||
|
|
||||||
IntentFilter profileFilter = new IntentFilter();
|
IntentFilter profileFilter = new IntentFilter();
|
||||||
@@ -181,6 +188,26 @@ class QuickSettings {
|
|||||||
rotationLockController.addRotationLockControllerCallback(mModel);
|
rotationLockController.addRotationLockControllerCallback(mModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void queryForSslCaCerts() {
|
||||||
|
mQueryCertTask = new AsyncTask<Void, Void, Pair<Boolean, Boolean>>() {
|
||||||
|
@Override
|
||||||
|
protected Pair<Boolean, Boolean> doInBackground(Void... params) {
|
||||||
|
boolean hasCert = mDevicePolicyManager.hasAnyCaCertsInstalled();
|
||||||
|
boolean isManaged = mDevicePolicyManager.getDeviceOwner() != null;
|
||||||
|
|
||||||
|
return Pair.create(hasCert, isManaged);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Pair<Boolean, Boolean> result) {
|
||||||
|
super.onPostExecute(result);
|
||||||
|
boolean hasCert = result.first;
|
||||||
|
boolean isManaged = result.second;
|
||||||
|
mModel.setSslCaCertWarningTileInfo(hasCert, isManaged);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
mQueryCertTask.execute();
|
||||||
|
}
|
||||||
|
|
||||||
private void queryForUserInformation() {
|
private void queryForUserInformation() {
|
||||||
Context currentUserContext = null;
|
Context currentUserContext = null;
|
||||||
UserInfo userInfo = null;
|
UserInfo userInfo = null;
|
||||||
@@ -254,6 +281,7 @@ class QuickSettings {
|
|||||||
addTemporaryTiles(mContainerView, inflater);
|
addTemporaryTiles(mContainerView, inflater);
|
||||||
|
|
||||||
queryForUserInformation();
|
queryForUserInformation();
|
||||||
|
queryForSslCaCerts();
|
||||||
mTilesSetUp = true;
|
mTilesSetUp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -721,6 +749,25 @@ class QuickSettings {
|
|||||||
});
|
});
|
||||||
parent.addView(imeTile);
|
parent.addView(imeTile);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// SSL CA Cert Warning.
|
||||||
|
final QuickSettingsBasicTile sslCaCertWarningTile = new QuickSettingsBasicTile(mContext);
|
||||||
|
sslCaCertWarningTile.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
collapsePanels();
|
||||||
|
showSslCaCertWarningDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sslCaCertWarningTile.setImageResource(
|
||||||
|
com.android.internal.R.drawable.indicator_input_error);
|
||||||
|
sslCaCertWarningTile.setTextResource(R.string.ssl_ca_cert_warning);
|
||||||
|
|
||||||
|
mModel.addSslCaCertWarningTile(sslCaCertWarningTile,
|
||||||
|
new QuickSettingsModel.BasicRefreshCallback(sslCaCertWarningTile)
|
||||||
|
.setShowWhenEnabled(true));
|
||||||
|
parent.addView(sslCaCertWarningTile);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateResources() {
|
void updateResources() {
|
||||||
@@ -777,6 +824,45 @@ class QuickSettings {
|
|||||||
dialog.show();
|
dialog.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showSslCaCertWarningDialog() {
|
||||||
|
final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
||||||
|
builder.setTitle(R.string.ssl_ca_cert_dialog_title);
|
||||||
|
builder.setCancelable(true);
|
||||||
|
final boolean hasDeviceOwner = mDevicePolicyManager.getDeviceOwner() != null;
|
||||||
|
int buttonLabel;
|
||||||
|
if (hasDeviceOwner) {
|
||||||
|
// Institutional case. Show informational message.
|
||||||
|
String message = mContext.getResources().getString(R.string.ssl_ca_cert_info_message,
|
||||||
|
mDevicePolicyManager.getDeviceOwnerName());
|
||||||
|
builder.setMessage(message);
|
||||||
|
buttonLabel = R.string.done_button;
|
||||||
|
} else {
|
||||||
|
// Consumer case. Show scary warning.
|
||||||
|
builder.setMessage(R.string.ssl_ca_cert_warning_message);
|
||||||
|
buttonLabel = R.string.ssl_ca_cert_settings_button;
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.setPositiveButton(buttonLabel, new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
// do something.
|
||||||
|
if (hasDeviceOwner) {
|
||||||
|
// Close
|
||||||
|
} else {
|
||||||
|
startSettingsActivity("com.android.settings.TRUSTED_CREDENTIALS_USER");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final Dialog dialog = builder.create();
|
||||||
|
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
|
||||||
|
try {
|
||||||
|
WindowManagerGlobal.getWindowManagerService().dismissKeyguard();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
}
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
|
||||||
private void updateWifiDisplayStatus() {
|
private void updateWifiDisplayStatus() {
|
||||||
mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
|
mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
|
||||||
applyWifiDisplayStatus();
|
applyWifiDisplayStatus();
|
||||||
@@ -801,6 +887,7 @@ class QuickSettings {
|
|||||||
}
|
}
|
||||||
if (mTilesSetUp) {
|
if (mTilesSetUp) {
|
||||||
queryForUserInformation();
|
queryForUserInformation();
|
||||||
|
queryForSslCaCerts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -829,6 +916,8 @@ class QuickSettings {
|
|||||||
if (mUseDefaultAvatar) {
|
if (mUseDefaultAvatar) {
|
||||||
queryForUserInformation();
|
queryForUserInformation();
|
||||||
}
|
}
|
||||||
|
} else if (KeyChain.ACTION_STORAGE_CHANGED.equals(action)) {
|
||||||
|
queryForSslCaCerts();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -263,6 +263,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
|
|||||||
private RefreshCallback mSettingsCallback;
|
private RefreshCallback mSettingsCallback;
|
||||||
private State mSettingsState = new State();
|
private State mSettingsState = new State();
|
||||||
|
|
||||||
|
private QuickSettingsTileView mSslCaCertWarningTile;
|
||||||
|
private RefreshCallback mSslCaCertWarningCallback;
|
||||||
|
private State mSslCaCertWarningState = new State();
|
||||||
|
|
||||||
private RotationLockController mRotationLockController;
|
private RotationLockController mRotationLockController;
|
||||||
|
|
||||||
public QuickSettingsModel(Context context) {
|
public QuickSettingsModel(Context context) {
|
||||||
@@ -747,4 +751,23 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
|
|||||||
void refreshBrightnessTile() {
|
void refreshBrightnessTile() {
|
||||||
onBrightnessLevelChanged();
|
onBrightnessLevelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SSL CA Cert warning.
|
||||||
|
public void addSslCaCertWarningTile(QuickSettingsTileView view, RefreshCallback cb) {
|
||||||
|
mSslCaCertWarningTile = view;
|
||||||
|
mSslCaCertWarningCallback = cb;
|
||||||
|
// Set a sane default while we wait for the AsyncTask to finish (no cert).
|
||||||
|
setSslCaCertWarningTileInfo(false, true);
|
||||||
|
}
|
||||||
|
public void setSslCaCertWarningTileInfo(boolean hasCert, boolean isManaged) {
|
||||||
|
Resources r = mContext.getResources();
|
||||||
|
mSslCaCertWarningState.enabled = hasCert;
|
||||||
|
if (isManaged) {
|
||||||
|
mSslCaCertWarningState.iconId = R.drawable.ic_qs_certificate_info;
|
||||||
|
} else {
|
||||||
|
mSslCaCertWarningState.iconId = android.R.drawable.stat_notify_error;
|
||||||
|
}
|
||||||
|
mSslCaCertWarningState.label = r.getString(R.string.ssl_ca_cert_warning);
|
||||||
|
mSslCaCertWarningCallback.refreshView(mSslCaCertWarningTile, mSslCaCertWarningState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user