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..5604ac47ac0cc4f92a6b8e5bfb308d356b060918 100644 |
--- a/chrome/browser/password_manager/native_backend_libsecret.cc |
+++ b/chrome/browser/password_manager/native_backend_libsecret.cc |
@@ -4,7 +4,6 @@ |
#include "chrome/browser/password_manager/native_backend_libsecret.h" |
-#include <dlfcn.h> |
#include <stddef.h> |
#include <stdint.h> |
@@ -14,6 +13,8 @@ |
#include <utility> |
#include <vector> |
+#include <libsecret/secret.h> |
+ |
#include "base/logging.h" |
#include "base/metrics/histogram.h" |
#include "base/strings/string_number_conversions.h" |
@@ -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)) { |
} |