Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Unified Diff: build/config/ios/codesign.py

Issue 2446283002: Ignore expired mobile provisioning profiles. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/config/ios/codesign.py
diff --git a/build/config/ios/codesign.py b/build/config/ios/codesign.py
index eed914fe0b4bb1567c13ff3ba96178bfdcc4d581..9c0575a9bb10d91b88be0e3e5d9fe7023c1d884b 100644
--- a/build/config/ios/codesign.py
+++ b/build/config/ios/codesign.py
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import argparse
+import datetime
import fnmatch
import glob
import os
@@ -65,7 +66,8 @@ class ProvisioningProfile(object):
"""Initializes the ProvisioningProfile with data from profile file."""
self._path = provisioning_profile_path
self._data = plistlib.readPlistFromString(subprocess.check_output([
- 'xcrun', 'security', 'cms', '-D', '-i', provisioning_profile_path]))
+ 'xcrun', 'security', 'cms', '-D', '-u', 'certUsageAnyCA',
+ '-i', provisioning_profile_path]))
@property
def path(self):
@@ -83,6 +85,10 @@ class ProvisioningProfile(object):
def entitlements(self):
return self._data.get('Entitlements', {})
+ @property
+ def expiration_date(self):
+ return self._data.get('ExpirationDate', datetime.datetime.now())
+
def ValidToSignBundle(self, bundle_identifier):
"""Checks whether the provisioning profile can sign bundle_identifier.
@@ -157,26 +163,41 @@ def FindProvisioningProfile(bundle_identifier, required):
os.path.join(GetProvisioningProfilesDir(), '*.mobileprovision'))
# Iterate over all installed mobile provisioning profiles and filter those
- # that can be used to sign the bundle.
+ # that can be used to sign the bundle, ignoring expired ones.
+ now = datetime.datetime.now()
valid_provisioning_profiles = []
+ one_hour = datetime.timedelta(0, 3600)
for provisioning_profile_path in provisioning_profile_paths:
provisioning_profile = ProvisioningProfile(provisioning_profile_path)
+ if provisioning_profile.expiration_date - now < one_hour:
+ sys.stderr.write(
+ 'Warning: ignoring expired provisioning profile: %s.\n' %
+ provisioning_profile_path)
+ continue
if provisioning_profile.ValidToSignBundle(bundle_identifier):
valid_provisioning_profiles.append(provisioning_profile)
if not valid_provisioning_profiles:
if required:
sys.stderr.write(
- 'No mobile provisioning profile found for "%s".\n' %
+ 'Error: no mobile provisioning profile found for "%s".\n' %
bundle_identifier)
sys.exit(1)
return None
# Select the most specific mobile provisioning profile, i.e. the one with
- # the longest application identifier pattern.
- return max(
+ # the longest application identifier pattern (prefer the one with the latest
+ # expiration date as a secondary criteria).
+ selected_provisioning_profile = max(
valid_provisioning_profiles,
- key=lambda p: len(p.application_identifier_pattern))
+ key=lambda p: (len(p.application_identifier_pattern), p.expiration_date))
+
+ one_week = datetime.timedelta(7)
+ if selected_provisioning_profile.expiration_date - now < 2 * one_week:
+ sys.stderr.write(
+ 'Warning: selected provisioning profile will expire soon: %s' %
justincohen 2016/10/25 17:41:51 awesome!
sdefresne 2016/10/25 17:54:57 Acknowledged.
+ selected_provisioning_profile.path)
+ return selected_provisioning_profile
def CodeSignBundle(bundle_path, identity, extra_args):
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698