diff --git a/CASA/gui/CASAManager.csproj b/CASA/gui/CASAManager.csproj index cc37bdc4..6af1cf2a 100644 --- a/CASA/gui/CASAManager.csproj +++ b/CASA/gui/CASAManager.csproj @@ -185,6 +185,11 @@ SubType = "Code" BuildAction = "Compile" /> + + - /// ******************************************************************** /// private void HandleQuit() diff --git a/CASA/gui/CommonGUI.cs b/CASA/gui/CommonGUI.cs index 6f5cdd61..7ea8c990 100644 --- a/CASA/gui/CommonGUI.cs +++ b/CASA/gui/CommonGUI.cs @@ -39,6 +39,9 @@ namespace Novell.CASA.GUI public class CommonGUI { + public static string HINT_DIR = "Export Directory"; + public static string HINT_FILENAME = "Export Filename"; + [Glade.Widget] Gtk.Label label86, label88; @@ -155,7 +158,7 @@ namespace Novell.CASA.GUI { // prompt user MessageDialog md=new MessageDialog( - mainWindow,Gtk.DialogFlags.Modal, + mainWindow,Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.Ok, "Master Password entered is incorrect"); @@ -212,6 +215,106 @@ namespace Novell.CASA.GUI mTrayInstance.UpdateTrayIcon(false); } } + + public static string FileChooser(FileChooserAction action, String sWindowTitle, String sCurrentFolder, String sHintFileName) + { + FileChooserDialog chooser = new FileChooserDialog (sWindowTitle, + null, + action); + + if (sCurrentFolder != null) + chooser.SetCurrentFolder(sCurrentFolder); + + if (sHintFileName != null) + chooser.SetFilename(sCurrentFolder+sHintFileName); + + + // set location + chooser.SetPosition(Gtk.WindowPosition.CenterAlways); + chooser.AddButton (Stock.Cancel, ResponseType.Cancel); + + if (action == FileChooserAction.Open) + chooser.AddButton (Stock.Open, ResponseType.Ok); + else + chooser.AddButton(Stock.Save, ResponseType.Ok); + + int response = chooser.Run (); + + string ret = null; + if ((ResponseType) response == ResponseType.Ok) + { + ret = chooser.Uri; + } + +/* + // if the action is SAVE, and the file that is choosen exists, prompt the user for overwrite + if (action == FileChooserAction.Save) + { + string sFilename = ret.Substring(8); + if (System.IO.File.Exists(sFilename)) + { + // prompt user for overwrite + + + + } + } +*/ + chooser.Destroy(); + return ret; + } + + /// + /// VerifyMasterPasswordWithUser dialog + /// + public void VerifyMasterPasswordWithUser() + { + + //Logger.DbgLog("GUI:CasaMain.Login() - IsMasterPasswordSet returned false"); +#if W32 + Glade.XML gxmlTemp = new Glade.XML ("../images/casa.glade", "dialogLogin", null); +#endif +#if LINUX + Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null); +#endif + + gxmlTemp.Autoconnect (this); + dialogLogin.TransientFor = (Gtk.Window)CasaMain.gxmlMain.GetWidget("windowMain");; + + label86.Text = "Enter your Master Password to continue."; + entryMasterPassword3.Text=""; + label88.Hide(); + entryMasterPassword4.Hide(); + //dialogLogin.SetPosition(Gtk.WindowPosition.Center); + dialogLogin.Destroyed += new EventHandler(dialogLogin_Destroyed); + dialogLogin.Modal = true; + dialogLogin.Show(); + } + + public static void DisplayMessage(Gtk.MessageType messageType, String sMessage) + { + MessageDialog md = new MessageDialog(null, + Gtk.DialogFlags.Modal, + messageType, + Gtk.ButtonsType.Close, + sMessage); + + md.SetPosition(Gtk.WindowPosition.CenterAlways); + md.Response +=new ResponseHandler(md_Response3); + md.Show(); + + } + + private static void md_Response3(object o, ResponseArgs args) + { + MessageDialog md = (MessageDialog)o; + if (md != null) + { + md.Destroy(); + } + } + + #if W32 public static bool IsGTKSharpInstalled() diff --git a/CASA/gui/ExportSecrets.cs b/CASA/gui/ExportSecrets.cs new file mode 100644 index 00000000..5f46663a --- /dev/null +++ b/CASA/gui/ExportSecrets.cs @@ -0,0 +1,150 @@ +using System; +using System.IO; + +using Novell.CASA.MiCasa.Communication; +using Novell.CASA.MiCasa.Common; + +using Gtk; +using Glade; + +namespace Novell.CASA.GUI +{ + /// + /// Summary description for ExportSecrets. + /// + public class ExportSecrets + { + + private Config m_config = null; + + [Glade.Widget] + Gtk.Label label86, + label88; + + [Glade.Widget] + Gtk.Entry entryMasterPassword; + + [Glade.Widget] + Gtk.Dialog dialogExport; + + [Glade.Widget] + Gtk.CheckButton checkbuttonNoEncrypt; + + public ExportSecrets(Config config) + { + m_config = config; + } + + public void Run() + { + // prompt for master password, and optional passphrase to encrypt + //Logger.DbgLog("GUI:CasaMain.Login() - IsMasterPasswordSet returned false"); +#if W32 + Glade.XML gxmlTemp = new Glade.XML ("../images/casa.glade", "dialogExport", null); +#endif +#if LINUX + Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null); +#endif + + gxmlTemp.Autoconnect (this); + dialogExport.TransientFor = (Gtk.Window)CasaMain.gxmlMain.GetWidget("windowMain");; + + + dialogExport.Destroyed += new EventHandler(dialogExport_Destroyed); + dialogExport.Modal = true; + dialogExport.Show(); + } + private void dialogExport_Destroyed(object sender, EventArgs e) + { + + } + + private void on_buttonCloseExportSecrets_clicked(object sender, EventArgs args) + { + if (dialogExport != null) + { + dialogExport.Destroy(); + } + } + + private void on_buttonOkExportSecrets_clicked(object sender, EventArgs args) + { + if( 0 == miCASA.SetMasterPassword(0, entryMasterPassword.Text) ) + { + string sMasterPWD = entryMasterPassword.Text; + string sEncryptString = entryMasterPassword.Text; + + if (checkbuttonNoEncrypt.Active) + sEncryptString = null; + + if (dialogExport != null) + { + dialogExport.Destroy(); + } + + string sHintDir = m_config.GetConfigSetting(CommonGUI.HINT_DIR, null); + string sHintFile = m_config.GetConfigSetting(CommonGUI.HINT_FILENAME, null); + + // prompt the user for storage location + string sFileName = GetStorageFileName(sHintDir, sHintFile); + + if (sFileName != null) + { + //Store off this location for next export + int iLastSlash = sFileName.LastIndexOf("/"); + if (iLastSlash > 0) + { + sHintFile = sFileName.Substring(iLastSlash + 1); + sHintDir = sFileName.Substring(8, sFileName.Length - sHintFile.Length - 8); + } + + // save for later use + m_config.SetConfigSetting(CommonGUI.HINT_DIR, sHintDir); + m_config.SetConfigSetting(CommonGUI.HINT_FILENAME, sHintFile); + m_config.WriteConfig(); + + // call our daemon to get the users secrets + ExportXMLSecrets exportSecrets = new ExportXMLSecrets(sMasterPWD, sEncryptString); + byte[] theSecrets = (byte[])Novell.CASA.MiCasa.Communication.MiCasaRequestReply.Send(MiCasaRequestReply.VERB_EXPORT_SECRETS, null, null, null, exportSecrets); + + // write em out. + FileStream fs = new FileStream(sFileName.Substring(8), FileMode.Create); + fs.Write(theSecrets, 0, theSecrets.Length); + fs.Flush(); + fs.Close(); + + CommonGUI.DisplayMessage(MessageType.Info, "Secrets saved to: \r\n" + sFileName.Substring(8)); + + } + } + else + { + // prompt user + MessageDialog md=new MessageDialog(dialogExport,Gtk.DialogFlags.Modal, + Gtk.MessageType.Warning, + Gtk.ButtonsType.Ok, + "Master Password incorrect"); + + md.Response +=new ResponseHandler(md_Response2); + md.SetPosition(Gtk.WindowPosition.CenterOnParent); + md.Modal = true; + md.Show(); + } + } + + private string GetStorageFileName(string sHintDir, string sHintFile) + { + String sFileName = CommonGUI.FileChooser(FileChooserAction.Save, "Select filename and location for secrets", sHintDir, sHintFile); + return sFileName; + } + + private void md_Response2(object o, ResponseArgs args) + { + MessageDialog md = (MessageDialog)o; + if (md != null) + { + md.Destroy(); + } + } + } +} diff --git a/CASA/gui/ImportSecrets.cs b/CASA/gui/ImportSecrets.cs new file mode 100644 index 00000000..cdea0b02 --- /dev/null +++ b/CASA/gui/ImportSecrets.cs @@ -0,0 +1,119 @@ +using System; +using System.IO; + +using Novell.CASA.MiCasa.Communication; +using Novell.CASA.MiCasa.Common; + +namespace Novell.CASA.GUI +{ + /// + /// Summary description for ImportSecrets. + /// + public class ImportSecrets + { + Config m_config = null; + public MiCasa m_objMiCasa = null; + byte[] buffer = null; + + [Glade.Widget] + Gtk.Entry entryMasterPassword; + + [Glade.Widget] + Gtk.Dialog dialogImport; + + public ImportSecrets(Config config, MiCasa objMiCasa) + { + m_config = config; + m_objMiCasa = objMiCasa; + } + + public void Run() + { + String sHintDir = m_config.GetConfigSetting(CommonGUI.HINT_DIR, null);; + String sHintFilename = m_config.GetConfigSetting(CommonGUI.HINT_FILENAME, null); + + // ask the user to locate the secret file to import + string sFile = CommonGUI.FileChooser(Gtk.FileChooserAction.Open, "Select import file", sHintDir, sHintFilename); + if (sFile != null) + { + // parse of the file:/// + sFile = sFile.Substring(8); + + if (File.Exists(sFile)) + { + + // let's read it + FileStream fs = new FileStream(sFile, FileMode.Open); + buffer = new byte[fs.Length]; + + int iBytes = fs.Read(buffer, 0, (int)fs.Length); + string data = System.Text.Encoding.ASCII.GetString(buffer); + + fs.Flush(); + fs.Close(); + + // check for clear text secrets + if (data.StartsWith("True - + True gtk-new 1 @@ -78,7 +78,7 @@ - + True gtk-new 1 @@ -99,7 +99,7 @@ - + True gtk-new 1 @@ -125,7 +125,7 @@ - + True gtk-refresh 1 @@ -152,7 +152,7 @@ - + True gtk-dialog-authentication 1 @@ -173,7 +173,7 @@ - + True gtk-open 1 @@ -194,7 +194,7 @@ - + True gtk-delete 1 @@ -213,6 +213,54 @@ + + + True + _Export Secrets + True + + + + + True + gtk-floppy + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + _Import Secrets + True + + + + + True + gtk-open + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + + + True @@ -222,7 +270,7 @@ - + True gtk-quit 1 @@ -258,7 +306,7 @@ - + True gtk-zoom-fit 1 @@ -279,7 +327,7 @@ - + True gtk-jump-to 1 @@ -300,7 +348,7 @@ - + True gtk-copy 1 @@ -328,7 +376,7 @@ - + True gtk-delete 1 @@ -362,7 +410,7 @@ True - + True gtk-execute 1 @@ -384,7 +432,7 @@ - + True gtk-execute 1 @@ -405,7 +453,7 @@ - + True gtk-execute 1 @@ -426,7 +474,7 @@ - + True gtk-execute 1 @@ -447,7 +495,7 @@ - + True gtk-execute 1 @@ -472,7 +520,7 @@ - + True gtk-revert-to-saved 1 @@ -499,7 +547,7 @@ - + True gtk-preferences 1 @@ -533,7 +581,7 @@ - + True gtk-add 1 @@ -554,7 +602,7 @@ - + True gtk-remove 1 @@ -605,7 +653,7 @@ - + True gtk-help 1 @@ -632,7 +680,7 @@ - + True gtk-dialog-info 1 @@ -11863,4 +11911,614 @@ the following characters + + True + CASA - Export Secrets + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER_ALWAYS + True + False + True + CASAicons.ico + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-help + True + GTK_RELIEF_NONE + True + -11 + + + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 0 + + + + True + False + 0 + + + + True + False + 0 + + + + True + gtk-dialog-authentication + 6 + 0.5 + 0.5 + 0 + 0 + + + 4 + False + True + + + + + 4 + True + True + + + + + + True + False + 0 + + + + True + <b>Export miCASA Secrets</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 4 + False + False + + + + + + True + Your Master Password is required to +export your secrets. Your secrets will +be encrypted using your Master Password. + +If you wish, you can export your secrets +in clear text. + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 4 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + 6 + True + 3 + 2 + False + 6 + 6 + + + + True + Master Password : + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + True + True + False + 512 + + True + * + False + + + 1 + 2 + 0 + 1 + + + + + + + True + True + Do not encrypt export file + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 1 + 2 + 1 + 2 + fill + + + + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + + True + CASA - Import Secrets + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER_ALWAYS + True + False + True + CASAicons.ico + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-help + True + GTK_RELIEF_NONE + True + -11 + + + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 0 + + + + True + False + 0 + + + + True + False + 0 + + + + True + gtk-dialog-authentication + 6 + 0.5 + 0.5 + 0 + 0 + + + 4 + False + True + + + + + 4 + True + True + + + + + + True + False + 0 + + + + True + <b>Export miCASA Secrets</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 4 + False + False + + + + + + True + The file you selected appears +to be encypted. Please enter +the Master Password used +to encrypt this file + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 4 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + 6 + True + 3 + 2 + False + 6 + 6 + + + + True + Master Password : + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + True + True + False + 512 + + True + * + False + + + 1 + 2 + 0 + 1 + + + + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + diff --git a/CASA/micasad/cache/SecretStore.cs b/CASA/micasad/cache/SecretStore.cs index 9285f1be..0b35f64e 100644 --- a/CASA/micasad/cache/SecretStore.cs +++ b/CASA/micasad/cache/SecretStore.cs @@ -804,5 +804,49 @@ namespace sscs.cache string homeDir = GetUserHomeDirectory(); return homeDir + ConstStrings.MICASA_VALIDATION_FILE; } + internal byte[] GetSecrets(string sEncryptionString) + { + if (lss != null) + { + MemoryStream ms = lss.GetSecretsAsXMLStream(); + byte[] baSecrets = ms.ToArray(); + + // encrypt if an encryptionstring was passed + if ((sEncryptionString != null) && (sEncryptionString.Length > 0)) + { + byte[] baKey = sscs.crypto.CASACrypto.Generate16ByteKeyFromString(sEncryptionString, null, false); + + // now encypt it. + baSecrets = sscs.crypto.CASACrypto.EncryptData(baSecrets, baKey); + } + return baSecrets; + } + else + { + return null; + } + } + + internal void MergeXMLSecrets(byte[] encryptedXmlSecrets, string sEncryptionString) + { + if (sEncryptionString != null) + { + // decrypt the buffer using the string passed in. + byte[] baKey = sscs.crypto.CASACrypto.Generate16ByteKeyFromString(sEncryptionString, null, false); + byte[] baBuffer = sscs.crypto.CASACrypto.DecryptData(encryptedXmlSecrets, baKey); + MergeXMLSecrets(baBuffer); + } + } + + internal void MergeXMLSecrets(byte[] decryptedXmlSecrets) + { + XmlDocument doc = new XmlDocument(); + String sXMLData = Encoding.ASCII.GetString(decryptedXmlSecrets); + doc.LoadXml(sXMLData); + if (lss != null) + { + lss.AddXMLSecretsToStore(doc); + } + } } } diff --git a/CASA/micasad/communication/win/PipeManager.cs b/CASA/micasad/communication/win/PipeManager.cs index 4100ff96..90708d61 100644 --- a/CASA/micasad/communication/win/PipeManager.cs +++ b/CASA/micasad/communication/win/PipeManager.cs @@ -40,7 +40,7 @@ namespace sscs.communication.win { private uint NumberPipes = 16; private uint OutBuffer = 65536; //512; private uint InBuffer = 65536; //512; - private const int MAX_READ_BYTES = 5000; + private const int MAX_READ_BYTES = 15000; private bool _listen = true; public bool Listen { get { diff --git a/CASA/micasad/lib/Novell.CASA.Common.csproj b/CASA/micasad/lib/Novell.CASA.Common.csproj index 85092f55..c849869c 100644 --- a/CASA/micasad/lib/Novell.CASA.Common.csproj +++ b/CASA/micasad/lib/Novell.CASA.Common.csproj @@ -98,6 +98,16 @@ SubType = "Code" BuildAction = "Compile" /> + + + /// Summary description for ExportSecrets. + /// + /// + [Serializable] + public class ExportXMLSecrets + { + private string m_sMasterPassword = null; + private string m_sPassphrase = null; + + public ExportXMLSecrets(string sMasterPassword, string sPassphrase) + { + m_sMasterPassword = sMasterPassword; + if (sPassphrase != null) + { + m_sPassphrase = sPassphrase; + } + } + + public string GetMasterPassword() + { + return m_sMasterPassword; + } + + public string GetPassphrase() + { + return m_sPassphrase; + } + } +} diff --git a/CASA/micasad/lib/common/ImportXMLSecrets.cs b/CASA/micasad/lib/common/ImportXMLSecrets.cs new file mode 100644 index 00000000..36bea8da --- /dev/null +++ b/CASA/micasad/lib/common/ImportXMLSecrets.cs @@ -0,0 +1,42 @@ +using System; + +namespace Novell.CASA.MiCasa.Common +{ + /// + /// Summary description for AddXMLSecrets. + /// + /// + [Serializable] + public class ImportXMLSecrets + { + private string m_MasterPassword = null; + private byte[] m_XmlSecrets = null; + private string m_sStatus = ""; + + public ImportXMLSecrets(string sMasterPassword, byte[] XmlSecrets) + { + m_MasterPassword = sMasterPassword; + m_XmlSecrets = XmlSecrets; + } + + public string GetMasterPasssword() + { + return m_MasterPassword; + } + + public byte[] GetXmlSecrets() + { + return m_XmlSecrets; + } + + public void SetStatus(string s) + { + m_sStatus = s; + } + + public string GetStatus() + { + return m_sStatus; + } + } +} diff --git a/CASA/micasad/lib/communication/MiCasaRequestReply.cs b/CASA/micasad/lib/communication/MiCasaRequestReply.cs index 25c3f6db..4d5e1bd0 100644 --- a/CASA/micasad/lib/communication/MiCasaRequestReply.cs +++ b/CASA/micasad/lib/communication/MiCasaRequestReply.cs @@ -56,6 +56,8 @@ namespace Novell.CASA.MiCasa.Communication public const int VERB_RESET_MASTER_PASSWORD = 18; public const int VERB_GET_SECRETIDS = 19; public const int VERB_VALIDATE_DESKTOP_PWD = 20; + public const int VERB_EXPORT_SECRETS = 21; + public const int VERB_ADD_XML_SECRETS = 22; public const int VERB_DUMP_LINKED_KEYS = 96; public const int VERB_CREATE_TEST_SECRETS = 97; diff --git a/CASA/micasad/lss/CASACrypto.cs b/CASA/micasad/lss/CASACrypto.cs index a7ccad63..18672892 100644 --- a/CASA/micasad/lss/CASACrypto.cs +++ b/CASA/micasad/lss/CASACrypto.cs @@ -32,143 +32,199 @@ using sscs.constants; namespace sscs.crypto { - public class CASACrypto - { + public class CASACrypto + { - private const int SALTSIZE = 64; - private const int ITERATION_COUNT = 1000; - private const int HASH_SIZE = 32; + private const int SALTSIZE = 64; + private const int ITERATION_COUNT = 1000; + private const int HASH_SIZE = 32; - internal static byte[] Generate16ByteKeyFromString(string sTheString, string sFilepath, bool bUseOldMethod) - { - byte[] baKey = new byte[16]; //return value - try - { - Rfc2898DeriveBytes pkcs5 = new Rfc2898DeriveBytes(sTheString, SALTSIZE, ITERATION_COUNT, bUseOldMethod); - baKey = pkcs5.GetBytes(16); - } - catch(Exception e) - { - CSSSLogger.ExpLog(e.ToString()); - CSSSLogger.DbgLog("Key generation failed"); - baKey = null; - } - return baKey; - } + internal static byte[] Generate16ByteKeyFromString(string sTheString, string sFilepath, bool bUseOldMethod) + { + byte[] baKey = new byte[16]; //return value + try + { + Rfc2898DeriveBytes pkcs5 = new Rfc2898DeriveBytes(sTheString, SALTSIZE, ITERATION_COUNT, bUseOldMethod); + baKey = pkcs5.GetBytes(16); + } + catch(Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + CSSSLogger.DbgLog("Key generation failed"); + baKey = null; + } + return baKey; + } - internal static bool StoreKeySetUsingMasterPasscode(byte[] key, - byte[] IV, byte[] baMasterPasscode, string fileName) - { - bool bRet = false; - FileStream fsEncrypt = null; - CryptoStream csEncrypt = null; - try - { + internal static bool StoreKeySetUsingMasterPasscode(byte[] key, + byte[] IV, byte[] baMasterPasscode, string fileName) + { + bool bRet = false; + FileStream fsEncrypt = null; + CryptoStream csEncrypt = null; + try + { - //Get an encryptor. - RijndaelManaged myRijndael = new RijndaelManaged(); - ICryptoTransform encryptor; - encryptor = myRijndael.CreateEncryptor(baMasterPasscode, GenerateAndSaveIV(fileName, myRijndael)); + //Get an encryptor. + RijndaelManaged myRijndael = new RijndaelManaged(); + ICryptoTransform encryptor; + encryptor = myRijndael.CreateEncryptor(baMasterPasscode, GenerateAndSaveIV(fileName, myRijndael)); - //Encrypt the data to a file - fsEncrypt = new FileStream(fileName, FileMode.Create); + //Encrypt the data to a file + fsEncrypt = new FileStream(fileName, FileMode.Create); // make hidden File.SetAttributes(fileName, FileAttributes.Hidden); - SHA256 sha = new SHA256Managed(); - byte[] hash = sha.ComputeHash(key); + SHA256 sha = new SHA256Managed(); + byte[] hash = sha.ComputeHash(key); - fsEncrypt.Write(hash,0,hash.Length); - fsEncrypt.Flush(); + fsEncrypt.Write(hash,0,hash.Length); + fsEncrypt.Flush(); - csEncrypt = new CryptoStream(fsEncrypt, encryptor, CryptoStreamMode.Write); + csEncrypt = new CryptoStream(fsEncrypt, encryptor, CryptoStreamMode.Write); - //Write all data to the crypto stream and flush it. - csEncrypt.Write(key, 0, key.Length); - csEncrypt.FlushFinalBlock(); - bRet = true; - } - catch(Exception e) - { - CSSSLogger.ExpLog(e.ToString()); - CSSSLogger.DbgLog("Unable to store the generated key"); - bRet = false; - } - if (csEncrypt != null) - csEncrypt.Close(); - if( fsEncrypt != null ) - fsEncrypt.Close(); - return bRet; - } + //Write all data to the crypto stream and flush it. + csEncrypt.Write(key, 0, key.Length); + csEncrypt.FlushFinalBlock(); + bRet = true; + } + catch(Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + CSSSLogger.DbgLog("Unable to store the generated key"); + bRet = false; + } + if (csEncrypt != null) + csEncrypt.Close(); + if( fsEncrypt != null ) + fsEncrypt.Close(); + return bRet; + } - internal static byte[] GetKeySetFromFile(byte[] baMasterPasscode, - string fileName ) - { - byte[] baSavedKey = null; - FileStream fsDecrypt = null; - CryptoStream csDecrypt = null; + internal static byte[] GetKeySetFromFile(byte[] baMasterPasscode, + string fileName ) + { + byte[] baSavedKey = null; + FileStream fsDecrypt = null; + CryptoStream csDecrypt = null; - try - { + try + { #if LINUX UnixFileInfo fsTest = new UnixFileInfo (fileName); if((fsTest == null) || !(fsTest.Exists) || fsTest.IsSymbolicLink) #else - if(!File.Exists(fileName)) + if(!File.Exists(fileName)) #endif - { - return null; - } + { + return null; + } - /* Get a decryptor that uses the same key and IV - * as the encryptor. - */ + /* Get a decryptor that uses the same key and IV + * as the encryptor. + */ - RijndaelManaged myRijndael = new RijndaelManaged(); - ICryptoTransform decryptor = myRijndael.CreateDecryptor(baMasterPasscode, RetrieveIV(fileName, baMasterPasscode)); - //Now decrypt - fsDecrypt = new FileStream(fileName, FileMode.Open); + RijndaelManaged myRijndael = new RijndaelManaged(); + ICryptoTransform decryptor = myRijndael.CreateDecryptor(baMasterPasscode, RetrieveIV(fileName, baMasterPasscode)); + //Now decrypt + fsDecrypt = new FileStream(fileName, FileMode.Open); - byte[] storedHash = new byte[32]; - fsDecrypt.Read(storedHash,0,storedHash.Length); + byte[] storedHash = new byte[32]; + fsDecrypt.Read(storedHash,0,storedHash.Length); - csDecrypt = new CryptoStream(fsDecrypt, decryptor, CryptoStreamMode.Read); - baSavedKey = new byte[32]; + csDecrypt = new CryptoStream(fsDecrypt, decryptor, CryptoStreamMode.Read); + baSavedKey = new byte[32]; - //Read the data out of the crypto stream. - csDecrypt.Read(baSavedKey, 0, baSavedKey.Length); + //Read the data out of the crypto stream. + csDecrypt.Read(baSavedKey, 0, baSavedKey.Length); - SHA256 sha = new SHA256Managed(); - byte[] newHash = sha.ComputeHash(baSavedKey); - for( int i = 0 ; i < 32; i++ ) - { - if(storedHash[i] != newHash[i]) - { - CSSSLogger.DbgLog("Hash doesnot match"); - csDecrypt.Close(); - fsDecrypt.Close(); - return null; - } - } - } - catch(Exception e) - { - CSSSLogger.ExpLog(e.ToString()); - CSSSLogger.DbgLog("Unable to get the stored key"); - baSavedKey = null; - } + SHA256 sha = new SHA256Managed(); + byte[] newHash = sha.ComputeHash(baSavedKey); + for( int i = 0 ; i < 32; i++ ) + { + if(storedHash[i] != newHash[i]) + { + CSSSLogger.DbgLog("Hash doesnot match"); + csDecrypt.Close(); + fsDecrypt.Close(); + return null; + } + } + } + catch(Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + CSSSLogger.DbgLog("Unable to get the stored key"); + baSavedKey = null; + } - if (csDecrypt != null) - csDecrypt.Close(); + if (csDecrypt != null) + csDecrypt.Close(); - if ( fsDecrypt != null ) - fsDecrypt.Close(); + if ( fsDecrypt != null ) + fsDecrypt.Close(); - return baSavedKey; - } + return baSavedKey; + } + + internal static byte[] DecryptData(byte[] encyptedXmlData, byte[] key) + { + CryptoStream csDecrypt = null; + byte[] buffer = new byte[encyptedXmlData.Length]; + MemoryStream ms = new MemoryStream(encyptedXmlData); + + try + { + //Get an decryptor. + RijndaelManaged myRijndael = new RijndaelManaged(); + ICryptoTransform decryptor = myRijndael.CreateDecryptor(key, key); + csDecrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); + + //Read all data to the crypto stream and flush it. + int iBytesRead = csDecrypt.Read(buffer,0,encyptedXmlData.Length); + } + catch(Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + CSSSLogger.DbgLog("decrypting failed."); + } + if (csDecrypt != null) + csDecrypt.Close(); + + return buffer; + } + + internal static byte[] EncryptData(byte[] xmlData, byte[] key) + { + CryptoStream csEncrypt = null; + MemoryStream encryptedData = new MemoryStream(); + try + { + //Get an encryptor. + RijndaelManaged myRijndael = new RijndaelManaged(); + ICryptoTransform encryptor = myRijndael.CreateEncryptor(key, key); + + //csEncrypt = new CryptoStream(fsEncrypt, encryptor, CryptoStreamMode.Write); + csEncrypt = new CryptoStream(encryptedData, encryptor, CryptoStreamMode.Write); + + //Write all data to the crypto stream and flush it. + csEncrypt.Write(xmlData, 0, xmlData.Length); + csEncrypt.FlushFinalBlock(); + } + catch(Exception e) + { + CSSSLogger.ExpLog(e.ToString()); + CSSSLogger.DbgLog("Encrypting failed."); + } + if (csEncrypt != null) + csEncrypt.Close(); + + return encryptedData.ToArray(); + } + internal static void EncryptDataAndWriteToFile(byte[] xmlData, byte[] key, string fileName) diff --git a/CASA/micasad/lss/LocalStorage.cs b/CASA/micasad/lss/LocalStorage.cs index b5c6dafd..7df6a40b 100644 --- a/CASA/micasad/lss/LocalStorage.cs +++ b/CASA/micasad/lss/LocalStorage.cs @@ -237,89 +237,9 @@ namespace sscs.lss { return false; } - xpath = "//" + XmlConsts.miCASANode; - XmlNode miCASANode = doc.SelectSingleNode(xpath); - if(miCASANode != null) - { - xpath = "descendant::" + XmlConsts.keyChainNode; - XmlNodeList keyChainNodeList = miCASANode.SelectNodes(xpath); - foreach(XmlNode node in keyChainNodeList) - { - XmlAttributeCollection attrColl = node.Attributes; - string keyChainId = (attrColl[XmlConsts.idAttr]).Value + "\0"; - KeyChain keyChain = null; - - if( userStore.CheckIfKeyChainExists(keyChainId) == false ) - { - keyChain = new KeyChain(keyChainId); - userStore.AddKeyChain(keyChain); - } - else - { - keyChain = userStore.GetKeyChain(keyChainId); - } - xpath = "descendant::" + XmlConsts.secretNode; - XmlNodeList secretNodeList = node.SelectNodes(xpath); - foreach(XmlNode secretNode in secretNodeList) - { - attrColl = secretNode.Attributes; - string secretId = (attrColl[XmlConsts.idAttr]).Value + "\0"; - xpath = "descendant::" + XmlConsts.valueNode; - Secret secret = new Secret(secretId); - if( keyChain.CheckIfSecretExists(secretId) == false) - { - keyChain.AddSecret(secret); - XmlNode secretValNode = (secretNode.SelectSingleNode(xpath)); - xpath = "descendant::" + XmlConsts.keyNode; - XmlNodeList keyNodeList = secretValNode.SelectNodes(xpath); - - secret = keyChain.GetSecret(secretId); - foreach(XmlNode keyNode in keyNodeList) - { - attrColl = keyNode.Attributes; - string key; - try - { - key = (attrColl[XmlConsts.idAttr]).Value; - } - catch (Exception) - { - // LinkedKey node, continue - continue; - } - xpath = "descendant::" + XmlConsts.keyValueNode; - XmlNode keyValNode = keyNode.SelectSingleNode(xpath); - string keyValue = keyValNode.InnerText; - secret.SetKeyValue(key,keyValue); - - - // add linked keys - xpath = "descendant::" + XmlConsts.linkedKeyNode; - XmlNodeList linkNodeList = keyNode.SelectNodes(xpath); - foreach(XmlNode linkNode in linkNodeList) - { - // get TargetSecretID - xpath = "descendant::" + XmlConsts.linkedTargetSecretNode; - XmlNode targetSecretNode = linkNode.SelectSingleNode(xpath); - string sSecretID = targetSecretNode.InnerText + "\0"; - - // get TargetSecretKey - xpath = "descendant::" + XmlConsts.linkedTargetKeyNode; - XmlNode targetKeyNode = linkNode.SelectSingleNode(xpath); - string sKeyID = targetKeyNode.InnerText; - - LinkedKeyInfo lki = new LinkedKeyInfo(sSecretID, sKeyID, true); - KeyValue kv = secret.GetKeyValue(key); - kv.AddLink(lki); - } - - } - }//if ends - } - - }//end of traversing keyChainNodeList - } + // add these to the store + AddXMLSecretsToStore(doc); } catch(Exception e) { @@ -332,6 +252,94 @@ namespace sscs.lss return true; } + internal void AddXMLSecretsToStore(XmlDocument doc) + { + string xpath = ""; + xpath = "//" + XmlConsts.miCASANode; + XmlNode miCASANode = doc.SelectSingleNode(xpath); + if(miCASANode != null) + { + xpath = "descendant::" + XmlConsts.keyChainNode; + XmlNodeList keyChainNodeList = miCASANode.SelectNodes(xpath); + foreach(XmlNode node in keyChainNodeList) + { + XmlAttributeCollection attrColl = node.Attributes; + string keyChainId = (attrColl[XmlConsts.idAttr]).Value + "\0"; + KeyChain keyChain = null; + + if( userStore.CheckIfKeyChainExists(keyChainId) == false ) + { + keyChain = new KeyChain(keyChainId); + userStore.AddKeyChain(keyChain); + } + else + { + keyChain = userStore.GetKeyChain(keyChainId); + } + xpath = "descendant::" + XmlConsts.secretNode; + XmlNodeList secretNodeList = node.SelectNodes(xpath); + foreach(XmlNode secretNode in secretNodeList) + { + attrColl = secretNode.Attributes; + string secretId = (attrColl[XmlConsts.idAttr]).Value + "\0"; + xpath = "descendant::" + XmlConsts.valueNode; + Secret secret = new Secret(secretId); + if( keyChain.CheckIfSecretExists(secretId) == false) + { + keyChain.AddSecret(secret); + XmlNode secretValNode = (secretNode.SelectSingleNode(xpath)); + xpath = "descendant::" + XmlConsts.keyNode; + + XmlNodeList keyNodeList = secretValNode.SelectNodes(xpath); + + secret = keyChain.GetSecret(secretId); + foreach(XmlNode keyNode in keyNodeList) + { + attrColl = keyNode.Attributes; + string key; + try + { + key = (attrColl[XmlConsts.idAttr]).Value; + } + catch (Exception) + { + // LinkedKey node, continue + continue; + } + xpath = "descendant::" + XmlConsts.keyValueNode; + XmlNode keyValNode = keyNode.SelectSingleNode(xpath); + string keyValue = keyValNode.InnerText; + secret.SetKeyValue(key,keyValue); + + + // add linked keys + xpath = "descendant::" + XmlConsts.linkedKeyNode; + XmlNodeList linkNodeList = keyNode.SelectNodes(xpath); + foreach(XmlNode linkNode in linkNodeList) + { + // get TargetSecretID + xpath = "descendant::" + XmlConsts.linkedTargetSecretNode; + XmlNode targetSecretNode = linkNode.SelectSingleNode(xpath); + string sSecretID = targetSecretNode.InnerText + "\0"; + + // get TargetSecretKey + xpath = "descendant::" + XmlConsts.linkedTargetKeyNode; + XmlNode targetKeyNode = linkNode.SelectSingleNode(xpath); + string sKeyID = targetKeyNode.InnerText; + + LinkedKeyInfo lki = new LinkedKeyInfo(sSecretID, sKeyID, true); + KeyValue kv = secret.GetKeyValue(key); + kv.AddLink(lki); + } + + } + }//if ends + } + + }//end of traversing keyChainNodeList + } + } + private void PersistStoreDelayThreadFn() { Thread.Sleep(15000); diff --git a/CASA/micasad/verbs/ObjectSerialization.cs b/CASA/micasad/verbs/ObjectSerialization.cs index 5cbde52c..a10bb64d 100644 --- a/CASA/micasad/verbs/ObjectSerialization.cs +++ b/CASA/micasad/verbs/ObjectSerialization.cs @@ -33,6 +33,7 @@ using sscs.lss; using System.Runtime.Serialization.Formatters.Binary; using System.IO; +using System.Xml; using Novell.CASA.MiCasa.Common; using Novell.CASA.MiCasa.Communication; @@ -218,6 +219,14 @@ namespace sscs.verbs { return DoValidateDesktopPwd(ssStore, wo); } + case MiCasaRequestReply.VERB_EXPORT_SECRETS: + { + return DoExportSecrets(ssStore, wo); + } + case MiCasaRequestReply.VERB_ADD_XML_SECRETS: + { + return DoMergeXMLSecrets(ssStore, wo); + } default: { @@ -235,6 +244,61 @@ namespace sscs.verbs return wo; } + private WrappedObject DoMergeXMLSecrets(SecretStore ssStore, WrappedObject wo) + { + ImportXMLSecrets addSecrets = (ImportXMLSecrets)wo.GetObject(); + string sMasterPassword = addSecrets.GetMasterPasssword(); + byte[] baXMLSecrets = addSecrets.GetXmlSecrets(); + + try + { + if (sMasterPassword != null) + { + // decrypt secrets if possible + ssStore.MergeXMLSecrets(baXMLSecrets, sMasterPassword); + } + else + { + // do the merge now. + ssStore.MergeXMLSecrets(baXMLSecrets); + } + addSecrets.SetStatus("Success"); + wo.SetError(constants.RetCodes.SUCCESS, ""); + } + catch (Exception e) + { + addSecrets.SetStatus(e.ToString()); + wo.SetError(constants.RetCodes.FAILURE, e.ToString()); + } + + return wo; + } + + private WrappedObject DoExportSecrets(SecretStore ssStore, WrappedObject wo) + { + ExportXMLSecrets secrets = (ExportXMLSecrets)wo.GetObject(); + + // validate masterpassword + try + { + string sMasterPassword = secrets.GetMasterPassword(); + ssStore.UnlockStore(null, sMasterPassword); + } + catch (Exception e) + { + wo.SetError(constants.RetCodes.FAILURE, e.ToString()); + return wo; + } + + string sEncrpyptionPassphrase = secrets.GetPassphrase(); + + // get all secrets + wo.SetObject(ssStore.GetSecrets(sEncrpyptionPassphrase)); + wo.SetError(constants.RetCodes.SUCCESS, ""); + return wo; + + } + private WrappedObject DoValidateDesktopPwd(SecretStore ssStore, WrappedObject wo) { // let's validate the Desktop pwd diff --git a/CASA/package/windows/vs_solutions/CASAInstall/CASA.ncb b/CASA/package/windows/vs_solutions/CASAInstall/CASA.ncb index dac16bdf..a416619d 100644 Binary files a/CASA/package/windows/vs_solutions/CASAInstall/CASA.ncb and b/CASA/package/windows/vs_solutions/CASAInstall/CASA.ncb differ diff --git a/CASA/package/windows/vs_solutions/CASAInstall/CASA.suo b/CASA/package/windows/vs_solutions/CASAInstall/CASA.suo index 5699ac49..6ef73979 100644 Binary files a/CASA/package/windows/vs_solutions/CASAInstall/CASA.suo and b/CASA/package/windows/vs_solutions/CASAInstall/CASA.suo differ diff --git a/CASA/package/windows/vs_solutions/CASAInstall/CASA.vdproj b/CASA/package/windows/vs_solutions/CASAInstall/CASA.vdproj index 75faa8e1..587ecd08 100644 --- a/CASA/package/windows/vs_solutions/CASAInstall/CASA.vdproj +++ b/CASA/package/windows/vs_solutions/CASAInstall/CASA.vdproj @@ -21,24 +21,6 @@ } "Entry" { - "MsmKey" = "8:_43A67B1DA6D34A6098E563CC902B950F" - "OwnerKey" = "8:_A6D188F9B5AF430C92D0B9606ADF4C63" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_43A67B1DA6D34A6098E563CC902B950F" - "OwnerKey" = "8:_98DCC664712A41B993FCD33026D06FFC" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_43A67B1DA6D34A6098E563CC902B950F" - "OwnerKey" = "8:_BF2CE61978054B2DB482792974E390F0" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_6CE0B932302E4E3783AAD1EA468ABD34" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -75,6 +57,24 @@ } "Entry" { + "MsmKey" = "8:_EF3E9937AC8B4A898E7B80BCEA175E6A" + "OwnerKey" = "8:_98DCC664712A41B993FCD33026D06FFC" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_EF3E9937AC8B4A898E7B80BCEA175E6A" + "OwnerKey" = "8:_BF2CE61978054B2DB482792974E390F0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_EF3E9937AC8B4A898E7B80BCEA175E6A" + "OwnerKey" = "8:_A6D188F9B5AF430C92D0B9606ADF4C63" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_EF467E7BEF8E4109BAD7E2FE47508D13" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -307,13 +307,13 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:CASA" - "ProductCode" = "8:{9763A76D-50C8-4D81-AAB2-0415D042E299}" - "PackageCode" = "8:{A775679E-BE18-4FCC-884B-B5A6626CD0A4}" + "ProductCode" = "8:{970A65D5-A969-4659-B2AF-F212B518F99A}" + "PackageCode" = "8:{1368B6D9-3ACA-446D-8E33-C207F44508D6}" "UpgradeCode" = "8:{DFD8B8A0-EA51-4202-831C-7CD2B90A63AE}" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" - "ProductVersion" = "8:1.7.732" + "ProductVersion" = "8:1.7.786" "Manufacturer" = "8:Novell" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" @@ -835,7 +835,7 @@ } "MergeModule" { - "{35A69C6E-5BA4-440D-803D-762B59A45393}:_43A67B1DA6D34A6098E563CC902B950F" + "{35A69C6E-5BA4-440D-803D-762B59A45393}:_EF3E9937AC8B4A898E7B80BCEA175E6A" { "UseDynamicProperties" = "11:TRUE" "IsDependency" = "11:TRUE" @@ -854,7 +854,7 @@ { "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_98DCC664712A41B993FCD33026D06FFC" { - "SourcePath" = "8:..\\CASA-gui-msm\\Debug\\CASA-gui.msm" + "SourcePath" = "8:..\\CASA-gui-msm\\Release\\CASA-gui.msm" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_E8900D5F0BD44DC0BB0BEFDF7C43B30C" @@ -907,7 +907,7 @@ } "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_A6D188F9B5AF430C92D0B9606ADF4C63" { - "SourcePath" = "8:..\\CASA-dev-msm\\Debug\\miCASA-Dev-msm.msm" + "SourcePath" = "8:..\\CASA-dev-msm\\Release\\miCASA-Dev-msm.msm" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_E8900D5F0BD44DC0BB0BEFDF7C43B30C" @@ -939,17 +939,31 @@ "SourcePath" = "8:..\\CASA-dev-msm\\Release\\miCASA-Dev-msm.msm" "Properties" { - "_62D43560615587AE3DB95A0BA428D5BE.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "_4610C2D660057AC39D7FDD4891590B10.4F1ACC03A482468C9BEBF6D83FA4F7FE" { - "Name" = "8:_62D43560615587AE3DB95A0BA428D5BE.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Name" = "8:_4610C2D660057AC39D7FDD4891590B10.4F1ACC03A482468C9BEBF6D83FA4F7FE" "DisplayName" = "8:" "Description" = "8:" "Type" = "3:2" - "ContextData" = "8:InstallToGAC=;IsolateToManifest=_A1ECD7DAF522A0E5D85BCDD9EAED3209.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "ContextData" = "8:InstallToGAC=;IsolateToManifest=_8FCF3A547028ECFD0B5049EFAB348182.4F1ACC03A482468C9BEBF6D83FA4F7FE" "Attributes" = "3:0" "Setting" = "3:2" - "Value" = "8:_A1ECD7DAF522A0E5D85BCDD9EAED3209.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "DefaultValue" = "8:_A1ECD7DAF522A0E5D85BCDD9EAED3209.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Value" = "8:_8FCF3A547028ECFD0B5049EFAB348182.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "DefaultValue" = "8:_8FCF3A547028ECFD0B5049EFAB348182.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "ParentName" = "8:_6418E7496A474EDDAC9A91150BBE4A26.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "UsePlugInResources" = "11:FALSE" + } + "_4F85CEF984A77868D0A929E54872824F.4F1ACC03A482468C9BEBF6D83FA4F7FE" + { + "Name" = "8:_4F85CEF984A77868D0A929E54872824F.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "DisplayName" = "8:" + "Description" = "8:" + "Type" = "3:2" + "ContextData" = "8:InstallToGAC=;IsolateToManifest=_0683B4C519DB3748EBD996E0ABA831C0.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:_0683B4C519DB3748EBD996E0ABA831C0.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "DefaultValue" = "8:_0683B4C519DB3748EBD996E0ABA831C0.4F1ACC03A482468C9BEBF6D83FA4F7FE" "ParentName" = "8:_6418E7496A474EDDAC9A91150BBE4A26.4F1ACC03A482468C9BEBF6D83FA4F7FE" "UsePlugInResources" = "11:FALSE" } @@ -964,59 +978,45 @@ "Setting" = "3:1" "UsePlugInResources" = "11:FALSE" } - "_6E1C74B0F6DBAA22C571F4B02C1DB283.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "_B6F5734BF952F464EAB21BAD6E20F38A.4F1ACC03A482468C9BEBF6D83FA4F7FE" { - "Name" = "8:_6E1C74B0F6DBAA22C571F4B02C1DB283.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Name" = "8:_B6F5734BF952F464EAB21BAD6E20F38A.4F1ACC03A482468C9BEBF6D83FA4F7FE" "DisplayName" = "8:" "Description" = "8:" "Type" = "3:2" - "ContextData" = "8:InstallToGAC=;IsolateToManifest=_E33B56BF66EDE9E5F123E5CB7C4EEAB7.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "ContextData" = "8:InstallToGAC=;IsolateToManifest=_79BCEE497E2B712D20C7E4A2F4800E60.4F1ACC03A482468C9BEBF6D83FA4F7FE" "Attributes" = "3:0" "Setting" = "3:2" - "Value" = "8:_E33B56BF66EDE9E5F123E5CB7C4EEAB7.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "DefaultValue" = "8:_E33B56BF66EDE9E5F123E5CB7C4EEAB7.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Value" = "8:_79BCEE497E2B712D20C7E4A2F4800E60.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "DefaultValue" = "8:_79BCEE497E2B712D20C7E4A2F4800E60.4F1ACC03A482468C9BEBF6D83FA4F7FE" "ParentName" = "8:_6418E7496A474EDDAC9A91150BBE4A26.4F1ACC03A482468C9BEBF6D83FA4F7FE" "UsePlugInResources" = "11:FALSE" } - "_95C01A87787956AC69FC2E9C7FA507A7.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "_E7CF2B4A827BE173141CA1E1D0F82AFF.4F1ACC03A482468C9BEBF6D83FA4F7FE" { - "Name" = "8:_95C01A87787956AC69FC2E9C7FA507A7.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Name" = "8:_E7CF2B4A827BE173141CA1E1D0F82AFF.4F1ACC03A482468C9BEBF6D83FA4F7FE" "DisplayName" = "8:" "Description" = "8:" "Type" = "3:2" - "ContextData" = "8:InstallToGAC=;IsolateToManifest=_79C6F8F43FF4CB3AF63B925D0EA1C564.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "ContextData" = "8:InstallToGAC=;IsolateToManifest=_108CF762A5E732DB8AA6185773BCA705.4F1ACC03A482468C9BEBF6D83FA4F7FE" "Attributes" = "3:0" "Setting" = "3:2" - "Value" = "8:_79C6F8F43FF4CB3AF63B925D0EA1C564.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "DefaultValue" = "8:_79C6F8F43FF4CB3AF63B925D0EA1C564.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Value" = "8:_108CF762A5E732DB8AA6185773BCA705.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "DefaultValue" = "8:_108CF762A5E732DB8AA6185773BCA705.4F1ACC03A482468C9BEBF6D83FA4F7FE" "ParentName" = "8:_6418E7496A474EDDAC9A91150BBE4A26.4F1ACC03A482468C9BEBF6D83FA4F7FE" "UsePlugInResources" = "11:FALSE" } - "_E1A13CA07F77E5ABDB363BA4E14A8EED.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "_F0F8D6D23B097F7830C01E614D9034B9.4F1ACC03A482468C9BEBF6D83FA4F7FE" { - "Name" = "8:_E1A13CA07F77E5ABDB363BA4E14A8EED.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Name" = "8:_F0F8D6D23B097F7830C01E614D9034B9.4F1ACC03A482468C9BEBF6D83FA4F7FE" "DisplayName" = "8:" "Description" = "8:" "Type" = "3:2" - "ContextData" = "8:InstallToGAC=;IsolateToManifest=_793F49C101FDC71EA468B0F50F5E7FF8.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "ContextData" = "8:InstallToGAC=;IsolateToManifest=_290870C7D1693472634A9D8D875DA83B.4F1ACC03A482468C9BEBF6D83FA4F7FE" "Attributes" = "3:0" "Setting" = "3:2" - "Value" = "8:_793F49C101FDC71EA468B0F50F5E7FF8.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "DefaultValue" = "8:_793F49C101FDC71EA468B0F50F5E7FF8.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "ParentName" = "8:_6418E7496A474EDDAC9A91150BBE4A26.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "UsePlugInResources" = "11:FALSE" - } - "_ED516AEF413A6424C60E58C4FE881B58.4F1ACC03A482468C9BEBF6D83FA4F7FE" - { - "Name" = "8:_ED516AEF413A6424C60E58C4FE881B58.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "DisplayName" = "8:" - "Description" = "8:" - "Type" = "3:2" - "ContextData" = "8:InstallToGAC=;IsolateToManifest=_4CF0917F390ACC0AF5A1750516A3993E.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:_4CF0917F390ACC0AF5A1750516A3993E.4F1ACC03A482468C9BEBF6D83FA4F7FE" - "DefaultValue" = "8:_4CF0917F390ACC0AF5A1750516A3993E.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "Value" = "8:_290870C7D1693472634A9D8D875DA83B.4F1ACC03A482468C9BEBF6D83FA4F7FE" + "DefaultValue" = "8:_290870C7D1693472634A9D8D875DA83B.4F1ACC03A482468C9BEBF6D83FA4F7FE" "ParentName" = "8:_6418E7496A474EDDAC9A91150BBE4A26.4F1ACC03A482468C9BEBF6D83FA4F7FE" "UsePlugInResources" = "11:FALSE" } @@ -1030,7 +1030,7 @@ } "{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_BF2CE61978054B2DB482792974E390F0" { - "SourcePath" = "8:..\\CASA-msm\\Debug\\CASA-msm.msm" + "SourcePath" = "8:..\\CASA-msm\\Release\\CASA-msm.msm" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_E8900D5F0BD44DC0BB0BEFDF7C43B30C"