| Index: chrome/browser/password_manager/password_store_kwallet.cc
|
| diff --git a/chrome/browser/password_manager/password_store_kwallet.cc b/chrome/browser/password_manager/password_store_kwallet.cc
|
| deleted file mode 100644
|
| index 1c50e3e993dd42e7ab86664f00c86702b3a8aa01..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/password_manager/password_store_kwallet.cc
|
| +++ /dev/null
|
| @@ -1,387 +0,0 @@
|
| -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/password_manager/password_store_kwallet.h"
|
| -
|
| -#include <sstream>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/md5.h"
|
| -#include "base/pickle.h"
|
| -#include "base/string_util.h"
|
| -#include "base/task.h"
|
| -
|
| -using std::string;
|
| -using std::vector;
|
| -
|
| -const char* PasswordStoreKWallet::kAppId = "Chrome";
|
| -const char* PasswordStoreKWallet::kKWalletFolder = "Chrome Form Data";
|
| -
|
| -const char* PasswordStoreKWallet::kKWalletServiceName = "org.kde.kwalletd";
|
| -const char* PasswordStoreKWallet::kKWalletPath = "/modules/kwalletd";
|
| -const char* PasswordStoreKWallet::kKWalletInterface = "org.kde.KWallet";
|
| -const char* PasswordStoreKWallet::kKLauncherServiceName = "org.kde.klauncher";
|
| -const char* PasswordStoreKWallet::kKLauncherPath = "/KLauncher";
|
| -const char* PasswordStoreKWallet::kKLauncherInterface = "org.kde.KLauncher";
|
| -
|
| -PasswordStoreKWallet::PasswordStoreKWallet()
|
| - : error_(NULL),
|
| - connection_(NULL),
|
| - proxy_(NULL) {
|
| -}
|
| -
|
| -PasswordStoreKWallet::~PasswordStoreKWallet() {
|
| - if (proxy_) {
|
| - g_object_unref(proxy_);
|
| - }
|
| -}
|
| -
|
| -bool PasswordStoreKWallet::Init() {
|
| - thread_.reset(new base::Thread("Chrome_KeyringThread"));
|
| -
|
| - if (!thread_->Start()) {
|
| - thread_.reset(NULL);
|
| - return false;
|
| - }
|
| -
|
| - // Initialize threading in dbus-glib - it should be fine for
|
| - // dbus_g_thread_init to be called multiple times.
|
| - if (!g_thread_supported())
|
| - g_thread_init(NULL);
|
| - dbus_g_thread_init();
|
| -
|
| - // Get a connection to the session bus.
|
| - connection_ = dbus_g_bus_get(DBUS_BUS_SESSION, &error_);
|
| - if (CheckError())
|
| - return false;
|
| -
|
| - if (!StartKWalletd()) return false;
|
| - if (!InitWallet()) return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool PasswordStoreKWallet::StartKWalletd() {
|
| - // Sadly kwalletd doesn't use DBUS activation, so we have to make a call to
|
| - // klauncher to start it.
|
| - DBusGProxy* klauncher_proxy =
|
| - dbus_g_proxy_new_for_name(connection_, kKLauncherServiceName,
|
| - kKLauncherPath, kKLauncherInterface);
|
| -
|
| - char* empty_string_list = NULL;
|
| - int ret = 1;
|
| - char* error = NULL;
|
| - dbus_g_proxy_call(klauncher_proxy, "start_service_by_desktop_name", &error_,
|
| - G_TYPE_STRING, "kwalletd", // serviceName
|
| - G_TYPE_STRV, &empty_string_list, // urls
|
| - G_TYPE_STRV, &empty_string_list, // envs
|
| - G_TYPE_STRING, "", // startup_id
|
| - G_TYPE_BOOLEAN, (gboolean) false, // blind
|
| - G_TYPE_INVALID,
|
| - G_TYPE_INT, &ret, // result
|
| - G_TYPE_STRING, NULL, // dubsName
|
| - G_TYPE_STRING, &error, // error
|
| - G_TYPE_INT, NULL, // pid
|
| - G_TYPE_INVALID);
|
| -
|
| - if (error && *error) {
|
| - LOG(ERROR) << "Error launching kwalletd: " << error;
|
| - ret = 1; // Make sure we return false after freeing.
|
| - }
|
| -
|
| - g_free(error);
|
| - g_object_unref(klauncher_proxy);
|
| -
|
| - if (CheckError() || ret != 0)
|
| - return false;
|
| - return true;
|
| -}
|
| -
|
| -bool PasswordStoreKWallet::InitWallet() {
|
| - // Make a proxy to KWallet.
|
| - proxy_ = dbus_g_proxy_new_for_name(connection_, kKWalletServiceName,
|
| - kKWalletPath, kKWalletInterface);
|
| -
|
| - // Check KWallet is enabled.
|
| - gboolean is_enabled = false;
|
| - dbus_g_proxy_call(proxy_, "isEnabled", &error_,
|
| - G_TYPE_INVALID,
|
| - G_TYPE_BOOLEAN, &is_enabled,
|
| - G_TYPE_INVALID);
|
| - if (CheckError() || !is_enabled)
|
| - return false;
|
| -
|
| - // Get the wallet name.
|
| - char* wallet_name = NULL;
|
| - dbus_g_proxy_call(proxy_, "networkWallet", &error_,
|
| - G_TYPE_INVALID,
|
| - G_TYPE_STRING, &wallet_name,
|
| - G_TYPE_INVALID);
|
| - if (CheckError() || !wallet_name)
|
| - return false;
|
| -
|
| - wallet_name_.assign(wallet_name);
|
| - g_free(wallet_name);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void PasswordStoreKWallet::AddLoginImpl(const PasswordForm& form) {
|
| - AutoLock l(kwallet_lock_);
|
| - int wallet_handle = WalletHandle();
|
| - if (wallet_handle == kInvalidKWalletHandle)
|
| - return;
|
| -
|
| - PasswordFormList forms;
|
| - GetLoginsList(&forms, form, wallet_handle);
|
| -
|
| - forms.push_back(const_cast<PasswordForm*>(&form));
|
| -
|
| - SetLoginsList(forms, form, wallet_handle);
|
| -}
|
| -
|
| -void PasswordStoreKWallet::UpdateLoginImpl(const PasswordForm& form) {
|
| - AutoLock l(kwallet_lock_);
|
| - int wallet_handle = WalletHandle();
|
| - if (wallet_handle == kInvalidKWalletHandle)
|
| - return;
|
| -
|
| - PasswordFormList forms;
|
| - GetLoginsList(&forms, form, wallet_handle);
|
| -
|
| - for (uint i = 0; i < forms.size(); ++i) {
|
| - if (CompareForms(form, *forms[i])) {
|
| - forms.erase(forms.begin() + i);
|
| - forms.insert(forms.begin() + i, const_cast<PasswordForm*>(&form));
|
| - }
|
| - }
|
| -
|
| - SetLoginsList(forms, form, wallet_handle);
|
| -}
|
| -
|
| -void PasswordStoreKWallet::RemoveLoginImpl(const PasswordForm& form) {
|
| - AutoLock l(kwallet_lock_);
|
| - int wallet_handle = WalletHandle();
|
| - if (wallet_handle == kInvalidKWalletHandle)
|
| - return;
|
| -
|
| - PasswordFormList forms;
|
| - GetLoginsList(&forms, form, wallet_handle);
|
| -
|
| - for (uint i = 0; i < forms.size(); ++i) {
|
| - if (CompareForms(form, *forms[i])) {
|
| - forms.erase(forms.begin() + i);
|
| - --i;
|
| - }
|
| - }
|
| -
|
| - if (forms.empty()) {
|
| - // No items left? Remove the entry from the wallet.
|
| - int ret = 0;
|
| - dbus_g_proxy_call(proxy_, "removeEntry", &error_,
|
| - G_TYPE_INT, wallet_handle, // handle
|
| - G_TYPE_STRING, kKWalletFolder, // folder
|
| - G_TYPE_STRING, form.signon_realm.c_str(), // key
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - G_TYPE_INT, &ret,
|
| - G_TYPE_INVALID);
|
| - CheckError();
|
| - if (ret)
|
| - LOG(ERROR) << "Bad return code " << ret << " from kwallet removeEntry";
|
| - } else {
|
| - // Otherwise update the entry in the wallet.
|
| - SetLoginsList(forms, form, wallet_handle);
|
| - }
|
| -}
|
| -
|
| -void PasswordStoreKWallet::GetLoginsImpl(GetLoginsRequest* request) {
|
| - PasswordFormList forms;
|
| -
|
| - AutoLock l(kwallet_lock_);
|
| - int wallet_handle = WalletHandle();
|
| - if (wallet_handle != kInvalidKWalletHandle)
|
| - GetLoginsList(&forms, request->form, wallet_handle);
|
| -
|
| - NotifyConsumer(request, forms);
|
| -}
|
| -
|
| -void PasswordStoreKWallet::GetLoginsList(PasswordFormList* forms,
|
| - const PasswordForm& key,
|
| - int wallet_handle) {
|
| - // Is there an entry in the wallet?
|
| - gboolean has_entry = false;
|
| - dbus_g_proxy_call(proxy_, "hasEntry", &error_,
|
| - G_TYPE_INT, wallet_handle, // handle
|
| - G_TYPE_STRING, kKWalletFolder, // folder
|
| - G_TYPE_STRING, key.signon_realm.c_str(), // key
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - G_TYPE_BOOLEAN, &has_entry,
|
| - G_TYPE_INVALID);
|
| -
|
| - if (CheckError() || !has_entry)
|
| - return;
|
| -
|
| - GArray* byte_array = NULL;
|
| - dbus_g_proxy_call(proxy_, "readEntry", &error_,
|
| - G_TYPE_INT, wallet_handle, // handle
|
| - G_TYPE_STRING, kKWalletFolder, // folder
|
| - G_TYPE_STRING, key.signon_realm.c_str(), // key
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - DBUS_TYPE_G_UCHAR_ARRAY, &byte_array,
|
| - G_TYPE_INVALID);
|
| -
|
| - if (CheckError() || !byte_array || !byte_array->len)
|
| - return;
|
| -
|
| - Pickle pickle(byte_array->data, byte_array->len);
|
| - DeserializeValue(key, pickle, forms);
|
| -}
|
| -
|
| -void PasswordStoreKWallet::SetLoginsList(const PasswordFormList& forms,
|
| - const PasswordForm& key,
|
| - int wallet_handle) {
|
| - Pickle value;
|
| - SerializeValue(forms, &value);
|
| -
|
| - // Convert the pickled bytes to a GByteArray.
|
| - GArray* byte_array = g_array_sized_new(false, false, sizeof(char),
|
| - value.size());
|
| - g_array_append_vals(byte_array, value.data(), value.size());
|
| -
|
| - // Make the call.
|
| - int ret = 0;
|
| - dbus_g_proxy_call(proxy_, "writeEntry", &error_,
|
| - G_TYPE_INT, wallet_handle, // handle
|
| - G_TYPE_STRING, kKWalletFolder, // folder
|
| - G_TYPE_STRING, key.signon_realm.c_str(), // key
|
| - DBUS_TYPE_G_UCHAR_ARRAY, byte_array, // value
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - G_TYPE_INT, &ret,
|
| - G_TYPE_INVALID);
|
| - g_array_free(byte_array, true);
|
| -
|
| - CheckError();
|
| - if (ret)
|
| - LOG(ERROR) << "Bad return code " << ret << " from kwallet writeEntry";
|
| -}
|
| -
|
| -bool PasswordStoreKWallet::CompareForms(const PasswordForm& a,
|
| - const PasswordForm& b) {
|
| - return a.origin == b.origin &&
|
| - a.password_element == b.password_element &&
|
| - a.signon_realm == b.signon_realm &&
|
| - a.submit_element == b.submit_element &&
|
| - a.username_element == b.username_element &&
|
| - a.username_value == b.username_value;
|
| -}
|
| -
|
| -void PasswordStoreKWallet::SerializeValue(const PasswordFormList& forms,
|
| - Pickle* pickle) {
|
| - pickle->WriteInt(forms.size());
|
| - for (PasswordFormList::const_iterator it = forms.begin() ;
|
| - it != forms.end() ; ++it) {
|
| - const PasswordForm* form = *it;
|
| - pickle->WriteInt(form->scheme);
|
| - pickle->WriteString(form->origin.spec());
|
| - pickle->WriteString(form->action.spec());
|
| - pickle->WriteWString(form->username_element);
|
| - pickle->WriteWString(form->username_value);
|
| - pickle->WriteWString(form->password_element);
|
| - pickle->WriteWString(form->password_value);
|
| - pickle->WriteWString(form->submit_element);
|
| - pickle->WriteBool(form->ssl_valid);
|
| - pickle->WriteBool(form->preferred);
|
| - pickle->WriteBool(form->blacklisted_by_user);
|
| - }
|
| -}
|
| -
|
| -void PasswordStoreKWallet::DeserializeValue(const PasswordForm& key,
|
| - const Pickle& pickle,
|
| - PasswordFormList* forms) {
|
| - void* iter = NULL;
|
| -
|
| - int count = 0;
|
| - pickle.ReadInt(&iter, &count);
|
| -
|
| - for (int i = 0; i < count; ++i) {
|
| - PasswordForm* form = new PasswordForm();
|
| - form->signon_realm.assign(key.signon_realm);
|
| -
|
| - pickle.ReadInt(&iter, reinterpret_cast<int*>(&form->scheme));
|
| - ReadGURL(pickle, &iter, &form->origin);
|
| - ReadGURL(pickle, &iter, &form->action);
|
| - pickle.ReadWString(&iter, &form->username_element);
|
| - pickle.ReadWString(&iter, &form->username_value);
|
| - pickle.ReadWString(&iter, &form->password_element);
|
| - pickle.ReadWString(&iter, &form->password_value);
|
| - pickle.ReadWString(&iter, &form->submit_element);
|
| - pickle.ReadBool(&iter, &form->ssl_valid);
|
| - pickle.ReadBool(&iter, &form->preferred);
|
| - pickle.ReadBool(&iter, &form->blacklisted_by_user);
|
| - forms->push_back(form);
|
| - }
|
| -}
|
| -
|
| -void PasswordStoreKWallet::ReadGURL(const Pickle& pickle, void** iter,
|
| - GURL* url) {
|
| - string url_string;
|
| - pickle.ReadString(iter, &url_string);
|
| - *url = GURL(url_string);
|
| -}
|
| -
|
| -bool PasswordStoreKWallet::CheckError() {
|
| - if (error_) {
|
| - LOG(ERROR) << "Failed to complete KWallet call: " << error_->message;
|
| - g_error_free(error_);
|
| - error_ = NULL;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -int PasswordStoreKWallet::WalletHandle() {
|
| - // Open the wallet.
|
| - int handle = kInvalidKWalletHandle;
|
| - dbus_g_proxy_call(proxy_, "open", &error_,
|
| - G_TYPE_STRING, wallet_name_.c_str(), // wallet
|
| - G_TYPE_INT64, 0LL, // wid
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - G_TYPE_INT, &handle,
|
| - G_TYPE_INVALID);
|
| - if (CheckError() || handle == kInvalidKWalletHandle)
|
| - return kInvalidKWalletHandle;
|
| -
|
| - // Check if our folder exists.
|
| - gboolean has_folder = false;
|
| - dbus_g_proxy_call(proxy_, "hasFolder", &error_,
|
| - G_TYPE_INT, handle, // handle
|
| - G_TYPE_STRING, kKWalletFolder, // folder
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - G_TYPE_BOOLEAN, &has_folder,
|
| - G_TYPE_INVALID);
|
| - if (CheckError())
|
| - return kInvalidKWalletHandle;
|
| -
|
| - // Create it if it didn't.
|
| - if (!has_folder) {
|
| - gboolean success = false;
|
| - dbus_g_proxy_call(proxy_, "createFolder", &error_,
|
| - G_TYPE_INT, handle, // handle
|
| - G_TYPE_STRING, kKWalletFolder, // folder
|
| - G_TYPE_STRING, kAppId, // appid
|
| - G_TYPE_INVALID,
|
| - G_TYPE_BOOLEAN, &success,
|
| - G_TYPE_INVALID);
|
| - if (CheckError() || !success)
|
| - return kInvalidKWalletHandle;
|
| - }
|
| -
|
| - return handle;
|
| -}
|
|
|