1*f585d8a3SJacky Wang"""Validates classes in the deployed jar are all within the expected packages. 2*f585d8a3SJacky Wang 3*f585d8a3SJacky Wang Usage: 4*f585d8a3SJacky Wang python validate-jar-entry-prefixes.py <jar-file> <comma-separated-prefixes> 5*f585d8a3SJacky Wang""" 6*f585d8a3SJacky Wangimport re 7*f585d8a3SJacky Wangimport shutil 8*f585d8a3SJacky Wangimport sys 9*f585d8a3SJacky Wangimport tempfile 10*f585d8a3SJacky Wangimport zipfile 11*f585d8a3SJacky Wang 12*f585d8a3SJacky Wang 13*f585d8a3SJacky Wangdef main(argv): 14*f585d8a3SJacky Wang if len(argv) > 3: 15*f585d8a3SJacky Wang raise Exception('Expected only two arguments but got {0}'.format(len(argv))) 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang jar_file, prefixes = argv[-2:] 18*f585d8a3SJacky Wang prefixes_pattern = re.compile('|'.join(prefixes.split(','))) 19*f585d8a3SJacky Wang 20*f585d8a3SJacky Wang invalid_entries = [] 21*f585d8a3SJacky Wang if jar_file.endswith('.jar'): 22*f585d8a3SJacky Wang invalid_entries = _invalid_entries(jar_file, prefixes_pattern) 23*f585d8a3SJacky Wang elif jar_file.endswith('.aar'): 24*f585d8a3SJacky Wang dirpath = tempfile.mkdtemp() 25*f585d8a3SJacky Wang with zipfile.ZipFile(jar_file, 'r') as zip_file: 26*f585d8a3SJacky Wang class_file = zip_file.extract('classes.jar', dirpath) 27*f585d8a3SJacky Wang invalid_entries = _invalid_entries(class_file, prefixes_pattern) 28*f585d8a3SJacky Wang shutil.rmtree(dirpath) 29*f585d8a3SJacky Wang else: 30*f585d8a3SJacky Wang raise Exception('Invalid jar file: {0}'.format(jar_file)) 31*f585d8a3SJacky Wang 32*f585d8a3SJacky Wang if invalid_entries: 33*f585d8a3SJacky Wang raise Exception( 34*f585d8a3SJacky Wang 'Found invalid entries in {0} that do not match one of the allowed prefixes ({1}):\n {2}' 35*f585d8a3SJacky Wang .format( 36*f585d8a3SJacky Wang jar_file, 37*f585d8a3SJacky Wang ', '.join(['"{0}"'.format(p) for p in prefixes.split(',')]), 38*f585d8a3SJacky Wang '\n '.join(invalid_entries)) 39*f585d8a3SJacky Wang ) 40*f585d8a3SJacky Wang 41*f585d8a3SJacky Wang 42*f585d8a3SJacky Wangdef _invalid_entries(jar_file, prefixes_pattern): 43*f585d8a3SJacky Wang invalid_entries = [] 44*f585d8a3SJacky Wang with zipfile.ZipFile(jar_file, 'r') as zip_file: 45*f585d8a3SJacky Wang for info in zip_file.infolist(): 46*f585d8a3SJacky Wang if not info.is_dir(): 47*f585d8a3SJacky Wang if not prefixes_pattern.match(info.filename): 48*f585d8a3SJacky Wang invalid_entries.append(info.filename) 49*f585d8a3SJacky Wang return invalid_entries 50*f585d8a3SJacky Wang 51*f585d8a3SJacky Wang 52*f585d8a3SJacky Wangif __name__ == '__main__': 53*f585d8a3SJacky Wang main(sys.argv) 54