Repository navigation
Release Python SDK v17.3.0 - #1032
Merged
Merged
Conversation
stas-schaller
marked this pull request as ready for review
June 8, 2026 19:49
idimov-keeper
previously approved these changes
Jun 9, 2026
idimov-keeper
previously approved these changes
Jun 13, 2026
stas-schaller
force-pushed
the
release/sdk/python/core/v17.3.0
branch
from
June 15, 2026 21:58
c05fd59 to
b0c41a8
Compare
KSM-992: typed KeeperRecordLink accessor layer and Record.get_links() KSM-877: automatic throttle retry with exponential backoff KSM-932: IL5 custom server public key support KSM-808: KeeperError with actionable messages on missing config keys KSM-807: delete partial config on failed OTT initialization KSM-813: Windows set_config_mode() removes all Everyone ACEs KSM-819: RecordCreate.to_dict() no longer drops empty custom list KSM-1004: KSMCache resolves KSM_CACHE_DIR at call time Co-authored-by: Mateo Gallego <mgallego@keepersecurity.com>
stas-schaller
force-pushed
the
release/sdk/python/core/v17.3.0
branch
from
June 17, 2026 19:05
b0c41a8 to
5229122
Compare
idimov-keeper
approved these changes
Jun 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Python Core SDK v17.3.0 and Python Helper v1.1.2. The release adds typed
KeeperRecordLinklinked-credential accessors (KSM-992), IL5 custom server public key support (KSM-932), automatic throttle retry with exponential backoff (KSM-877), and fixes four bugs: crypticTypeErroronNone-valued config keys (KSM-808), partial config files left behind after failed OTT binding (KSM-807), incomplete Windows ACL cleanup (KSM-813), andRecordCreate.to_dict()silently dropping"custom": []from the payload (KSM-819). Default behaviour is unchanged for all standard Keeper deployments.Changes
New Features
KeeperRecordLinklinked-credential accessors (KSM-992):record.get_links()returns typed link objects with Java-parity accessors (user/permission booleans, encryption detection, AES-256-GCMget_decrypted_data,get_link_data, andai_settings/jit_settings/generic settings access) plus accessors for the current backend payload shape verified against a live PAM app (metalinks with anallowedSettingsfallback for the permission booleans,is_iam_user/belongs_to/rotation_settings,get_allowed_settings()/get_meta_data()). Purely additive — the rawrecord.linkslist is unchanged and each typed link keeps the untouched original dict in.raw.get_pam_users()-style type filters are not buildable (link payloads carry no record type — same conclusion as Rust KSM-997). Review-hardened:get_link_data()now falls through to decryption when a plain-JSON parse fails, so encryptedai_settings/jit_settingslinks whose ciphertext coincidentally begins with{or[(~2/256) decrypt correctly instead of returningNone.{"error":"throttled"},_post_queryretries transparently up to 5 times with delays of 11s, 22s, 44s, 88s, 176s (±25% jitter), honoringretry_afterfrom the response body when present. A typedKeeperThrottleError(subclass ofKeeperError) is raised once retries are exhausted. AllSecretsManageroperations gain throttle resilience with no caller changes. Key-rotation retry behavior is unchanged.serverPublicKeyfield in storage, a 4-segment one-time-token extension (REGION:clientKey:keyId:serverPublicKeyBase64), and newserver_public_key/server_public_key_idparameters onSecretsManager. Also fixes a long-standing missingraiseingenerate_transmission_keyand prevents__init__from silently resetting a non-standardkey_idback to the default when a custom key is configured.Bug Fixes
TypeErroronNone-valued config keys (KSM-808): config-decoding utilities (base64_to_bytes,url_safe_str_to_bytes,base64_to_string,CryptoUtils.url_safe_str_to_bytes) now raiseKeeperErrorwith actionable messages instead ofTypeErrorwhen passedNone. Per-call-site guards incore.pyname the specific missingConfigKey(appKey,clientKey) and direct the user to reinitialize with a fresh One-Time Token. Customer-reported.client-config.jsonwhen OTT binding fails (expired or already-consumed token) so users are not silently trapped in a retry loop. The error message names the deleted file and instructs the user to generate a fresh token.set_config_mode()now removes all Everyone ACEs from the config file, not only Full Control. A read-only Everyone ACE could persist after the previous sequence.RecordCreate.to_dict()drops"custom": []from payload (KSM-819): falsy check (if self.custom:) silently dropped an empty custom-fields list before serialization, making the KSM-702 CLI fix ineffective at the SDK level. Changed toif self.custom is not None:.setup.py— legal/compliance gap that would publish to PyPI as a license-claim-without-text.core.pyruntime check raised on< 3.6whilesetup.pypython_requiresand classifiers required>= 3.9(announced in v17.2.0). Updated guard to match.keyIdorserverPublicKeysegments, invalid base64) now raiseValueErrorat construction. Previously these silently degraded to default-key behavior.Maintenance
>=17.3.0. Helper version pairs 1:1 with core.keeper_globals.pyand smoke test assertions.SecretsManager.__init__'s new constructor params andgenerate_transmission_key's new arg, including precedence documentation.KSM_CACHE_DIRresolution (KSM-1004):KSMCachenow reads the cache directory at call time instead of once at import, so the env var is honored whenever it is set (not only pre-import).kms_cache_file_nameis kept for backward compatibility; default CWD-relative behavior is unchanged.Breaking Changes
None. The new field, parameter, and 4-segment token format are opt-in. The new parser errors only fire on inputs that previously silently degraded — no caller relying on documented v17.2.1 behavior is affected.
Related Issues