1*b7c941bbSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*b7c941bbSAndroid Build Coastguard Worker# 3*b7c941bbSAndroid Build Coastguard Worker# Copyright 2021 - The Android Open Source Project 4*b7c941bbSAndroid Build Coastguard Worker# 5*b7c941bbSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*b7c941bbSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*b7c941bbSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*b7c941bbSAndroid Build Coastguard Worker# 9*b7c941bbSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*b7c941bbSAndroid Build Coastguard Worker# 11*b7c941bbSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*b7c941bbSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*b7c941bbSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*b7c941bbSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*b7c941bbSAndroid Build Coastguard Worker# limitations under the License. 16*b7c941bbSAndroid Build Coastguard Worker 17*b7c941bbSAndroid Build Coastguard Worker"""File handler that reads target files.""" 18*b7c941bbSAndroid Build Coastguard Worker 19*b7c941bbSAndroid Build Coastguard Workerfrom abstract_build_file_handler import * 20*b7c941bbSAndroid Build Coastguard Workerfrom zipfile import ZipFile 21*b7c941bbSAndroid Build Coastguard Worker 22*b7c941bbSAndroid Build Coastguard Workerclass TargetFileHandler(AbstractBuildFileHandler): 23*b7c941bbSAndroid Build Coastguard Worker """Reads file's content from target files.""" 24*b7c941bbSAndroid Build Coastguard Worker 25*b7c941bbSAndroid Build Coastguard Worker def __init__(self, build_file): 26*b7c941bbSAndroid Build Coastguard Worker super().__init__(build_file) 27*b7c941bbSAndroid Build Coastguard Worker 28*b7c941bbSAndroid Build Coastguard Worker def get_file_hash(self, file_names, hash_func=None): 29*b7c941bbSAndroid Build Coastguard Worker """See base class.""" 30*b7c941bbSAndroid Build Coastguard Worker hash_dict = dict() 31*b7c941bbSAndroid Build Coastguard Worker with ZipFile(self.build_file) as zip_file: 32*b7c941bbSAndroid Build Coastguard Worker for file_name in file_names: 33*b7c941bbSAndroid Build Coastguard Worker # Convert top directory's name to upper case. 34*b7c941bbSAndroid Build Coastguard Worker idx = file_name[1:].find('/')+1 35*b7c941bbSAndroid Build Coastguard Worker real_file_name = file_name[1:idx].upper()+file_name[idx:] 36*b7c941bbSAndroid Build Coastguard Worker if real_file_name not in zip_file.namelist(): 37*b7c941bbSAndroid Build Coastguard Worker continue 38*b7c941bbSAndroid Build Coastguard Worker with zip_file.open(real_file_name) as f: 39*b7c941bbSAndroid Build Coastguard Worker if hash_func: 40*b7c941bbSAndroid Build Coastguard Worker hash_dict[file_name] = hash_func(f.read()) 41*b7c941bbSAndroid Build Coastguard Worker else: 42*b7c941bbSAndroid Build Coastguard Worker hash_dict[file_name] = hash(f.read()) 43*b7c941bbSAndroid Build Coastguard Worker return hash_dict 44*b7c941bbSAndroid Build Coastguard Worker 45*b7c941bbSAndroid Build Coastguard Worker def get_system_fingerprint(self): 46*b7c941bbSAndroid Build Coastguard Worker """See base class.""" 47*b7c941bbSAndroid Build Coastguard Worker fingerprint = '' 48*b7c941bbSAndroid Build Coastguard Worker with ZipFile(self.build_file) as zip_file: 49*b7c941bbSAndroid Build Coastguard Worker with zip_file.open('SYSTEM/build.prop') as build_prop: 50*b7c941bbSAndroid Build Coastguard Worker for line in build_prop: 51*b7c941bbSAndroid Build Coastguard Worker line = line.decode('UTF-8') 52*b7c941bbSAndroid Build Coastguard Worker if 'build.fingerprint' not in line: 53*b7c941bbSAndroid Build Coastguard Worker continue 54*b7c941bbSAndroid Build Coastguard Worker fingerprint = line.split('=')[1].strip() 55*b7c941bbSAndroid Build Coastguard Worker break 56*b7c941bbSAndroid Build Coastguard Worker return fingerprint 57