[openpgp] Improve type annotations
This commit is contained in:
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Any
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from collections.abc import Sequence
|
from collections.abc import Sequence
|
||||||
@@ -29,8 +28,7 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
|
|
||||||
class BaseKeyringItem:
|
class BaseKeyringItem:
|
||||||
def __init__(self, key: Any) -> None:
|
def __init__(self) -> None:
|
||||||
self._key = key
|
|
||||||
self._uid = self._get_uid()
|
self._uid = self._get_uid()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ from typing import Any
|
|||||||
from typing import cast
|
from typing import cast
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
from collections.abc import Iterator
|
||||||
from collections.abc import Sequence
|
from collections.abc import Sequence
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
@@ -37,6 +38,9 @@ log = logging.getLogger("gajim.p.openpgp.gpgme")
|
|||||||
|
|
||||||
|
|
||||||
class KeyringItem(BaseKeyringItem):
|
class KeyringItem(BaseKeyringItem):
|
||||||
|
def __init__(self, key: Key) -> None:
|
||||||
|
self._key = key
|
||||||
|
BaseKeyringItem.__init__(self)
|
||||||
|
|
||||||
def _get_uid(self) -> str | None:
|
def _get_uid(self) -> str | None:
|
||||||
for uid in self._key.uids:
|
for uid in self._key.uids:
|
||||||
@@ -98,7 +102,7 @@ class GPGMe(BasePGPBackend):
|
|||||||
def get_keys(self) -> Sequence[KeyringItem]:
|
def get_keys(self) -> Sequence[KeyringItem]:
|
||||||
keys: list[KeyringItem] = []
|
keys: list[KeyringItem] = []
|
||||||
with self._get_context() as context:
|
with self._get_context() as context:
|
||||||
for key in context.keylist(secret=False):
|
for key in cast(Iterator[Key], context.keylist(secret=False)):
|
||||||
keyring_item = KeyringItem(key)
|
keyring_item = KeyringItem(key)
|
||||||
if not keyring_item.is_xmpp_key:
|
if not keyring_item.is_xmpp_key:
|
||||||
log.warning("Key not suited for xmpp: %s", key.fpr)
|
log.warning("Key not suited for xmpp: %s", key.fpr)
|
||||||
@@ -133,7 +137,7 @@ class GPGMe(BasePGPBackend):
|
|||||||
recipients: list[Any] = []
|
recipients: list[Any] = []
|
||||||
with self._get_context() as context:
|
with self._get_context() as context:
|
||||||
for key in keys:
|
for key in keys:
|
||||||
key = context.get_key(key.fingerprint)
|
key = cast(Key | None, context.get_key(key.fingerprint))
|
||||||
if key is not None:
|
if key is not None:
|
||||||
recipients.append(key)
|
recipients.append(key)
|
||||||
|
|
||||||
@@ -155,16 +159,18 @@ class GPGMe(BasePGPBackend):
|
|||||||
except Exception as error:
|
except Exception as error:
|
||||||
raise DecryptionFailed("Decryption failed: %s" % error)
|
raise DecryptionFailed("Decryption failed: %s" % error)
|
||||||
|
|
||||||
plaintext, result, verify_result = result
|
plaintext, result, verify_result = result
|
||||||
plaintext = plaintext.decode()
|
plaintext = plaintext.decode()
|
||||||
|
|
||||||
fingerprints = [sig.fpr for sig in verify_result.signatures]
|
fingerprints = [sig.fpr for sig in verify_result.signatures]
|
||||||
if not fingerprints or len(fingerprints) > 1:
|
if not fingerprints or len(fingerprints) > 1:
|
||||||
log.error(result)
|
log.error(result)
|
||||||
log.error(verify_result)
|
log.error(verify_result)
|
||||||
raise DecryptionFailed("Verification failed")
|
raise DecryptionFailed("Verification failed")
|
||||||
|
|
||||||
return plaintext, fingerprints[0]
|
return plaintext, fingerprints[0]
|
||||||
|
|
||||||
|
raise RuntimeError
|
||||||
|
|
||||||
def import_key(self, data: bytes, jid: JID) -> KeyringItem | None:
|
def import_key(self, data: bytes, jid: JID) -> KeyringItem | None:
|
||||||
log.info("Import key from %s", jid)
|
log.info("Import key from %s", jid)
|
||||||
|
|||||||
@@ -1,19 +1,3 @@
|
|||||||
# Copyright (C) 2025 Philipp Hörist <philipp AT hoerist.com>
|
|
||||||
#
|
|
||||||
# This file is part of the OpenPGP Gajim Plugin.
|
|
||||||
#
|
|
||||||
# OpenPGP Gajim Plugin is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published
|
|
||||||
# by the Free Software Foundation; version 3 only.
|
|
||||||
#
|
|
||||||
# OpenPGP Gajim Plugin is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with OpenPGP Gajim Plugin. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with OpenPGP Gajim Plugin. If not, see <http://www.gnu.org/licenses/>.
|
# along with OpenPGP Gajim Plugin. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from collections.abc import Sequence
|
from collections.abc import Sequence
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -35,6 +37,9 @@ if log.getEffectiveLevel() == logging.DEBUG:
|
|||||||
|
|
||||||
|
|
||||||
class KeyringItem(BaseKeyringItem):
|
class KeyringItem(BaseKeyringItem):
|
||||||
|
def __init__(self, key: dict[Any, Any]) -> None:
|
||||||
|
self._key = key
|
||||||
|
BaseKeyringItem.__init__(self)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def keyid(self) -> str:
|
def keyid(self) -> str:
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ class Storage:
|
|||||||
) -> None:
|
) -> None:
|
||||||
sql = """REPLACE INTO
|
sql = """REPLACE INTO
|
||||||
contacts(jid, fingerprint, active, trust, timestamp)
|
contacts(jid, fingerprint, active, trust, timestamp)
|
||||||
VALUES(?, ?, ?, ?, ?, ?)"""
|
VALUES(?, ?, ?, ?, ?)"""
|
||||||
for values in db_values:
|
for values in db_values:
|
||||||
log.info("Store key: %s", values)
|
log.info("Store key: %s", values)
|
||||||
self._con.execute(sql, values)
|
self._con.execute(sql, values)
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class KeyWizard(Gtk.Assistant):
|
|||||||
self.connect("cancel", self._on_cancel)
|
self.connect("cancel", self._on_cancel)
|
||||||
self.connect("close", self._on_cancel)
|
self.connect("close", self._on_cancel)
|
||||||
|
|
||||||
self._remove_sidebar()
|
# self._remove_sidebar()
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def _add_page(self, page: Gtk.Box) -> None:
|
def _add_page(self, page: Gtk.Box) -> None:
|
||||||
|
|||||||
@@ -2,8 +2,11 @@ from typing import Any
|
|||||||
|
|
||||||
from collections.abc import Iterator
|
from collections.abc import Iterator
|
||||||
|
|
||||||
|
from gpg.results import DecryptResult
|
||||||
from gpg.results import EncryptResult
|
from gpg.results import EncryptResult
|
||||||
|
from gpg.results import Key
|
||||||
from gpg.results import SignResult
|
from gpg.results import SignResult
|
||||||
|
from gpg.results import VerifyResult
|
||||||
|
|
||||||
class GpgmeWrapper(object): ...
|
class GpgmeWrapper(object): ...
|
||||||
|
|
||||||
@@ -24,7 +27,7 @@ class Context(GpgmeWrapper):
|
|||||||
def encrypt(
|
def encrypt(
|
||||||
self,
|
self,
|
||||||
plaintext: bytes,
|
plaintext: bytes,
|
||||||
recipients: list[str] = [],
|
recipients: list[Any] = [],
|
||||||
sign: bool = ...,
|
sign: bool = ...,
|
||||||
sink: Any | None = ...,
|
sink: Any | None = ...,
|
||||||
passphrase: str | None = ...,
|
passphrase: str | None = ...,
|
||||||
@@ -41,7 +44,7 @@ class Context(GpgmeWrapper):
|
|||||||
passphrase: str | None = ...,
|
passphrase: str | None = ...,
|
||||||
verify: bool = ...,
|
verify: bool = ...,
|
||||||
filter_signatures: bool = ...,
|
filter_signatures: bool = ...,
|
||||||
) -> tuple[bytes, str, str]: ...
|
) -> tuple[bytes, DecryptResult, VerifyResult]: ...
|
||||||
def key_import(self, data: bytes) -> str: ...
|
def key_import(self, data: bytes) -> str: ...
|
||||||
def key_export_minimal(self, pattern: Any | None = ...) -> bytes | None: ...
|
def key_export_minimal(self, pattern: Any | None = ...) -> bytes | None: ...
|
||||||
def keylist(
|
def keylist(
|
||||||
|
|||||||
@@ -6,10 +6,19 @@ class InvalidKey(Result): ...
|
|||||||
class EncryptResult(Result):
|
class EncryptResult(Result):
|
||||||
invalid_recipients: list[Any]
|
invalid_recipients: list[Any]
|
||||||
|
|
||||||
class Recipient(Result): ...
|
class Recipient(Result):
|
||||||
|
keyid: str
|
||||||
|
pubkey_algo: int
|
||||||
|
status: int
|
||||||
|
|
||||||
class DecryptResult(Result):
|
class DecryptResult(Result):
|
||||||
recipients: Recipient
|
file_name: str | None
|
||||||
|
is_de_vs: bool
|
||||||
|
is_mime: int
|
||||||
|
legacy_cipher_nomdc: int
|
||||||
|
recipients: list[Recipient]
|
||||||
|
symkey_algo: str
|
||||||
|
wrong_key_usage: bool
|
||||||
|
|
||||||
class NewSignature(Result): ...
|
class NewSignature(Result): ...
|
||||||
|
|
||||||
@@ -21,10 +30,25 @@ class Notation(Result): ...
|
|||||||
|
|
||||||
class Signature(Result):
|
class Signature(Result):
|
||||||
_type = dict(wrong_key_usage=bool, chain_model=bool, is_de_vs=bool)
|
_type = dict(wrong_key_usage=bool, chain_model=bool, is_de_vs=bool)
|
||||||
notations: Notation
|
notations: list[Notation]
|
||||||
|
chain_model: bool
|
||||||
|
exp_timestamp: int
|
||||||
|
fpr: str
|
||||||
|
hash_algo: int
|
||||||
|
is_de_vs: bool
|
||||||
|
pka_trust: int
|
||||||
|
pubkey_algo: int
|
||||||
|
status: int
|
||||||
|
summary: int
|
||||||
|
timestamp: int
|
||||||
|
validity: int
|
||||||
|
validity_reason: int
|
||||||
|
wrong_key_usage: bool
|
||||||
|
|
||||||
class VerifyResult(Result):
|
class VerifyResult(Result):
|
||||||
signatures: Signature
|
file_name: str | None
|
||||||
|
is_mime: int
|
||||||
|
signatures: list[Signature]
|
||||||
|
|
||||||
class ImportStatus(Result): ...
|
class ImportStatus(Result): ...
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user