key_storage_util_linux.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/os_crypt/key_storage_util_linux.h"
  5. #include "base/files/file_path.h"
  6. #include "base/files/file_util.h"
  7. #include "base/logging.h"
  8. #include "base/notreached.h"
  9. namespace {
  10. // OSCrypt has a setting that determines whether a backend will be used.
  11. // The presense of this file in the file system means that the backend
  12. // should be ignored. It's absence means we should use the backend.
  13. constexpr const char kPreferenceFileName[] = "Disable Local Encryption";
  14. bool ReadBackendUse(const base::FilePath& user_data_dir, bool* use) {
  15. if (user_data_dir.empty())
  16. return false;
  17. base::FilePath pref_path = user_data_dir.Append(kPreferenceFileName);
  18. *use = !base::PathExists(pref_path);
  19. return true;
  20. }
  21. } // namespace
  22. namespace os_crypt {
  23. SelectedLinuxBackend SelectBackend(const std::string& type,
  24. bool use_backend,
  25. base::nix::DesktopEnvironment desktop_env) {
  26. // Explicitly requesting a store overrides other production logic.
  27. if (type == "kwallet")
  28. return SelectedLinuxBackend::KWALLET;
  29. if (type == "kwallet5")
  30. return SelectedLinuxBackend::KWALLET5;
  31. if (type == "gnome")
  32. return SelectedLinuxBackend::GNOME_ANY;
  33. if (type == "gnome-keyring")
  34. return SelectedLinuxBackend::GNOME_KEYRING;
  35. if (type == "gnome-libsecret")
  36. return SelectedLinuxBackend::GNOME_LIBSECRET;
  37. if (type == "basic")
  38. return SelectedLinuxBackend::BASIC_TEXT;
  39. // Ignore the backends if requested to.
  40. if (!use_backend)
  41. return SelectedLinuxBackend::BASIC_TEXT;
  42. // Detect the store to use automatically.
  43. const char* name = base::nix::GetDesktopEnvironmentName(desktop_env);
  44. VLOG(1) << "Password storage detected desktop environment: "
  45. << (name ? name : "(unknown)");
  46. switch (desktop_env) {
  47. case base::nix::DESKTOP_ENVIRONMENT_KDE4:
  48. return SelectedLinuxBackend::KWALLET;
  49. case base::nix::DESKTOP_ENVIRONMENT_KDE5:
  50. return SelectedLinuxBackend::KWALLET5;
  51. case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
  52. case base::nix::DESKTOP_ENVIRONMENT_DEEPIN:
  53. case base::nix::DESKTOP_ENVIRONMENT_GNOME:
  54. case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
  55. case base::nix::DESKTOP_ENVIRONMENT_UKUI:
  56. case base::nix::DESKTOP_ENVIRONMENT_UNITY:
  57. case base::nix::DESKTOP_ENVIRONMENT_XFCE:
  58. return SelectedLinuxBackend::GNOME_ANY;
  59. // KDE3 didn't use DBus, which our KWallet store uses.
  60. case base::nix::DESKTOP_ENVIRONMENT_KDE3:
  61. case base::nix::DESKTOP_ENVIRONMENT_OTHER:
  62. return SelectedLinuxBackend::BASIC_TEXT;
  63. }
  64. NOTREACHED();
  65. return SelectedLinuxBackend::BASIC_TEXT;
  66. }
  67. bool WriteBackendUse(const base::FilePath& user_data_dir, bool use) {
  68. if (user_data_dir.empty())
  69. return false;
  70. base::FilePath pref_path = user_data_dir.Append(kPreferenceFileName);
  71. if (use)
  72. return base::DeleteFile(pref_path);
  73. FILE* f = base::OpenFile(pref_path, "w");
  74. return f != nullptr && base::CloseFile(f);
  75. }
  76. bool GetBackendUse(const base::FilePath& user_data_dir) {
  77. bool setting;
  78. if (ReadBackendUse(user_data_dir, &setting))
  79. return setting;
  80. return true;
  81. }
  82. } // namespace os_crypt