intflow-authctl 0.2.0__tar.gz → 0.2.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 (27) hide show
  1. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/.gitignore +8 -8
  2. intflow_authctl-0.2.2/PKG-INFO +136 -0
  3. intflow_authctl-0.2.2/README.md +115 -0
  4. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/pyproject.toml +86 -86
  5. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/__init__.py +3 -3
  6. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/api_client.py +146 -141
  7. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/audit.py +39 -39
  8. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/cli.py +57 -57
  9. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/clients.py +180 -173
  10. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/command_utils.py +36 -36
  11. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/commands.py +308 -234
  12. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/config.py +270 -204
  13. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/constants.py +7 -7
  14. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/credentials.py +57 -57
  15. intflow_authctl-0.2.2/src/intflow_authctl/discovery.py +54 -0
  16. intflow_authctl-0.2.2/src/intflow_authctl/errors.py +14 -0
  17. intflow_authctl-0.2.2/src/intflow_authctl/external_access.py +47 -0
  18. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/output.py +185 -166
  19. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/parser.py +800 -695
  20. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/py.typed +1 -1
  21. intflow_authctl-0.2.2/src/intflow_authctl/secret_output.py +84 -0
  22. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/tokens.py +107 -63
  23. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/users.py +119 -119
  24. {intflow_authctl-0.2.0 → intflow_authctl-0.2.2}/src/intflow_authctl/validation.py +217 -218
  25. intflow_authctl-0.2.0/PKG-INFO +0 -62
  26. intflow_authctl-0.2.0/README.md +0 -41
  27. intflow_authctl-0.2.0/src/intflow_authctl/errors.py +0 -5
@@ -1,8 +1,8 @@
1
- /dist/
2
- /.coverage*
3
- /coverage*.json
4
- /.pytest_cache/
5
- /.mypy_cache/
6
- /.ruff_cache/
7
- /**/__pycache__/
8
- *.egg-info/
1
+ /dist/
2
+ /.coverage*
3
+ /coverage*.json
4
+ /.pytest_cache/
5
+ /.mypy_cache/
6
+ /.ruff_cache/
7
+ /**/__pycache__/
8
+ *.egg-info/
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.4
2
+ Name: intflow-authctl
3
+ Version: 0.2.2
4
+ Summary: Intflow Auth operator CLI.
5
+ Author: Intflow
6
+ License: Proprietary
7
+ Requires-Python: >=3.12
8
+ Requires-Dist: httpx<1,>=0.28
9
+ Requires-Dist: keyring<26,>=25
10
+ Provides-Extra: dev
11
+ Requires-Dist: build<2,>=1.2; extra == 'dev'
12
+ Requires-Dist: hatchling==1.31.0; extra == 'dev'
13
+ Requires-Dist: mypy<3,>=1.13; extra == 'dev'
14
+ Requires-Dist: packaging<27,>=24; extra == 'dev'
15
+ Requires-Dist: pytest-cov<8,>=6; extra == 'dev'
16
+ Requires-Dist: pytest-timeout<3,>=2.4; extra == 'dev'
17
+ Requires-Dist: pytest<10,>=8; extra == 'dev'
18
+ Requires-Dist: ruff<1,>=0.9; extra == 'dev'
19
+ Requires-Dist: twine<7,>=6; extra == 'dev'
20
+ Description-Content-Type: text/markdown
21
+
22
+ # intflow-authctl
23
+
24
+ `intflow-authctl` is the Python operator CLI package for Intflow Auth.
25
+
26
+ ## Install
27
+
28
+ ```powershell
29
+ py -3.12 -m pip install --user --upgrade intflow-authctl
30
+ ```
31
+
32
+ ## CLI
33
+
34
+ ```powershell
35
+ intflow-authctl login
36
+ intflow-authctl whoami
37
+ intflow-authctl users list
38
+ intflow-authctl tokens create-no-expiry
39
+ intflow-authctl clients list
40
+ intflow-authctl clients rotate-secret <oauth-client-id> --grace-seconds 0
41
+ intflow-authctl logout --revoke
42
+ ```
43
+
44
+ The CLI is intended for authorized Intflow operators. It manages local operator
45
+ credentials through the supported credential backends and communicates with an
46
+ Intflow Auth deployment over the Admin API.
47
+
48
+ After CLI login, an `admin`-role user can run `tokens create-no-expiry` to
49
+ verify the current CLI identity and open the browser-only issuance page on the
50
+ same Auth service. Use `--no-browser` to print the URL only. The CLI bearer token
51
+ is never added to the URL or passed to the browser.
52
+
53
+ Failed commands return a nonzero exit code and write a bounded diagnostic to
54
+ stderr. Admin HTTP failures include only the status, a validated service error
55
+ code when present, and bounded `Retry-After` guidance. Upstream descriptions,
56
+ malformed bodies, credentials, and raw transport causes are not rendered.
57
+ Automation should parse JSON stdout only after a successful command.
58
+
59
+ ## Package Scope
60
+
61
+ This distribution contains only the operator CLI, Admin API client, output and
62
+ validation logic, and credential-store adapters. It does not contain the Auth
63
+ service, database models, migrations, or service bootstrap commands.
64
+
65
+ ## Requirements
66
+
67
+ - Python 3.12 or later.
68
+ - Access to an authorized Intflow Auth deployment.
69
+
70
+
71
+ ## Discover commands and diagnose access
72
+
73
+ No repository checkout is needed to explore the installed CLI:
74
+
75
+ ```text
76
+ intflow-authctl --help
77
+ intflow-authctl docs
78
+ intflow-authctl login
79
+ intflow-authctl doctor
80
+ intflow-authctl clients create --help
81
+ intflow-authctl users find --help
82
+ ```
83
+
84
+ Every command has `--help`, including nested commands. `docs` works offline and
85
+ prints onboarding guidance plus links to the API documentation and OpenAPI.
86
+ `docs --open` opens the documentation only when requested; use `--base-url` for
87
+ a different Auth deployment. `doctor` makes one read-only `whoami` request and
88
+ shows the current identity, effective scopes and token metadata without printing
89
+ the bearer token. Missing/expired credentials return exit code 2 with login guidance.
90
+
91
+ A company account does not automatically grant Auth management access. A 403
92
+ explains the required token scope where known, but server roles and target
93
+ restrictions still apply. When using `login --scope`, repeat it for **all** needed
94
+ scopes; it replaces the default scope selection. `logout --revoke` requires
95
+ `admin:tokens:write`; if remote revocation fails, local credentials remain.
96
+
97
+ ## Save a client secret without printing it
98
+
99
+ ```text
100
+ intflow-authctl clients create --name "Internal app" --client-type confidential --redirect-uri https://app.example/callback --scope openid --scope email --scope profile --secret-file /private/new-client.json
101
+ intflow-authctl clients rotate-secret CLIENT_ID --grace-seconds 60 --secret-file /private/new-rotation.json
102
+ ```
103
+
104
+ Choose a new file in a private existing directory outside the repository. The
105
+ file contains the complete response JSON, including `client_secret`; stdout
106
+ contains metadata and `client_secret_file` instead. The CLI refuses to overwrite
107
+ an existing file and protects the empty file **before** contacting the server
108
+ (POSIX 0600; Windows current-user DACL with inherited access removed).
109
+ If storage fails after the server changes the client, inspect the client and
110
+ rotate to a working destination; do not repeat creation. Without `--secret-file`,
111
+ the existing one-time secret JSON output remains unchanged. Transfer the file
112
+ through your approved secret delivery mechanism and remove it when no longer needed.
113
+
114
+ Public clients cannot hold secrets. Use confidential clients for trusted backends,
115
+ register exact callback URLs, and use PKCE S256. Add `offline_access` only when
116
+ refresh tokens are needed. App administrator assignment is a separate operation.
117
+
118
+ ## Recovery and local diagnostics
119
+
120
+ `intflow-authctl --version` identifies the installed version and distribution.
121
+ `doctor` remains read-only; `doctor --check-store` explicitly tests local storage
122
+ with a temporary nonsecret write/read/delete probe and needs no login or server.
123
+ Login runs the same preflight before requesting browser approval.
124
+
125
+ Login polling honors server intervals and bounded HTTP 429 Retry-After guidance.
126
+ It does not retry transport failures or 5xx responses, because one-time redemption
127
+ may already have succeeded. Re-login never revokes server tokens. It removes only
128
+ a previous local entry owned by the same config; legacy/shared entries are retained
129
+ with a warning to preserve other profiles. Local logout can clear a config whose
130
+ keyring entry is already missing. Use `logout --revoke` for explicit remote revocation.
131
+
132
+ `tokens create --name automation --ttl 1h --secret-file /private/new-token.json`
133
+ stores the full one-time response in a new protected file and returns `token_file`
134
+ instead of the bearer. Without that option, existing one-time JSON stdout is unchanged.
135
+ If issuance succeeds but storage fails, inspect and explicitly revoke the unused
136
+ token before repeating issuance. File output uses the same protections as client secrets.
@@ -0,0 +1,115 @@
1
+ # intflow-authctl
2
+
3
+ `intflow-authctl` is the Python operator CLI package for Intflow Auth.
4
+
5
+ ## Install
6
+
7
+ ```powershell
8
+ py -3.12 -m pip install --user --upgrade intflow-authctl
9
+ ```
10
+
11
+ ## CLI
12
+
13
+ ```powershell
14
+ intflow-authctl login
15
+ intflow-authctl whoami
16
+ intflow-authctl users list
17
+ intflow-authctl tokens create-no-expiry
18
+ intflow-authctl clients list
19
+ intflow-authctl clients rotate-secret <oauth-client-id> --grace-seconds 0
20
+ intflow-authctl logout --revoke
21
+ ```
22
+
23
+ The CLI is intended for authorized Intflow operators. It manages local operator
24
+ credentials through the supported credential backends and communicates with an
25
+ Intflow Auth deployment over the Admin API.
26
+
27
+ After CLI login, an `admin`-role user can run `tokens create-no-expiry` to
28
+ verify the current CLI identity and open the browser-only issuance page on the
29
+ same Auth service. Use `--no-browser` to print the URL only. The CLI bearer token
30
+ is never added to the URL or passed to the browser.
31
+
32
+ Failed commands return a nonzero exit code and write a bounded diagnostic to
33
+ stderr. Admin HTTP failures include only the status, a validated service error
34
+ code when present, and bounded `Retry-After` guidance. Upstream descriptions,
35
+ malformed bodies, credentials, and raw transport causes are not rendered.
36
+ Automation should parse JSON stdout only after a successful command.
37
+
38
+ ## Package Scope
39
+
40
+ This distribution contains only the operator CLI, Admin API client, output and
41
+ validation logic, and credential-store adapters. It does not contain the Auth
42
+ service, database models, migrations, or service bootstrap commands.
43
+
44
+ ## Requirements
45
+
46
+ - Python 3.12 or later.
47
+ - Access to an authorized Intflow Auth deployment.
48
+
49
+
50
+ ## Discover commands and diagnose access
51
+
52
+ No repository checkout is needed to explore the installed CLI:
53
+
54
+ ```text
55
+ intflow-authctl --help
56
+ intflow-authctl docs
57
+ intflow-authctl login
58
+ intflow-authctl doctor
59
+ intflow-authctl clients create --help
60
+ intflow-authctl users find --help
61
+ ```
62
+
63
+ Every command has `--help`, including nested commands. `docs` works offline and
64
+ prints onboarding guidance plus links to the API documentation and OpenAPI.
65
+ `docs --open` opens the documentation only when requested; use `--base-url` for
66
+ a different Auth deployment. `doctor` makes one read-only `whoami` request and
67
+ shows the current identity, effective scopes and token metadata without printing
68
+ the bearer token. Missing/expired credentials return exit code 2 with login guidance.
69
+
70
+ A company account does not automatically grant Auth management access. A 403
71
+ explains the required token scope where known, but server roles and target
72
+ restrictions still apply. When using `login --scope`, repeat it for **all** needed
73
+ scopes; it replaces the default scope selection. `logout --revoke` requires
74
+ `admin:tokens:write`; if remote revocation fails, local credentials remain.
75
+
76
+ ## Save a client secret without printing it
77
+
78
+ ```text
79
+ intflow-authctl clients create --name "Internal app" --client-type confidential --redirect-uri https://app.example/callback --scope openid --scope email --scope profile --secret-file /private/new-client.json
80
+ intflow-authctl clients rotate-secret CLIENT_ID --grace-seconds 60 --secret-file /private/new-rotation.json
81
+ ```
82
+
83
+ Choose a new file in a private existing directory outside the repository. The
84
+ file contains the complete response JSON, including `client_secret`; stdout
85
+ contains metadata and `client_secret_file` instead. The CLI refuses to overwrite
86
+ an existing file and protects the empty file **before** contacting the server
87
+ (POSIX 0600; Windows current-user DACL with inherited access removed).
88
+ If storage fails after the server changes the client, inspect the client and
89
+ rotate to a working destination; do not repeat creation. Without `--secret-file`,
90
+ the existing one-time secret JSON output remains unchanged. Transfer the file
91
+ through your approved secret delivery mechanism and remove it when no longer needed.
92
+
93
+ Public clients cannot hold secrets. Use confidential clients for trusted backends,
94
+ register exact callback URLs, and use PKCE S256. Add `offline_access` only when
95
+ refresh tokens are needed. App administrator assignment is a separate operation.
96
+
97
+ ## Recovery and local diagnostics
98
+
99
+ `intflow-authctl --version` identifies the installed version and distribution.
100
+ `doctor` remains read-only; `doctor --check-store` explicitly tests local storage
101
+ with a temporary nonsecret write/read/delete probe and needs no login or server.
102
+ Login runs the same preflight before requesting browser approval.
103
+
104
+ Login polling honors server intervals and bounded HTTP 429 Retry-After guidance.
105
+ It does not retry transport failures or 5xx responses, because one-time redemption
106
+ may already have succeeded. Re-login never revokes server tokens. It removes only
107
+ a previous local entry owned by the same config; legacy/shared entries are retained
108
+ with a warning to preserve other profiles. Local logout can clear a config whose
109
+ keyring entry is already missing. Use `logout --revoke` for explicit remote revocation.
110
+
111
+ `tokens create --name automation --ttl 1h --secret-file /private/new-token.json`
112
+ stores the full one-time response in a new protected file and returns `token_file`
113
+ instead of the bearer. Without that option, existing one-time JSON stdout is unchanged.
114
+ If issuance succeeds but storage fails, inspect and explicitly revoke the unused
115
+ token before repeating issuance. File output uses the same protections as client secrets.
@@ -1,86 +1,86 @@
1
- [build-system]
2
- requires = ["hatchling>=1.27"]
3
- build-backend = "hatchling.build"
4
-
5
- [project]
6
- name = "intflow-authctl"
7
- version = "0.2.0"
8
- description = "Intflow Auth operator CLI."
9
- readme = "README.md"
10
- requires-python = ">=3.12"
11
- license = { text = "Proprietary" }
12
- authors = [
13
- { name = "Intflow" }
14
- ]
15
- dependencies = [
16
- "httpx>=0.28,<1",
17
- "keyring>=25,<26"
18
- ]
19
-
20
- [project.scripts]
21
- intflow-authctl = "intflow_authctl.cli:authctl_main"
22
-
23
- [project.optional-dependencies]
24
- dev = [
25
- "build>=1.2,<2",
26
- "hatchling>=1.27,<2",
27
- "mypy>=1.13,<3",
28
- "packaging>=24,<27",
29
- "pytest>=8,<10",
30
- "pytest-cov>=6,<8",
31
- "pytest-timeout>=2.4,<3",
32
- "ruff>=0.9,<1",
33
- "twine>=6,<7"
34
- ]
35
-
36
- [tool.hatch.build.targets.wheel]
37
- packages = ["src/intflow_authctl"]
38
-
39
- [tool.hatch.build.targets.sdist]
40
- ignore-vcs = true
41
- include = [
42
- "/README.md",
43
- "/pyproject.toml",
44
- "/src/intflow_authctl"
45
- ]
46
- exclude = [
47
- "/.gitignore"
48
- ]
49
-
50
- [tool.pytest.ini_options]
51
- testpaths = ["tests"]
52
- pythonpath = ["src"]
53
- timeout = 30
54
- filterwarnings = [
55
- "error"
56
- ]
57
-
58
- [tool.coverage.run]
59
- source = ["intflow_authctl"]
60
- branch = true
61
-
62
- [tool.coverage.report]
63
- fail_under = 0
64
- show_missing = true
65
- skip_covered = true
66
-
67
- [tool.mypy]
68
- python_version = "3.12"
69
- show_error_codes = true
70
- warn_unused_configs = true
71
- files = ["src/intflow_authctl"]
72
-
73
- [tool.ruff]
74
- line-length = 100
75
- target-version = "py312"
76
- src = ["src", "tests"]
77
-
78
- [tool.ruff.lint]
79
- select = [
80
- "E",
81
- "F",
82
- "I",
83
- "UP",
84
- "B",
85
- "SIM"
86
- ]
1
+ [build-system]
2
+ requires = ["hatchling==1.31.0"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "intflow-authctl"
7
+ version = "0.2.2"
8
+ description = "Intflow Auth operator CLI."
9
+ readme = "README.md"
10
+ requires-python = ">=3.12"
11
+ license = { text = "Proprietary" }
12
+ authors = [
13
+ { name = "Intflow" }
14
+ ]
15
+ dependencies = [
16
+ "httpx>=0.28,<1",
17
+ "keyring>=25,<26"
18
+ ]
19
+
20
+ [project.scripts]
21
+ intflow-authctl = "intflow_authctl.cli:authctl_main"
22
+
23
+ [project.optional-dependencies]
24
+ dev = [
25
+ "build>=1.2,<2",
26
+ "hatchling==1.31.0",
27
+ "mypy>=1.13,<3",
28
+ "packaging>=24,<27",
29
+ "pytest>=8,<10",
30
+ "pytest-cov>=6,<8",
31
+ "pytest-timeout>=2.4,<3",
32
+ "ruff>=0.9,<1",
33
+ "twine>=6,<7"
34
+ ]
35
+
36
+ [tool.hatch.build.targets.wheel]
37
+ packages = ["src/intflow_authctl"]
38
+
39
+ [tool.hatch.build.targets.sdist]
40
+ ignore-vcs = true
41
+ include = [
42
+ "/README.md",
43
+ "/pyproject.toml",
44
+ "/src/intflow_authctl"
45
+ ]
46
+ exclude = [
47
+ "/.gitignore"
48
+ ]
49
+
50
+ [tool.pytest.ini_options]
51
+ testpaths = ["tests"]
52
+ pythonpath = ["src"]
53
+ timeout = 30
54
+ filterwarnings = [
55
+ "error"
56
+ ]
57
+
58
+ [tool.coverage.run]
59
+ source = ["intflow_authctl"]
60
+ branch = true
61
+
62
+ [tool.coverage.report]
63
+ fail_under = 0
64
+ show_missing = true
65
+ skip_covered = true
66
+
67
+ [tool.mypy]
68
+ python_version = "3.12"
69
+ show_error_codes = true
70
+ warn_unused_configs = true
71
+ files = ["src/intflow_authctl"]
72
+
73
+ [tool.ruff]
74
+ line-length = 100
75
+ target-version = "py312"
76
+ src = ["src", "tests"]
77
+
78
+ [tool.ruff.lint]
79
+ select = [
80
+ "E",
81
+ "F",
82
+ "I",
83
+ "UP",
84
+ "B",
85
+ "SIM"
86
+ ]
@@ -1,3 +1,3 @@
1
- """Internal implementation package for the Intflow Auth operator CLI."""
2
-
3
- __version__ = "0.2.0"
1
+ """Internal implementation package for the Intflow Auth operator CLI."""
2
+
3
+ __version__ = "0.2.2"