Bug 135387, 135393
This commit is contained in:
11
c_micasad/cache/KeyChain.cs
vendored
11
c_micasad/cache/KeyChain.cs
vendored
@@ -89,6 +89,17 @@ class KeyChain : IKeychain
|
||||
|
||||
public void RemoveSecret(String secretID)
|
||||
{
|
||||
// remove all keyvalues first, as to unlink reverse links
|
||||
try
|
||||
{
|
||||
Secret secret = GetSecret(secretID);
|
||||
secret.RemoveAllKeyValuePairs(this);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
SecretList.Remove(secretID);
|
||||
this.ModifiedTime = DateTime.Now;
|
||||
}
|
||||
|
||||
50
c_micasad/cache/Secret.cs
vendored
50
c_micasad/cache/Secret.cs
vendored
@@ -2,6 +2,8 @@ using System;
|
||||
using System.Text;
|
||||
using System.Collections;
|
||||
|
||||
using Novell.CASA.MiCasa.Common;
|
||||
|
||||
namespace sscs.cache
|
||||
{
|
||||
class Secret : ISecret
|
||||
@@ -195,14 +197,51 @@ namespace sscs.cache
|
||||
return null;
|
||||
}
|
||||
|
||||
public void RemoveKeyValue(string key)
|
||||
{
|
||||
internal void RemoveAllKeyValuePairs(KeyChain kc)
|
||||
{
|
||||
if (htKeyValues != null)
|
||||
{
|
||||
IDictionaryEnumerator enumer = htKeyValues.GetEnumerator();
|
||||
while (enumer.MoveNext())
|
||||
{
|
||||
String key = (String)enumer.Key;
|
||||
RemoveKeyValue(kc, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveKeyValue(KeyChain kc, string key)
|
||||
{
|
||||
if (htKeyValues.Contains(key))
|
||||
{
|
||||
// remove all reverse links first
|
||||
RemoveReverseLinkedKeys(kc, key);
|
||||
htKeyValues.Remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveReverseLinkedKeys(KeyChain kc, string keyId)
|
||||
{
|
||||
Hashtable linkedKeys = GetLinkedKeys(keyId);
|
||||
if (kc != null && linkedKeys != null)
|
||||
{
|
||||
IDictionaryEnumerator lkis = linkedKeys.GetEnumerator();
|
||||
while (lkis.MoveNext())
|
||||
{
|
||||
LinkedKeyInfo lki = (LinkedKeyInfo)lkis.Value;
|
||||
|
||||
// look up reverse linked key
|
||||
Secret secret = kc.GetSecret(lki.GetLinkedSecretID());
|
||||
if (secret != null)
|
||||
{
|
||||
// look up linked key
|
||||
KeyValue kv = secret.GetKeyValue(lki.GetLinkedKeyID());
|
||||
kv.RemoveLink(secretID + ":" + keyId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public DateTime GetKeyValueCreatedTime(string key)
|
||||
{
|
||||
if (htKeyValues.Contains(key))
|
||||
@@ -238,8 +277,9 @@ namespace sscs.cache
|
||||
}
|
||||
|
||||
|
||||
public void MergeSecret(Secret newSecret)
|
||||
{
|
||||
public void MergeSecret(SecretStore store, Secret newSecret)
|
||||
{
|
||||
|
||||
IDictionaryEnumerator etor = (IDictionaryEnumerator)newSecret.htKeyValues.GetEnumerator();
|
||||
while(etor.MoveNext())
|
||||
{
|
||||
@@ -254,7 +294,7 @@ namespace sscs.cache
|
||||
{
|
||||
string sKey = (string)etor.Key;
|
||||
if(!htKeyValues.Contains(sKey))
|
||||
this.RemoveKeyValue(sKey);
|
||||
this.RemoveKeyValue(store.GetKeyChainDefault(), sKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
10
c_micasad/cache/SecretStore.cs
vendored
10
c_micasad/cache/SecretStore.cs
vendored
@@ -505,6 +505,12 @@ namespace sscs.cache
|
||||
keyChainList.Remove(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
internal KeyChain GetKeyChainDefault()
|
||||
{
|
||||
return GetKeyChain("SSCS_SESSION_KEY_CHAIN_ID\0");
|
||||
}
|
||||
|
||||
internal KeyChain GetKeyChain(string id)
|
||||
{
|
||||
if(keyChainList.ContainsKey(id))
|
||||
@@ -519,9 +525,9 @@ namespace sscs.cache
|
||||
CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Keychain doesnot exist.Returning null.");
|
||||
throw new KeyChainDoesNotExistException(id);
|
||||
}
|
||||
|
||||
}
|
||||
internal bool CheckIfKeyChainExists(string id)
|
||||
|
||||
internal bool CheckIfKeyChainExists(string id)
|
||||
{
|
||||
if(keyChainList.ContainsKey(id))
|
||||
return true;
|
||||
|
||||
@@ -26,7 +26,7 @@ using System.Runtime.CompilerServices;
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.5.146.0")]
|
||||
|
||||
//
|
||||
// In order to sign your assembly you must specify a key to use. Refer to the
|
||||
|
||||
@@ -300,7 +300,7 @@
|
||||
/>
|
||||
<File
|
||||
RelPath = "init\ProjectInstaller.cs"
|
||||
SubType = "Component"
|
||||
SubType = "Code"
|
||||
BuildAction = "Compile"
|
||||
/>
|
||||
<File
|
||||
@@ -310,7 +310,7 @@
|
||||
/>
|
||||
<File
|
||||
RelPath = "init\WinSecretStoreClientService.cs"
|
||||
SubType = "Component"
|
||||
SubType = "Code"
|
||||
BuildAction = "Compile"
|
||||
/>
|
||||
<File
|
||||
|
||||
@@ -248,7 +248,7 @@ namespace sscs.verbs
|
||||
else
|
||||
{
|
||||
secret = keyChain.GetSecret(secretID);
|
||||
secret.RemoveKeyValue(keyID);
|
||||
secret.RemoveKeyValue(keyChain, keyID);
|
||||
wo.SetError(constants.RetCodes.SUCCESS, null);
|
||||
ssStore.UpdatePersistentStore();
|
||||
}
|
||||
@@ -263,34 +263,39 @@ namespace sscs.verbs
|
||||
|
||||
private WrappedObject DoReadKey(SecretStore ssStore, WrappedObject wo)
|
||||
{
|
||||
try
|
||||
if (!ssStore.IsStoreLocked())
|
||||
{
|
||||
string keychainID = wo.GetKeychainID();
|
||||
string secretID = wo.GetSecretID();
|
||||
string keyID = wo.GetKeyID();
|
||||
|
||||
|
||||
// string sValue = (String)wo.GetObject();
|
||||
|
||||
KeyChain keyChain = ssStore.GetKeyChain(keychainID);
|
||||
Secret secret = null;
|
||||
if( keyChain.CheckIfSecretExists(secretID) == false)
|
||||
try
|
||||
{
|
||||
wo.SetError(constants.RetCodes.FAILURE,"Secret does not exist");
|
||||
string keychainID = wo.GetKeychainID();
|
||||
string secretID = wo.GetSecretID();
|
||||
string keyID = wo.GetKeyID();
|
||||
|
||||
|
||||
// string sValue = (String)wo.GetObject();
|
||||
|
||||
KeyChain keyChain = ssStore.GetKeyChain(keychainID);
|
||||
Secret secret = null;
|
||||
if( keyChain.CheckIfSecretExists(secretID) == false)
|
||||
{
|
||||
wo.SetError(constants.RetCodes.FAILURE,"Secret does not exist");
|
||||
}
|
||||
else
|
||||
{
|
||||
secret = keyChain.GetSecret(secretID);
|
||||
KeyValue kv = secret.GetKeyValue(keyID);
|
||||
string value = kv.GetValue();
|
||||
wo.SetObject(value);
|
||||
wo.SetError(constants.RetCodes.SUCCESS, null);
|
||||
}
|
||||
}
|
||||
else
|
||||
catch (Exception e)
|
||||
{
|
||||
secret = keyChain.GetSecret(secretID);
|
||||
KeyValue kv = secret.GetKeyValue(keyID);
|
||||
string value = kv.GetValue();
|
||||
wo.SetObject(value);
|
||||
wo.SetError(constants.RetCodes.SUCCESS, null);
|
||||
wo.SetError(constants.RetCodes.FAILURE, e.ToString());
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
wo.SetError(constants.RetCodes.FAILURE, e.ToString());
|
||||
}
|
||||
else
|
||||
wo.SetError(constants.RetCodes.FAILURE, "Store locked");
|
||||
|
||||
return wo;
|
||||
}
|
||||
@@ -330,40 +335,46 @@ namespace sscs.verbs
|
||||
|
||||
private WrappedObject DoWriteKey(SecretStore ssStore, WrappedObject wo)
|
||||
{
|
||||
try
|
||||
if (!ssStore.IsStoreLocked())
|
||||
{
|
||||
string keychainID = wo.GetKeychainID();
|
||||
string secretID = wo.GetSecretID();
|
||||
string keyID = wo.GetKeyID();
|
||||
string sValue = (String)wo.GetObject();
|
||||
|
||||
if (secretID.IndexOf("*") < 0)
|
||||
try
|
||||
{
|
||||
|
||||
KeyChain keyChain = ssStore.GetKeyChain(keychainID);
|
||||
Secret secret;
|
||||
if( keyChain.CheckIfSecretExists(secretID) == false)
|
||||
string keychainID = wo.GetKeychainID();
|
||||
string secretID = wo.GetSecretID();
|
||||
string keyID = wo.GetKeyID();
|
||||
string sValue = (String)wo.GetObject();
|
||||
|
||||
if (secretID.IndexOf("*") < 0)
|
||||
{
|
||||
secret = new Secret(secretID);
|
||||
keyChain.AddSecret(secret);
|
||||
|
||||
KeyChain keyChain = ssStore.GetKeyChain(keychainID);
|
||||
Secret secret;
|
||||
if( keyChain.CheckIfSecretExists(secretID) == false)
|
||||
{
|
||||
secret = new Secret(secretID);
|
||||
keyChain.AddSecret(secret);
|
||||
}
|
||||
else
|
||||
{
|
||||
secret = keyChain.GetSecret(secretID);
|
||||
}
|
||||
secret.SetKeyValue(keyID, sValue);
|
||||
|
||||
ChangeLinkedKeys(keyChain, secret, keyID, sValue);
|
||||
wo.SetError(constants.RetCodes.SUCCESS, null);
|
||||
ssStore.UpdatePersistentStore();
|
||||
}
|
||||
else
|
||||
{
|
||||
secret = keyChain.GetSecret(secretID);
|
||||
}
|
||||
secret.SetKeyValue(keyID, sValue);
|
||||
|
||||
ChangeLinkedKeys(keyChain, secret, keyID, sValue);
|
||||
wo.SetError(constants.RetCodes.SUCCESS, null);
|
||||
ssStore.UpdatePersistentStore();
|
||||
wo.SetError(constants.RetCodes.FAILURE, null);
|
||||
}
|
||||
else
|
||||
wo.SetError(constants.RetCodes.FAILURE, null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
wo.SetError(constants.RetCodes.FAILURE, e.ToString());
|
||||
catch (Exception e)
|
||||
{
|
||||
wo.SetError(constants.RetCodes.FAILURE, e.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
wo.SetError(constants.RetCodes.FAILURE, "Store locked");
|
||||
|
||||
return wo;
|
||||
|
||||
@@ -626,8 +637,7 @@ namespace sscs.verbs
|
||||
|
||||
return wo;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private WrappedObject DoSetLinkedKey(SecretStore ssStore, WrappedObject wo)
|
||||
{
|
||||
|
||||
@@ -691,7 +701,7 @@ namespace sscs.verbs
|
||||
|
||||
return wo;
|
||||
}
|
||||
|
||||
|
||||
private WrappedObject DoPing(WrappedObject wo)
|
||||
{
|
||||
//Console.WriteLine("MICASAD received Ping from Client");
|
||||
|
||||
@@ -153,7 +153,7 @@ namespace sscs.verbs
|
||||
{
|
||||
Secret masterSecret = keyChain.GetSecret(secretId);
|
||||
string oldPasswd = masterSecret.GetKeyValue(ConstStrings.MICASA_DESKTOP_PASSWD_KEYNAME).GetValue();
|
||||
masterSecret.MergeSecret(secret);
|
||||
masterSecret.MergeSecret(ssStore, secret);
|
||||
//keyChain.RemoveSecret(secretId);
|
||||
keyChain.AddSecret(secret);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user