Skip to content

Lint with ruff #163

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 32 commits into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5fbc4d7
add ruff
jschlyter May 29, 2024
d379654
automatic fixes by ruff
jschlyter May 29, 2024
2a5a219
lint
jschlyter May 29, 2024
9e68867
lint with ruff
jschlyter May 29, 2024
dc40590
lint
jschlyter May 29, 2024
bbc4b62
lint
jschlyter May 29, 2024
cb70424
lint B904,SIM108
jschlyter May 30, 2024
05708c9
lint UP008
jschlyter May 30, 2024
e8343d3
fix bare except
jschlyter May 31, 2024
2260e10
silence SIM118
jschlyter May 31, 2024
044af3c
simplify loop
jschlyter May 31, 2024
d21e2a9
simplify
jschlyter May 31, 2024
d96d7ae
simplify return any/all
jschlyter May 31, 2024
0c286ec
simplify returns
jschlyter May 31, 2024
958eb5b
fix return, is not
jschlyter May 31, 2024
b61b7f1
do not import builtins
jschlyter Jun 7, 2024
8f9b2f7
explicit stacklevel for warn
jschlyter Jun 7, 2024
1465d4d
fix unused var
jschlyter Jun 7, 2024
8f9b414
merge isinstance param
jschlyter Jun 7, 2024
e638447
fix format
jschlyter Jun 7, 2024
64ddf92
use yield from
jschlyter Jun 7, 2024
9907b2a
add imported symbols to __all__ (should be cleaned up)
jschlyter Jun 7, 2024
788c8cb
Use format specifiers instead of percent format
jschlyter Jun 7, 2024
54965f2
move ruff
jschlyter Jun 7, 2024
c41d1dc
no ruff
jschlyter Jun 7, 2024
d5e96f7
add depends
jschlyter Jun 9, 2024
1967c63
use actions/setup-python@v5
jschlyter Jun 9, 2024
ec78fc4
use v4
jschlyter Jun 9, 2024
afadec8
revert
jschlyter Jun 9, 2024
3be27c7
use v4
jschlyter Jun 9, 2024
f94b929
add pre-commit
jschlyter Jun 17, 2024
16ffca5
Merge branch 'main' into ruff
jschlyter Jun 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@ jobs:
do_not_skip: '["pull_request"]'
cancel_others: 'true'
concurrent_skipping: same_content
test:
ruff:
runs-on: ubuntu-latest
needs: pre_job
steps:
- uses: actions/checkout@v4
- uses: chartboost/ruff-action@v1
test:
needs: ruff
if: ${{ needs.pre_job.outputs.should_skip != 'true' }}
runs-on: ubuntu-latest
strategy:
Expand All @@ -43,6 +49,6 @@ jobs:
run: |
poetry run pytest -vvv -ra --cov=cryptojwt --cov-report=xml --isort --black
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
15 changes: 15 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: check-merge-conflict
- id: debug-statements
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-json
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.9
hooks:
- id: ruff
- id: ruff-format
2 changes: 2 additions & 0 deletions doc/conf.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/env python3
#
# ruff: noqa
# -*- coding: utf-8 -*-
#
# CryptoJWT documentation build configuration file, created by
Expand Down
22 changes: 21 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ python = "^3.9"
cryptography = ">=3.4.6"
requests = "^2.25.1"

[tool.poetry.dev-dependencies]
[tool.poetry.group.dev.dependencies]
alabaster = "^0.7.12"
black = "^24.4.2"
isort = "^5.13.2"
Expand All @@ -54,7 +54,27 @@ responses = "^0.13.0"
sphinx = "^3.5.2"
sphinx-autobuild = "^2021.3.14"
coverage = "^7"
ruff = "^0.4.6"
pytest-ruff = "^0.3.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.ruff.lint]
select = [
# pycodestyle
"E",
# Pyflakes
"F",
# pyupgrade
"UP",
# flake8-bugbear
"B",
# flake8-simplify
"SIM",
# isort
"I",
]
ignore = ["E501", "I001", "SIM102"]
exclude = ["examples/*"]
22 changes: 15 additions & 7 deletions src/cryptojwt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,23 @@
from .utils import b64encode_item
from .utils import split_token

try:
from builtins import hex
from builtins import str
from builtins import zip
except ImportError:
pass

__version__ = version("cryptojwt")

__all__ = [
"JWE",
"JWE",
"JWK",
"JWS",
"JWT",
"KeyBundle",
"KeyJar",
"BadSyntax",
"as_unicode",
"b64d",
"b64encode_item",
"split_token",
]

logger = logging.getLogger(__name__)

JWT_TYPES = ("JWT", "application/jws", "JWS", "JWE")
Expand Down
2 changes: 1 addition & 1 deletion src/cryptojwt/exception.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
self.msg = msg

def __str__(self):
return "%s: %r" % (self.msg, self.value)
return f"{self.msg}: {self.value!r}"

Check warning on line 23 in src/cryptojwt/exception.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/exception.py#L23

Added line #L23 was not covered by tests


class BadSignature(Invalid):
Expand Down
2 changes: 1 addition & 1 deletion src/cryptojwt/jwe/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
}


class Encrypter(object):
class Encrypter:
"""Abstract base class for encryption algorithms."""

def __init__(self, with_digest=False):
Expand Down
2 changes: 1 addition & 1 deletion src/cryptojwt/jwe/aes.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def __init__(self, key_len=32, key=None, msg_padding="PKCS7"):
self.padder = PKCS7(128).padder()
self.unpadder = PKCS7(128).unpadder()
else:
raise Unsupported("Message padding: {}".format(msg_padding))
raise Unsupported(f"Message padding: {msg_padding}")

self.iv = None

Expand Down
16 changes: 5 additions & 11 deletions src/cryptojwt/jwe/jwe.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import contextlib
import logging

from ..jwk.asym import AsymmetricKey
from ..jwk.ec import ECKey
from ..jwk.hmac import SYMKey
from ..jwk.jwk import key_from_jwk_dict
from ..jwk.rsa import RSAKey
from ..jwx import JWx
from .exception import DecryptionFailed
from .exception import NoSuitableDecryptionKey
from .exception import NoSuitableECDHKey
from .exception import NoSuitableEncryptionKey
from .exception import NotSupportedAlgorithm
from .exception import WrongEncryptionAlgorithm
Expand Down Expand Up @@ -133,7 +132,7 @@ def encrypt(self, keys=None, cek="", iv="", **kwargs):
except TypeError as err:
raise err
else:
logger.debug("Encrypted message using key with kid={}".format(key.kid))
logger.debug(f"Encrypted message using key with kid={key.kid}")
return token

# logger.error("Could not find any suitable encryption key")
Expand All @@ -159,10 +158,8 @@ def decrypt(self, token=None, keys=None, alg=None, cek=None):
else:
keys = self.pick_keys(self._get_keys(), use="enc", alg=_alg)

try:
with contextlib.suppress(KeyError):
keys.append(key_from_jwk_dict(_jwe.headers["jwk"]))
except KeyError:
pass

if not keys and not cek:
raise NoSuitableDecryptionKey(_alg)
Expand Down Expand Up @@ -194,18 +191,15 @@ def decrypt(self, token=None, keys=None, alg=None, cek=None):
return msg

for key in keys:
if isinstance(key, AsymmetricKey):
_key = key.private_key()
else:
_key = key.key
_key = key.private_key() if isinstance(key, AsymmetricKey) else key.key

try:
msg = decrypter.decrypt(_jwe, _key)
self["cek"] = decrypter.cek if "cek" in decrypter else None
except (KeyError, DecryptionFailed):
pass
else:
logger.debug("Decrypted message using key with kid=%s" % key.kid)
logger.debug(f"Decrypted message using key with kid={key.kid}")
return msg

raise DecryptionFailed("No available key that could decrypt the message")
Expand Down
26 changes: 11 additions & 15 deletions src/cryptojwt/jwe/jwe_ec.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import contextlib
import struct

from cryptography.hazmat.primitives.asymmetric import ec
Expand Down Expand Up @@ -110,8 +111,8 @@
if self.alg == "ECDH-ES":
try:
dk_len = KEY_LEN[self.enc]
except KeyError:
raise ValueError("Unknown key length for algorithm %s" % self.enc)
except KeyError as exc:
raise ValueError(f"Unknown key length for algorithm {self.enc}") from exc

cek = ecdh_derive_key(_epk, key.pub_key, apu, apv, str(self.enc).encode(), dk_len)
elif self.alg in ["ECDH-ES+A128KW", "ECDH-ES+A192KW", "ECDH-ES+A256KW"]:
Expand All @@ -121,7 +122,7 @@
cek = self._generate_key(self.enc, cek=cek)
encrypted_key = aes_key_wrap(kek, cek)
else:
raise Exception("Unsupported algorithm %s" % self.alg)
raise Exception(f"Unsupported algorithm {self.alg}")

Check warning on line 125 in src/cryptojwt/jwe/jwe_ec.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/jwe_ec.py#L125

Added line #L125 was not covered by tests

return cek, encrypted_key, iv, params, epk

Expand Down Expand Up @@ -152,8 +153,8 @@
if self.headers["alg"] == "ECDH-ES":
try:
dk_len = KEY_LEN[self.headers["enc"]]
except KeyError:
raise Exception("Unknown key length for algorithm")
except KeyError as exc:
raise Exception("Unknown key length for algorithm") from exc

Check warning on line 157 in src/cryptojwt/jwe/jwe_ec.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/jwe_ec.py#L156-L157

Added lines #L156 - L157 were not covered by tests

self.cek = ecdh_derive_key(
key,
Expand All @@ -173,7 +174,7 @@
kek = ecdh_derive_key(key, epubkey.pub_key, apu, apv, str(_post).encode(), klen)
self.cek = aes_key_unwrap(kek, token.encrypted_key())
else:
raise Exception("Unsupported algorithm %s" % self.headers["alg"])
raise Exception("Unsupported algorithm {}".format(self.headers["alg"]))

Check warning on line 177 in src/cryptojwt/jwe/jwe_ec.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/jwe_ec.py#L177

Added line #L177 was not covered by tests

return self.cek

Expand All @@ -190,10 +191,8 @@
_msg = as_bytes(self.msg)

_args = self._dict
try:
with contextlib.suppress(KeyError):
_args["kid"] = kwargs["kid"]
except KeyError:
pass

if "params" in kwargs:
if "apu" in kwargs["params"]:
Expand All @@ -204,23 +203,20 @@
_args["epk"] = kwargs["params"]["epk"]

jwe = JWEnc(**_args)
ctxt, tag, cek = super(JWE_EC, self).enc_setup(
ctxt, tag, cek = super().enc_setup(
self["enc"], _msg, auth_data=jwe.b64_encode_header(), key=cek, iv=iv
)
if "encrypted_key" in kwargs:
return jwe.pack(parts=[kwargs["encrypted_key"], iv, ctxt, tag])
return jwe.pack(parts=[iv, ctxt, tag])

def decrypt(self, token=None, **kwargs):
if isinstance(token, JWEnc):
jwe = token
else:
jwe = JWEnc().unpack(token)
jwe = token if isinstance(token, JWEnc) else JWEnc().unpack(token)

if not self.cek:
raise Exception("Content Encryption Key is Not Yet Set")

msg = super(JWE_EC, self)._decrypt(
msg = super()._decrypt(
self.headers["enc"],
self.cek,
self.ctxt,
Expand Down
10 changes: 3 additions & 7 deletions src/cryptojwt/jwe/jwe_hmac.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import contextlib
import logging
import zlib

Expand Down Expand Up @@ -34,10 +35,8 @@ def encrypt(self, key, iv="", cek="", **kwargs):
_msg = as_bytes(self.msg)

_args = self._dict
try:
with contextlib.suppress(KeyError):
_args["kid"] = kwargs["kid"]
except KeyError:
pass

jwe = JWEnc(**_args)

Expand Down Expand Up @@ -68,10 +67,7 @@ def decrypt(self, token, key=None, cek=None):
if not key and not cek:
raise MissingKey("On of key or cek must be specified")

if isinstance(token, JWEnc):
jwe = token
else:
jwe = JWEnc().unpack(token)
jwe = token if isinstance(token, JWEnc) else JWEnc().unpack(token)

if len(jwe) != 5:
raise WrongNumberOfParts(len(jwe))
Expand Down
9 changes: 3 additions & 6 deletions src/cryptojwt/jwe/jwe_rsa.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
if self["zip"] == "DEF":
_msg = zlib.compress(_msg)
else:
raise ParameterError("Zip has unknown value: %s" % self["zip"])
raise ParameterError("Zip has unknown value: {}".format(self["zip"]))

Check warning on line 52 in src/cryptojwt/jwe/jwe_rsa.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/jwe_rsa.py#L52

Added line #L52 was not covered by tests

kwarg_cek = cek or None

Expand All @@ -58,7 +58,7 @@
cek = self._generate_key(_enc, cek)
self["cek"] = cek

logger.debug("cek: %s, iv: %s" % ([c for c in cek], [c for c in iv]))
logger.debug(f"cek: {[c for c in cek]}, iv: {[c for c in iv]}")

_encrypt = RSAEncrypter(self.with_digest).encrypt

Expand Down Expand Up @@ -92,10 +92,7 @@
:param cek: Ephemeral cipher key
:return: The decrypted message
"""
if not isinstance(token, JWEnc):
jwe = JWEnc().unpack(token)
else:
jwe = token
jwe = JWEnc().unpack(token) if not isinstance(token, JWEnc) else token

self.jwt = jwe.encrypted_key()
jek = jwe.encrypted_key()
Expand Down
6 changes: 3 additions & 3 deletions src/cryptojwt/jwe/jwekey.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
except KeyError:
try:
_key = get_random_bytes(KEY_LEN_BYTES[encalg])
except KeyError:
raise ValueError("Unsupported encryption algorithm %s" % encalg)
except KeyError as exc:
raise ValueError(f"Unsupported encryption algorithm {encalg}") from exc

return _key

Expand Down Expand Up @@ -77,7 +77,7 @@
elif enc in ["A128CBC-HS256", "A192CBC-HS384", "A256CBC-HS512"]:
aes = AES_CBCEncrypter(key=key)
else:
raise Exception("Unsupported encryption algorithm %s" % enc)
raise Exception(f"Unsupported encryption algorithm {enc}")

Check warning on line 80 in src/cryptojwt/jwe/jwekey.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/jwekey.py#L80

Added line #L80 was not covered by tests

try:
return aes.decrypt(ctxt, iv=iv, auth_data=auth_data, tag=tag)
Expand Down
2 changes: 1 addition & 1 deletion src/cryptojwt/jwe/jwenc.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
if "alg" in self.headers and "enc" in self.headers:
for typ in ["alg", "enc"]:
if self.headers[typ] not in SUPPORTED[typ]:
logger.debug("Not supported %s algorithm: %s" % (typ, self.headers[typ]))
logger.debug(f"Not supported {typ} algorithm: {self.headers[typ]}")

Check warning on line 51 in src/cryptojwt/jwe/jwenc.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/jwenc.py#L51

Added line #L51 was not covered by tests
return False
else:
return False
Expand Down
6 changes: 2 additions & 4 deletions src/cryptojwt/jwe/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from cryptography.hazmat.primitives.hashes import SHA384
from cryptography.hazmat.primitives.hashes import SHA512

from ..utils import b64e

LENMET = {32: (16, SHA256), 48: (24, SHA384), 64: (32, SHA512)}


Expand All @@ -20,8 +18,8 @@
# Select the digest to use based on key length
try:
seclen, hash_method = LENMET[len(key)]
except KeyError:
raise Exception("Invalid CBC+HMAC key length: %s bytes" % len(key))
except KeyError as exc:
raise Exception(f"Invalid CBC+HMAC key length: {len(key)} bytes") from exc

Check warning on line 22 in src/cryptojwt/jwe/utils.py

View check run for this annotation

Codecov / codecov/patch

src/cryptojwt/jwe/utils.py#L21-L22

Added lines #L21 - L22 were not covered by tests

# Split the key
ka = key[:seclen]
Expand Down
Loading