Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 7 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,10 @@ repos:
additional_dependencies:
- tomli
exclude: '^docs/changes\.rst$|^\.?pylintrc$'

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: 'v0.15.21'
hooks:
- id: ruff
args: [--select=I, --fix, --exit-non-zero-on-fix, --show-fixes]
types: [python]
256 changes: 165 additions & 91 deletions asyncssh/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,110 +20,184 @@

"""An asynchronous SSH2 library for Python"""

from .version import __author__, __author_email__, __url__, __version__

# pylint: disable=wildcard-import

from .constants import *
# Import these explicitly to trigger register calls in them
from . import dsa, ecdsa, eddsa, kex_dh, kex_rsa, rsa, sk_ecdsa, sk_eddsa

# pylint: enable=wildcard-import

from .agent import SSHAgentClient, SSHAgentKeyPair, connect_agent

from .auth_keys import SSHAuthorizedKeys
from .auth_keys import import_authorized_keys, read_authorized_keys

from .channel import SSHClientChannel, SSHServerChannel
from .channel import SSHTCPChannel, SSHUNIXChannel, SSHTunTapChannel

from .auth_keys import SSHAuthorizedKeys, import_authorized_keys, read_authorized_keys
from .channel import (
SSHClientChannel,
SSHServerChannel,
SSHTCPChannel,
SSHTunTapChannel,
SSHUNIXChannel,
)
from .client import SSHClient

from .config import ConfigParseError
from .connection import (
SSHAcceptHandler,
SSHAcceptor,
SSHClientConnection,
SSHClientConnectionOptions,
SSHServerConnection,
SSHServerConnectionOptions,
connect,
connect_reverse,
create_connection,
create_server,
get_server_auth_methods,
get_server_host_key,
listen,
listen_reverse,
run_client,
run_server,
)

from .forward import SSHForwarder

from .connection import SSHAcceptor, SSHClientConnection, SSHServerConnection
from .connection import SSHClientConnectionOptions, SSHServerConnectionOptions
from .connection import SSHAcceptHandler
from .connection import create_connection, create_server, connect, listen
from .connection import connect_reverse, listen_reverse, get_server_host_key
from .connection import get_server_auth_methods, run_client, run_server

# pylint: disable=wildcard-import
from .constants import *
from .editor import SSHLineEditorChannel

from .known_hosts import SSHKnownHosts
from .known_hosts import import_known_hosts, read_known_hosts
from .known_hosts import match_known_hosts

from .forward import SSHForwarder
from .known_hosts import (
SSHKnownHosts,
import_known_hosts,
match_known_hosts,
read_known_hosts,
)
from .listener import SSHListener

from .logging import logger, set_log_level, set_sftp_log_level, set_debug_level

from .misc import BytesOrStr
from .misc import Error, DisconnectError, ChannelOpenError, ChannelListenError
from .misc import ConnectionLost, CompressionError, HostKeyNotVerifiable
from .misc import KeyExchangeFailed, IllegalUserName, MACError
from .misc import PermissionDenied, ProtocolError, ProtocolNotSupported
from .misc import ServiceNotAvailable, PasswordChangeRequired
from .misc import BreakReceived, SignalReceived, TerminalSizeChanged

from .logging import logger, set_debug_level, set_log_level, set_sftp_log_level
from .misc import (
BreakReceived,
BytesOrStr,
ChannelListenError,
ChannelOpenError,
CompressionError,
ConnectionLost,
DisconnectError,
Error,
HostKeyNotVerifiable,
IllegalUserName,
KeyExchangeFailed,
MACError,
PasswordChangeRequired,
PermissionDenied,
ProtocolError,
ProtocolNotSupported,
ServiceNotAvailable,
SignalReceived,
TerminalSizeChanged,
)
from .pbe import KeyEncryptionError

from .pkcs11 import load_pkcs11_keys

from .process import SSHServerProcessFactory
from .process import SSHClientProcess, SSHServerProcess
from .process import SSHCompletedProcess, ProcessError
from .process import TimeoutError # pylint: disable=redefined-builtin
from .process import DEVNULL, PIPE, STDOUT

from .public_key import SSHKey, SSHKeyPair, SSHCertificate
from .public_key import KeyGenerationError, KeyImportError, KeyExportError
from .public_key import generate_private_key, import_private_key
from .public_key import import_public_key, import_certificate
from .public_key import read_private_key, read_public_key, read_certificate
from .public_key import read_private_key_list, read_public_key_list
from .public_key import read_certificate_list
from .public_key import load_keypairs, load_public_keys, load_certificates
from .public_key import load_resident_keys

from .process import (
DEVNULL,
PIPE,
STDOUT,
ProcessError,
SSHClientProcess,
SSHCompletedProcess,
SSHServerProcess,
SSHServerProcessFactory,
TimeoutError, # pylint: disable=redefined-builtin
)
from .public_key import (
KeyExportError,
KeyGenerationError,
KeyImportError,
SSHCertificate,
SSHKey,
SSHKeyPair,
generate_private_key,
import_certificate,
import_private_key,
import_public_key,
load_certificates,
load_keypairs,
load_public_keys,
load_resident_keys,
read_certificate,
read_certificate_list,
read_private_key,
read_private_key_list,
read_public_key,
read_public_key_list,
)
from .rsa import set_default_skip_rsa_key_validation

from .scp import scp

from .session import DataType, SSHClientSession, SSHServerSession
from .session import SSHTCPSession, SSHUNIXSession, SSHTunTapSession

from .server import SSHServer

from .sftp import SFTPClient, SFTPClientFile, SFTPServer, SFTPError
from .sftp import SFTPEOFError, SFTPNoSuchFile, SFTPPermissionDenied
from .sftp import SFTPFailure, SFTPBadMessage, SFTPNoConnection
from .sftp import SFTPInvalidHandle, SFTPNoSuchPath, SFTPFileAlreadyExists
from .sftp import SFTPWriteProtect, SFTPNoMedia, SFTPNoSpaceOnFilesystem
from .sftp import SFTPQuotaExceeded, SFTPUnknownPrincipal, SFTPLockConflict
from .sftp import SFTPDirNotEmpty, SFTPNotADirectory, SFTPInvalidFilename
from .sftp import SFTPLinkLoop, SFTPCannotDelete, SFTPInvalidParameter
from .sftp import SFTPFileIsADirectory, SFTPByteRangeLockConflict
from .sftp import SFTPByteRangeLockRefused, SFTPDeletePending
from .sftp import SFTPFileCorrupt, SFTPOwnerInvalid, SFTPGroupInvalid
from .sftp import SFTPNoMatchingByteRangeLock
from .sftp import SFTPConnectionLost, SFTPOpUnsupported
from .sftp import SFTPAttrs, SFTPVFSAttrs, SFTPName, SFTPLimits
from .sftp import SEEK_SET, SEEK_CUR, SEEK_END

from .sshsig import SSHAllowedSigners
from .sshsig import import_allowed_signers, read_allowed_signers
from .sshsig import create_sshsig, validate_sshsig

from .stream import SSHSocketSessionFactory, SSHServerSessionFactory
from .stream import SFTPServerFactory, SSHReader, SSHWriter

from .subprocess import SSHSubprocessReadPipe, SSHSubprocessWritePipe
from .subprocess import SSHSubprocessProtocol, SSHSubprocessTransport

# Import these explicitly to trigger register calls in them
from . import sk_eddsa, sk_ecdsa, eddsa, ecdsa, rsa, dsa, kex_dh, kex_rsa
from .session import (
DataType,
SSHClientSession,
SSHServerSession,
SSHTCPSession,
SSHTunTapSession,
SSHUNIXSession,
)
from .sftp import (
SEEK_CUR,
SEEK_END,
SEEK_SET,
SFTPAttrs,
SFTPBadMessage,
SFTPByteRangeLockConflict,
SFTPByteRangeLockRefused,
SFTPCannotDelete,
SFTPClient,
SFTPClientFile,
SFTPConnectionLost,
SFTPDeletePending,
SFTPDirNotEmpty,
SFTPEOFError,
SFTPError,
SFTPFailure,
SFTPFileAlreadyExists,
SFTPFileCorrupt,
SFTPFileIsADirectory,
SFTPGroupInvalid,
SFTPInvalidFilename,
SFTPInvalidHandle,
SFTPInvalidParameter,
SFTPLimits,
SFTPLinkLoop,
SFTPLockConflict,
SFTPName,
SFTPNoConnection,
SFTPNoMatchingByteRangeLock,
SFTPNoMedia,
SFTPNoSpaceOnFilesystem,
SFTPNoSuchFile,
SFTPNoSuchPath,
SFTPNotADirectory,
SFTPOpUnsupported,
SFTPOwnerInvalid,
SFTPPermissionDenied,
SFTPQuotaExceeded,
SFTPServer,
SFTPUnknownPrincipal,
SFTPVFSAttrs,
SFTPWriteProtect,
)
from .sshsig import (
SSHAllowedSigners,
create_sshsig,
import_allowed_signers,
read_allowed_signers,
validate_sshsig,
)
from .stream import (
SFTPServerFactory,
SSHReader,
SSHServerSessionFactory,
SSHSocketSessionFactory,
SSHWriter,
)
from .subprocess import (
SSHSubprocessProtocol,
SSHSubprocessReadPipe,
SSHSubprocessTransport,
SSHSubprocessWritePipe,
)
from .version import __author__, __author_email__, __url__, __version__

__all__ = [
'__author__', '__author_email__', '__url__', '__version__',
Expand Down
15 changes: 10 additions & 5 deletions asyncssh/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,20 @@
import os
import sys
from types import TracebackType
from typing import TYPE_CHECKING, List, Optional, Protocol, Sequence, Tuple
from typing import Type, Union
from typing import TYPE_CHECKING, List, Optional, Protocol, Sequence, Tuple, Type, Union

from typing_extensions import Self

from .listener import SSHForwardListener
from .misc import async_context_manager, maybe_wait_closed
from .packet import Byte, String, UInt32, PacketDecodeError, SSHPacket
from .public_key import KeyPairListArg, SSHCertificate, SSHKeyPair
from .public_key import load_default_keypairs, load_keypairs
from .packet import Byte, PacketDecodeError, SSHPacket, String, UInt32
from .public_key import (
KeyPairListArg,
SSHCertificate,
SSHKeyPair,
load_default_keypairs,
load_keypairs,
)

if TYPE_CHECKING:
from tempfile import TemporaryDirectory
Expand Down
1 change: 0 additions & 1 deletion asyncssh/agent_unix.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import errno
from typing import TYPE_CHECKING, Tuple


if TYPE_CHECKING:
# pylint: disable=cyclic-import
from .agent import AgentReader, AgentWriter
Expand Down
1 change: 0 additions & 1 deletion asyncssh/agent_win32.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@

from .misc import open_file


if TYPE_CHECKING:
# pylint: disable=cyclic-import
from .agent import AgentReader, AgentWriter
Expand Down
4 changes: 1 addition & 3 deletions asyncssh/asn1.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@

"""

from typing import Dict, FrozenSet, Sequence, Set, Tuple, Type, TypeVar, Union
from typing import cast

from typing import Dict, FrozenSet, Sequence, Set, Tuple, Type, TypeVar, Union, cast

_DERClass = Type['DERType']
_DERClassVar = TypeVar('_DERClassVar', bound='_DERClass')
Expand Down
30 changes: 21 additions & 9 deletions asyncssh/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,37 @@

"""SSH authentication handlers"""

from typing import TYPE_CHECKING, Awaitable, Dict, List, Optional
from typing import Sequence, Tuple, Type, Union, cast
from typing import (
TYPE_CHECKING,
Awaitable,
Dict,
List,
Optional,
Sequence,
Tuple,
Type,
Union,
cast,
)

from .constants import DEFAULT_LANG
from .gss import GSSBase, GSSError
from .logging import SSHLogger
from .misc import ProtocolError, PasswordChangeRequired, get_symbol_names
from .misc import run_in_executor
from .packet import Boolean, String, UInt32, SSHPacket, SSHPacketHandler
from .misc import (
PasswordChangeRequired,
ProtocolError,
get_symbol_names,
run_in_executor,
)
from .packet import Boolean, SSHPacket, SSHPacketHandler, String, UInt32
from .public_key import SigningKey
from .saslprep import saslprep, SASLPrepError

from .saslprep import SASLPrepError, saslprep

if TYPE_CHECKING:
import asyncio

# pylint: disable=cyclic-import
from .connection import SSHConnection, SSHClientConnection
from .connection import SSHServerConnection
from .connection import SSHClientConnection, SSHConnection, SSHServerConnection


KbdIntPrompts = Sequence[Tuple[str, bool]]
Expand Down
Loading
Loading