Index: chromeos_login.cc |
diff --git a/chromeos_login.cc b/chromeos_login.cc |
index a90b658be9b449d71d811df45ec1d90cf3958f94..39909cf3098b2c672f5df273bebd53b91e02f285 100644 |
--- a/chromeos_login.cc |
+++ b/chromeos_login.cc |
@@ -17,6 +17,9 @@ |
namespace chromeos { // NOLINT |
+ |
+#define SCOPED_SAFE_MESSAGE(e) (e->message ? e->message : "unknown error") |
+ |
namespace { |
chromeos::dbus::Proxy CreateProxy() { |
dbus::BusConnection bus = dbus::GetSystemBusConnection(); |
@@ -48,6 +51,36 @@ class OpaqueSessionConnection { |
}; |
extern "C" |
+bool ChromeOSCheckWhitelist(const char* email, |
+ std::vector<uint8>* signature) { |
+ DCHECK(signature); |
+ chromeos::dbus::Proxy proxy = CreateProxy(); |
+ chromeos::glib::ScopedError error; |
+ |
+ GArray* sig; |
+ |
+ if (!::dbus_g_proxy_call(proxy.gproxy(), |
+ login_manager::kSessionManagerCheckWhitelist, |
+ &Resetter(&error).lvalue(), |
+ G_TYPE_STRING, email, |
+ G_TYPE_INVALID, |
+ DBUS_TYPE_G_UCHAR_ARRAY, &sig, |
+ G_TYPE_INVALID)) { |
+ LOG(WARNING) << login_manager::kSessionManagerCheckWhitelist << " failed: " |
+ << SCOPED_SAFE_MESSAGE(error); |
+ return false; |
+ } |
+ bool rv = false; |
+ signature->resize(sig->len); |
+ if (signature->size() == sig->len) { |
+ memcpy(&(signature->at(0)), static_cast<const void*>(sig->data), sig->len); |
+ rv = true; |
+ } |
+ g_array_free(sig, false); |
+ return rv; |
+} |
+ |
+extern "C" |
bool ChromeOSEmitLoginPromptReady() { |
chromeos::dbus::Proxy proxy = CreateProxy(); |
gboolean done = false; |
@@ -57,19 +90,51 @@ bool ChromeOSEmitLoginPromptReady() { |
login_manager::kSessionManagerEmitLoginPromptReady, |
&Resetter(&error).lvalue(), |
G_TYPE_INVALID, |
- G_TYPE_BOOLEAN, |
- &done, |
+ G_TYPE_BOOLEAN, &done, |
G_TYPE_INVALID)) { |
LOG(WARNING) << login_manager::kSessionManagerEmitLoginPromptReady |
- << " failed: " |
- << (error->message ? error->message : "Unknown Error."); |
+ << " failed: " << SCOPED_SAFE_MESSAGE(error); |
} |
return done; |
} |
extern "C" |
+bool ChromeOSCheckRetrieveProperty(const char* name, |
+ std::string* out_value, |
+ std::vector<uint8>* signature) { |
+ DCHECK(signature); |
+ chromeos::dbus::Proxy proxy = CreateProxy(); |
+ chromeos::glib::ScopedError error; |
+ |
+ GArray* sig; |
+ gchar* value; |
+ |
+ if (!::dbus_g_proxy_call(proxy.gproxy(), |
+ login_manager::kSessionManagerCheckWhitelist, |
+ &Resetter(&error).lvalue(), |
+ G_TYPE_STRING, name, |
+ G_TYPE_INVALID, |
+ G_TYPE_STRING, value, |
+ DBUS_TYPE_G_UCHAR_ARRAY, &sig, |
+ G_TYPE_INVALID)) { |
+ LOG(WARNING) << login_manager::kSessionManagerCheckWhitelist << " failed: " |
+ << SCOPED_SAFE_MESSAGE(error); |
+ return false; |
+ } |
+ bool rv = false; |
+ signature->resize(sig->len); |
+ if (signature->size() == sig->len) { |
+ memcpy(&(signature->at(0)), static_cast<const void*>(sig->data), sig->len); |
+ rv = true; |
+ } |
+ g_array_free(sig, false); |
+ out_value->assign(value); |
+ return rv; |
+} |
+ |
+extern "C" |
bool ChromeOSSetOwnerKey(const std::vector<uint8>& public_key_der) { |
chromeos::dbus::Proxy proxy = CreateProxy(); |
chromeos::glib::ScopedError error; |
@@ -81,12 +146,11 @@ bool ChromeOSSetOwnerKey(const std::vector<uint8>& public_key_der) { |
if (!::dbus_g_proxy_call(proxy.gproxy(), |
login_manager::kSessionManagerSetOwnerKey, |
&Resetter(&error).lvalue(), |
- DBUS_TYPE_G_UCHAR_ARRAY, |
- key_der, |
+ DBUS_TYPE_G_UCHAR_ARRAY, key_der, |
G_TYPE_INVALID, |
G_TYPE_INVALID)) { |
LOG(WARNING) << login_manager::kSessionManagerSetOwnerKey << " failed: " |
- << (error->message ? error->message : "Unknown Error."); |
+ << SCOPED_SAFE_MESSAGE(error); |
rv = false; |
} |
g_array_free(key_der, TRUE); |
@@ -103,16 +167,13 @@ bool ChromeOSStartSession(const char* user_email, |
if (!::dbus_g_proxy_call(proxy.gproxy(), |
login_manager::kSessionManagerStartSession, |
&Resetter(&error).lvalue(), |
- G_TYPE_STRING, |
- user_email, |
- G_TYPE_STRING, |
- unique_id, |
+ G_TYPE_STRING, user_email, |
+ G_TYPE_STRING, unique_id, |
G_TYPE_INVALID, |
- G_TYPE_BOOLEAN, |
- &done, |
+ G_TYPE_BOOLEAN, &done, |
G_TYPE_INVALID)) { |
LOG(WARNING) << login_manager::kSessionManagerStartSession << " failed: " |
- << (error->message ? error->message : "Unknown Error."); |
+ << SCOPED_SAFE_MESSAGE(error); |
} |
return done; |
} |
@@ -126,14 +187,12 @@ bool ChromeOSStopSession(const char* unique_id /* unused */) { |
if (!::dbus_g_proxy_call(proxy.gproxy(), |
login_manager::kSessionManagerStopSession, |
&Resetter(&error).lvalue(), |
- G_TYPE_STRING, |
- unique_id, |
+ G_TYPE_STRING, unique_id, |
G_TYPE_INVALID, |
- G_TYPE_BOOLEAN, |
- &done, |
+ G_TYPE_BOOLEAN, &done, |
G_TYPE_INVALID)) { |
LOG(WARNING) << login_manager::kSessionManagerStopSession << " failed: " |
- << (error->message ? error->message : "Unknown Error."); |
+ << SCOPED_SAFE_MESSAGE(error); |
} |
return done; |
} |
@@ -147,25 +206,89 @@ bool ChromeOSRestartJob(int pid, const char* command_line) { |
if (!::dbus_g_proxy_call(proxy.gproxy(), |
login_manager::kSessionManagerRestartJob, |
&Resetter(&error).lvalue(), |
- G_TYPE_INT, |
- pid, |
- G_TYPE_STRING, |
- command_line, |
+ G_TYPE_INT, pid, |
+ G_TYPE_STRING, command_line, |
G_TYPE_INVALID, |
- G_TYPE_BOOLEAN, |
- &done, |
+ G_TYPE_BOOLEAN, &done, |
G_TYPE_INVALID)) { |
LOG(WARNING) << login_manager::kSessionManagerRestartJob << " failed: " |
- << (error->message ? error->message : "Unknown Error."); |
+ << SCOPED_SAFE_MESSAGE(error); |
} |
return done; |
} |
+extern "C" |
+bool ChromeOSStoreProperty(const char* name, |
+ const char* value, |
+ const std::vector<uint8>& signature) { |
+ chromeos::dbus::Proxy proxy = CreateProxy(); |
+ chromeos::glib::ScopedError error; |
+ |
+ GArray* sig = g_array_sized_new(FALSE, FALSE, 1, signature.size()); |
+ g_array_append_vals(sig, &signature[0], signature.size()); |
+ |
+ bool rv = true; |
+ if (!::dbus_g_proxy_call(proxy.gproxy(), |
+ login_manager::kSessionManagerStoreProperty, |
+ &Resetter(&error).lvalue(), |
+ G_TYPE_STRING, name, |
+ G_TYPE_STRING, value, |
+ DBUS_TYPE_G_UCHAR_ARRAY, sig, |
+ G_TYPE_INVALID, |
+ G_TYPE_INVALID)) { |
+ LOG(WARNING) << login_manager::kSessionManagerStoreProperty << " failed: " |
+ << SCOPED_SAFE_MESSAGE(error); |
+ rv = false; |
+ } |
+ g_array_free(sig, TRUE); |
+ return rv; |
+} |
+ |
+namespace { |
+bool WhitelistOpHelper(const char* op, |
+ const char* email, |
+ const std::vector<uint8>& signature) { |
+ chromeos::dbus::Proxy proxy = CreateProxy(); |
+ chromeos::glib::ScopedError error; |
+ GArray* sig = g_array_sized_new(FALSE, FALSE, 1, signature.size()); |
+ g_array_append_vals(sig, &signature[0], signature.size()); |
-#define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") |
+ bool rv = true; |
+ if (!::dbus_g_proxy_call(proxy.gproxy(), |
+ op, |
+ &Resetter(&error).lvalue(), |
+ G_TYPE_STRING, email, |
+ DBUS_TYPE_G_UCHAR_ARRAY, sig, |
+ G_TYPE_INVALID, |
+ G_TYPE_INVALID)) { |
+ LOG(WARNING) << op << " failed: " << SCOPED_SAFE_MESSAGE(error); |
+ rv = false; |
+ } |
+ g_array_free(sig, TRUE); |
+ return rv; |
+} |
+} // anonymous namespace |
+ |
+extern "C" |
+bool ChromeOSUnwhitelist(const char* email, |
+ const std::vector<uint8>& signature) { |
+ return WhitelistOpHelper(login_manager::kSessionManagerUnwhitelist, |
+ email, |
+ signature); |
+} |
+ |
+extern "C" |
+bool ChromeOSWhitelist(const char* email, |
+ const std::vector<uint8>& signature) { |
+ return WhitelistOpHelper(login_manager::kSessionManagerWhitelist, |
+ email, |
+ signature); |
+} |
namespace { |
+#define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") |
+ |
bool IsSuccess(DBusMessage* message) { |
char* out_string = NULL; |
DBusError error; |