[openpgp] Adapt to Gajim 1.9.0 changes
This commit is contained in:
@@ -22,6 +22,8 @@ from pathlib import Path
|
|||||||
from nbxmpp.namespaces import Namespace
|
from nbxmpp.namespaces import Namespace
|
||||||
from nbxmpp import Node
|
from nbxmpp import Node
|
||||||
from nbxmpp import StanzaMalformed
|
from nbxmpp import StanzaMalformed
|
||||||
|
from nbxmpp.structs import EncryptionData
|
||||||
|
from nbxmpp.structs import MessageProperties
|
||||||
from nbxmpp.structs import StanzaHandler
|
from nbxmpp.structs import StanzaHandler
|
||||||
from nbxmpp.errors import StanzaError
|
from nbxmpp.errors import StanzaError
|
||||||
from nbxmpp.errors import MalformedStanzaError
|
from nbxmpp.errors import MalformedStanzaError
|
||||||
@@ -33,15 +35,14 @@ from nbxmpp.modules.openpgp import create_message_stanza
|
|||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
from gajim.common import configpaths
|
from gajim.common import configpaths
|
||||||
from gajim.common.events import MessageNotSent
|
from gajim.common.events import MessageNotSent
|
||||||
from gajim.common.const import EncryptionData
|
|
||||||
from gajim.common.modules.base import BaseModule
|
from gajim.common.modules.base import BaseModule
|
||||||
from gajim.common.modules.util import event_node
|
from gajim.common.modules.util import event_node
|
||||||
|
from gajim.common.structs import OutgoingMessage
|
||||||
|
|
||||||
from openpgp.modules.util import ENCRYPTION_NAME
|
from openpgp.modules.util import ENCRYPTION_NAME
|
||||||
from openpgp.modules.util import NOT_ENCRYPTED_TAGS
|
from openpgp.modules.util import NOT_ENCRYPTED_TAGS
|
||||||
from openpgp.modules.util import Key
|
from openpgp.modules.util import Key
|
||||||
from openpgp.modules.util import Trust
|
from openpgp.modules.util import Trust
|
||||||
from openpgp.modules.util import add_additional_data
|
|
||||||
from openpgp.modules.util import DecryptionFailed
|
from openpgp.modules.util import DecryptionFailed
|
||||||
from openpgp.modules.util import prepare_stanza
|
from openpgp.modules.util import prepare_stanza
|
||||||
from openpgp.modules.key_store import PGPContacts
|
from openpgp.modules.key_store import PGPContacts
|
||||||
@@ -208,10 +209,13 @@ class OpenPGP(BaseModule):
|
|||||||
for fingerprint in missing_pub_keys:
|
for fingerprint in missing_pub_keys:
|
||||||
self.request_public_key(from_jid, fingerprint)
|
self.request_public_key(from_jid, fingerprint)
|
||||||
|
|
||||||
def decrypt_message(self, _con, stanza, properties):
|
def decrypt_message(self, _con, stanza, properties: MessageProperties):
|
||||||
if not properties.is_openpgp:
|
if not properties.is_openpgp:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
remote_jid = properties.remote_jid
|
||||||
|
assert remote_jid is not None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
payload, fingerprint = self._pgp.decrypt(properties.openpgp)
|
payload, fingerprint = self._pgp.decrypt(properties.openpgp)
|
||||||
except DecryptionFailed as error:
|
except DecryptionFailed as error:
|
||||||
@@ -232,7 +236,7 @@ class OpenPGP(BaseModule):
|
|||||||
log.warning(signcrypt)
|
log.warning(signcrypt)
|
||||||
return
|
return
|
||||||
|
|
||||||
keys = self._contacts.get_keys(properties.jid.bare)
|
keys = self._contacts.get_keys(remote_jid)
|
||||||
fingerprints = [key.fingerprint for key in keys]
|
fingerprints = [key.fingerprint for key in keys]
|
||||||
if fingerprint not in fingerprints:
|
if fingerprint not in fingerprints:
|
||||||
log.warning('Invalid fingerprint on message: %s', fingerprint)
|
log.warning('Invalid fingerprint on message: %s', fingerprint)
|
||||||
@@ -242,45 +246,56 @@ class OpenPGP(BaseModule):
|
|||||||
log.info('Received OpenPGP message from: %s', properties.jid)
|
log.info('Received OpenPGP message from: %s', properties.jid)
|
||||||
prepare_stanza(stanza, payload)
|
prepare_stanza(stanza, payload)
|
||||||
|
|
||||||
trust = self._contacts.get_trust(properties.jid.bare, fingerprint)
|
trust = self._contacts.get_trust(remote_jid, fingerprint)
|
||||||
|
|
||||||
properties.encrypted = EncryptionData({'name': ENCRYPTION_NAME,
|
properties.encrypted = EncryptionData(
|
||||||
'fingerprint': fingerprint,
|
protocol=ENCRYPTION_NAME,
|
||||||
'trust': trust})
|
key=fingerprint,
|
||||||
|
trust=trust
|
||||||
|
)
|
||||||
|
|
||||||
def encrypt_message(self, obj, callback):
|
def encrypt_message(self, message: OutgoingMessage, callback):
|
||||||
keys = self._contacts.get_keys(obj.jid)
|
remote_jid = message.contact.jid
|
||||||
|
|
||||||
|
keys = self._contacts.get_keys(remote_jid)
|
||||||
if not keys:
|
if not keys:
|
||||||
log.error('Droping stanza to %s, because we have no key', obj.jid)
|
log.error('Droping stanza to %s, because we have no key', remote_jid)
|
||||||
return
|
return
|
||||||
|
|
||||||
keys += self._contacts.get_keys(self.own_jid)
|
keys += self._contacts.get_keys(self.own_jid)
|
||||||
keys += [Key(self._fingerprint, None)]
|
keys += [Key(self._fingerprint, None)]
|
||||||
|
|
||||||
payload = create_signcrypt_node(obj.stanza,
|
payload = create_signcrypt_node(message.get_stanza(),
|
||||||
[obj.jid],
|
[remote_jid],
|
||||||
NOT_ENCRYPTED_TAGS)
|
NOT_ENCRYPTED_TAGS)
|
||||||
|
|
||||||
encrypted_payload, error = self._pgp.encrypt(payload, keys)
|
encrypted_payload, error = self._pgp.encrypt(payload, keys)
|
||||||
if error:
|
if error:
|
||||||
log.error('Error: %s', error)
|
log.error('Error: %s', error)
|
||||||
|
text = message.get_text(with_fallback=False) or ''
|
||||||
app.ged.raise_event(
|
app.ged.raise_event(
|
||||||
MessageNotSent(client=self._client,
|
MessageNotSent(client=self._client,
|
||||||
jid=obj.jid,
|
jid=str(remote_jid),
|
||||||
message=obj.message,
|
message=text,
|
||||||
error=error,
|
error=error,
|
||||||
time=time.time()))
|
time=time.time()))
|
||||||
return
|
return
|
||||||
|
|
||||||
create_message_stanza(obj.stanza, encrypted_payload, bool(obj.message))
|
create_message_stanza(
|
||||||
add_additional_data(obj.additional_data,
|
message.get_stanza(),
|
||||||
self._fingerprint)
|
encrypted_payload,
|
||||||
|
bool(message.get_text())
|
||||||
|
)
|
||||||
|
|
||||||
obj.encrypted = ENCRYPTION_NAME
|
message.set_encryption(
|
||||||
obj.additional_data['encrypted'] = {
|
EncryptionData(
|
||||||
'name': ENCRYPTION_NAME,
|
protocol=ENCRYPTION_NAME,
|
||||||
'trust': Trust.VERIFIED}
|
key='Unknown',
|
||||||
callback(obj)
|
trust=Trust.VERIFIED
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
callback(message)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def print_msg_to_log(stanza):
|
def print_msg_to_log(stanza):
|
||||||
|
|||||||
@@ -62,11 +62,6 @@ def delete_nodes(stanza, name, namespace=None):
|
|||||||
stanza.delChild(node)
|
stanza.delChild(node)
|
||||||
|
|
||||||
|
|
||||||
def add_additional_data(data, fingerprint):
|
|
||||||
data['encrypted'] = {'name': ENCRYPTION_NAME,
|
|
||||||
'fingerprint': fingerprint}
|
|
||||||
|
|
||||||
|
|
||||||
class VerifyFailed(Exception):
|
class VerifyFailed(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user