summaryrefslogtreecommitdiff
path: root/plugins/gpg
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gpg')
-rw-r--r--plugins/gpg/__init__.py47
1 files changed, 42 insertions, 5 deletions
diff --git a/plugins/gpg/__init__.py b/plugins/gpg/__init__.py
index 5662bd4f..01ca6ab2 100644
--- a/plugins/gpg/__init__.py
+++ b/plugins/gpg/__init__.py
@@ -1,4 +1,6 @@
from gpg import gnupg
+from sleekxmpp.xmlstream.stanzabase import JID
+
from xml.etree import cElementTree as ET
import xml.sax.saxutils
@@ -54,7 +56,7 @@ class Plugin(BasePlugin):
self.add_event_handler('conversation_say_after', self.on_conversation_say)
self.add_event_handler('conversation_msg', self.on_conversation_msg)
- self.add_tab_command(ConversationTab, 'gpg', self.command_gpg, "Usage: /gpg <force|disable>\nGpg: Force or disable gpg encryption with this fulljid.", lambda the_input: the_input.auto_completion(['force', 'disable']))
+ self.add_command('gpg', self.command_gpg, "Usage: /gpg <force|disable|setkey> [JID] [keyid]\nGpg: Force or disable gpg encryption with the fulljid of the current conversation. The setkey argument lets you associate a keyid with the given bare JID.", self.gpg_completion)
ConversationTab.add_information_element('gpg', self.display_encryption_status)
def cleanup(self):
@@ -121,7 +123,7 @@ class Plugin(BasePlugin):
return
signed = to.full in self.contacts.keys()
if signed:
- veryfied = self.contacts[to.full] == 'valid'
+ veryfied = self.contacts[to.full] in ('valid', 'forced')
else:
veryfied = False
if veryfied:
@@ -155,11 +157,46 @@ class Plugin(BasePlugin):
"""
if jid.full not in self.contacts.keys():
return ''
- return ' GPG Key: %s' % self.contacts[jid.full]
+ status = self.contacts[jid.full]
+ self.core.information('%s' % (status,))
+ if status in ('valid', 'invalid', 'signed'):
+ return ' GPG Key: %s (%s)' % (status, 'encrypted' if status == 'valid' else 'NOT encrypted',)
+ else:
+ return ' GPG: Encryption %s' % (status,)
def command_gpg(self, args):
- # TODO
- return
+ """
+ A command to force or disable the encryption, or to assign a keyid to a JID
+ """
+ args = args.split()
+ if not args:
+ return self.core.command_help("gpg")
+ if len(args) >= 2:
+ jid = JID(args[1])
+ else:
+ if isinstance(self.core.current_tab(), ConversationTab):
+ jid = JID(self.core.current_tab().get_name())
+ command = args[0]
+ if command == 'force' or command == 'enable':
+ # we can force encryption only with contact having an associated
+ # key, otherwise we cannot encrypt at all
+ if self.config.has_section('keys') and jid.bare in self.config.options('keys'):
+ self.contacts[JID(jid).full] = 'forced'
+ else:
+ self.core.information('Cannot force encryption: no key associated with %s' % (jid.bare), 'Info')
+ elif command == 'disable':
+ self.contacts[JID(jid).full] = 'disabled'
+ elif command == 'setkey':
+ if len(args) != 3:
+ return self.core.command_help("gpg")
+ if not self.config.has_section('keys'):
+ self.config.add_section('keys')
+ self.config.set(jid.bare, args[2], 'keys')
+ self.config.write()
+ self.core.refresh_window()
+
+ def gpg_completion(self, the_input):
+ return the_input.auto_completion(['force', 'disable', 'setkey'], ' ')
def remove_gpg_headers(self, text):
lines = text.splitlines()