|
2 | 2 | ## Unreleased |
3 | 3 |
|
4 | 4 | * Added Workload Identity Federation (WIF) admin REST API support |
5 | | - (`server.auth_federation`). Site admins can now manage the WIF config and |
6 | | - its signing keys and connectors from TSC. New endpoints: |
7 | | - - `server.auth_federation.get()` -> `AuthFederationItem` — read the |
8 | | - site's WIF admin config (enabled flag, issuer URL, active key id, |
9 | | - JWT lifetime, connectors). A never-enabled site returns a shell with |
10 | | - `enabled=False` rather than 404. |
11 | | - - `server.auth_federation.enable(token_lifetime_seconds=None)` -> |
12 | | - `AuthFederationItem` — idempotent PUT. Server auto-generates one active |
13 | | - signing key on first enable. |
14 | | - - `server.auth_federation.update(token_lifetime_seconds)` -> |
15 | | - `AuthFederationItem` — merge-patch; only `token_lifetime_seconds` is |
16 | | - mutable (required), so `update()` always changes it. `enabled` is never |
17 | | - sent on PATCH; use `enable()` / `delete()` to change WIF state. |
18 | | - - `server.auth_federation.delete()` — permanently deletes the WIF config |
19 | | - along with every signing key and connector on the site. A subsequent |
20 | | - `enable()` starts from a clean slate; prior connectors and keys are |
21 | | - not restored. |
22 | | - - `server.auth_federation.create_connector(connector)` -> |
23 | | - `AuthFederationConnectorItem`. `connector_class` must match a Tableau |
24 | | - connection type exactly (case-sensitive, e.g. `"bigquery"`, |
25 | | - `"snowflake"`). Fails with 409 if a connector with the same class |
26 | | - already exists on the site. |
27 | | - - `server.auth_federation.list_connectors()` -> `list[AuthFederationConnectorItem]` |
28 | | - - `server.auth_federation.get_connector(id)` and |
29 | | - `server.auth_federation.delete_connector(id)` accept either a connector |
30 | | - LUID string or an `AuthFederationConnectorItem` with `luid` set. All |
31 | | - id-taking methods reject `None`, empty strings, and non-UUID-shaped |
32 | | - targets client-side (raising `ValueError`) to prevent path injection. |
33 | | - - `server.auth_federation.create_key()` -> `AuthFederationKeyItem` — |
34 | | - generates a new (inactive) signing key; private key is never returned. |
35 | | - Fails with 400 if the site is already at the maximum number of keys. |
36 | | - - `server.auth_federation.activate_key(id)` / |
37 | | - `server.auth_federation.deactivate_key(id)` / |
38 | | - `server.auth_federation.delete_key(id)` accept either a `kid` string |
39 | | - or an `AuthFederationKeyItem` with `kid` set; `activate_key` is atomic |
40 | | - and deactivates any previously active key. `delete_key` fails with 400 |
41 | | - if the key is currently active. Safe rotation is `create_key()` → |
42 | | - `activate_key(new_kid)`, then retain the old (now-inactive) key in the |
43 | | - site's JWKS until every JWT it signed has expired (upper bound: the |
44 | | - site's current `token_lifetime_seconds`), and only then |
45 | | - `delete_key(old_kid)` — deleting it earlier removes it from the JWKS |
46 | | - and any verifier fetching the key set afterwards will reject still- |
47 | | - unexpired tokens signed with it. `deactivate_key` on the active key |
48 | | - with no replacement leaves the site unable to mint WIF tokens. The four key-management methods are bound to `NO_ACCESS` |
49 | | - server-side, which only rejects OAuth-scope-restricted sessions |
50 | | - (e.g. connected-app JWT) with 401; password and personal-access-token |
51 | | - (PAT) sessions do not carry scopes and are accepted. |
52 | | - Three new exports: `AuthFederationItem`, `AuthFederationConnectorItem`, |
53 | | - `AuthFederationKeyItem`. Requires Tableau Server REST API 3.30+ |
54 | | - (Tableau Server 2026.3), the WIF feature enabled on the site, and the |
55 | | - Site Administrator role on the current site; the server returns 403 if |
56 | | - any of those is missing (including on `get()`). |
| 5 | + (`server.auth_federation`). Site admins can read, enable, update, and |
| 6 | + delete the per-site WIF config and manage its connectors (BigQuery, |
| 7 | + Snowflake, ...) and signing keys (create / activate / deactivate / |
| 8 | + delete). Three new exports: `AuthFederationItem`, |
| 9 | + `AuthFederationConnectorItem`, `AuthFederationKeyItem`. All id-taking |
| 10 | + methods reject non-UUID targets client-side (raising `ValueError`) to |
| 11 | + prevent path injection. Requires Tableau Server REST API 3.30+ (Tableau |
| 12 | + Server 2026.3) and Site Administrator on the current site; the server |
| 13 | + returns 403 if WIF is not enabled on the site or the caller is not an |
| 14 | + admin (including on `get()`). |
57 | 15 | * Added Workload Identity Federation (WIF) support to the connection update |
58 | 16 | endpoints. `ConnectionItem` has two new string properties, |
59 | | - `workgroup_auth_mode` and `auth_federation_service_account`, that are |
60 | | - emitted on the `<connection>` payload by `workbooks.update_connection`, |
61 | | - `workbooks.update_connections`, `datasources.update_connection`, |
62 | | - `datasources.update_connections`, and `flows.update_connection`. The two |
63 | | - bulk endpoints also accept matching `workgroup_auth_mode` and |
64 | | - `auth_federation_service_account` keyword arguments and apply them to |
65 | | - every connection LUID in the request. Set `workgroup_auth_mode` to one of |
66 | | - the values on the new nested value set |
67 | | - `ConnectionItem.WorkgroupAuthMode`: |
68 | | - - `ConnectionItem.WorkgroupAuthMode.WIF` = |
69 | | - `"workload-identity-federation"` — direct WIF, e.g. Snowflake |
70 | | - - `ConnectionItem.WorkgroupAuthMode.WIF_IMPERSONATION` = |
71 | | - `"workload-identity-federation-impersonation"` — impersonation WIF, |
72 | | - e.g. Google BigQuery |
73 | | - Usage rules: |
74 | | - - Resend `workgroup_auth_mode` on every subsequent update of a WIF |
75 | | - connection; omitting it on a later update returns HTTP 400. |
76 | | - - Leave `auth_type` unset (or `"oauth"`) when sending a WIF mode; the |
77 | | - server derives the stored auth type from the mode. |
78 | | - - Set `auth_federation_service_account` only with `WIF_IMPERSONATION`. |
79 | | - The server rejects a service account with the direct `WIF` mode. TSC |
80 | | - does not validate this combination client-side. |
81 | | - - The server does not echo these attributes on GET responses today, so |
82 | | - `ConnectionItem.workgroup_auth_mode` and |
83 | | - `ConnectionItem.auth_federation_service_account` parsed from a response |
84 | | - will typically be `None` even when the connection is WIF-configured. |
85 | | - Requires Tableau Server REST API 3.30+ (Tableau Server 2026.3) with |
86 | | - WIF configured and enabled on the site. Older servers silently ignore |
87 | | - unknown connection attributes, so these fields are safe to leave unset on |
88 | | - pre-3.30 targets. |
| 17 | + `workgroup_auth_mode` and `auth_federation_service_account`, emitted on |
| 18 | + the `<connection>` payload by `workbooks.update_connection(s)`, |
| 19 | + `datasources.update_connection(s)`, and `flows.update_connection`. Set |
| 20 | + `workgroup_auth_mode` to `ConnectionItem.WorkgroupAuthMode.WIF` (direct, |
| 21 | + e.g. Snowflake) or `WIF_IMPERSONATION` (e.g. BigQuery); |
| 22 | + `auth_federation_service_account` is only valid with the impersonation |
| 23 | + mode. Omitting `workgroup_auth_mode` on a subsequent update of a WIF |
| 24 | + connection returns HTTP 400. Requires Tableau Server REST API 3.30+ |
| 25 | + (Tableau Server 2026.3) with WIF configured on the site; older servers |
| 26 | + silently ignore unknown connection attributes. |
89 | 27 | * Bumped the urllib3 floor to 2.6.3 to pick up the fix for CVE-2026-21441 |
90 | 28 | (GHSA-38jv-5279-wg99, 8.9 High): urllib3's streaming decompression |
91 | 29 | safeguards were bypassed when HTTP redirects were followed. TSC's manual |
|
0 commit comments