summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2009-10-12 11:46:13 +0200
committerKarel Klic <kklic@redhat.com>2009-10-12 11:46:13 +0200
commita41deef57d58ddcce264900885d94df37d23bff4 (patch)
tree1b2975c952b3179dab1e09e4d3609fcfcf02d610 /src
parent691fd95d03763f803e499dba06c8caecb279427f (diff)
parentb88494a1bbfc8871642fe117d893f2970f543a1b (diff)
downloadabrt-a41deef57d58ddcce264900885d94df37d23bff4.tar.gz
abrt-a41deef57d58ddcce264900885d94df37d23bff4.tar.xz
abrt-a41deef57d58ddcce264900885d94df37d23bff4.zip
Merge branch 'master' of git://git.fedorahosted.org/git/abrt
Diffstat (limited to 'src')
-rw-r--r--src/Daemon/CommLayerServer.h1
-rw-r--r--src/Daemon/CommLayerServerDBus.cpp23
-rw-r--r--src/Daemon/CommLayerServerDBus.h1
-rw-r--r--src/Daemon/CommLayerServerSocket.h1
-rw-r--r--src/Daemon/CrashWatcher.cpp12
-rw-r--r--src/Daemon/CrashWatcher.h4
-rw-r--r--src/Daemon/Daemon.cpp14
-rw-r--r--src/Daemon/MiddleWare.cpp14
-rw-r--r--src/Daemon/MiddleWare.h1
-rw-r--r--src/Gui/CCDBusBackend.py93
-rw-r--r--src/Gui/CellRenderers.py7
-rw-r--r--src/Gui/ConfBackend.py12
-rw-r--r--src/Gui/PluginSettingsUI.py14
13 files changed, 102 insertions, 95 deletions
diff --git a/src/Daemon/CommLayerServer.h b/src/Daemon/CommLayerServer.h
index aface8a..6ede581 100644
--- a/src/Daemon/CommLayerServer.h
+++ b/src/Daemon/CommLayerServer.h
@@ -15,7 +15,6 @@ class CCommLayerServer {
/* just stubs to be called when not implemented in specific comm layer */
virtual void Crash(const std::string& progname, const std::string& uid) {}
virtual void JobDone(const char* pDest, const char* pUUID) = 0;
- virtual void JobStarted(const char* pDest) {};
virtual void QuotaExceed(const char* str) {}
virtual void Update(const std::string& pMessage, const char* peer, uint64_t pJobID) {};
diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp
index 1085d80..fc28a12 100644
--- a/src/Daemon/CommLayerServerDBus.cpp
+++ b/src/Daemon/CommLayerServerDBus.cpp
@@ -69,18 +69,6 @@ void CCommLayerServerDBus::QuotaExceed(const char* str)
send_flush_and_unref(msg);
}
-void CCommLayerServerDBus::JobStarted(const char* peer)
-{
- DBusMessage* msg = new_signal_msg("JobStarted", peer);
- uint64_t nJobID = uint64_t(pthread_self());
- dbus_message_append_args(msg,
- DBUS_TYPE_STRING, &peer, /* TODO: redundant parameter, remove from API */
- DBUS_TYPE_UINT64, &nJobID, /* TODO: redundant parameter, remove from API */
- DBUS_TYPE_INVALID);
- VERB2 log("Sending signal JobStarted('%s',%llx)", peer, (unsigned long long)nJobID);
- send_flush_and_unref(msg);
-}
-
void CCommLayerServerDBus::JobDone(const char* peer, const char* pUUID)
{
DBusMessage* msg = new_signal_msg("JobDone", peer);
@@ -156,6 +144,13 @@ static int handle_CreateReport(DBusMessage* call, DBusMessage* reply)
dbus_message_iter_init(call, &in_iter);
const char* pUUID;
r = load_val(&in_iter, pUUID);
+ if (r != ABRT_DBUS_MORE_FIELDS)
+ {
+ error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
+ return -1;
+ }
+ int32_t force;
+ r = load_val(&in_iter, force);
if (r != ABRT_DBUS_LAST_FIELD)
{
error_msg("dbus call %s: parameter type mismatch", __func__ + 7);
@@ -164,7 +159,7 @@ static int handle_CreateReport(DBusMessage* call, DBusMessage* reply)
const char* sender;
long unix_uid = get_remote_uid(call, &sender);
- if (CreateReportThread(pUUID, to_string(unix_uid).c_str(), sender) != 0)
+ if (CreateReportThread(pUUID, to_string(unix_uid).c_str(), force, sender) != 0)
return -1; /* can't create thread (err msg is already logged) */
dbus_message_append_args(reply,
@@ -189,7 +184,7 @@ static int handle_GetJobResult(DBusMessage* call, DBusMessage* reply)
}
long unix_uid = get_remote_uid(call);
- map_crash_report_t report = GetJobResult(pUUID, to_string(unix_uid).c_str());
+ map_crash_report_t report = GetJobResult(pUUID, to_string(unix_uid).c_str(), /*force:*/ 0);
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
diff --git a/src/Daemon/CommLayerServerDBus.h b/src/Daemon/CommLayerServerDBus.h
index 06fb15d..7b2e31d 100644
--- a/src/Daemon/CommLayerServerDBus.h
+++ b/src/Daemon/CommLayerServerDBus.h
@@ -12,7 +12,6 @@ class CCommLayerServerDBus
/* DBus signal senders */
virtual void Crash(const std::string& progname, const std::string& uid);
- virtual void JobStarted(const char* pDest);
virtual void JobDone(const char* pDest, const char* pUUID);
virtual void QuotaExceed(const char* str);
diff --git a/src/Daemon/CommLayerServerSocket.h b/src/Daemon/CommLayerServerSocket.h
index f598841..baca195 100644
--- a/src/Daemon/CommLayerServerSocket.h
+++ b/src/Daemon/CommLayerServerSocket.h
@@ -31,5 +31,4 @@ class CCommLayerServerSocket : public CCommLayerServer
virtual bool DeleteDebugDump(const std::string& pUUID, const std::string& pSender);
virtual void Crash(const std::string& arg1);
- virtual void JobStarted(const char* pDest) {};
};
diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp
index 5cc9dc7..94fb9d7 100644
--- a/src/Daemon/CrashWatcher.cpp
+++ b/src/Daemon/CrashWatcher.cpp
@@ -109,7 +109,7 @@ vector_crash_infos_t GetCrashInfos(const std::string &pUID)
* CreateReport dbus call already did all the processing, and we just retrieve
* the result from dump directory, which is fast.
*/
-map_crash_report_t GetJobResult(const char* pUUID, const char* pUID)
+map_crash_report_t GetJobResult(const char* pUUID, const char* pUID, int force)
{
map_crash_info_t crashReport;
@@ -118,7 +118,7 @@ map_crash_report_t GetJobResult(const char* pUUID, const char* pUID)
* g_pPluginManager->GetDatabase(g_settings_sDatabase);
* which is unsafe wrt concurrent updates to g_pPluginManager state.
*/
- mw_result_t res = CreateCrashReport(pUUID, pUID, crashReport);
+ mw_result_t res = CreateCrashReport(pUUID, pUID, force, crashReport);
switch (res)
{
case MW_OK:
@@ -144,14 +144,13 @@ typedef struct thread_data_t {
pthread_t thread_id;
char* UUID;
char* UID;
+ int force;
char* peer;
} thread_data_t;
static void* create_report(void* arg)
{
thread_data_t *thread_data = (thread_data_t *) arg;
- g_pCommLayer->JobStarted(thread_data->peer);
-
/* Client name is per-thread, need to set it */
set_client_name(thread_data->peer);
@@ -159,7 +158,7 @@ static void* create_report(void* arg)
{
/* "GetJobResult" is a bit of a misnomer */
log("Creating report...");
- map_crash_info_t crashReport = GetJobResult(thread_data->UUID, thread_data->UID);
+ map_crash_info_t crashReport = GetJobResult(thread_data->UUID, thread_data->UID, thread_data->force);
g_pCommLayer->JobDone(thread_data->peer, thread_data->UUID);
}
catch (CABRTException& e)
@@ -187,11 +186,12 @@ static void* create_report(void* arg)
/* Bogus value. pthreads require us to return void* */
return NULL;
}
-int CreateReportThread(const char* pUUID, const char* pUID, const char* pSender)
+int CreateReportThread(const char* pUUID, const char* pUID, int force, const char* pSender)
{
thread_data_t *thread_data = (thread_data_t *)xzalloc(sizeof(thread_data_t));
thread_data->UUID = xstrdup(pUUID);
thread_data->UID = xstrdup(pUID);
+ thread_data->force = force;
thread_data->peer = xstrdup(pSender);
//TODO: do we need this?
//pthread_attr_t attr;
diff --git a/src/Daemon/CrashWatcher.h b/src/Daemon/CrashWatcher.h
index 00bb4d5..d8c7c28 100644
--- a/src/Daemon/CrashWatcher.h
+++ b/src/Daemon/CrashWatcher.h
@@ -49,8 +49,8 @@ class CCrashWatcher
};
vector_crash_infos_t GetCrashInfos(const std::string &pUID);
-int CreateReportThread(const char* pUUID, const char* pUID, const char* pSender);
-map_crash_report_t GetJobResult(const char* pUUID, const char* pUID);
+int CreateReportThread(const char* pUUID, const char* pUID, int force, const char* pSender);
+map_crash_report_t GetJobResult(const char* pUUID, const char* pUID, int force);
bool DeleteDebugDump(const std::string& pUUID, const std::string& pUID);
#endif /*CRASHWATCHER_H_*/
diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp
index cbcf697..d1ab188 100644
--- a/src/Daemon/Daemon.cpp
+++ b/src/Daemon/Daemon.cpp
@@ -50,10 +50,9 @@
* - GetCrashInfos(): returns a vector_crash_infos_t (vector_map_vector_string_t)
* of crashes for given uid
* v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents"
- * - CreateReport(UUID): starts creating a report for /var/cache/abrt/DIR with this UUID.
+ * - CreateReport(UUID,force): starts creating a report for /var/cache/abrt/DIR with this UUID.
* Returns job id (uint64).
- * Emits JobStarted(client_dbus_ID,job_id) dbus signal.
- * After it returns, when report creation thread has finished,
+ * After thread returns, when report creation thread has finished,
* JobDone(client_dbus_ID,UUID) dbus signal is emitted.
* - GetJobResult(UUID): returns map_crash_report_t (map_vector_string_t)
* - Report(map_crash_report_t (map_vector_string_t[, map_map_string_t])):
@@ -71,8 +70,6 @@
*
* DBus signals we emit:
* - Crash(progname,uid) - a new crash occurred (new /var/cache/abrt/DIR is found)
- * - JobStarted(client_dbus_ID,job_id) - see CreateReport above.
- * Sent as unicast to the client which did CreateReport.
* - JobDone(client_dbus_ID,UUID) - see CreateReport above.
* Sent as unicast to the client which did CreateReport.
* - Warning(msg,job_id)
@@ -81,9 +78,8 @@
* If set_client_name(NULL) was done, they are not sent.
*
* TODO:
- * - API does not really need JobStarted dbus signal at all, and JobDone signal
- * does not need to pass any parameters - out clients never sent multiple
- * CreateReport's.
+ * - JobDone signal does not need to pass any parameters
+ * - our clients never send multiple CreateReport's.
*/
@@ -153,7 +149,7 @@ static double GetDirSize(const std::string &pPath, std::string *worst_dir = NULL
if (worst_dir && strcmp(excluded, ep->d_name) != 0)
{
/* Calculate "weighted" size and age
- /* w = sz_kbytes * age_mins */
+ * w = sz_kbytes * age_mins */
sz /= 1024;
long age = (time(NULL) - stats.st_mtime) / 60;
if (age > 0)
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index b05dbb6..05abc9b 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -163,15 +163,17 @@ static std::string GetGlobalUUID(const std::string& pAnalyzer,
* @param pDebugDumpPath A debugdump dir containing all necessary data.
*/
static void CreateReport(const std::string& pAnalyzer,
- const std::string& pDebugDumpDir)
+ const std::string& pDebugDumpDir,
+ int force)
{
CAnalyzer* analyzer = g_pPluginManager->GetAnalyzer(pAnalyzer);
- analyzer->CreateReport(pDebugDumpDir);
+ analyzer->CreateReport(pDebugDumpDir, force);
}
mw_result_t CreateCrashReport(const std::string& pUUID,
- const std::string& pUID,
- map_crash_report_t& pCrashReport)
+ const std::string& pUID,
+ int force,
+ map_crash_report_t& pCrashReport)
{
VERB2 log("CreateCrashReport('%s','%s',result)", pUUID.c_str(), pUID.c_str());
@@ -185,7 +187,7 @@ mw_result_t CreateCrashReport(const std::string& pUUID,
}
if (pUUID == "" || row.m_sUUID != pUUID)
{
- warn_client("CreateCrashReport(): UUID '"+pUUID+"' is not in database.");
+ warn_client("CreateCrashReport(): UUID '"+pUUID+"' is not in database");
return MW_IN_DB_ERROR;
}
@@ -211,7 +213,7 @@ mw_result_t CreateCrashReport(const std::string& pUUID,
dd.Close();
VERB3 log(" CreateReport('%s')", analyzer.c_str());
- CreateReport(analyzer, row.m_sDebugDumpDir);
+ CreateReport(analyzer, row.m_sDebugDumpDir, force);
gUUID = GetGlobalUUID(analyzer, row.m_sDebugDumpDir);
VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str());
diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h
index bc80952..fab822f 100644
--- a/src/Daemon/MiddleWare.h
+++ b/src/Daemon/MiddleWare.h
@@ -65,6 +65,7 @@ void LoadOpenGPGPublicKey(const char* key);
*/
mw_result_t CreateCrashReport(const std::string& pUUID,
const std::string& pUID,
+ int force,
map_crash_report_t& pCrashReport);
/**
* Activates particular action plugin.
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py
index f1ab443..70db9ff 100644
--- a/src/Gui/CCDBusBackend.py
+++ b/src/Gui/CCDBusBackend.py
@@ -61,7 +61,6 @@ class DBusManager(gobject.GObject):
gobject.signal_new("update", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
# signal emited to show gui if user try to run it again
gobject.signal_new("show", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
- # signal emited to show gui if user try to run it again
gobject.signal_new("daemon-state-changed", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
gobject.signal_new("report-done", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
@@ -70,7 +69,9 @@ class DBusManager(gobject.GObject):
session.request_name(APP_NAME)
iface = DBusInterface(self)
- self.connect_to_daemon()
+ self.bus = dbus.SystemBus()
+ if not self.bus:
+ raise Exception(_("Can't connect to system dbus"))
self.bus.add_signal_receiver(self.owner_changed_cb, "NameOwnerChanged", dbus_interface="org.freedesktop.DBus")
# new crash notification
self.bus.add_signal_receiver(self.crash_cb, "Crash", dbus_interface=CC_IFACE)
@@ -81,9 +82,30 @@ class DBusManager(gobject.GObject):
# watch for job-done signals
self.bus.add_signal_receiver(self.jobdone_cb, "JobDone", dbus_interface=CC_IFACE)
- # disconnect callback
- def disconnected(self, *args):
- print "disconnect"
+ # We use this function instead of caching and reusing of
+ # dbus.Interface(proxy, dbus_interface=CC_IFACE) because we want
+ # to restart abrtd in this scenario:
+ # (1) abrt-gui was run
+ # (2) user generated the report, then left for coffee break
+ # (3) abrtd exited on inactivity timeout
+ # (4) user returned and wants to submit the report
+ # for (4) to restart abrtd, we must recreate proxy and daemon
+ def daemon(self):
+ if not self.bus:
+ self.bus = dbus.SystemBus()
+ if not self.bus:
+ raise Exception(_("Can't connect to system dbus"))
+ proxy = self.bus.get_object(CC_IFACE, CC_PATH, introspect=False)
+ if not proxy:
+ raise Exception(_("Please check if abrt daemon is running"))
+ daemon = dbus.Interface(proxy, dbus_interface=CC_IFACE)
+ if not daemon:
+ raise Exception(_("Please check if abrt daemon is running"))
+ return daemon
+
+# # disconnect callback
+# def disconnected(self, *args):
+# print "disconnect"
def error_handler_cb(self,error):
self.emit("abrt-error",error)
@@ -115,43 +137,18 @@ class DBusManager(gobject.GObject):
print "Warning >>%s<<" % message
self.emit("warning", message)
-# Seems to be not needed at all. Not only that, it is actively harmful
-# when abrtd is autostarted by dbus-daemon: connect_to_daemon() would install
-# duplicate signal handlers!
def owner_changed_cb(self,name, old_owner, new_owner):
if name == CC_NAME:
- # No need to connect at once, we can do it when we need it
- # (and this "connect on demand" mode of operation is needed
- # anyway if abrtd is autostarted by dbus: before we call it,
- # there is no abrtd to connect to!)
if new_owner:
- #self.proxy = self.connect_to_daemon()
self.emit("daemon-state-changed", "up")
else:
- #self.proxy = None
self.emit("daemon-state-changed", "down")
- def connect_to_daemon(self):
- if not self.bus:
- self.bus = dbus.SystemBus()
- if not self.bus:
- raise Exception(_("Can't connect to dbus"))
- # Can't do this: abrtd may be autostarted by dbus-daemon
- #if self.bus.name_has_owner(CC_NAME):
- # self.proxy = self.bus.get_object(CC_IFACE, CC_PATH, introspect=False)
- #else:
- # raise Exception(_("Please check if abrt daemon is running."))
- self.proxy = self.bus.get_object(CC_IFACE, CC_PATH, introspect=False)
- if self.proxy:
- self.cc = dbus.Interface(self.proxy, dbus_interface=CC_IFACE)
- else:
- raise Exception(_("Please check if abrt daemon is running."))
-
def jobdone_cb(self, dest, uuid):
# TODO: check that it is indeed OUR job:
# remember uuid in getReport and compare here
print "Our job for UUID %s is done." % uuid
- dump = self.cc.GetJobResult(uuid)
+ dump = self.daemon().GetJobResult(uuid)
if dump:
self.emit("analyze-complete", dump)
else:
@@ -161,31 +158,21 @@ class DBusManager(gobject.GObject):
self.emit("report-done", result)
def getReport(self, UUID):
- try:
- # let's try it async
- # even if it's async it timeouts, so let's try to set the timeout to 60sec
- #self.cc.CreateReport(UUID, reply_handler=self.addJob, error_handler=self.error_handler, timeout=60)
- # we don't need the return value, as the job_id is sent via JobStarted signal
- self.cc.CreateReport(UUID, timeout=60)
- except dbus.exceptions.DBusException, e:
- # One case when it fails is if abrtd exited and needs to be
- # autostarted by dbus again. (This is a first stab
- # at making it work in this case, I want to find a better way)
- self.connect_to_daemon()
- self.cc.CreateReport(UUID, timeout=60)
+ # 2nd param is "force recreating of backtrace etc"
+ self.daemon().CreateReport(UUID, 0, timeout=60)
def Report(self, report, reporters_settings = None):
# map < Plguin_name vec <status, message> >
- self.cc.Report(report, reporters_settings, reply_handler=self.report_done, error_handler=self.error_handler_cb, timeout=60)
+ self.daemon().Report(report, reporters_settings, reply_handler=self.report_done, error_handler=self.error_handler_cb, timeout=60)
def DeleteDebugDump(self,UUID):
- return self.cc.DeleteDebugDump(UUID)
+ return self.daemon().DeleteDebugDump(UUID)
def getDumps(self):
row_dict = None
rows = []
# FIXME check the arguments
- for row in self.cc.GetCrashInfos():
+ for row in self.daemon().GetCrashInfos():
row_dict = {}
for column in row:
row_dict[column] = row[column]
@@ -193,28 +180,28 @@ class DBusManager(gobject.GObject):
return rows
def getPluginsInfo(self):
- return self.cc.GetPluginsInfo()
+ return self.daemon().GetPluginsInfo()
def getPluginSettings(self, plugin_name):
- settings = self.cc.GetPluginSettings(plugin_name)
+ settings = self.daemon().GetPluginSettings(plugin_name)
#for i in settings.keys():
# print i
return settings
def registerPlugin(self, plugin_name):
- return self.cc.RegisterPlugin(plugin_name)
+ return self.daemon().RegisterPlugin(plugin_name)
def unRegisterPlugin(self, plugin_name):
- return self.cc.UnRegisterPlugin(plugin_name)
+ return self.daemon().UnRegisterPlugin(plugin_name)
def setPluginSettings(self, plugin_name, plugin_settings):
- return self.cc.SetPluginSettings(plugin_name, plugin_settings)
+ return self.daemon().SetPluginSettings(plugin_name, plugin_settings)
def getSettings(self):
- return self.cc.GetSettings()
+ return self.daemon().GetSettings()
def setSettings(self, settings):
# FIXME: STUB!!!!
print "setSettings stub"
- retval = self.cc.SetSettings(self.cc.GetSettings())
+ retval = self.daemon().SetSettings(self.daemon().GetSettings())
print ">>>", retval
diff --git a/src/Gui/CellRenderers.py b/src/Gui/CellRenderers.py
index 5777a7c..0bedf7a 100644
--- a/src/Gui/CellRenderers.py
+++ b/src/Gui/CellRenderers.py
@@ -29,11 +29,12 @@ class MultilineCellRenderer(gtk.CellRendererText):
def __init__(self):
gtk.CellRendererText.__init__(self)
self._in_editor_menu = False
+ self.old_text = ""
- def _on_editor_focus_out_event(self, editor, *args):
+ def _on_editor_focus_out_event(self, editor, event):
if self._in_editor_menu: return
editor.remove_widget()
- self.emit("editing-canceled")
+ self.emit("edited", editor.get_data("path"), editor.get_text())
def _on_editor_key_press_event(self, editor, event):
if event.state & (gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK): return
@@ -41,6 +42,7 @@ class MultilineCellRenderer(gtk.CellRendererText):
editor.remove_widget()
self.emit("edited", editor.get_data("path"), editor.get_text())
elif event.keyval == gtk.keysyms.Escape:
+ editor.set_text(self.old_text)
editor.remove_widget()
self.emit("editing-canceled")
@@ -53,6 +55,7 @@ class MultilineCellRenderer(gtk.CellRendererText):
def do_start_editing(self, event, widget, path, bg_area, cell_area, flags):
editor = CellTextView()
editor.modify_font(self.props.font_desc)
+ self.old_text = self.props.text
editor.set_text(self.props.text)
editor.set_size_request(cell_area.width, cell_area.height)
editor.set_border_width(min(self.props.xpad, self.props.ypad))
diff --git a/src/Gui/ConfBackend.py b/src/Gui/ConfBackend.py
index e0f6434..eb94b87 100644
--- a/src/Gui/ConfBackend.py
+++ b/src/Gui/ConfBackend.py
@@ -33,6 +33,17 @@ class ConfBackendGnomeKeyring(ConfBackend):
settings_tmp["AbrtPluginInfo"] = name
password = ""
+ item_list = []
+ try:
+ item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, {"AbrtPluginInfo":str(name)})
+ except gkey.NoMatchError, ex:
+ # nothing found
+ pass
+
+ # delete all items containg "AbrtPluginInfo":<plugin_name>, so we always have only 1 item per plugin
+ for item in item_list:
+ gkey.item_delete_sync(self.default_key_ring, item.item_id)
+
if "Password" in settings_tmp:
password = settings_tmp["Password"]
del settings_tmp["Password"]
@@ -43,6 +54,7 @@ class ConfBackendGnomeKeyring(ConfBackend):
password,
True)
+
def load(self, name):
item_list = None
try:
diff --git a/src/Gui/PluginSettingsUI.py b/src/Gui/PluginSettingsUI.py
index ae5b64d..a26f87f 100644
--- a/src/Gui/PluginSettingsUI.py
+++ b/src/Gui/PluginSettingsUI.py
@@ -25,6 +25,13 @@ class PluginSettingsUI(gtk.Dialog):
self.add(no_ui_label)
no_ui_label.show()
+ #connect show_pass buttons if present
+
+
+ def on_show_pass_toggled(self, button, entry=None):
+ if entry:
+ entry.set_visibility(button.get_active())
+
def hydrate(self):
if self.plugin_gui:
if self.pluginfo.Enabled == "yes":
@@ -35,6 +42,13 @@ class PluginSettingsUI(gtk.Dialog):
widget = self.plugin_gui.get_object("conf_%s" % key)
if type(widget) == gtk.Entry:
widget.set_text(value)
+ if widget.get_visibility() == False:
+ # if we find toggle button called the same name as entry and entry has
+ # visibility set to False, connect set_visible to it
+ # coz I guess it's toggle for revealing the password
+ button = self.plugin_gui.get_object("cb_%s" % key)
+ if type(button) == gtk.CheckButton:
+ button.connect("toggled", self.on_show_pass_toggled, widget)
elif type(widget) == gtk.CheckButton:
widget.set_active(value == "yes")
elif type(widget) == gtk.ComboBox: