summaryrefslogtreecommitdiffstats
path: root/src/Gui
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2009-10-05 21:42:16 +0200
committerJiri Moskovcak <jmoskovc@redhat.com>2009-10-05 21:42:16 +0200
commita47026057cd99a0e1eb34d51ed644cc66ae20bc6 (patch)
tree5a2b250f50aa8239ac98377817410cdae6a267e5 /src/Gui
parenta56b047e24bbf96879e77f51867b96d515cdbfa6 (diff)
downloadabrt-a47026057cd99a0e1eb34d51ed644cc66ae20bc6.tar.gz
abrt-a47026057cd99a0e1eb34d51ed644cc66ae20bc6.tar.xz
abrt-a47026057cd99a0e1eb34d51ed644cc66ae20bc6.zip
removed unsecure reading/writting from ~HOME directory
- daemon eunning under root can't read/write from ~HOME, so reading/writting config files have been moved to client (GUI) - uses gnome keyring to store the credentials
Diffstat (limited to 'src/Gui')
-rw-r--r--src/Gui/ABRTExceptions.py11
-rw-r--r--src/Gui/ABRTPlugin.py49
-rw-r--r--src/Gui/CCDBusBackend.py2
-rw-r--r--src/Gui/ConfBackend.py64
-rw-r--r--src/Gui/Makefile.am2
-rw-r--r--src/Gui/PluginList.py33
-rw-r--r--src/Gui/PluginSettingsUI.py7
-rw-r--r--src/Gui/PluginsSettingsDialog.py3
8 files changed, 124 insertions, 47 deletions
diff --git a/src/Gui/ABRTExceptions.py b/src/Gui/ABRTExceptions.py
index 791654f5..30496384 100644
--- a/src/Gui/ABRTExceptions.py
+++ b/src/Gui/ABRTExceptions.py
@@ -2,14 +2,23 @@ from abrt_utils import _
class IsRunning(Exception):
def __init__(self):
+ Exception.__init__(self)
self.what = _("Another client is already running, trying to wake it.")
def __str__(self):
return self.what
class WrongData(Exception):
def __init__(self):
+ Exception.__init__(self)
self.what = _("Got unexpected data from daemon (is the database properly updated?).")
def __str__(self):
return self.what
-
+
+class ConfBackendInitError(Exception):
+ def __init__(self, msg):
+ Exception.__init__(self)
+ self.what = msg
+
+ def __str__(self):
+ return self.what
diff --git a/src/Gui/ABRTPlugin.py b/src/Gui/ABRTPlugin.py
index 181126af..590a0de1 100644
--- a/src/Gui/ABRTPlugin.py
+++ b/src/Gui/ABRTPlugin.py
@@ -16,27 +16,33 @@ from ConfBackend import ConfBackendGnomeKeyring
class PluginSettings(dict):
def __init__(self):
dict.__init__(self)
- #print "Init plugin settings"
+ self.conf = ConfBackendGnomeKeyring()
- def __init__(self, settings_dict):
- dict.__init__(self)
- for key in settings_dict.keys():
- self[key] = settings_dict[key]
-
def check(self):
- if "Password" in self.keys():
- # password is missing
- if not self["Password"]:
- return False
+ for key in ["Password", "Login"]:
+ if key in self.keys():
+ # some of the required keys is missing
+ if not self[key]:
+ return False
# settings are OK
return True
-
- def load(self, name):
+
+ def load(self, name, default_settings):
print "load:", name
-
+ # load settings from daemon
+ for key in default_settings.keys():
+ self[str(key)] = str(default_settings[key])
+
+ settings = self.conf.load(name)
+ # overwrite defaluts with user setting
+ for key in settings.keys():
+ self[str(key)] = str(settings[key])
+ print str(key), str(settings[key])
+
def save(self, name):
print "save: ", name
-
+ self.conf.save(name, self)
+
class PluginInfo():
"""Class to represent common plugin info"""
types = {"Analyzer":_("Analyzer plugins"),
@@ -57,7 +63,7 @@ class PluginInfo():
self.Type = None
self.Email = None
self.Description = None
- self.Settings = PluginSettings({})
+ self.Settings = PluginSettings()
def getName(self):
return self.Name
@@ -76,12 +82,13 @@ class PluginInfo():
def __getitem__(self, item):
return self.__dict__[item]
-
- def load_settings(self):
+
+ def load_settings(self, default_settings):
if self.Name:
- self.Settings.load(self.Name)
+ print self.Name
+ self.Settings.load(self.Name, default_settings)
else:
- print "plugin name is not set, can't load it's settings"
-
+ print _("Plugin name is not set, can't load it's settings")
+
def save_settings(self):
- self.Settings.save(self.Name)
+ self.Settings.save(str(self.Name))
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py
index 71a50e2e..f1ab4435 100644
--- a/src/Gui/CCDBusBackend.py
+++ b/src/Gui/CCDBusBackend.py
@@ -176,7 +176,7 @@ class DBusManager(gobject.GObject):
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.cc.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)
diff --git a/src/Gui/ConfBackend.py b/src/Gui/ConfBackend.py
new file mode 100644
index 00000000..5cbd9f9b
--- /dev/null
+++ b/src/Gui/ConfBackend.py
@@ -0,0 +1,64 @@
+from ABRTExceptions import ConfBackendInitError
+from abrt_utils import _
+
+#FIXME: add some backend factory
+
+try:
+ import gnomekeyring as gkey
+except ImportError, e:
+ print e
+ gkey = None
+
+class ConfBackend(object):
+ def __init__(self):
+ pass
+
+ def save(self, name, settings):
+ """ Default save method has to be implemented in derived class """
+ raise NotImplementedError
+
+ def load(self, name):
+ """ Default load method has to be implemented in derived class """
+ raise NotImplementedError
+
+
+class ConfBackendGnomeKeyring(ConfBackend):
+ def __init__(self):
+ ConfBackend.__init__(self)
+ self.default_key_ring = gkey.get_default_keyring_sync()
+ if not gkey.is_available():
+ raise ConfBackendInitError(_("Can't connect do Gnome Keyring daemon"))
+
+ def save(self, name, settings):
+ print settings
+ settings_tmp = settings.copy()
+ settings_tmp["AbrtPluginInfo"] = name
+ password = ""
+
+ if "Password" in settings_tmp:
+ print "saving password"
+ password = settings_tmp["Password"]
+ del settings_tmp["Password"]
+ gkey.item_create_sync(self.default_key_ring,
+ gkey.ITEM_GENERIC_SECRET,
+ "abrt:%s" % name,
+ settings_tmp,
+ password,
+ True)
+
+ def load(self, name):
+ item_list = None
+ try:
+ item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, {"AbrtPluginInfo":str(name)})
+ except gkey.NoMatchError, ex:
+ print "kekeke"
+ if item_list:
+ print ">>> neco"
+ retval = item_list[0].attributes.copy()
+ retval["Password"] = item_list[0].secret
+ return retval
+ else:
+ return {}
+ #for i in item_list:
+ # for attr in i.attributes:
+ # print attr, i.attributes[attr]
diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am
index 66317f9e..a3993fa5 100644
--- a/src/Gui/Makefile.am
+++ b/src/Gui/Makefile.am
@@ -6,7 +6,7 @@ PYTHON_FILES = CCDBusBackend.py CCDumpList.py CCDump.py CC_gui_functions.py \
CCReporterDialog.py CCReport.py abrt_utils.py \
CCMainWindow.py CellRenderers.py ABRTExceptions.py \
SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \
- PluginsSettingsDialog.py
+ PluginsSettingsDialog.py ConfBackend.py
GLADE_FILES = ccgui.glade report.glade settings.glade dialogs.glade
diff --git a/src/Gui/PluginList.py b/src/Gui/PluginList.py
index 13c9537f..e57040d1 100644
--- a/src/Gui/PluginList.py
+++ b/src/Gui/PluginList.py
@@ -11,26 +11,19 @@ class PluginInfoList(list):
def load(self):
if self.dm:
#print "loading PluginList"
- try:
- rows = self.dm.getPluginsInfo()
- #print rows
- for row in rows:
- entry = PluginInfo()
- for column in row:
- #print "PluginInfoList adding %s:%s" % (column,row[column])
- entry.__dict__[column] = row[column]
- if entry.Enabled == "yes":
- #print ">>%s<<" % entry
- entry.Settings = PluginSettings(self.dm.getPluginSettings(str(entry)))
- #for i in entry.Settings.keys():
- # print "%s: %s" % (i, entry.Settings[i])
- #else:
- # print "%s is disabled" % entry
- self.append(entry)
- self.ddict[entry.getName()] = entry
- except Exception, e:
- print e
- return
+ rows = self.dm.getPluginsInfo()
+ #print rows
+ for row in rows:
+ entry = PluginInfo()
+ for column in row:
+ #print "PluginInfoList adding %s:%s" % (column,row[column])
+ entry.__dict__[column] = row[column]
+ if entry.Enabled == "yes":
+ #entry.Settings = PluginSettings(self.dm.getPluginSettings(str(entry)))
+ default_settings = self.dm.getPluginSettings(str(entry))
+ entry.load_settings(default_settings)
+ self.append(entry)
+ self.ddict[entry.getName()] = entry
else:
print "db == None!"
diff --git a/src/Gui/PluginSettingsUI.py b/src/Gui/PluginSettingsUI.py
index 02c03171..ae5b64d4 100644
--- a/src/Gui/PluginSettingsUI.py
+++ b/src/Gui/PluginSettingsUI.py
@@ -1,7 +1,8 @@
import gtk
from abrt_utils import _
+
class PluginSettingsUI(gtk.Dialog):
- def __init__(self, pluginfo):
+ def __init__(self, pluginfo, parent=None):
#print "Init PluginSettingsUI"
gtk.Dialog.__init__(self)
self.plugin_name = pluginfo.Name
@@ -16,6 +17,8 @@ class PluginSettingsUI(gtk.Dialog):
if not self.dialog:
raise Exception(_("Can't find PluginDialog widget in UI description!"))
self.dialog.set_title("%s" % pluginfo.getName())
+ if parent:
+ self.dialog.set_transient_for(parent)
else:
# we shouldn't get here, but just to be safe
no_ui_label = gtk.Label(_("No UI for plugin %s" % pluginfo))
@@ -27,7 +30,7 @@ class PluginSettingsUI(gtk.Dialog):
if self.pluginfo.Enabled == "yes":
if self.Settings:
#print "Hydrating %s" % self.plugin_name
- for key,value in self.Settings.iteritems():
+ for key, value in self.Settings.iteritems():
#print "%s:%s" % (key,value)
widget = self.plugin_gui.get_object("conf_%s" % key)
if type(widget) == gtk.Entry:
diff --git a/src/Gui/PluginsSettingsDialog.py b/src/Gui/PluginsSettingsDialog.py
index a6420b1e..a346455e 100644
--- a/src/Gui/PluginsSettingsDialog.py
+++ b/src/Gui/PluginsSettingsDialog.py
@@ -130,9 +130,10 @@ class PluginsSettingsDialog:
ui.dehydrate()
if pluginfo.Settings:
try:
+ pluginfo.save_settings()
self.ccdaemon.setPluginSettings(pluginfo.getName(), pluginfo.Settings)
except Exception, e:
- gui_error_message(_("Can't save plugin settings:\n %s", e))
+ gui_error_message(_("Can't save plugin settings:\n %s" % e))
#for key, val in pluginfo.Settings.iteritems():
# print "%s:%s" % (key, val)
elif response == gtk.RESPONSE_CANCEL: