Copy feature added. Users can copy secrets from one store to another.

This commit is contained in:
Jim Norman 2006-10-12 22:28:20 +00:00
parent 2589b94ba9
commit 30617fb4c2
9 changed files with 15476 additions and 14503 deletions

View File

@ -1,3 +1,10 @@
Thu Oct 12 16:26:13 MDT 2006 - jnorman@novell.com
- Copy feature added. Users can copy secrets from one store
to another.
-------------------------------------------------------------------
Wed Oct 11 15:29:13 IST 2006 - smanojna@novell.com
- Some fixes for Distribution of Firefox Password Manager secrets.

View File

@ -90,6 +90,8 @@ public class Common
STORENAME_KDEWALLET = "KDE Wallet",
STORENAME_GNOMEKEYRING = "GNOME Keyring";
public static string[] saStoreNameList = {"miCASA", "Firefox", "Mozilla", "KDE Wallet", "GNOME Keyring"};
///##############################################################
/// SDI CONSTANTS

288
CASA/gui/CopySecret.cs Normal file
View File

@ -0,0 +1,288 @@
using System;
using System.Text;
using System.Collections;
using Gtk;
using Glade;
namespace Novell.CASA.GUI
{
/// <summary>
/// Summary description for CopySecret.
/// </summary>
public class CopySecret
{
#region Glade Widgets
[Glade.Widget]
Gtk.Dialog dialogCopySecret;
[Glade.Widget]
Gtk.CheckButton checkbuttonMiCASA,
checkbuttonFPM,
checkbuttonMPM,
checkbuttonKDE,
checkbuttonGNOME;
[Glade.Widget]
Gtk.Entry
entryMiCASA,
entryFPM,
entryMPM,
entryKDE,
entryGNOME;
[Glade.Widget]
Gtk.Label
labelMiCASA,
labelFPM,
labelMPM,
labelKDE,
labelGNOME;
#endregion
private string m_sSecretID = "http://www.novell.com";
private string[] m_saKeys;
private string[] m_saValues;
public CopySecret(string sSrcSecretID, string[] saKeys, string[] saValues)
{
m_sSecretID = sSrcSecretID;
m_saKeys = saKeys;
m_saValues = saValues;
}
public void Show()
{
Glade.XML gxmlTemp = new Glade.XML (Common.GladeFile, "dialogCopySecret", null);
gxmlTemp.Autoconnect (this);
InitDialog();
dialogCopySecret.Show();
}
private void InitDialog()
{
if (Common.IS_MICASA)
{
checkbuttonMiCASA.Visible = checkbuttonMiCASA.Sensitive = Common.IS_MICASA_AVAILABLE;
checkbuttonMiCASA.Toggled += new EventHandler(checkbuttonMiCASA_Toggled);
labelMiCASA.Visible = entryMiCASA.Visible = Common.IS_MICASA_AVAILABLE;
if (m_sSecretID.StartsWith("http:"))
entryMiCASA.Text = m_sSecretID.Substring(7);
else
entryMiCASA.Text = m_sSecretID;
}
if (Common.IS_FIREFOX)
{
checkbuttonFPM.Visible = checkbuttonFPM.Sensitive = Common.IS_FIREFOX_AVAILABLE;
checkbuttonFPM.Toggled += new EventHandler(checkbuttonFPM_Toggled);
labelFPM.Visible = entryFPM.Visible = Common.IS_FIREFOX_AVAILABLE;
if (!m_sSecretID.StartsWith("http:"))
entryFPM.Text = "http://"+m_sSecretID;
else
entryFPM.Text = m_sSecretID;
}
if (Common.IS_MOZILLA)
{
checkbuttonMPM.Visible = checkbuttonMPM.Sensitive = Common.IS_MOZILLA_AVAILABLE;
checkbuttonMPM.Toggled += new EventHandler(checkbuttonMPM_Toggled);
labelMPM.Visible = entryMPM.Visible = Common.IS_MOZILLA_AVAILABLE;
entryMPM.Text = m_sSecretID;
}
if (Common.IS_KDEWALLET)
{
checkbuttonKDE.Visible = checkbuttonKDE.Sensitive = Common.IS_KDEWALLET_AVAILABLE;
checkbuttonKDE.Toggled += new EventHandler(checkbuttonKDE_Toggled);
labelKDE.Visible = entryKDE.Visible = Common.IS_KDEWALLET_AVAILABLE;
entryKDE.Text = m_sSecretID;
}
if (Common.IS_GNOMEKEYRING)
{
checkbuttonGNOME.Visible = checkbuttonGNOME.Sensitive = Common.IS_GNOMEKEYRING_AVAILABLE;
checkbuttonGNOME.Toggled += new EventHandler(checkbuttonGNOME_Toggled);
labelGNOME.Visible = entryGNOME.Visible = Common.IS_GNOMEKEYRING_AVAILABLE;
entryGNOME.Text = m_sSecretID;
}
}
public void on_buttonCopyCancel_clicked(object obj, EventArgs args)
{
if (dialogCopySecret != null)
{
dialogCopySecret.Destroy();
}
}
public void on_buttonCopyOK_clicked(object obj, EventArgs args)
{
StringBuilder sb = new StringBuilder();
// copy to micasa
if ((checkbuttonMiCASA.Active) && (entryMiCASA.Text.Length > 0))
{
sb.Append(DoCopy(entryMiCASA.Text, Common.STORE_MICASA));
sb.Append("\r\n");
}
// copy to Firefox
if ((checkbuttonFPM.Active) && (entryFPM.Text.Length > 0))
{
sb.Append(DoCopy(entryFPM.Text, Common.STORE_FIREFOX));
sb.Append("\r\n");
}
// copy to Mozilla
if ((checkbuttonMPM.Active) && (entryMPM.Text.Length > 0))
{
sb.Append(DoCopy(entryMPM.Text, Common.STORE_MOZILLA));
sb.Append("\r\n");
}
// copy to kde wallet
if ((checkbuttonKDE.Active) && entryKDE.Text.Length > 0)
{
sb.Append(DoCopy(entryKDE.Text, Common.STORE_KDEWALLET));
sb.Append("\r\n");
}
// copy to GNOME keyring
if ((checkbuttonGNOME.Active) && entryGNOME.Text.Length > 0)
{
sb.Append(DoCopy(entryGNOME.Text, Common.STORE_GNOMEKEYRING));
sb.Append("\r\n");
}
if (sb.Length > 0)
{
CommonGUI.DisplayMessage(Gtk.MessageType.Info, "Copy to ...\r\n" + sb.ToString());
}
else
{
CommonGUI.DisplayMessage(Gtk.MessageType.Info, "No stores selected");
}
if (dialogCopySecret != null)
{
dialogCopySecret.Destroy();
}
}
private void checkbuttonMiCASA_Toggled(object sender, EventArgs e)
{
entryMiCASA.Sensitive = checkbuttonMiCASA.Active;
}
private void checkbuttonFPM_Toggled(object sender, EventArgs e)
{
entryFPM.Sensitive = checkbuttonFPM.Active;
}
private void checkbuttonMPM_Toggled(object sender, EventArgs e)
{
entryMPM.Sensitive = checkbuttonMPM.Active;
}
private void checkbuttonKDE_Toggled(object sender, EventArgs e)
{
entryKDE.Sensitive = checkbuttonKDE.Active;
}
private void checkbuttonGNOME_Toggled(object sender, EventArgs e)
{
entryGNOME.Sensitive = checkbuttonGNOME.Active;
}
private string DoCopy(string sNewSecretName, int iTargetStore)
{
Logger.DbgLog("GUI:CopySecret.DoCopy() - BEGIN");
TreeModel model;
TreeIter iter;
TreeModel modelSecret;
TreeIter iterSecret, iterKey;
string[] NativeKeys = null,
NativeValues = null;
try
{
NativeKeys = new string[Common.MAX_NATIVE_ELEMENTS];
NativeValues = new string[Common.MAX_NATIVE_ELEMENTS];
NativeKeys[Common.INDEX_NATIVEINFO_FOLDERNAME] = Common.NATIVEINFO_FOLDERNAME;
NativeKeys[Common.INDEX_NATIVEINFO_TYPEID] = Common.NATIVEINFO_TYPEID;
NativeKeys[Common.INDEX_NATIVEINFO_SYNC] = Common.NATIVEINFO_SYNC;
NativeKeys[Common.INDEX_NATIVEINFO_SYNCTYPE] = Common.NATIVEINFO_SYNCTYPE;
NativeKeys[Common.INDEX_NATIVEINFO_MODIFIEDTIME] = Common.NATIVEINFO_MODIFIEDTIME;
NativeValues[Common.INDEX_NATIVEINFO_FOLDERNAME] = null;
if (iTargetStore == Common.STORE_FIREFOX)
{
NativeValues[Common.INDEX_NATIVEINFO_TYPEID] = "Signon";
}
else if (iTargetStore == Common.STORE_GNOMEKEYRING)
{
NativeValues[Common.INDEX_NATIVEINFO_TYPEID] = "Network Password";
}
else
{
NativeValues[Common.INDEX_NATIVEINFO_TYPEID] = null;
}
NativeValues[Common.INDEX_NATIVEINFO_SYNC] = null;
NativeValues[Common.INDEX_NATIVEINFO_SYNCTYPE] = null;
NativeValues[Common.INDEX_NATIVEINFO_MODIFIEDTIME] = null;
TreeStore tsTargetSecret;
TreeView tvTargetSecret = new TreeView();
if (iTargetStore == Common.STORE_FIREFOX)
{
ArrayList arrIsPassword = new ArrayList();
for (int i=0; i<m_saKeys.Length; i++)
{
if (m_saKeys[i].ToLower().IndexOf("pass") > -1)
arrIsPassword.Add(true);
else
arrIsPassword.Add(false);
}
bool[] IsPassword = (bool[])arrIsPassword.ToArray(typeof(bool));
tsTargetSecret = new TreeStore(typeof(string), typeof(string[]), typeof(string[]), typeof(string), typeof(string[]), typeof(string[]), typeof(bool[]));
iterSecret = tsTargetSecret.AppendValues(sNewSecretName, m_saKeys, m_saValues, DataEngines.AD.GetDefaultProfileName(Common.STORE_FIREFOX), NativeKeys, NativeValues, IsPassword);
}
else
{
tsTargetSecret = new TreeStore(typeof(string), typeof(string[]), typeof(string[]), typeof(string), typeof(string[]), typeof(string[]));
iterSecret = tsTargetSecret.AppendValues(sNewSecretName, m_saKeys, m_saValues, "Default", NativeKeys, NativeValues);
}
modelSecret = tvTargetSecret.Model = tsTargetSecret;
if( Common.STATUS_SUCCESS == StoreDataInterface.UpdateStore(iTargetStore, Common.OPERATION_ADD_SECRET, "", "", ref modelSecret, ref iterSecret) )
{
return Common.saStoreNameList[iTargetStore] + " Success";
}
else
{
return Common.saStoreNameList[iTargetStore] + " Failed";
}
}
catch (Exception e)
{
return (Common.saStoreNameList[iTargetStore] + " : " + e.ToString());
}
}
}
}

View File

@ -222,8 +222,8 @@ public class Firefox : Store
if( 0 != tvSecretIDFirefox.Selection.CountSelectedRows() )
{
cmiNewSecret.Sensitive = cmiNewKey.Sensitive = true;
cmiLink.Sensitive = cmiCopy.Sensitive = false;
cmiNewSecret.Sensitive = cmiNewKey.Sensitive = cmiCopy.Sensitive = true;
cmiLink.Sensitive = false;
}
else
{
@ -1209,9 +1209,32 @@ public class Firefox : Store
/// COPY Key-Values
/// </summary>
public void OnCopyActivated(object obj, EventArgs args)
{
TreeModel model;
TreeIter iter;
try
{
if( tvSecretIDFirefox.Selection.GetSelected (out model, out iter) )
{
string selected = null;
string[] saKeys, saValues;
selected = (string) model.GetValue (iter, 0);
saKeys = (string[]) model.GetValue(iter, 1);
saValues = (string[]) model.GetValue(iter, 2);
CopySecret cs = new CopySecret(selected, saKeys, saValues);
cs.Show();
}
}
catch
{
}
}
///#######################################################################
/// VALIDATE STRINGS FOR SPECIAL CHARACTERS

View File

@ -243,7 +243,10 @@ public class GnomeKeyring : Store
menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime);
if( 0 != tvSecretIDGnomeKeyring.Selection.CountSelectedRows() )
cmiLink.Sensitive = cmiCopy.Sensitive = false;
{
cmiLink.Sensitive = false;
cmiCopy.Sensitive = true;
}
else
cmiNewKey.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
}
@ -929,6 +932,23 @@ public class GnomeKeyring : Store
/// </summary>
public void OnCopyActivated(object obj, EventArgs args)
{
Logger.DbgLog("GUI:GnomeKeyring.OnCopyActivated() - BEGIN");
if( 0 != tvSecretIDGnomeKeyring.Selection.CountSelectedRows() )
{
TreeModel model;
TreeIter iter;
string selected = null;
if( tvSecretIDGnomeKeyring.Selection.GetSelected (out model, out iter) )
{
selected = (string) model.GetValue (iter, 0);
string[] saKeys = (string[]) model.GetValue(iter, 1);
string[] saValues = (string[]) model.GetValue(iter, 2);
CopySecret cs = new CopySecret(selected, saKeys, saValues);
cs.Show();
}
}
Logger.DbgLog("GUI:GnomeKeyring.OnCopyActivated() - END");
}

View File

@ -242,7 +242,10 @@ public class KdeWallet : Store
menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime);
if( 0 != tvSecretIDKdeWallet.Selection.CountSelectedRows() )
cmiLink.Sensitive = cmiCopy.Sensitive = false;
{
cmiLink.Sensitive = false;
cmiCopy.Sensitive = true;
}
else
cmiNewKey.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
}
@ -926,7 +929,23 @@ public class KdeWallet : Store
/// </summary>
public void OnCopyActivated(object obj, EventArgs args)
{
Logger.DbgLog("GUI:KdeWallet.OnCopyActivated() - BEGIN");
if( 0 != tvSecretIDKdeWallet.Selection.CountSelectedRows() )
{
TreeModel model;
TreeIter iter;
string selected = null;
if( tvSecretIDKdeWallet.Selection.GetSelected (out model, out iter) )
{
selected = (string) model.GetValue (iter, 0);
string[] saKeys = (string[]) model.GetValue(iter, 1);
string[] saValues = (string[]) model.GetValue(iter, 2);
CopySecret cs = new CopySecret(selected, saKeys, saValues);
cs.Show();
}
}
Logger.DbgLog("GUI:KdeWallet.OnCopyActivated() - END");
}

View File

@ -60,6 +60,7 @@ MODULE_EXT =exe
CSFILES =$(srcdir)/AssemblyInfo.cs \
$(srcdir)/CasaMain.cs \
$(srcdir)/CasaTray.cs \
$(srcdir)/CopySecret.cs \
$(srcdir)/DbgFileChooser.cs \
$(srcdir)/TrayLib.cs \
$(srcdir)/ExportSecrets.cs \

View File

@ -240,7 +240,7 @@ public class MiCasa : Store
menuRightClick.Popup(null, null, null, IntPtr.Zero, 3, Gtk.Global.CurrentEventTime);
if( 0 != tvSecretIDMiCasa.Selection.CountSelectedRows() )
cmiCopy.Sensitive = false;
cmiCopy.Sensitive = true;
else
cmiNewKey.Sensitive = cmiView.Sensitive = cmiLink.Sensitive = cmiCopy.Sensitive = cmiDelete.Sensitive = false;
}
@ -957,7 +957,29 @@ public class MiCasa : Store
/// </summary>
public void OnCopyActivated(object obj, EventArgs args)
{
Logger.DbgLog("GUI:MiCasa.OnCopyActivated() - BEGIN");
if( 0 != tvSecretIDMiCasa.Selection.CountSelectedRows() )
{
TreeModel model;
TreeIter iter;
string selected = null;
string[] saKeys, saValues;
if( tvSecretIDMiCasa.Selection.GetSelected (out model, out iter) )
{
selected = (string) model.GetValue (iter, 0);
if (selected.StartsWith("SS_CredSet"))
selected = selected.Substring(11);
saKeys = (string[]) model.GetValue(iter, 1);
saValues = (string[]) model.GetValue(iter, 2);
CopySecret cs = new CopySecret(selected, saKeys, saValues);
cs.Show();
}
}
}
public void on_helpbuttonLinkKeys_clicked(object obj, EventArgs args)

View File

@ -14493,4 +14493,595 @@ username values.</property>
</child>
</widget>
<widget class="GtkDialog" id="dialogCopySecret">
<property name="visible">True</property>
<property name="title" translatable="yes">CASA - Copy Secret</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER_ALWAYS</property>
<property name="modal">True</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">True</property>
<property name="icon">CASAicons.ico</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="focus_on_map">True</property>
<property name="urgency_hint">False</property>
<property name="has_separator">True</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="vbox183">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child internal-child="action_area">
<widget class="GtkHButtonBox" id="hbuttonbox29">
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="buttonCopyCancel">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-close</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-7</property>
<signal name="clicked" handler="on_buttonCopyCancel_clicked" last_modification_time="Wed, 11 Oct 2006 20:40:14 GMT"/>
</widget>
</child>
<child>
<widget class="GtkButton" id="buttonCopyOK">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-ok</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-5</property>
<signal name="clicked" handler="on_buttonCopyOK_clicked" last_modification_time="Wed, 11 Oct 2006 20:40:22 GMT"/>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox184">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkHBox" id="hbox111">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkVBox" id="vbox185">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkImage" id="image4268">
<property name="visible">True</property>
<property name="stock">gtk-copy</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">4</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">4</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox186">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="label305">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Copy this secret to ...&lt;/b&gt;</property>
<property name="use_underline">False</property>
<property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">4</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label306">
<property name="visible">True</property>
<property name="label" translatable="yes">Select the stores and enter the name of the
secret for the selected store.</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkFrame" id="frame36">
<property name="border_width">6</property>
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="label_yalign">0.5</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<child>
<widget class="GtkVBox" id="vbox188">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkCheckButton" id="checkbuttonMiCASA">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">miCASA</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox116">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="labelMiCASA">
<property name="visible">True</property>
<property name="label" translatable="yes"> </property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryMiCASA">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="checkbuttonFPM">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Firefox Password Manager</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox117">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="labelFPM">
<property name="sensitive">False</property>
<property name="label" translatable="yes"> </property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryFPM">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="checkbuttonMPM">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Mozilla Password Manager</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox118">
<property name="sensitive">False</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="labelMPM">
<property name="sensitive">False</property>
<property name="label" translatable="yes"> </property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryMPM">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="checkbuttonKDE">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">KDE Wallet</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox119">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="labelKDE">
<property name="sensitive">False</property>
<property name="label" translatable="yes"> </property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryKDE">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="checkbuttonGNOME">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">GNOME Keyring</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox120">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="labelGNOME">
<property name="sensitive">False</property>
<property name="label" translatable="yes"> </property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryGNOME">
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">6</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>