strongdm 7.1.0__zip → 8.0.0__zip
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.
- {strongdm-7.1.0 → strongdm-8.0.0}/PKG-INFO +2 -2
- {strongdm-7.1.0 → strongdm-8.0.0}/setup.py +2 -2
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/accounts_pb2.py +45 -34
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/accounts_pb2_grpc.py +3 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/client.py +11 -7
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/models.py +125 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/plumbing.py +51 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/svc.py +4 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm.egg-info/PKG-INFO +2 -2
- {strongdm-7.1.0 → strongdm-8.0.0}/LICENSE +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/README.md +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/setup.cfg +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/__init__.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/access_request_events_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/access_request_events_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/access_requests_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/access_requests_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/access_requests_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/access_requests_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_attachments_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_attachments_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_attachments_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_attachments_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_grants_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_grants_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_grants_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_grants_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_permissions_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_permissions_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_resources_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_resources_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_resources_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/account_resources_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/accounts_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/accounts_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/activities_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/activities_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_approvers_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_approvers_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_approvers_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_approvers_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_steps_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_steps_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_steps_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflow_steps_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflows_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflows_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflows_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/approval_workflows_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/constants.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/control_panel_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/control_panel_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/drivers_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/drivers_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/errors.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/nodes_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/nodes_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/nodes_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/nodes_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/options_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/options_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/organization_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/organization_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_group_nodes_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_group_nodes_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_group_peers_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_group_peers_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_group_resources_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_group_resources_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_groups_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/peering_groups_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/queries_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/queries_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identities_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identities_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identities_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identities_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identity_groups_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identity_groups_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identity_groups_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/remote_identity_groups_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/replays_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/replays_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/resources_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/resources_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/resources_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/resources_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/role_resources_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/role_resources_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/role_resources_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/role_resources_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/roles_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/roles_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/roles_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/roles_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_store_healths_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_store_healths_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_store_types_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_store_types_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_stores_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_stores_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_stores_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/secret_stores_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/spec_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/spec_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/tags_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/tags_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_approvers_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_approvers_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_approvers_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_approvers_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_assignments_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_assignments_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_assignments_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_assignments_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_roles_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_roles_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_roles_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflow_roles_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflows_history_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflows_history_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflows_pb2.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm/workflows_pb2_grpc.py +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm.egg-info/SOURCES.txt +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm.egg-info/dependency_links.txt +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm.egg-info/requires.txt +0 -0
- {strongdm-7.1.0 → strongdm-8.0.0}/strongdm.egg-info/top_level.txt +0 -0
@@ -1,12 +1,12 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: strongdm
|
3
|
-
Version:
|
3
|
+
Version: 8.0.0
|
4
4
|
Summary: strongDM SDK for the Python programming language.
|
5
5
|
Home-page: https://github.com/strongdm/strongdm-sdk-python
|
6
6
|
Author: strongDM Team
|
7
7
|
Author-email: sdk-feedback@strongdm.com
|
8
8
|
License: apache-2.0
|
9
|
-
Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/
|
9
|
+
Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v8.0.0.tar.gz
|
10
10
|
Keywords: strongDM,sdm,api,automation,security,audit,database,server,ssh,rdp
|
11
11
|
Platform: UNKNOWN
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
@@ -23,7 +23,7 @@ from setuptools import setup
|
|
23
23
|
setup(
|
24
24
|
name='strongdm',
|
25
25
|
packages=['strongdm'],
|
26
|
-
version='
|
26
|
+
version='8.0.0',
|
27
27
|
license='apache-2.0',
|
28
28
|
description='strongDM SDK for the Python programming language.',
|
29
29
|
long_description=long_description,
|
@@ -32,7 +32,7 @@ setup(
|
|
32
32
|
author_email='sdk-feedback@strongdm.com',
|
33
33
|
url='https://github.com/strongdm/strongdm-sdk-python',
|
34
34
|
download_url=
|
35
|
-
'https://github.com/strongdm/strongdm-sdk-python/archive/
|
35
|
+
'https://github.com/strongdm/strongdm-sdk-python/archive/v8.0.0.tar.gz',
|
36
36
|
keywords=[
|
37
37
|
'strongDM', 'sdm', 'api', 'automation', 'security', 'audit',
|
38
38
|
'database', 'server', 'ssh', 'rdp'
|
@@ -26,13 +26,14 @@ from google.protobuf import symbol_database as _symbol_database
|
|
26
26
|
_sym_db = _symbol_database.Default()
|
27
27
|
|
28
28
|
|
29
|
+
from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
|
29
30
|
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
|
30
31
|
from . import options_pb2 as options__pb2
|
31
32
|
from . import spec_pb2 as spec__pb2
|
32
33
|
from . import tags_pb2 as tags__pb2
|
33
34
|
|
34
35
|
|
35
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x61\x63\x63ounts.proto\x12\x02v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\roptions.proto\x1a\nspec.proto\x1a\ntags.proto\"i\n\x14\x41\x63\x63ountCreateRequest\x12\'\n\x04meta\x18\x01 \x01(\x0b\x32\x19.v1.CreateRequestMetadata\x12(\n\x07\x61\x63\x63ount\x18\x02 \x01(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\"\
|
36
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x61\x63\x63ounts.proto\x12\x02v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\roptions.proto\x1a\nspec.proto\x1a\ntags.proto\"i\n\x14\x41\x63\x63ountCreateRequest\x12\'\n\x04meta\x18\x01 \x01(\x0b\x32\x19.v1.CreateRequestMetadata\x12(\n\x07\x61\x63\x63ount\x18\x02 \x01(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\"\xf8\x02\n\x15\x41\x63\x63ountCreateResponse\x12\x34\n\x04meta\x18\x01 \x01(\x0b\x32\x1a.v1.CreateResponseMetadataB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12(\n\x07\x61\x63\x63ount\x18\x02 \x01(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x1e\n\x05token\x18\x03 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\xf0\xf3\xb3\x07\x01\x12W\n\nrate_limit\x18\x04 \x01(\x0b\x32\x15.v1.RateLimitMetadataB,\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\xf2\xf8\xb3\x07\x06\xb2\xf4\xb3\x07\x01*\xf2\xf8\xb3\x07\x12\xb2\xf4\xb3\x07\r!json_gateway\x12<\n\naccess_key\x18\x05 \x01(\tB(\xf2\xf8\xb3\x07#\xb0\xf3\xb3\x07\x01\xb2\xf4\xb3\x07\x01*\xb2\xf4\xb3\x07\x13!terraform-provider\x12<\n\nsecret_key\x18\x06 \x01(\tB(\xf2\xf8\xb3\x07#\xb0\xf3\xb3\x07\x01\xb2\xf4\xb3\x07\x01*\xb2\xf4\xb3\x07\x13!terraform-provider:\n\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\"Q\n\x11\x41\x63\x63ountGetRequest\x12$\n\x04meta\x18\x01 \x01(\x0b\x32\x16.v1.GetRequestMetadata\x12\x16\n\x02id\x18\x02 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\"\xd6\x01\n\x12\x41\x63\x63ountGetResponse\x12\x31\n\x04meta\x18\x01 \x01(\x0b\x32\x17.v1.GetResponseMetadataB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12(\n\x07\x61\x63\x63ount\x18\x02 \x01(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12W\n\nrate_limit\x18\x03 \x01(\x0b\x32\x15.v1.RateLimitMetadataB,\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\xf2\xf8\xb3\x07\x06\xb2\xf4\xb3\x07\x01*\xf2\xf8\xb3\x07\x12\xb2\xf4\xb3\x07\r!json_gateway:\n\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\"u\n\x14\x41\x63\x63ountUpdateRequest\x12\'\n\x04meta\x18\x01 \x01(\x0b\x32\x19.v1.UpdateRequestMetadata\x12\n\n\x02id\x18\x02 \x01(\t\x12(\n\x07\x61\x63\x63ount\x18\x03 \x01(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\"\xdc\x01\n\x15\x41\x63\x63ountUpdateResponse\x12\x34\n\x04meta\x18\x01 \x01(\x0b\x32\x1a.v1.UpdateResponseMetadataB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12(\n\x07\x61\x63\x63ount\x18\x02 \x01(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12W\n\nrate_limit\x18\x03 \x01(\x0b\x32\x15.v1.RateLimitMetadataB,\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\xf2\xf8\xb3\x07\x06\xb2\xf4\xb3\x07\x01*\xf2\xf8\xb3\x07\x12\xb2\xf4\xb3\x07\r!json_gateway:\n\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\"W\n\x14\x41\x63\x63ountDeleteRequest\x12\'\n\x04meta\x18\x01 \x01(\x0b\x32\x19.v1.DeleteRequestMetadata\x12\x16\n\x02id\x18\x02 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\"\xb2\x01\n\x15\x41\x63\x63ountDeleteResponse\x12\x34\n\x04meta\x18\x01 \x01(\x0b\x32\x1a.v1.DeleteResponseMetadataB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12W\n\nrate_limit\x18\x02 \x01(\x0b\x32\x15.v1.RateLimitMetadataB,\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\xf2\xf8\xb3\x07\x06\xb2\xf4\xb3\x07\x01*\xf2\xf8\xb3\x07\x12\xb2\xf4\xb3\x07\r!json_gateway:\n\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\"W\n\x12\x41\x63\x63ountListRequest\x12%\n\x04meta\x18\x01 \x01(\x0b\x32\x17.v1.ListRequestMetadata\x12\x1a\n\x06\x66ilter\x18\x02 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\"\xc1\x01\n\x13\x41\x63\x63ountListResponse\x12&\n\x04meta\x18\x01 \x01(\x0b\x32\x18.v1.ListResponseMetadata\x12)\n\x08\x61\x63\x63ounts\x18\x02 \x03(\x0b\x32\x0b.v1.AccountB\n\xf2\xf8\xb3\x07\x05\xb8\xf3\xb3\x07\x01\x12W\n\nrate_limit\x18\x03 \x01(\x0b\x32\x15.v1.RateLimitMetadataB,\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\xf2\xf8\xb3\x07\x06\xb2\xf4\xb3\x07\x01*\xf2\xf8\xb3\x07\x12\xb2\xf4\xb3\x07\r!json_gateway\"\xb2\x02\n\x07\x41\x63\x63ount\x12$\n\x04user\x18\x01 \x01(\x0b\x32\x08.v1.UserB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01H\x00\x12*\n\x07service\x18\x02 \x01(\x0b\x32\x0b.v1.ServiceB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01H\x00\x12\x44\n\x05token\x18\x03 \x01(\x0b\x32\t.v1.TokenB(\xf2\xf8\xb3\x07#\xb0\xf3\xb3\x07\x01\xb2\xf4\xb3\x07\x01*\xb2\xf4\xb3\x07\x13!terraform-providerH\x00:a\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\xfa\xf8\xb3\x07R\xc2\xf3\xb3\x07M\xa2\xf3\xb3\x07 tf_examples/account_resource.txt\xaa\xf3\xb3\x07#tf_examples/account_data_source.txtB,\n\x07\x61\x63\x63ount\x12!\xaa\xf8\xb3\x07\x0e\xaa\xf8\xb3\x07\tsuspended\xaa\xf8\xb3\x07\t\xaa\xf8\xb3\x07\x04tags\"\xd2\x06\n\x04User\x12\x16\n\x02id\x18\x01 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x1e\n\x05\x65mail\x18\x02 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\xc0\xf3\xb3\x07\x01\x12#\n\nfirst_name\x18\x03 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\xc0\xf3\xb3\x07\x01\x12\"\n\tlast_name\x18\x04 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\xc0\xf3\xb3\x07\x01\x12*\n\tsuspended\x18\x05 \x01(\x08\x42\x17\xf2\xf8\xb3\x07\x12\xb2\xf4\xb3\x07\r!json_gateway\x12\"\n\x04tags\x18\x06 \x01(\x0b\x32\x08.v1.TagsB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x36\n\x10permission_level\x18\x07 \x01(\tB\x1c\xf2\xf8\xb3\x07\x17\x98\xf4\xb3\x07\x01\xb2\xf4\xb3\x07\r!json_gateway\x12#\n\nmanaged_by\x18\x08 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\x98\xf4\xb3\x07\x01\x12\x1f\n\x0b\x65xternal_id\x18\t \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\xdb\x01\n\x0bsuspendedRO\x18\n \x01(\x08\x42\xc5\x01\xf2\xf8\xb3\x07\xbf\x01\xb0\xf3\xb3\x07\x01\xca\xf3\xb3\x07\xaf\x01\xc2\xf4\xb3\x07\x0f\n\x02go\x12\tSuspended\xc2\xf4\xb3\x07\x10\n\x03\x63li\x12\tsuspended\xc2\xf4\xb3\x07\x11\n\x04ruby\x12\tsuspended\xc2\xf4\xb3\x07\x13\n\x06python\x12\tsuspended\xc2\xf4\xb3\x07\x11\n\x04java\x12\tSuspended\xc2\xf4\xb3\x07\x1f\n\x12terraform-provider\x12\tsuspended\xc2\xf4\xb3\x07\x19\n\x0cjson_gateway\x12\tsuspended\x98\xf4\xb3\x07\x01\x12\x90\x02\n\x12permission_levelRW\x18\x0b \x01(\tB\xf3\x01\xf2\xf8\xb3\x07\xed\x01\xb0\xf3\xb3\x07\x01\xca\xf3\xb3\x07\xdd\x01\xc2\xf4\xb3\x07\x15\n\x02go\x12\x0fPermissionLevel\xc2\xf4\xb3\x07\x17\n\x03\x63li\x12\x10permission-level\xc2\xf4\xb3\x07\x18\n\x04ruby\x12\x10permission_level\xc2\xf4\xb3\x07\x1a\n\x06python\x12\x10permission_level\xc2\xf4\xb3\x07\x17\n\x04java\x12\x0fPermissionLevel\xc2\xf4\xb3\x07&\n\x12terraform-provider\x12\x10permission_level\xc2\xf4\xb3\x07\x1f\n\x0cjson_gateway\x12\x0fpermissionLevel\xd0\xf4\xb3\x07\x01:\n\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\"\x8f\x01\n\x07Service\x12\x16\n\x02id\x18\x01 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x1d\n\x04name\x18\x02 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\xc0\xf3\xb3\x07\x01\x12\x1d\n\tsuspended\x18\x03 \x01(\x08\x42\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\"\n\x04tags\x18\x04 \x01(\x0b\x32\x08.v1.TagsB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01:\n\xfa\xf8\xb3\x07\x05\xa8\xf3\xb3\x07\x01\"\x9a\x03\n\x05Token\x12\x16\n\x02id\x18\x01 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x1d\n\x04name\x18\x02 \x01(\tB\x0f\xf2\xf8\xb3\x07\n\xb0\xf3\xb3\x07\x01\xc0\xf3\xb3\x07\x01\x12\x1d\n\tsuspended\x18\x03 \x01(\x08\x42\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\"\n\x04tags\x18\x04 \x01(\x0b\x32\x08.v1.TagsB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x37\n\x07rekeyed\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x38\n\x08\x64\x65\x61\x64line\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12 \n\x0c\x61\x63\x63ount_type\x18\x07 \x01(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x1f\n\x0bpermissions\x18\x08 \x03(\tB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01\x12\x37\n\x08\x64uration\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationB\n\xf2\xf8\xb3\x07\x05\xb0\xf3\xb3\x07\x01:(\xfa\xf8\xb3\x07#\xa8\xf3\xb3\x07\x01\xd2\xf3\xb3\x07\x01*\xd2\xf3\xb3\x07\x13!terraform-provider2\xab\x04\n\x08\x41\x63\x63ounts\x12\x63\n\x06\x43reate\x12\x18.v1.AccountCreateRequest\x1a\x19.v1.AccountCreateResponse\"$\x82\xf9\xb3\x07\t\xa2\xf3\xb3\x07\x04post\x82\xf9\xb3\x07\x11\xaa\xf3\xb3\x07\x0c/v1/accounts\x12^\n\x03Get\x12\x15.v1.AccountGetRequest\x1a\x16.v1.AccountGetResponse\"(\x82\xf9\xb3\x07\x08\xa2\xf3\xb3\x07\x03get\x82\xf9\xb3\x07\x16\xaa\xf3\xb3\x07\x11/v1/accounts/{id}\x12g\n\x06Update\x12\x18.v1.AccountUpdateRequest\x1a\x19.v1.AccountUpdateResponse\"(\x82\xf9\xb3\x07\x08\xa2\xf3\xb3\x07\x03put\x82\xf9\xb3\x07\x16\xaa\xf3\xb3\x07\x11/v1/accounts/{id}\x12j\n\x06\x44\x65lete\x12\x18.v1.AccountDeleteRequest\x1a\x19.v1.AccountDeleteResponse\"+\x82\xf9\xb3\x07\x0b\xa2\xf3\xb3\x07\x06\x64\x65lete\x82\xf9\xb3\x07\x16\xaa\xf3\xb3\x07\x11/v1/accounts/{id}\x12\\\n\x04List\x12\x16.v1.AccountListRequest\x1a\x17.v1.AccountListResponse\"#\x82\xf9\xb3\x07\x08\xa2\xf3\xb3\x07\x03get\x82\xf9\xb3\x07\x11\xaa\xf3\xb3\x07\x0c/v1/accounts\x1a\'\xca\xf9\xb3\x07\x0c\xc2\xf9\xb3\x07\x07\x41\x63\x63ount\xca\xf9\xb3\x07\x07\xd2\xf9\xb3\x07\x02\x61-\xca\xf9\xb3\x07\x05\xe0\xf9\xb3\x07\x01\x42\x64\n\x19\x63om.strongdm.api.plumbingB\x10\x41\x63\x63ountsPlumbingZ5github.com/strongdm/strongdm-sdk-go/v3/internal/v1;v1b\x06proto3')
|
36
37
|
|
37
38
|
|
38
39
|
|
@@ -163,6 +164,10 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
163
164
|
_ACCOUNTCREATERESPONSE.fields_by_name['token']._serialized_options = b'\362\370\263\007\n\260\363\263\007\001\360\363\263\007\001'
|
164
165
|
_ACCOUNTCREATERESPONSE.fields_by_name['rate_limit']._options = None
|
165
166
|
_ACCOUNTCREATERESPONSE.fields_by_name['rate_limit']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001\362\370\263\007\006\262\364\263\007\001*\362\370\263\007\022\262\364\263\007\r!json_gateway'
|
167
|
+
_ACCOUNTCREATERESPONSE.fields_by_name['access_key']._options = None
|
168
|
+
_ACCOUNTCREATERESPONSE.fields_by_name['access_key']._serialized_options = b'\362\370\263\007#\260\363\263\007\001\262\364\263\007\001*\262\364\263\007\023!terraform-provider'
|
169
|
+
_ACCOUNTCREATERESPONSE.fields_by_name['secret_key']._options = None
|
170
|
+
_ACCOUNTCREATERESPONSE.fields_by_name['secret_key']._serialized_options = b'\362\370\263\007#\260\363\263\007\001\262\364\263\007\001*\262\364\263\007\023!terraform-provider'
|
166
171
|
_ACCOUNTCREATERESPONSE._options = None
|
167
172
|
_ACCOUNTCREATERESPONSE._serialized_options = b'\372\370\263\007\005\250\363\263\007\001'
|
168
173
|
_ACCOUNTGETREQUEST.fields_by_name['id']._options = None
|
@@ -206,7 +211,7 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
206
211
|
_ACCOUNT.fields_by_name['service']._options = None
|
207
212
|
_ACCOUNT.fields_by_name['service']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001'
|
208
213
|
_ACCOUNT.fields_by_name['token']._options = None
|
209
|
-
_ACCOUNT.fields_by_name['token']._serialized_options = b'\362\370\263\007\
|
214
|
+
_ACCOUNT.fields_by_name['token']._serialized_options = b'\362\370\263\007#\260\363\263\007\001\262\364\263\007\001*\262\364\263\007\023!terraform-provider'
|
210
215
|
_ACCOUNT._options = None
|
211
216
|
_ACCOUNT._serialized_options = b'\372\370\263\007\005\250\363\263\007\001\372\370\263\007R\302\363\263\007M\242\363\263\007 tf_examples/account_resource.txt\252\363\263\007#tf_examples/account_data_source.txt'
|
212
217
|
_USER.fields_by_name['id']._options = None
|
@@ -255,10 +260,16 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
255
260
|
_TOKEN.fields_by_name['rekeyed']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001'
|
256
261
|
_TOKEN.fields_by_name['deadline']._options = None
|
257
262
|
_TOKEN.fields_by_name['deadline']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001'
|
263
|
+
_TOKEN.fields_by_name['account_type']._options = None
|
264
|
+
_TOKEN.fields_by_name['account_type']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001'
|
265
|
+
_TOKEN.fields_by_name['permissions']._options = None
|
266
|
+
_TOKEN.fields_by_name['permissions']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001'
|
267
|
+
_TOKEN.fields_by_name['duration']._options = None
|
268
|
+
_TOKEN.fields_by_name['duration']._serialized_options = b'\362\370\263\007\005\260\363\263\007\001'
|
258
269
|
_TOKEN._options = None
|
259
|
-
_TOKEN._serialized_options = b'\372\370\263\007
|
270
|
+
_TOKEN._serialized_options = b'\372\370\263\007#\250\363\263\007\001\322\363\263\007\001*\322\363\263\007\023!terraform-provider'
|
260
271
|
_ACCOUNTS._options = None
|
261
|
-
_ACCOUNTS._serialized_options = b'\312\371\263\007\014\302\371\263\007\007Account\312\371\263\007\007\322\371\263\007\002a
|
272
|
+
_ACCOUNTS._serialized_options = b'\312\371\263\007\014\302\371\263\007\007Account\312\371\263\007\007\322\371\263\007\002a-\312\371\263\007\005\340\371\263\007\001'
|
262
273
|
_ACCOUNTS.methods_by_name['Create']._options = None
|
263
274
|
_ACCOUNTS.methods_by_name['Create']._serialized_options = b'\202\371\263\007\t\242\363\263\007\004post\202\371\263\007\021\252\363\263\007\014/v1/accounts'
|
264
275
|
_ACCOUNTS.methods_by_name['Get']._options = None
|
@@ -269,34 +280,34 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
269
280
|
_ACCOUNTS.methods_by_name['Delete']._serialized_options = b'\202\371\263\007\013\242\363\263\007\006delete\202\371\263\007\026\252\363\263\007\021/v1/accounts/{id}'
|
270
281
|
_ACCOUNTS.methods_by_name['List']._options = None
|
271
282
|
_ACCOUNTS.methods_by_name['List']._serialized_options = b'\202\371\263\007\010\242\363\263\007\003get\202\371\263\007\021\252\363\263\007\014/v1/accounts'
|
272
|
-
_ACCOUNTCREATEREQUEST._serialized_start=
|
273
|
-
_ACCOUNTCREATEREQUEST._serialized_end=
|
274
|
-
_ACCOUNTCREATERESPONSE._serialized_start=
|
275
|
-
_ACCOUNTCREATERESPONSE._serialized_end=
|
276
|
-
_ACCOUNTGETREQUEST._serialized_start=
|
277
|
-
_ACCOUNTGETREQUEST._serialized_end=
|
278
|
-
_ACCOUNTGETRESPONSE._serialized_start=
|
279
|
-
_ACCOUNTGETRESPONSE._serialized_end=
|
280
|
-
_ACCOUNTUPDATEREQUEST._serialized_start=
|
281
|
-
_ACCOUNTUPDATEREQUEST._serialized_end=
|
282
|
-
_ACCOUNTUPDATERESPONSE._serialized_start=
|
283
|
-
_ACCOUNTUPDATERESPONSE._serialized_end=
|
284
|
-
_ACCOUNTDELETEREQUEST._serialized_start=
|
285
|
-
_ACCOUNTDELETEREQUEST._serialized_end=
|
286
|
-
_ACCOUNTDELETERESPONSE._serialized_start=
|
287
|
-
_ACCOUNTDELETERESPONSE._serialized_end=
|
288
|
-
_ACCOUNTLISTREQUEST._serialized_start=
|
289
|
-
_ACCOUNTLISTREQUEST._serialized_end=
|
290
|
-
_ACCOUNTLISTRESPONSE._serialized_start=
|
291
|
-
_ACCOUNTLISTRESPONSE._serialized_end=
|
292
|
-
_ACCOUNT._serialized_start=
|
293
|
-
_ACCOUNT._serialized_end=
|
294
|
-
_USER._serialized_start=
|
295
|
-
_USER._serialized_end=
|
296
|
-
_SERVICE._serialized_start=
|
297
|
-
_SERVICE._serialized_end=
|
298
|
-
_TOKEN._serialized_start=
|
299
|
-
_TOKEN._serialized_end=
|
300
|
-
_ACCOUNTS._serialized_start=
|
301
|
-
_ACCOUNTS._serialized_end=
|
283
|
+
_ACCOUNTCREATEREQUEST._serialized_start=126
|
284
|
+
_ACCOUNTCREATEREQUEST._serialized_end=231
|
285
|
+
_ACCOUNTCREATERESPONSE._serialized_start=234
|
286
|
+
_ACCOUNTCREATERESPONSE._serialized_end=610
|
287
|
+
_ACCOUNTGETREQUEST._serialized_start=612
|
288
|
+
_ACCOUNTGETREQUEST._serialized_end=693
|
289
|
+
_ACCOUNTGETRESPONSE._serialized_start=696
|
290
|
+
_ACCOUNTGETRESPONSE._serialized_end=910
|
291
|
+
_ACCOUNTUPDATEREQUEST._serialized_start=912
|
292
|
+
_ACCOUNTUPDATEREQUEST._serialized_end=1029
|
293
|
+
_ACCOUNTUPDATERESPONSE._serialized_start=1032
|
294
|
+
_ACCOUNTUPDATERESPONSE._serialized_end=1252
|
295
|
+
_ACCOUNTDELETEREQUEST._serialized_start=1254
|
296
|
+
_ACCOUNTDELETEREQUEST._serialized_end=1341
|
297
|
+
_ACCOUNTDELETERESPONSE._serialized_start=1344
|
298
|
+
_ACCOUNTDELETERESPONSE._serialized_end=1522
|
299
|
+
_ACCOUNTLISTREQUEST._serialized_start=1524
|
300
|
+
_ACCOUNTLISTREQUEST._serialized_end=1611
|
301
|
+
_ACCOUNTLISTRESPONSE._serialized_start=1614
|
302
|
+
_ACCOUNTLISTRESPONSE._serialized_end=1807
|
303
|
+
_ACCOUNT._serialized_start=1810
|
304
|
+
_ACCOUNT._serialized_end=2116
|
305
|
+
_USER._serialized_start=2119
|
306
|
+
_USER._serialized_end=2969
|
307
|
+
_SERVICE._serialized_start=2972
|
308
|
+
_SERVICE._serialized_end=3115
|
309
|
+
_TOKEN._serialized_start=3118
|
310
|
+
_TOKEN._serialized_end=3528
|
311
|
+
_ACCOUNTS._serialized_start=3531
|
312
|
+
_ACCOUNTS._serialized_end=4086
|
302
313
|
# @@protoc_insertion_point(module_scope)
|
@@ -23,6 +23,7 @@ class AccountsStub(object):
|
|
23
23
|
"""Accounts are users that have access to strongDM. There are two types of accounts:
|
24
24
|
1. **Users:** humans who are authenticated through username and password or SSO.
|
25
25
|
2. **Service Accounts:** machines that are authenticated using a service token.
|
26
|
+
3. **Tokens** are access keys with permissions that can be used for authentication.
|
26
27
|
"""
|
27
28
|
|
28
29
|
def __init__(self, channel):
|
@@ -62,6 +63,7 @@ class AccountsServicer(object):
|
|
62
63
|
"""Accounts are users that have access to strongDM. There are two types of accounts:
|
63
64
|
1. **Users:** humans who are authenticated through username and password or SSO.
|
64
65
|
2. **Service Accounts:** machines that are authenticated using a service token.
|
66
|
+
3. **Tokens** are access keys with permissions that can be used for authentication.
|
65
67
|
"""
|
66
68
|
|
67
69
|
def Create(self, request, context):
|
@@ -138,6 +140,7 @@ class Accounts(object):
|
|
138
140
|
"""Accounts are users that have access to strongDM. There are two types of accounts:
|
139
141
|
1. **Users:** humans who are authenticated through username and password or SSO.
|
140
142
|
2. **Service Accounts:** machines that are authenticated using a service token.
|
143
|
+
3. **Tokens** are access keys with permissions that can be used for authentication.
|
141
144
|
"""
|
142
145
|
|
143
146
|
@staticmethod
|
@@ -23,16 +23,17 @@ import hashlib
|
|
23
23
|
import hmac
|
24
24
|
import random
|
25
25
|
import time
|
26
|
-
from . import
|
26
|
+
from . import errors
|
27
27
|
from . import plumbing
|
28
|
+
from . import svc
|
28
29
|
|
29
30
|
# These defaults are taken from AWS. Customization of these values
|
30
31
|
# is a future step in the API.
|
31
32
|
DEFAULT_MAX_RETRIES = 3
|
32
33
|
DEFAULT_BASE_RETRY_DELAY = 0.0030 # 30 ms
|
33
34
|
DEFAULT_MAX_RETRY_DELAY = 300 # 300 seconds
|
34
|
-
API_VERSION = '2024-03-
|
35
|
-
USER_AGENT = 'strongdm-sdk-python/
|
35
|
+
API_VERSION = '2024-03-28'
|
36
|
+
USER_AGENT = 'strongdm-sdk-python/8.0.0'
|
36
37
|
|
37
38
|
|
38
39
|
class Client:
|
@@ -138,6 +139,7 @@ class Client:
|
|
138
139
|
Accounts are users that have access to strongDM. There are two types of accounts:
|
139
140
|
1. **Users:** humans who are authenticated through username and password or SSO.
|
140
141
|
2. **Service Accounts:** machines that are authenticated using a service token.
|
142
|
+
3. **Tokens** are access keys with permissions that can be used for authentication.
|
141
143
|
|
142
144
|
See `strongdm.svc.Accounts`.
|
143
145
|
'''
|
@@ -425,7 +427,8 @@ class Client:
|
|
425
427
|
return hmac.new(key, msg=msg_byte_string,
|
426
428
|
digestmod=hashlib.sha256).digest()
|
427
429
|
|
428
|
-
current_utc_date = datetime.datetime.
|
430
|
+
current_utc_date = datetime.datetime.now(
|
431
|
+
datetime.timezone.utc).strftime('%Y-%m-%d')
|
429
432
|
signing_key = hmac_digest(self.api_secret, current_utc_date.encode())
|
430
433
|
signing_key = hmac_digest(signing_key, b'sdm_api_v1')
|
431
434
|
|
@@ -450,9 +453,9 @@ class Client:
|
|
450
453
|
return False
|
451
454
|
if not isinstance(err, grpc.RpcError):
|
452
455
|
return True
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
+
porcelain_err = plumbing.convert_error_to_porcelain(err)
|
457
|
+
if (not self.expose_rate_limit_errors) and isinstance(
|
458
|
+
porcelain_err, errors.RateLimitError):
|
456
459
|
wait_until = porcelain_err.rate_limit.reset_at
|
457
460
|
now = datetime.datetime.now(datetime.timezone.utc)
|
458
461
|
sleep_for = (wait_until - now).total_seconds()
|
@@ -548,6 +551,7 @@ class SnapshotClient:
|
|
548
551
|
Accounts are users that have access to strongDM. There are two types of accounts:
|
549
552
|
1. **Users:** humans who are authenticated through username and password or SSO.
|
550
553
|
2. **Service Accounts:** machines that are authenticated using a service token.
|
554
|
+
3. **Tokens** are access keys with permissions that can be used for authentication.
|
551
555
|
|
552
556
|
See `strongdm.svc.SnapshotAccounts`.
|
553
557
|
'''
|
@@ -2153,19 +2153,27 @@ class AccountCreateResponse:
|
|
2153
2153
|
AccountCreateResponse reports how the Accounts were created in the system.
|
2154
2154
|
'''
|
2155
2155
|
__slots__ = [
|
2156
|
+
'access_key',
|
2156
2157
|
'account',
|
2157
2158
|
'meta',
|
2158
2159
|
'rate_limit',
|
2160
|
+
'secret_key',
|
2159
2161
|
'token',
|
2160
2162
|
]
|
2161
2163
|
|
2162
2164
|
def __init__(
|
2163
2165
|
self,
|
2166
|
+
access_key=None,
|
2164
2167
|
account=None,
|
2165
2168
|
meta=None,
|
2166
2169
|
rate_limit=None,
|
2170
|
+
secret_key=None,
|
2167
2171
|
token=None,
|
2168
2172
|
):
|
2173
|
+
self.access_key = access_key if access_key is not None else ''
|
2174
|
+
'''
|
2175
|
+
ID part of the API key.
|
2176
|
+
'''
|
2169
2177
|
self.account = account if account is not None else None
|
2170
2178
|
'''
|
2171
2179
|
The created Account.
|
@@ -2178,6 +2186,10 @@ class AccountCreateResponse:
|
|
2178
2186
|
'''
|
2179
2187
|
Rate limit information.
|
2180
2188
|
'''
|
2189
|
+
self.secret_key = secret_key if secret_key is not None else ''
|
2190
|
+
'''
|
2191
|
+
Secret part of the API key.
|
2192
|
+
'''
|
2181
2193
|
self.token = token if token is not None else ''
|
2182
2194
|
'''
|
2183
2195
|
The auth token generated for the Account. The Account will use this token to
|
@@ -2186,26 +2198,32 @@ class AccountCreateResponse:
|
|
2186
2198
|
|
2187
2199
|
def __repr__(self):
|
2188
2200
|
return '<sdm.AccountCreateResponse ' + \
|
2201
|
+
'access_key: ' + repr(self.access_key) + ' ' +\
|
2189
2202
|
'account: ' + repr(self.account) + ' ' +\
|
2190
2203
|
'meta: ' + repr(self.meta) + ' ' +\
|
2191
2204
|
'rate_limit: ' + repr(self.rate_limit) + ' ' +\
|
2205
|
+
'secret_key: ' + repr(self.secret_key) + ' ' +\
|
2192
2206
|
'token: ' + repr(self.token) + ' ' +\
|
2193
2207
|
'>'
|
2194
2208
|
|
2195
2209
|
def to_dict(self):
|
2196
2210
|
return {
|
2211
|
+
'access_key': self.access_key,
|
2197
2212
|
'account': self.account,
|
2198
2213
|
'meta': self.meta,
|
2199
2214
|
'rate_limit': self.rate_limit,
|
2215
|
+
'secret_key': self.secret_key,
|
2200
2216
|
'token': self.token,
|
2201
2217
|
}
|
2202
2218
|
|
2203
2219
|
@classmethod
|
2204
2220
|
def from_dict(cls, d):
|
2205
2221
|
return cls(
|
2222
|
+
access_key=d.get('access_key'),
|
2206
2223
|
account=d.get('account'),
|
2207
2224
|
meta=d.get('meta'),
|
2208
2225
|
rate_limit=d.get('rate_limit'),
|
2226
|
+
secret_key=d.get('secret_key'),
|
2209
2227
|
token=d.get('token'),
|
2210
2228
|
)
|
2211
2229
|
|
@@ -20826,6 +20844,113 @@ class Teradata:
|
|
20826
20844
|
)
|
20827
20845
|
|
20828
20846
|
|
20847
|
+
class Token:
|
20848
|
+
'''
|
20849
|
+
A Token is an account providing tokenized access for automation or integration use.
|
20850
|
+
Tokens include admin tokens, API keys, and SCIM tokens.
|
20851
|
+
'''
|
20852
|
+
__slots__ = [
|
20853
|
+
'account_type',
|
20854
|
+
'deadline',
|
20855
|
+
'duration',
|
20856
|
+
'id',
|
20857
|
+
'name',
|
20858
|
+
'permissions',
|
20859
|
+
'rekeyed',
|
20860
|
+
'suspended',
|
20861
|
+
'tags',
|
20862
|
+
]
|
20863
|
+
|
20864
|
+
def __init__(
|
20865
|
+
self,
|
20866
|
+
account_type=None,
|
20867
|
+
deadline=None,
|
20868
|
+
duration=None,
|
20869
|
+
id=None,
|
20870
|
+
name=None,
|
20871
|
+
permissions=None,
|
20872
|
+
rekeyed=None,
|
20873
|
+
suspended=None,
|
20874
|
+
tags=None,
|
20875
|
+
):
|
20876
|
+
self.account_type = account_type if account_type is not None else ''
|
20877
|
+
'''
|
20878
|
+
Corresponds to the type of token, e.g. api or admin-token.
|
20879
|
+
'''
|
20880
|
+
self.deadline = deadline if deadline is not None else None
|
20881
|
+
'''
|
20882
|
+
The timestamp when the Token will expire.
|
20883
|
+
'''
|
20884
|
+
self.duration = duration if duration is not None else None
|
20885
|
+
'''
|
20886
|
+
Duration from token creation to expiration.
|
20887
|
+
'''
|
20888
|
+
self.id = id if id is not None else ''
|
20889
|
+
'''
|
20890
|
+
Unique identifier of the Token.
|
20891
|
+
'''
|
20892
|
+
self.name = name if name is not None else ''
|
20893
|
+
'''
|
20894
|
+
Unique human-readable name of the Token.
|
20895
|
+
'''
|
20896
|
+
self.permissions = permissions if permissions is not None else []
|
20897
|
+
'''
|
20898
|
+
Permissions assigned to the token, e.g. role:create.
|
20899
|
+
'''
|
20900
|
+
self.rekeyed = rekeyed if rekeyed is not None else None
|
20901
|
+
'''
|
20902
|
+
The timestamp when the Token was last rekeyed.
|
20903
|
+
'''
|
20904
|
+
self.suspended = suspended if suspended is not None else False
|
20905
|
+
'''
|
20906
|
+
Reserved for future use. Always false for tokens.
|
20907
|
+
'''
|
20908
|
+
self.tags = tags if tags is not None else _porcelain_zero_value_tags()
|
20909
|
+
'''
|
20910
|
+
Tags is a map of key, value pairs.
|
20911
|
+
'''
|
20912
|
+
|
20913
|
+
def __repr__(self):
|
20914
|
+
return '<sdm.Token ' + \
|
20915
|
+
'account_type: ' + repr(self.account_type) + ' ' +\
|
20916
|
+
'deadline: ' + repr(self.deadline) + ' ' +\
|
20917
|
+
'duration: ' + repr(self.duration) + ' ' +\
|
20918
|
+
'id: ' + repr(self.id) + ' ' +\
|
20919
|
+
'name: ' + repr(self.name) + ' ' +\
|
20920
|
+
'permissions: ' + repr(self.permissions) + ' ' +\
|
20921
|
+
'rekeyed: ' + repr(self.rekeyed) + ' ' +\
|
20922
|
+
'suspended: ' + repr(self.suspended) + ' ' +\
|
20923
|
+
'tags: ' + repr(self.tags) + ' ' +\
|
20924
|
+
'>'
|
20925
|
+
|
20926
|
+
def to_dict(self):
|
20927
|
+
return {
|
20928
|
+
'account_type': self.account_type,
|
20929
|
+
'deadline': self.deadline,
|
20930
|
+
'duration': self.duration,
|
20931
|
+
'id': self.id,
|
20932
|
+
'name': self.name,
|
20933
|
+
'permissions': self.permissions,
|
20934
|
+
'rekeyed': self.rekeyed,
|
20935
|
+
'suspended': self.suspended,
|
20936
|
+
'tags': self.tags,
|
20937
|
+
}
|
20938
|
+
|
20939
|
+
@classmethod
|
20940
|
+
def from_dict(cls, d):
|
20941
|
+
return cls(
|
20942
|
+
account_type=d.get('account_type'),
|
20943
|
+
deadline=d.get('deadline'),
|
20944
|
+
duration=d.get('duration'),
|
20945
|
+
id=d.get('id'),
|
20946
|
+
name=d.get('name'),
|
20947
|
+
permissions=d.get('permissions'),
|
20948
|
+
rekeyed=d.get('rekeyed'),
|
20949
|
+
suspended=d.get('suspended'),
|
20950
|
+
tags=d.get('tags'),
|
20951
|
+
)
|
20952
|
+
|
20953
|
+
|
20829
20954
|
class Trino:
|
20830
20955
|
'''
|
20831
20956
|
Trino is currently unstable, and its API may change, or it may be removed,
|
@@ -964,6 +964,8 @@ def convert_account_to_plumbing(porcelain):
|
|
964
964
|
return plumbing
|
965
965
|
if isinstance(porcelain, models.Service):
|
966
966
|
plumbing.service.CopyFrom(convert_service_to_plumbing(porcelain))
|
967
|
+
if isinstance(porcelain, models.Token):
|
968
|
+
plumbing.token.CopyFrom(convert_token_to_plumbing(porcelain))
|
967
969
|
if isinstance(porcelain, models.User):
|
968
970
|
plumbing.user.CopyFrom(convert_user_to_plumbing(porcelain))
|
969
971
|
return plumbing
|
@@ -974,6 +976,8 @@ def convert_account_to_porcelain(plumbing):
|
|
974
976
|
return None
|
975
977
|
if plumbing.HasField('service'):
|
976
978
|
return convert_service_to_porcelain(plumbing.service)
|
979
|
+
if plumbing.HasField('token'):
|
980
|
+
return convert_token_to_porcelain(plumbing.token)
|
977
981
|
if plumbing.HasField('user'):
|
978
982
|
return convert_user_to_porcelain(plumbing.user)
|
979
983
|
raise errors.UnknownError(
|
@@ -1185,11 +1189,13 @@ def convert_account_create_response_to_porcelain(plumbing):
|
|
1185
1189
|
if plumbing is None:
|
1186
1190
|
return None
|
1187
1191
|
porcelain = models.AccountCreateResponse()
|
1192
|
+
porcelain.access_key = (plumbing.access_key)
|
1188
1193
|
porcelain.account = convert_account_to_porcelain(plumbing.account)
|
1189
1194
|
porcelain.meta = convert_create_response_metadata_to_porcelain(
|
1190
1195
|
plumbing.meta)
|
1191
1196
|
porcelain.rate_limit = convert_rate_limit_metadata_to_porcelain(
|
1192
1197
|
plumbing.rate_limit)
|
1198
|
+
porcelain.secret_key = (plumbing.secret_key)
|
1193
1199
|
porcelain.token = (plumbing.token)
|
1194
1200
|
return porcelain
|
1195
1201
|
|
@@ -1198,11 +1204,13 @@ def convert_account_create_response_to_plumbing(porcelain):
|
|
1198
1204
|
plumbing = AccountCreateResponse()
|
1199
1205
|
if porcelain is None:
|
1200
1206
|
return plumbing
|
1207
|
+
plumbing.access_key = (porcelain.access_key)
|
1201
1208
|
plumbing.account.CopyFrom(convert_account_to_plumbing(porcelain.account))
|
1202
1209
|
plumbing.meta.CopyFrom(
|
1203
1210
|
convert_create_response_metadata_to_plumbing(porcelain.meta))
|
1204
1211
|
plumbing.rate_limit.CopyFrom(
|
1205
1212
|
convert_rate_limit_metadata_to_plumbing(porcelain.rate_limit))
|
1213
|
+
plumbing.secret_key = (porcelain.secret_key)
|
1206
1214
|
plumbing.token = (porcelain.token)
|
1207
1215
|
return plumbing
|
1208
1216
|
|
@@ -10406,6 +10414,49 @@ def convert_repeated_teradata_to_porcelain(plumbings):
|
|
10406
10414
|
return [convert_teradata_to_porcelain(plumbing) for plumbing in plumbings]
|
10407
10415
|
|
10408
10416
|
|
10417
|
+
def convert_token_to_porcelain(plumbing):
|
10418
|
+
if plumbing is None:
|
10419
|
+
return None
|
10420
|
+
porcelain = models.Token()
|
10421
|
+
porcelain.account_type = (plumbing.account_type)
|
10422
|
+
porcelain.deadline = convert_timestamp_to_porcelain(plumbing.deadline)
|
10423
|
+
porcelain.duration = convert_duration_to_porcelain(plumbing.duration)
|
10424
|
+
porcelain.id = (plumbing.id)
|
10425
|
+
porcelain.name = (plumbing.name)
|
10426
|
+
porcelain.permissions = (plumbing.permissions)
|
10427
|
+
porcelain.rekeyed = convert_timestamp_to_porcelain(plumbing.rekeyed)
|
10428
|
+
porcelain.suspended = (plumbing.suspended)
|
10429
|
+
porcelain.tags = convert_tags_to_porcelain(plumbing.tags)
|
10430
|
+
return porcelain
|
10431
|
+
|
10432
|
+
|
10433
|
+
def convert_token_to_plumbing(porcelain):
|
10434
|
+
plumbing = Token()
|
10435
|
+
if porcelain is None:
|
10436
|
+
return plumbing
|
10437
|
+
plumbing.account_type = (porcelain.account_type)
|
10438
|
+
plumbing.deadline.CopyFrom(
|
10439
|
+
convert_timestamp_to_plumbing(porcelain.deadline))
|
10440
|
+
plumbing.duration.CopyFrom(convert_duration_to_plumbing(
|
10441
|
+
porcelain.duration))
|
10442
|
+
plumbing.id = (porcelain.id)
|
10443
|
+
plumbing.name = (porcelain.name)
|
10444
|
+
del plumbing.permissions[:]
|
10445
|
+
plumbing.permissions.extend((porcelain.permissions))
|
10446
|
+
plumbing.rekeyed.CopyFrom(convert_timestamp_to_plumbing(porcelain.rekeyed))
|
10447
|
+
plumbing.suspended = (porcelain.suspended)
|
10448
|
+
plumbing.tags.CopyFrom(convert_tags_to_plumbing(porcelain.tags))
|
10449
|
+
return plumbing
|
10450
|
+
|
10451
|
+
|
10452
|
+
def convert_repeated_token_to_plumbing(porcelains):
|
10453
|
+
return [convert_token_to_plumbing(porcelain) for porcelain in porcelains]
|
10454
|
+
|
10455
|
+
|
10456
|
+
def convert_repeated_token_to_porcelain(plumbings):
|
10457
|
+
return [convert_token_to_porcelain(plumbing) for plumbing in plumbings]
|
10458
|
+
|
10459
|
+
|
10409
10460
|
def convert_trino_to_porcelain(plumbing):
|
10410
10461
|
if plumbing is None:
|
10411
10462
|
return None
|
@@ -925,8 +925,10 @@ class Accounts:
|
|
925
925
|
Accounts are users that have access to strongDM. There are two types of accounts:
|
926
926
|
1. **Users:** humans who are authenticated through username and password or SSO.
|
927
927
|
2. **Service Accounts:** machines that are authenticated using a service token.
|
928
|
+
3. **Tokens** are access keys with permissions that can be used for authentication.
|
928
929
|
See:
|
929
930
|
`strongdm.models.Service`
|
931
|
+
`strongdm.models.Token`
|
930
932
|
`strongdm.models.User`
|
931
933
|
'''
|
932
934
|
def __init__(self, channel, client):
|
@@ -958,12 +960,14 @@ class Accounts:
|
|
958
960
|
break
|
959
961
|
|
960
962
|
resp = models.AccountCreateResponse()
|
963
|
+
resp.access_key = (plumbing_response.access_key)
|
961
964
|
resp.account = plumbing.convert_account_to_porcelain(
|
962
965
|
plumbing_response.account)
|
963
966
|
resp.meta = plumbing.convert_create_response_metadata_to_porcelain(
|
964
967
|
plumbing_response.meta)
|
965
968
|
resp.rate_limit = plumbing.convert_rate_limit_metadata_to_porcelain(
|
966
969
|
plumbing_response.rate_limit)
|
970
|
+
resp.secret_key = (plumbing_response.secret_key)
|
967
971
|
resp.token = (plumbing_response.token)
|
968
972
|
return resp
|
969
973
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: strongdm
|
3
|
-
Version:
|
3
|
+
Version: 8.0.0
|
4
4
|
Summary: strongDM SDK for the Python programming language.
|
5
5
|
Home-page: https://github.com/strongdm/strongdm-sdk-python
|
6
6
|
Author: strongDM Team
|
7
7
|
Author-email: sdk-feedback@strongdm.com
|
8
8
|
License: apache-2.0
|
9
|
-
Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/
|
9
|
+
Download-URL: https://github.com/strongdm/strongdm-sdk-python/archive/v8.0.0.tar.gz
|
10
10
|
Keywords: strongDM,sdm,api,automation,security,audit,database,server,ssh,rdp
|
11
11
|
Platform: UNKNOWN
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|