413 lines
14 KiB
C#
413 lines
14 KiB
C#
using System;
|
|
using System.Text;
|
|
|
|
using Gtk;
|
|
using Glade;
|
|
|
|
namespace Novell.CASA.GUI
|
|
{
|
|
class FindAndReplace
|
|
{
|
|
#region Glade Widgets
|
|
|
|
[Glade.Widget]
|
|
Gtk.TreeView tvResults;
|
|
|
|
|
|
[Glade.Widget]
|
|
Gtk.Dialog dialogFindAndReplace,
|
|
dialogLogin;
|
|
|
|
[Glade.Widget]
|
|
Gtk.Button bttnFind,
|
|
bttnReplaceAll,
|
|
bttnApply,
|
|
bttnCancel,
|
|
bttnRevert,
|
|
bttnOk,
|
|
bttnHelp;
|
|
|
|
[Glade.Widget]
|
|
Gtk.Entry entryFind,
|
|
entryNewValue,
|
|
entryMasterPassword3,
|
|
entryMasterPassword4;
|
|
|
|
[Glade.Widget]
|
|
Gtk.CheckButton cbShowValues;
|
|
|
|
[Glade.Widget]
|
|
Gtk.Label label86,
|
|
label88,
|
|
labelRememberFor,
|
|
labelSeconds;
|
|
|
|
[Glade.Widget]
|
|
Gtk.SpinButton spinbuttonRememberFor;
|
|
|
|
#endregion
|
|
|
|
private TreeModel m_tmCASA;
|
|
private TreeStore m_tsCASA;
|
|
private TreeStore tsResults;
|
|
private Store m_store;
|
|
|
|
private int m_iRememberSeconds = 5;
|
|
|
|
public FindAndReplace(Store store, TreeModel tmCASA, TreeStore tsCASA)
|
|
{
|
|
m_store = store;
|
|
m_tmCASA = tmCASA;
|
|
m_tsCASA = tsCASA;
|
|
}
|
|
|
|
public void ShowDialog()
|
|
{
|
|
Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogFindAndReplace", null);
|
|
gxmlTemp.Autoconnect(this);
|
|
|
|
dialogFindAndReplace.SetPosition(WindowPosition.CenterOnParent);
|
|
|
|
tvResults.AppendColumn("SecretID", new Gtk.CellRendererText(), "text", 0);
|
|
tvResults.AppendColumn("Key", new Gtk.CellRendererText(), "text", 1);
|
|
tvResults.AppendColumn("Value", new Gtk.CellRendererText(), "text", 2);
|
|
|
|
tvResults.Selection.Mode = SelectionMode.Multiple;
|
|
|
|
// 0:secretID, 1:Key, 2:Value****, 3:ValueClear, 4:dirtyBit
|
|
tsResults = new TreeStore(typeof(string), typeof(string), typeof(string), typeof(string), typeof(bool));
|
|
tvResults.Model = tsResults;
|
|
|
|
// hook up event handles
|
|
bttnApply.Clicked += new EventHandler(bttnApply_Clicked);
|
|
bttnCancel.Clicked += new EventHandler(bttnCancel_Clicked);
|
|
bttnRevert.Clicked += new EventHandler(bttnRevert_Clicked);
|
|
bttnFind.Clicked += new EventHandler(bttnFind_Clicked);
|
|
bttnOk.Clicked += new EventHandler(bttnOk_Clicked);
|
|
bttnReplaceAll.Clicked += new EventHandler(bttnReplaceAll_Clicked);
|
|
bttnHelp.Clicked += new EventHandler(bttnHelp_Clicked);
|
|
|
|
cbShowValues.Toggled += new EventHandler(cbShowValues_Toggled);
|
|
|
|
}
|
|
|
|
void bttnHelp_Clicked(object sender, EventArgs e)
|
|
{
|
|
Common.ShowHelpUrl("FindReplace.htm");
|
|
}
|
|
|
|
|
|
|
|
public void okbuttonLogin_clicked(object abj, EventArgs args)
|
|
{
|
|
TreeViewColumn tvCol;
|
|
|
|
if (0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text))
|
|
{
|
|
tvResults.RemoveColumn(tvResults.GetColumn(2));
|
|
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 3);
|
|
tvResults.InsertColumn(tvCol, 2);
|
|
|
|
// get seconds to remember
|
|
//m_sRememberFor = spinbuttonRememberFor.Text;
|
|
|
|
//if (m_sRememberFor != null)
|
|
//{
|
|
// DateTime dtNow = DateTime.Now;
|
|
// m_iRememberSeconds = int.Parse(m_sRememberFor);
|
|
// CommonGUI.SetRememberMPUntil(dtNow.AddSeconds(m_iRememberSeconds));
|
|
//}
|
|
|
|
// save off remember time if user changed it
|
|
//string sSaveTimed = m_config.GetConfigSetting(CommonGUI.REMEMBER_SETTING, "5");
|
|
//if (!sSaveTimed.Equals(m_sRememberFor))
|
|
// {
|
|
// m_config.SetConfigSetting(CommonGUI.REMEMBER_SETTING, m_sRememberFor);
|
|
// m_config.WriteConfig();
|
|
//}
|
|
|
|
dialogLogin.Destroy();
|
|
|
|
//if (m_iRememberSeconds > 0)
|
|
// StartRememberTimer();
|
|
}
|
|
else
|
|
{
|
|
// warn user
|
|
CommonGUI.DisplayMessage(MessageType.Warning, "Master Password incorrect");
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
|
|
public void on_helpbuttonAuthentication_clicked(object obj, EventArgs args)
|
|
{
|
|
Common.ShowHelpUrl("CASAMasterPasswordAuthentication.htm");
|
|
}
|
|
|
|
|
|
void cbShowValues_Toggled(object sender, EventArgs e)
|
|
{
|
|
TreeViewColumn tvCol;
|
|
|
|
if ((true == cbShowValues.Active)
|
|
&& (CommonGUI.GetRememberMPUntil().CompareTo(DateTime.Now) > 0))
|
|
{
|
|
// set and start the timer if needed
|
|
TimeSpan ts = CommonGUI.GetRememberMPUntil().Subtract(DateTime.Now);
|
|
m_iRememberSeconds = ts.Seconds;
|
|
//StartRememberTimer();
|
|
|
|
// display the values
|
|
tvResults.RemoveColumn(tvResults.GetColumn(2));
|
|
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 3);
|
|
tvResults.InsertColumn(tvCol, 2);
|
|
}
|
|
else if (true == cbShowValues.Active)
|
|
{
|
|
// prompt user for MasterPassword
|
|
if (CommonGUI.UseMasterPassword())
|
|
{
|
|
Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogLogin", null);
|
|
gxmlTemp.Autoconnect(this);
|
|
dialogLogin.TransientFor = dialogFindAndReplace;
|
|
|
|
label86.Text = "Enter your Master Password to view values";
|
|
entryMasterPassword3.Text = "";
|
|
entryMasterPassword3.HasFocus = true;
|
|
label88.Hide();
|
|
entryMasterPassword4.Hide();
|
|
|
|
labelRememberFor.Visible = false;
|
|
labelSeconds.Visible = false;
|
|
spinbuttonRememberFor.Visible = false;
|
|
//spinbuttonRememberFor.Text = m_config.GetConfigSetting(CommonGUI.REMEMBER_SETTING, m_sRememberFor);
|
|
//dialogLogin.Show();
|
|
}
|
|
else
|
|
{
|
|
// display the values
|
|
tvResults.RemoveColumn(tvResults.GetColumn(2));
|
|
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 3);
|
|
tvResults.InsertColumn(tvCol, 2);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
tvResults.RemoveColumn(tvResults.GetColumn(2));
|
|
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 2);
|
|
tvResults.InsertColumn(tvCol, 2);
|
|
}
|
|
}
|
|
|
|
public void closebuttonLogin_clicked(object abj, EventArgs args)
|
|
{
|
|
cbShowValues.Active = false;
|
|
dialogLogin.Destroy();
|
|
}
|
|
|
|
|
|
public void OnDialogLoginDeleted(object obj, DeleteEventArgs args)
|
|
{
|
|
cbShowValues.Active = false;
|
|
dialogLogin.Destroy();
|
|
args.RetVal = true;
|
|
}
|
|
|
|
|
|
|
|
void bttnOk_Clicked(object sender, EventArgs e)
|
|
{
|
|
if (bttnApply.Sensitive)
|
|
{
|
|
bttnApply_Clicked(sender, e);
|
|
}
|
|
CloseDialog();
|
|
}
|
|
|
|
void bttnFind_Clicked(object sender, EventArgs e)
|
|
{
|
|
if (entryFind.Text != null && entryFind.Text.Length > 0)
|
|
{
|
|
DoFind();
|
|
}
|
|
else
|
|
{
|
|
CommonGUI.DisplayMessage(MessageType.Error, "You must enter a value to find");
|
|
}
|
|
}
|
|
|
|
void bttnRevert_Clicked(object sender, EventArgs e)
|
|
{
|
|
// show cancel
|
|
bttnCancel.Visible = true;
|
|
|
|
// hide revert
|
|
bttnRevert.Visible = false;
|
|
|
|
bttnApply.Sensitive = bttnOk.Sensitive = false;
|
|
|
|
// reload
|
|
DoFind();
|
|
}
|
|
|
|
void bttnCancel_Clicked(object sender, EventArgs e)
|
|
{
|
|
CloseDialog();
|
|
}
|
|
|
|
void bttnApply_Clicked(object sender, EventArgs e)
|
|
{
|
|
TreeIter iter;
|
|
|
|
// iterate thru store, update all values with dirtybit=true
|
|
if (tsResults.GetIterFirst(out iter))
|
|
{
|
|
do
|
|
{
|
|
bool bDirty = (bool)tsResults.GetValue(iter, 4);
|
|
if (bDirty)
|
|
{
|
|
String sID = (string)tsResults.GetValue(iter, 0);
|
|
String sKey = (string)tsResults.GetValue(iter, 1);
|
|
String sValue = (string)tsResults.GetValue(iter, 3);
|
|
|
|
if (StoreDataInterface.ModifyCASASecretKey(sID, sKey, sValue))
|
|
{
|
|
Console.WriteLine("Updating {0} : {1} : {2}", sID, sKey, sValue);
|
|
}
|
|
|
|
// Update CASAManager view
|
|
m_store.AggregateStore();
|
|
|
|
}
|
|
} while (tsResults.IterNext(ref iter));
|
|
|
|
}
|
|
|
|
|
|
// hide revert
|
|
bttnRevert.Visible = false;
|
|
bttnCancel.Visible = true;
|
|
|
|
bttnApply.Sensitive = false;
|
|
bttnOk.Sensitive = false;
|
|
|
|
}
|
|
|
|
private void CloseDialog()
|
|
{
|
|
if (dialogFindAndReplace != null)
|
|
{
|
|
dialogFindAndReplace.Destroy();
|
|
}
|
|
}
|
|
|
|
private void DoFind()
|
|
{
|
|
|
|
string selected = null;
|
|
string[] keys = null,
|
|
values = null;
|
|
|
|
// clear current vies
|
|
tsResults.Clear();
|
|
|
|
// iterate thru CASA TreeStore, finding matches
|
|
TreeIter iter;
|
|
|
|
if (m_tsCASA.GetIterFirst(out iter))
|
|
{
|
|
do
|
|
{
|
|
selected = (string)m_tmCASA.GetValue(iter, 0);
|
|
keys = (string[])m_tmCASA.GetValue(iter, 1);
|
|
values = (string[])m_tmCASA.GetValue(iter, 2);
|
|
|
|
// add matches to the results
|
|
for (int i = 0; i < keys.Length; i++)
|
|
{
|
|
if ((entryFind.Text.Equals("*")) ||
|
|
(values[i].IndexOf(entryFind.Text) > -1))
|
|
{
|
|
tsResults.AppendValues(selected, keys[i], "*******", values[i], false);
|
|
}
|
|
}
|
|
} while (m_tsCASA.IterNext(ref iter));
|
|
|
|
//tvResults.Selection.SelectAll();
|
|
}
|
|
}
|
|
|
|
void bttnReplaceAll_Clicked(object sender, EventArgs e)
|
|
{
|
|
TreeModel model;
|
|
TreeIter iter;
|
|
TreePath[] treePaths = tvResults.Selection.GetSelectedRows(out model);
|
|
|
|
|
|
if (entryNewValue.Text == null || entryNewValue.Text.Length == 0)
|
|
{
|
|
CommonGUI.DisplayMessage(MessageType.Warning, "Enter a new value");
|
|
return;
|
|
}
|
|
|
|
if (treePaths.Length == 0)
|
|
{
|
|
CommonGUI.DisplayMessage(MessageType.Warning, "You must select at least one row");
|
|
return;
|
|
}
|
|
|
|
if (entryNewValue.Text != null && entryNewValue.Text.Length > 0)
|
|
{
|
|
// iterate thru those to change
|
|
for (int i = 0; i < treePaths.Length; i++)
|
|
{
|
|
if (tsResults.GetIter(out iter, treePaths[i]))
|
|
{
|
|
string sCurrentValue = (string)tsResults.GetValue(iter, 3);
|
|
|
|
// change if newValue is different
|
|
if (!sCurrentValue.Equals(entryNewValue.Text))
|
|
{
|
|
tsResults.SetValue(iter, 2, entryNewValue.Text);
|
|
tsResults.SetValue(iter, 3, entryNewValue.Text);
|
|
|
|
// set the dirty bit
|
|
tsResults.SetValue(iter, 4, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
bttnApply.Sensitive = bttnOk.Sensitive = true;
|
|
|
|
bttnRevert.Visible = true;
|
|
bttnCancel.Visible = false;
|
|
}
|
|
}
|
|
|
|
/*
|
|
private bool bTimerActive = false;
|
|
public void StartRememberTimer()
|
|
{
|
|
if (!bTimerActive)
|
|
{
|
|
GLib.Timeout.Add((uint)(m_iRememberSeconds * 1000), new GLib.TimeoutHandler(update_gui));
|
|
bTimerActive = true;
|
|
}
|
|
}
|
|
* */
|
|
}
|
|
|
|
}
|