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

Unified Diff: chrome/browser/password_manager/native_backend_libsecret.cc

Issue 1929573002: Changed location of LibsecretLoader (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added TODO and reference to bug Created 4 years, 8 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
Index: chrome/browser/password_manager/native_backend_libsecret.cc
diff --git a/chrome/browser/password_manager/native_backend_libsecret.cc b/chrome/browser/password_manager/native_backend_libsecret.cc
index 21581c0c02ce431d548e9edc483965a489e98795..7d5b258c123816582f95feb14cd047109afeb46f 100644
--- a/chrome/browser/password_manager/native_backend_libsecret.cc
+++ b/chrome/browser/password_manager/native_backend_libsecret.cc
@@ -4,10 +4,11 @@
#include "chrome/browser/password_manager/native_backend_libsecret.h"
-#include <dlfcn.h>
#include <stddef.h>
#include <stdint.h>
+#include <libsecret/secret.h>
+
#include <limits>
#include <list>
#include <memory>
@@ -32,68 +33,6 @@ const char kEmptyString[] = "";
const int kMaxPossibleTimeTValue = std::numeric_limits<int>::max();
} // namespace
-typeof(&::secret_password_store_sync)
- LibsecretLoader::secret_password_store_sync;
-typeof(&::secret_service_search_sync)
- LibsecretLoader::secret_service_search_sync;
-typeof(&::secret_password_clear_sync)
- LibsecretLoader::secret_password_clear_sync;
-typeof(&::secret_item_get_secret) LibsecretLoader::secret_item_get_secret;
-typeof(&::secret_value_get_text) LibsecretLoader::secret_value_get_text;
-typeof(&::secret_item_get_attributes)
- LibsecretLoader::secret_item_get_attributes;
-typeof(&::secret_item_load_secret_sync)
- LibsecretLoader::secret_item_load_secret_sync;
-typeof(&::secret_value_unref) LibsecretLoader::secret_value_unref;
-
-bool LibsecretLoader::libsecret_loaded = false;
-
-const LibsecretLoader::FunctionInfo LibsecretLoader::functions[] = {
- {"secret_password_store_sync",
- reinterpret_cast<void**>(&secret_password_store_sync)},
- {"secret_service_search_sync",
- reinterpret_cast<void**>(&secret_service_search_sync)},
- {"secret_password_clear_sync",
- reinterpret_cast<void**>(&secret_password_clear_sync)},
- {"secret_item_get_secret",
- reinterpret_cast<void**>(&secret_item_get_secret)},
- {"secret_value_get_text", reinterpret_cast<void**>(&secret_value_get_text)},
- {"secret_item_get_attributes",
- reinterpret_cast<void**>(&secret_item_get_attributes)},
- {"secret_item_load_secret_sync",
- reinterpret_cast<void**>(&secret_item_load_secret_sync)},
- {"secret_value_unref", reinterpret_cast<void**>(&secret_value_unref)},
- {nullptr, nullptr}};
-
-bool LibsecretLoader::LoadLibsecret() {
- if (libsecret_loaded)
- return true;
-
- void* handle = dlopen("libsecret-1.so.0", RTLD_NOW | RTLD_GLOBAL);
- if (!handle) {
- // We wanted to use libsecret, but we couldn't load it. Warn, because
- // either the user asked for this, or we autodetected it incorrectly. (Or
- // the system has broken libraries, which is also good to warn about.)
- LOG(WARNING) << "Could not load libsecret-1.so.0: " << dlerror();
- return false;
- }
-
- for (size_t i = 0; functions[i].name; ++i) {
- dlerror();
- *functions[i].pointer = dlsym(handle, functions[i].name);
- const char* error = dlerror();
- if (error) {
- VLOG(1) << "Unable to load symbol " << functions[i].name << ": " << error;
- dlclose(handle);
- return false;
- }
- }
-
- libsecret_loaded = true;
- // We leak the library handle. That's OK: this function is called only once.
- return true;
-}
-
namespace {
const char kLibsecretAppString[] = "chrome";
@@ -215,48 +154,6 @@ std::unique_ptr<PasswordForm> FormOutOfAttributes(GHashTable* attrs) {
return form;
}
-class LibsecretAttributesBuilder {
- public:
- LibsecretAttributesBuilder();
- ~LibsecretAttributesBuilder();
- void Append(const std::string& name, const std::string& value);
- void Append(const std::string& name, int64_t value);
- // GHashTable, its keys and values returned from Get() are destroyed in
- // |LibsecretAttributesBuilder| desctructor.
- GHashTable* Get() { return attrs_; }
-
- private:
- // |name_values_| is a storage for strings referenced in |attrs_|.
- std::list<std::string> name_values_;
- GHashTable* attrs_;
-};
-
-LibsecretAttributesBuilder::LibsecretAttributesBuilder() {
- attrs_ = g_hash_table_new_full(g_str_hash, g_str_equal,
- nullptr, // no deleter for keys
- nullptr); // no deleter for values
-}
-
-LibsecretAttributesBuilder::~LibsecretAttributesBuilder() {
- g_hash_table_destroy(attrs_);
-}
-
-void LibsecretAttributesBuilder::Append(const std::string& name,
- const std::string& value) {
- name_values_.push_back(name);
- gpointer name_str =
- static_cast<gpointer>(const_cast<char*>(name_values_.back().c_str()));
- name_values_.push_back(value);
- gpointer value_str =
- static_cast<gpointer>(const_cast<char*>(name_values_.back().c_str()));
- g_hash_table_insert(attrs_, name_str, value_str);
-}
-
-void LibsecretAttributesBuilder::Append(const std::string& name,
- int64_t value) {
- Append(name, base::Int64ToString(value));
-}
-
// Generates a profile-specific app string based on profile_id_.
std::string GetProfileSpecificAppString(LocalProfileId id) {
// Originally, the application string was always just "chrome" and used only
@@ -267,30 +164,6 @@ std::string GetProfileSpecificAppString(LocalProfileId id) {
} // namespace
-bool LibsecretLoader::LibsecretIsAvailable() {
- if (!libsecret_loaded)
- return false;
- // A dummy query is made to check for availability, because libsecret doesn't
- // have a dedicated availability function. For performance reasons, the query
- // is meant to return an empty result.
- LibsecretAttributesBuilder attrs;
- attrs.Append("application", "chrome-string_to_get_empty_result");
-
- GError* error = nullptr;
- GList* found = secret_service_search_sync(nullptr, // default secret service
- &kLibsecretSchema, attrs.Get(),
- SECRET_SEARCH_ALL,
- nullptr, // no cancellable ojbect
- &error);
- bool success = (error == nullptr);
- if (error)
- g_error_free(error);
- if (found)
- g_list_free(found);
-
- return success;
-}
-
NativeBackendLibsecret::NativeBackendLibsecret(LocalProfileId id)
: app_string_(GetProfileSpecificAppString(id)) {
}
@@ -299,7 +172,7 @@ NativeBackendLibsecret::~NativeBackendLibsecret() {
}
bool NativeBackendLibsecret::Init() {
- return LoadLibsecret() && LibsecretIsAvailable();
+ return LibsecretLoader::EnsureLibsecretLoaded();
}
password_manager::PasswordStoreChangeList NativeBackendLibsecret::AddLogin(
@@ -373,14 +246,14 @@ bool NativeBackendLibsecret::RemoveLogin(
password_manager::PasswordStoreChangeList* changes) {
DCHECK(changes);
GError* error = nullptr;
- if (secret_password_clear_sync(
- &kLibsecretSchema, nullptr, &error,
- "origin_url", form.origin.spec().c_str(),
- "username_element", UTF16ToUTF8(form.username_element).c_str(),
- "username_value", UTF16ToUTF8(form.username_value).c_str(),
- "password_element", UTF16ToUTF8(form.password_element).c_str(),
- "signon_realm", form.signon_realm.c_str(),
- "application", app_string_.c_str(), nullptr)) {
+ if (LibsecretLoader::secret_password_clear_sync(
+ &kLibsecretSchema, nullptr, &error, "origin_url",
+ form.origin.spec().c_str(), "username_element",
+ UTF16ToUTF8(form.username_element).c_str(), "username_value",
+ UTF16ToUTF8(form.username_value).c_str(), "password_element",
+ UTF16ToUTF8(form.password_element).c_str(), "signon_realm",
+ form.signon_realm.c_str(), "application", app_string_.c_str(),
+ nullptr)) {
changes->push_back(password_manager::PasswordStoreChange(
password_manager::PasswordStoreChange::REMOVE, form));
}
@@ -443,11 +316,11 @@ bool NativeBackendLibsecret::AddUpdateLoginSearch(
attrs.Append("application", app_string_);
GError* error = nullptr;
- GList* found = secret_service_search_sync(nullptr, // default secret service
- &kLibsecretSchema, attrs.Get(),
- SECRET_SEARCH_ALL,
- nullptr, // no cancellable ojbect
- &error);
+ GList* found = LibsecretLoader::secret_service_search_sync(
+ nullptr, // default secret service
+ &kLibsecretSchema, attrs.Get(), SECRET_SEARCH_ALL,
+ nullptr, // no cancellable ojbect
+ &error);
if (error) {
LOG(ERROR) << "Unable to get logins " << error->message;
g_error_free(error);
@@ -471,7 +344,7 @@ bool NativeBackendLibsecret::RawAddLogin(const PasswordForm& form) {
SerializeFormDataToBase64String(form.form_data, &form_data);
GError* error = nullptr;
// clang-format off
- secret_password_store_sync(
+ LibsecretLoader::secret_password_store_sync(
&kLibsecretSchema,
nullptr, // Default collection.
form.origin.spec().c_str(), // Display name.
@@ -546,11 +419,11 @@ bool NativeBackendLibsecret::GetLoginsList(
attrs.Append("signon_realm", lookup_form->signon_realm);
GError* error = nullptr;
- GList* found = secret_service_search_sync(nullptr, // default secret service
- &kLibsecretSchema, attrs.Get(),
- SECRET_SEARCH_ALL,
- nullptr, // no cancellable ojbect
- &error);
+ GList* found = LibsecretLoader::secret_service_search_sync(
+ nullptr, // default secret service
+ &kLibsecretSchema, attrs.Get(), SECRET_SEARCH_ALL,
+ nullptr, // no cancellable ojbect
+ &error);
if (error) {
LOG(ERROR) << "Unable to get logins " << error->message;
g_error_free(error);
@@ -646,7 +519,7 @@ ScopedVector<autofill::PasswordForm> NativeBackendLibsecret::ConvertFormList(
error = nullptr;
continue;
}
- GHashTable* attrs = secret_item_get_attributes(secretItem);
+ GHashTable* attrs = LibsecretLoader::secret_item_get_attributes(secretItem);
std::unique_ptr<PasswordForm> form(FormOutOfAttributes(attrs));
g_hash_table_unref(attrs);
if (form) {
@@ -667,10 +540,12 @@ ScopedVector<autofill::PasswordForm> NativeBackendLibsecret::ConvertFormList(
continue;
}
}
- SecretValue* secretValue = secret_item_get_secret(secretItem);
+ SecretValue* secretValue =
+ LibsecretLoader::secret_item_get_secret(secretItem);
if (secretValue) {
- form->password_value = UTF8ToUTF16(secret_value_get_text(secretValue));
- secret_value_unref(secretValue);
+ form->password_value =
+ UTF8ToUTF16(LibsecretLoader::secret_value_get_text(secretValue));
+ LibsecretLoader::secret_value_unref(secretValue);
} else {
LOG(WARNING) << "Unable to access password from list element!";
}

Powered by Google App Engine
This is Rietveld 408576698