Remove chromeos_cryptohome.cc BUG=chromium-os:16552 TEST=gmerge libcros Change-Id: I2e2240075d5ea3f9045df271263d2afabcb76e6f Reviewed-on: https://gerrit.chromium.org/gerrit/16934 Reviewed-by: Satoru Takabayashi <satorux@chromium.org> Tested-by: Ryo Hashimoto <hashimoto@chromium.org> Commit-Ready: Ryo Hashimoto <hashimoto@chromium.org>
diff --git a/SConstruct.chromiumos b/SConstruct.chromiumos index fd413d1..0acac05 100644 --- a/SConstruct.chromiumos +++ b/SConstruct.chromiumos
@@ -65,7 +65,6 @@ base_env.Append(LINKFLAGS=Split('-fPIC')) SOURCES = Split('''\ - chromeos_cryptohome.cc chromeos_network.cc marshal.glibmarshal.c version_check.cc
diff --git a/chromeos_cros_api.h b/chromeos_cros_api.h index 97b5978..ca6a749 100644 --- a/chromeos_cros_api.h +++ b/chromeos_cros_api.h
@@ -364,12 +364,29 @@ // CryptohomeInstallAttributesIsInvalid, // CryptohomeInstallAttributesIsFirstInstall, CryptohomeFreeString // CryptohomeMonitorSession. +// 197: Removed CryptohomeAsyncCheckKey, CryptohomeAsyncMigrateKey, +// CryptohomeAsyncMountGuest, CryptohomeAsyncMountSafe, +// CryptohomeAsyncRemove, CryptohomeAsyncSetOwnerUser, +// CryptohomeFreeString, CryptohomeGetStatusString, +// CryptohomeGetStatusStringSafe, CryptohomeGetSystemSaltSafe, +// CryptohomeInstallAttributesFinalize, CryptohomeInstallAttributesGet, +// CryptohomeInstallAttributesIsFirstInstall, +// CryptohomeInstallAttributesIsInvalid, +// CryptohomeInstallAttributesIsReady, CryptohomeInstallAttributesSet, +// CryptohomeIsMounted, CryptohomeMonitorSession, +// CryptohomePkcs11GetTpmTokenInfo, +// CryptohomePkcs11GetTmpTokenReadyForUser, +// CryptohomePkcs11IsTpmTokenReady, +// CryptohomePkcs11IsTmpTokenReadyForUser, +// CryptohomeTpmCanAttemptOwnership, CryptohomeTpmClearStoredPassword, +// CryptohomeTpmGetPasswordSafe, CryptohomeTpmIsBeingOwned, +// CryptohomeTpmIsEnabled, CryptohomeTpmIsOwned, CryptohomeTpmIsReady. namespace chromeos { // NOLINT enum CrosAPIVersion { - kCrosAPIMinVersion = 191, - kCrosAPIVersion = 196 + kCrosAPIMinVersion = 196, + kCrosAPIVersion = 197 }; // Default path to pass to LoadCros: "/opt/google/chrome/chromeos/libcros.so"
diff --git a/chromeos_cryptohome.cc b/chromeos_cryptohome.cc deleted file mode 100644 index 52e10e4..0000000 --- a/chromeos_cryptohome.cc +++ /dev/null
@@ -1,838 +0,0 @@ -// Copyright (c) 2012 The Chromium OS 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 <string> -#include <vector> - -#include <base/basictypes.h> -#include <base/string_util.h> -#include <dbus/dbus-glib-lowlevel.h> -#include <chromeos/dbus/dbus.h> -#include <chromeos/dbus/service_constants.h> -#include <chromeos/glib/object.h> - -namespace chromeos { // NOLINT - -struct CryptohomeAsyncCallStatus { - int async_id; - bool return_status; - int return_code; -}; - -typedef void(*CryptohomeSignalCallback)( - const CryptohomeAsyncCallStatus& call_status, void* callback_context); - -extern "C" -int ChromeOSCryptohomeAsyncCheckKey(const char* user_email, const char* key) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gint async_call_id = 0; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeAsyncCheckKey, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - user_email, - G_TYPE_STRING, - key, - G_TYPE_INVALID, - G_TYPE_INT, - &async_call_id, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeAsyncCheckKey << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - return async_call_id; -} - -extern "C" -int ChromeOSCryptohomeAsyncMigrateKey(const char* user_email, - const char* from_key, - const char* to_key) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gint async_call_id = 0; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeAsyncMigrateKey, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - user_email, - G_TYPE_STRING, - from_key, - G_TYPE_STRING, - to_key, - G_TYPE_INVALID, - G_TYPE_INT, - &async_call_id, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeAsyncMigrateKey << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - return async_call_id; -} - -extern "C" -int ChromeOSCryptohomeAsyncRemove(const char* user_email) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gint async_call_id = 0; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeAsyncRemove, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - user_email, - G_TYPE_INVALID, - G_TYPE_INT, - &async_call_id, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeAsyncRemove << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - return async_call_id; -} - -extern "C" -bool ChromeOSCryptohomeGetSystemSaltSafe(char** salt, int* length) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - GArray* dbus_salt; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeGetSystemSalt, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - DBUS_TYPE_G_UCHAR_ARRAY, - &dbus_salt, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeGetSystemSalt << " failed: " - << (error->message ? error->message : "Unknown Error."); - return false; - } - char* local_salt = static_cast<char*>(g_malloc(dbus_salt->len)); - if (local_salt) { - memcpy(local_salt, static_cast<const void*>(dbus_salt->data), - dbus_salt->len); - *salt = local_salt; - *length = dbus_salt->len; - g_array_free(dbus_salt, false); - return true; - } - g_array_free(dbus_salt, false); - return false; -} - -extern "C" -bool ChromeOSCryptohomeIsMounted() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeIsMounted, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - - LOG(FATAL) << cryptohome::kCryptohomeIsMounted << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return done; -} - -gchar** ChromeOSCryptohomeCopyStringArray( - const std::vector<std::string>& input_array) { - gchar** return_array = g_new(gchar*, input_array.size() + 1); - if (!return_array) { - return NULL; - } - int i = 0; - for (std::vector<std::string>::const_iterator itr = input_array.begin(); - itr != input_array.end(); - itr++, i++) { - return_array[i] = g_strdup((*itr).c_str()); - if (!return_array[i]) { - // return_array is automatically NULL-terminated in this case - g_strfreev(return_array); - return NULL; - } - } - return_array[i] = NULL; - return return_array; -} - -extern "C" -int ChromeOSCryptohomeAsyncMountSafe( - const char* user_email, - const char* key, - bool create_if_missing, - bool replace_tracked_subdirectories, - const char** tracked_subdirectories) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gint async_call_id = 0; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeAsyncMount, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - user_email, - G_TYPE_STRING, - key, - G_TYPE_BOOLEAN, - create_if_missing, - G_TYPE_BOOLEAN, - replace_tracked_subdirectories, - G_TYPE_STRV, - tracked_subdirectories, - G_TYPE_INVALID, - G_TYPE_INT, - &async_call_id, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeAsyncMount << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - - return async_call_id; -} - -extern "C" -int ChromeOSCryptohomeAsyncMountGuest() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gint async_call_id = 0; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeAsyncMountGuest, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_INT, - &async_call_id, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeAsyncMountGuest << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - return async_call_id; -} - -extern "C" -int ChromeOSCryptohomeAsyncSetOwnerUser(const char* username) { - return 0; -} - -extern "C" -bool ChromeOSCryptohomeTpmIsReady() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean ready = false; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmIsReady, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &ready, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmIsReady << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return ready; -} - -extern "C" -bool ChromeOSCryptohomeTpmIsEnabled() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmIsEnabled, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmIsEnabled << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return done; -} - -extern "C" -bool ChromeOSCryptohomeTpmIsOwned() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmIsOwned, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmIsOwned << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return done; -} - -extern "C" -bool ChromeOSCryptohomeTpmIsBeingOwned() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmIsBeingOwned, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmIsBeingOwned << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return done; -} - -extern "C" -bool ChromeOSCryptohomeTpmGetPasswordSafe(char** password) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gchar* local_password = NULL; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmGetPassword, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_STRING, - &local_password, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmGetPassword << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - - if (local_password) { - *password = local_password; - return true; - } - *password = NULL; - return false; -} - -extern "C" -void ChromeOSCryptohomeTpmCanAttemptOwnership() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmCanAttemptOwnership, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmCanAttemptOwnership << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } -} - -extern "C" -void ChromeOSCryptohomeTpmClearStoredPassword() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeTpmClearStoredPassword, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeTpmClearStoredPassword << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } -} - -// TODO(ellyjones): Remove this. crosbug.com/22120 -extern "C" -bool ChromeOSCryptohomePkcs11IsTpmTokenReady() { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean ready = FALSE; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomePkcs11IsTpmTokenReady, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &ready, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomePkcs11IsTpmTokenReady << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return ready; -} - -extern "C" -bool ChromeOSCryptohomePkcs11IsTpmTokenReadyForUser(const std::string& user) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean ready = FALSE; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomePkcs11IsTpmTokenReadyForUser, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - user.c_str(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &ready, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomePkcs11IsTpmTokenReadyForUser - << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - return ready; -} - -// TODO(ellyjones): Remove this. crosbug.com/22120 -extern "C" -void ChromeOSCryptohomePkcs11GetTpmTokenInfo(std::string* label, - std::string* user_pin) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gchar* local_label = NULL; - gchar* local_user_pin = NULL; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomePkcs11GetTpmTokenInfo, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_STRING, - &local_label, - G_TYPE_STRING, - &local_user_pin, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomePkcs11GetTpmTokenInfo << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - - if (local_label) { - *label = local_label; - g_free(local_label); - } - if (local_user_pin) { - *user_pin = local_user_pin; - g_free(local_user_pin); - } -} - -extern "C" -void ChromeOSCryptohomePkcs11GetTpmTokenInfoForUser(const std::string& user, - std::string* label, - std::string* user_pin) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gchar* local_label = NULL; - gchar* local_user_pin = NULL; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomePkcs11GetTpmTokenInfoForUser, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - user.c_str(), - G_TYPE_INVALID, - G_TYPE_STRING, - &local_label, - G_TYPE_STRING, - &local_user_pin, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomePkcs11GetTpmTokenInfo << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - - if (local_label) { - *label = local_label; - g_free(local_label); - } - if (local_user_pin) { - *user_pin = local_user_pin; - g_free(local_user_pin); - } -} - -extern "C" -bool ChromeOSCryptohomeGetStatusStringSafe(char** status) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gchar* local_status = NULL; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeGetStatusString, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_STRING, - &local_status, - G_TYPE_INVALID)) { - - LOG(WARNING) << cryptohome::kCryptohomeGetStatusString << " failed: " - << (error->message ? error->message : "Unknown Error."); - - } - - if (local_status) { - *status = local_status; - return true; - } - *status = NULL; - return false; -} - -extern "C" -bool ChromeOSCryptohomeGetStatusString(std::string* status) { - gchar* local_status = NULL; - if (!ChromeOSCryptohomeGetStatusStringSafe(&local_status)) { - return false; - } - - status->assign(local_status); - g_free(local_status); - return true; -} - -extern "C" -bool ChromeOSCryptohomeInstallAttributesGet(const char* name, char** value) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - GArray* dbus_value = NULL; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeInstallAttributesGet, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - name, - G_TYPE_INVALID, - DBUS_TYPE_G_UCHAR_ARRAY, - &dbus_value, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeInstallAttributesGet << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - - if (!dbus_value || !done) - return false; - - char* local_value = static_cast<char*>(g_malloc(dbus_value->len)); - if (local_value) { - memcpy(local_value, static_cast<const void*>(dbus_value->data), - dbus_value->len); - *value = local_value; - g_array_free(dbus_value, false); - return done; - } - g_array_free(dbus_value, false); - return false; -} - -extern "C" -bool ChromeOSCryptohomeInstallAttributesSet(const char* name, - const char* value) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - // TODO(pastarmovj): Change this to a bin data compatible impl. when needed. - int value_len = strlen(value)+1; - gchar* local_value = static_cast<char*>(g_malloc(value_len)); - if (!local_value) - return false; - - memcpy(local_value, static_cast<const gchar*>(value), value_len); - GArray *dbus_value = g_array_new(FALSE, FALSE, 1); - if (!dbus_value) - return false; - - dbus_value->data = local_value; - dbus_value->len = value_len; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - cryptohome::kCryptohomeInstallAttributesSet, - &Resetter(&error).lvalue(), - G_TYPE_STRING, - name, - DBUS_TYPE_G_UCHAR_ARRAY, - dbus_value, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - LOG(WARNING) << cryptohome::kCryptohomeInstallAttributesSet << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - - g_array_free(dbus_value, FALSE); - g_free(local_value); - - return done; -} - -bool CallCryptohomeBoolFunction(const char* function) { - dbus::BusConnection bus = dbus::GetSystemBusConnection(); - dbus::Proxy proxy(bus, - cryptohome::kCryptohomeServiceName, - cryptohome::kCryptohomeServicePath, - cryptohome::kCryptohomeInterface); - gboolean done = false; - glib::ScopedError error; - - if (!::dbus_g_proxy_call(proxy.gproxy(), - function, - &Resetter(&error).lvalue(), - G_TYPE_INVALID, - G_TYPE_BOOLEAN, - &done, - G_TYPE_INVALID)) { - LOG(WARNING) << function << " failed: " - << (error->message ? error->message : "Unknown Error."); - } - return done; -} - - -extern "C" -bool ChromeOSCryptohomeInstallAttributesFinalize() { - return CallCryptohomeBoolFunction( - cryptohome::kCryptohomeInstallAttributesFinalize); -} - -extern "C" -bool ChromeOSCryptohomeInstallAttributesIsReady() { - return CallCryptohomeBoolFunction( - cryptohome::kCryptohomeInstallAttributesIsReady); -} - -extern "C" -bool ChromeOSCryptohomeInstallAttributesIsInvalid() { - return CallCryptohomeBoolFunction( - cryptohome::kCryptohomeInstallAttributesIsInvalid); -} - -extern "C" -bool ChromeOSCryptohomeInstallAttributesIsFirstInstall() { - return CallCryptohomeBoolFunction( - cryptohome::kCryptohomeInstallAttributesIsFirstInstall); -} - -extern "C" -void ChromeOSCryptohomeFreeString(char* value) { - if (value) { - g_free(value); - } -} - -class CryptohomeSessionConnection { - public: - CryptohomeSessionConnection(const CryptohomeSignalCallback& monitor, - void* monitor_context) - : monitor_(monitor), - monitor_context_(monitor_context) { - } - - virtual ~CryptohomeSessionConnection() {} - - void Notify(const CryptohomeAsyncCallStatus& call_status) { - monitor_(call_status, monitor_context_); - } - - private: - CryptohomeSignalCallback monitor_; - void* monitor_context_; - - DISALLOW_COPY_AND_ASSIGN(CryptohomeSessionConnection); -}; - - -#ifndef SAFE_MESSAGE -#define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") -#endif // SAFE_MESSAGE - -bool CryptohomeExtractAsyncStatus(DBusMessage* message, - CryptohomeAsyncCallStatus* call_status) { - DBusError error; - dbus_error_init (&error); - bool unpack = dbus_message_get_args(message, - &error, - DBUS_TYPE_INT32, - &(call_status->async_id), - DBUS_TYPE_BOOLEAN, - &(call_status->return_status), - DBUS_TYPE_INT32, - &(call_status->return_code), - DBUS_TYPE_INVALID); - if (!unpack) { - LOG(INFO) << "Couldn't get arg: " << SAFE_MESSAGE(error); - return false; - } - return true; -} - -// A message filter to receive signals. -DBusHandlerResult CryptohomeSignalFilter(DBusConnection* dbus_connection, - DBusMessage* message, - void* connection) { - CryptohomeSessionConnection* self = - static_cast<CryptohomeSessionConnection*>(connection); - if (dbus_message_is_signal(message, cryptohome::kCryptohomeInterface, - cryptohome::kSignalAsyncCallStatus)) { - LOG(INFO) << "Filter:: AsyncCallStatus signal received"; - CryptohomeAsyncCallStatus call_status; - if (CryptohomeExtractAsyncStatus(message, &call_status)) { - self->Notify(call_status); - return DBUS_HANDLER_RESULT_HANDLED; - } - } - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -extern "C" -void* ChromeOSCryptohomeMonitorSession(CryptohomeSignalCallback monitor, - void* monitor_context) { - const std::string filter = StringPrintf("type='signal', interface='%s'", - cryptohome::kCryptohomeInterface); - - DBusError error; - ::dbus_error_init(&error); - DBusConnection* dbus_connection = ::dbus_g_connection_get_connection( - dbus::GetSystemBusConnection().g_connection()); - CHECK(dbus_connection); - ::dbus_bus_add_match(dbus_connection, filter.c_str(), &error); - if (::dbus_error_is_set(&error)) { - LOG(WARNING) << "Failed to add a filter:" << error.name << ", message=" - << SAFE_MESSAGE(error); - return NULL; - } - - CryptohomeSessionConnection* connection = new CryptohomeSessionConnection( - monitor, - monitor_context); - CHECK(dbus_connection_add_filter(dbus_connection, - &CryptohomeSignalFilter, - connection, - NULL)); - - LOG(INFO) << "Cryptohome API event monitoring started"; - return connection; -} - -} // namespace chromeos