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; ...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; 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.externalnav.ExternalNavigationHandler;
import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -48,7 +49,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory { ...@@ -48,7 +49,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
@Override @Override
public ContextMenuPopulator createContextMenuPopulator(Tab tab) { public ContextMenuPopulator createContextMenuPopulator(Tab tab) {
return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab), return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab),
mShareDelegateSupplier, ChromeContextMenuPopulator.ContextMenuMode.NORMAL); mShareDelegateSupplier, ChromeContextMenuPopulator.ContextMenuMode.NORMAL,
ExternalAuthUtils.getInstance());
} }
@Override @Override
......
...@@ -22,6 +22,7 @@ import org.chromium.chrome.R; ...@@ -22,6 +22,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item;
import org.chromium.chrome.browser.contextmenu.ContextMenuParams.PerformanceClass; 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.feature_engagement.TrackerFactory;
import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
...@@ -59,6 +60,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -59,6 +60,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
private final ContextMenuItemDelegate mDelegate; private final ContextMenuItemDelegate mDelegate;
private final @ContextMenuMode int mMode; private final @ContextMenuMode int mMode;
private final Supplier<ShareDelegate> mShareDelegateSupplier; private final Supplier<ShareDelegate> mShareDelegateSupplier;
private final ExternalAuthUtils mExternalAuthUtils;
private boolean mEnableLensWithSearchByImageText; private boolean mEnableLensWithSearchByImageText;
private @Nullable UkmRecorder.Bridge mUkmRecorderBridge; private @Nullable UkmRecorder.Bridge mUkmRecorderBridge;
...@@ -237,7 +239,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -237,7 +239,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
// Only add new values at the end, right before NUM_ENTRIES. // Only add new values at the end, right before NUM_ENTRIES.
@IntDef({LensSupportStatus.LENS_SUPPORTED, LensSupportStatus.NON_GOOGLE_SEARCH_ENGINE, @IntDef({LensSupportStatus.LENS_SUPPORTED, LensSupportStatus.NON_GOOGLE_SEARCH_ENGINE,
LensSupportStatus.ACTIVITY_NOT_ACCESSIBLE, LensSupportStatus.OUT_OF_DATE, 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) @Retention(RetentionPolicy.SOURCE)
public @interface LensSupportStatus { public @interface LensSupportStatus {
int LENS_SUPPORTED = 0; int LENS_SUPPORTED = 0;
...@@ -246,7 +249,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -246,7 +249,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
int OUT_OF_DATE = 3; int OUT_OF_DATE = 3;
int SEARCH_BY_IMAGE_UNAVAILABLE = 4; int SEARCH_BY_IMAGE_UNAVAILABLE = 4;
int LEGACY_OS = 5; 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 { ...@@ -267,10 +271,12 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
* @param mode Defines the context menu mode * @param mode Defines the context menu mode
*/ */
public ChromeContextMenuPopulator(ContextMenuItemDelegate delegate, public ChromeContextMenuPopulator(ContextMenuItemDelegate delegate,
Supplier<ShareDelegate> shareDelegate, @ContextMenuMode int mode) { Supplier<ShareDelegate> shareDelegate, @ContextMenuMode int mode,
ExternalAuthUtils externalAuthUtils) {
mDelegate = delegate; mDelegate = delegate;
mShareDelegateSupplier = shareDelegate; mShareDelegateSupplier = shareDelegate;
mMode = mode; mMode = mode;
mExternalAuthUtils = externalAuthUtils;
} }
@Override @Override
...@@ -718,6 +724,12 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -718,6 +724,12 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
return false; return false;
} }
if (!LensUtils.isValidAgsaPackage(mExternalAuthUtils)) {
ContextMenuUma.recordLensSupportStatus(
ContextMenuUma.LensSupportStatus.INVALID_PACKAGE);
return false;
}
ContextMenuUma.recordLensSupportStatus(ContextMenuUma.LensSupportStatus.LENS_SUPPORTED); ContextMenuUma.recordLensSupportStatus(ContextMenuUma.LensSupportStatus.LENS_SUPPORTED);
return true; return true;
} }
......
...@@ -464,8 +464,8 @@ public class CustomTabDelegateFactory implements TabDelegateFactory { ...@@ -464,8 +464,8 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
int contextMenuMode = getContextMenuMode(mActivityType); int contextMenuMode = getContextMenuMode(mActivityType);
Supplier<ShareDelegate> shareDelegateSupplier = Supplier<ShareDelegate> shareDelegateSupplier =
mActivity == null ? null : mActivity.getShareDelegateSupplier(); mActivity == null ? null : mActivity.getShareDelegateSupplier();
return new ChromeContextMenuPopulator( return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab),
new TabContextMenuItemDelegate(tab), shareDelegateSupplier, contextMenuMode); shareDelegateSupplier, contextMenuMode, ExternalAuthUtils.getInstance());
} }
/** /**
......
...@@ -15,6 +15,7 @@ import android.text.TextUtils; ...@@ -15,6 +15,7 @@ import android.text.TextUtils;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.signin.ChromeSigninController;
...@@ -119,6 +120,18 @@ public class LensUtils { ...@@ -119,6 +120,18 @@ public class LensUtils {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.O; 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. * 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) * @param imageUri The content provider URI generated by chrome (or empty URI)
......
...@@ -20,8 +20,10 @@ import org.chromium.base.annotations.CalledByNative; ...@@ -20,8 +20,10 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.base.annotations.CalledByNativeJavaTest;
import org.chromium.blink_public.common.ContextMenuDataMediaType; import org.chromium.blink_public.common.ContextMenuDataMediaType;
import org.chromium.chrome.R; 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.ChromeContextMenuPopulator.ContextMenuMode;
import org.chromium.chrome.browser.contextmenu.ContextMenuParams.PerformanceClass; 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.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareDelegate;
...@@ -48,6 +50,8 @@ public class ChromeContextMenuPopulatorTest { ...@@ -48,6 +50,8 @@ public class ChromeContextMenuPopulatorTest {
private TemplateUrlService mTemplateUrlService; private TemplateUrlService mTemplateUrlService;
@Mock @Mock
private ShareDelegate mShareDelegate; private ShareDelegate mShareDelegate;
@Mock
private ExternalAuthUtils mExternalAuthUtils;
private ChromeContextMenuPopulator mPopulator; private ChromeContextMenuPopulator mPopulator;
...@@ -77,10 +81,11 @@ public class ChromeContextMenuPopulatorTest { ...@@ -77,10 +81,11 @@ public class ChromeContextMenuPopulatorTest {
} }
private void initializePopulator(@ContextMenuMode int mode) { private void initializePopulator(@ContextMenuMode int mode) {
mPopulator = Mockito.spy( mPopulator = Mockito.spy(new ChromeContextMenuPopulator(
new ChromeContextMenuPopulator(mItemDelegate, () -> mShareDelegate, mode)); mItemDelegate, () -> mShareDelegate, mode, mExternalAuthUtils));
doReturn(mTemplateUrlService).when(mPopulator).getTemplateUrlService(); doReturn(mTemplateUrlService).when(mPopulator).getTemplateUrlService();
doReturn(false).when(mPopulator).shouldTriggerEphemeralTabHelpUi(); doReturn(false).when(mPopulator).shouldTriggerEphemeralTabHelpUi();
doReturn(true).when(mExternalAuthUtils).isGoogleSigned(IntentHandler.PACKAGE_GSA);
} }
private void checkMenuOptions(ContextMenuParams params, int[]... tabs) { 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