OLD | NEW |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import argparse | 5 import argparse |
6 import fnmatch | 6 import fnmatch |
7 import glob | 7 import glob |
8 import os | 8 import os |
9 import plistlib | 9 import plistlib |
10 import shutil | 10 import shutil |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 bundle_identifier: the identifier of the bundle that needs to be signed. | 90 bundle_identifier: the identifier of the bundle that needs to be signed. |
91 | 91 |
92 Returns: | 92 Returns: |
93 True if the mobile provisioning profile can be used to sign a bundle | 93 True if the mobile provisioning profile can be used to sign a bundle |
94 with the corresponding bundle_identifier, False otherwise. | 94 with the corresponding bundle_identifier, False otherwise. |
95 """ | 95 """ |
96 return fnmatch.fnmatch( | 96 return fnmatch.fnmatch( |
97 '%s.%s' % (self.team_identifier, bundle_identifier), | 97 '%s.%s' % (self.team_identifier, bundle_identifier), |
98 self.application_identifier_pattern) | 98 self.application_identifier_pattern) |
99 | 99 |
100 def Install(self, bundle): | 100 def Install(self, installation_path): |
101 """Copies mobile provisioning profile info the bundle.""" | 101 """Copies mobile provisioning profile info to |installation_path|.""" |
102 installation_path = os.path.join(bundle.path, 'embedded.mobileprovision') | |
103 shutil.copy2(self.path, installation_path) | 102 shutil.copy2(self.path, installation_path) |
104 | 103 |
105 | 104 |
106 class Entitlements(object): | 105 class Entitlements(object): |
107 """Wraps an Entitlement plist file.""" | 106 """Wraps an Entitlement plist file.""" |
108 | 107 |
109 def __init__(self, entitlements_path): | 108 def __init__(self, entitlements_path): |
110 """Initializes Entitlements object from entitlement file.""" | 109 """Initializes Entitlements object from entitlement file.""" |
111 self._path = entitlements_path | 110 self._path = entitlements_path |
112 self._data = LoadPlistFile(self._path) | 111 self._data = LoadPlistFile(self._path) |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 parser.add_argument( | 256 parser.add_argument( |
258 '--identity', '-i', required=True, | 257 '--identity', '-i', required=True, |
259 help='identity to use to codesign') | 258 help='identity to use to codesign') |
260 parser.add_argument( | 259 parser.add_argument( |
261 '--binary', '-b', required=True, | 260 '--binary', '-b', required=True, |
262 help='path to the iOS bundle binary') | 261 help='path to the iOS bundle binary') |
263 parser.add_argument( | 262 parser.add_argument( |
264 '--framework', '-F', action='append', default=[], dest='frameworks', | 263 '--framework', '-F', action='append', default=[], dest='frameworks', |
265 help='install and resign system framework') | 264 help='install and resign system framework') |
266 parser.add_argument( | 265 parser.add_argument( |
267 '--disable-code-signature', action='store_false', dest='sign', | 266 '--disable-code-signature', action='store_true', dest='no_signature', |
268 help='disable code signature') | 267 help='disable code signature') |
269 parser.add_argument( | 268 parser.add_argument( |
270 '--platform', '-t', required=True, | 269 '--platform', '-t', required=True, |
271 help='platform the signed bundle is targetting') | 270 help='platform the signed bundle is targetting') |
272 parser.set_defaults(sign=True) | 271 parser.set_defaults(no_signature=False) |
273 | 272 |
274 @staticmethod | 273 @staticmethod |
275 def _Execute(args): | 274 def _Execute(args): |
276 if not args.identity: | 275 if not args.identity: |
277 args.identity = '-' | 276 args.identity = '-' |
278 | 277 |
279 bundle = Bundle(args.path) | 278 bundle = Bundle(args.path) |
280 | 279 |
281 # Find mobile provisioning profile and embeds it into the bundle (if a code | 280 # Delete existing embedded mobile provisioning. |
282 # signing identify has been provided, fails if no valid mobile provisioning | 281 embedded_provisioning_profile = os.path.join( |
283 # is found). | 282 bundle.path, 'embedded.mobileprovision') |
284 provisioning_profile_required = args.identity != '-' | 283 if os.path.isfile(embedded_provisioning_profile): |
285 provisioning_profile = FindProvisioningProfile( | 284 os.unlink(embedded_provisioning_profile) |
286 bundle.identifier, provisioning_profile_required) | |
287 if provisioning_profile and args.platform != 'iphonesimulator': | |
288 provisioning_profile.Install(bundle) | |
289 | 285 |
290 # Delete existing code signature. | 286 # Delete existing code signature. |
291 signature_file = os.path.join(args.path, '_CodeSignature', 'CodeResources') | 287 signature_file = os.path.join(args.path, '_CodeSignature', 'CodeResources') |
292 if os.path.isfile(signature_file): | 288 if os.path.isfile(signature_file): |
293 os.unlink(signature_file) | 289 shutil.rmtree(os.path.dirname(signature_file)) |
294 | 290 |
295 # Install system frameworks if requested. | 291 # Install system frameworks if requested. |
296 for framework_path in args.frameworks: | 292 for framework_path in args.frameworks: |
297 InstallSystemFramework(framework_path, args.path, args) | 293 InstallSystemFramework(framework_path, args.path, args) |
298 | 294 |
299 # Copy main binary into bundle. | 295 # Copy main binary into bundle. |
300 if os.path.isfile(bundle.binary_path): | 296 if os.path.isfile(bundle.binary_path): |
301 os.unlink(bundle.binary_path) | 297 os.unlink(bundle.binary_path) |
302 shutil.copy(args.binary, bundle.binary_path) | 298 shutil.copy(args.binary, bundle.binary_path) |
303 | 299 |
304 if not args.sign: | 300 if args.no_signature: |
305 return | 301 return |
306 | 302 |
307 # Embeds entitlements into the code signature (if code signing identify has | |
308 # been provided). | |
309 codesign_extra_args = [] | 303 codesign_extra_args = [] |
| 304 |
| 305 # Find mobile provisioning profile and embeds it into the bundle (if a code |
| 306 # signing identify has been provided, fails if no valid mobile provisioning |
| 307 # is found). |
| 308 provisioning_profile_required = args.identity != '-' |
| 309 provisioning_profile = FindProvisioningProfile( |
| 310 bundle.identifier, provisioning_profile_required) |
310 if provisioning_profile and args.platform != 'iphonesimulator': | 311 if provisioning_profile and args.platform != 'iphonesimulator': |
| 312 provisioning_profile.Install(embedded_provisioning_profile) |
| 313 |
311 temporary_entitlements_file = tempfile.NamedTemporaryFile(suffix='.xcent') | 314 temporary_entitlements_file = tempfile.NamedTemporaryFile(suffix='.xcent') |
312 codesign_extra_args.extend( | 315 codesign_extra_args.extend( |
313 ['--entitlements', temporary_entitlements_file.name]) | 316 ['--entitlements', temporary_entitlements_file.name]) |
314 | 317 |
315 entitlements = GenerateEntitlements( | 318 entitlements = GenerateEntitlements( |
316 args.entitlements_path, provisioning_profile, bundle.identifier) | 319 args.entitlements_path, provisioning_profile, bundle.identifier) |
317 entitlements.WriteTo(temporary_entitlements_file.name) | 320 entitlements.WriteTo(temporary_entitlements_file.name) |
318 | 321 |
319 CodeSignBundle(bundle.path, args.identity, codesign_extra_args) | 322 CodeSignBundle(bundle.path, args.identity, codesign_extra_args) |
320 | 323 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 | 403 |
401 for action in actions: | 404 for action in actions: |
402 action.Register(subparsers) | 405 action.Register(subparsers) |
403 | 406 |
404 args = parser.parse_args() | 407 args = parser.parse_args() |
405 args.func(args) | 408 args.func(args) |
406 | 409 |
407 | 410 |
408 if __name__ == '__main__': | 411 if __name__ == '__main__': |
409 sys.exit(Main()) | 412 sys.exit(Main()) |
OLD | NEW |