xref: /aosp_15_r20/tools/aadevtools/validation/batch_check_permission.sh (revision b32fbb6340ee6fe4a25d7b39d84085c084465677)
1*b32fbb63SXin Li#!/bin/bash
2*b32fbb63SXin Li
3*b32fbb63SXin Li# Copyright (C) 2021 The Android Open Source Project
4*b32fbb63SXin Li#
5*b32fbb63SXin Li# Licensed under the Apache License, Version 2.0 (the "License");
6*b32fbb63SXin Li# you may not use this file except in compliance with the License.
7*b32fbb63SXin Li# You may obtain a copy of the License at
8*b32fbb63SXin Li#
9*b32fbb63SXin Li#      http://www.apache.org/licenses/LICENSE-2.0
10*b32fbb63SXin Li#
11*b32fbb63SXin Li# Unless required by applicable law or agreed to in writing, software
12*b32fbb63SXin Li# distributed under the License is distributed on an "AS IS" BASIS,
13*b32fbb63SXin Li# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*b32fbb63SXin Li# See the License for the specific language governing permissions and
15*b32fbb63SXin Li# limitations under the License.
16*b32fbb63SXin Li
17*b32fbb63SXin Lireadme() {
18*b32fbb63SXin Li  echo '''
19*b32fbb63SXin Li  check permissions xml from a apk bundle release aginast those on a device
20*b32fbb63SXin Li  ./batch_check_permission.sh ~/Downloads/apk_bundle_dir ~/Downloads/override.csv
21*b32fbb63SXin Li'''
22*b32fbb63SXin Li}
23*b32fbb63SXin Li
24*b32fbb63SXin LiSECONDS=0
25*b32fbb63SXin LiMY_NAME=$0
26*b32fbb63SXin LiSCRIPT_NAME="${MY_NAME##*/}"
27*b32fbb63SXin LiSCRIPT_DIR="${MY_NAME%/$SCRIPT_NAME}"
28*b32fbb63SXin Liecho Running from $SCRIPT_DIR
29*b32fbb63SXin Li
30*b32fbb63SXin Liif [[ -z $OUT_DIR ]]; then
31*b32fbb63SXin Li  OUT_DIR="${HOME}/Downloads"
32*b32fbb63SXin Lifi
33*b32fbb63SXin Li
34*b32fbb63SXin LiINPUT_DIR=$1
35*b32fbb63SXin Liif [[ -z "${INPUT_DIR}" ]]; then
36*b32fbb63SXin Li  readme
37*b32fbb63SXin Li  exit
38*b32fbb63SXin Lifi
39*b32fbb63SXin Li
40*b32fbb63SXin LiRENAME_CSV=$2
41*b32fbb63SXin Li# Read rename csv to create xmlRenameDic
42*b32fbb63SXin Lideclare -A xmlRenameDic
43*b32fbb63SXin Liif [[ -f ${RENAME_CSV} ]]; then
44*b32fbb63SXin Li  while IFS=',' read -r name newName others || [ -n "${name}" ]; do
45*b32fbb63SXin Li    if [[ "${name}" == "name" ]]; then
46*b32fbb63SXin Li      # skip header
47*b32fbb63SXin Li      header="${name},${newName}"
48*b32fbb63SXin Li    else
49*b32fbb63SXin Li      xmlRenameDic["${name}"]="${newName}"
50*b32fbb63SXin Li    fi
51*b32fbb63SXin Li  done < $RENAME_CSV
52*b32fbb63SXin Lifi
53*b32fbb63SXin Li
54*b32fbb63SXin Liecho "LOG=${LOG}"
55*b32fbb63SXin Lilog() {
56*b32fbb63SXin Li  if [[ -n ${LOG} ]]; then
57*b32fbb63SXin Li    echo $1
58*b32fbb63SXin Li  fi
59*b32fbb63SXin Li}
60*b32fbb63SXin Li
61*b32fbb63SXin Liecho "Listing xmls in ${INPUT_DIR}"
62*b32fbb63SXin Lideclare -A relXmlDic
63*b32fbb63SXin Li
64*b32fbb63SXin Lideclare -A relXmlDic="$(${SCRIPT_DIR}/get_file_dir.sh ${INPUT_DIR} xml)"
65*b32fbb63SXin Liecho "Found: ${#relXmlDic[@]} xmls"
66*b32fbb63SXin Li
67*b32fbb63SXin Liecho "Listing xmls in the device"
68*b32fbb63SXin Lideclare -A deviceXmlDic
69*b32fbb63SXin LideviceXmlList=$(adb shell "find / -name *.xml" 2>/dev/null)
70*b32fbb63SXin Lifor xml in ${deviceXmlList}; do
71*b32fbb63SXin Li  file=${xml##*/}
72*b32fbb63SXin Li  fPath=${xml%/*}
73*b32fbb63SXin Li  fParentPathPostfix=${fPath:(-11)}
74*b32fbb63SXin Li  if [[ "permissions" == ${fParentPathPostfix} ]]; then
75*b32fbb63SXin Li    deviceXmlDic[${file}]=${xml}
76*b32fbb63SXin Li    log "${file} ${fPath} ${fParentPathPostfix}"
77*b32fbb63SXin Li  fi
78*b32fbb63SXin Lidone
79*b32fbb63SXin Liecho "Found: ${#deviceXmlDic[@]} xmls"
80*b32fbb63SXin Li
81*b32fbb63SXin Liecho "Comparing xmls from ${INPUT_DIR} to those on the device."
82*b32fbb63SXin Lii=1
83*b32fbb63SXin Lifor xml in "${!relXmlDic[@]}"; do
84*b32fbb63SXin Li  # relFile="...google/etc/permissions/privapp-permissions-car.xml"
85*b32fbb63SXin Li  relFile=${relXmlDic[$xml]}
86*b32fbb63SXin Li  # fPath="...google/etc/permissions"
87*b32fbb63SXin Li  fPath=${relFile%/*}
88*b32fbb63SXin Li  # fParentPathPostfix="permissions"
89*b32fbb63SXin Li  fParentPathPostfix=${fPath:(-11)}
90*b32fbb63SXin Li  log "${xml} ${fPath} ${fParentPathPostfix}"
91*b32fbb63SXin Li
92*b32fbb63SXin Li  # Only care about permissions
93*b32fbb63SXin Li  if [[ "permissions" == ${fParentPathPostfix} ]]; then
94*b32fbb63SXin Li    echo "$i Comparing permission file: $xml"
95*b32fbb63SXin Li
96*b32fbb63SXin Li    deviceFile=${deviceXmlDic[$xml]}
97*b32fbb63SXin Li    if [[ -z ${deviceFile} ]]; then
98*b32fbb63SXin Li      # Maybe it's renamed
99*b32fbb63SXin Li      newXml=${xmlRenameDic[$xml]}
100*b32fbb63SXin Li      log "Rename $xml to $newXml"
101*b32fbb63SXin Li      deviceFile=${deviceXmlDic[$newXml]}
102*b32fbb63SXin Li      if [[ -z ${deviceFile} ]]; then
103*b32fbb63SXin Li        echo "Error: no ${xml} on the device."
104*b32fbb63SXin Li        echo
105*b32fbb63SXin Li        i=$(($i + 1))
106*b32fbb63SXin Li        continue
107*b32fbb63SXin Li      fi
108*b32fbb63SXin Li    fi
109*b32fbb63SXin Li
110*b32fbb63SXin Li    # Pull the xml from device & diff
111*b32fbb63SXin Li    adb pull "${deviceFile}" "${OUT_DIR}/${xml}"
112*b32fbb63SXin Li    diff "${relXmlDic[$xml]}" "${OUT_DIR}/${xml}"
113*b32fbb63SXin Li    i=$(($i + 1))
114*b32fbb63SXin Li    echo
115*b32fbb63SXin Li  fi
116*b32fbb63SXin Lidone
117*b32fbb63SXin Liecho "Took ${SECONDS} seconds"
118