Commit c8ecb2ae authored by Ben Goldberger's avatar Ben Goldberger Committed by Commit Bot

Add AGSA signature check as a prerequisite for the Google Lens menu item showing up.

Bug: 1049291
Change-Id: If7c6b04a2a3ac4db08db7b20558225daf77c55dc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2055803Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarBrandon Wylie <wylieb@chromium.org>
Commit-Queue: Ben Goldberger <benwgold@google.com>
Cr-Commit-Position: refs/heads/master@{#741524}
parent 947d3184
......@@ -7,6 +7,7 @@ package org.chromium.chrome.browser;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab;
......@@ -48,7 +49,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
@Override
public ContextMenuPopulator createContextMenuPopulator(Tab tab) {
return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab),
mShareDelegateSupplier, ChromeContextMenuPopulator.ContextMenuMode.NORMAL);
mShareDelegateSupplier, ChromeContextMenuPopulator.ContextMenuMode.NORMAL,
ExternalAuthUtils.getInstance());
}
@Override
......
......@@ -22,6 +22,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item;
import org.chromium.chrome.browser.contextmenu.ContextMenuParams.PerformanceClass;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
......@@ -59,6 +60,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
private final ContextMenuItemDelegate mDelegate;
private final @ContextMenuMode int mMode;
private final Supplier<ShareDelegate> mShareDelegateSupplier;
private final ExternalAuthUtils mExternalAuthUtils;
private boolean mEnableLensWithSearchByImageText;
private @Nullable UkmRecorder.Bridge mUkmRecorderBridge;
......@@ -237,7 +239,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
// Only add new values at the end, right before NUM_ENTRIES.
@IntDef({LensSupportStatus.LENS_SUPPORTED, LensSupportStatus.NON_GOOGLE_SEARCH_ENGINE,
LensSupportStatus.ACTIVITY_NOT_ACCESSIBLE, LensSupportStatus.OUT_OF_DATE,
LensSupportStatus.SEARCH_BY_IMAGE_UNAVAILABLE, LensSupportStatus.LEGACY_OS})
LensSupportStatus.SEARCH_BY_IMAGE_UNAVAILABLE, LensSupportStatus.LEGACY_OS,
LensSupportStatus.INVALID_PACKAGE})
@Retention(RetentionPolicy.SOURCE)
public @interface LensSupportStatus {
int LENS_SUPPORTED = 0;
......@@ -246,7 +249,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
int OUT_OF_DATE = 3;
int SEARCH_BY_IMAGE_UNAVAILABLE = 4;
int LEGACY_OS = 5;
int NUM_ENTRIES = 6;
int INVALID_PACKAGE = 6;
int NUM_ENTRIES = 7;
}
/**
......@@ -267,10 +271,12 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
* @param mode Defines the context menu mode
*/
public ChromeContextMenuPopulator(ContextMenuItemDelegate delegate,
Supplier<ShareDelegate> shareDelegate, @ContextMenuMode int mode) {
Supplier<ShareDelegate> shareDelegate, @ContextMenuMode int mode,
ExternalAuthUtils externalAuthUtils) {
mDelegate = delegate;
mShareDelegateSupplier = shareDelegate;
mMode = mode;
mExternalAuthUtils = externalAuthUtils;
}
@Override
......@@ -718,6 +724,12 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
return false;
}
if (!LensUtils.isValidAgsaPackage(mExternalAuthUtils)) {
ContextMenuUma.recordLensSupportStatus(
ContextMenuUma.LensSupportStatus.INVALID_PACKAGE);
return false;
}
ContextMenuUma.recordLensSupportStatus(ContextMenuUma.LensSupportStatus.LENS_SUPPORTED);
return true;
}
......
......@@ -464,8 +464,8 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
int contextMenuMode = getContextMenuMode(mActivityType);
Supplier<ShareDelegate> shareDelegateSupplier =
mActivity == null ? null : mActivity.getShareDelegateSupplier();
return new ChromeContextMenuPopulator(
new TabContextMenuItemDelegate(tab), shareDelegateSupplier, contextMenuMode);
return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab),
shareDelegateSupplier, contextMenuMode, ExternalAuthUtils.getInstance());
}
/**
......
......@@ -15,6 +15,7 @@ import android.text.TextUtils;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.components.signin.ChromeSigninController;
......@@ -119,6 +120,18 @@ public class LensUtils {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.O;
}
/**
* Checks whether the GSA package on the device is guaranteed to be an official GSA build.
* @return Whether the package is valid.
*/
public static boolean isValidAgsaPackage(ExternalAuthUtils externalAuthUtils) {
if (sFakePassableLensEnvironmentForTesting) {
return true;
}
return externalAuthUtils.isGoogleSigned(IntentHandler.PACKAGE_GSA);
}
/**
* Get a deeplink intent to Google Lens with an optional content provider image URI.
* @param imageUri The content provider URI generated by chrome (or empty URI)
......
......@@ -20,8 +20,10 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.CalledByNativeJavaTest;
import org.chromium.blink_public.common.ContextMenuDataMediaType;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator.ContextMenuMode;
import org.chromium.chrome.browser.contextmenu.ContextMenuParams.PerformanceClass;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.share.ShareDelegate;
......@@ -48,6 +50,8 @@ public class ChromeContextMenuPopulatorTest {
private TemplateUrlService mTemplateUrlService;
@Mock
private ShareDelegate mShareDelegate;
@Mock
private ExternalAuthUtils mExternalAuthUtils;
private ChromeContextMenuPopulator mPopulator;
......@@ -77,10 +81,11 @@ public class ChromeContextMenuPopulatorTest {
}
private void initializePopulator(@ContextMenuMode int mode) {
mPopulator = Mockito.spy(
new ChromeContextMenuPopulator(mItemDelegate, () -> mShareDelegate, mode));
mPopulator = Mockito.spy(new ChromeContextMenuPopulator(
mItemDelegate, () -> mShareDelegate, mode, mExternalAuthUtils));
doReturn(mTemplateUrlService).when(mPopulator).getTemplateUrlService();
doReturn(false).when(mPopulator).shouldTriggerEphemeralTabHelpUi();
doReturn(true).when(mExternalAuthUtils).isGoogleSigned(IntentHandler.PACKAGE_GSA);
}
private void checkMenuOptions(ContextMenuParams params, int[]... tabs) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment