[Merge to M87] Disable lacros for non-google managed users.

(cherry picked from commit dc55cea9edc00e9acf3001d69ca1d61cf24f3f22)

Bug: 1135494
Change-Id: Ife13223dea213e57427803bc6cae97e492608a25
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2458848
Commit-Queue: Erik Chen <[email protected]>
Auto-Submit: Erik Chen <[email protected]>
Reviewed-by: James Cook <[email protected]>
Cr-Original-Commit-Position: refs/heads/master@{#814955}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2461223
Cr-Commit-Position: refs/branch-heads/4280@{#172}
Cr-Branched-From: ea420fb963f9658c9969b6513c56b8f47efa1a2a-refs/heads/master@{#812852}
diff --git a/chrome/browser/chromeos/crosapi/browser_util.cc b/chrome/browser/chromeos/crosapi/browser_util.cc
index f930270..ae4daeb2 100644
--- a/chrome/browser/chromeos/crosapi/browser_util.cc
+++ b/chrome/browser/chromeos/crosapi/browser_util.cc
@@ -13,6 +13,9 @@
 #include "base/strings/string_util.h"
 #include "base/system/sys_info.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_paths.h"
 #include "chromeos/crosapi/cpp/crosapi_constants.h"
@@ -101,6 +104,20 @@
   if (!IsUserTypeAllowed(user))
     return false;
 
+  const Profile* const profile =
+      chromeos::ProfileHelper::Get()->GetProfileByUser(user);
+  DCHECK(profile);
+
+  // TODO(https://crbug.com/1135494): Disable Lacros for managed users that
+  // aren't @google using more robust mechanism.
+  if (profile->GetProfilePolicyConnector()->IsManaged()) {
+    const std::string canonical_email = user->GetAccountId().GetUserEmail();
+    if (!base::EndsWith(canonical_email, "@google.com",
+                        base::CompareCase::INSENSITIVE_ASCII)) {
+      return false;
+    }
+  }
+
   switch (channel) {
     case Channel::UNKNOWN:
     case Channel::CANARY:
diff --git a/chrome/browser/chromeos/crosapi/browser_util_unittest.cc b/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
index 9474a661..db900a4c 100644
--- a/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
+++ b/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
@@ -4,10 +4,15 @@
 
 #include "chrome/browser/chromeos/crosapi/browser_util.h"
 
+#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/test/base/testing_profile.h"
 #include "components/account_id/account_id.h"
-#include "components/user_manager/fake_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/version_info/channel.h"
+#include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using user_manager::User;
@@ -21,10 +26,9 @@
   ~LacrosUtilTest() override = default;
 
   void SetUp() override {
-    auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>();
-    fake_user_manager_ = fake_user_manager.get();
+    fake_user_manager_ = new chromeos::FakeChromeUserManager;
     scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
-        std::move(fake_user_manager));
+        base::WrapUnique(fake_user_manager_));
   }
 
   void AddRegularUser(const std::string& email) {
@@ -33,14 +37,21 @@
     fake_user_manager_->UserLoggedIn(account_id, user->username_hash(),
                                      /*browser_restart=*/false,
                                      /*is_child=*/false);
+    chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
+        user, &testing_profile_);
   }
 
-  user_manager::FakeUserManager* fake_user_manager_ = nullptr;
+  // The order of these members is relevant for both construction and
+  // destruction timing.
+  content::BrowserTaskEnvironment task_environment_;
+  TestingProfile testing_profile_;
+  chromeos::FakeChromeUserManager* fake_user_manager_ = nullptr;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
 };
 
 TEST_F(LacrosUtilTest, ChannelTest) {
   AddRegularUser("[email protected]");
+
   EXPECT_TRUE(browser_util::IsLacrosAllowed(Channel::UNKNOWN));
   EXPECT_TRUE(browser_util::IsLacrosAllowed(Channel::CANARY));
   EXPECT_TRUE(browser_util::IsLacrosAllowed(Channel::DEV));
@@ -48,6 +59,30 @@
   EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::STABLE));
 }
 
+TEST_F(LacrosUtilTest, ManagedAccountGoogle) {
+  AddRegularUser("[email protected]");
+  testing_profile_.GetProfilePolicyConnector()->OverrideIsManagedForTesting(
+      true);
+
+  EXPECT_TRUE(browser_util::IsLacrosAllowed(Channel::CANARY));
+}
+
+TEST_F(LacrosUtilTest, ManagedAccountFakeGoogle) {
+  AddRegularUser("[email protected]");
+  testing_profile_.GetProfilePolicyConnector()->OverrideIsManagedForTesting(
+      true);
+
+  EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::CANARY));
+}
+
+TEST_F(LacrosUtilTest, ManagedAccountNonGoogle) {
+  AddRegularUser("[email protected]");
+  testing_profile_.GetProfilePolicyConnector()->OverrideIsManagedForTesting(
+      true);
+
+  EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::CANARY));
+}
+
 TEST_F(LacrosUtilTest, BlockedForChildUser) {
   AccountId account_id = AccountId::FromUserEmail("[email protected]");
   const User* user = fake_user_manager_->AddChildUser(account_id);
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index 3ad24f4..f74be7c 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -50,6 +50,7 @@
 #include "chrome/browser/chromeos/file_manager/app_id.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_mode_test_helper.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/test_extension_system.h"
 #include "chrome/browser/prefs/browser_prefs.h"
@@ -1387,9 +1388,15 @@
   auto* fake_user_manager = user_manager.get();
   user_manager::ScopedUserManager scoped_user_manager(std::move(user_manager));
   AccountId account_id = AccountId::FromUserEmail("[email protected]");
-  fake_user_manager->AddUser(account_id);
+  user_manager::User* user = fake_user_manager->AddUser(account_id);
   fake_user_manager->LoginUser(account_id);
 
+  TestingProfile::Builder profile_builder;
+  profile_builder.SetProfileName(account_id.GetUserEmail());
+  std::unique_ptr<TestingProfile> testing_profile = profile_builder.Build();
+  chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
+      user, testing_profile.get());
+
   InitLauncherController();
   EXPECT_EQ("Chrome, Lacros", GetPinnedAppStatus());
 }