Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos_login.h" // NOLINT | 5 #include "chromeos_login.h" // NOLINT |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include <base/basictypes.h> | 9 #include <base/basictypes.h> |
| 10 #include <base/logging.h> | 10 #include <base/logging.h> |
| 11 #include <base/string_util.h> | 11 #include <base/string_util.h> |
| 12 #include <dbus/dbus-glib-lowlevel.h> | 12 #include <dbus/dbus-glib-lowlevel.h> |
| 13 #include <chromeos/dbus/dbus.h> | 13 #include <chromeos/dbus/dbus.h> |
| 14 #include <chromeos/dbus/service_constants.h> | 14 #include <chromeos/dbus/service_constants.h> |
| 15 #include <chromeos/glib/object.h> | 15 #include <chromeos/glib/object.h> |
| 16 #include <chromeos/string.h> | |
| 16 | 17 |
| 18 #include "chromeos_login_helpers.h" // NOLINT | |
| 17 #include "marshal.glibmarshal.h" // NOLINT | 19 #include "marshal.glibmarshal.h" // NOLINT |
| 18 | 20 |
| 19 namespace chromeos { // NOLINT | 21 namespace chromeos { // NOLINT |
| 20 | 22 |
| 21 | 23 // TODO(cmasone): do a bigger refactor, get rid of this copy-paste macro. |
| 22 #define SCOPED_SAFE_MESSAGE(e) (e->message ? e->message : "unknown error") | 24 #define SCOPED_SAFE_MESSAGE(e) (e->message ? e->message : "unknown error") |
| 23 | 25 |
| 24 namespace { | |
| 25 chromeos::dbus::Proxy CreateProxy() { | |
| 26 dbus::BusConnection bus = dbus::GetSystemBusConnection(); | |
| 27 return chromeos::dbus::Proxy(bus, | |
| 28 login_manager::kSessionManagerServiceName, | |
| 29 login_manager::kSessionManagerServicePath, | |
| 30 login_manager::kSessionManagerInterface); | |
| 31 } | |
| 32 } // Anonymous namespace. | |
| 33 | |
| 34 class OpaqueSessionConnection { | 26 class OpaqueSessionConnection { |
| 35 public: | 27 public: |
| 36 OpaqueSessionConnection(const SessionMonitor& monitor, void* object) | 28 OpaqueSessionConnection(const SessionMonitor& monitor, void* object) |
| 37 : monitor_(monitor), | 29 : monitor_(monitor), |
| 38 object_(object) { | 30 object_(object) { |
| 39 } | 31 } |
| 40 | 32 |
| 41 virtual ~OpaqueSessionConnection() {} | 33 virtual ~OpaqueSessionConnection() {} |
| 42 | 34 |
| 43 void Notify(OwnershipEvent event) { | 35 void Notify(OwnershipEvent event) { |
| 44 monitor_(object_, event); | 36 monitor_(object_, event); |
| 45 } | 37 } |
| 46 | 38 |
| 47 private: | 39 private: |
| 48 SessionMonitor monitor_; | 40 SessionMonitor monitor_; |
| 49 void* object_; | 41 void* object_; |
| 50 | 42 |
| 51 DISALLOW_COPY_AND_ASSIGN(OpaqueSessionConnection); | 43 DISALLOW_COPY_AND_ASSIGN(OpaqueSessionConnection); |
| 52 }; | 44 }; |
| 53 | 45 |
| 54 extern "C" | 46 extern "C" |
| 55 bool ChromeOSCheckWhitelist(const char* email, | 47 bool ChromeOSCheckWhitelist(const char* email, |
| 56 std::vector<uint8>* signature) { | 48 std::vector<uint8>* signature) { |
| 49 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. | |
| 50 // NOTREACHED() << "ChromeOSCheckWhitelist is deprecated"; | |
| 57 DCHECK(signature); | 51 DCHECK(signature); |
| 58 chromeos::dbus::Proxy proxy = CreateProxy(); | |
| 59 chromeos::glib::ScopedError error; | |
| 60 | |
| 61 GArray* sig; | 52 GArray* sig; |
| 62 | 53 if (!ChromeOSLoginHelpers::CheckWhitelistHelper(email, &sig)) |
| 63 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 64 login_manager::kSessionManagerCheckWhitelist, | |
| 65 &Resetter(&error).lvalue(), | |
| 66 G_TYPE_STRING, email, | |
| 67 G_TYPE_INVALID, | |
| 68 DBUS_TYPE_G_UCHAR_ARRAY, &sig, | |
| 69 G_TYPE_INVALID)) { | |
| 70 LOG(WARNING) << login_manager::kSessionManagerCheckWhitelist << " failed: " | |
| 71 << SCOPED_SAFE_MESSAGE(error); | |
| 72 return false; | 54 return false; |
| 73 } | |
| 74 bool rv = false; | 55 bool rv = false; |
| 75 signature->resize(sig->len); | 56 signature->resize(sig->len); |
| 76 if (signature->size() == sig->len) { | 57 if (signature->size() == sig->len) { |
| 77 memcpy(&(signature->at(0)), static_cast<const void*>(sig->data), sig->len); | 58 memcpy(&(signature->at(0)), static_cast<const void*>(sig->data), sig->len); |
| 78 rv = true; | 59 rv = true; |
| 79 } | 60 } |
| 80 g_array_free(sig, false); | 61 g_array_free(sig, false); |
| 81 return rv; | 62 return rv; |
| 82 } | 63 } |
| 83 | 64 |
| 84 extern "C" | 65 extern "C" |
| 66 bool ChromeOSCheckWhitelistSafe(const char* email, | |
| 67 CryptoBlob** OUT_signature) { | |
| 68 DCHECK(OUT_signature); | |
| 69 GArray* sig; | |
| 70 if (!ChromeOSLoginHelpers::CheckWhitelistHelper(email, &sig)) | |
| 71 return false; | |
| 72 *OUT_signature = ChromeOSLoginHelpers::CreateCryptoBlob(sig); | |
| 73 g_array_free(sig, true); | |
| 74 return true; | |
| 75 } | |
| 76 | |
| 77 extern "C" | |
| 85 bool ChromeOSEmitLoginPromptReady() { | 78 bool ChromeOSEmitLoginPromptReady() { |
| 86 chromeos::dbus::Proxy proxy = CreateProxy(); | 79 chromeos::dbus::Proxy proxy = ChromeOSLoginHelpers::CreateProxy(); |
| 87 gboolean done = false; | 80 gboolean done = false; |
| 88 chromeos::glib::ScopedError error; | 81 chromeos::glib::ScopedError error; |
| 89 | 82 |
| 90 if (!::dbus_g_proxy_call(proxy.gproxy(), | 83 if (!::dbus_g_proxy_call(proxy.gproxy(), |
| 91 login_manager::kSessionManagerEmitLoginPromptReady, | 84 login_manager::kSessionManagerEmitLoginPromptReady, |
| 92 &Resetter(&error).lvalue(), | 85 &Resetter(&error).lvalue(), |
| 93 G_TYPE_INVALID, | 86 G_TYPE_INVALID, |
| 94 G_TYPE_BOOLEAN, &done, | 87 G_TYPE_BOOLEAN, &done, |
| 95 G_TYPE_INVALID)) { | 88 G_TYPE_INVALID)) { |
| 96 | 89 |
| 97 LOG(WARNING) << login_manager::kSessionManagerEmitLoginPromptReady | 90 LOG(WARNING) << login_manager::kSessionManagerEmitLoginPromptReady |
| 98 << " failed: " << SCOPED_SAFE_MESSAGE(error); | 91 << " failed: " << SCOPED_SAFE_MESSAGE(error); |
| 99 } | 92 } |
| 100 return done; | 93 return done; |
| 101 } | 94 } |
| 102 | 95 |
| 103 extern "C" | 96 extern "C" |
| 104 bool ChromeOSEnumerateWhitelisted(std::vector<std::string>* out_whitelisted) { | 97 bool ChromeOSEnumerateWhitelisted(std::vector<std::string>* OUT_whitelisted) { |
| 105 chromeos::dbus::Proxy proxy = CreateProxy(); | 98 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. |
| 99 // NOTREACHED() << "ChromeOSEnumerateWhitelisted is deprecated"; | |
| 100 DCHECK(OUT_whitelisted); | |
| 106 gchar** whitelisted = NULL; | 101 gchar** whitelisted = NULL; |
| 107 chromeos::glib::ScopedError error; | 102 if (!ChromeOSLoginHelpers::EnumerateWhitelistedHelper(&whitelisted)) |
| 108 | |
| 109 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 110 login_manager::kSessionManagerEnumerateWhitelisted, | |
| 111 &Resetter(&error).lvalue(), | |
| 112 G_TYPE_INVALID, | |
| 113 G_TYPE_STRV, &whitelisted, | |
| 114 G_TYPE_INVALID)) { | |
| 115 | |
| 116 LOG(WARNING) << login_manager::kSessionManagerEnumerateWhitelisted | |
| 117 << " failed: " << SCOPED_SAFE_MESSAGE(error); | |
| 118 return false; | 103 return false; |
| 119 } | |
| 120 for (int i = 0; whitelisted[i] != NULL; ++i) | 104 for (int i = 0; whitelisted[i] != NULL; ++i) |
| 121 out_whitelisted->push_back(std::string(whitelisted[i])); | 105 OUT_whitelisted->push_back(std::string(whitelisted[i])); |
| 122 | 106 |
| 123 g_strfreev(whitelisted); | 107 g_strfreev(whitelisted); |
| 124 return true; | 108 return true; |
| 125 } | 109 } |
| 126 | 110 |
| 127 extern "C" | 111 extern "C" |
| 112 bool ChromeOSEnumerateWhitelistedSafe(UserList** OUT_whitelisted) { | |
| 113 DCHECK(OUT_whitelisted); | |
| 114 gchar** whitelisted = NULL; | |
| 115 if (!ChromeOSLoginHelpers::EnumerateWhitelistedHelper(&whitelisted)) | |
| 116 return false; | |
| 117 *OUT_whitelisted = ChromeOSLoginHelpers::CreateUserList(whitelisted); | |
| 118 g_strfreev(whitelisted); | |
| 119 return true; | |
| 120 } | |
| 121 | |
| 122 extern "C" | |
| 123 CryptoBlob* ChromeOSCreateCryptoBlob(const uint8* in, const int in_len) { | |
| 124 GArray* ary = ChromeOSLoginHelpers::CreateGArrayFromBytes(in, in_len); | |
| 125 CryptoBlob* blob = ChromeOSLoginHelpers::CreateCryptoBlob(ary); | |
| 126 g_array_free(ary, TRUE); | |
| 127 return blob; | |
| 128 } | |
| 129 | |
| 130 extern "C" | |
| 131 Property* ChromeOSCreateProperty(const char* name, const char* value, | |
| 132 const uint8* sig, const int sig_len) { | |
| 133 GArray* ary = ChromeOSLoginHelpers::CreateGArrayFromBytes(sig, sig_len); | |
| 134 Property* prop = ChromeOSLoginHelpers::CreateProperty(name, value, ary); | |
| 135 g_array_free(ary, TRUE); | |
| 136 return prop; | |
| 137 } | |
| 138 | |
| 139 extern "C" | |
| 140 UserList* ChromeOSCreateUserList(char** users) { | |
| 141 return ChromeOSLoginHelpers::CreateUserList(users); | |
| 142 } | |
| 143 | |
| 144 // These Free* methods all use delete (as opposed to delete []) on purpose, | |
| 145 // following the pattern established by code that uses NewStringCopy. | |
| 146 extern "C" | |
| 147 void ChromeOSFreeCryptoBlob(CryptoBlob* blob) { | |
| 148 ChromeOSLoginHelpers::FreeCryptoBlob(blob); | |
| 149 } | |
| 150 | |
| 151 extern "C" | |
| 152 void ChromeOSFreeProperty(Property* property) { | |
| 153 ChromeOSLoginHelpers::FreeProperty(property); | |
| 154 } | |
| 155 | |
| 156 extern "C" | |
| 157 void ChromeOSFreeUserList(UserList* userlist) { | |
| 158 ChromeOSLoginHelpers::FreeUserList(userlist); | |
| 159 } | |
| 160 | |
| 161 extern "C" | |
| 162 bool ChromeOSRestartJob(int pid, const char* command_line) { | |
| 163 chromeos::dbus::Proxy proxy = ChromeOSLoginHelpers::CreateProxy(); | |
| 164 gboolean done = false; | |
| 165 chromeos::glib::ScopedError error; | |
| 166 | |
| 167 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 168 login_manager::kSessionManagerRestartJob, | |
| 169 &Resetter(&error).lvalue(), | |
| 170 G_TYPE_INT, pid, | |
| 171 G_TYPE_STRING, command_line, | |
| 172 G_TYPE_INVALID, | |
| 173 G_TYPE_BOOLEAN, &done, | |
| 174 G_TYPE_INVALID)) { | |
| 175 LOG(WARNING) << login_manager::kSessionManagerRestartJob << " failed: " | |
| 176 << SCOPED_SAFE_MESSAGE(error); | |
| 177 } | |
| 178 return done; | |
| 179 } | |
| 180 | |
| 181 extern "C" | |
| 128 bool ChromeOSRetrieveProperty(const char* name, | 182 bool ChromeOSRetrieveProperty(const char* name, |
| 129 std::string* out_value, | 183 std::string* out_value, |
| 130 std::vector<uint8>* signature) { | 184 std::vector<uint8>* signature) { |
| 185 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. | |
| 186 // NOTREACHED() << "ChromeOSRetrieveProperty is deprecated"; | |
| 131 DCHECK(signature); | 187 DCHECK(signature); |
| 132 chromeos::dbus::Proxy proxy = CreateProxy(); | 188 DCHECK(out_value); |
| 133 chromeos::glib::ScopedError error; | |
| 134 | |
| 135 GArray* sig; | 189 GArray* sig; |
| 136 gchar* value = NULL; | 190 gchar* value = NULL; |
| 137 | 191 if (!ChromeOSLoginHelpers::RetrievePropertyHelper(name, &value, &sig)) |
| 138 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 139 login_manager::kSessionManagerRetrieveProperty, | |
| 140 &Resetter(&error).lvalue(), | |
| 141 G_TYPE_STRING, name, | |
| 142 G_TYPE_INVALID, | |
| 143 G_TYPE_STRING, &value, | |
| 144 DBUS_TYPE_G_UCHAR_ARRAY, &sig, | |
| 145 G_TYPE_INVALID)) { | |
| 146 LOG(WARNING) << login_manager::kSessionManagerRetrieveProperty | |
| 147 << " failed: " << SCOPED_SAFE_MESSAGE(error); | |
| 148 return false; | 192 return false; |
| 149 } | |
| 150 bool rv = false; | 193 bool rv = false; |
| 151 signature->resize(sig->len); | 194 signature->resize(sig->len); |
| 152 if (signature->size() == sig->len) { | 195 if (signature->size() == sig->len) { |
| 153 memcpy(&(signature->at(0)), static_cast<const void*>(sig->data), sig->len); | 196 memcpy(&(signature->at(0)), static_cast<const void*>(sig->data), sig->len); |
| 154 rv = true; | 197 rv = true; |
| 155 } | 198 } |
| 156 g_array_free(sig, false); | 199 g_array_free(sig, false); |
| 157 out_value->assign(value); | 200 out_value->assign(value); |
| 158 g_free(value); | 201 g_free(value); |
| 159 return rv; | 202 return rv; |
| 160 } | 203 } |
| 161 | 204 |
| 162 extern "C" | 205 extern "C" |
| 206 bool ChromeOSRetrievePropertySafe(const char* name, Property** OUT_property) { | |
| 207 DCHECK(OUT_property); | |
| 208 GArray* sig; | |
| 209 gchar* value = NULL; | |
| 210 if (!ChromeOSLoginHelpers::RetrievePropertyHelper(name, &value, &sig)) | |
| 211 return false; | |
| 212 *OUT_property = ChromeOSLoginHelpers::CreateProperty(name, value, sig); | |
| 213 return true; | |
| 214 } | |
| 215 | |
| 216 extern "C" | |
| 163 bool ChromeOSSetOwnerKey(const std::vector<uint8>& public_key_der) { | 217 bool ChromeOSSetOwnerKey(const std::vector<uint8>& public_key_der) { |
| 164 chromeos::dbus::Proxy proxy = CreateProxy(); | 218 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. |
| 165 chromeos::glib::ScopedError error; | 219 // NOTREACHED() << "ChromeOSSetOwnerKey is deprecated"; |
| 166 | 220 GArray* key_der = |
| 167 GArray* key_der = g_array_sized_new(FALSE, FALSE, 1, public_key_der.size()); | 221 ChromeOSLoginHelpers::CreateGArrayFromBytes(&public_key_der[0], |
| 168 g_array_append_vals(key_der, &public_key_der[0], public_key_der.size()); | 222 public_key_der.size()); |
| 169 | 223 bool rv = ChromeOSLoginHelpers::SetOwnerKeyHelper(key_der); |
| 170 bool rv = true; | |
| 171 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 172 login_manager::kSessionManagerSetOwnerKey, | |
| 173 &Resetter(&error).lvalue(), | |
| 174 DBUS_TYPE_G_UCHAR_ARRAY, key_der, | |
| 175 G_TYPE_INVALID, | |
| 176 G_TYPE_INVALID)) { | |
| 177 LOG(WARNING) << login_manager::kSessionManagerSetOwnerKey << " failed: " | |
| 178 << SCOPED_SAFE_MESSAGE(error); | |
| 179 rv = false; | |
| 180 } | |
| 181 g_array_free(key_der, TRUE); | 224 g_array_free(key_der, TRUE); |
| 182 return rv; | 225 return rv; |
| 183 } | 226 } |
| 227 | |
| 228 extern "C" | |
| 229 bool ChromeOSSetOwnerKeySafe(const CryptoBlob* public_key_der) { | |
| 230 GArray* key_der = | |
| 231 ChromeOSLoginHelpers::CreateGArrayFromBytes(public_key_der->data, | |
| 232 public_key_der->length); | |
| 233 bool rv = ChromeOSLoginHelpers::SetOwnerKeyHelper(key_der); | |
| 234 g_array_free(key_der, TRUE); | |
| 235 return rv; | |
| 236 } | |
| 184 | 237 |
| 185 extern "C" | 238 extern "C" |
| 186 bool ChromeOSStartSession(const char* user_email, | 239 bool ChromeOSStartSession(const char* user_email, |
| 187 const char* unique_id /* unused */) { | 240 const char* unique_id /* unused */) { |
| 188 chromeos::dbus::Proxy proxy = CreateProxy(); | 241 chromeos::dbus::Proxy proxy = ChromeOSLoginHelpers::CreateProxy(); |
| 189 gboolean done = false; | 242 gboolean done = false; |
| 190 chromeos::glib::ScopedError error; | 243 chromeos::glib::ScopedError error; |
| 191 | 244 |
| 192 if (!::dbus_g_proxy_call(proxy.gproxy(), | 245 if (!::dbus_g_proxy_call(proxy.gproxy(), |
| 193 login_manager::kSessionManagerStartSession, | 246 login_manager::kSessionManagerStartSession, |
| 194 &Resetter(&error).lvalue(), | 247 &Resetter(&error).lvalue(), |
| 195 G_TYPE_STRING, user_email, | 248 G_TYPE_STRING, user_email, |
| 196 G_TYPE_STRING, unique_id, | 249 G_TYPE_STRING, unique_id, |
| 197 G_TYPE_INVALID, | 250 G_TYPE_INVALID, |
| 198 G_TYPE_BOOLEAN, &done, | 251 G_TYPE_BOOLEAN, &done, |
| 199 G_TYPE_INVALID)) { | 252 G_TYPE_INVALID)) { |
| 200 LOG(WARNING) << login_manager::kSessionManagerStartSession << " failed: " | 253 LOG(WARNING) << login_manager::kSessionManagerStartSession << " failed: " |
| 201 << SCOPED_SAFE_MESSAGE(error); | 254 << SCOPED_SAFE_MESSAGE(error); |
| 202 } | 255 } |
| 203 return done; | 256 return done; |
| 204 } | 257 } |
| 205 | 258 |
| 206 extern "C" | 259 extern "C" |
| 207 bool ChromeOSStopSession(const char* unique_id /* unused */) { | 260 bool ChromeOSStopSession(const char* unique_id /* unused */) { |
| 208 chromeos::dbus::Proxy proxy = CreateProxy(); | 261 chromeos::dbus::Proxy proxy = ChromeOSLoginHelpers::CreateProxy(); |
| 209 // TODO(cmasone): clear up the now-defunct variables here. | 262 // TODO(cmasone): clear up the now-defunct variables here. |
| 210 gboolean unused = false; | 263 gboolean unused = false; |
| 211 ::dbus_g_proxy_call_no_reply(proxy.gproxy(), | 264 ::dbus_g_proxy_call_no_reply(proxy.gproxy(), |
| 212 login_manager::kSessionManagerStopSession, | 265 login_manager::kSessionManagerStopSession, |
| 213 G_TYPE_STRING, unique_id, | 266 G_TYPE_STRING, unique_id, |
| 214 G_TYPE_INVALID, | 267 G_TYPE_INVALID, |
| 215 G_TYPE_BOOLEAN, &unused, | 268 G_TYPE_BOOLEAN, &unused, |
| 216 G_TYPE_INVALID); | 269 G_TYPE_INVALID); |
| 217 return true; | 270 return true; |
| 218 } | 271 } |
| 219 | 272 |
| 220 extern "C" | 273 extern "C" |
| 221 bool ChromeOSRestartJob(int pid, const char* command_line) { | |
| 222 chromeos::dbus::Proxy proxy = CreateProxy(); | |
| 223 gboolean done = false; | |
| 224 chromeos::glib::ScopedError error; | |
| 225 | |
| 226 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 227 login_manager::kSessionManagerRestartJob, | |
| 228 &Resetter(&error).lvalue(), | |
| 229 G_TYPE_INT, pid, | |
| 230 G_TYPE_STRING, command_line, | |
| 231 G_TYPE_INVALID, | |
| 232 G_TYPE_BOOLEAN, &done, | |
| 233 G_TYPE_INVALID)) { | |
| 234 LOG(WARNING) << login_manager::kSessionManagerRestartJob << " failed: " | |
| 235 << SCOPED_SAFE_MESSAGE(error); | |
| 236 } | |
| 237 return done; | |
| 238 } | |
| 239 | |
| 240 extern "C" | |
| 241 bool ChromeOSStoreProperty(const char* name, | 274 bool ChromeOSStoreProperty(const char* name, |
| 242 const char* value, | 275 const char* value, |
| 243 const std::vector<uint8>& signature) { | 276 const std::vector<uint8>& signature) { |
| 244 chromeos::dbus::Proxy proxy = CreateProxy(); | 277 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. |
| 245 chromeos::glib::ScopedError error; | 278 // NOTREACHED() << "ChromeOSStoreProperty is deprecated!"; |
| 246 | 279 GArray* sig = ChromeOSLoginHelpers::CreateGArrayFromBytes(&signature[0], |
| 247 GArray* sig = g_array_sized_new(FALSE, FALSE, 1, signature.size()); | 280 signature.size()); |
| 248 g_array_append_vals(sig, &signature[0], signature.size()); | 281 bool rv = ChromeOSLoginHelpers::StorePropertyHelper(name, value, sig); |
| 249 | |
| 250 bool rv = true; | |
| 251 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 252 login_manager::kSessionManagerStoreProperty, | |
| 253 &Resetter(&error).lvalue(), | |
| 254 G_TYPE_STRING, name, | |
| 255 G_TYPE_STRING, value, | |
| 256 DBUS_TYPE_G_UCHAR_ARRAY, sig, | |
| 257 G_TYPE_INVALID, | |
| 258 G_TYPE_INVALID)) { | |
| 259 LOG(WARNING) << login_manager::kSessionManagerStoreProperty << " failed: " | |
| 260 << SCOPED_SAFE_MESSAGE(error); | |
| 261 rv = false; | |
| 262 } | |
| 263 g_array_free(sig, TRUE); | 282 g_array_free(sig, TRUE); |
| 264 return rv; | 283 return rv; |
| 265 } | 284 } |
| 266 | 285 |
| 267 namespace { | 286 extern "C" |
| 268 bool WhitelistOpHelper(const char* op, | 287 bool ChromeOSStorePropertySafe(const Property* prop) { |
| 269 const char* email, | 288 GArray* sig = |
| 270 const std::vector<uint8>& signature) { | 289 ChromeOSLoginHelpers::CreateGArrayFromBytes(prop->signature->data, |
| 271 chromeos::dbus::Proxy proxy = CreateProxy(); | 290 prop->signature->length); |
| 272 chromeos::glib::ScopedError error; | 291 bool rv = ChromeOSLoginHelpers::StorePropertyHelper(prop->name, |
| 273 | 292 prop->value, |
| 274 GArray* sig = g_array_sized_new(FALSE, FALSE, 1, signature.size()); | 293 sig); |
| 275 g_array_append_vals(sig, &signature[0], signature.size()); | |
| 276 | |
| 277 bool rv = true; | |
| 278 if (!::dbus_g_proxy_call(proxy.gproxy(), | |
| 279 op, | |
| 280 &Resetter(&error).lvalue(), | |
| 281 G_TYPE_STRING, email, | |
| 282 DBUS_TYPE_G_UCHAR_ARRAY, sig, | |
| 283 G_TYPE_INVALID, | |
| 284 G_TYPE_INVALID)) { | |
| 285 LOG(WARNING) << op << " failed: " << SCOPED_SAFE_MESSAGE(error); | |
| 286 rv = false; | |
| 287 } | |
| 288 g_array_free(sig, TRUE); | 294 g_array_free(sig, TRUE); |
| 289 return rv; | 295 return rv; |
| 290 } | 296 } |
| 291 } // anonymous namespace | |
| 292 | 297 |
| 293 extern "C" | 298 extern "C" |
| 294 bool ChromeOSUnwhitelist(const char* email, | 299 bool ChromeOSUnwhitelist(const char* email, |
| 295 const std::vector<uint8>& signature) { | 300 const std::vector<uint8>& signature) { |
| 296 return WhitelistOpHelper(login_manager::kSessionManagerUnwhitelist, | 301 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. |
| 297 email, | 302 // NOTREACHED() << "ChromeOSUnwhitelist is deprecated!"; |
| 298 signature); | 303 return ChromeOSLoginHelpers::WhitelistOpHelper( |
| 304 login_manager::kSessionManagerUnwhitelist, | |
| 305 email, | |
| 306 signature); | |
| 307 } | |
| 308 | |
| 309 extern "C" | |
| 310 bool ChromeOSUnwhitelistSafe(const char* email, const CryptoBlob* signature) { | |
| 311 std::vector<uint8> sig(signature->data, signature->data + signature->length); | |
| 312 return ChromeOSLoginHelpers::WhitelistOpHelper( | |
| 313 login_manager::kSessionManagerUnwhitelist, | |
| 314 email, | |
| 315 sig); | |
| 299 } | 316 } |
| 300 | 317 |
| 301 extern "C" | 318 extern "C" |
| 302 bool ChromeOSWhitelist(const char* email, | 319 bool ChromeOSWhitelist(const char* email, |
| 303 const std::vector<uint8>& signature) { | 320 const std::vector<uint8>& signature) { |
| 304 return WhitelistOpHelper(login_manager::kSessionManagerWhitelist, | 321 // TODO(cmasone): Enable NOTREACHED once Chrome is migrated. |
| 305 email, | 322 // NOTREACHED() << "ChromeOSWhitelist is deprecated!"; |
|
zel
2010/10/28 20:02:46
you should just nuke these calls once chrome side
Chris Masone
2010/10/28 20:09:08
I figured we'd want to leave at least a bit of a w
| |
| 306 signature); | 323 return ChromeOSLoginHelpers::WhitelistOpHelper( |
| 324 login_manager::kSessionManagerWhitelist, | |
| 325 email, | |
| 326 signature); | |
| 327 } | |
| 328 | |
| 329 extern "C" | |
| 330 bool ChromeOSWhitelistSafe(const char* email, const CryptoBlob* signature) { | |
| 331 std::vector<uint8> sig(signature->data, signature->data + signature->length); | |
| 332 return ChromeOSLoginHelpers::WhitelistOpHelper( | |
| 333 login_manager::kSessionManagerWhitelist, | |
| 334 email, | |
| 335 sig); | |
| 307 } | 336 } |
| 308 | 337 |
| 309 namespace { | 338 namespace { |
| 310 #define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") | 339 #define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") |
| 311 | 340 |
| 312 bool IsSuccess(DBusMessage* message) { | 341 bool IsSuccess(DBusMessage* message) { |
| 313 char* out_string = NULL; | 342 char* out_string = NULL; |
| 314 DBusError error; | 343 DBusError error; |
| 315 dbus_error_init (&error); | 344 dbus_error_init (&error); |
| 316 bool unpack = dbus_message_get_args(message, | 345 bool unpack = dbus_message_get_args(message, |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 381 extern "C" | 410 extern "C" |
| 382 void ChromeOSDisconnectSession(SessionConnection connection) { | 411 void ChromeOSDisconnectSession(SessionConnection connection) { |
| 383 DBusConnection *bus = ::dbus_g_connection_get_connection( | 412 DBusConnection *bus = ::dbus_g_connection_get_connection( |
| 384 dbus::GetSystemBusConnection().g_connection()); | 413 dbus::GetSystemBusConnection().g_connection()); |
| 385 ::dbus_connection_remove_filter(bus, &Filter, connection); | 414 ::dbus_connection_remove_filter(bus, &Filter, connection); |
| 386 delete connection; | 415 delete connection; |
| 387 LOG(INFO) << "Disconnected from session manager"; | 416 LOG(INFO) << "Disconnected from session manager"; |
| 388 } | 417 } |
| 389 | 418 |
| 390 } // namespace chromeos | 419 } // namespace chromeos |
| OLD | NEW |