///################################################################# /// PROJECT : CASA - Common Authentication Services Adapter /// FILE : KdeWallet.cs /// DESCRIPTION : GUI implementation of KDE-Wallet store. /// AUTHORS : CSL.Manojna /// UPDATED ON : 26 Sept, 05 ///################################################################# namespace Novell.CASA.GUI { using System; using Gtk; using Glade; using Novell.CASA.MiCasa.Common; using Novell.CASA.MiCasa.Communication; public class KdeWallet : Store { Gtk.TreeStore tsSecretIDKdeWallet, tsNativeInfoKdeWallet, tsKeyValue; CellRendererText cellEditable; public bool IS_STORE_AGGREGATED = false; #region Glade Widgets [Glade.Widget] public Gtk.TreeView tvSecretIDKdeWallet; [Glade.Widget] Gtk.TreeView tvKeyValue, tvNativeInfoKdeWallet; [Glade.Widget] Gtk.Dialog dialogManageSecret, dialogLogin; [Glade.Widget] Gtk.Menu menuRightClick; [Glade.Widget] Gtk.Entry entrySecretID, entryKey, entryValue, entryMasterPassword3, entryMasterPassword4; [Glade.Widget] Gtk.CheckButton cbuttonShowPassword; [Glade.Widget] Gtk.Label label86, label88; [Glade.Widget] Gtk.Button buttonNewAdd, buttonNewRemove, buttonManageOk; [Glade.Widget] Gtk.MenuItem cmiNewSecret, cmiNewKey, cmiDelete, cmiView, cmiLink, cmiCopy; #endregion ///####################################################################### /// CONSTRUCTOR /// /// /// public KdeWallet() { Logger.DbgLog("GUI:KdeWallet.KdeWallet() - BEGIN"); /// SecretID TreeStore tvSecretIDKdeWallet = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvSecretIDKdeWallet"); tsSecretIDKdeWallet = new TreeStore(typeof(string), typeof(string[]), typeof(string[]), typeof(string), typeof(string[]), typeof(string[])); tvSecretIDKdeWallet.AppendColumn("Secret-ID",new CellRendererText(),"text",0); tvSecretIDKdeWallet.Model = tsSecretIDKdeWallet; tvSecretIDKdeWallet.RowActivated += new RowActivatedHandler(OntvSecretIDKdeWalletRowActivated); tvSecretIDKdeWallet.ButtonReleaseEvent += new ButtonReleaseEventHandler(OnRightClicked); tvSecretIDKdeWallet.CursorChanged += new EventHandler(OnCursorChanged); /// NativeInfo TreeStore tvNativeInfoKdeWallet = (Gtk.TreeView)CasaMain.gxml.GetWidget("tvNativeInfoKdeWallet"); tsNativeInfoKdeWallet = new TreeStore(typeof(string), typeof(string)); tvNativeInfoKdeWallet.AppendColumn("NativeKey",new CellRendererText(),"text",0); tvNativeInfoKdeWallet.AppendColumn("NativeValue",new CellRendererText(),"text",1); tvNativeInfoKdeWallet.Model = tsNativeInfoKdeWallet; tvNativeInfoKdeWallet.ModifyBase(StateType.Normal,new Gdk.Color(0xff,0xff,0xe6)); /// Aggregate the store //AggregateStore(); Logger.DbgLog("GUI:KdeWallet.KdeWallet() - END"); } ///####################################################################### /// AGGREGATE STORE /// /// /// public override void AggregateStore() { Logger.DbgLog("GUI:KdeWallet.AggregateStore() - BEGIN"); try { tsSecretIDKdeWallet.Clear(); tsNativeInfoKdeWallet.Clear(); StoreDataInterface.AggregateStore(Common.STORE_KDEWALLET); StoreDataInterface.ReadStore(Common.STORE_KDEWALLET,ref tsSecretIDKdeWallet); } catch(Exception exp) { Logger.DbgLog("GUI:KdeWallet.AggregateStore() - EXCEPTION" + exp.ToString()); } Logger.DbgLog("GUI:KdeWallet.AggregateStore() - END"); } ///####################################################################### /// DISPLAY NATIVE INFO /// /// /// private void OnCursorChanged(object obj, EventArgs args) { Logger.DbgLog("GUI:KdeWallet.OnCursorChanged() - BEGIN"); TreeModel model; TreeIter iter; string selected = null; string[] NativeKeys = null, NativeValues = null; if( tvSecretIDKdeWallet.Selection.GetSelected (out model, out iter) ) selected = (string) model.GetValue(iter, 0); if( (null != selected) && (selected.Length > 0) ) { tsNativeInfoKdeWallet.Clear(); /// Populate NativeInfo tsNativeInfoKdeWallet.AppendValues("Wallet Name", "= "+model.GetValue(iter,3)); NativeKeys = (string[]) model.GetValue(iter, 4); NativeValues = (string[]) model.GetValue(iter, 5); for( int i=0; i< NativeKeys.Length; i++ ) if( (null != NativeValues[i]) && ("" != NativeValues[i]) ) tsNativeInfoKdeWallet.AppendValues(NativeKeys[i], "= "+NativeValues[i]); tvNativeInfoKdeWallet.ShowAll(); } Logger.DbgLog("GUI:KdeWallet.OnCursorChanged() - END"); } ///####################################################################### /// RIGHT-CLICK CONTEXT MENU /// /// /// public void OnRightClicked(object obj, ButtonReleaseEventArgs args) { Logger.DbgLog("GUI:KdeWallet.OnRightClicked() - BEGIN"); if( 3 == args.Event.Button ) { try { Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - Context menu opened."); Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "menuRightClick", null); gxmlTemp.Autoconnect (this); menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime); if( 0 != tvSecretIDKdeWallet.Selection.CountSelectedRows() ) cmiNewSecret.Sensitive = cmiNewKey.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false; else cmiNewSecret.Sensitive = cmiNewKey.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false; } catch(Exception exp) { Logger.DbgLog("GUI:GnomeKeyring.OnRightClicked() - EXCEPTION" + exp.ToString()); } } Logger.DbgLog("GUI:KdeWallet.OnRightClicked() - END"); } ///####################################################################### /// VIEW KEY-VALUES /// /// /// public override void ViewKeyValues() { Logger.DbgLog("GUI:KdeWallet.ViewKeyValues() - BEGIN"); TreeModel model; TreeIter iter; string selected = null; string[] keys = null, values = null; try { if( tvSecretIDKdeWallet.Selection.GetSelected (out model, out iter) ) { selected = (string) model.GetValue(iter, 0); keys = (string[]) model.GetValue(iter, 1); values = (string[]) model.GetValue(iter, 2); Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogManageSecret", null); gxmlTemp.Autoconnect (this); dialogManageSecret.TransientFor = (Gtk.Window)CasaMain.gxml.GetWidget("windowMain"); dialogManageSecret.Title = "VIEW"; cellEditable = new CellRendererText(); cellEditable.Editable = false; //cellEditable.Edited += new EditedHandler(OnKeyValueEdited); /// KEY:0 VALUE:1 VALUE-DUP:2 DIRTY-BIT:3 tsKeyValue = new TreeStore(typeof(string),typeof(string), typeof(string), typeof(bool)); tvKeyValue.AppendColumn("Key",new CellRendererText(),"text",0); tvKeyValue.AppendColumn("Value",cellEditable,"text",2); entrySecretID.Text = selected; for( int i=0; i< keys.Length; i++ ) { if( (null != keys[i]) && (null != values[i]) ) tsKeyValue.AppendValues(keys[i], values[i], "********", false); } tvKeyValue.Model = tsKeyValue; entryKey.Sensitive = entryValue.Sensitive = buttonNewAdd.Sensitive = buttonNewRemove.Sensitive = buttonManageOk.Sensitive = false; } } catch(Exception exp) { Logger.DbgLog("GUI:KdeWallet.ViewKeyValues() - EXCEPTION" + exp.ToString()); } Logger.DbgLog("GUI:KdeWallet.ViewKeyValues() - END"); } /// /// EDIT KEY-VALUE /// public void OnKeyValueEdited(object obj, EditedArgs args) { } /// /// ADD BUTTON CLICKED /// public void on_buttonNewAdd_clicked(object obj, EventArgs args) { } /// /// REMOVE BUTTON CLICKED /// public void on_buttonNewRemove_clicked(object obj, EventArgs args) { } /// /// SHOW PASSWORD CHECK BUTTON CLICKED /// public void on_cbuttonShowPassword_toggled(object obj, EventArgs args) { TreeViewColumn tvCol; if( tvKeyValue.Model.IterNChildren() > 0 ) if( true == cbuttonShowPassword.Active) { Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogLogin", null); gxmlTemp.Autoconnect (this); dialogLogin.TransientFor = dialogManageSecret; label86.Text = "Enter your Master Password to view passwords"; entryMasterPassword3.Text=""; entryMasterPassword3.HasFocus = true; label88.Hide(); entryMasterPassword4.Hide(); dialogLogin.Show(); } else { tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1)); tvCol = new TreeViewColumn("Value", cellEditable, "text", 2); tvKeyValue.InsertColumn(tvCol, 1); } } public void okbuttonLogin_clicked(object abj, EventArgs args) { TreeViewColumn tvCol; if( tvKeyValue.Model.IterNChildren() > 0 ) if( 0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text) ) { tvKeyValue.RemoveColumn(tvKeyValue.GetColumn(1)); tvCol = new TreeViewColumn("Value", cellEditable, "text", 1); tvKeyValue.InsertColumn(tvCol, 1); dialogLogin.Destroy(); } else { // prompt user MessageDialog md=new MessageDialog(dialogLogin,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(); } } public void closebuttonLogin_clicked(object abj, EventArgs args) { cbuttonShowPassword.Active = false; dialogLogin.Destroy(); } public void OnDialogLoginDeleted(object obj, DeleteEventArgs args) { cbuttonShowPassword.Active = false; dialogLogin.Destroy(); args.RetVal = true; } public void on_entryMasterPassword3_activate(object obj, EventArgs args) { if( "" != entryMasterPassword3.Text ) okbuttonLogin_clicked(obj, args); } public void on_entryMasterPassword4_activate(object obj, EventArgs args) { okbuttonLogin_clicked(obj, args); } private void md_Response2(object o, ResponseArgs args) { MessageDialog md = (MessageDialog)o; if (md != null) { md.Destroy(); entryMasterPassword3.Text=""; entryMasterPassword3.HasFocus = true; } } /// /// MANAGE SECRET-ID DIALOG OK-BUTTON CLICKED /// public void on_buttonManageOk_clicked(object obj, EventArgs args) { } /// /// MANAGE SECRET-ID DIALOG CANCEL-BUTTON CLICKED /// public void on_buttonManageCancel_clicked(object obj, EventArgs args) { tsKeyValue.Dispose(); dialogManageSecret.Destroy(); } /// /// SECRET-ID DOUBLE CLICKED /// private void OntvSecretIDKdeWalletRowActivated( object obj, RowActivatedArgs args ) { Logger.DbgLog("GUI:KdeWallet.OntvSecretIDKdeWalletRowActivated() - SecretID double clicked."); ViewKeyValues(); } /// /// VIEW KEY-VALUES CALLED VIA MAIN-MENU/CONTEXT-MENU /// public void OnViewActivated(object obj, EventArgs args) { Logger.DbgLog("GUI:KdeWallet.OnViewActivated() - ViewKeyValues() called."); ViewKeyValues(); } ///####################################################################### /// ADD NEW SECRET /// /// /// public void OnNewSecretActivated(object obj, EventArgs args) { } ///####################################################################### /// ADD NEW KEY-VALUES TO EXISTING SECRET /// /// /// public void OnNewKeyActivated(object obj, EventArgs args) { } ///####################################################################### /// LINK /// /// LINK Key-Values /// public void OnLinkActivated(object obj, EventArgs args) { } ///####################################################################### /// COPY /// /// COPY Key-Values /// public void OnCopyActivated(object obj, EventArgs args) { } ///####################################################################### // DELETE SECRET /// /// DELETE Secret /// public void OnDeleteActivated(object obj, EventArgs args) { } public void on_buttonhelpEditSecret_clicked(object obj, EventArgs args) { Common.ShowHelpUrl("EditingSecrets.html"); } public void on_helpbuttonAuthentication_clicked(object obj, EventArgs args) { Common.ShowHelpUrl("CASAMasterPasswordAuthentication.htm"); } } } ///################################################################## /// END OF FILE ///##################################################################