diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cb50efe --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: Python package + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.8] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip tox + - name: Build and test + run: | + tox diff --git a/.pylintrc b/.pylintrc index 33809a1..1a26ad7 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,5 +1,5 @@ [MESSAGES CONTROL] -disable=invalid-name, missing-docstring, locally-disabled, unbalanced-tuple-unpacking,no-else-return,fixme,duplicate-code,cyclic-import,import-outside-toplevel +disable=invalid-name, missing-docstring, locally-disabled, unbalanced-tuple-unpacking,no-else-return,fixme,duplicate-code,cyclic-import,import-outside-toplevel,consider-using-with [SIMILARITIES] min-similarity-lines=5 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3f8b32d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -sudo: false -language: python -python: - - "3.6" - - "3.7" - - "3.8" - - "3.9" - -cache: - directories: - - $HOME/.cache/pip - -before_install: - - pip install -U pip wheel - - pip install -U setuptools - - pip install -U pylint coverage pycodestyle pydocstyle - -install: - - pip install -U -e . - -script: - - pycodestyle libagent - - pylint --reports=no --rcfile .pylintrc libagent - - pydocstyle libagent - - coverage run --source libagent/ -m py.test -v - -after_success: - - coverage report - diff --git a/README.md b/README.md index aea311f..8af2b7e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Hardware-based SSH/GPG agent -[![Build Status](https://travis-ci.org/romanz/trezor-agent.svg?branch=master)](https://travis-ci.org/romanz/trezor-agent) [![Chat](https://badges.gitter.im/romanz/trezor-agent.svg)](https://gitter.im/romanz/trezor-agent) This project allows you to use various hardware security devices to operate GPG and SSH. Instead of keeping your key on your computer and decrypting it with a passphrase when you want to use it, the key is generated and stored on the device and never reaches your computer. Read more about the design [here](doc/DESIGN.md). diff --git a/libagent/device/fake_device.py b/libagent/device/fake_device.py index 37710d1..8edeecd 100644 --- a/libagent/device/fake_device.py +++ b/libagent/device/fake_device.py @@ -5,8 +5,8 @@ import logging import ecdsa -from . import interface from .. import formats +from . import interface log = logging.getLogger(__name__) diff --git a/libagent/device/keepkey.py b/libagent/device/keepkey.py index 3a086e5..a8d265b 100644 --- a/libagent/device/keepkey.py +++ b/libagent/device/keepkey.py @@ -1,7 +1,7 @@ """KeepKey-related code (see https://www.keepkey.com/).""" -from . import trezor from .. import formats +from . import trezor def _verify_support(identity, ecdh): diff --git a/libagent/device/keepkey_defs.py b/libagent/device/keepkey_defs.py index d95c66a..8514961 100644 --- a/libagent/device/keepkey_defs.py +++ b/libagent/device/keepkey_defs.py @@ -2,8 +2,9 @@ # pylint: disable=unused-import,import-error -from keepkeylib.client import CallException, PinException +from keepkeylib.client import CallException from keepkeylib.client import KeepKeyClient as Client +from keepkeylib.client import PinException from keepkeylib.messages_pb2 import PassphraseAck, PinMatrixAck from keepkeylib.transport_hid import HidTransport from keepkeylib.transport_webusb import WebUsbTransport diff --git a/libagent/device/ledger.py b/libagent/device/ledger.py index 2edfe79..039feac 100644 --- a/libagent/device/ledger.py +++ b/libagent/device/ledger.py @@ -6,8 +6,8 @@ import struct from ledgerblue import comm # pylint: disable=import-error -from . import interface from .. import formats +from . import interface log = logging.getLogger(__name__) diff --git a/libagent/device/onlykey.py b/libagent/device/onlykey.py index addfb62..5594963 100644 --- a/libagent/device/onlykey.py +++ b/libagent/device/onlykey.py @@ -2,10 +2,11 @@ # pylint: disable=attribute-defined-outside-init """OnlyKey-related code (see https://www.onlykey.io/).""" -import logging -import hashlib import codecs +import hashlib +import logging import time + import ecdsa import nacl.signing import unidecode diff --git a/libagent/device/onlykey_defs.py b/libagent/device/onlykey_defs.py index 04d6df4..c716a0f 100644 --- a/libagent/device/onlykey_defs.py +++ b/libagent/device/onlykey_defs.py @@ -2,4 +2,4 @@ # pylint: disable=unused-import,import-error,no-name-in-module -from onlykey import OnlyKey, Message +from onlykey import Message, OnlyKey diff --git a/libagent/device/trezor.py b/libagent/device/trezor.py index 81104f3..8fdbd11 100644 --- a/libagent/device/trezor.py +++ b/libagent/device/trezor.py @@ -5,8 +5,8 @@ import logging import semver -from . import interface from .. import formats +from . import interface log = logging.getLogger(__name__) @@ -71,6 +71,7 @@ class Trezor(interface.Device): log.exception('ping failed: %s', e) connection.close() # so the next HID open() will succeed raise + return None def close(self): """Close connection.""" diff --git a/libagent/device/trezor_defs.py b/libagent/device/trezor_defs.py index 916c869..8080bf4 100644 --- a/libagent/device/trezor_defs.py +++ b/libagent/device/trezor_defs.py @@ -1,20 +1,20 @@ """TREZOR-related definitions.""" +import logging # pylint: disable=unused-import,import-error,no-name-in-module,no-member import os -import logging import mnemonic import semver + import trezorlib - -from trezorlib.client import TrezorClient as Client, PASSPHRASE_TEST_PATH -from trezorlib.exceptions import TrezorFailure, PinException -from trezorlib.transport import get_transport -from trezorlib.messages import IdentityType - from trezorlib.btc import get_address, get_public_node -from trezorlib.misc import sign_identity, get_ecdh_session_key +from trezorlib.client import PASSPHRASE_TEST_PATH +from trezorlib.client import TrezorClient as Client +from trezorlib.exceptions import PinException, TrezorFailure +from trezorlib.messages import IdentityType +from trezorlib.misc import get_ecdh_session_key, sign_identity +from trezorlib.transport import get_transport log = logging.getLogger(__name__) @@ -28,3 +28,4 @@ def find_device(): return get_transport(os.environ.get("TREZOR_PATH")) except Exception as e: # pylint: disable=broad-except log.debug("Failed to find a Trezor device: %s", e) + return None diff --git a/libagent/device/ui.py b/libagent/device/ui.py index 4d91437..0048626 100644 --- a/libagent/device/ui.py +++ b/libagent/device/ui.py @@ -5,12 +5,13 @@ import os import subprocess import sys +from .. import util + try: from trezorlib.client import PASSPHRASE_ON_DEVICE except ImportError: PASSPHRASE_ON_DEVICE = object() -from .. import util log = logging.getLogger(__name__) diff --git a/libagent/gpg/__init__.py b/libagent/gpg/__init__.py index 3711bc8..edb7cda 100644 --- a/libagent/gpg/__init__.py +++ b/libagent/gpg/__init__.py @@ -21,9 +21,8 @@ import time import pkg_resources import semver - -from . import agent, client, encode, keyring, protocol from .. import device, formats, server, util +from . import agent, client, encode, keyring, protocol log = logging.getLogger(__name__) diff --git a/libagent/gpg/agent.py b/libagent/gpg/agent.py index d7b3837..a4cb99c 100644 --- a/libagent/gpg/agent.py +++ b/libagent/gpg/agent.py @@ -2,8 +2,8 @@ import binascii import logging -from . import client, decode, keyring, protocol from .. import util +from . import client, decode, keyring, protocol log = logging.getLogger(__name__) diff --git a/libagent/gpg/decode.py b/libagent/gpg/decode.py index 470369e..8694dff 100644 --- a/libagent/gpg/decode.py +++ b/libagent/gpg/decode.py @@ -9,8 +9,8 @@ import struct import ecdsa import nacl.signing -from . import protocol from .. import util +from . import protocol log = logging.getLogger(__name__) diff --git a/libagent/gpg/encode.py b/libagent/gpg/encode.py index a334fd4..0eac71f 100644 --- a/libagent/gpg/encode.py +++ b/libagent/gpg/encode.py @@ -2,8 +2,8 @@ import io import logging -from . import decode, keyring, protocol from .. import util +from . import decode, keyring, protocol log = logging.getLogger(__name__) diff --git a/libagent/gpg/protocol.py b/libagent/gpg/protocol.py index c0bb7eb..f722b51 100644 --- a/libagent/gpg/protocol.py +++ b/libagent/gpg/protocol.py @@ -4,6 +4,7 @@ import base64 import hashlib import logging import struct + import nacl.signing from .. import formats, util diff --git a/libagent/gpg/tests/test_decode.py b/libagent/gpg/tests/test_decode.py index c5a0604..5398e42 100644 --- a/libagent/gpg/tests/test_decode.py +++ b/libagent/gpg/tests/test_decode.py @@ -4,8 +4,8 @@ import os import pytest -from .. import decode, protocol from ... import util +from .. import decode, protocol def test_subpackets(): diff --git a/libagent/gpg/tests/test_protocol.py b/libagent/gpg/tests/test_protocol.py index cc9be43..233be13 100644 --- a/libagent/gpg/tests/test_protocol.py +++ b/libagent/gpg/tests/test_protocol.py @@ -2,8 +2,8 @@ import ecdsa import nacl.signing import pytest -from .. import protocol from ... import formats +from .. import protocol def test_packet(): diff --git a/libagent/signify/__init__.py b/libagent/signify/__init__.py index faf4d3a..f7ad7ab 100644 --- a/libagent/signify/__init__.py +++ b/libagent/signify/__init__.py @@ -16,7 +16,6 @@ import time import pkg_resources import semver - from .. import formats, server, util from ..device import interface, ui diff --git a/libagent/ssh/__init__.py b/libagent/ssh/__init__.py index 10cc029..614404d 100644 --- a/libagent/ssh/__init__.py +++ b/libagent/ssh/__init__.py @@ -11,9 +11,9 @@ import sys import tempfile import threading -import pkg_resources import configargparse import daemon +import pkg_resources from .. import device, formats, server, util from . import client, protocol diff --git a/tox.ini b/tox.ini index acbe911..3d6cc1a 100644 --- a/tox.ini +++ b/tox.ini @@ -16,7 +16,7 @@ deps= isort<5 commands= pycodestyle libagent - # isort --skip-glob .tox -c -r libagent + isort --skip-glob .tox -c -rc libagent pylint --reports=no --rcfile .pylintrc libagent pydocstyle libagent coverage run --source libagent -m py.test -v libagent