// If multiple valid ones, find the one which matches the most specifically. I.e., // XXXXXXXXXX.com.example.* will match over XXXXXXXXXX.* for com.example.TestApp // TODO(user): Account for differences between development and distribution certificates. @VisibleForTesting static Optional<ProvisioningProfileMetadata> getBestProvisioningProfile( ImmutableSet<ProvisioningProfileMetadata> profiles, String bundleID, Optional<String> provisioningProfileUUID, Optional<String> prefix) { int bestMatchLength = -1; Optional<ProvisioningProfileMetadata> bestMatch = Optional.<ProvisioningProfileMetadata>absent(); for (ProvisioningProfileMetadata profile : profiles) { if (provisioningProfileUUID.isPresent() && profile.getUUID().equals(provisioningProfileUUID.get())) { return Optional.<ProvisioningProfileMetadata>of(profile); } if (profile.getExpirationDate().after(new Date())) { Pair<String, String> appID = profile.getAppID(); LOG.debug("Looking at provisioning profile " + profile.getUUID() + "," + appID.toString()); if (!prefix.isPresent() || prefix.get().equals(appID.getFirst())) { String profileBundleID = appID.getSecond(); boolean match; if (profileBundleID.endsWith("*")) { // Chop the ending * if wildcard. profileBundleID = profileBundleID.substring(0, profileBundleID.length() - 1); match = bundleID.startsWith(profileBundleID); } else { match = (bundleID.equals(profileBundleID)); } if (match && profileBundleID.length() > bestMatchLength) { bestMatchLength = profileBundleID.length(); bestMatch = Optional.<ProvisioningProfileMetadata>of(profile); } } } } LOG.debug("Found provisioning profile " + bestMatch.toString()); return bestMatch; }
private void testParse( String url, NetworkParameters np, Optional<? extends BitcoinUri> expected) { Log.d(BitcoinUriTest.class.getName(), "testParse: " + expected.toString()); Optional<? extends BitcoinUri> actual = BitcoinUri.parse(url, np); assertEquals(expected.toString(), actual.toString()); }
AppleBundle( BuildRuleParams params, SourcePathResolver resolver, Either<AppleBundleExtension, String> extension, SourcePath infoPlist, Map<String, String> infoPlistSubstitutions, Optional<BuildRule> binary, AppleBundleDestinations destinations, Set<SourcePath> resourceDirs, Set<SourcePath> resourceFiles, Set<SourcePath> dirsContainingResourceDirs, ImmutableSet<SourcePath> extensionBundlePaths, Optional<ImmutableSet<SourcePath>> resourceVariantFiles, Tool ibtool, Tool dsymutil, Tool strip, Optional<AppleAssetCatalog> assetCatalog, Set<BuildTarget> tests, AppleSdk sdk, ImmutableSet<CodeSignIdentity> allValidCodeSignIdentities, Optional<SourcePath> provisioningProfileSearchPath) { super(params, resolver); this.extension = extension.isLeft() ? extension.getLeft().toFileExtension() : extension.getRight(); this.infoPlist = infoPlist; this.infoPlistSubstitutions = ImmutableMap.copyOf(infoPlistSubstitutions); this.binary = binary; this.destinations = destinations; this.resourceDirs = resourceDirs; this.resourceFiles = resourceFiles; this.dirsContainingResourceDirs = dirsContainingResourceDirs; this.extensionBundlePaths = extensionBundlePaths; this.resourceVariantFiles = resourceVariantFiles; this.ibtool = ibtool; this.dsymutil = dsymutil; this.strip = strip; this.assetCatalog = assetCatalog; this.binaryName = getBinaryName(getBuildTarget()); this.bundleRoot = getBundleRoot(getBuildTarget(), this.extension); this.binaryPath = this.destinations.getExecutablesPath().resolve(this.binaryName); this.tests = ImmutableSortedSet.copyOf(tests); this.platformName = sdk.getApplePlatform().getName(); this.sdkName = sdk.getName(); // We need to resolve the possible set of profiles and code sign identity at construction time // because they form part of the rule key. if (binary.isPresent() && ApplePlatform.needsCodeSign(this.platformName)) { final Path searchPath; if (provisioningProfileSearchPath.isPresent()) { searchPath = resolver.getResolvedPath(provisioningProfileSearchPath.get()); } else { searchPath = Paths.get( System.getProperty("user.home") + "/Library/MobileDevice/Provisioning Profiles"); } Optional<ImmutableSet<ProvisioningProfileMetadata>> provisioningProfiles; try { provisioningProfiles = Optional.of(ProvisioningProfileCopyStep.findProfilesInPath(searchPath)); } catch (InterruptedException e) { // We get here if the user pressed Ctrl-C during the profile discovery step. // In this case, we'll fail anyway since the set of profiles will be empty. provisioningProfiles = Optional.of(ImmutableSet.<ProvisioningProfileMetadata>of()); } this.provisioningProfiles = provisioningProfiles; Optional<CodeSignIdentity> foundIdentity = Optional.absent(); Optional<String> customIdentity = InfoPlistSubstitution.getVariableExpansionForPlatform( CODE_SIGN_IDENTITY, this.platformName, this.infoPlistSubstitutions); if (customIdentity.isPresent()) { LOG.debug("Bundle specifies custom code signing identity: " + customIdentity.get()); if (CodeSignIdentity.isHash(customIdentity.get())) { for (CodeSignIdentity identity : allValidCodeSignIdentities) { if (identity.getHash().equals(customIdentity.get())) { foundIdentity = Optional.of(identity); break; } } } else { for (CodeSignIdentity identity : allValidCodeSignIdentities) { if (identity.getFullName().startsWith(customIdentity.get())) { foundIdentity = Optional.of(identity); break; } } } } else if (!allValidCodeSignIdentities.isEmpty()) { LOG.debug("Using default code signing identity"); Iterator<CodeSignIdentity> it = allValidCodeSignIdentities.iterator(); foundIdentity = Optional.of(it.next()); } if (!foundIdentity.isPresent()) { throw new HumanReadableException( "The platform " + platformName + " for this target " + "requires code signing but couldn't find a compatible code signing identity to use."); } LOG.debug("Code signing identity is " + foundIdentity.toString()); this.codeSignIdentity = foundIdentity; } else { this.provisioningProfiles = Optional.absent(); this.codeSignIdentity = Optional.absent(); } }