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

Side by Side Diff: chrome/browser/chromeos/login/screens/user_selection_screen.cc

Issue 426063005: Allow recommended locales to be set for public sessions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix buffer overflow in test. Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/login/screens/user_selection_screen.h" 5 #include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "ash/shell.h" 9 #include "ash/shell.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 24 matching lines...) Expand all
35 const char kKeyEnterpriseDomain[] = "enterpriseDomain"; 35 const char kKeyEnterpriseDomain[] = "enterpriseDomain";
36 const char kKeyPublicAccount[] = "publicAccount"; 36 const char kKeyPublicAccount[] = "publicAccount";
37 const char kKeySupervisedUser[] = "supervisedUser"; 37 const char kKeySupervisedUser[] = "supervisedUser";
38 const char kKeySignedIn[] = "signedIn"; 38 const char kKeySignedIn[] = "signedIn";
39 const char kKeyCanRemove[] = "canRemove"; 39 const char kKeyCanRemove[] = "canRemove";
40 const char kKeyIsOwner[] = "isOwner"; 40 const char kKeyIsOwner[] = "isOwner";
41 const char kKeyInitialAuthType[] = "initialAuthType"; 41 const char kKeyInitialAuthType[] = "initialAuthType";
42 const char kKeyMultiProfilesAllowed[] = "isMultiProfilesAllowed"; 42 const char kKeyMultiProfilesAllowed[] = "isMultiProfilesAllowed";
43 const char kKeyMultiProfilesPolicy[] = "multiProfilesPolicy"; 43 const char kKeyMultiProfilesPolicy[] = "multiProfilesPolicy";
44 const char kKeyInitialLocales[] = "initialLocales"; 44 const char kKeyInitialLocales[] = "initialLocales";
45 const char kKeyInitialLocale[] = "initialLocale";
46 const char kKeyInitialMultipleRecommendedLocales[] =
47 "initialMultipleRecommendedLocales";
45 const char kKeyInitialKeyboardLayout[] = "initialKeyboardLayout"; 48 const char kKeyInitialKeyboardLayout[] = "initialKeyboardLayout";
46 49
47 // Max number of users to show. 50 // Max number of users to show.
48 // Please keep synced with one in signin_userlist_unittest.cc. 51 // Please keep synced with one in signin_userlist_unittest.cc.
49 const size_t kMaxUsers = 18; 52 const size_t kMaxUsers = 18;
50 53
51 const int kPasswordClearTimeoutSec = 60; 54 const int kPasswordClearTimeoutSec = 60;
52 55
56 void AddPublicSessionDetailsToUserDictionaryEntry(
57 base::DictionaryValue* user_dict,
58 const std::vector<std::string>* public_session_recommended_locales) {
59 policy::BrowserPolicyConnectorChromeOS* policy_connector =
60 g_browser_process->platform_part()->browser_policy_connector_chromeos();
61
62 if (policy_connector->IsEnterpriseManaged()) {
63 user_dict->SetString(kKeyEnterpriseDomain,
64 policy_connector->GetEnterpriseDomain());
65 }
66
67 std::vector<std::string> kEmptyRecommendedLocales;
68 const std::vector<std::string>* recommended_locales =
69 public_session_recommended_locales ?
70 public_session_recommended_locales : &kEmptyRecommendedLocales;
71
72 // Set |kKeyInitialLocales| to the list of available locales. This list
73 // consists of the recommended locales, followed by all others.
74 user_dict->Set(
75 kKeyInitialLocales,
76 GetUILanguageList(recommended_locales, std::string()).release());
77
78 // Set |kKeyInitialLocale| to the initially selected locale. If the list of
79 // recommended locales is not empty, select its first entry. Otherwise,
80 // select the current UI locale.
81 user_dict->SetString(kKeyInitialLocale,
82 recommended_locales->empty() ?
83 g_browser_process->GetApplicationLocale() :
84 recommended_locales->front());
85
86 // Set |kKeyInitialMultipleRecommendedLocales| to indicate whether the list
87 // of recommended locales contains at least two entries. This is used to
88 // decide whether the public session pod expands to its basic form (for zero
89 // or one recommended locales) or the advanced form (two or more recommended
90 // locales).
91 user_dict->SetBoolean(kKeyInitialMultipleRecommendedLocales,
92 recommended_locales->size() >= 2);
93
94 // Set |kKeyInitialKeyboardLayout| to the current keyboard layout. This
95 // value will be used temporarily only because the UI immediately requests a
96 // list of keyboard layouts suitable for the currently selected locale.
97 user_dict->Set(kKeyInitialKeyboardLayout,
98 GetCurrentKeyboardLayout().release());
99 }
100
53 } // namespace 101 } // namespace
54 102
55 UserSelectionScreen::UserSelectionScreen() : handler_(NULL) { 103 UserSelectionScreen::UserSelectionScreen() : handler_(NULL) {
56 } 104 }
57 105
58 UserSelectionScreen::~UserSelectionScreen() { 106 UserSelectionScreen::~UserSelectionScreen() {
59 wm::UserActivityDetector* activity_detector = 107 wm::UserActivityDetector* activity_detector =
60 ash::Shell::GetInstance()->user_activity_detector(); 108 ash::Shell::GetInstance()->user_activity_detector();
61 if (activity_detector->HasObserver(this)) 109 if (activity_detector->HasObserver(this))
62 activity_detector->RemoveObserver(this); 110 activity_detector->RemoveObserver(this);
63 } 111 }
64 112
65 // static 113 // static
66 void UserSelectionScreen::FillUserDictionary( 114 void UserSelectionScreen::FillUserDictionary(
67 user_manager::User* user, 115 user_manager::User* user,
68 bool is_owner, 116 bool is_owner,
69 bool is_signin_to_add, 117 bool is_signin_to_add,
70 ScreenlockBridge::LockHandler::AuthType auth_type, 118 ScreenlockBridge::LockHandler::AuthType auth_type,
119 const std::vector<std::string>* public_session_recommended_locales,
71 base::DictionaryValue* user_dict) { 120 base::DictionaryValue* user_dict) {
72 const std::string& user_id = user->email(); 121 const std::string& user_id = user->email();
73 const bool is_public_account = 122 const bool is_public_session =
74 user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT; 123 user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT;
75 const bool is_supervised_user = 124 const bool is_supervised_user =
76 user->GetType() == user_manager::USER_TYPE_SUPERVISED; 125 user->GetType() == user_manager::USER_TYPE_SUPERVISED;
77 126
78 user_dict->SetString(kKeyUsername, user_id); 127 user_dict->SetString(kKeyUsername, user_id);
79 user_dict->SetString(kKeyEmailAddress, user->display_email()); 128 user_dict->SetString(kKeyEmailAddress, user->display_email());
80 user_dict->SetString(kKeyDisplayName, user->GetDisplayName()); 129 user_dict->SetString(kKeyDisplayName, user->GetDisplayName());
81 user_dict->SetBoolean(kKeyPublicAccount, is_public_account); 130 user_dict->SetBoolean(kKeyPublicAccount, is_public_session);
82 user_dict->SetBoolean(kKeySupervisedUser, is_supervised_user); 131 user_dict->SetBoolean(kKeySupervisedUser, is_supervised_user);
83 user_dict->SetInteger(kKeyInitialAuthType, auth_type); 132 user_dict->SetInteger(kKeyInitialAuthType, auth_type);
84 user_dict->SetBoolean(kKeySignedIn, user->is_logged_in()); 133 user_dict->SetBoolean(kKeySignedIn, user->is_logged_in());
85 user_dict->SetBoolean(kKeyIsOwner, is_owner); 134 user_dict->SetBoolean(kKeyIsOwner, is_owner);
86 135
87 // Fill in multi-profiles related fields. 136 // Fill in multi-profiles related fields.
88 if (is_signin_to_add) { 137 if (is_signin_to_add) {
89 MultiProfileUserController* multi_profile_user_controller = 138 MultiProfileUserController* multi_profile_user_controller =
90 UserManager::Get()->GetMultiProfileUserController(); 139 UserManager::Get()->GetMultiProfileUserController();
91 MultiProfileUserController::UserAllowedInSessionReason isUserAllowedReason; 140 MultiProfileUserController::UserAllowedInSessionReason isUserAllowedReason;
92 bool isUserAllowed = multi_profile_user_controller->IsUserAllowedInSession( 141 bool isUserAllowed = multi_profile_user_controller->IsUserAllowedInSession(
93 user_id, &isUserAllowedReason); 142 user_id, &isUserAllowedReason);
94 user_dict->SetBoolean(kKeyMultiProfilesAllowed, isUserAllowed); 143 user_dict->SetBoolean(kKeyMultiProfilesAllowed, isUserAllowed);
95 144
96 std::string behavior; 145 std::string behavior;
97 switch (isUserAllowedReason) { 146 switch (isUserAllowedReason) {
98 case MultiProfileUserController::NOT_ALLOWED_OWNER_AS_SECONDARY: 147 case MultiProfileUserController::NOT_ALLOWED_OWNER_AS_SECONDARY:
99 behavior = MultiProfileUserController::kBehaviorOwnerPrimaryOnly; 148 behavior = MultiProfileUserController::kBehaviorOwnerPrimaryOnly;
100 break; 149 break;
101 default: 150 default:
102 behavior = multi_profile_user_controller->GetCachedValue(user_id); 151 behavior = multi_profile_user_controller->GetCachedValue(user_id);
103 } 152 }
104 user_dict->SetString(kKeyMultiProfilesPolicy, behavior); 153 user_dict->SetString(kKeyMultiProfilesPolicy, behavior);
105 } else { 154 } else {
106 user_dict->SetBoolean(kKeyMultiProfilesAllowed, true); 155 user_dict->SetBoolean(kKeyMultiProfilesAllowed, true);
107 } 156 }
108 157
109 if (is_public_account) { 158 if (is_public_session) {
110 policy::BrowserPolicyConnectorChromeOS* policy_connector = 159 AddPublicSessionDetailsToUserDictionaryEntry(
111 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 160 user_dict,
112 161 public_session_recommended_locales);
113 if (policy_connector->IsEnterpriseManaged()) {
114 user_dict->SetString(kKeyEnterpriseDomain,
115 policy_connector->GetEnterpriseDomain());
116 }
117
118 // TODO(bartfab): Initialize |most_relevant_languages| and |locale| based on
119 // policy.
120 const std::string locale = g_browser_process->GetApplicationLocale();
121 std::vector<std::string> most_relevant_languages;
122 user_dict->Set(
123 kKeyInitialLocales,
124 GetUILanguageList(&most_relevant_languages, locale).release());
125 user_dict->Set(kKeyInitialKeyboardLayout,
126 GetCurrentKeyboardLayout().release());
127 } 162 }
128 } 163 }
129 164
130 // static 165 // static
131 bool UserSelectionScreen::ShouldForceOnlineSignIn( 166 bool UserSelectionScreen::ShouldForceOnlineSignIn(
132 const user_manager::User* user) { 167 const user_manager::User* user) {
133 // Public sessions are always allowed to log in offline. 168 // Public sessions are always allowed to log in offline.
134 // Supervised user are allowed to log in offline if their OAuth token status 169 // Supervised user are allowed to log in offline if their OAuth token status
135 // is unknown or valid. 170 // is unknown or valid.
136 // For all other users, force online sign in if: 171 // For all other users, force online sign in if:
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 305
271 policy::BrowserPolicyConnectorChromeOS* connector = 306 policy::BrowserPolicyConnectorChromeOS* connector =
272 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 307 g_browser_process->platform_part()->browser_policy_connector_chromeos();
273 bool is_enterprise_managed = connector->IsEnterpriseManaged(); 308 bool is_enterprise_managed = connector->IsEnterpriseManaged();
274 309
275 const user_manager::UserList users_to_send = 310 const user_manager::UserList users_to_send =
276 PrepareUserListForSending(users, owner, is_signin_to_add); 311 PrepareUserListForSending(users, owner, is_signin_to_add);
277 312
278 user_auth_type_map_.clear(); 313 user_auth_type_map_.clear();
279 314
315 const std::vector<std::string> kEmptyRecommendedLocales;
280 for (user_manager::UserList::const_iterator it = users_to_send.begin(); 316 for (user_manager::UserList::const_iterator it = users_to_send.begin();
281 it != users_to_send.end(); 317 it != users_to_send.end();
282 ++it) { 318 ++it) {
283 const std::string& user_id = (*it)->email(); 319 const std::string& user_id = (*it)->email();
284 bool is_owner = (user_id == owner); 320 bool is_owner = (user_id == owner);
285 const bool is_public_account = 321 const bool is_public_account =
286 ((*it)->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT); 322 ((*it)->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT);
287 const ScreenlockBridge::LockHandler::AuthType initial_auth_type = 323 const ScreenlockBridge::LockHandler::AuthType initial_auth_type =
288 is_public_account 324 is_public_account
289 ? ScreenlockBridge::LockHandler::EXPAND_THEN_USER_CLICK 325 ? ScreenlockBridge::LockHandler::EXPAND_THEN_USER_CLICK
290 : (ShouldForceOnlineSignIn(*it) 326 : (ShouldForceOnlineSignIn(*it)
291 ? ScreenlockBridge::LockHandler::ONLINE_SIGN_IN 327 ? ScreenlockBridge::LockHandler::ONLINE_SIGN_IN
292 : ScreenlockBridge::LockHandler::OFFLINE_PASSWORD); 328 : ScreenlockBridge::LockHandler::OFFLINE_PASSWORD);
293 user_auth_type_map_[user_id] = initial_auth_type; 329 user_auth_type_map_[user_id] = initial_auth_type;
294 330
295 base::DictionaryValue* user_dict = new base::DictionaryValue(); 331 base::DictionaryValue* user_dict = new base::DictionaryValue();
296 FillUserDictionary( 332 const std::vector<std::string>* public_session_recommended_locales =
297 *it, is_owner, is_signin_to_add, initial_auth_type, user_dict); 333 public_session_recommended_locales_.find(user_id) ==
334 public_session_recommended_locales_.end() ?
335 &kEmptyRecommendedLocales :
336 &public_session_recommended_locales_[user_id];
337 FillUserDictionary(*it,
338 is_owner,
339 is_signin_to_add,
340 initial_auth_type,
341 public_session_recommended_locales,
342 user_dict);
298 bool signed_in = (*it)->is_logged_in(); 343 bool signed_in = (*it)->is_logged_in();
299 // Single user check here is necessary because owner info might not be 344 // Single user check here is necessary because owner info might not be
300 // available when running into login screen on first boot. 345 // available when running into login screen on first boot.
301 // See http://crosbug.com/12723 346 // See http://crosbug.com/12723
302 bool can_remove_user = 347 bool can_remove_user =
303 ((!single_user || is_enterprise_managed) && !user_id.empty() && 348 ((!single_user || is_enterprise_managed) && !user_id.empty() &&
304 !is_owner && !is_public_account && !signed_in && !is_signin_to_add); 349 !is_owner && !is_public_account && !signed_in && !is_signin_to_add);
305 user_dict->SetBoolean(kKeyCanRemove, can_remove_user); 350 user_dict->SetBoolean(kKeyCanRemove, can_remove_user);
306 users_list.Append(user_dict); 351 users_list.Append(user_dict);
307 } 352 }
(...skipping 12 matching lines...) Expand all
320 } 365 }
321 366
322 ScreenlockBridge::LockHandler::AuthType UserSelectionScreen::GetAuthType( 367 ScreenlockBridge::LockHandler::AuthType UserSelectionScreen::GetAuthType(
323 const std::string& username) const { 368 const std::string& username) const {
324 if (user_auth_type_map_.find(username) == user_auth_type_map_.end()) 369 if (user_auth_type_map_.find(username) == user_auth_type_map_.end())
325 return ScreenlockBridge::LockHandler::OFFLINE_PASSWORD; 370 return ScreenlockBridge::LockHandler::OFFLINE_PASSWORD;
326 return user_auth_type_map_.find(username)->second; 371 return user_auth_type_map_.find(username)->second;
327 } 372 }
328 373
329 } // namespace chromeos 374 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698