[Hawke patches Lukas patch :D] now Gajim can use gpg-agent
This commit is contained in:
parent
4902e17742
commit
7d2a698fc9
|
@ -17,7 +17,7 @@
|
|||
## GNU General Public License for more details.
|
||||
##
|
||||
|
||||
from tempfile import *
|
||||
from os import tmpfile
|
||||
|
||||
USE_GPG = True
|
||||
|
||||
|
@ -115,7 +115,7 @@ else:
|
|||
|
||||
try: proc.wait()
|
||||
except IOError: pass
|
||||
if resp.has_key('GOOD_PASSPHRASE'):
|
||||
if resp.has_key('GOOD_PASSPHRASE') or resp.has_key('SIG_CREATED'):
|
||||
return self._stripHeaderFooter(output)
|
||||
return 'BAD_PASSPHRASE'
|
||||
|
||||
|
@ -124,7 +124,7 @@ else:
|
|||
return str
|
||||
if not str:
|
||||
return ''
|
||||
f = TemporaryFile(prefix='gajim')
|
||||
f = tmpfile()
|
||||
fd = f.fileno()
|
||||
f.write(str)
|
||||
f.seek(0)
|
||||
|
@ -147,8 +147,6 @@ else:
|
|||
keyid = ''
|
||||
if resp.has_key('GOODSIG'):
|
||||
keyid = resp['GOODSIG'].split()[0]
|
||||
elif resp.has_key('BADSIG'):
|
||||
keyid = resp['BADSIG'].split()[0]
|
||||
return keyid
|
||||
|
||||
def get_keys(self, secret = False):
|
||||
|
|
|
@ -108,6 +108,7 @@ class Config:
|
|||
'send_os_info': [ opt_bool, True ],
|
||||
'check_for_new_version': [ opt_bool, False ],
|
||||
'usegpg': [ opt_bool, False ],
|
||||
'use_gpg_agent': [ opt_bool, False ],
|
||||
'log_notif_in_user_file': [ opt_bool, True ],
|
||||
'log_notif_in_sep_file': [ opt_bool, True ],
|
||||
'change_roster_title': [ opt_bool, True ],
|
||||
|
|
|
@ -1383,33 +1383,35 @@ class Connection:
|
|||
#Get bookmarks from private namespace
|
||||
self.get_bookmarks()
|
||||
|
||||
def change_status(self, show, msg, sync = False):
|
||||
def change_status(self, show, msg, sync = False, auto = False):
|
||||
if sync:
|
||||
self.change_status2(show, msg)
|
||||
self.change_status2(show, msg, auto)
|
||||
else:
|
||||
t = threading.Thread(target=self.change_status2, args = (show, msg))
|
||||
t = threading.Thread(target=self.change_status2, args = (show, msg, auto))
|
||||
t.start()
|
||||
|
||||
def change_status2(self, show, msg):
|
||||
def change_status2(self, show, msg, auto = False):
|
||||
if not show in STATUS_LIST:
|
||||
return -1
|
||||
sshow = show # show to be send
|
||||
if show == 'online':
|
||||
sshow = None
|
||||
signed = ''
|
||||
if not msg:
|
||||
lowered_uf_status_msg = helpers.get_uf_show(show).lower()
|
||||
if lowered_uf_status_msg == _('invisible'): # do not show I'm invisible!
|
||||
lowered_uf_status_msg = _('offline')
|
||||
msg = _("I'm %s") % lowered_uf_status_msg
|
||||
|
||||
signed = ''
|
||||
keyID = gajim.config.get_per('accounts', self.name, 'keyid')
|
||||
if keyID and USE_GPG:
|
||||
if self.connected < 2 and self.gpg.passphrase is None:
|
||||
if keyID and USE_GPG and not auto and not show == 'offline':
|
||||
use_gpg_agent = gajim.config.get('use_gpg_agent')
|
||||
if self.connected < 2 and self.gpg.passphrase is None and not use_gpg_agent:
|
||||
# We didn't set a passphrase
|
||||
self.dispatch('ERROR', (_('OpenPGP passphrase was not given'),
|
||||
#%s is the account name here
|
||||
_('You will be connected to %s without OpenPGP.') % self.name))
|
||||
else:
|
||||
elif self.gpg.passphrase is not None or use_gpg_agent:
|
||||
signed = self.gpg.sign(msg, keyID)
|
||||
if signed == 'BAD_PASSPHRASE':
|
||||
signed = ''
|
||||
|
@ -1848,7 +1850,11 @@ class Connection:
|
|||
|
||||
def gpg_passphrase(self, passphrase):
|
||||
if USE_GPG:
|
||||
self.gpg.passphrase = passphrase
|
||||
use_gpg_agent = gajim.config.get('use_gpg_agent')
|
||||
if use_gpg_agent:
|
||||
self.gpg.passphrase = None
|
||||
else:
|
||||
self.gpg.passphrase = passphrase
|
||||
|
||||
def ask_gpg_keys(self):
|
||||
if USE_GPG:
|
||||
|
|
|
@ -658,6 +658,9 @@ class Interface:
|
|||
config.GroupchatConfigWindow(self, account, jid, array[1])
|
||||
|
||||
def handle_event_bad_passphrase(self, account, array):
|
||||
use_gpg_agent = gajim.config.get('use_gpg_agent')
|
||||
if use_gpg_agent:
|
||||
return
|
||||
keyID = gajim.config.get_per('accounts', account, 'keyid')
|
||||
self.roster.forget_gpg_passphrase(keyID)
|
||||
dialogs.WarningDialog(_('Your passphrase is incorrect'),
|
||||
|
@ -822,7 +825,7 @@ class Interface:
|
|||
#we save out online status
|
||||
gajim.status_before_autoaway[account] = \
|
||||
gajim.connections[account].status
|
||||
#we go away
|
||||
#we go away (no auto status)
|
||||
self.roster.send_status(account, 'away',
|
||||
gajim.config.get('autoaway_message'))
|
||||
gajim.sleeper_state[account] = 'autoaway'
|
||||
|
|
|
@ -1171,7 +1171,7 @@ _('If "%s" accepts this request you will know his status.') %jid)
|
|||
del self.gpg_passphrase[keyid]
|
||||
return False
|
||||
|
||||
def send_status(self, account, status, txt, sync = False):
|
||||
def send_status(self, account, status, txt, sync = False, auto = False):
|
||||
if status != 'offline':
|
||||
if gajim.connections[account].connected < 2:
|
||||
model = self.tree.get_model()
|
||||
|
@ -1202,36 +1202,44 @@ _('If "%s" accepts this request you will know his status.') %jid)
|
|||
gajim.config.set_per('accounts', account, 'password', passphrase)
|
||||
|
||||
keyid = None
|
||||
save_gpg_pass = True
|
||||
save_gpg_pass = gajim.config.get_per('accounts', account,
|
||||
'savegpgpass')
|
||||
use_gpg_agent = gajim.config.get('use_gpg_agent')
|
||||
# we don't need to bother with the passphrase if we use the agent
|
||||
if use_gpg_agent:
|
||||
save_gpg_pass = False
|
||||
else:
|
||||
save_gpg_pass = gajim.config.get_per('accounts', account,
|
||||
'savegpgpass')
|
||||
keyid = gajim.config.get_per('accounts', account, 'keyid')
|
||||
if keyid and gajim.connections[account].connected < 2 and \
|
||||
gajim.config.get('usegpg'):
|
||||
if save_gpg_pass:
|
||||
passphrase = gajim.config.get_per('accounts', account,
|
||||
'gpgpassword')
|
||||
|
||||
if use_gpg_agent:
|
||||
self.gpg_passphrase[keyid] = None
|
||||
else:
|
||||
if self.gpg_passphrase.has_key(keyid):
|
||||
passphrase = self.gpg_passphrase[keyid]
|
||||
save = False
|
||||
if save_gpg_pass:
|
||||
passphrase = gajim.config.get_per('accounts', account, 'gpgpassword')
|
||||
else:
|
||||
w = dialogs.PassphraseDialog(
|
||||
_('Passphrase Required'),
|
||||
_('Enter GPG key passphrase for account %s') % account,
|
||||
_('Save passphrase'))
|
||||
passphrase, save = w.run()
|
||||
if passphrase == -1:
|
||||
passphrase = None
|
||||
else:
|
||||
self.gpg_passphrase[keyid] = passphrase
|
||||
gobject.timeout_add(30000, self.forget_gpg_passphrase, keyid)
|
||||
if save:
|
||||
gajim.config.set_per('accounts', account, 'savegpgpass', True)
|
||||
gajim.config.set_per('accounts', account, 'gpgpassword',
|
||||
passphrase)
|
||||
gajim.connections[account].gpg_passphrase(passphrase)
|
||||
gajim.connections[account].change_status(status, txt, sync)
|
||||
if self.gpg_passphrase.has_key(keyid):
|
||||
passphrase = self.gpg_passphrase[keyid]
|
||||
save = False
|
||||
else:
|
||||
w = dialogs.PassphraseDialog(
|
||||
_('Passphrase Required'),
|
||||
_('Enter GPG key passphrase for account %s') % account,
|
||||
_('Save passphrase'))
|
||||
passphrase, save = w.run()
|
||||
if passphrase == -1:
|
||||
passphrase = None
|
||||
else:
|
||||
self.gpg_passphrase[keyid] = passphrase
|
||||
gobject.timeout_add(30000, self.forget_gpg_passphrase, keyid)
|
||||
if save:
|
||||
gajim.config.set_per('accounts', account, 'savegpgpass', True)
|
||||
gajim.config.set_per('accounts', account, 'gpgpassword',
|
||||
passphrase)
|
||||
gajim.connections[account].gpg_passphrase(passphrase)
|
||||
|
||||
gajim.connections[account].change_status(status, txt, sync, auto)
|
||||
for room_jid in self.plugin.windows[account]['gc']:
|
||||
if room_jid != 'tabbed':
|
||||
nick = self.plugin.windows[account]['gc'][room_jid].nicks[room_jid]
|
||||
|
|
Loading…
Reference in New Issue