108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov/* 208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * Copyright (C) 2015 The Android Open Source Project 308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * 408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * you may not use this file except in compliance with the License. 608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * You may obtain a copy of the License at 708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * 808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * http://www.apache.org/licenses/LICENSE-2.0 908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * 1008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * Unless required by applicable law or agreed to in writing, software 1108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * distributed under the License is distributed on an "AS IS" BASIS, 1208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * See the License for the specific language governing permissions and 1408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov * limitations under the License. 1508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov */ 1608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 1708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovpackage com.android.packageinstaller.permission.utils; 1808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 1908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport android.content.pm.PackageInfo; 2008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport android.util.EventLog; 213c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann 22267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganovimport com.android.packageinstaller.permission.model.AppPermissionGroup; 233c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmannimport com.android.packageinstaller.permission.model.Permission; 2408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 2508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovimport java.util.List; 2608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 2708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganovpublic final class SafetyNetLogger { 2808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 2908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov // The log tag used by SafetyNet to pick entries from the event log. 3008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov private static final int SNET_NET_EVENT_LOG_TAG = 0x534e4554; 3108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 3208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov // Log tag for the result of permissions request. 333c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann private static final String PERMISSIONS_REQUESTED = "individual_permissions_requested"; 3408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 3508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov // Log tag for the result of permissions toggling. 363c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann private static final String PERMISSIONS_TOGGLED = "individual_permissions_toggled"; 3708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 3808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov private SafetyNetLogger() { 3908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov /* do nothing */ 4008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov } 4108c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 4208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov public static void logPermissionsRequested(PackageInfo packageInfo, 43267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov List<AppPermissionGroup> groups) { 4408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov EventLog.writeEvent(SNET_NET_EVENT_LOG_TAG, PERMISSIONS_REQUESTED, 453c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann packageInfo.applicationInfo.uid, buildChangedPermissionForPackageMessage( 4608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov packageInfo.packageName, groups)); 4708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov } 4808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 49267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov public static void logPermissionsToggled(String packageName, List<AppPermissionGroup> groups) { 5008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov EventLog.writeEvent(SNET_NET_EVENT_LOG_TAG, PERMISSIONS_TOGGLED, 513c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann android.os.Process.myUid(), buildChangedPermissionForPackageMessage( 5208c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov packageName, groups)); 5308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov } 5408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 553c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann private static String buildChangedPermissionForPackageMessage(String packageName, 56267c2bd39c248eea2679c0a8efa334d3155e262cSvet Ganov List<AppPermissionGroup> groups) { 5708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov StringBuilder builder = new StringBuilder(); 5808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 5908c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov builder.append(packageName).append(':'); 6008c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 613c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann int groupCount = groups.size(); 623c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann for (int groupNum = 0; groupNum < groupCount; groupNum++) { 633c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann AppPermissionGroup group = groups.get(groupNum); 643c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann 653c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann int permissionCount = group.getPermissions().size(); 663c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann for (int permissionNum = 0; permissionNum < permissionCount; permissionNum++) { 673c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann Permission permission = group.getPermissions().get(permissionNum); 683c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann 693c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann if (groupNum > 0 || permissionNum > 0) { 703c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann builder.append(';'); 713c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann } 723c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann 733c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann builder.append(permission.getName()).append('|'); 743c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann 753c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann if (group.doesSupportRuntimePermissions()) { 763c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann builder.append(permission.isGranted()).append('|'); 773c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann } else { 783c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann builder.append(permission.isGranted() && (permission.getAppOp() == null 793c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann || permission.isAppOpAllowed())).append('|'); 803c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann } 813c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann 823c9041e7356e86d546e65353a0a0c9a6a7bfe7c5Philip P. Moltmann builder.append(permission.getFlags()); 8308c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov } 8408c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov } 8508c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov 8608c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov return builder.toString(); 8708c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov } 8808c441de841e237f93ddb711b8f39f62ee95dddaSvet Ganov} 89