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

Unified Diff: components/os_crypt/key_storage_libsecret.cc

Issue 2273723002: Migrate Libsecret for OSCrypt to a new schema (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Branded application attribute Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/os_crypt/key_storage_libsecret.h ('k') | components/os_crypt/os_crypt_util_linux_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/os_crypt/key_storage_libsecret.cc
diff --git a/components/os_crypt/key_storage_libsecret.cc b/components/os_crypt/key_storage_libsecret.cc
index 2250775de6dd44b320501dddd349dd8a09d4b6ef..c83322888a944ccc725f27b6c4a9bc72f4999f1a 100644
--- a/components/os_crypt/key_storage_libsecret.cc
+++ b/components/os_crypt/key_storage_libsecret.cc
@@ -11,42 +11,61 @@
namespace {
-const SecretSchema kKeystoreSchema = {
+#if defined(GOOGLE_CHROME_BUILD)
+const char* kApplicationName = "chrome";
Lei Zhang 2016/08/29 17:42:35 const char kApplicationName[]
cfroussios 2016/08/30 09:08:27 Done.
+#else
+const char* kApplicationName = "chromium";
+#endif
+
+// Deprecated in M55 (crbug.com/639298)
+const SecretSchema kKeystoreSchemaV1 = {
"chrome_libsecret_os_crypt_password",
SECRET_SCHEMA_NONE,
{
{nullptr, SECRET_SCHEMA_ATTRIBUTE_STRING},
}};
+const SecretSchema kKeystoreSchemaV2 = {
+ "chrome_libsecret_os_crypt_password_v2",
+ SECRET_SCHEMA_DONT_MATCH_NAME,
+ {
+ {"application", SECRET_SCHEMA_ATTRIBUTE_STRING},
+ {nullptr, SECRET_SCHEMA_ATTRIBUTE_STRING},
+ }};
+
} // namespace
std::string KeyStorageLibsecret::AddRandomPasswordInLibsecret() {
std::string password;
base::Base64Encode(base::RandBytesAsString(16), &password);
GError* error = nullptr;
- LibsecretLoader::secret_password_store_sync(
- &kKeystoreSchema, nullptr, KeyStorageLinux::kKey, password.c_str(),
- nullptr, &error, nullptr);
-
- if (error) {
+ bool success = LibsecretLoader::secret_password_store_sync(
+ &kKeystoreSchemaV2, nullptr, KeyStorageLinux::kKey, password.c_str(),
+ nullptr, &error, "application", kApplicationName, nullptr);
+ if (error || !success) {
VLOG(1) << "Libsecret lookup failed: " << error->message;
return std::string();
}
+
+ VLOG(1) << "OSCrypt generated a new password.";
return password;
}
std::string KeyStorageLibsecret::GetKey() {
GError* error = nullptr;
LibsecretAttributesBuilder attrs;
+ attrs.Append("application", kApplicationName);
SecretValue* password_libsecret = LibsecretLoader::secret_service_lookup_sync(
- nullptr, &kKeystoreSchema, attrs.Get(), nullptr, &error);
-
+ nullptr, &kKeystoreSchemaV2, attrs.Get(), nullptr, &error);
if (error) {
VLOG(1) << "Libsecret lookup failed: " << error->message;
g_error_free(error);
return std::string();
}
if (!password_libsecret) {
+ std::string password = Migrate();
+ if (!password.empty())
+ return password;
return AddRandomPasswordInLibsecret();
}
std::string password(
@@ -58,3 +77,34 @@ std::string KeyStorageLibsecret::GetKey() {
bool KeyStorageLibsecret::Init() {
return LibsecretLoader::EnsureLibsecretLoaded();
}
+
+std::string KeyStorageLibsecret::Migrate() {
+ GError* error = nullptr;
+ LibsecretAttributesBuilder attrs;
+
+ // Detect old entry.
+ SecretValue* password_libsecret = LibsecretLoader::secret_service_lookup_sync(
+ nullptr, &kKeystoreSchemaV1, attrs.Get(), nullptr, &error);
+ if (error || !password_libsecret)
+ return std::string();
+
+ VLOG(1) << "OSCrypt detected a deprecated password in Libsecret.";
+ std::string password(
+ LibsecretLoader::secret_value_get_text(password_libsecret));
+
+ // Create new entry.
+ bool success = LibsecretLoader::secret_password_store_sync(
+ &kKeystoreSchemaV2, nullptr, KeyStorageLinux::kKey, password.c_str(),
+ nullptr, &error, "application", kApplicationName, nullptr);
+ if (error || !success)
+ return std::string();
+
+ // Delete old entry.
+ // Even if deletion failed, we have to use the password that we created.
+ success = LibsecretLoader::secret_password_clear_sync(
+ &kKeystoreSchemaV1, nullptr, &error, nullptr);
+
+ VLOG(1) << "OSCrypt migrated from deprecated password.";
+
+ return password;
+}
« no previous file with comments | « components/os_crypt/key_storage_libsecret.h ('k') | components/os_crypt/os_crypt_util_linux_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698