Index: chrome/browser/password_manager/native_backend_kwallet_x.cc |
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc |
index d7b42791d3ce9acf15a6255a773795c7033ab827..a9519aa24c013a8a05a1a4bdd0bd41f14a2c8e97 100644 |
--- a/chrome/browser/password_manager/native_backend_kwallet_x.cc |
+++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc |
@@ -26,7 +26,6 @@ |
#include "dbus/bus.h" |
#include "dbus/message.h" |
#include "dbus/object_path.h" |
-#include "dbus/object_proxy.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "url/origin.h" |
@@ -44,18 +43,6 @@ const int kPickleVersion = 8; |
// Name of the folder to store passwords in. |
const char kKWalletFolder[] = "Chrome Form Data"; |
-// DBus service, path, and interface names for klauncher and kwalletd. |
-const char kKWalletDName[] = "kwalletd"; |
-const char kKWalletD5Name[] = "kwalletd5"; |
-const char kKWalletServiceName[] = "org.kde.kwalletd"; |
-const char kKWallet5ServiceName[] = "org.kde.kwalletd5"; |
-const char kKWalletPath[] = "/modules/kwalletd"; |
-const char kKWallet5Path[] = "/modules/kwalletd5"; |
-const char kKWalletInterface[] = "org.kde.KWallet"; |
-const char kKLauncherServiceName[] = "org.kde.klauncher"; |
-const char kKLauncherPath[] = "/KLauncher"; |
-const char kKLauncherInterface[] = "org.kde.KLauncher"; |
- |
// Checks a serialized list of PasswordForms for sanity. Returns true if OK. |
// Note that |realm| is only used for generating a useful warning message. |
bool CheckSerializedValue(const uint8_t* byte_array, |
@@ -303,21 +290,12 @@ void UMALogDeserializationStatus(bool success) { |
} // namespace |
NativeBackendKWallet::NativeBackendKWallet( |
- LocalProfileId id, base::nix::DesktopEnvironment desktop_env) |
+ LocalProfileId id, |
+ base::nix::DesktopEnvironment desktop_env) |
: profile_id_(id), |
- kwallet_proxy_(nullptr), |
+ kwallet_dbus_(desktop_env), |
app_name_(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)) { |
folder_name_ = GetProfileSpecificFolderName(); |
- |
- if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE5) { |
- dbus_service_name_ = kKWallet5ServiceName; |
- dbus_path_ = kKWallet5Path; |
- kwalletd_name_ = kKWalletD5Name; |
- } else { |
- dbus_service_name_ = kKWalletServiceName; |
- dbus_path_ = kKWalletPath; |
- kwalletd_name_ = kKWalletDName; |
- } |
} |
NativeBackendKWallet::~NativeBackendKWallet() { |
@@ -327,10 +305,10 @@ NativeBackendKWallet::~NativeBackendKWallet() { |
// shut it down on the DB thread, and it will be destructed afterward when the |
// scoped_refptr<dbus::Bus> goes out of scope. The NativeBackend will be |
// destroyed before that occurs, but that's OK. |
- if (session_bus_.get()) { |
+ if (kwallet_dbus_.GetSessionBus()) { |
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
base::Bind(&dbus::Bus::ShutdownAndBlock, |
- session_bus_.get())); |
+ kwallet_dbus_.GetSessionBus())); |
} |
} |
@@ -363,115 +341,53 @@ void NativeBackendKWallet::InitOnDBThread(scoped_refptr<dbus::Bus> optional_bus, |
base::WaitableEvent* event, |
bool* success) { |
DCHECK_CURRENTLY_ON(BrowserThread::DB); |
- DCHECK(!session_bus_.get()); |
+ DCHECK(!kwallet_dbus_.GetSessionBus()); |
if (optional_bus.get()) { |
// The optional_bus parameter is given when this method is called in tests. |
- session_bus_ = optional_bus; |
+ kwallet_dbus_.SetSessionBus(optional_bus); |
} else { |
// Get a (real) connection to the session bus. |
dbus::Bus::Options options; |
options.bus_type = dbus::Bus::SESSION; |
options.connection_type = dbus::Bus::PRIVATE; |
- session_bus_ = new dbus::Bus(options); |
+ kwallet_dbus_.SetSessionBus(new dbus::Bus(options)); |
} |
- kwallet_proxy_ = |
- session_bus_->GetObjectProxy(dbus_service_name_, |
- dbus::ObjectPath(dbus_path_)); |
// kwalletd may not be running. If we get a temporary failure initializing it, |
// try to start it and then try again. (Note the short-circuit evaluation.) |
const InitResult result = InitWallet(); |
*success = (result == INIT_SUCCESS || |
- (result == TEMPORARY_FAIL && |
- StartKWalletd() && InitWallet() == INIT_SUCCESS)); |
+ (result == TEMPORARY_FAIL && kwallet_dbus_.StartKWalletd() && |
+ InitWallet() == INIT_SUCCESS)); |
event->Signal(); |
} |
-bool NativeBackendKWallet::StartKWalletd() { |
- DCHECK_CURRENTLY_ON(BrowserThread::DB); |
- // Sadly kwalletd doesn't use DBus activation, so we have to make a call to |
- // klauncher to start it. |
- dbus::ObjectProxy* klauncher = |
- session_bus_->GetObjectProxy(kKLauncherServiceName, |
- dbus::ObjectPath(kKLauncherPath)); |
- |
- dbus::MethodCall method_call(kKLauncherInterface, |
- "start_service_by_desktop_name"); |
- dbus::MessageWriter builder(&method_call); |
- std::vector<std::string> empty; |
- builder.AppendString(kwalletd_name_); // serviceName |
- builder.AppendArrayOfStrings(empty); // urls |
- builder.AppendArrayOfStrings(empty); // envs |
- builder.AppendString(std::string()); // startup_id |
- builder.AppendBool(false); // blind |
- std::unique_ptr<dbus::Response> response(klauncher->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting klauncher to start " << kwalletd_name_; |
- return false; |
- } |
- dbus::MessageReader reader(response.get()); |
- int32_t ret = -1; |
- std::string dbus_name; |
- std::string error; |
- int32_t pid = -1; |
- if (!reader.PopInt32(&ret) || !reader.PopString(&dbus_name) || |
- !reader.PopString(&error) || !reader.PopInt32(&pid)) { |
- LOG(ERROR) << "Error reading response from klauncher to start " |
- << kwalletd_name_ << ": " << response->ToString(); |
- return false; |
- } |
- if (!error.empty() || ret) { |
- LOG(ERROR) << "Error launching " << kwalletd_name_ << ": error '" << error |
- << "' (code " << ret << ")"; |
- return false; |
- } |
- |
- return true; |
-} |
- |
NativeBackendKWallet::InitResult NativeBackendKWallet::InitWallet() { |
DCHECK_CURRENTLY_ON(BrowserThread::DB); |
- { |
- // Check that KWallet is enabled. |
- dbus::MethodCall method_call(kKWalletInterface, "isEnabled"); |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (isEnabled)"; |
+ |
+ // Check that KWallet is enabled. |
+ bool enabled = false; |
+ KWalletDBus::Error error = kwallet_dbus_.IsEnabled(&enabled); |
+ switch (error) { |
+ case KWalletDBus::Error::CANNOT_CONTACT: |
return TEMPORARY_FAIL; |
- } |
- dbus::MessageReader reader(response.get()); |
- bool enabled = false; |
- if (!reader.PopBool(&enabled)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (isEnabled): " << response->ToString(); |
+ case KWalletDBus::Error::CANNOT_READ: |
return PERMANENT_FAIL; |
- } |
- // Not enabled? Don't use KWallet. But also don't warn here. |
- if (!enabled) { |
- VLOG(1) << kwalletd_name_ << " reports that KWallet is not enabled."; |
- return PERMANENT_FAIL; |
- } |
+ case KWalletDBus::Error::SUCCESS: |
+ break; |
} |
+ if (!enabled) |
+ return PERMANENT_FAIL; |
- { |
- // Get the wallet name. |
- dbus::MethodCall method_call(kKWalletInterface, "networkWallet"); |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (networkWallet)"; |
+ // Get the wallet name. |
+ error = kwallet_dbus_.NetworkWallet(&wallet_name_); |
+ switch (error) { |
+ case KWalletDBus::Error::CANNOT_CONTACT: |
return TEMPORARY_FAIL; |
- } |
- dbus::MessageReader reader(response.get()); |
- if (!reader.PopString(&wallet_name_)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (networkWallet): " << response->ToString(); |
+ case KWalletDBus::Error::CANNOT_READ: |
return PERMANENT_FAIL; |
- } |
+ case KWalletDBus::Error::SUCCESS: |
+ return INIT_SUCCESS; |
} |
- |
- return INIT_SUCCESS; |
} |
password_manager::PasswordStoreChangeList NativeBackendKWallet::AddLogin( |
@@ -638,68 +554,33 @@ bool NativeBackendKWallet::GetLoginsList( |
ScopedVector<autofill::PasswordForm>* forms) { |
forms->clear(); |
// Is there an entry in the wallet? |
- { |
- dbus::MethodCall method_call(kKWalletInterface, "hasEntry"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(signon_realm); // key |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (hasEntry)"; |
- return false; |
- } |
- dbus::MessageReader reader(response.get()); |
- bool has_entry = false; |
- if (!reader.PopBool(&has_entry)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (hasEntry): " << response->ToString(); |
- return false; |
- } |
- if (!has_entry) { |
- // This is not an error. There just isn't a matching entry. |
- return true; |
- } |
- } |
- |
- { |
- dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(signon_realm); // key |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (readEntry)"; |
- return false; |
- } |
- dbus::MessageReader reader(response.get()); |
- const uint8_t* bytes = nullptr; |
- size_t length = 0; |
- if (!reader.PopArrayOfBytes(&bytes, &length)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (readEntry): " << response->ToString(); |
- return false; |
- } |
- if (!bytes) |
- return false; |
- if (!CheckSerializedValue(bytes, length, signon_realm)) { |
- // This is weird, but we choose not to call it an error. There is an |
- // invalid entry somehow, but by just ignoring it, we make it easier to |
- // repair without having to delete it using kwalletmanager (that is, by |
- // just saving a new password within this realm to overwrite it). |
- return true; |
- } |
+ bool has_entry = false; |
+ KWalletDBus::Error error = kwallet_dbus_.HasEntry( |
+ wallet_handle, folder_name_, signon_realm, app_name_, &has_entry); |
+ if (error) |
+ return false; |
+ if (!has_entry) |
+ return true; |
- // Can't we all just agree on whether bytes are signed or not? Please? |
- base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
- *forms = DeserializeValue(signon_realm, pickle); |
+ std::vector<uint8_t> bytes; |
+ error = kwallet_dbus_.ReadEntry(wallet_handle, folder_name_, signon_realm, |
+ app_name_, &bytes); |
+ if (error) |
+ return false; |
+ if (!bytes.empty() && |
+ !CheckSerializedValue(bytes.data(), bytes.size(), signon_realm)) { |
+ // This is weird, but we choose not to call it an error. There is an |
+ // invalid entry somehow, but by just ignoring it, we make it easier to |
+ // repair without having to delete it using kwalletmanager (that is, by |
+ // just saving a new password within this realm to overwrite it). |
+ return true; |
} |
+ // Can't we all just agree on whether bytes are signed or not? Please? |
+ base::Pickle pickle(reinterpret_cast<const char*>(bytes.data()), |
+ bytes.size()); |
+ *forms = DeserializeValue(signon_realm, pickle); |
+ |
return true; |
} |
@@ -754,53 +635,25 @@ bool NativeBackendKWallet::GetAllLoginsInternal( |
ScopedVector<autofill::PasswordForm>* forms) { |
// We could probably also use readEntryList here. |
std::vector<std::string> realm_list; |
- { |
- dbus::MethodCall method_call(kKWalletInterface, "entryList"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (entryList)"; |
- return false; |
- } |
- dbus::MessageReader reader(response.get()); |
- if (!reader.PopArrayOfStrings(&realm_list)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << "(entryList): " << response->ToString(); |
- return false; |
- } |
- } |
+ KWalletDBus::Error error = kwallet_dbus_.EntryList( |
+ wallet_handle, folder_name_, app_name_, &realm_list); |
+ if (error) |
+ return false; |
forms->clear(); |
for (const std::string& signon_realm : realm_list) { |
- dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(signon_realm); // key |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << "(readEntry)"; |
- return false; |
- } |
- dbus::MessageReader reader(response.get()); |
- const uint8_t* bytes = nullptr; |
- size_t length = 0; |
- if (!reader.PopArrayOfBytes(&bytes, &length)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (readEntry): " << response->ToString(); |
+ std::vector<uint8_t> bytes; |
+ KWalletDBus::Error error = kwallet_dbus_.ReadEntry( |
+ wallet_handle, folder_name_, signon_realm, app_name_, &bytes); |
+ if (error) |
return false; |
- } |
- if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) |
+ if (bytes.empty() || |
+ !CheckSerializedValue(bytes.data(), bytes.size(), signon_realm)) |
continue; |
// Can't we all just agree on whether bytes are signed or not? Please? |
- base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
+ base::Pickle pickle(reinterpret_cast<const char*>(bytes.data()), |
+ bytes.size()); |
AppendSecondToFirst(forms, DeserializeValue(signon_realm, pickle)); |
} |
return true; |
@@ -811,26 +664,11 @@ bool NativeBackendKWallet::SetLoginsList( |
const std::string& signon_realm, |
int wallet_handle) { |
if (forms.empty()) { |
- // No items left? Remove the entry from the wallet. |
- dbus::MethodCall method_call(kKWalletInterface, "removeEntry"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(signon_realm); // key |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (removeEntry)"; |
- return kInvalidKWalletHandle; |
- } |
- dbus::MessageReader reader(response.get()); |
int ret = 0; |
- if (!reader.PopInt32(&ret)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (removeEntry): " << response->ToString(); |
+ KWalletDBus::Error error = kwallet_dbus_.RemoveEntry( |
+ wallet_handle, folder_name_, signon_realm, app_name_, &ret); |
+ if (error) |
return false; |
- } |
if (ret != 0) |
LOG(ERROR) << "Bad return code " << ret << " from KWallet removeEntry"; |
return ret == 0; |
@@ -839,27 +677,12 @@ bool NativeBackendKWallet::SetLoginsList( |
base::Pickle value; |
SerializeValue(forms, &value); |
- dbus::MethodCall method_call(kKWalletInterface, "writeEntry"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(signon_realm); // key |
- builder.AppendArrayOfBytes(static_cast<const uint8_t*>(value.data()), |
- value.size()); // value |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (writeEntry)"; |
- return kInvalidKWalletHandle; |
- } |
- dbus::MessageReader reader(response.get()); |
int ret = 0; |
- if (!reader.PopInt32(&ret)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (writeEntry): " << response->ToString(); |
+ KWalletDBus::Error error = kwallet_dbus_.WriteEntry( |
+ wallet_handle, folder_name_, signon_realm, app_name_, |
+ static_cast<const uint8_t*>(value.data()), value.size(), &ret); |
+ if (error) |
return false; |
- } |
if (ret != 0) |
LOG(ERROR) << "Bad return code " << ret << " from KWallet writeEntry"; |
return ret == 0; |
@@ -878,64 +701,27 @@ bool NativeBackendKWallet::RemoveLoginsBetween( |
// We could probably also use readEntryList here. |
std::vector<std::string> realm_list; |
- { |
- dbus::MethodCall method_call(kKWalletInterface, "entryList"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (entryList)"; |
- return false; |
- } |
- dbus::MessageReader reader(response.get()); |
- dbus::MessageReader array(response.get()); |
- if (!reader.PopArray(&array)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (entryList): " << response->ToString(); |
- return false; |
- } |
- while (array.HasMoreData()) { |
- std::string realm; |
- if (!array.PopString(&realm)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (entryList): " << response->ToString(); |
- return false; |
- } |
- realm_list.push_back(realm); |
- } |
- } |
+ KWalletDBus::Error error = kwallet_dbus_.EntryList( |
+ wallet_handle, folder_name_, app_name_, &realm_list); |
+ if (error) |
+ return false; |
bool ok = true; |
for (size_t i = 0; i < realm_list.size(); ++i) { |
const std::string& signon_realm = realm_list[i]; |
- dbus::MethodCall method_call(kKWalletInterface, "readEntry"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(wallet_handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(signon_realm); // key |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (readEntry)"; |
- continue; |
- } |
- dbus::MessageReader reader(response.get()); |
- const uint8_t* bytes = nullptr; |
- size_t length = 0; |
- if (!reader.PopArrayOfBytes(&bytes, &length)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (readEntry): " << response->ToString(); |
+ |
+ std::vector<uint8_t> bytes; |
+ KWalletDBus::Error error = kwallet_dbus_.ReadEntry( |
+ wallet_handle, folder_name_, signon_realm, app_name_, &bytes); |
+ if (error) |
continue; |
- } |
- if (!bytes || !CheckSerializedValue(bytes, length, signon_realm)) |
+ if (bytes.size() == 0 || |
+ !CheckSerializedValue(bytes.data(), bytes.size(), signon_realm)) |
continue; |
// Can't we all just agree on whether bytes are signed or not? Please? |
- base::Pickle pickle(reinterpret_cast<const char*>(bytes), length); |
+ base::Pickle pickle(reinterpret_cast<const char*>(bytes.data()), |
+ bytes.size()); |
ScopedVector<autofill::PasswordForm> all_forms = |
DeserializeValue(signon_realm, pickle); |
@@ -1008,73 +794,28 @@ int NativeBackendKWallet::WalletHandle() { |
// Open the wallet. |
// TODO(mdm): Are we leaking these handles? Find out. |
int32_t handle = kInvalidKWalletHandle; |
- { |
- dbus::MethodCall method_call(kKWalletInterface, "open"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendString(wallet_name_); // wallet |
- builder.AppendInt64(0); // wid |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (open)"; |
- return kInvalidKWalletHandle; |
- } |
- dbus::MessageReader reader(response.get()); |
- if (!reader.PopInt32(&handle)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (open): " << response->ToString(); |
- return kInvalidKWalletHandle; |
- } |
- if (handle == kInvalidKWalletHandle) { |
- LOG(ERROR) << "Error obtaining KWallet handle"; |
- return kInvalidKWalletHandle; |
- } |
+ KWalletDBus::Error error = |
+ kwallet_dbus_.Open(wallet_name_, app_name_, &handle); |
+ if (error) |
+ return kInvalidKWalletHandle; |
+ if (handle == kInvalidKWalletHandle) { |
+ LOG(ERROR) << "Error obtaining KWallet handle"; |
+ return kInvalidKWalletHandle; |
} |
// Check if our folder exists. |
bool has_folder = false; |
- { |
- dbus::MethodCall method_call(kKWalletInterface, "hasFolder"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting " << kwalletd_name_ << " (hasFolder)"; |
- return kInvalidKWalletHandle; |
- } |
- dbus::MessageReader reader(response.get()); |
- if (!reader.PopBool(&has_folder)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (hasFolder): " << response->ToString(); |
- return kInvalidKWalletHandle; |
- } |
- } |
+ error = kwallet_dbus_.HasFolder(handle, folder_name_, app_name_, &has_folder); |
+ if (error) |
+ return kInvalidKWalletHandle; |
// Create it if it didn't. |
if (!has_folder) { |
- dbus::MethodCall method_call(kKWalletInterface, "createFolder"); |
- dbus::MessageWriter builder(&method_call); |
- builder.AppendInt32(handle); // handle |
- builder.AppendString(folder_name_); // folder |
- builder.AppendString(app_name_); // appid |
- std::unique_ptr<dbus::Response> response(kwallet_proxy_->CallMethodAndBlock( |
- &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
- if (!response.get()) { |
- LOG(ERROR) << "Error contacting << " << kwalletd_name_ |
- << " (createFolder)"; |
- return kInvalidKWalletHandle; |
- } |
- dbus::MessageReader reader(response.get()); |
bool success = false; |
- if (!reader.PopBool(&success)) { |
- LOG(ERROR) << "Error reading response from " << kwalletd_name_ |
- << " (createFolder): " << response->ToString(); |
+ error = |
+ kwallet_dbus_.CreateFolder(handle, folder_name_, app_name_, &success); |
+ if (error) |
return kInvalidKWalletHandle; |
- } |
if (!success) { |
LOG(ERROR) << "Error creating KWallet folder"; |
return kInvalidKWalletHandle; |