| OLD | NEW |
| 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/users/avatar/user_image_manager_impl.h" | 5 #include "chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 void OnSaveImageDone(bool success); | 257 void OnSaveImageDone(bool success); |
| 258 | 258 |
| 259 // Updates the user image in local state, setting it to one of the | 259 // Updates the user image in local state, setting it to one of the |
| 260 // default images or the saved |user_image_|, depending on | 260 // default images or the saved |user_image_|, depending on |
| 261 // |image_index_|. | 261 // |image_index_|. |
| 262 void UpdateLocalState(); | 262 void UpdateLocalState(); |
| 263 | 263 |
| 264 // Notifies the |parent_| that the Job is done. | 264 // Notifies the |parent_| that the Job is done. |
| 265 void NotifyJobDone(); | 265 void NotifyJobDone(); |
| 266 | 266 |
| 267 const std::string& user_id() const { return parent_->user_id(); } | 267 const user_manager::UserID& user_id() const { return parent_->user_id(); } |
| 268 | 268 |
| 269 UserImageManagerImpl* parent_; | 269 UserImageManagerImpl* parent_; |
| 270 | 270 |
| 271 // Whether one of the Load*() or Set*() methods has been run already. | 271 // Whether one of the Load*() or Set*() methods has been run already. |
| 272 bool run_; | 272 bool run_; |
| 273 | 273 |
| 274 int image_index_; | 274 int image_index_; |
| 275 GURL image_url_; | 275 GURL image_url_; |
| 276 base::FilePath image_path_; | 276 base::FilePath image_path_; |
| 277 | 277 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 false); | 426 false); |
| 427 } | 427 } |
| 428 user->SetImageURL(image_url_); | 428 user->SetImageURL(image_url_); |
| 429 | 429 |
| 430 parent_->OnJobChangedUserImage(); | 430 parent_->OnJobChangedUserImage(); |
| 431 } | 431 } |
| 432 | 432 |
| 433 void UserImageManagerImpl::Job::SaveImageAndUpdateLocalState() { | 433 void UserImageManagerImpl::Job::SaveImageAndUpdateLocalState() { |
| 434 base::FilePath user_data_dir; | 434 base::FilePath user_data_dir; |
| 435 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); | 435 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
| 436 image_path_ = user_data_dir.Append(user_id() + kSafeImagePathExtension); | 436 image_path_ = user_data_dir.Append(user_id().GetUserEmail() + kSafeImagePathEx
tension); |
| 437 | 437 |
| 438 base::PostTaskAndReplyWithResult( | 438 base::PostTaskAndReplyWithResult( |
| 439 parent_->background_task_runner_.get(), | 439 parent_->background_task_runner_.get(), |
| 440 FROM_HERE, | 440 FROM_HERE, |
| 441 base::Bind(&SaveImage, user_image_, image_path_), | 441 base::Bind(&SaveImage, user_image_, image_path_), |
| 442 base::Bind(&Job::OnSaveImageDone, weak_factory_.GetWeakPtr())); | 442 base::Bind(&Job::OnSaveImageDone, weak_factory_.GetWeakPtr())); |
| 443 } | 443 } |
| 444 | 444 |
| 445 void UserImageManagerImpl::Job::OnSaveImageDone(bool success) { | 445 void UserImageManagerImpl::Job::OnSaveImageDone(bool success) { |
| 446 if (success || image_index_ == user_manager::User::USER_IMAGE_PROFILE) | 446 if (success || image_index_ == user_manager::User::USER_IMAGE_PROFILE) |
| 447 UpdateLocalState(); | 447 UpdateLocalState(); |
| 448 NotifyJobDone(); | 448 NotifyJobDone(); |
| 449 } | 449 } |
| 450 | 450 |
| 451 void UserImageManagerImpl::Job::UpdateLocalState() { | 451 void UserImageManagerImpl::Job::UpdateLocalState() { |
| 452 // Ignore if data stored or cached outside the user's cryptohome is to be | 452 // Ignore if data stored or cached outside the user's cryptohome is to be |
| 453 // treated as ephemeral. | 453 // treated as ephemeral. |
| 454 if (parent_->user_manager_->IsUserNonCryptohomeDataEphemeral(user_id())) | 454 if (parent_->user_manager_->IsUserNonCryptohomeDataEphemeral(user_id())) |
| 455 return; | 455 return; |
| 456 | 456 |
| 457 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue); | 457 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue); |
| 458 entry->Set(kImagePathNodeName, new base::StringValue(image_path_.value())); | 458 entry->Set(kImagePathNodeName, new base::StringValue(image_path_.value())); |
| 459 entry->Set(kImageIndexNodeName, new base::FundamentalValue(image_index_)); | 459 entry->Set(kImageIndexNodeName, new base::FundamentalValue(image_index_)); |
| 460 if (!image_url_.is_empty()) | 460 if (!image_url_.is_empty()) |
| 461 entry->Set(kImageURLNodeName, new base::StringValue(image_url_.spec())); | 461 entry->Set(kImageURLNodeName, new base::StringValue(image_url_.spec())); |
| 462 DictionaryPrefUpdate update(g_browser_process->local_state(), | 462 DictionaryPrefUpdate update(g_browser_process->local_state(), |
| 463 kUserImageProperties); | 463 kUserImageProperties); |
| 464 update->SetWithoutPathExpansion(user_id(), entry.release()); | 464 update->SetWithoutPathExpansion(user_id().GetUserEmail(), entry.release()); |
| 465 | 465 |
| 466 parent_->user_manager_->NotifyLocalStateChanged(); | 466 parent_->user_manager_->NotifyLocalStateChanged(); |
| 467 } | 467 } |
| 468 | 468 |
| 469 void UserImageManagerImpl::Job::NotifyJobDone() { | 469 void UserImageManagerImpl::Job::NotifyJobDone() { |
| 470 parent_->OnJobDone(); | 470 parent_->OnJobDone(); |
| 471 } | 471 } |
| 472 | 472 |
| 473 UserImageManagerImpl::UserImageManagerImpl( | 473 UserImageManagerImpl::UserImageManagerImpl( |
| 474 const std::string& user_id, | 474 const user_manager::UserID& user_id, |
| 475 user_manager::UserManager* user_manager) | 475 user_manager::UserManager* user_manager) |
| 476 : UserImageManager(user_id), | 476 : UserImageManager(user_id), |
| 477 user_manager_(user_manager), | 477 user_manager_(user_manager), |
| 478 downloading_profile_image_(false), | 478 downloading_profile_image_(false), |
| 479 profile_image_requested_(false), | 479 profile_image_requested_(false), |
| 480 has_managed_image_(false), | 480 has_managed_image_(false), |
| 481 user_needs_migration_(false), | 481 user_needs_migration_(false), |
| 482 weak_factory_(this) { | 482 weak_factory_(this) { |
| 483 base::SequencedWorkerPool* blocking_pool = | 483 base::SequencedWorkerPool* blocking_pool = |
| 484 content::BrowserThread::GetBlockingPool(); | 484 content::BrowserThread::GetBlockingPool(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 504 return; | 504 return; |
| 505 user_manager::User* user = GetUserAndModify(); | 505 user_manager::User* user = GetUserAndModify(); |
| 506 bool needs_migration = false; | 506 bool needs_migration = false; |
| 507 | 507 |
| 508 // If entries are found in both |prefs_images_unsafe| and |prefs_images|, | 508 // If entries are found in both |prefs_images_unsafe| and |prefs_images|, |
| 509 // |prefs_images| is honored for now but |prefs_images_unsafe| will be | 509 // |prefs_images| is honored for now but |prefs_images_unsafe| will be |
| 510 // migrated, overwriting the |prefs_images| entry, when the user logs in. | 510 // migrated, overwriting the |prefs_images| entry, when the user logs in. |
| 511 const base::DictionaryValue* image_properties = NULL; | 511 const base::DictionaryValue* image_properties = NULL; |
| 512 if (prefs_images_unsafe) { | 512 if (prefs_images_unsafe) { |
| 513 needs_migration = prefs_images_unsafe->GetDictionaryWithoutPathExpansion( | 513 needs_migration = prefs_images_unsafe->GetDictionaryWithoutPathExpansion( |
| 514 user_id(), &image_properties); | 514 user_id().GetUserEmail(), &image_properties); |
| 515 if (needs_migration) | 515 if (needs_migration) |
| 516 user_needs_migration_ = true; | 516 user_needs_migration_ = true; |
| 517 } | 517 } |
| 518 if (prefs_images) { | 518 if (prefs_images) { |
| 519 prefs_images->GetDictionaryWithoutPathExpansion(user_id(), | 519 prefs_images->GetDictionaryWithoutPathExpansion(user_id().GetUserEmail(), |
| 520 &image_properties); | 520 &image_properties); |
| 521 } | 521 } |
| 522 | 522 |
| 523 // If the user image for |user_id| is managed by policy and the policy-set | 523 // If the user image for |user_id| is managed by policy and the policy-set |
| 524 // image is being loaded and persisted right now, let that job continue. It | 524 // image is being loaded and persisted right now, let that job continue. It |
| 525 // will update the user image when done. | 525 // will update the user image when done. |
| 526 if (IsUserImageManaged() && job_.get()) | 526 if (IsUserImageManaged() && job_.get()) |
| 527 return; | 527 return; |
| 528 | 528 |
| 529 if (!image_properties) { | 529 if (!image_properties) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 } else { | 581 } else { |
| 582 UMA_HISTOGRAM_ENUMERATION("UserImage.LoggedIn", | 582 UMA_HISTOGRAM_ENUMERATION("UserImage.LoggedIn", |
| 583 ImageIndexToHistogramIndex(user->image_index()), | 583 ImageIndexToHistogramIndex(user->image_index()), |
| 584 user_manager::kHistogramImagesCount); | 584 user_manager::kHistogramImagesCount); |
| 585 | 585 |
| 586 if (!IsUserImageManaged() && user_needs_migration_) { | 586 if (!IsUserImageManaged() && user_needs_migration_) { |
| 587 const base::DictionaryValue* prefs_images_unsafe = | 587 const base::DictionaryValue* prefs_images_unsafe = |
| 588 g_browser_process->local_state()->GetDictionary(kUserImages); | 588 g_browser_process->local_state()->GetDictionary(kUserImages); |
| 589 const base::DictionaryValue* image_properties = NULL; | 589 const base::DictionaryValue* image_properties = NULL; |
| 590 if (prefs_images_unsafe->GetDictionaryWithoutPathExpansion( | 590 if (prefs_images_unsafe->GetDictionaryWithoutPathExpansion( |
| 591 user_id(), &image_properties)) { | 591 user_id().GetUserEmail(), &image_properties)) { |
| 592 std::string image_path; | 592 std::string image_path; |
| 593 image_properties->GetString(kImagePathNodeName, &image_path); | 593 image_properties->GetString(kImagePathNodeName, &image_path); |
| 594 job_.reset(new Job(this)); | 594 job_.reset(new Job(this)); |
| 595 if (!image_path.empty()) { | 595 if (!image_path.empty()) { |
| 596 VLOG(0) << "Loading old user image, then migrating it."; | 596 VLOG(0) << "Loading old user image, then migrating it."; |
| 597 job_->SetToPath(base::FilePath(image_path), | 597 job_->SetToPath(base::FilePath(image_path), |
| 598 user->image_index(), | 598 user->image_index(), |
| 599 user->image_url(), | 599 user->image_url(), |
| 600 false); | 600 false); |
| 601 } else { | 601 } else { |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 profile_image_load_start_time_ = base::TimeTicks::Now(); | 916 profile_image_load_start_time_ = base::TimeTicks::Now(); |
| 917 profile_downloader_.reset(new ProfileDownloader(this)); | 917 profile_downloader_.reset(new ProfileDownloader(this)); |
| 918 profile_downloader_->Start(); | 918 profile_downloader_->Start(); |
| 919 } | 919 } |
| 920 | 920 |
| 921 void UserImageManagerImpl::DeleteUserImageAndLocalStateEntry( | 921 void UserImageManagerImpl::DeleteUserImageAndLocalStateEntry( |
| 922 const char* prefs_dict_root) { | 922 const char* prefs_dict_root) { |
| 923 DictionaryPrefUpdate update(g_browser_process->local_state(), | 923 DictionaryPrefUpdate update(g_browser_process->local_state(), |
| 924 prefs_dict_root); | 924 prefs_dict_root); |
| 925 const base::DictionaryValue* image_properties; | 925 const base::DictionaryValue* image_properties; |
| 926 if (!update->GetDictionaryWithoutPathExpansion(user_id(), &image_properties)) | 926 if (!update->GetDictionaryWithoutPathExpansion(user_id().GetUserEmail(), &imag
e_properties)) |
| 927 return; | 927 return; |
| 928 | 928 |
| 929 std::string image_path; | 929 std::string image_path; |
| 930 image_properties->GetString(kImagePathNodeName, &image_path); | 930 image_properties->GetString(kImagePathNodeName, &image_path); |
| 931 if (!image_path.empty()) { | 931 if (!image_path.empty()) { |
| 932 background_task_runner_->PostTask( | 932 background_task_runner_->PostTask( |
| 933 FROM_HERE, | 933 FROM_HERE, |
| 934 base::Bind(base::IgnoreResult(&base::DeleteFile), | 934 base::Bind(base::IgnoreResult(&base::DeleteFile), |
| 935 base::FilePath(image_path), | 935 base::FilePath(image_path), |
| 936 false)); | 936 false)); |
| 937 } | 937 } |
| 938 update->RemoveWithoutPathExpansion(user_id(), NULL); | 938 update->RemoveWithoutPathExpansion(user_id().GetUserEmail(), NULL); |
| 939 } | 939 } |
| 940 | 940 |
| 941 void UserImageManagerImpl::OnJobChangedUserImage() { | 941 void UserImageManagerImpl::OnJobChangedUserImage() { |
| 942 if (GetUser()->is_logged_in()) | 942 if (GetUser()->is_logged_in()) |
| 943 TryToInitDownloadedProfileImage(); | 943 TryToInitDownloadedProfileImage(); |
| 944 | 944 |
| 945 content::NotificationService::current()->Notify( | 945 content::NotificationService::current()->Notify( |
| 946 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, | 946 chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, |
| 947 content::Source<UserImageManagerImpl>(this), | 947 content::Source<UserImageManagerImpl>(this), |
| 948 content::Details<const user_manager::User>(GetUser())); | 948 content::Details<const user_manager::User>(GetUser())); |
| 949 } | 949 } |
| 950 | 950 |
| 951 void UserImageManagerImpl::OnJobDone() { | 951 void UserImageManagerImpl::OnJobDone() { |
| 952 if (job_.get()) | 952 if (job_.get()) |
| 953 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, job_.release()); | 953 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, job_.release()); |
| 954 else | 954 else |
| 955 NOTREACHED(); | 955 NOTREACHED(); |
| 956 | 956 |
| 957 if (!user_needs_migration_) | 957 if (!user_needs_migration_) |
| 958 return; | 958 return; |
| 959 // Migration completed for |user_id|. | 959 // Migration completed for |user_id|. |
| 960 user_needs_migration_ = false; | 960 user_needs_migration_ = false; |
| 961 | 961 |
| 962 const base::DictionaryValue* prefs_images_unsafe = | 962 const base::DictionaryValue* prefs_images_unsafe = |
| 963 g_browser_process->local_state()->GetDictionary(kUserImages); | 963 g_browser_process->local_state()->GetDictionary(kUserImages); |
| 964 const base::DictionaryValue* image_properties = NULL; | 964 const base::DictionaryValue* image_properties = NULL; |
| 965 if (!prefs_images_unsafe->GetDictionaryWithoutPathExpansion( | 965 if (!prefs_images_unsafe->GetDictionaryWithoutPathExpansion( |
| 966 user_id(), &image_properties)) { | 966 user_id().GetUserEmail(), &image_properties)) { |
| 967 NOTREACHED(); | 967 NOTREACHED(); |
| 968 return; | 968 return; |
| 969 } | 969 } |
| 970 | 970 |
| 971 int image_index = user_manager::User::USER_IMAGE_INVALID; | 971 int image_index = user_manager::User::USER_IMAGE_INVALID; |
| 972 image_properties->GetInteger(kImageIndexNodeName, &image_index); | 972 image_properties->GetInteger(kImageIndexNodeName, &image_index); |
| 973 UMA_HISTOGRAM_ENUMERATION("UserImage.Migration", | 973 UMA_HISTOGRAM_ENUMERATION("UserImage.Migration", |
| 974 ImageIndexToHistogramIndex(image_index), | 974 ImageIndexToHistogramIndex(image_index), |
| 975 user_manager::kHistogramImagesCount); | 975 user_manager::kHistogramImagesCount); |
| 976 | 976 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 991 weak_factory_.GetWeakPtr())); | 991 weak_factory_.GetWeakPtr())); |
| 992 } else { | 992 } else { |
| 993 // If no old image exists, remove |user_id| from the old prefs dictionary. | 993 // If no old image exists, remove |user_id| from the old prefs dictionary. |
| 994 UpdateLocalStateAfterMigration(); | 994 UpdateLocalStateAfterMigration(); |
| 995 } | 995 } |
| 996 } | 996 } |
| 997 | 997 |
| 998 void UserImageManagerImpl::UpdateLocalStateAfterMigration() { | 998 void UserImageManagerImpl::UpdateLocalStateAfterMigration() { |
| 999 DictionaryPrefUpdate update(g_browser_process->local_state(), | 999 DictionaryPrefUpdate update(g_browser_process->local_state(), |
| 1000 kUserImages); | 1000 kUserImages); |
| 1001 update->RemoveWithoutPathExpansion(user_id(), NULL); | 1001 update->RemoveWithoutPathExpansion(user_id().GetUserEmail(), NULL); |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 void UserImageManagerImpl::TryToCreateImageSyncObserver() { | 1004 void UserImageManagerImpl::TryToCreateImageSyncObserver() { |
| 1005 const user_manager::User* user = GetUser(); | 1005 const user_manager::User* user = GetUser(); |
| 1006 // If the currently logged-in user's user image is managed, the sync observer | 1006 // If the currently logged-in user's user image is managed, the sync observer |
| 1007 // must not be started so that the policy-set image does not get synced out. | 1007 // must not be started so that the policy-set image does not get synced out. |
| 1008 if (!user_image_sync_observer_ && | 1008 if (!user_image_sync_observer_ && |
| 1009 user && user->CanSyncImage() && | 1009 user && user->CanSyncImage() && |
| 1010 !IsUserImageManaged()) { | 1010 !IsUserImageManaged()) { |
| 1011 user_image_sync_observer_.reset(new UserImageSyncObserver(user)); | 1011 user_image_sync_observer_.reset(new UserImageSyncObserver(user)); |
| 1012 } | 1012 } |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 const user_manager::User* UserImageManagerImpl::GetUser() const { | 1015 const user_manager::User* UserImageManagerImpl::GetUser() const { |
| 1016 return user_manager_->FindUser(user_id()); | 1016 return user_manager_->FindUser(user_id()); |
| 1017 } | 1017 } |
| 1018 | 1018 |
| 1019 user_manager::User* UserImageManagerImpl::GetUserAndModify() const { | 1019 user_manager::User* UserImageManagerImpl::GetUserAndModify() const { |
| 1020 return user_manager_->FindUserAndModify(user_id()); | 1020 return user_manager_->FindUserAndModify(user_id()); |
| 1021 } | 1021 } |
| 1022 | 1022 |
| 1023 bool UserImageManagerImpl::IsUserLoggedInAndHasGaiaAccount() const { | 1023 bool UserImageManagerImpl::IsUserLoggedInAndHasGaiaAccount() const { |
| 1024 const user_manager::User* user = GetUser(); | 1024 const user_manager::User* user = GetUser(); |
| 1025 if (!user) | 1025 if (!user) |
| 1026 return false; | 1026 return false; |
| 1027 return user->is_logged_in() && user->HasGaiaAccount(); | 1027 return user->is_logged_in() && user->HasGaiaAccount(); |
| 1028 } | 1028 } |
| 1029 | 1029 |
| 1030 } // namespace chromeos | 1030 } // namespace chromeos |
| OLD | NEW |