| Index: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java
|
| index 0b20667fd2bdc140c1e0aca261263622b773c3f5..73ed77c2d051dd27efb255f4bbc40e61f71284a7 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java
|
| @@ -14,7 +14,7 @@ import org.chromium.components.payments.PaymentManifestDownloader;
|
| import org.chromium.components.payments.PaymentManifestDownloader.ManifestDownloadCallback;
|
| import org.chromium.components.payments.PaymentManifestParser;
|
| import org.chromium.components.payments.PaymentManifestParser.ManifestParseCallback;
|
| -import org.chromium.payments.mojom.PaymentManifestSection;
|
| +import org.chromium.payments.mojom.WebAppManifestSection;
|
|
|
| import java.net.URI;
|
| import java.security.MessageDigest;
|
| @@ -84,11 +84,13 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
|
|
| private final PaymentManifestDownloader mDownloader;
|
| private final URI mMethodName;
|
| - private final List<AppInfo> mMatchingApps;
|
| + private final Set<AppInfo> mMatchingApps;
|
| private final PaymentManifestParser mParser;
|
| private final PackageManagerDelegate mPackageManagerDelegate;
|
| private final ManifestVerifyCallback mCallback;
|
| private final MessageDigest mMessageDigest;
|
| + private int mPendingWebAppManifestsNumber;
|
| + private boolean mAtLeastOneManifestFailedToDownloadOrParse;
|
|
|
| /**
|
| * Builds the manifest verifier.
|
| @@ -110,7 +112,7 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
| assert !matchingApps.isEmpty();
|
|
|
| mMethodName = methodName;
|
| - mMatchingApps = new ArrayList<>();
|
| + mMatchingApps = new HashSet<>();
|
| for (int i = 0; i < matchingApps.size(); i++) {
|
| AppInfo appInfo = new AppInfo();
|
| appInfo.resolveInfo = matchingApps.get(i);
|
| @@ -126,7 +128,9 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
| md = MessageDigest.getInstance("SHA-256");
|
| } catch (NoSuchAlgorithmException e) {
|
| // Intentionally ignore.
|
| - Log.d(TAG, "Unable to generate SHA-256 hashes. Only \"package\": \"*\" supported.");
|
| + Log.d(TAG,
|
| + "Unable to generate SHA-256 hashes. Only \"supported_origins\": [\"*\"] "
|
| + + "is supported.");
|
| }
|
| mMessageDigest = md;
|
| }
|
| @@ -136,43 +140,54 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
| * privileges to handle this payment method.
|
| */
|
| public void verify() {
|
| - mDownloader.download(mMethodName, this);
|
| + mDownloader.downloadPaymentMethodManifest(mMethodName, this);
|
| }
|
|
|
| @Override
|
| - public void onManifestDownloadSuccess(String content) {
|
| - mParser.parse(content, this);
|
| + public void onPaymentMethodManifestDownloadSuccess(String content) {
|
| + mParser.parsePaymentMethodManifest(content, this);
|
| + }
|
| +
|
| + @Override
|
| + public void onWebAppManifestDownloadSuccess(String content) {
|
| + if (mAtLeastOneManifestFailedToDownloadOrParse) return;
|
| + mParser.parseWebAppManifest(content, this);
|
| }
|
|
|
| @Override
|
| public void onManifestDownloadFailure() {
|
| + if (mAtLeastOneManifestFailedToDownloadOrParse) return;
|
| + mAtLeastOneManifestFailedToDownloadOrParse = true;
|
| +
|
| mCallback.onInvalidManifest(mMethodName);
|
| }
|
|
|
| @Override
|
| - public void onManifestParseSuccess(PaymentManifestSection[] manifest) {
|
| + public void onPaymentMethodManifestParseSuccess(URI[] webAppManifestUris) {
|
| + assert webAppManifestUris != null;
|
| + assert webAppManifestUris.length > 0;
|
| +
|
| + if (mAtLeastOneManifestFailedToDownloadOrParse) return;
|
| +
|
| + mPendingWebAppManifestsNumber = webAppManifestUris.length;
|
| + for (int i = 0; i < webAppManifestUris.length; i++) {
|
| + mDownloader.downloadWebAppManifest(webAppManifestUris[i], this);
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public void onWebAppManifestParseSuccess(WebAppManifestSection[] manifest) {
|
| assert manifest != null;
|
| assert manifest.length > 0;
|
|
|
| - for (int i = 0; i < manifest.length; i++) {
|
| - PaymentManifestSection section = manifest[i];
|
| - // "package": "*" in the manifest file indicates an unrestricted payment method. Any app
|
| - // can use this payment method name.
|
| - if ("*".equals(section.packageName)) {
|
| - for (int j = 0; j < mMatchingApps.size(); j++) {
|
| - mCallback.onValidPaymentApp(mMethodName, mMatchingApps.get(j).resolveInfo);
|
| - }
|
| - return;
|
| - }
|
| - }
|
| + if (mAtLeastOneManifestFailedToDownloadOrParse) return;
|
|
|
| if (mMessageDigest == null) {
|
| mCallback.onInvalidManifest(mMethodName);
|
| return;
|
| }
|
|
|
| - for (int i = 0; i < mMatchingApps.size(); i++) {
|
| - AppInfo appInfo = mMatchingApps.get(i);
|
| + for (AppInfo appInfo : mMatchingApps) {
|
| PackageInfo packageInfo = mPackageManagerDelegate.getPackageInfoWithSignatures(
|
| appInfo.resolveInfo.activityInfo.packageName);
|
|
|
| @@ -183,8 +198,8 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
| appInfo.version = packageInfo.versionCode;
|
| appInfo.sha256CertFingerprints = new HashSet<>();
|
| Signature[] signatures = packageInfo.signatures;
|
| - for (int j = 0; j < signatures.length; j++) {
|
| - mMessageDigest.update(signatures[j].toByteArray());
|
| + for (int i = 0; i < signatures.length; i++) {
|
| + mMessageDigest.update(signatures[i].toByteArray());
|
|
|
| // The digest is reset after completing the hash computation.
|
| appInfo.sha256CertFingerprints.add(byteArrayToString(mMessageDigest.digest()));
|
| @@ -193,31 +208,35 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
|
|
| List<Set<String>> sectionsFingerprints = new ArrayList<>();
|
| for (int i = 0; i < manifest.length; i++) {
|
| - PaymentManifestSection section = manifest[i];
|
| + WebAppManifestSection section = manifest[i];
|
| Set<String> fingerprints = new HashSet<>();
|
| - if (section.sha256CertFingerprints != null) {
|
| - for (int j = 0; j < section.sha256CertFingerprints.length; j++) {
|
| - fingerprints.add(byteArrayToString(section.sha256CertFingerprints[j]));
|
| - }
|
| + for (int j = 0; j < section.fingerprints.length; j++) {
|
| + fingerprints.add(byteArrayToString(section.fingerprints[j]));
|
| }
|
| sectionsFingerprints.add(fingerprints);
|
| }
|
|
|
| - for (int i = 0; i < mMatchingApps.size(); i++) {
|
| - AppInfo appInfo = mMatchingApps.get(i);
|
| - boolean isAllowed = false;
|
| - for (int j = 0; j < manifest.length; j++) {
|
| - PaymentManifestSection section = manifest[j];
|
| - if (appInfo.resolveInfo.activityInfo.packageName.equals(section.packageName)
|
| - && appInfo.version >= section.version
|
| + Set<AppInfo> matchingAppsToRemove = new HashSet<>();
|
| + for (AppInfo appInfo : mMatchingApps) {
|
| + for (int i = 0; i < manifest.length; i++) {
|
| + WebAppManifestSection section = manifest[i];
|
| + if (appInfo.resolveInfo.activityInfo.packageName.equals(section.id)
|
| + && appInfo.version >= section.minVersion
|
| && appInfo.sha256CertFingerprints != null
|
| - && appInfo.sha256CertFingerprints.equals(sectionsFingerprints.get(j))) {
|
| + && appInfo.sha256CertFingerprints.equals(sectionsFingerprints.get(i))) {
|
| + matchingAppsToRemove.add(appInfo);
|
| mCallback.onValidPaymentApp(mMethodName, appInfo.resolveInfo);
|
| - isAllowed = true;
|
| break;
|
| }
|
| }
|
| - if (!isAllowed) mCallback.onInvalidPaymentApp(mMethodName, appInfo.resolveInfo);
|
| + }
|
| + mMatchingApps.removeAll(matchingAppsToRemove);
|
| +
|
| + mPendingWebAppManifestsNumber--;
|
| + if (mPendingWebAppManifestsNumber == 0) {
|
| + for (AppInfo appInfo : mMatchingApps) {
|
| + mCallback.onInvalidPaymentApp(mMethodName, appInfo.resolveInfo);
|
| + }
|
| }
|
| }
|
|
|
| @@ -241,6 +260,9 @@ public class PaymentManifestVerifier implements ManifestDownloadCallback, Manife
|
|
|
| @Override
|
| public void onManifestParseFailure() {
|
| + if (mAtLeastOneManifestFailedToDownloadOrParse) return;
|
| + mAtLeastOneManifestFailedToDownloadOrParse = true;
|
| +
|
| mCallback.onInvalidManifest(mMethodName);
|
| }
|
| }
|
|
|