ipguard-api 0.1.1__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/DEVELOPMENT.md +1 -1
  2. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/PKG-INFO +2 -2
  3. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/README.md +1 -1
  4. ipguard_api-0.1.2/docs/PROTOCOL.md +33 -0
  5. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/docs/USAGE.md +2 -2
  6. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/pyproject.toml +2 -1
  7. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/uv.lock +1 -1
  8. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/.gitignore +0 -0
  9. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/.python-version +0 -0
  10. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/LICENSE +0 -0
  11. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/build-constraints.txt +0 -0
  12. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/conftest.py +0 -0
  13. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/scripts/packaging_policy.py +0 -0
  14. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/scripts/release_metadata.py +0 -0
  15. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/__init__.py +0 -0
  16. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/client.py +0 -0
  17. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/errors.py +0 -0
  18. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/models.py +0 -0
  19. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/protocol.py +0 -0
  20. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/py.typed +0 -0
  21. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/transport.py +0 -0
  22. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/src/ipguard_api/validation.py +0 -0
  23. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/tests/test_cloud.py +0 -0
  24. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/tests/test_contract.py +0 -0
  25. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/tests/test_network_guard.py +0 -0
  26. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/tests/test_packaging.py +0 -0
  27. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/tests/test_protocol.py +0 -0
  28. {ipguard_api-0.1.1 → ipguard_api-0.1.2}/uv.toml +0 -0
@@ -53,4 +53,4 @@ Keep the Android handset profile independent of package releases. Human-readable
53
53
 
54
54
  Incoming-call callbacks expose only sanitized board information. The SDK is passive by default. An explicit `auto_hangup=True` enables one immediate hangup attempt with cause zero after notification. The SDK does not retain media offers, answer calls, or implement media transport. Disconnect and shutdown cancel owned work. The SDK never replays uncertain attempts.
55
55
 
56
- Store credentials in the consumer's private session storage. Keep raw packets, session contents, arbitrary provider errors, call tokens, and media data out of logs, tracebacks, and callback data. [README.md](README.md) and [API usage](docs/USAGE.md) document the plaintext enrollment stage and other protocol limits. Synthetic tests show local client behavior. They do not show current provider acceptance, account-wide routing guarantees, or physical door outcomes.
56
+ Store credentials in the consumer's private session storage. Keep raw packets, session contents, arbitrary provider errors, call tokens, and media data out of logs, tracebacks, and callback data. See [Protocol behavior and limits](docs/PROTOCOL.md) for transport security and verification limits. [API usage](docs/USAGE.md) covers client setup and examples.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipguard-api
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Typed asynchronous client for the IPGUARD cloud service
5
5
  Project-URL: Repository, https://github.com/KennyTangHK/ipguard-api
6
6
  Project-URL: Issues, https://github.com/KennyTangHK/ipguard-api/issues
@@ -42,7 +42,7 @@ See the [API guide](docs/USAGE.md) for account setup and examples.
42
42
 
43
43
  Incoming-call notifications are passive by default. Set `auto_hangup=True` to make one immediate hangup attempt after a notification. This is intended to trigger carrier-call fallback sooner. The provider and account configuration determine the actual routing and timing.
44
44
 
45
- Enrollment uses unencrypted TCP, including retrieval of the server public key. The authenticated connection then uses ZeroMQ CURVE. A door-release acknowledgement does not confirm that the physical door opened. See [transport and logging](docs/USAGE.md#transport-and-logging) for details. Tests use synthetic accounts and do not establish current provider acceptance or physical door outcomes.
45
+ Enrollment uses unencrypted TCP. A door-release acknowledgement does not confirm that the physical door opened. See [protocol behavior and limits](docs/PROTOCOL.md) for transport security, supported behavior and verification limits.
46
46
 
47
47
  ## Development
48
48
 
@@ -26,7 +26,7 @@ See the [API guide](docs/USAGE.md) for account setup and examples.
26
26
 
27
27
  Incoming-call notifications are passive by default. Set `auto_hangup=True` to make one immediate hangup attempt after a notification. This is intended to trigger carrier-call fallback sooner. The provider and account configuration determine the actual routing and timing.
28
28
 
29
- Enrollment uses unencrypted TCP, including retrieval of the server public key. The authenticated connection then uses ZeroMQ CURVE. A door-release acknowledgement does not confirm that the physical door opened. See [transport and logging](docs/USAGE.md#transport-and-logging) for details. Tests use synthetic accounts and do not establish current provider acceptance or physical door outcomes.
29
+ Enrollment uses unencrypted TCP. A door-release acknowledgement does not confirm that the physical door opened. See [protocol behavior and limits](docs/PROTOCOL.md) for transport security, supported behavior and verification limits.
30
30
 
31
31
  ## Development
32
32
 
@@ -0,0 +1,33 @@
1
+ # Protocol behavior and compatibility limits
2
+
3
+ This document describes the behavior and limits of `ipguard-api`. The library supports account enrollment, saved authorization, relay discovery, door-release commands and incoming-call notifications. For client setup and code examples, see [API usage](USAGE.md).
4
+
5
+ ## Enrollment and saved authorization
6
+
7
+ Verification requests and resends require an explicit method call. A reconnection with saved authorization does not request another code or replace an installation. The library refuses replacement by default. The application must obtain user consent before it enables replacement, which can disable the previous installation. Revoked authorization stops reconnection and requires enrollment again.
8
+
9
+ Serialized sessions contain the account identifier, installation UUID, verification code, server public key and any activation credential returned by the service. The application is responsible for private storage of this data. Treat serialized sessions and their backups as credentials. Do not include them in issue reports or debug captures. The SDK omits credentials, raw packets and arbitrary provider error text from diagnostics.
10
+
11
+ ## Transport security
12
+
13
+ The default enrollment endpoint is `tcp://zmq.campiserveur.com:5579`. This connection is not encrypted. The client gets the server public key during that exchange. ZeroMQ CURVE then protects the authenticated connection at `tcp://zmq.campiserveur.com:5577` with that key.
14
+
15
+ CURVE does not protect the earlier enrollment exchange. Enrollment does not use HTTPS, and the SDK has no encrypted enrollment fallback. Do not disable CURVE authentication to work around connection failures.
16
+
17
+ ## Door-release commands
18
+
19
+ A relay can receive a release command only if it has current remote-release permission and does not need badge confirmation. The SDK checks permission immediately before transmission. It rejects unavailable or busy operations. It does not put a release command in a queue for a later connection.
20
+
21
+ A successful result means that the board sent a matching acknowledgement. It does not show if the physical door moved, or if it is open or locked. If a command may have been sent but there is no matching acknowledgement, its outcome is unknown. The SDK does not automatically replay release commands. The application must report the uncertainty and leave any further attempt to the user.
22
+
23
+ ## Incoming calls
24
+
25
+ A fresh, validated incoming call on the active account connection causes a callback. Callbacks include sanitized board information when the caller can be identified. Unknown callers still cause a callback. The SDK suppresses duplicates for a limited time. It validates and discards media descriptions. It does not expose call tokens, caller routes or media credentials through callbacks. Calls missed during a disconnection are not recovered.
26
+
27
+ The SDK is passive by default. It does not acknowledge, answer or hang up an incoming call. An application can set `auto_hangup=True` to enable one immediate hangup attempt after notification. This is intended to start carrier-call fallback sooner. Routing and timing depend on the provider and account configuration. The SDK skips the attempt if the call or connection is no longer current or the write is busy. It cancels pending work on disconnect or close. It does not queue, retry or replay an uncertain write. See [Automatic hangup](USAGE.md#automatic-hangup) for client configuration.
28
+
29
+ Video calls, camera streaming, audio conversation, call answering, manual call controls, Firebase, Bluetooth and SIP calling are not supported. Incoming calls do not cause a door release.
30
+
31
+ ## Verification limits
32
+
33
+ Automated SDK tests use synthetic accounts and loopback plaintext/CURVE servers. These checks validate client behavior against fixtures. They do not establish current provider acceptance, credential lifetime, account aliases, simultaneous mobile installations, incoming-call delivery, carrier routing or a physical door release. Routing and delivery depend on the provider and account configuration. A live account or physical check requires explicit user direction.
@@ -81,7 +81,7 @@ Video calling and camera streaming are not supported. The SDK has no API to reta
81
81
 
82
82
  ### Automatic hangup
83
83
 
84
- `IpguardClient(auto_hangup=True)` enables one immediate hangup attempt after each fresh, validated incoming-call notification. This is intended to trigger carrier-call fallback sooner. The provider and account configuration determine the actual routing and timing. The standalone SDK defaults to `auto_hangup=False`. In that mode, it gives incoming-call notifications without sending a hangup. Home Assistant has an **Auto hangup** option for each account. It is enabled by default. Find it under **Settings → Devices & services → IPGUARD → Configure**.
84
+ `IpguardClient(auto_hangup=True)` enables one immediate hangup attempt after each fresh, validated incoming-call notification. This is intended to trigger carrier-call fallback sooner. The provider and account configuration determine the actual routing and timing. The SDK defaults to `auto_hangup=False`. In that mode, it gives incoming-call notifications without sending a hangup. Applications enable this option separately for each client.
85
85
 
86
86
  An attempt requires a current call, connection, and installation. The client skips busy, stale, disconnected, or superseded attempts. Call termination, disconnect, or shutdown cancels pending work. The client does not queue or replay attempts. It does not retry a send with an uncertain outcome. Duplicate suppression stays available across reconnects for the same installation. It does not persist after the client closes or the process restarts. The SDK has no manual hangup or call-answering API.
87
87
 
@@ -97,7 +97,7 @@ The SDK checks the current permission and rejects a concurrent release for the s
97
97
 
98
98
  ## Transport and logging
99
99
 
100
- The default activation endpoint is `tcp://zmq.campiserveur.com:5579`. The default secure messaging endpoint is `tcp://zmq.campiserveur.com:5577`. Activation uses unencrypted TCP, including for retrieval of the server public key. CURVE protects the subsequent authenticated connection. The client does not implement an encrypted enrollment fallback. Do not disable CURVE authentication to work around handshake failures.
100
+ For the default endpoints and enrollment security, see [Transport security](PROTOCOL.md#transport-security). Do not disable CURVE authentication to work around connection failures.
101
101
 
102
102
  The constructor accepts test endpoints, `timeout`, `reconnect_delay`, and `max_reconnect_delay`. Saved sessions retain their endpoints.
103
103
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ipguard-api"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "Typed asynchronous client for the IPGUARD cloud service"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.14.2,<3.15"
@@ -58,6 +58,7 @@ only-include = [
58
58
  "uv.lock",
59
59
  "build-constraints.txt",
60
60
  "DEVELOPMENT.md",
61
+ "docs/PROTOCOL.md",
61
62
  "docs/USAGE.md",
62
63
  "README.md",
63
64
  "LICENSE",
@@ -136,7 +136,7 @@ wheels = [
136
136
 
137
137
  [[package]]
138
138
  name = "ipguard-api"
139
- version = "0.1.1"
139
+ version = "0.1.2"
140
140
  source = { editable = "." }
141
141
  dependencies = [
142
142
  { name = "pyzmq" },
File without changes
File without changes
File without changes
File without changes
File without changes