Index: drive_login.cc |
diff --git a/drive_login.cc b/drive_login.cc |
index 210cfd8d05c6ba00d32d45d63b2956e75037732f..f5c92abb9703c3b6596aead7e3ea33cda16bed0c 100644 |
--- a/drive_login.cc |
+++ b/drive_login.cc |
@@ -19,6 +19,7 @@ |
#include <base/file_util.h> |
#include <base/nss_util.h> |
#include <base/scoped_temp_dir.h> |
+#include <base/string_util.h> |
#include <base/stringprintf.h> |
#include "chromeos_cros_api.h" // NOLINT |
@@ -34,6 +35,8 @@ static const char kWhitelist[] = "whitelist"; |
static const char kUnwhitelist[] = "unwhitelist"; |
static const char kCheckWhitelist[] = "check-whitelist"; |
static const char kEnumerate[] = "enumerate-whitelisted"; |
+static const char kStoreProperty[] = "store-property"; |
+static const char kRetrieveProperty[] = "retrieve-property"; |
class ClientLoop { |
public: |
@@ -209,16 +212,19 @@ int main(int argc, const char** argv) { |
if (!GenerateOwnerKey(&pubkey)) |
LOG(FATAL) << "Couldn't generate fakey owner key"; |
+ chromeos::CryptoBlob* blob = chromeos::CreateCryptoBlob(&pubkey[0], |
+ pubkey.size()); |
+ |
ClientLoop client_loop; |
client_loop.Initialize(); |
- if (!chromeos::SetOwnerKey(pubkey)) { |
+ if (!chromeos::SetOwnerKeySafe(blob)) { |
LOG(FATAL) << "Could not send SetOwnerKey?"; |
} |
client_loop.Run(); |
LOG(INFO) << (client_loop.what_happened() == chromeos::SetKeySuccess ? |
"Successfully set owner key" : "Didn't set owner key"); |
- exit(0); |
+ chromeos::FreeCryptoBlob(blob); |
} |
if (cl->HasSwitch(kWhitelist)) { |
scoped_ptr<base::RSAPrivateKey> private_key( |
@@ -234,13 +240,16 @@ int main(int argc, const char** argv) { |
ClientLoop client_loop; |
client_loop.Initialize(); |
- if (!chromeos::Whitelist(name.c_str(), sig)) |
+ chromeos::CryptoBlob* blob = chromeos::CreateCryptoBlob(&sig[0], |
+ sig.size()); |
+ |
+ if (!chromeos::WhitelistSafe(name.c_str(), blob)) |
LOG(FATAL) << "Could not send SetOwnerKey?"; |
client_loop.Run(); |
LOG(INFO) << (client_loop.what_happened() == chromeos::WhitelistOpSuccess ? |
"Whitelisted " : "Failed to whitelist ") << name; |
- exit(0); |
+ chromeos::FreeCryptoBlob(blob); |
} |
if (cl->HasSwitch(kUnwhitelist)) { |
scoped_ptr<base::RSAPrivateKey> private_key( |
@@ -254,36 +263,77 @@ int main(int argc, const char** argv) { |
ClientLoop client_loop; |
client_loop.Initialize(); |
- if (!chromeos::Unwhitelist(name.c_str(), sig)) |
- LOG(FATAL) << "Could not send SetOwnerKey?"; |
+ chromeos::CryptoBlob* blob = chromeos::CreateCryptoBlob(&sig[0], |
+ sig.size()); |
+ |
+ if (!chromeos::UnwhitelistSafe(name.c_str(), blob)) |
+ LOG(FATAL) << "Could not send UnwhitelistSafe?"; |
client_loop.Run(); |
LOG(INFO) << (client_loop.what_happened() == chromeos::WhitelistOpSuccess ? |
"Whitelisted " : "Failed to whitelist ") << name; |
- exit(0); |
+ chromeos::FreeCryptoBlob(blob); |
} |
if (cl->HasSwitch(kEnumerate)) { |
- std::vector<std::string> whitelisted; |
- if (!chromeos::EnumerateWhitelisted(&whitelisted)) { |
+ chromeos::UserList* whitelisted = NULL; |
+ if (!chromeos::EnumerateWhitelistedSafe(&whitelisted)) { |
LOG(FATAL) << "Could not enumerate the whitelisted"; |
} |
- std::vector<std::string>::iterator it; |
- for (it = whitelisted.begin(); it < whitelisted.end(); ++it) |
- LOG(INFO) << *it << " is whitelisted"; |
+ for (int i = 0; i < whitelisted->num_users; i++) |
+ LOG(INFO) << whitelisted->users[i] << " is whitelisted"; |
- exit(0); |
+ chromeos::FreeUserList(whitelisted); |
} |
if (cl->HasSwitch(kCheckWhitelist)) { |
std::string name = cl->GetSwitchValueASCII(kCheckWhitelist); |
- std::vector<uint8> sig; |
+ chromeos::CryptoBlob* sig; |
- if (!chromeos::CheckWhitelist(name.c_str(), &sig)) |
+ if (!chromeos::CheckWhitelistSafe(name.c_str(), &sig)) |
LOG(WARNING) << name << " not on whitelist."; |
- else |
+ else { |
LOG(INFO) << name << " is on the whitelist."; |
+ chromeos::FreeCryptoBlob(sig); |
+ } |
+ } |
+ if (cl->HasSwitch(kStoreProperty)) { |
+ scoped_ptr<base::RSAPrivateKey> private_key( |
+ GetPrivateKey(FilePath(chromeos::kOwnerKeyFile))); |
- exit(0); |
+ std::string keyval = cl->GetSwitchValueASCII(kStoreProperty); |
+ std::vector<uint8> sig; |
+ if (!Sign(keyval, private_key.get(), &sig)) |
+ LOG(FATAL) << "Can't sign " << keyval; |
+ else |
+ LOG(INFO) << "Signature is " << sig.size(); |
+ |
+ ClientLoop client_loop; |
+ client_loop.Initialize(); |
+ |
+ std::vector<std::string> pair; |
+ SplitString(keyval, '=', &pair); |
+ chromeos::Property* prop = chromeos::CreateProperty(pair[0].c_str(), |
+ pair[1].c_str(), |
+ &sig[0], |
+ sig.size()); |
+ if (!chromeos::StorePropertySafe(prop)) |
+ LOG(FATAL) << "Could not send StorePropertySafe?"; |
+ |
+ client_loop.Run(); |
+ LOG(INFO) << (client_loop.what_happened() == chromeos::PropertyOpSuccess ? |
+ "Stored " : "Failed to store ") << keyval; |
+ chromeos::FreeProperty(prop); |
+ } |
+ if (cl->HasSwitch(kRetrieveProperty)) { |
+ std::string name = cl->GetSwitchValueASCII(kRetrieveProperty); |
+ chromeos::Property* prop; |
+ |
+ if (!chromeos::RetrievePropertySafe(name.c_str(), &prop)) |
+ LOG(WARNING) << name << " not stored."; |
+ else { |
+ LOG(INFO) << prop->name << "=" << prop->value; |
+ chromeos::FreeProperty(prop); |
+ } |
} |
return 0; |