strongdm 15.40.0 → 15.43.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df977ca5d3481e8abe3f2eb32fbe511ce0837b7af222e7775a89ad23623d1e59
4
- data.tar.gz: 066606613c73e91d210c70336929d9f9bd58b3cc59c3e57b7198ab57ad75e207
3
+ metadata.gz: 07b05d002ea762434e9a42b6da278425d8bb2adf661df165169151ead7aedbda
4
+ data.tar.gz: fff4b6adece624583f2ccc960359612db92edde0a6af9ada9468013740cc5f16
5
5
  SHA512:
6
- metadata.gz: 16a2dede8112181c139b1a5cecf731bac27d459bd63fe43f5f5ab65acb49c53c3d989950eb37997cf0423c1b13bcf1aeccb6238b38faecafaa22f8fd4e2f8ca8
7
- data.tar.gz: 45781d64a70535e86e9a2b998cde84349beb2086e3eb09030760468b1eef38a0a2271e4e4bfb0ab0cc135c4976e6418085c8aa45a17050bd88dcd40142bef725
6
+ metadata.gz: 63a76d68d110c41c6c7838a4927186c8606a0c61c4eacfa2d47a729e4e0754561331e70d80a5e1f2916caae212619296c42bf38a15f0c07bc8d641d122fbebb4
7
+ data.tar.gz: 22e7bb7ce4c40f7935ef05feb46d1dbc2e41a9d2ccb2fa6526743dec30e55c5fe6819f9502e4c0d790b88478162ba10588372fde8691d6f2183db6ed60eb49f0
data/.git/ORIG_HEAD CHANGED
@@ -1 +1 @@
1
- 740f705c286a25c2abae5a44b52fe330cc4e3e71
1
+ b23f0912dbe900e5bd24222f9971c7820ddf128d
data/.git/index CHANGED
Binary file
data/.git/logs/HEAD CHANGED
@@ -1,3 +1,3 @@
1
- 0000000000000000000000000000000000000000 740f705c286a25c2abae5a44b52fe330cc4e3e71 root <root@3304dca81eb3.(none)> 1765583830 +0000 clone: from github.com:strongdm/strongdm-sdk-ruby.git
2
- 740f705c286a25c2abae5a44b52fe330cc4e3e71 740f705c286a25c2abae5a44b52fe330cc4e3e71 root <root@3304dca81eb3.(none)> 1765583830 +0000 checkout: moving from master to master
3
- 740f705c286a25c2abae5a44b52fe330cc4e3e71 b20e3c16d138fc17c80e82311c7613a915bc3569 root <root@3304dca81eb3.(none)> 1765583830 +0000 merge origin/development: Fast-forward
1
+ 0000000000000000000000000000000000000000 b23f0912dbe900e5bd24222f9971c7820ddf128d root <root@cbe5b8a77e04.(none)> 1766504191 +0000 clone: from github.com:strongdm/strongdm-sdk-ruby.git
2
+ b23f0912dbe900e5bd24222f9971c7820ddf128d b23f0912dbe900e5bd24222f9971c7820ddf128d root <root@cbe5b8a77e04.(none)> 1766504191 +0000 checkout: moving from master to master
3
+ b23f0912dbe900e5bd24222f9971c7820ddf128d 1170439941e521c29339b4d2314cae0e1526759e root <root@cbe5b8a77e04.(none)> 1766504191 +0000 merge origin/development: Fast-forward
@@ -1,2 +1,2 @@
1
- 0000000000000000000000000000000000000000 740f705c286a25c2abae5a44b52fe330cc4e3e71 root <root@3304dca81eb3.(none)> 1765583830 +0000 clone: from github.com:strongdm/strongdm-sdk-ruby.git
2
- 740f705c286a25c2abae5a44b52fe330cc4e3e71 b20e3c16d138fc17c80e82311c7613a915bc3569 root <root@3304dca81eb3.(none)> 1765583830 +0000 merge origin/development: Fast-forward
1
+ 0000000000000000000000000000000000000000 b23f0912dbe900e5bd24222f9971c7820ddf128d root <root@cbe5b8a77e04.(none)> 1766504191 +0000 clone: from github.com:strongdm/strongdm-sdk-ruby.git
2
+ b23f0912dbe900e5bd24222f9971c7820ddf128d 1170439941e521c29339b4d2314cae0e1526759e root <root@cbe5b8a77e04.(none)> 1766504191 +0000 merge origin/development: Fast-forward
@@ -1 +1 @@
1
- 0000000000000000000000000000000000000000 740f705c286a25c2abae5a44b52fe330cc4e3e71 root <root@3304dca81eb3.(none)> 1765583830 +0000 clone: from github.com:strongdm/strongdm-sdk-ruby.git
1
+ 0000000000000000000000000000000000000000 b23f0912dbe900e5bd24222f9971c7820ddf128d root <root@cbe5b8a77e04.(none)> 1766504191 +0000 clone: from github.com:strongdm/strongdm-sdk-ruby.git
data/.git/packed-refs CHANGED
@@ -1,6 +1,6 @@
1
1
  # pack-refs with: peeled fully-peeled sorted
2
- b20e3c16d138fc17c80e82311c7613a915bc3569 refs/remotes/origin/development
3
- 740f705c286a25c2abae5a44b52fe330cc4e3e71 refs/remotes/origin/master
2
+ 1170439941e521c29339b4d2314cae0e1526759e refs/remotes/origin/development
3
+ b23f0912dbe900e5bd24222f9971c7820ddf128d refs/remotes/origin/master
4
4
  2e4fe8087177ddea9b3991ca499f758384839c89 refs/tags/untagged-84fd83a4484c785cce63
5
5
  04f604866214fab4d5663b5171a3e596331577bd refs/tags/v0.9.4
6
6
  6f9a7b75b345c65fb554884907b7060680c807b7 refs/tags/v0.9.5
@@ -127,6 +127,8 @@ e2a4215bd3bbfb822423e11e81b9ad47bef03840 refs/tags/v15.36.0
127
127
  6b720eb84b5b501adf7adbf58f6be078888619e9 refs/tags/v15.37.0
128
128
  740f705c286a25c2abae5a44b52fe330cc4e3e71 refs/tags/v15.39.0
129
129
  cf3b15b82cb0c4229609c07c870c6cb4fd38ef75 refs/tags/v15.4.0
130
+ b20e3c16d138fc17c80e82311c7613a915bc3569 refs/tags/v15.40.0
131
+ b23f0912dbe900e5bd24222f9971c7820ddf128d refs/tags/v15.41.0
130
132
  0be2c5e7f7a90c49077548cb3a9bce234219b9f0 refs/tags/v15.5.0
131
133
  4b9cd43c5dda3f369b82b6a56132a5470ff9ff53 refs/tags/v15.6.0
132
134
  6e8e9210b26f02ebe925b8e81909ba42985cfde7 refs/tags/v15.7.0
@@ -1 +1 @@
1
- b20e3c16d138fc17c80e82311c7613a915bc3569
1
+ 1170439941e521c29339b4d2314cae0e1526759e
data/lib/constants.rb CHANGED
@@ -333,6 +333,7 @@ module SDM
333
333
  RESOURCE_LOCKED = "user locked a resource"
334
334
  RESOURCE_UNLOCKED = "user unlocked a resource"
335
335
  RESOURCE_FORCE_UNLOCKED = "admin force-unlocked a resource"
336
+ RESOURCE_LOCK_REJECTED = "user lock rejected for a resource"
336
337
  CONCURRENT_AUTHENTICATION_REVOKED_PER_ORG_SETTING = "concurrent authentications revoked per organization settings"
337
338
  PEERING_GROUP_TOGGLED = "peering group toggled"
338
339
  PEERING_GROUP_CREATED = "peering group created"
@@ -72,6 +72,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
72
72
  add_message "v1.PrivilegesMessage" do
73
73
  optional :kubernetes, :message, 1, "v1.KubernetesPrivileges"
74
74
  optional :entraGroups, :message, 2, "v1.EntraGroupPrivileges"
75
+ optional :oktaGroups, :message, 3, "v1.OktaGroupPrivileges"
75
76
  end
76
77
  add_message "v1.KubernetesPrivileges" do
77
78
  repeated :groups, :string, 1
@@ -79,6 +80,9 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
79
80
  add_message "v1.EntraGroupPrivileges" do
80
81
  repeated :groups, :string, 1
81
82
  end
83
+ add_message "v1.OktaGroupPrivileges" do
84
+ repeated :groups, :string, 1
85
+ end
82
86
  add_message "v1.AccessRequestConfig" do
83
87
  optional :resource_id, :string, 1
84
88
  optional :reason, :string, 2
@@ -104,6 +108,7 @@ module V1
104
108
  PrivilegesMessage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.PrivilegesMessage").msgclass
105
109
  KubernetesPrivileges = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.KubernetesPrivileges").msgclass
106
110
  EntraGroupPrivileges = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.EntraGroupPrivileges").msgclass
111
+ OktaGroupPrivileges = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.OktaGroupPrivileges").msgclass
107
112
  AccessRequestConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.AccessRequestConfig").msgclass
108
113
  RequestAccessRequestConfig = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("v1.RequestAccessRequestConfig").msgclass
109
114
  end
@@ -1962,6 +1962,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
1962
1962
  optional :allow_deprecated_key_exchanges, :bool, 6
1963
1963
  optional :hostname, :string, 1
1964
1964
  optional :key_type, :string, 8
1965
+ optional :lock_required, :bool, 11
1965
1966
  optional :port, :int32, 3
1966
1967
  optional :port_forwarding, :bool, 5
1967
1968
  optional :port_override, :int32, 7
@@ -1983,6 +1984,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
1983
1984
  optional :identity_alias_healthcheck_username, :string, 8
1984
1985
  optional :identity_set_id, :string, 7
1985
1986
  optional :key_type, :string, 9
1987
+ optional :lock_required, :bool, 13
1986
1988
  optional :port, :int32, 3
1987
1989
  optional :port_forwarding, :bool, 4
1988
1990
  optional :port_override, :int32, 6
@@ -2002,6 +2004,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
2002
2004
  optional :hostname, :string, 1
2003
2005
  optional :identity_alias_healthcheck_username, :string, 11
2004
2006
  optional :identity_set_id, :string, 10
2007
+ optional :lock_required, :bool, 12
2005
2008
  optional :port, :int32, 3
2006
2009
  optional :port_forwarding, :bool, 5
2007
2010
  optional :port_override, :int32, 7
@@ -2020,6 +2023,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
2020
2023
  optional :subdomain, :string, 32775
2021
2024
  optional :allow_deprecated_key_exchanges, :bool, 6
2022
2025
  optional :hostname, :string, 1
2026
+ optional :lock_required, :bool, 10
2023
2027
  optional :password, :string, 4
2024
2028
  optional :port, :int32, 3
2025
2029
  optional :port_forwarding, :bool, 5
data/lib/grpc/plumbing.rb CHANGED
@@ -16694,6 +16694,7 @@ module SDM
16694
16694
  porcelain.hostname = (plumbing.hostname)
16695
16695
  porcelain.id = (plumbing.id)
16696
16696
  porcelain.key_type = (plumbing.key_type)
16697
+ porcelain.lock_required = (plumbing.lock_required)
16697
16698
  porcelain.name = (plumbing.name)
16698
16699
  porcelain.port = (plumbing.port)
16699
16700
  porcelain.port_forwarding = (plumbing.port_forwarding)
@@ -16719,6 +16720,7 @@ module SDM
16719
16720
  plumbing.hostname = (porcelain.hostname)
16720
16721
  plumbing.id = (porcelain.id)
16721
16722
  plumbing.key_type = (porcelain.key_type)
16723
+ plumbing.lock_required = (porcelain.lock_required)
16722
16724
  plumbing.name = (porcelain.name)
16723
16725
  plumbing.port = (porcelain.port)
16724
16726
  plumbing.port_forwarding = (porcelain.port_forwarding)
@@ -16762,6 +16764,7 @@ module SDM
16762
16764
  porcelain.identity_alias_healthcheck_username = (plumbing.identity_alias_healthcheck_username)
16763
16765
  porcelain.identity_set_id = (plumbing.identity_set_id)
16764
16766
  porcelain.key_type = (plumbing.key_type)
16767
+ porcelain.lock_required = (plumbing.lock_required)
16765
16768
  porcelain.name = (plumbing.name)
16766
16769
  porcelain.port = (plumbing.port)
16767
16770
  porcelain.port_forwarding = (plumbing.port_forwarding)
@@ -16788,6 +16791,7 @@ module SDM
16788
16791
  plumbing.identity_alias_healthcheck_username = (porcelain.identity_alias_healthcheck_username)
16789
16792
  plumbing.identity_set_id = (porcelain.identity_set_id)
16790
16793
  plumbing.key_type = (porcelain.key_type)
16794
+ plumbing.lock_required = (porcelain.lock_required)
16791
16795
  plumbing.name = (porcelain.name)
16792
16796
  plumbing.port = (porcelain.port)
16793
16797
  plumbing.port_forwarding = (porcelain.port_forwarding)
@@ -16829,6 +16833,7 @@ module SDM
16829
16833
  porcelain.id = (plumbing.id)
16830
16834
  porcelain.identity_alias_healthcheck_username = (plumbing.identity_alias_healthcheck_username)
16831
16835
  porcelain.identity_set_id = (plumbing.identity_set_id)
16836
+ porcelain.lock_required = (plumbing.lock_required)
16832
16837
  porcelain.name = (plumbing.name)
16833
16838
  porcelain.port = (plumbing.port)
16834
16839
  porcelain.port_forwarding = (plumbing.port_forwarding)
@@ -16855,6 +16860,7 @@ module SDM
16855
16860
  plumbing.id = (porcelain.id)
16856
16861
  plumbing.identity_alias_healthcheck_username = (porcelain.identity_alias_healthcheck_username)
16857
16862
  plumbing.identity_set_id = (porcelain.identity_set_id)
16863
+ plumbing.lock_required = (porcelain.lock_required)
16858
16864
  plumbing.name = (porcelain.name)
16859
16865
  plumbing.port = (porcelain.port)
16860
16866
  plumbing.port_forwarding = (porcelain.port_forwarding)
@@ -16895,6 +16901,7 @@ module SDM
16895
16901
  porcelain.healthy = (plumbing.healthy)
16896
16902
  porcelain.hostname = (plumbing.hostname)
16897
16903
  porcelain.id = (plumbing.id)
16904
+ porcelain.lock_required = (plumbing.lock_required)
16898
16905
  porcelain.name = (plumbing.name)
16899
16906
  porcelain.password = (plumbing.password)
16900
16907
  porcelain.port = (plumbing.port)
@@ -16919,6 +16926,7 @@ module SDM
16919
16926
  plumbing.healthy = (porcelain.healthy)
16920
16927
  plumbing.hostname = (porcelain.hostname)
16921
16928
  plumbing.id = (porcelain.id)
16929
+ plumbing.lock_required = (porcelain.lock_required)
16922
16930
  plumbing.name = (porcelain.name)
16923
16931
  plumbing.password = (porcelain.password)
16924
16932
  plumbing.port = (porcelain.port)
@@ -0,0 +1,200 @@
1
+ # Copyright 2020 StrongDM Inc
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ # @internal Code generated by protogen. DO NOT EDIT.
17
+
18
+ require "openssl"
19
+ require_relative "./grpc/plumbing"
20
+
21
+ module SDM
22
+ # MethodInterceptor provides a generic hook system for modifying
23
+ # requests and responses before/after gRPC calls
24
+ class MethodInterceptor
25
+ def initialize(client)
26
+ @client = client
27
+ @before_hooks = {}
28
+ @after_hooks = {}
29
+ end
30
+
31
+ # Register a hook to run before a method call
32
+ # method_name: "ServiceName.MethodName" (e.g., "ManagedSecrets.Create")
33
+ # block: receives (service_instance, request) and should return modified request
34
+ def before(method_name, &block)
35
+ @before_hooks[method_name] = block
36
+ end
37
+
38
+ # Register a hook to run after a method call
39
+ # method_name: "ServiceName.MethodName"
40
+ # block: receives (service_instance, request, response) and should return modified response
41
+ def after(method_name, &block)
42
+ @after_hooks[method_name] = block
43
+ end
44
+
45
+ # Execute before hooks for a method
46
+ def execute_before(method_name, service_instance, request)
47
+ hook = @before_hooks[method_name]
48
+ return request unless hook
49
+ hook.call(service_instance, request)
50
+ end
51
+
52
+ # Execute after hooks for a method
53
+ def execute_after(method_name, service_instance, request, response)
54
+ hook = @after_hooks[method_name]
55
+ return response unless hook
56
+ hook.call(service_instance, request, response)
57
+ end
58
+ end
59
+
60
+ # SecretEncryptionInterceptor implements encryption for managed secrets
61
+ class SecretEncryptionInterceptor
62
+ def initialize(client)
63
+ @client = client
64
+ @public_key_cache = {}
65
+ @private_key = nil
66
+ end
67
+
68
+ # Lazy-load private key for retrievals
69
+ def private_key
70
+ @private_key ||= OpenSSL::PKey::RSA.new(4096)
71
+ end
72
+
73
+ # Cache a secret engine's public key
74
+ def cache_public_key(engine_id, public_key_pem)
75
+ return if public_key_pem.nil? || public_key_pem.empty?
76
+ @public_key_cache[engine_id] = OpenSSL::PKey::RSA.new(public_key_pem)
77
+ end
78
+
79
+ # Get cached public key
80
+ def get_public_key(engine_id)
81
+ @public_key_cache[engine_id]
82
+ end
83
+
84
+ # Encrypt data using RSA-OAEP with SHA256
85
+ def encrypt(public_key, plaintext)
86
+ return plaintext if plaintext.nil? || plaintext.empty?
87
+ public_key.encrypt(plaintext, rsa_padding_mode: "oaep", rsa_oaep_md: "sha256", rsa_mgf1_md: "sha256")
88
+ end
89
+
90
+ # Decrypt data using RSA-OAEP with SHA256
91
+ def decrypt(ciphertext)
92
+ return ciphertext if ciphertext.nil? || ciphertext.empty?
93
+ private_key.decrypt(ciphertext, rsa_padding_mode: "oaep", rsa_oaep_md: "sha256", rsa_mgf1_md: "sha256")
94
+ end
95
+
96
+ # Export public key in PEM format
97
+ def export_public_key
98
+ private_key.public_key.to_pem
99
+ end
100
+
101
+ # Setup hooks on the interceptor
102
+ def setup(interceptor)
103
+ setup_managed_secrets_hooks(interceptor)
104
+ setup_secret_engines_hooks(interceptor)
105
+ end
106
+
107
+ private
108
+
109
+ def setup_managed_secrets_hooks(interceptor)
110
+ # Hook for ManagedSecrets.Create - encrypt before sending
111
+ interceptor.before("ManagedSecrets.Create") do |service, req|
112
+ secret = req.managed_secret
113
+ if secret && !secret.value.nil? && !secret.value.empty? && !secret.secret_engine_id.nil?
114
+ # Try to get public key from cache or fetch it
115
+ pub_key = get_public_key(secret.secret_engine_id)
116
+ if pub_key.nil?
117
+ begin
118
+ @client.secret_engines.get(secret.secret_engine_id)
119
+ pub_key = get_public_key(secret.secret_engine_id)
120
+ rescue
121
+ # If fetch fails, let server handle it
122
+ end
123
+ end
124
+
125
+ # Encrypt if we have the key
126
+ if pub_key
127
+ secret.value = encrypt(pub_key, secret.value)
128
+ end
129
+ end
130
+ req
131
+ end
132
+
133
+ # Hook for ManagedSecrets.Update - encrypt before sending
134
+ interceptor.before("ManagedSecrets.Update") do |service, req|
135
+ secret = req.managed_secret
136
+ if secret && !secret.value.nil? && !secret.value.empty? && !secret.secret_engine_id.nil?
137
+ pub_key = get_public_key(secret.secret_engine_id)
138
+ if pub_key.nil?
139
+ begin
140
+ @client.secret_engines.get(secret.secret_engine_id)
141
+ pub_key = get_public_key(secret.secret_engine_id)
142
+ rescue
143
+ # If fetch fails, let server handle it
144
+ end
145
+ end
146
+
147
+ if pub_key
148
+ secret.value = encrypt(pub_key, secret.value)
149
+ end
150
+ end
151
+ req
152
+ end
153
+
154
+ # Hook for ManagedSecrets.Retrieve - add public key and decrypt response
155
+ interceptor.before("ManagedSecrets.Retrieve") do |service, req|
156
+ if req.public_key.nil? || req.public_key.empty?
157
+ req.public_key = export_public_key
158
+ end
159
+ req
160
+ end
161
+
162
+ interceptor.after("ManagedSecrets.Retrieve") do |service, req, resp|
163
+ # Only decrypt if we provided the public key
164
+ if req.public_key == export_public_key
165
+ secret = resp.managed_secret
166
+ if secret && !secret.value.nil? && !secret.value.empty?
167
+ secret.value = decrypt(secret.value)
168
+ end
169
+ end
170
+ resp
171
+ end
172
+ end
173
+
174
+ def setup_secret_engines_hooks(interceptor)
175
+ # Hook for SecretEngines.Get - cache public key after response
176
+ interceptor.after("SecretEngines.Get") do |service, req, resp|
177
+ engine = Plumbing::convert_secret_engine_to_porcelain(resp.secret_engine)
178
+ if engine && !engine.id.nil? && !engine.public_key.nil?
179
+ cache_public_key(engine.id, engine.public_key)
180
+ end
181
+ resp
182
+ end
183
+ end
184
+ end
185
+
186
+ # EnumeratorInterceptor provides utilities for wrapping enumerators with hooks
187
+ module EnumeratorInterceptor
188
+ # Wraps an enumerator to cache secret engine public keys
189
+ def self.wrap_secret_engine_list(enumerator, encryption_interceptor)
190
+ Enumerator.new do |yielder|
191
+ enumerator.each do |engine|
192
+ if engine && !engine.id.nil? && !engine.public_key.nil?
193
+ encryption_interceptor.cache_public_key(engine.id, engine.public_key)
194
+ end
195
+ yielder << engine
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -15353,6 +15353,8 @@ module SDM
15353
15353
  attr_accessor :id
15354
15354
  # The key type to use e.g. rsa-2048 or ed25519
15355
15355
  attr_accessor :key_type
15356
+ # When set, require a resource lock to access the resource to ensure it can only be used by one user at a time.
15357
+ attr_accessor :lock_required
15356
15358
  # Unique human-readable name of the Resource.
15357
15359
  attr_accessor :name
15358
15360
  # The port to dial to initiate a connection from the egress node to this resource.
@@ -15382,6 +15384,7 @@ module SDM
15382
15384
  hostname: nil,
15383
15385
  id: nil,
15384
15386
  key_type: nil,
15387
+ lock_required: nil,
15385
15388
  name: nil,
15386
15389
  port: nil,
15387
15390
  port_forwarding: nil,
@@ -15400,6 +15403,7 @@ module SDM
15400
15403
  @hostname = hostname == nil ? "" : hostname
15401
15404
  @id = id == nil ? "" : id
15402
15405
  @key_type = key_type == nil ? "" : key_type
15406
+ @lock_required = lock_required == nil ? false : lock_required
15403
15407
  @name = name == nil ? "" : name
15404
15408
  @port = port == nil ? 0 : port
15405
15409
  @port_forwarding = port_forwarding == nil ? false : port_forwarding
@@ -15440,6 +15444,8 @@ module SDM
15440
15444
  attr_accessor :identity_set_id
15441
15445
  # The key type to use e.g. rsa-2048 or ed25519
15442
15446
  attr_accessor :key_type
15447
+ # When set, require a resource lock to access the resource to ensure it can only be used by one user at a time.
15448
+ attr_accessor :lock_required
15443
15449
  # Unique human-readable name of the Resource.
15444
15450
  attr_accessor :name
15445
15451
  # The port to dial to initiate a connection from the egress node to this resource.
@@ -15469,6 +15475,7 @@ module SDM
15469
15475
  identity_alias_healthcheck_username: nil,
15470
15476
  identity_set_id: nil,
15471
15477
  key_type: nil,
15478
+ lock_required: nil,
15472
15479
  name: nil,
15473
15480
  port: nil,
15474
15481
  port_forwarding: nil,
@@ -15488,6 +15495,7 @@ module SDM
15488
15495
  @identity_alias_healthcheck_username = identity_alias_healthcheck_username == nil ? "" : identity_alias_healthcheck_username
15489
15496
  @identity_set_id = identity_set_id == nil ? "" : identity_set_id
15490
15497
  @key_type = key_type == nil ? "" : key_type
15498
+ @lock_required = lock_required == nil ? false : lock_required
15491
15499
  @name = name == nil ? "" : name
15492
15500
  @port = port == nil ? 0 : port
15493
15501
  @port_forwarding = port_forwarding == nil ? false : port_forwarding
@@ -15525,6 +15533,8 @@ module SDM
15525
15533
  attr_accessor :identity_alias_healthcheck_username
15526
15534
  # The ID of the identity set to use for identity connections.
15527
15535
  attr_accessor :identity_set_id
15536
+ # When set, require a resource lock to access the resource to ensure it can only be used by one user at a time.
15537
+ attr_accessor :lock_required
15528
15538
  # Unique human-readable name of the Resource.
15529
15539
  attr_accessor :name
15530
15540
  # The port to dial to initiate a connection from the egress node to this resource.
@@ -15555,6 +15565,7 @@ module SDM
15555
15565
  id: nil,
15556
15566
  identity_alias_healthcheck_username: nil,
15557
15567
  identity_set_id: nil,
15568
+ lock_required: nil,
15558
15569
  name: nil,
15559
15570
  port: nil,
15560
15571
  port_forwarding: nil,
@@ -15574,6 +15585,7 @@ module SDM
15574
15585
  @id = id == nil ? "" : id
15575
15586
  @identity_alias_healthcheck_username = identity_alias_healthcheck_username == nil ? "" : identity_alias_healthcheck_username
15576
15587
  @identity_set_id = identity_set_id == nil ? "" : identity_set_id
15588
+ @lock_required = lock_required == nil ? false : lock_required
15577
15589
  @name = name == nil ? "" : name
15578
15590
  @port = port == nil ? 0 : port
15579
15591
  @port_forwarding = port_forwarding == nil ? false : port_forwarding
@@ -15608,6 +15620,8 @@ module SDM
15608
15620
  attr_accessor :hostname
15609
15621
  # Unique identifier of the Resource.
15610
15622
  attr_accessor :id
15623
+ # When set, require a resource lock to access the resource to ensure it can only be used by one user at a time.
15624
+ attr_accessor :lock_required
15611
15625
  # Unique human-readable name of the Resource.
15612
15626
  attr_accessor :name
15613
15627
  # The password to authenticate with.
@@ -15636,6 +15650,7 @@ module SDM
15636
15650
  healthy: nil,
15637
15651
  hostname: nil,
15638
15652
  id: nil,
15653
+ lock_required: nil,
15639
15654
  name: nil,
15640
15655
  password: nil,
15641
15656
  port: nil,
@@ -15653,6 +15668,7 @@ module SDM
15653
15668
  @healthy = healthy == nil ? false : healthy
15654
15669
  @hostname = hostname == nil ? "" : hostname
15655
15670
  @id = id == nil ? "" : id
15671
+ @lock_required = lock_required == nil ? false : lock_required
15656
15672
  @name = name == nil ? "" : name
15657
15673
  @password = password == nil ? "" : password
15658
15674
  @port = port == nil ? 0 : port
data/lib/strongdm.rb CHANGED
@@ -16,6 +16,7 @@
16
16
  # @internal Code generated by protogen. DO NOT EDIT.
17
17
 
18
18
  require_relative "./svc"
19
+ require_relative "./interceptors"
19
20
  require "base64"
20
21
  require "grpc"
21
22
  require "openssl"
@@ -30,7 +31,7 @@ module SDM #:nodoc:
30
31
  DEFAULT_RETRY_FACTOR = 1.6
31
32
  DEFAULT_RETRY_JITTER = 0.2
32
33
  API_VERSION = "2025-04-14"
33
- USER_AGENT = "strongdm-sdk-ruby/15.40.0"
34
+ USER_AGENT = "strongdm-sdk-ruby/15.43.0"
34
35
  private_constant :DEFAULT_BASE_RETRY_DELAY, :DEFAULT_MAX_RETRY_DELAY, :DEFAULT_RETRY_FACTOR, :DEFAULT_RETRY_JITTER, :API_VERSION, :USER_AGENT
35
36
 
36
37
  # Creates a new strongDM API client.
@@ -47,6 +48,10 @@ module SDM #:nodoc:
47
48
  @page_limit = page_limit
48
49
  @retry_rate_limit_errors = retry_rate_limit_errors
49
50
  @snapshot_time = nil
51
+ # Initialize method interceptor for request/response hooks
52
+ @interceptor = MethodInterceptor.new(self)
53
+ @encryption_interceptor = SecretEncryptionInterceptor.new(self)
54
+ @encryption_interceptor.setup(@interceptor)
50
55
  begin
51
56
  if insecure
52
57
  @channel = GRPC::Core::Channel.new(host, {}, :this_channel_is_insecure)
@@ -234,6 +239,8 @@ module SDM #:nodoc:
234
239
  attr_reader :api_access_key
235
240
  # Optional timestamp at which to provide historical data
236
241
  attr_reader :snapshot_time
242
+ # Method interceptor for request/response hooks (read-only).
243
+ attr_reader :interceptor
237
244
  # AccessRequests are requests for access to a resource that may match a Workflow.
238
245
  #
239
246
  # See {AccessRequests}.