Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2707)

Unified Diff: chrome/browser/chromeos/login/user_manager_impl.cc

Issue 14927015: Translate device-local account IDs to user IDs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments addressed. Kiosk apps fixed. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/user_manager_impl.cc
diff --git a/chrome/browser/chromeos/login/user_manager_impl.cc b/chrome/browser/chromeos/login/user_manager_impl.cc
index 46d054cc4cda9cfeaed7fbd9a71b8c2a8c6eb474..933840d029847503fbdb1283e354946cf2d024d6 100644
--- a/chrome/browser/chromeos/login/user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/user_manager_impl.cc
@@ -30,7 +30,9 @@
#include "chrome/browser/chromeos/login/remove_user_delegate.h"
#include "chrome/browser/chromeos/login/user_image_manager_impl.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/chromeos/policy/device_local_account.h"
#include "chrome/browser/chromeos/session_length_limiter.h"
+#include "chrome/browser/chromeos/settings/cros_settings_names.h"
#include "chrome/browser/policy/browser_policy_connector.h"
#include "chrome/browser/prefs/scoped_user_pref_update.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -253,7 +255,7 @@ void UserManagerImpl::UserLoggedIn(const std::string& email,
GuestUserLoggedIn();
} else if (email == kRetailModeUserEMail) {
RetailModeUserLoggedIn();
- } else if (gaia::ExtractDomainName(email) == kKioskAppUserDomain) {
+ } else if (policy::IsKioskAppUser(email)) {
KioskAppLoggedIn(email);
} else {
EnsureUsersLoaded();
@@ -645,8 +647,8 @@ void UserManagerImpl::OnStateChanged() {
}
}
-void UserManagerImpl::OnPolicyUpdated(const std::string& account_id) {
- UpdatePublicAccountDisplayName(account_id);
+void UserManagerImpl::OnPolicyUpdated(const std::string& user_id) {
+ UpdatePublicAccountDisplayName(user_id);
NotifyUserListChanged();
}
@@ -898,12 +900,11 @@ void UserManagerImpl::RetrieveTrustedDevicePolicies() {
cros_settings_->GetBoolean(kAccountsPrefEphemeralUsersEnabled,
&ephemeral_users_enabled_);
cros_settings_->GetString(kDeviceOwner, &owner_email_);
- base::ListValue public_accounts;
- ReadPublicAccounts(&public_accounts);
EnsureUsersLoaded();
- bool changed = UpdateAndCleanUpPublicAccounts(public_accounts);
+ bool changed = UpdateAndCleanUpPublicAccounts(
+ policy::GetDeviceLocalAccounts(cros_settings_));
// If ephemeral users are enabled and we are on the login screen, take this
// opportunity to clean up by removing all regular users except the owner.
@@ -1075,16 +1076,38 @@ void UserManagerImpl::PublicAccountUserLoggedIn(User* user) {
void UserManagerImpl::KioskAppLoggedIn(const std::string& username) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK_EQ(gaia::ExtractDomainName(username), kKioskAppUserDomain);
+ DCHECK(policy::IsKioskAppUser(username));
WallpaperManager::Get()->SetInitialUserWallpaper(username, false);
active_user_ = User::CreateKioskAppUser(username);
active_user_->SetStubImage(User::kInvalidImageIndex, false);
+ // TODO(bartfab): Add KioskAppUsers to the users_ list and keep metadata like
Mattias Nissler (ping if slow) 2013/05/17 14:29:44 not sure whether we want to do this half-way. Mayb
bartfab (slow) 2013/05/17 16:08:47 I would prefer to go for ${opaque_identifier}@kios
+ // the kiosk_app_id in these objects, removing the need to re-parse the
+ // device-local account list here to extract the kiosk_app_id.
+ const std::vector<policy::DeviceLocalAccount> device_local_accounts =
+ policy::GetDeviceLocalAccounts(cros_settings_);
+ const policy::DeviceLocalAccount* account = NULL;
+ for (std::vector<policy::DeviceLocalAccount>::const_iterator
+ it = device_local_accounts.begin();
+ it != device_local_accounts.end(); ++it) {
+ if (it->user_id == username) {
+ account = &*it;
+ break;
+ }
+ }
+ std::string kiosk_app_id;
+ if (account) {
+ kiosk_app_id = account->kiosk_app_id;
+ } else {
+ LOG(ERROR) << "Logged into nonexistent kiosk-app account: " << username;
+ NOTREACHED();
+ }
+
CommandLine* command_line = CommandLine::ForCurrentProcess();
command_line->AppendSwitch(::switches::kForceAppMode);
- command_line->AppendSwitchASCII(::switches::kAppId,
- active_user_->GetAccountName(false));
+ command_line->AppendSwitchASCII(::switches::kAppId, kiosk_app_id);
+
// Disable window animation since kiosk app runs in a single full screen
// window and window animation causes start-up janks.
command_line->AppendSwitch(
@@ -1172,6 +1195,20 @@ User* UserManagerImpl::RemoveRegularOrLocallyManagedUserFromList(
return user;
}
+void UserManagerImpl::CleanUpPublicAccountNonCryptohomeDataPendingRemoval() {
+ PrefService* local_state = g_browser_process->local_state();
+ const std::string public_account_pending_data_removal =
+ local_state->GetString(kPublicAccountPendingDataRemoval);
+ if (public_account_pending_data_removal.empty() ||
+ (IsUserLoggedIn() &&
+ public_account_pending_data_removal == GetActiveUser()->email())) {
+ return;
+ }
+
+ RemoveNonCryptohomeData(public_account_pending_data_removal);
+ local_state->ClearPref(kPublicAccountPendingDataRemoval);
+}
+
void UserManagerImpl::CleanUpPublicAccountNonCryptohomeData(
const std::vector<std::string>& old_public_accounts) {
std::set<std::string> users;
@@ -1200,45 +1237,27 @@ void UserManagerImpl::CleanUpPublicAccountNonCryptohomeData(
}
bool UserManagerImpl::UpdateAndCleanUpPublicAccounts(
- const base::ListValue& public_accounts) {
- PrefService* local_state = g_browser_process->local_state();
-
- // Determine the currently logged-in user's email.
- std::string active_user_email;
- if (IsUserLoggedIn())
- active_user_email = GetLoggedInUser()->email();
+ const std::vector<policy::DeviceLocalAccount>& device_local_accounts) {
+ // Try to remove any public account data marked as pending removal.
+ CleanUpPublicAccountNonCryptohomeDataPendingRemoval();
- // If there is a public account whose data is pending removal and the user is
- // not currently logged in with that account, take this opportunity to remove
- // the data.
- std::string public_account_pending_data_removal =
- local_state->GetString(kPublicAccountPendingDataRemoval);
- if (!public_account_pending_data_removal.empty() &&
- public_account_pending_data_removal != active_user_email) {
- RemoveNonCryptohomeData(public_account_pending_data_removal);
- local_state->ClearPref(kPublicAccountPendingDataRemoval);
- }
-
- // Split the current user list public accounts and regular users.
+ // Get the current list of public accounts.
std::vector<std::string> old_public_accounts;
- std::set<std::string> regular_users;
for (UserList::const_iterator it = users_.begin(); it != users_.end(); ++it) {
if ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT)
old_public_accounts.push_back((*it)->email());
- else
- regular_users.insert((*it)->email());
}
// Get the new list of public accounts from policy.
std::vector<std::string> new_public_accounts;
- std::set<std::string> new_public_accounts_set;
- ParseUserList(public_accounts, regular_users,
- &new_public_accounts, &new_public_accounts_set);
-
- // Persist the new list of public accounts in a pref.
- ListPrefUpdate prefs_public_accounts_update(local_state, kPublicAccounts);
- scoped_ptr<base::ListValue> prefs_public_accounts(public_accounts.DeepCopy());
- prefs_public_accounts_update->Swap(prefs_public_accounts.get());
+ for (std::vector<policy::DeviceLocalAccount>::const_iterator it =
+ device_local_accounts.begin();
+ it != device_local_accounts.end(); ++it) {
+ // TODO(mnissler, nkostylev, bartfab): Process Kiosk Apps within the
+ // standard login framework: http://crbug.com/234694
+ if (it->type == policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)
+ new_public_accounts.push_back(it->user_id);
+ }
// If the list of public accounts has not changed, return.
if (new_public_accounts.size() == old_public_accounts.size()) {
@@ -1253,6 +1272,16 @@ bool UserManagerImpl::UpdateAndCleanUpPublicAccounts(
return false;
}
+ // Persist the new list of public accounts in a pref.
+ ListPrefUpdate prefs_public_accounts_update(g_browser_process->local_state(),
+ kPublicAccounts);
+ prefs_public_accounts_update->Clear();
+ for (std::vector<std::string>::const_iterator
+ it = new_public_accounts.begin();
+ it != new_public_accounts.end(); ++it) {
+ prefs_public_accounts_update->AppendString(*it);
+ }
+
// Remove the old public accounts from the user list.
for (UserList::iterator it = users_.begin(); it != users_.end(); ) {
if ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT) {
@@ -1268,7 +1297,7 @@ bool UserManagerImpl::UpdateAndCleanUpPublicAccounts(
for (std::vector<std::string>::const_reverse_iterator
it = new_public_accounts.rbegin();
it != new_public_accounts.rend(); ++it) {
- if (IsLoggedInAsPublicAccount() && *it == active_user_email)
+ if (IsLoggedInAsPublicAccount() && *it == GetActiveUser()->email())
users_.insert(users_.begin(), GetLoggedInUser());
else
users_.insert(users_.begin(), User::CreatePublicAccountUser(*it));
@@ -1291,7 +1320,7 @@ void UserManagerImpl::UpdatePublicAccountDisplayName(
if (device_local_account_policy_service_) {
policy::DeviceLocalAccountPolicyBroker* broker =
- device_local_account_policy_service_->GetBrokerForAccount(username);
+ device_local_account_policy_service_->GetBrokerForUser(username);
if (broker)
display_name = broker->GetDisplayName();
}
@@ -1476,36 +1505,4 @@ void UserManagerImpl::UpdateLoginState() {
LoginState::Get()->SetLoggedInState(logged_in_state, login_user_type);
}
-void UserManagerImpl::ReadPublicAccounts(base::ListValue* public_accounts) {
- const base::ListValue* accounts = NULL;
- if (cros_settings_->GetList(kAccountsPrefDeviceLocalAccounts, &accounts)) {
- for (base::ListValue::const_iterator entry(accounts->begin());
- entry != accounts->end(); ++entry) {
- const base::DictionaryValue* entry_dict = NULL;
- if (!(*entry)->GetAsDictionary(&entry_dict)) {
- NOTREACHED();
- continue;
- }
-
- int type = DEVICE_LOCAL_ACCOUNT_TYPE_PUBLIC_SESSION;
- entry_dict->GetIntegerWithoutPathExpansion(
- kAccountsPrefDeviceLocalAccountsKeyType, &type);
- switch (type) {
- case DEVICE_LOCAL_ACCOUNT_TYPE_PUBLIC_SESSION: {
- std::string id;
- if (entry_dict->GetStringWithoutPathExpansion(
- kAccountsPrefDeviceLocalAccountsKeyId, &id)) {
- public_accounts->AppendString(id);
- }
- break;
- }
- case DEVICE_LOCAL_ACCOUNT_TYPE_KIOSK_APP:
- // TODO(mnissler, nkostylev, bartfab): Process Kiosk Apps within the
- // standard login framework: http://crbug.com/234694
- break;
- }
- }
- }
-}
-
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698