Commit efc3516a authored by Bruno Santos's avatar Bruno Santos Committed by Commit Bot

Add IdentityController to provide user's given/display name.

This interface will be expanded to proxy calls to IdentityAcessor so
that we have more control over what is called and be able to record
metrics.

Bug: 927809
Change-Id: Ifb33c170b17b8ab7e3dbcb89a5fc47288f73814a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1615441Reviewed-by: default avatarMichael Giuffrida <michaelpg@chromium.org>
Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Reviewed-by: default avatarMustafa Emre Acer <meacer@chromium.org>
Commit-Queue: Bruno Santos <brunoad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#661335}
parent ab2559a7
...@@ -1080,6 +1080,8 @@ source_set("chromeos") { ...@@ -1080,6 +1080,8 @@ source_set("chromeos") {
"kiosk_next_home/app_controller_service.h", "kiosk_next_home/app_controller_service.h",
"kiosk_next_home/app_controller_service_factory.cc", "kiosk_next_home/app_controller_service_factory.cc",
"kiosk_next_home/app_controller_service_factory.h", "kiosk_next_home/app_controller_service_factory.h",
"kiosk_next_home/identity_controller_impl.cc",
"kiosk_next_home/identity_controller_impl.h",
"kiosk_next_home/intent_config_helper.cc", "kiosk_next_home/intent_config_helper.cc",
"kiosk_next_home/intent_config_helper.h", "kiosk_next_home/intent_config_helper.h",
"kiosk_next_home/kiosk_next_home_interface_broker_impl.cc", "kiosk_next_home/kiosk_next_home_interface_broker_impl.cc",
...@@ -2432,6 +2434,7 @@ source_set("unit_tests") { ...@@ -2432,6 +2434,7 @@ source_set("unit_tests") {
"input_method/input_method_manager_impl_unittest.cc", "input_method/input_method_manager_impl_unittest.cc",
"input_method/input_method_persistence_unittest.cc", "input_method/input_method_persistence_unittest.cc",
"kiosk_next_home/app_controller_service_unittest.cc", "kiosk_next_home/app_controller_service_unittest.cc",
"kiosk_next_home/identity_controller_impl_unittest.cc",
"kiosk_next_home/intent_config_helper_unittest.cc", "kiosk_next_home/intent_config_helper_unittest.cc",
"locale_change_guard_unittest.cc", "locale_change_guard_unittest.cc",
"lock_screen_apps/app_manager_impl_unittest.cc", "lock_screen_apps/app_manager_impl_unittest.cc",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h"
#include <string>
#include <utility>
#include "base/strings/utf_string_conversions.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
namespace chromeos {
namespace kiosk_next_home {
IdentityControllerImpl::IdentityControllerImpl(
mojom::IdentityControllerRequest request)
: binding_(this, std::move(request)) {}
IdentityControllerImpl::~IdentityControllerImpl() = default;
void IdentityControllerImpl::GetUserInfo(
mojom::IdentityController::GetUserInfoCallback callback) {
auto user_info = mojom::UserInfo::New();
user_manager::User* user = user_manager::UserManager::Get()->GetActiveUser();
user_info->given_name = base::UTF16ToUTF8(user->GetGivenName());
user_info->display_name = base::UTF16ToUTF8(user->GetDisplayName());
std::move(callback).Run(std::move(user_info));
}
} // namespace kiosk_next_home
} // namespace chromeos
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_IDENTITY_CONTROLLER_IMPL_H_
#define CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_IDENTITY_CONTROLLER_IMPL_H_
#include "base/macros.h"
#include "chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
namespace chromeos {
namespace kiosk_next_home {
// IdentityController implementation to expose identity-related capabilities to
// Kiosk Next Home.
class IdentityControllerImpl : public mojom::IdentityController {
public:
explicit IdentityControllerImpl(mojom::IdentityControllerRequest request);
~IdentityControllerImpl() override;
// mojom::IdentityController:
void GetUserInfo(
mojom::IdentityController::GetUserInfoCallback callback) override;
private:
mojo::Binding<mojom::IdentityController> binding_;
DISALLOW_COPY_AND_ASSIGN(IdentityControllerImpl);
};
} // namespace kiosk_next_home
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_IDENTITY_CONTROLLER_IMPL_H_
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h"
#include <memory>
#include <string>
#include <utility>
#include "base/strings/utf_string_conversions.h"
#include "base/test/bind_test_util.h"
#include "base/test/scoped_task_environment.h"
#include "components/user_manager/fake_user_manager.h"
#include "components/user_manager/scoped_user_manager.h"
#include "components/user_manager/user_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace kiosk_next_home {
namespace {
const char* kUserDisplayName = "User Display Name";
const char* kUserGivenName = "User Given Name";
} // namespace
class IdentityControllerImplTest : public testing::Test {
protected:
void SetUp() override {
auto* fake_user_manager = new user_manager::FakeUserManager();
user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
base::WrapUnique(fake_user_manager));
AccountId account_id =
AccountId::FromUserEmailGaiaId("test@test.com", "123456");
// Create new fake user and set its account data.
fake_user_manager->AddUser(account_id);
user_manager::UserManager::UserAccountData account_data(
base::ASCIIToUTF16(kUserDisplayName),
base::ASCIIToUTF16(kUserGivenName), std::string() /* locale */);
fake_user_manager->UpdateUserAccountData(account_id, account_data);
identity_controller_impl_ = std::make_unique<IdentityControllerImpl>(
mojo::MakeRequest(&identity_controller_));
}
mojom::IdentityController* identity_controller() {
return identity_controller_.get();
}
private:
base::test::ScopedTaskEnvironment task_environemnt_;
std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
std::unique_ptr<IdentityControllerImpl> identity_controller_impl_;
mojom::IdentityControllerPtr identity_controller_;
};
TEST_F(IdentityControllerImplTest, GetUserInfo) {
base::RunLoop run_loop;
mojom::UserInfoPtr returned_user_info;
identity_controller()->GetUserInfo(base::BindLambdaForTesting(
[&run_loop, &returned_user_info](mojom::UserInfoPtr user_info) {
returned_user_info = std::move(user_info);
run_loop.QuitClosure().Run();
}));
run_loop.Run();
EXPECT_EQ(returned_user_info->display_name, kUserDisplayName);
EXPECT_EQ(returned_user_info->given_name, kUserGivenName);
}
} // namespace kiosk_next_home
} // namespace chromeos
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <utility> #include <utility>
#include "chrome/browser/chromeos/kiosk_next_home/app_controller_service.h" #include "chrome/browser/chromeos/kiosk_next_home/app_controller_service.h"
#include "chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "services/identity/public/mojom/constants.mojom.h" #include "services/identity/public/mojom/constants.mojom.h"
...@@ -29,6 +30,12 @@ void KioskNextHomeInterfaceBrokerImpl::GetIdentityAccessor( ...@@ -29,6 +30,12 @@ void KioskNextHomeInterfaceBrokerImpl::GetIdentityAccessor(
std::move(request)); std::move(request));
} }
void KioskNextHomeInterfaceBrokerImpl::GetIdentityController(
mojom::IdentityControllerRequest request) {
identity_controller_ =
std::make_unique<IdentityControllerImpl>(std::move(request));
}
void KioskNextHomeInterfaceBrokerImpl::GetAppController( void KioskNextHomeInterfaceBrokerImpl::GetAppController(
mojom::AppControllerRequest request) { mojom::AppControllerRequest request) {
AppControllerService::Get(context_)->BindRequest(std::move(request)); AppControllerService::Get(context_)->BindRequest(std::move(request));
......
...@@ -24,6 +24,8 @@ class Connector; ...@@ -24,6 +24,8 @@ class Connector;
namespace chromeos { namespace chromeos {
namespace kiosk_next_home { namespace kiosk_next_home {
class IdentityControllerImpl;
// Implementation of interface responsible for brokering other interfaces needed // Implementation of interface responsible for brokering other interfaces needed
// to support Kiosk Next Home functionality. // to support Kiosk Next Home functionality.
class KioskNextHomeInterfaceBrokerImpl class KioskNextHomeInterfaceBrokerImpl
...@@ -39,11 +41,13 @@ class KioskNextHomeInterfaceBrokerImpl ...@@ -39,11 +41,13 @@ class KioskNextHomeInterfaceBrokerImpl
// mojom::KioskNextHomeInterfaceBroker: // mojom::KioskNextHomeInterfaceBroker:
void GetIdentityAccessor( void GetIdentityAccessor(
::identity::mojom::IdentityAccessorRequest request) override; ::identity::mojom::IdentityAccessorRequest request) override;
void GetIdentityController(mojom::IdentityControllerRequest request) override;
void GetAppController(mojom::AppControllerRequest request) override; void GetAppController(mojom::AppControllerRequest request) override;
private: private:
content::BrowserContext* context_; content::BrowserContext* context_;
mojo::BindingSet<mojom::KioskNextHomeInterfaceBroker> bindings_; mojo::BindingSet<mojom::KioskNextHomeInterfaceBroker> bindings_;
std::unique_ptr<IdentityControllerImpl> identity_controller_;
// Clone of BrowserContext's Connector, which allows binding to other // Clone of BrowserContext's Connector, which allows binding to other
// services. // services.
std::unique_ptr<service_manager::Connector> connector_; std::unique_ptr<service_manager::Connector> connector_;
......
...@@ -7,6 +7,7 @@ import("//mojo/public/tools/bindings/mojom.gni") ...@@ -7,6 +7,7 @@ import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") { mojom("mojom") {
sources = [ sources = [
"app_controller.mojom", "app_controller.mojom",
"identity_controller.mojom",
"kiosk_next_home_interface_broker.mojom", "kiosk_next_home_interface_broker.mojom",
] ]
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module chromeos.kiosk_next_home.mojom;
struct UserInfo {
string given_name;
string display_name;
};
// Exposes identity-related capabilities to Kiosk Next Home.
interface IdentityController {
GetUserInfo() => (UserInfo user_info);
};
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
module chromeos.kiosk_next_home.mojom; module chromeos.kiosk_next_home.mojom;
import "chrome/browser/chromeos/kiosk_next_home/mojom/app_controller.mojom"; import "chrome/browser/chromeos/kiosk_next_home/mojom/app_controller.mojom";
import "chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom";
import "services/identity/public/mojom/identity_accessor.mojom"; import "services/identity/public/mojom/identity_accessor.mojom";
// Single entry point for any interface requests issued by the Kiosk Next // Single entry point for any interface requests issued by the Kiosk Next
...@@ -12,8 +13,12 @@ import "services/identity/public/mojom/identity_accessor.mojom"; ...@@ -12,8 +13,12 @@ import "services/identity/public/mojom/identity_accessor.mojom";
// its functionality. // its functionality.
interface KioskNextHomeInterfaceBroker { interface KioskNextHomeInterfaceBroker {
// Binds IdentityAccessor service request. // Binds IdentityAccessor service request.
// TODO(brunoad): migrate needed methods to IdentityController and remove.
GetIdentityAccessor(identity.mojom.IdentityAccessor& request); GetIdentityAccessor(identity.mojom.IdentityAccessor& request);
// Binds the IdentityController service request.
GetIdentityController(IdentityController& request);
// Binds the AppController service request. // Binds the AppController service request.
GetAppController(AppController& request); GetAppController(AppController& request);
}; };
...@@ -24,6 +24,16 @@ kioskNextHome.Bridge = class { ...@@ -24,6 +24,16 @@ kioskNextHome.Bridge = class {
*/ */
addListener(listener) {} addListener(listener) {}
/**
* @return {!Promise<string>} Promise for the user's given name.
*/
getUserGivenName() {}
/**
* @return {!Promise<string>} Promise for the user's display name.
*/
getUserDisplayName() {}
/** /**
* Gets the obfuscated account Gaia ID associated with the current user * Gets the obfuscated account Gaia ID associated with the current user
* session. * session.
......
...@@ -68,6 +68,9 @@ class KioskNextHomeBridge { ...@@ -68,6 +68,9 @@ class KioskNextHomeBridge {
/** @private @const */ /** @private @const */
this.identityAccessorProxy_ = new identity.mojom.IdentityAccessorProxy(); this.identityAccessorProxy_ = new identity.mojom.IdentityAccessorProxy();
/** @private @const */ /** @private @const */
this.identityControllerProxy_ =
new chromeos.kioskNextHome.mojom.IdentityControllerProxy();
/** @private @const */
this.appControllerProxy_ = this.appControllerProxy_ =
new chromeos.kioskNextHome.mojom.AppControllerProxy(); new chromeos.kioskNextHome.mojom.AppControllerProxy();
/** @private @const */ /** @private @const */
...@@ -78,6 +81,8 @@ class KioskNextHomeBridge { ...@@ -78,6 +81,8 @@ class KioskNextHomeBridge {
chromeos.kioskNextHome.mojom.KioskNextHomeInterfaceBroker.getProxy(); chromeos.kioskNextHome.mojom.KioskNextHomeInterfaceBroker.getProxy();
kioskNextHomeInterfaceBrokerProxy.getIdentityAccessor( kioskNextHomeInterfaceBrokerProxy.getIdentityAccessor(
this.identityAccessorProxy_.$.createRequest()); this.identityAccessorProxy_.$.createRequest());
kioskNextHomeInterfaceBrokerProxy.getIdentityController(
this.identityControllerProxy_.$.createRequest());
kioskNextHomeInterfaceBrokerProxy.getAppController( kioskNextHomeInterfaceBrokerProxy.getAppController(
this.appControllerProxy_.$.createRequest()); this.appControllerProxy_.$.createRequest());
...@@ -109,6 +114,18 @@ class KioskNextHomeBridge { ...@@ -109,6 +114,18 @@ class KioskNextHomeBridge {
this.listeners_.push(listener); this.listeners_.push(listener);
} }
/** @override */
getUserGivenName() {
return this.identityControllerProxy_.getUserInfo().then(
result => result.userInfo.givenName);
}
/** @override */
getUserDisplayName() {
return this.identityControllerProxy_.getUserInfo().then(
result => result.userInfo.displayName);
}
/** @override */ /** @override */
getAccountId() { getAccountId() {
return this.identityAccessorProxy_.getPrimaryAccountWhenAvailable().then( return this.identityAccessorProxy_.getPrimaryAccountWhenAvailable().then(
......
...@@ -86,6 +86,18 @@ user_manager::UserList FakeUserManager::GetUsersAllowedForMultiProfile() const { ...@@ -86,6 +86,18 @@ user_manager::UserList FakeUserManager::GetUsersAllowedForMultiProfile() const {
return result; return result;
} }
void FakeUserManager::UpdateUserAccountData(
const AccountId& account_id,
const UserAccountData& account_data) {
for (user_manager::User* user : users_) {
if (user->GetAccountId() == account_id) {
user->set_display_name(account_data.display_name());
user->set_given_name(account_data.given_name());
return;
}
}
}
void FakeUserManager::UserLoggedIn(const AccountId& account_id, void FakeUserManager::UserLoggedIn(const AccountId& account_id,
const std::string& username_hash, const std::string& username_hash,
bool browser_restart, bool browser_restart,
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define COMPONENTS_USER_MANAGER_FAKE_USER_MANAGER_H_ #define COMPONENTS_USER_MANAGER_FAKE_USER_MANAGER_H_
#include <map> #include <map>
#include <set>
#include <string> #include <string>
#include "base/macros.h" #include "base/macros.h"
...@@ -37,6 +38,8 @@ class USER_MANAGER_EXPORT FakeUserManager : public UserManagerBase { ...@@ -37,6 +38,8 @@ class USER_MANAGER_EXPORT FakeUserManager : public UserManagerBase {
// UserManager overrides. // UserManager overrides.
const user_manager::UserList& GetUsers() const override; const user_manager::UserList& GetUsers() const override;
user_manager::UserList GetUsersAllowedForMultiProfile() const override; user_manager::UserList GetUsersAllowedForMultiProfile() const override;
void UpdateUserAccountData(const AccountId& account_id,
const UserAccountData& account_data) override;
// Set the user as logged in. // Set the user as logged in.
void UserLoggedIn(const AccountId& account_id, void UserLoggedIn(const AccountId& account_id,
...@@ -56,8 +59,6 @@ class USER_MANAGER_EXPORT FakeUserManager : public UserManagerBase { ...@@ -56,8 +59,6 @@ class USER_MANAGER_EXPORT FakeUserManager : public UserManagerBase {
bool HasBrowserRestarted() const override; bool HasBrowserRestarted() const override;
// Not implemented. // Not implemented.
void UpdateUserAccountData(const AccountId& account_id,
const UserAccountData& account_data) override {}
void Shutdown() override {} void Shutdown() override {}
const user_manager::UserList& GetLRULoggedInUsers() const override; const user_manager::UserList& GetLRULoggedInUsers() const override;
user_manager::UserList GetUnlockUsers() const override; user_manager::UserList GetUnlockUsers() const override;
......
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