we can select our secrete ket throught gtk plugin interface

This commit is contained in:
Yann Leboulanger 2004-10-10 18:44:38 +00:00
parent a999b32ec2
commit 6142d4b448
4 changed files with 163 additions and 59 deletions

View File

@ -160,6 +160,22 @@ class MyGnuPG(GnuPGInterface.GnuPG):
keyid = string.split(resp['GOODSIG'])[0]
return keyid
def get_secret_keys(self):
proc = self.run(['--with-colons', '--list-secret-keys'], \
create_fhs=['stdout'])
output = proc.handles['stdout'].read()
proc.handles['stdout'].close()
keys = {}
lines = string.split(output, '\n')
for line in lines:
sline = string.split(line, ':')
if sline[0] == 'sec':
keys[sline[4][8:]] = sline[9]
return keys
try: proc.wait()
except IOError: pass
def stripHeaderFooter(self, data):
"""Remove header and footer from data"""
lines = string.split(data, '\n')
@ -203,6 +219,7 @@ class GajimCore:
#connexions {con: name, ...}
self.connexions = {}
self.gpg = {}
self.gpg_common = MyGnuPG()
for a in self.accounts:
self.connected[a] = 0 #0:offline, 1:online, 2:away,
#3:xa, 4:dnd, 5:invisible
@ -870,6 +887,9 @@ class GajimCore:
#('PASSPHRASE', account, passphrase)
elif ev[0] == 'PASSPHRASE':
self.gpg[ev[1]].passphrase = ev[2]
elif ev[0] == 'GPG_SECRETE_KEYS':
keys = self.gpg_common.get_secret_keys()
self.hub.sendPlugin('GPG_SECRETE_KEYS', ev[1], keys)
else:
log.debug(_("Unknown Command %s") % ev[0])
if self.mode == 'server':

View File

@ -251,7 +251,7 @@ class preference_Window:
def on_presence_button_clicked(self, widget, data=None):
self.change_notebook_page(2)
def __init__(self, plugin):
"""Initialize Preference window"""
self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Preferences', APP)
@ -341,7 +341,6 @@ class preference_Window:
self.xml.signal_connect('on_ok_clicked', self.on_ok)
self.xml.signal_connect('on_cancel_clicked', self.on_cancel)
class accountPreference_Window:
"""Class for account informations"""
def delete_event(self, widget):
@ -357,8 +356,8 @@ class accountPreference_Window:
def init_account(self, infos):
"""Initialize window with defaults values"""
if infos.has_key('name'):
self.xml.get_widget("entry_name").set_text(infos['name'])
if infos.has_key('accname'):
self.xml.get_widget("entry_name").set_text(infos['accname'])
if infos.has_key('jid'):
self.xml.get_widget("entry_jid").set_text(infos['jid'])
if infos.has_key('password'):
@ -374,6 +373,19 @@ class accountPreference_Window:
if infos.has_key('proxyport'):
self.xml.get_widget("entry_proxyport").set_text(str(\
infos['proxyport']))
if infos.has_key('keyid'):
if infos['keyid']:
self.xml.get_widget('gpg_key_label').set_text(infos['keyid'])
if infos.has_key('keyname'):
self.xml.get_widget('gpg_name_label').set_text(infos['keyname'])
self.xml.get_widget('gpg_pass_checkbutton').set_sensitive(True)
if infos.has_key('savegpgpass'):
self.xml.get_widget('gpg_pass_checkbutton').set_active(\
infos['savegpgpass'])
self.xml.get_widget('gpg_pass_entry').set_sensitive(True)
if infos.has_key('gpgpass'):
self.xml.get_widget('gpg_pass_entry').set_text(\
infos['gpgpass'])
def on_save_clicked(self, widget):
"""When save button is clicked : Save informations in config file"""
@ -420,6 +432,17 @@ class accountPreference_Window:
warning_Window(_("Priority must be a number"))
return 0
(login, hostname) = string.split(jid, '@')
keyName = self.xml.get_widget('gpg_name_label').get_text()
if keyName == '': #no key selected
keyID = ''
save_gpg_pass = 0
gpg_pass = ''
else:
keyID = self.xml.get_widget('gpg_key_label').get_text()
save_gpg_pass = 0
if self.xml.get_widget('gpg_pass_checkbutton').get_active():
save_gpg_pass = 1
gpg_pass = self.xml.get_widget('gpg_pass_entry').get_text()
#if we are modifying an account
if self.modify:
#if we modify the name of the account
@ -445,7 +468,8 @@ class accountPreference_Window:
'password': entryPass.get_text(), 'ressource': \
entryRessource.get_text(), 'priority' : prio, 'use_proxy': \
useProxy, 'proxyhost': entryProxyhost.get_text(), 'proxyport': \
proxyPort}
proxyPort, 'keyid': keyID, 'keyname': keyName, 'savegpgpass': \
save_gpg_pass, 'gpgpass': gpg_pass}
self.plugin.send('CONFIG', None, ('accounts', self.plugin.accounts))
#refresh accounts window
if self.plugin.windows.has_key('accounts'):
@ -455,21 +479,22 @@ class accountPreference_Window:
widget.get_toplevel().destroy()
return
#if it's a new account
else:
if name in self.plugin.accounts.keys():
warning_Window(_("An account already has this name"))
return
#if we neeed to register a new account
if check.get_active():
self.plugin.send('NEW_ACC', None, (hostname, login, \
entryPass.get_text(), name, entryRessource.get_text(), prio, \
useProxy, proxyHost, proxyPort))
check.set_active(FALSE)
return
if name in self.plugin.accounts.keys():
warning_Window(_("An account already has this name"))
return
#if we neeed to register a new account
if check.get_active():
self.plugin.send('NEW_ACC', None, (hostname, login, \
entryPass.get_text(), name, entryRessource.get_text(), prio, \
useProxy, proxyHost, proxyPort))
check.set_active(FALSE)
return
self.plugin.accounts[name] = {'name': login, 'hostname': hostname,\
'password': entryPass.get_text(), 'ressource': \
entryRessource.get_text(), 'priority' : prio, 'use_proxy': useProxy, \
'proxyhost': entryProxyhost.get_text(), 'proxyport': proxyPort}
'proxyhost': entryProxyhost.get_text(), 'proxyport': proxyPort, \
'keyid': keyID, 'keyname': keyName, 'savegpgpass': save_gpg_pass, \
'gpgpass': gpg_pass}
self.plugin.send('CONFIG', None, ('accounts', self.plugin.accounts))
#update variables
self.plugin.windows[name] = {'infos': {}, 'chats': {}}
@ -496,6 +521,32 @@ class accountPreference_Window:
else:
warning_Window(_("You must be connected to get your informations"))
def on_choose_gpg(self, widget, data=None):
w = choose_gpg_Window()
self.plugin.windows['gpg_keys'] = w
self.plugin.send('GPG_SECRETE_KEYS', None, ())
keyID = w.run()
if keyID == -1:
return
if keyID[0] == 'None':
self.xml.get_widget('gpg_key_label').set_text(_('No key selected'))
self.xml.get_widget('gpg_name_label').set_text('')
self.xml.get_widget('gpg_pass_checkbutton').set_sensitive(False)
self.xml.get_widget('gpg_pass_entry').set_sensitive(False)
else:
self.xml.get_widget('gpg_key_label').set_text(keyID[0])
self.xml.get_widget('gpg_name_label').set_text(keyID[1])
self.xml.get_widget('gpg_pass_checkbutton').set_sensitive(True)
self.xml.get_widget('gpg_pass_checkbutton').set_active(False)
self.xml.get_widget('gpg_pass_entry').set_text('')
def on_gpg_pass_checkbutton_toggled(self, widget, data=None):
if self.xml.get_widget('gpg_pass_checkbutton').get_active():
self.xml.get_widget('gpg_pass_entry').set_sensitive(True)
else:
self.xml.get_widget('gpg_pass_entry').set_sensitive(False)
self.xml.get_widget('gpg_pass_entry').set_text('')
#info must be a dictionnary
def __init__(self, plugin, infos = {}):
self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Account', APP)
@ -503,9 +554,13 @@ class accountPreference_Window:
self.plugin = plugin
self.account = ''
self.modify = False
self.xml.get_widget('gpg_key_label').set_text('No key selected')
self.xml.get_widget('gpg_name_label').set_text('')
self.xml.get_widget('gpg_pass_checkbutton').set_sensitive(False)
self.xml.get_widget('gpg_pass_entry').set_sensitive(False)
if infos:
self.modify = True
self.account = infos['name']
self.account = infos['accname']
self.init_account(infos)
self.xml.get_widget("checkbutton").set_sensitive(FALSE)
self.xml.signal_connect('gtk_widget_destroy', self.delete_event)
@ -513,7 +568,9 @@ class accountPreference_Window:
self.xml.signal_connect('on_edit_details_clicked', \
self.on_edit_details_clicked)
self.xml.signal_connect('on_close_clicked', self.on_close)
self.xml.signal_connect('on_choose_gpg_clicked', self.on_choose_gpg)
self.xml.signal_connect('on_gpg_pass_checkbutton_toggled', \
self.on_gpg_pass_checkbutton_toggled)
class accounts_Window:
"""Class for accounts window : lists of accounts"""
@ -575,26 +632,14 @@ class accounts_Window:
"""When modify button is clicked :
open the account information window for this account"""
if not self.plugin.windows.has_key('accountPreference'):
infos = {}
# infos = {}
sel = self.treeview.get_selection()
(model, iter) = sel.get_selected()
account = model.get_value(iter, 0)
infos['name'] = account
if self.plugin.accounts[account].has_key("name"):
infos['jid'] = self.plugin.accounts[account]["name"] + \
'@' + self.plugin.accounts[account]["hostname"]
if self.plugin.accounts[account].has_key("password"):
infos['password'] = self.plugin.accounts[account]["password"]
if self.plugin.accounts[account].has_key("ressource"):
infos['ressource'] = self.plugin.accounts[account]["ressource"]
if self.plugin.accounts[account].has_key("priority"):
infos['priority'] = self.plugin.accounts[account]["priority"]
if self.plugin.accounts[account].has_key("use_proxy"):
infos['use_proxy'] = self.plugin.accounts[account]["use_proxy"]
if self.plugin.accounts[account].has_key("proxyhost"):
infos['proxyhost'] = self.plugin.accounts[account]["proxyhost"]
if self.plugin.accounts[account].has_key("proxyport"):
infos['proxyport'] = self.plugin.accounts[account]["proxyport"]
infos = self.plugin.accounts[account]
infos['accname'] = account
infos['jid'] = self.plugin.accounts[account]["name"] + \
'@' + self.plugin.accounts[account]["hostname"]
self.plugin.windows['accountPreference'] = \
accountPreference_Window(self.plugin, infos)

View File

@ -206,6 +206,40 @@ class passphrase_Window:
self.xml.signal_connect('on_Passphrase_key_press_event', \
self.on_key_pressed)
class choose_gpg_Window:
"""Class for Away Message Window"""
def run(self):
"""Wait for Ok button to be pressed and return the selected key"""
rep = self.xml.get_widget("Choose_gpg_key").run()
if rep == gtk.RESPONSE_OK:
selection = self.treeview.get_selection()
(model, iter) = selection.get_selected()
keyID = [model.get_value(iter, 0), model.get_value(iter, 1)]
else:
keyID = -1
self.xml.get_widget("Choose_gpg_key").destroy()
return keyID
def fill_tree(self, list):
model = self.treeview.get_model()
for keyID in list.keys():
model.append((keyID, list[keyID]))
def __init__(self):
#list : {keyID: userName, ...}
self.xml = gtk.glade.XML(GTKGUI_GLADE, 'Choose_gpg_key', APP)
self.window = self.xml.get_widget("Choose_gpg_key")
self.treeview = self.xml.get_widget("treeview")
model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
self.treeview.set_model(model)
#columns
renderer = gtk.CellRendererText()
self.treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, \
text=0)
renderer = gtk.CellRendererText()
self.treeview.insert_column_with_attributes(-1, _('User name'), renderer,\
text=1)
class awayMsg_Window:
"""Class for Away Message Window"""
def on_ok(self):

View File

@ -1232,23 +1232,11 @@ class roster_Window:
def on_edit_account(self, widget, account):
if not self.plugin.windows.has_key('accountPreference'):
infos = {}
infos['name'] = account
if self.plugin.accounts[account].has_key("name"):
infos['jid'] = self.plugin.accounts[account]["name"] + \
'@' + self.plugin.accounts[account]["hostname"]
if self.plugin.accounts[account].has_key("password"):
infos['password'] = self.plugin.accounts[account]["password"]
if self.plugin.accounts[account].has_key("ressource"):
infos['ressource'] = self.plugin.accounts[account]["ressource"]
if self.plugin.accounts[account].has_key("priority"):
infos['priority'] = self.plugin.accounts[account]["priority"]
if self.plugin.accounts[account].has_key("use_proxy"):
infos['use_proxy'] = self.plugin.accounts[account]["use_proxy"]
if self.plugin.accounts[account].has_key("proxyhost"):
infos['proxyhost'] = self.plugin.accounts[account]["proxyhost"]
if self.plugin.accounts[account].has_key("proxyport"):
infos['proxyport'] = self.plugin.accounts[account]["proxyport"]
infos = self.plugin.accounts[account]
infos['accname'] = account
# if self.plugin.accounts[account].has_key("name"):
infos['jid'] = self.plugin.accounts[account]["name"] + \
'@' + self.plugin.accounts[account]["hostname"]
self.plugin.windows['accountPreference'] = \
accountPreference_Window(self.plugin, infos)
@ -1356,15 +1344,20 @@ class roster_Window:
def send_status(self, account, status, txt):
if status != 'offline':
keyid = None
save_gpg_pass = 0
if self.plugin.accounts[account].has_key("savegpgpass"):
save_gpg_pass = self.plugin.accounts[account]["savegpgpass"]
if self.plugin.accounts[account].has_key("keyid"):
keyid = self.plugin.accounts[account]["keyid"]
if keyid and not self.plugin.connected[account]:
passphrase = ''
#TODO: ask passphrase
w = passphrase_Window()
passphrase = w.run()
if passphrase == -1:
if save_gpg_pass:
passphrase = self.plugin.accounts[account]['gpgpass']
else:
passphrase = ''
w = passphrase_Window()
passphrase = w.run()
if passphrase == -1:
passphrase = ''
self.plugin.send('PASSPHRASE', account, passphrase)
self.plugin.send('STATUS', account, (status, txt))
if status == 'online':
@ -2260,6 +2253,14 @@ class plugin:
get_property('is-active'):
self.systray.add_jid(jid, account)
def handle_event_bad_passphrase(self, account, array):
pass
def handle_event_gpg_secrete_keys(self, account, keys):
keys['None'] = 'None'
if self.windows.has_key('gpg_keys'):
self.windows['gpg_keys'].fill_tree(keys)
def read_queue(self):
"""Read queue from the core and execute commands from it"""
while self.queueIN.empty() == 0:
@ -2302,6 +2303,10 @@ class plugin:
self.handle_event_log_line(ev[1], ev[2])
elif ev[0] == 'GC_MSG':
self.handle_event_gc_msg(ev[1], ev[2])
elif ev[0] == 'BAD_PASSPHRASE':
self.handle_event_bad_passphrase(ev[1], ev[2])
elif ev[0] == 'GPG_SECRETE_KEYS':
self.handle_event_gpg_secrete_keys(ev[1], ev[2])
return 1
def read_sleepy(self):
@ -2344,7 +2349,7 @@ class plugin:
'NOTIFY', 'MSG', 'MSGERROR', 'SUBSCRIBED', 'UNSUBSCRIBED', \
'SUBSCRIBE', 'AGENTS', 'AGENT_INFO', 'REG_AGENT_INFO', 'QUIT', \
'ACC_OK', 'CONFIG', 'MYVCARD', 'VCARD', 'LOG_NB_LINE', 'LOG_LINE', \
'VISUAL', 'GC_MSG'])
'VISUAL', 'GC_MSG', 'BAD_PASSPHRASE', 'GPG_SECRETE_KEYS'])
self.send('ASK_CONFIG', None, ('GtkGui', 'GtkGui', {'autopopup':1,\
'autopopupaway':1,\
'showoffline':0,\