plugin XEP-0384: added "/omemo_reset" text command:
this command will delete all sessions with peer entity, and send empty message to trigger a new key exchange.
This commit is contained in:
parent
a56fc64ea5
commit
4ccd859b62
1 changed files with 43 additions and 3 deletions
|
|
@ -55,7 +55,7 @@ PLUGIN_INFO = {
|
|||
C.PI_TYPE: "SEC",
|
||||
C.PI_PROTOCOLS: ["XEP-0384"],
|
||||
C.PI_DEPENDENCIES: ["XEP-0163", "XEP-0280", "XEP-0334", "XEP-0060"],
|
||||
C.PI_RECOMMENDATIONS: ["XEP-0045", "XEP-0359"],
|
||||
C.PI_RECOMMENDATIONS: ["XEP-0045", "XEP-0359", C.TEXT_CMDS],
|
||||
C.PI_MAIN: "OMEMO",
|
||||
C.PI_HANDLER: "no",
|
||||
C.PI_DESCRIPTION: _("""Implementation of OMEMO"""),
|
||||
|
|
@ -318,6 +318,7 @@ class OmemoSession(object):
|
|||
return promise2Deferred(new_device_p)
|
||||
|
||||
def getDevices(self, bare_jid=None):
|
||||
bare_jid = bare_jid.userhost()
|
||||
get_devices_p = self._session.getDevices(bare_jid=bare_jid)
|
||||
return promise2Deferred(get_devices_p)
|
||||
|
||||
|
|
@ -326,6 +327,11 @@ class OmemoSession(object):
|
|||
build_session_p = self._session.buildSession(bare_jid, device, bundle)
|
||||
return promise2Deferred(build_session_p)
|
||||
|
||||
def deleteSession(self, bare_jid, device):
|
||||
bare_jid = bare_jid.userhost()
|
||||
delete_session_p = self._session.deleteSession(bare_jid=bare_jid, device=device)
|
||||
return promise2Deferred(delete_session_p)
|
||||
|
||||
def encryptMessage(self, bare_jids, message, bundles=None, expect_problems=None):
|
||||
"""Encrypt a message
|
||||
|
||||
|
|
@ -376,7 +382,7 @@ class OmemoSession(object):
|
|||
return promise2Deferred(get_trust_p)
|
||||
|
||||
|
||||
class OMEMO(object):
|
||||
class OMEMO:
|
||||
|
||||
def __init__(self, host):
|
||||
log.info(_("OMEMO plugin initialization (omemo module v{version})").format(
|
||||
|
|
@ -402,6 +408,39 @@ class OMEMO(object):
|
|||
lambda itemsEvent, profile: defer.ensureDeferred(
|
||||
self.onNewDevices(itemsEvent, profile))
|
||||
)
|
||||
try:
|
||||
self.text_cmds = self.host.plugins[C.TEXT_CMDS]
|
||||
except KeyError:
|
||||
log.info(_("Text commands not available"))
|
||||
else:
|
||||
self.text_cmds.registerTextCommands(self)
|
||||
|
||||
# Text commands #
|
||||
|
||||
async def cmd_omemo_reset(self, client, mess_data):
|
||||
"""reset OMEMO session (use only if encryption is broken)
|
||||
|
||||
@command(one2one):
|
||||
"""
|
||||
if not client.encryption.isEncryptionRequested(mess_data, NS_OMEMO):
|
||||
feedback = _(
|
||||
"You need to have OMEMO encryption activated to reset the session")
|
||||
self.text_cmds.feedBack(client, feedback, mess_data)
|
||||
return False
|
||||
to_jid = mess_data["to"].userhostJID()
|
||||
session = client._xep_0384_session
|
||||
devices = await session.getDevices(to_jid)
|
||||
|
||||
for device in devices['active']:
|
||||
log.debug(f"deleting session for device {device}")
|
||||
await session.deleteSession(to_jid, device=device)
|
||||
|
||||
log.debug("Sending an empty message to trigger key exchange")
|
||||
await client.sendMessage(to_jid, {'': ''})
|
||||
|
||||
feedback = _("OMEMO session has been reset")
|
||||
self.text_cmds.feedBack(client, feedback, mess_data)
|
||||
return False
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def trustUICb(self, xmlui_data, trust_data, expect_problems=None,
|
||||
|
|
@ -651,7 +690,7 @@ class OMEMO(object):
|
|||
defer.returnValue(devices)
|
||||
|
||||
async def setDevices(self, client, devices):
|
||||
log.debug(f"setting devices with {', '.join(devices)}")
|
||||
log.debug(f"setting devices with {', '.join(str(d) for d in devices)}")
|
||||
list_elt = domish.Element((NS_OMEMO, 'list'))
|
||||
for device in devices:
|
||||
device_elt = list_elt.addElement('device')
|
||||
|
|
@ -794,6 +833,7 @@ class OMEMO(object):
|
|||
## PEP node events callbacks
|
||||
|
||||
async def onNewDevices(self, itemsEvent, profile):
|
||||
log.debug("devices list has been updated")
|
||||
client = self.host.getClient(profile)
|
||||
try:
|
||||
omemo_session = client._xep_0384_session
|
||||
|
|
|
|||
Loading…
Reference in a new issue