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