diff --git a/amqtt/broker.py b/amqtt/broker.py index b89d45a..50596a2 100644 --- a/amqtt/broker.py +++ b/amqtt/broker.py @@ -124,7 +124,7 @@ class Broker: """MQTT 3.1.1 compliant broker implementation. Args: - config: dictionary of configuration options (see [broker configuration](broker_config.md)). + config: `BrokerConfig` or dictionary of equivalent structure options (see [broker configuration](broker_config.md)). loop: asyncio loop. defaults to `asyncio.new_event_loop()`. plugin_namespace: plugin namespace to use when loading plugin entry_points. defaults to `amqtt.broker.plugins`. diff --git a/amqtt/client.py b/amqtt/client.py index 26b565d..92f0c97 100644 --- a/amqtt/client.py +++ b/amqtt/client.py @@ -75,18 +75,15 @@ def mqtt_connected(func: _F) -> _F: class MQTTClient: - """MQTT client implementation. - - MQTTClient instances provides API for connecting to a broker and send/receive - messages using the MQTT protocol. + """MQTT client implementation, providing an API for connecting to a broker and send/receive messages using the MQTT protocol. Args: client_id: MQTT client ID to use when connecting to the broker. If none, it will be generated randomly by `amqtt.utils.gen_client_id` - config: dictionary of configuration options (see [client configuration](client_config.md)). + config: `ClientConfig` or dictionary of equivalent structure options (see [client configuration](client_config.md)). Raises: - PluginImportError: if importing a plugin from configuration + PluginImportError: if importing a plugin from configuration fails PluginInitError: if initialization plugin fails """ diff --git a/amqtt/contexts.py b/amqtt/contexts.py index 1b37153..afd5dc1 100644 --- a/amqtt/contexts.py +++ b/amqtt/contexts.py @@ -154,9 +154,9 @@ class BrokerConfig(Dictable): listeners: dict[Literal["default"] | str, ListenerConfig] = field(default_factory=default_listeners) # noqa: PYI051 """Network of listeners used by the services. a 'default' named listener is required; if another listener does not set a value, the 'default' settings are applied. See - [ListenerConfig](#amqtt.contexts.ListenerConfig) for more information.""" + [`ListenerConfig`](broker_config.md#amqtt.contexts.ListenerConfig) for more information.""" sys_interval: int | None = None - """*Deprecated field to configure the `BrokerSysPlugin`. See [`BrokerSysPlugin`](#sys-topics) + """*Deprecated field to configure the `BrokerSysPlugin`. See [`BrokerSysPlugin`](../plugins/packaged_plugins.md#sys-topics) for recommended configuration.*""" timeout_disconnect_delay: int | None = 0 """Client disconnect timeout without a keep-alive.""" @@ -164,17 +164,17 @@ class BrokerConfig(Dictable): """Seconds for an inactive session to be retained.""" auth: dict[str, Any] | None = None """*Deprecated field used to config EntryPoint-loaded plugins. See - [`AnonymousAuthPlugin`](#anonymous-auth-plugin) and - [`FileAuthPlugin`](#password-file-auth-plugin) for recommended configuration.*""" + [`AnonymousAuthPlugin`](../plugins/packaged_plugins.md#anonymous-auth-plugin) and + [`FileAuthPlugin`](../plugins/packaged_plugins.md#password-file-auth-plugin) for recommended configuration.*""" topic_check: dict[str, Any] | None = None """*Deprecated field used to config EntryPoint-loaded plugins. See - [`TopicTabooPlugin`](#taboo-topic-plugin) and - [`TopicACLPlugin`](#acl-topic-plugin) for recommended configuration method.*""" + [`TopicTabooPlugin`](../plugins/packaged_plugins.md#taboo-topic-plugin) and + [`TopicACLPlugin`](../plugins/packaged_plugins.md#acl-topic-plugin) for recommended configuration method.*""" plugins: dict[str, Any] | list[str | dict[str,Any]] | None = field(default_factory=default_broker_plugins) """The dictionary has a key of the dotted-module path of a class derived from `BasePlugin`, `BaseAuthPlugin` or `BaseTopicPlugin`; the value is a dictionary of configuration options for that plugin. See - [Plugins](http://localhost:8000/custom_plugins/) for more information. `list[str | dict[str,Any]]` is not - recommended but available to support legacy use cases.""" + [custom plugins](../plugins/custom_plugins.md) for more information. `list[str | dict[str,Any]]` is deprecated but available + to support legacy use cases.""" def __post_init__(self) -> None: """Check config for errors and transform fields for easier use.""" @@ -327,16 +327,16 @@ class ClientConfig(Dictable): """Specify the topics and what flags should be set for messages published to them.""" broker: ConnectionConfig | None = field(default_factory=ConnectionConfig) """Configuration for connecting to the broker. See - [ConnectionConfig](#amqtt.contexts.ConnectionConfig) for more information.""" + [`ConnectionConfig`](client_config.md#amqtt.contexts.ConnectionConfig) for more information.""" plugins: dict[str, Any] | list[dict[str, Any]] | None = field(default_factory=default_client_plugins) """The dictionary has a key of the dotted-module path of a class derived from `BasePlugin`; the value is - a dictionary of configuration options for that plugin. See [Plugins](http://localhost:8000/custom_plugins/) - for more information.""" + a dictionary of configuration options for that plugin. See [custom plugins](../plugins/custom_plugins.md) for + more information. `list[str | dict[str,Any]]` is deprecated but available to support legacy use cases.""" check_hostname: bool | None = True """If establishing a secure connection, should the hostname of the certificate be verified.""" will: WillConfig | None = None """Message, topic and flags that should be sent to if the client disconnects. See - [WillConfig](#amqtt.contexts.WillConfig)""" + [`WillConfig`](client_config.md#amqtt.contexts.WillConfig) for more information.""" def __post__init__(self) -> None: """Check config for errors and transform fields for easier use.""" diff --git a/amqtt/plugins/authentication.py b/amqtt/plugins/authentication.py index f3934d9..d01627a 100644 --- a/amqtt/plugins/authentication.py +++ b/amqtt/plugins/authentication.py @@ -37,9 +37,10 @@ class AnonymousAuthPlugin(BaseAuthPlugin): @dataclass class Config: - """Allow empty username.""" + """Configuration for AnonymousAuthPlugin.""" allow_anonymous: bool = field(default=True) + """Allow all anonymous authentication (even with _no_ username).""" class FileAuthPlugin(BaseAuthPlugin): @@ -107,6 +108,7 @@ class FileAuthPlugin(BaseAuthPlugin): @dataclass class Config: - """Path to the properly encoded password file.""" + """Configuration for FileAuthPlugin.""" password_file: str | Path | None = None + """Path to file with `username:password` pairs, one per line. All passwords are encoded using sha-512.""" diff --git a/docs/plugins/http.md b/docs/plugins/http.md index 382691c..6dc26d2 100644 --- a/docs/plugins/http.md +++ b/docs/plugins/http.md @@ -17,9 +17,9 @@ that respond with information about client authenticated and topic-level authori ??? info "recipe for authentication" Provide the client id and username when webpage is initially rendered or passed to the mqtt initialization from stored - cookies. If application is secure, the user's password will be hashed should be encrypted and cannot be used to - authenticate a client. Instead, the application should create an encrypted password (eg jwt) which the server - can then verify when the broker contacts the application. + cookies. If application is secure, the user's password will already be stored as a hashed value and, therefore, cannot + be used in this context to authenticate a client. Instead, the application should create its own encrypted key (eg jwt) + which the server can then verify when the broker contacts the application. ??? example "mqtt in javascript" Example initialization of mqtt in javascript: @@ -35,7 +35,7 @@ that respond with information about client authenticated and topic-level authori try { const clientMqtt = await mqtt.connect(url, options); -See the 'Request and Response Modes' section below for details on `params_mode` and `response_mode`. +See the [Request and Response Modes](#request-response-modes) section below for details on `params_mode` and `response_mode`. ::: amqtt.contrib.http.HttpAuthPlugin.Config options: @@ -45,7 +45,8 @@ See the 'Request and Response Modes' section below for details on `params_mode` class_style: "simple" [//]: # (manually creating the heading so it doesn't show in the sidebar ToC) -