diff --git a/c_micasad/cache/SecretStore.cs b/c_micasad/cache/SecretStore.cs index e1b76480..1879e6da 100644 --- a/c_micasad/cache/SecretStore.cs +++ b/c_micasad/cache/SecretStore.cs @@ -597,6 +597,18 @@ namespace sscs.cache return true; } + internal bool ChangeMasterPassword(string sCurrentPWD, string sNewPWD) + { + string sMasterFilePath = GetPasscodeByMasterPasswdFilePath(); + byte[] baPasscode = CASACrypto.GetMasterPasscodeUsingMasterPasswd(sCurrentPWD, sMasterFilePath); + if (baPasscode != null) + { + CASACrypto.EncryptAndStoreMasterPasscodeUsingString(baPasscode, sNewPWD, sMasterFilePath); + return true; + } + return false; + } + internal string GetDesktopPasswd() { try diff --git a/c_micasad/lib/Novell.CASA.Common.csproj b/c_micasad/lib/Novell.CASA.Common.csproj index 6bc05488..583a94cc 100644 --- a/c_micasad/lib/Novell.CASA.Common.csproj +++ b/c_micasad/lib/Novell.CASA.Common.csproj @@ -113,6 +113,11 @@ SubType = "Code" BuildAction = "Compile" /> + + /// Summary description for ResetMasterPassword. + /// + /// + [Serializable] + public class ResetMasterPassword + { + public string m_currentPassword; + public string m_newPassword; + public int rcode = 0; + + public ResetMasterPassword(string currentPassword, string newPassword) + { + m_currentPassword = currentPassword; + m_newPassword = newPassword; + } + } +} diff --git a/c_micasad/lib/communication/MiCasaRequestReply.cs b/c_micasad/lib/communication/MiCasaRequestReply.cs index 929586e8..5d87b952 100644 --- a/c_micasad/lib/communication/MiCasaRequestReply.cs +++ b/c_micasad/lib/communication/MiCasaRequestReply.cs @@ -30,6 +30,7 @@ namespace Novell.CASA.MiCasa.Communication public const int VERB_REMOVE_KEY = 15; public const int VERB_READ_KEY = 16; public const int VERB_GET_KEY_LIST = 17; + public const int VERB_RESET_MASTER_PASSWORD = 18; public const int VERB_DUMP_LINKED_KEYS = 96; public const int VERB_CREATE_TEST_SECRETS = 97; @@ -129,7 +130,10 @@ namespace Novell.CASA.MiCasa.Communication reply = (WrappedObject)formatter.Deserialize(ms); if (reply.GetReturnCode() != 0) + { + ipcChannel.Close(); throw new Exception(reply.GetReturnCode().ToString()); + } } diff --git a/c_micasad/lib/objs.lux b/c_micasad/lib/objs.lux index 662906f2..b1d80d57 100644 --- a/c_micasad/lib/objs.lux +++ b/c_micasad/lib/objs.lux @@ -2,6 +2,7 @@ OBJS=\ AssemblyInfo \ common/LinkedKeyInfo \ common/Ping \ + common/ResetMasterPassword \ common/WrappedObject \ common/MiCASAStore \ communication/IClientChannel \ diff --git a/c_micasad/lib/src.lux b/c_micasad/lib/src.lux index 222d9b00..1cd67403 100644 --- a/c_micasad/lib/src.lux +++ b/c_micasad/lib/src.lux @@ -2,6 +2,7 @@ SRC=\ AssemblyInfo.cs \ common/LinkedKeyInfo.cs \ common/Ping.cs \ + common/ResetMasterPassword.cs \ common/WrappedObject.cs \ common/MiCASAStore.cs \ communication/IClientChannel.cs \ diff --git a/c_micasad/verbs/ObjectSerialization.cs b/c_micasad/verbs/ObjectSerialization.cs index 15da1b2a..f59a66b2 100644 --- a/c_micasad/verbs/ObjectSerialization.cs +++ b/c_micasad/verbs/ObjectSerialization.cs @@ -183,6 +183,11 @@ namespace sscs.verbs { return DoGetKeyList(ssStore, wo); } + case MiCasaRequestReply.VERB_RESET_MASTER_PASSWORD: + { + return DoResetMasterPassword(ssStore, wo); + } + default: { wo.SetError(constants.RetCodes.FAILURE, "Verb Not Supported"); @@ -654,6 +659,39 @@ namespace sscs.verbs return wo; } + + private WrappedObject DoResetMasterPassword(SecretStore ssStore, WrappedObject wo) + { + ResetMasterPassword rmp = (ResetMasterPassword)wo.GetObject(); + // verify current master password + try + { + string sMasterPassword = rmp.m_currentPassword; + ssStore.UnlockStore(null, sMasterPassword); + } + catch (Exception e) + { + wo.SetError(constants.RetCodes.FAILURE, e.ToString()); + return wo; + } + + // change master master password + string sNewPassword = rmp.m_newPassword; + if (sNewPassword == null || sNewPassword.Length < 8) + { + wo.SetError(constants.RetCodes.FAILURE, null); + return wo; + } + + if (!ssStore.ChangeMasterPassword(rmp.m_currentPassword, rmp.m_newPassword)) + wo.SetError(constants.RetCodes.FAILURE, null); + else + wo.SetError(constants.RetCodes.SUCCESS, null); + + + return wo; + } + private WrappedObject DoPing(WrappedObject wo) { //Console.WriteLine("MICASAD received Ping from Client");