OLD | NEW |
1 // Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2009-2010 The Chromium OS 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 // Contains the implementation of class Mount | 5 // Contains the implementation of class Mount |
6 | 6 |
7 #include "mount.h" | 7 #include "mount.h" |
8 | 8 |
9 #include <errno.h> | 9 #include <errno.h> |
10 | 10 |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 } | 471 } |
472 file_util::Delete(tmp_migrated_dir, true); | 472 file_util::Delete(tmp_migrated_dir, true); |
473 } | 473 } |
474 } | 474 } |
475 | 475 |
476 // Restore the umask | 476 // Restore the umask |
477 platform_->SetMask(original_mask); | 477 platform_->SetMask(original_mask); |
478 return result; | 478 return result; |
479 } | 479 } |
480 | 480 |
481 void Mount::CleanUnmountedTrackedSubdirectories() const { | 481 void Mount::DoForEveryUnmountedCryptohome(CryptohomeCallback callback) const { |
482 FilePath shadow_root(shadow_root_); | 482 FilePath shadow_root(shadow_root_); |
483 file_util::FileEnumerator dir_enumerator(shadow_root, false, | 483 file_util::FileEnumerator dir_enumerator(shadow_root, false, |
484 file_util::FileEnumerator::DIRECTORIES); | 484 file_util::FileEnumerator::DIRECTORIES); |
485 for (FilePath next_path = dir_enumerator.Next(); !next_path.empty(); | 485 for (FilePath next_path = dir_enumerator.Next(); !next_path.empty(); |
486 next_path = dir_enumerator.Next()) { | 486 next_path = dir_enumerator.Next()) { |
487 FilePath dir_name = next_path.BaseName(); | 487 FilePath dir_name = next_path.BaseName(); |
488 string str_dir_name = dir_name.value(); | 488 string str_dir_name = dir_name.value(); |
489 if (str_dir_name.length() != kUserDirNameLength) { | 489 if (str_dir_name.length() != kUserDirNameLength) { |
490 continue; | 490 continue; |
491 } | 491 } |
492 bool valid_name = true; | 492 bool valid_name = true; |
493 for (string::const_iterator itr = str_dir_name.begin(); | 493 for (string::const_iterator itr = str_dir_name.begin(); |
494 itr < str_dir_name.end(); ++itr) { | 494 itr < str_dir_name.end(); ++itr) { |
495 if (!isxdigit(*itr)) { | 495 if (!isxdigit(*itr)) { |
496 valid_name = false; | 496 valid_name = false; |
497 break; | 497 break; |
498 } | 498 } |
499 } | 499 } |
500 if (!valid_name) { | 500 if (!valid_name) { |
501 continue; | 501 continue; |
502 } | 502 } |
503 FilePath vault_path = next_path.Append("vault"); | 503 FilePath vault_path = next_path.Append("vault"); |
504 if (!file_util::DirectoryExists(vault_path)) { | 504 if (!file_util::DirectoryExists(vault_path)) { |
505 continue; | 505 continue; |
506 } | 506 } |
507 if (platform_->IsDirectoryMountedWith(home_dir_, vault_path.value())) { | 507 if (platform_->IsDirectoryMountedWith(home_dir_, vault_path.value())) { |
508 continue; | 508 continue; |
509 } | 509 } |
510 file_util::FileEnumerator subdir_enumerator( | 510 callback(vault_path); |
511 vault_path, | 511 } |
512 false, | 512 } |
513 file_util::FileEnumerator::DIRECTORIES); | 513 |
514 for (FilePath subdir_path = subdir_enumerator.Next(); !subdir_path.empty(); | 514 // Deletes all tracking subdirectories of the given vault. |
515 subdir_path = subdir_enumerator.Next()) { | 515 static void DeleteTrackedDirsCallback(const FilePath& vault) { |
516 FilePath subdir_name = subdir_path.BaseName(); | 516 file_util::FileEnumerator subdir_enumerator( |
517 if (subdir_name.value().find(kEncryptedFilePrefix) == 0) { | 517 vault, false, file_util::FileEnumerator::DIRECTORIES); |
518 continue; | 518 for (FilePath subdir_path = subdir_enumerator.Next(); !subdir_path.empty(); |
519 } | 519 subdir_path = subdir_enumerator.Next()) { |
520 if (subdir_name.value().compare(".") == 0 || | 520 FilePath subdir_name = subdir_path.BaseName(); |
521 subdir_name.value().compare("..") == 0) { | 521 if (subdir_name.value().find(kEncryptedFilePrefix) == 0) { |
522 continue; | 522 continue; |
523 } | |
524 file_util::Delete(subdir_path, true); | |
525 } | 523 } |
| 524 if (subdir_name.value().compare(".") == 0 || |
| 525 subdir_name.value().compare("..") == 0) { |
| 526 continue; |
| 527 } |
| 528 file_util::Delete(subdir_path, true); |
526 } | 529 } |
527 } | 530 } |
528 | 531 |
| 532 void Mount::CleanUnmountedTrackedSubdirectories() const { |
| 533 DoForEveryUnmountedCryptohome(&DeleteTrackedDirsCallback); |
| 534 } |
| 535 |
| 536 // Deletes Cache tracking directory of the given vault. |
| 537 static void DeleteCacheCallback(const FilePath& vault) { |
| 538 LOG(WARNING) << "Deleting Cache for user " << vault.value(); |
| 539 file_util::Delete(vault.Append(kCacheDir), true); |
| 540 } |
| 541 |
| 542 void Mount::DoAutomaticFreeDiskSpaceControl() const { |
| 543 if (platform_->AmountOfFreeDiskSpace(home_dir_) > kMinFreeSpace) |
| 544 return; |
| 545 |
| 546 // Clean Cache directories for every user (except current one). |
| 547 DoForEveryUnmountedCryptohome(&DeleteCacheCallback); |
| 548 |
| 549 // TODO(glotov): do further cleanup. |
| 550 } |
| 551 |
529 bool Mount::TestCredentials(const Credentials& credentials) const { | 552 bool Mount::TestCredentials(const Credentials& credentials) const { |
530 // If the current logged in user matches, use the UserSession to verify the | 553 // If the current logged in user matches, use the UserSession to verify the |
531 // credentials. This is less costly than a trip to the TPM, and only verifies | 554 // credentials. This is less costly than a trip to the TPM, and only verifies |
532 // a user during their logged in session. | 555 // a user during their logged in session. |
533 if (current_user_->CheckUser(credentials)) { | 556 if (current_user_->CheckUser(credentials)) { |
534 return current_user_->Verify(credentials); | 557 return current_user_->Verify(credentials); |
535 } | 558 } |
536 MountError mount_error; | 559 MountError mount_error; |
537 VaultKeyset vault_keyset; | 560 VaultKeyset vault_keyset; |
538 SerializedVaultKeyset serialized; | 561 SerializedVaultKeyset serialized; |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1049 if (error) { | 1072 if (error) { |
1050 *error = Mount::MOUNT_ERROR_KEY_FAILURE; | 1073 *error = Mount::MOUNT_ERROR_KEY_FAILURE; |
1051 } | 1074 } |
1052 return false; | 1075 return false; |
1053 } | 1076 } |
1054 | 1077 |
1055 return true; | 1078 return true; |
1056 } | 1079 } |
1057 | 1080 |
1058 } // namespace cryptohome | 1081 } // namespace cryptohome |
OLD | NEW |