xref: /aosp_15_r20/external/dagger2/util/validate-jar-entry-prefixes.py (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
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