Implement adding/removing keyrings from/to master.

This commit is contained in:
Michael Lotz
2013-03-05 11:04:05 -05:00
committed by Ryan Leavengood
parent 1dd765c92c
commit f16fef70be
+52 -2
View File
@@ -25,6 +25,9 @@
using namespace BPrivate; using namespace BPrivate;
static const char* kKeyringKeysIdentifier = "Keyrings";
KeyStoreServer::KeyStoreServer() KeyStoreServer::KeyStoreServer()
: :
BApplication(kKeyStoreServerSignature), BApplication(kKeyStoreServerSignature),
@@ -78,6 +81,8 @@ KeyStoreServer::MessageReceived(BMessage* message)
case KEY_STORE_REMOVE_KEY: case KEY_STORE_REMOVE_KEY:
case KEY_STORE_IS_KEYRING_ACCESSIBLE: case KEY_STORE_IS_KEYRING_ACCESSIBLE:
case KEY_STORE_REVOKE_ACCESS: case KEY_STORE_REVOKE_ACCESS:
case KEY_STORE_ADD_KEYRING_TO_MASTER:
case KEY_STORE_REMOVE_KEYRING_FROM_MASTER:
{ {
BString keyringName; BString keyringName;
if (message->FindString("keyring", &keyringName) != B_OK) if (message->FindString("keyring", &keyringName) != B_OK)
@@ -96,6 +101,7 @@ KeyStoreServer::MessageReceived(BMessage* message)
case KEY_STORE_GET_NEXT_KEY: case KEY_STORE_GET_NEXT_KEY:
case KEY_STORE_ADD_KEY: case KEY_STORE_ADD_KEY:
case KEY_STORE_REMOVE_KEY: case KEY_STORE_REMOVE_KEY:
case KEY_STORE_ADD_KEYRING_TO_MASTER:
{ {
// These need keyring access to do anything. // These need keyring access to do anything.
while (!keyring->IsAccessible()) { while (!keyring->IsAccessible()) {
@@ -140,6 +146,7 @@ KeyStoreServer::MessageReceived(BMessage* message)
secondaryIdentifierOptional, &keyMessage); secondaryIdentifierOptional, &keyMessage);
if (result == B_OK) if (result == B_OK)
reply.AddMessage("key", &keyMessage); reply.AddMessage("key", &keyMessage);
break; break;
} }
@@ -265,12 +272,55 @@ KeyStoreServer::MessageReceived(BMessage* message)
{ {
reply.AddBool("accessible", keyring->IsAccessible()); reply.AddBool("accessible", keyring->IsAccessible());
result = B_OK; result = B_OK;
break;
} }
case KEY_STORE_REVOKE_ACCESS: case KEY_STORE_REVOKE_ACCESS:
{ {
keyring->RevokeAccess(); keyring->RevokeAccess();
result = B_OK; result = B_OK;
break;
}
case KEY_STORE_ADD_KEYRING_TO_MASTER:
case KEY_STORE_REMOVE_KEYRING_FROM_MASTER:
{
// We also need access to the default keyring.
while (!fDefaultKeyring->IsAccessible()) {
status_t accessResult = _AccessKeyring(*fDefaultKeyring);
if (accessResult != B_OK) {
result = accessResult;
message->what = 0;
break;
}
}
if (message->what == 0)
break;
BString secondaryIdentifier = keyring->Name();
BMessage keyMessage = keyring->KeyMessage();
keyMessage.RemoveName("identifier");
keyMessage.AddString("identifier", kKeyringKeysIdentifier);
keyMessage.RemoveName("secondaryIdentifier");
keyMessage.AddString("secondaryIdentifier", secondaryIdentifier);
switch (message->what) {
case KEY_STORE_ADD_KEYRING_TO_MASTER:
result = fDefaultKeyring->AddKey(kKeyringKeysIdentifier,
secondaryIdentifier, keyMessage);
break;
case KEY_STORE_REMOVE_KEYRING_FROM_MASTER:
result = fDefaultKeyring->RemoveKey(kKeyringKeysIdentifier,
keyMessage);
break;
}
if (result == B_OK)
_WriteKeyStoreDatabase();
break;
} }
case 0: case 0:
@@ -413,8 +463,8 @@ KeyStoreServer::_AccessKeyring(Keyring& keyring)
// get the key from the default keyring and unlock with that. // get the key from the default keyring and unlock with that.
BMessage keyMessage; BMessage keyMessage;
if (&keyring != fDefaultKeyring && fDefaultKeyring->IsAccessible()) { if (&keyring != fDefaultKeyring && fDefaultKeyring->IsAccessible()) {
if (fDefaultKeyring->FindKey("Keyrings", keyring.Name(), false, if (fDefaultKeyring->FindKey(kKeyringKeysIdentifier, keyring.Name(),
&keyMessage) == B_OK) { false, &keyMessage) == B_OK) {
// We found a key for this keyring, try to access with it. // We found a key for this keyring, try to access with it.
if (keyring.Access(keyMessage) == B_OK) if (keyring.Access(keyMessage) == B_OK)
return B_OK; return B_OK;