bitwarden-sdk-secrets 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/auth.rb +16 -0
- data/lib/bitwarden-sdk-secrets.rb +5 -9
- data/lib/extended_schemas/schemas.rb +16 -2
- data/lib/linux-x64/libbitwarden_c.so +0 -0
- data/lib/macos-arm64/libbitwarden_c.dylib +0 -0
- data/lib/macos-x64/libbitwarden_c.dylib +0 -0
- data/lib/projects.rb +4 -4
- data/lib/schemas.rb +314 -269
- data/lib/secrets.rb +19 -3
- data/lib/version.rb +1 -1
- data/lib/windows-x64/bitwarden_c.dll +0 -0
- data/sig/auth.rbs +9 -0
- data/sig/bitwarden-sdk-secrets.rbs +39 -0
- data/sig/bitwarden_error.rbs +5 -0
- data/sig/bitwarden_lib.rbs +7 -0
- data/sig/command_runner.rbs +11 -3
- data/sig/projects.rbs +25 -0
- data/sig/secrets.rbs +29 -0
- data/sig/version.rbs +3 -0
- metadata +10 -7
- data/sig/bitwarden-sdk.rbs +0 -13
- data/sig/bitwarden_settings.rbs +0 -8
- data/sig/projects_client.rbs +0 -17
- data/sig/sdk.rbs +0 -3
- data/sig/secrets_client.rbs +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d3fbb1bb7ea36a7adbc189d3c0b4613aef4db3da8379893b79f4cf49dcf700d
|
4
|
+
data.tar.gz: 315a2b1594335ef2a0b9eb72d3c1fb78c6c764b625d3257ba17d9cfa8660f523
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c67e222e8f46b4a1cafc7749d3c65e6012dd8b9a9d3732950eed527ba72542551638b8cbe82546ce4a3045e3c3253b49a501ceba722ce30253b13d5482c82d29
|
7
|
+
data.tar.gz: 5b5f6de86a461106b094a947d7cb81f5f17ed3f461d60aca598b2fca5dfb80962a8a9657d28b78479f9bb7104aed45fb904c4dcc6e5a3ea4600b664438f30ef4
|
data/lib/auth.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'bitwarden_error'
|
3
|
+
|
4
|
+
module BitwardenSDKSecrets
|
5
|
+
class AuthClient
|
6
|
+
def initialize(command_runner)
|
7
|
+
@command_runner = command_runner
|
8
|
+
end
|
9
|
+
|
10
|
+
def login_access_token(access_token, state_file = nil)
|
11
|
+
access_token_request = AccessTokenLoginRequest.new(access_token: access_token, state_file: state_file)
|
12
|
+
@command_runner.run(SelectiveCommand.new(login_access_token: access_token_request))
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -10,6 +10,7 @@ require_relative 'bitwarden_lib'
|
|
10
10
|
require_relative 'bitwarden_error'
|
11
11
|
require_relative 'projects'
|
12
12
|
require_relative 'secrets'
|
13
|
+
require_relative 'auth'
|
13
14
|
|
14
15
|
module BitwardenSDKSecrets
|
15
16
|
class BitwardenSettings
|
@@ -26,7 +27,7 @@ module BitwardenSDKSecrets
|
|
26
27
|
end
|
27
28
|
|
28
29
|
class BitwardenClient
|
29
|
-
attr_reader :bitwarden, :
|
30
|
+
attr_reader :bitwarden, :projects, :secrets, :auth
|
30
31
|
|
31
32
|
def initialize(bitwarden_settings)
|
32
33
|
client_settings = ClientSettings.new(
|
@@ -39,14 +40,9 @@ module BitwardenSDKSecrets
|
|
39
40
|
@bitwarden = BitwardenLib
|
40
41
|
@handle = @bitwarden.init(client_settings.to_dynamic.compact.to_json)
|
41
42
|
@command_runner = CommandRunner.new(@bitwarden, @handle)
|
42
|
-
@
|
43
|
-
@
|
44
|
-
|
45
|
-
|
46
|
-
def access_token_login(access_token, state_file = nil)
|
47
|
-
access_token_request = AccessTokenLoginRequest.new(access_token: access_token, state_file: state_file)
|
48
|
-
@command_runner.run(SelectiveCommand.new(access_token_login: access_token_request))
|
49
|
-
nil
|
43
|
+
@projects = ProjectsClient.new(@command_runner)
|
44
|
+
@secrets = SecretsClient.new(@command_runner)
|
45
|
+
@auth = AuthClient.new(@command_runner)
|
50
46
|
end
|
51
47
|
|
52
48
|
def free_mem
|
@@ -3,23 +3,25 @@ module BitwardenSDKSecrets
|
|
3
3
|
class SelectiveCommand < Command
|
4
4
|
attribute :password_login, PasswordLoginRequest.optional.default(nil)
|
5
5
|
attribute :api_key_login, APIKeyLoginRequest.optional.default(nil)
|
6
|
-
attribute :
|
6
|
+
attribute :login_access_token, AccessTokenLoginRequest.optional.default(nil)
|
7
7
|
attribute :get_user_api_key, SecretVerificationRequest.optional.default(nil)
|
8
8
|
attribute :fingerprint, FingerprintRequest.optional.default(nil)
|
9
9
|
attribute :sync, SyncRequest.optional.default(nil)
|
10
10
|
attribute :secrets, SecretsCommand.optional.default(nil)
|
11
11
|
attribute :projects, ProjectsCommand.optional.default(nil)
|
12
|
+
attribute :generators, GeneratorsCommand.optional.default(nil)
|
12
13
|
|
13
14
|
def to_dynamic
|
14
15
|
{
|
15
16
|
"passwordLogin" => password_login&.to_dynamic,
|
16
17
|
"apiKeyLogin" => api_key_login&.to_dynamic,
|
17
|
-
"
|
18
|
+
"loginAccessToken" => login_access_token&.to_dynamic,
|
18
19
|
"getUserApiKey" => get_user_api_key&.to_dynamic,
|
19
20
|
"fingerprint" => fingerprint&.to_dynamic,
|
20
21
|
"sync" => sync&.to_dynamic,
|
21
22
|
"secrets" => secrets&.to_dynamic,
|
22
23
|
"projects" => projects&.to_dynamic,
|
24
|
+
"generators" => generators&.to_dynamic,
|
23
25
|
}.compact
|
24
26
|
end
|
25
27
|
end
|
@@ -49,6 +51,7 @@ module BitwardenSDKSecrets
|
|
49
51
|
attribute :list, SecretIdentifiersRequest.optional.default(nil)
|
50
52
|
attribute :update, SecretPutRequest.optional.default(nil)
|
51
53
|
attribute :delete, SecretsDeleteRequest.optional.default(nil)
|
54
|
+
attribute :sync, SecretsSyncRequest.optional.default(nil)
|
52
55
|
|
53
56
|
def to_dynamic
|
54
57
|
{
|
@@ -58,7 +61,18 @@ module BitwardenSDKSecrets
|
|
58
61
|
"list" => list&.to_dynamic,
|
59
62
|
"update" => update&.to_dynamic,
|
60
63
|
"delete" => delete&.to_dynamic,
|
64
|
+
"sync" => sync&.to_dynamic,
|
61
65
|
}.compact
|
62
66
|
end
|
63
67
|
end
|
68
|
+
|
69
|
+
class SelectiveGeneratorsCommand < GeneratorsCommand
|
70
|
+
attribute :generate_password, PasswordGeneratorRequest.optional.default(nil)
|
71
|
+
|
72
|
+
def to_dynamic
|
73
|
+
{
|
74
|
+
"generate_password" => generate_password&.to_dynamic,
|
75
|
+
}.compact
|
76
|
+
end
|
77
|
+
end
|
64
78
|
end
|
Binary file
|
Binary file
|
Binary file
|
data/lib/projects.rb
CHANGED
@@ -8,7 +8,7 @@ module BitwardenSDKSecrets
|
|
8
8
|
@command_runner = command_runner
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def create(organization_id, project_name)
|
12
12
|
project_create_request = ProjectCreateRequest.new(
|
13
13
|
project_create_request_name: project_name,
|
14
14
|
organization_id: organization_id
|
@@ -43,7 +43,7 @@ module BitwardenSDKSecrets
|
|
43
43
|
error_response(projects_response)
|
44
44
|
end
|
45
45
|
|
46
|
-
def
|
46
|
+
def list(organization_id)
|
47
47
|
project_list_request = ProjectsListRequest.new(organization_id: organization_id)
|
48
48
|
command = create_command(list: project_list_request)
|
49
49
|
response = parse_response(command)
|
@@ -58,7 +58,7 @@ module BitwardenSDKSecrets
|
|
58
58
|
error_response(projects_response)
|
59
59
|
end
|
60
60
|
|
61
|
-
def
|
61
|
+
def update(organization_id, id, project_put_request_name)
|
62
62
|
project_put_request = ProjectPutRequest.new(
|
63
63
|
id: id,
|
64
64
|
project_put_request_name: project_put_request_name,
|
@@ -79,7 +79,7 @@ module BitwardenSDKSecrets
|
|
79
79
|
error_response(projects_response)
|
80
80
|
end
|
81
81
|
|
82
|
-
def
|
82
|
+
def delete(ids)
|
83
83
|
project_delete_request = ProjectsDeleteRequest.new(ids: ids)
|
84
84
|
command = create_command(delete: project_delete_request)
|
85
85
|
response = parse_response(command)
|
data/lib/schemas.rb
CHANGED
@@ -10,14 +10,11 @@
|
|
10
10
|
# puts device_type == DeviceType::Android
|
11
11
|
#
|
12
12
|
# command = Command.from_json! "{…}"
|
13
|
-
# puts command.
|
13
|
+
# puts command.generators&.generate_password.avoid_ambiguous
|
14
14
|
#
|
15
15
|
# password_login_request = PasswordLoginRequest.from_json! "{…}"
|
16
16
|
# puts password_login_request.kdf.argon2_id&.iterations.even?
|
17
17
|
#
|
18
|
-
# string1 = String1.from_json! "…"
|
19
|
-
# puts string1
|
20
|
-
#
|
21
18
|
# two_factor_request = TwoFactorRequest.from_json! "{…}"
|
22
19
|
# puts two_factor_request.provider == TwoFactorProvider::Authenticator
|
23
20
|
#
|
@@ -43,7 +40,7 @@
|
|
43
40
|
# puts sync_request.exclude_subdomains.nil?
|
44
41
|
#
|
45
42
|
# secrets_command = SecretsCommand.from_json! "{…}"
|
46
|
-
# puts secrets_command.
|
43
|
+
# puts secrets_command.sync&.last_synced_date.nil?
|
47
44
|
#
|
48
45
|
# secret_get_request = SecretGetRequest.from_json! "{…}"
|
49
46
|
# puts secret_get_request.id
|
@@ -63,6 +60,9 @@
|
|
63
60
|
# secrets_delete_request = SecretsDeleteRequest.from_json! "{…}"
|
64
61
|
# puts secrets_delete_request.ids.first
|
65
62
|
#
|
63
|
+
# secrets_sync_request = SecretsSyncRequest.from_json! "{…}"
|
64
|
+
# puts secrets_sync_request.last_synced_date.nil?
|
65
|
+
#
|
66
66
|
# projects_command = ProjectsCommand.from_json! "{…}"
|
67
67
|
# puts projects_command.delete&.ids.first
|
68
68
|
#
|
@@ -81,6 +81,12 @@
|
|
81
81
|
# projects_delete_request = ProjectsDeleteRequest.from_json! "{…}"
|
82
82
|
# puts projects_delete_request.ids.first
|
83
83
|
#
|
84
|
+
# generators_command = GeneratorsCommand.from_json! "{…}"
|
85
|
+
# puts generators_command.generate_password.avoid_ambiguous
|
86
|
+
#
|
87
|
+
# password_generator_request = PasswordGeneratorRequest.from_json! "{…}"
|
88
|
+
# puts password_generator_request.avoid_ambiguous
|
89
|
+
#
|
84
90
|
# response_for_api_key_login_response = ResponseForAPIKeyLoginResponse.from_json! "{…}"
|
85
91
|
# puts response_for_api_key_login_response.data&.authenticated
|
86
92
|
#
|
@@ -153,6 +159,12 @@
|
|
153
159
|
# secret_delete_response = SecretDeleteResponse.from_json! "{…}"
|
154
160
|
# puts secret_delete_response.error.nil?
|
155
161
|
#
|
162
|
+
# response_for_secrets_sync_response = ResponseForSecretsSyncResponse.from_json! "{…}"
|
163
|
+
# puts response_for_secrets_sync_response.data&.has_changes
|
164
|
+
#
|
165
|
+
# secrets_sync_response = SecretsSyncResponse.from_json! "{…}"
|
166
|
+
# puts secrets_sync_response.has_changes
|
167
|
+
#
|
156
168
|
# response_for_project_response = ResponseForProjectResponse.from_json! "{…}"
|
157
169
|
# puts response_for_project_response.data&.creation_date
|
158
170
|
#
|
@@ -174,6 +186,9 @@
|
|
174
186
|
# project_delete_response = ProjectDeleteResponse.from_json! "{…}"
|
175
187
|
# puts project_delete_response.error.nil?
|
176
188
|
#
|
189
|
+
# response_for_string = ResponseForString.from_json! "{…}"
|
190
|
+
# puts response_for_string.data.nil?
|
191
|
+
#
|
177
192
|
# response_for_fingerprint_response = ResponseForFingerprintResponse.from_json! "{…}"
|
178
193
|
# puts response_for_fingerprint_response.data&.fingerprint
|
179
194
|
#
|
@@ -181,10 +196,10 @@
|
|
181
196
|
# puts fingerprint_response.fingerprint
|
182
197
|
#
|
183
198
|
# response_for_sync_response = ResponseForSyncResponse.from_json! "{…}"
|
184
|
-
# puts response_for_sync_response.data&.
|
199
|
+
# puts response_for_sync_response.data&.profile.organizations.first.id
|
185
200
|
#
|
186
201
|
# sync_response = SyncResponse.from_json! "{…}"
|
187
|
-
# puts sync_response.
|
202
|
+
# puts sync_response.profile.organizations.first.id
|
188
203
|
#
|
189
204
|
# profile_response = ProfileResponse.from_json! "{…}"
|
190
205
|
# puts profile_response.organizations.first.id
|
@@ -267,24 +282,6 @@
|
|
267
282
|
# global_domains = GlobalDomains.from_json! "{…}"
|
268
283
|
# puts global_domains.domains.first
|
269
284
|
#
|
270
|
-
# policy = Policy.from_json! "{…}"
|
271
|
-
# puts policy.data&["…"]
|
272
|
-
#
|
273
|
-
# policy_type = PolicyType.from_json! "…"
|
274
|
-
# puts policy_type == PolicyType::ActivateAutofill
|
275
|
-
#
|
276
|
-
# send = Send.from_json! "{…}"
|
277
|
-
# puts send.access_count.even?
|
278
|
-
#
|
279
|
-
# send_type = SendType.from_json! "…"
|
280
|
-
# puts send_type == SendType::File
|
281
|
-
#
|
282
|
-
# send_file = SendFile.from_json! "{…}"
|
283
|
-
# puts send_file.file_name
|
284
|
-
#
|
285
|
-
# send_text = SendText.from_json! "{…}"
|
286
|
-
# puts send_text.hidden
|
287
|
-
#
|
288
285
|
# response_for_user_api_key_response = ResponseForUserAPIKeyResponse.from_json! "{…}"
|
289
286
|
# puts response_for_user_api_key_response.data&.api_key
|
290
287
|
#
|
@@ -313,8 +310,6 @@ module Types
|
|
313
310
|
URIMatchType = Strict::String.enum("domain", "exact", "host", "never", "regularExpression", "startsWith")
|
314
311
|
CipherRepromptType = Strict::String.enum("None", "Password")
|
315
312
|
SecureNoteType = Strict::String.enum("Generic")
|
316
|
-
PolicyType = Strict::String.enum("ActivateAutofill", "DisablePersonalVaultExport", "DisableSend", "MasterPassword", "MaximumVaultTimeout", "PasswordGenerator", "PersonalOwnership", "RequireSso", "ResetPassword", "SendOptions", "SingleOrg", "TwoFactorAuthentication")
|
317
|
-
SendType = Strict::String.enum("File", "Text")
|
318
313
|
LoginLinkedIDType = Strict::String.enum("Password", "Username")
|
319
314
|
CardLinkedIDType = Strict::String.enum("Brand", "CardholderName", "Code", "ExpMonth", "ExpYear", "Number")
|
320
315
|
IdentityLinkedIDType = Strict::String.enum("Address1", "Address2", "Address3", "City", "Company", "Country", "Email", "FirstName", "FullName", "LastName", "LicenseNumber", "MiddleName", "PassportNumber", "Phone", "PostalCode", "Ssn", "State", "Title", "Username")
|
@@ -352,8 +347,8 @@ end
|
|
352
347
|
#
|
353
348
|
# Defaults to
|
354
349
|
#
|
355
|
-
# ``` # use
|
356
|
-
#
|
350
|
+
# ``` # use bitwarden_core::{ClientSettings, DeviceType}; let settings = ClientSettings {
|
351
|
+
# identity_url: "https://identity.bitwarden.com".to_string(), api_url:
|
357
352
|
# "https://api.bitwarden.com".to_string(), user_agent: "Bitwarden Rust-SDK".to_string(),
|
358
353
|
# device_type: DeviceType::SDK, }; let default = ClientSettings::default(); ```
|
359
354
|
class ClientSettings < Dry::Struct
|
@@ -399,38 +394,6 @@ class ClientSettings < Dry::Struct
|
|
399
394
|
end
|
400
395
|
end
|
401
396
|
|
402
|
-
# Login to Bitwarden with access token
|
403
|
-
class AccessTokenLoginRequest < Dry::Struct
|
404
|
-
|
405
|
-
# Bitwarden service API access token
|
406
|
-
attribute :access_token, Types::String
|
407
|
-
|
408
|
-
attribute :state_file, Types::String.optional.optional
|
409
|
-
|
410
|
-
def self.from_dynamic!(d)
|
411
|
-
d = Types::Hash[d]
|
412
|
-
new(
|
413
|
-
access_token: d.fetch("accessToken"),
|
414
|
-
state_file: d["stateFile"],
|
415
|
-
)
|
416
|
-
end
|
417
|
-
|
418
|
-
def self.from_json!(json)
|
419
|
-
from_dynamic!(JSON.parse(json))
|
420
|
-
end
|
421
|
-
|
422
|
-
def to_dynamic
|
423
|
-
{
|
424
|
-
"accessToken" => access_token,
|
425
|
-
"stateFile" => state_file,
|
426
|
-
}
|
427
|
-
end
|
428
|
-
|
429
|
-
def to_json(options = nil)
|
430
|
-
JSON.generate(to_dynamic, options)
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
397
|
# Login to Bitwarden with Api Key
|
435
398
|
class APIKeyLoginRequest < Dry::Struct
|
436
399
|
|
@@ -501,6 +464,113 @@ class FingerprintRequest < Dry::Struct
|
|
501
464
|
end
|
502
465
|
end
|
503
466
|
|
467
|
+
# Password generator request options.
|
468
|
+
class PasswordGeneratorRequest < Dry::Struct
|
469
|
+
|
470
|
+
# When set to true, the generated password will not contain ambiguous characters. The
|
471
|
+
# ambiguous characters are: I, O, l, 0, 1
|
472
|
+
attribute :avoid_ambiguous, Types::Bool
|
473
|
+
|
474
|
+
# The length of the generated password. Note that the password length must be greater than
|
475
|
+
# the sum of all the minimums.
|
476
|
+
attribute :length, Types::Integer
|
477
|
+
|
478
|
+
# Include lowercase characters (a-z).
|
479
|
+
attribute :lowercase, Types::Bool
|
480
|
+
|
481
|
+
# The minimum number of lowercase characters in the generated password. When set, the value
|
482
|
+
# must be between 1 and 9. This value is ignored if lowercase is false.
|
483
|
+
attribute :min_lowercase, Types::Integer.optional.optional
|
484
|
+
|
485
|
+
# The minimum number of numbers in the generated password. When set, the value must be
|
486
|
+
# between 1 and 9. This value is ignored if numbers is false.
|
487
|
+
attribute :min_number, Types::Integer.optional.optional
|
488
|
+
|
489
|
+
# The minimum number of special characters in the generated password. When set, the value
|
490
|
+
# must be between 1 and 9. This value is ignored if special is false.
|
491
|
+
attribute :min_special, Types::Integer.optional.optional
|
492
|
+
|
493
|
+
# The minimum number of uppercase characters in the generated password. When set, the value
|
494
|
+
# must be between 1 and 9. This value is ignored if uppercase is false.
|
495
|
+
attribute :min_uppercase, Types::Integer.optional.optional
|
496
|
+
|
497
|
+
# Include numbers (0-9).
|
498
|
+
attribute :numbers, Types::Bool
|
499
|
+
|
500
|
+
# Include special characters: ! @ # $ % ^ & *
|
501
|
+
attribute :special, Types::Bool
|
502
|
+
|
503
|
+
# Include uppercase characters (A-Z).
|
504
|
+
attribute :uppercase, Types::Bool
|
505
|
+
|
506
|
+
def self.from_dynamic!(d)
|
507
|
+
d = Types::Hash[d]
|
508
|
+
new(
|
509
|
+
avoid_ambiguous: d.fetch("avoidAmbiguous"),
|
510
|
+
length: d.fetch("length"),
|
511
|
+
lowercase: d.fetch("lowercase"),
|
512
|
+
min_lowercase: d["minLowercase"],
|
513
|
+
min_number: d["minNumber"],
|
514
|
+
min_special: d["minSpecial"],
|
515
|
+
min_uppercase: d["minUppercase"],
|
516
|
+
numbers: d.fetch("numbers"),
|
517
|
+
special: d.fetch("special"),
|
518
|
+
uppercase: d.fetch("uppercase"),
|
519
|
+
)
|
520
|
+
end
|
521
|
+
|
522
|
+
def self.from_json!(json)
|
523
|
+
from_dynamic!(JSON.parse(json))
|
524
|
+
end
|
525
|
+
|
526
|
+
def to_dynamic
|
527
|
+
{
|
528
|
+
"avoidAmbiguous" => avoid_ambiguous,
|
529
|
+
"length" => length,
|
530
|
+
"lowercase" => lowercase,
|
531
|
+
"minLowercase" => min_lowercase,
|
532
|
+
"minNumber" => min_number,
|
533
|
+
"minSpecial" => min_special,
|
534
|
+
"minUppercase" => min_uppercase,
|
535
|
+
"numbers" => numbers,
|
536
|
+
"special" => special,
|
537
|
+
"uppercase" => uppercase,
|
538
|
+
}
|
539
|
+
end
|
540
|
+
|
541
|
+
def to_json(options = nil)
|
542
|
+
JSON.generate(to_dynamic, options)
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
# Generate a password
|
547
|
+
#
|
548
|
+
# Returns: [String]
|
549
|
+
class GeneratorsCommand < Dry::Struct
|
550
|
+
attribute :generate_password, PasswordGeneratorRequest
|
551
|
+
|
552
|
+
def self.from_dynamic!(d)
|
553
|
+
d = Types::Hash[d]
|
554
|
+
new(
|
555
|
+
generate_password: PasswordGeneratorRequest.from_dynamic!(d.fetch("generatePassword")),
|
556
|
+
)
|
557
|
+
end
|
558
|
+
|
559
|
+
def self.from_json!(json)
|
560
|
+
from_dynamic!(JSON.parse(json))
|
561
|
+
end
|
562
|
+
|
563
|
+
def to_dynamic
|
564
|
+
{
|
565
|
+
"generatePassword" => generate_password.to_dynamic,
|
566
|
+
}
|
567
|
+
end
|
568
|
+
|
569
|
+
def to_json(options = nil)
|
570
|
+
JSON.generate(to_dynamic, options)
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
504
574
|
class SecretVerificationRequest < Dry::Struct
|
505
575
|
|
506
576
|
# The user's master password to use for user verification. If supplied, this will be used
|
@@ -536,6 +606,38 @@ class SecretVerificationRequest < Dry::Struct
|
|
536
606
|
end
|
537
607
|
end
|
538
608
|
|
609
|
+
# Login to Bitwarden with access token
|
610
|
+
class AccessTokenLoginRequest < Dry::Struct
|
611
|
+
|
612
|
+
# Bitwarden service API access token
|
613
|
+
attribute :access_token, Types::String
|
614
|
+
|
615
|
+
attribute :state_file, Types::String.optional.optional
|
616
|
+
|
617
|
+
def self.from_dynamic!(d)
|
618
|
+
d = Types::Hash[d]
|
619
|
+
new(
|
620
|
+
access_token: d.fetch("accessToken"),
|
621
|
+
state_file: d["stateFile"],
|
622
|
+
)
|
623
|
+
end
|
624
|
+
|
625
|
+
def self.from_json!(json)
|
626
|
+
from_dynamic!(JSON.parse(json))
|
627
|
+
end
|
628
|
+
|
629
|
+
def to_dynamic
|
630
|
+
{
|
631
|
+
"accessToken" => access_token,
|
632
|
+
"stateFile" => state_file,
|
633
|
+
}
|
634
|
+
end
|
635
|
+
|
636
|
+
def to_json(options = nil)
|
637
|
+
JSON.generate(to_dynamic, options)
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
539
641
|
class Argon2ID < Dry::Struct
|
540
642
|
attribute :iterations, Types::Integer
|
541
643
|
attribute :memory, Types::Integer
|
@@ -1076,6 +1178,38 @@ class SecretIdentifiersRequest < Dry::Struct
|
|
1076
1178
|
end
|
1077
1179
|
end
|
1078
1180
|
|
1181
|
+
class SecretsSyncRequest < Dry::Struct
|
1182
|
+
|
1183
|
+
# Optional date time a sync last occurred
|
1184
|
+
attribute :last_synced_date, Types::String.optional.optional
|
1185
|
+
|
1186
|
+
# Organization to sync secrets from
|
1187
|
+
attribute :organization_id, Types::String
|
1188
|
+
|
1189
|
+
def self.from_dynamic!(d)
|
1190
|
+
d = Types::Hash[d]
|
1191
|
+
new(
|
1192
|
+
last_synced_date: d["lastSyncedDate"],
|
1193
|
+
organization_id: d.fetch("organizationId"),
|
1194
|
+
)
|
1195
|
+
end
|
1196
|
+
|
1197
|
+
def self.from_json!(json)
|
1198
|
+
from_dynamic!(JSON.parse(json))
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
def to_dynamic
|
1202
|
+
{
|
1203
|
+
"lastSyncedDate" => last_synced_date,
|
1204
|
+
"organizationId" => organization_id,
|
1205
|
+
}
|
1206
|
+
end
|
1207
|
+
|
1208
|
+
def to_json(options = nil)
|
1209
|
+
JSON.generate(to_dynamic, options)
|
1210
|
+
end
|
1211
|
+
end
|
1212
|
+
|
1079
1213
|
class SecretPutRequest < Dry::Struct
|
1080
1214
|
|
1081
1215
|
# ID of the secret to modify
|
@@ -1154,6 +1288,13 @@ end
|
|
1154
1288
|
#
|
1155
1289
|
# Returns:
|
1156
1290
|
# [SecretsDeleteResponse](bitwarden::secrets_manager::secrets::SecretsDeleteResponse)
|
1291
|
+
#
|
1292
|
+
# > Requires Authentication > Requires using an Access Token for login Retrieve the secrets
|
1293
|
+
# accessible by the authenticated machine account Optionally, provide the last synced date
|
1294
|
+
# to assess whether any changes have occurred If changes are detected, retrieves all the
|
1295
|
+
# secrets accessible by the authenticated machine account
|
1296
|
+
#
|
1297
|
+
# Returns: [SecretsSyncResponse](bitwarden::secrets_manager::secrets::SecretsSyncResponse)
|
1157
1298
|
class SecretsCommand < Dry::Struct
|
1158
1299
|
attribute :get, SecretGetRequest.optional
|
1159
1300
|
attribute :get_by_ids, SecretsGetRequest.optional
|
@@ -1161,6 +1302,7 @@ class SecretsCommand < Dry::Struct
|
|
1161
1302
|
attribute :list, SecretIdentifiersRequest.optional
|
1162
1303
|
attribute :update, SecretPutRequest.optional
|
1163
1304
|
attribute :delete, SecretsDeleteRequest.optional
|
1305
|
+
attribute :sync, SecretsSyncRequest.optional
|
1164
1306
|
|
1165
1307
|
def self.from_dynamic!(d)
|
1166
1308
|
d = Types::Hash[d]
|
@@ -1171,6 +1313,7 @@ class SecretsCommand < Dry::Struct
|
|
1171
1313
|
list: d["list"] ? SecretIdentifiersRequest.from_dynamic!(d["list"]) : nil,
|
1172
1314
|
update: d["update"] ? SecretPutRequest.from_dynamic!(d["update"]) : nil,
|
1173
1315
|
delete: d["delete"] ? SecretsDeleteRequest.from_dynamic!(d["delete"]) : nil,
|
1316
|
+
sync: d["sync"] ? SecretsSyncRequest.from_dynamic!(d["sync"]) : nil,
|
1174
1317
|
)
|
1175
1318
|
end
|
1176
1319
|
|
@@ -1186,6 +1329,7 @@ class SecretsCommand < Dry::Struct
|
|
1186
1329
|
"list" => list&.to_dynamic,
|
1187
1330
|
"update" => update&.to_dynamic,
|
1188
1331
|
"delete" => delete&.to_dynamic,
|
1332
|
+
"sync" => sync&.to_dynamic,
|
1189
1333
|
}
|
1190
1334
|
end
|
1191
1335
|
|
@@ -1254,28 +1398,30 @@ end
|
|
1254
1398
|
# > Requires Authentication Retrieve all user data, ciphers and organizations the user is a
|
1255
1399
|
# part of
|
1256
1400
|
#
|
1257
|
-
# Returns: [SyncResponse](bitwarden::
|
1401
|
+
# Returns: [SyncResponse](bitwarden::vault::SyncResponse)
|
1258
1402
|
class Command < Dry::Struct
|
1259
1403
|
attribute :password_login, PasswordLoginRequest.optional
|
1260
1404
|
attribute :api_key_login, APIKeyLoginRequest.optional
|
1261
|
-
attribute :
|
1405
|
+
attribute :login_access_token, AccessTokenLoginRequest.optional
|
1262
1406
|
attribute :get_user_api_key, SecretVerificationRequest.optional
|
1263
1407
|
attribute :fingerprint, FingerprintRequest.optional
|
1264
1408
|
attribute :sync, SyncRequest.optional
|
1265
1409
|
attribute :secrets, SecretsCommand.optional
|
1266
1410
|
attribute :projects, ProjectsCommand.optional
|
1411
|
+
attribute :generators, GeneratorsCommand.optional
|
1267
1412
|
|
1268
1413
|
def self.from_dynamic!(d)
|
1269
1414
|
d = Types::Hash[d]
|
1270
1415
|
new(
|
1271
1416
|
password_login: d["passwordLogin"] ? PasswordLoginRequest.from_dynamic!(d["passwordLogin"]) : nil,
|
1272
1417
|
api_key_login: d["apiKeyLogin"] ? APIKeyLoginRequest.from_dynamic!(d["apiKeyLogin"]) : nil,
|
1273
|
-
|
1418
|
+
login_access_token: d["loginAccessToken"] ? AccessTokenLoginRequest.from_dynamic!(d["loginAccessToken"]) : nil,
|
1274
1419
|
get_user_api_key: d["getUserApiKey"] ? SecretVerificationRequest.from_dynamic!(d["getUserApiKey"]) : nil,
|
1275
1420
|
fingerprint: d["fingerprint"] ? FingerprintRequest.from_dynamic!(d["fingerprint"]) : nil,
|
1276
1421
|
sync: d["sync"] ? SyncRequest.from_dynamic!(d["sync"]) : nil,
|
1277
1422
|
secrets: d["secrets"] ? SecretsCommand.from_dynamic!(d["secrets"]) : nil,
|
1278
1423
|
projects: d["projects"] ? ProjectsCommand.from_dynamic!(d["projects"]) : nil,
|
1424
|
+
generators: d["generators"] ? GeneratorsCommand.from_dynamic!(d["generators"]) : nil,
|
1279
1425
|
)
|
1280
1426
|
end
|
1281
1427
|
|
@@ -1287,12 +1433,13 @@ class Command < Dry::Struct
|
|
1287
1433
|
{
|
1288
1434
|
"passwordLogin" => password_login&.to_dynamic,
|
1289
1435
|
"apiKeyLogin" => api_key_login&.to_dynamic,
|
1290
|
-
"
|
1436
|
+
"loginAccessToken" => login_access_token&.to_dynamic,
|
1291
1437
|
"getUserApiKey" => get_user_api_key&.to_dynamic,
|
1292
1438
|
"fingerprint" => fingerprint&.to_dynamic,
|
1293
1439
|
"sync" => sync&.to_dynamic,
|
1294
1440
|
"secrets" => secrets&.to_dynamic,
|
1295
1441
|
"projects" => projects&.to_dynamic,
|
1442
|
+
"generators" => generators&.to_dynamic,
|
1296
1443
|
}
|
1297
1444
|
end
|
1298
1445
|
|
@@ -2095,6 +2242,71 @@ class ResponseForSecretsDeleteResponse < Dry::Struct
|
|
2095
2242
|
end
|
2096
2243
|
end
|
2097
2244
|
|
2245
|
+
class SecretsSyncResponse < Dry::Struct
|
2246
|
+
attribute :has_changes, Types::Bool
|
2247
|
+
attribute :secrets, Types.Array(SecretResponse).optional.optional
|
2248
|
+
|
2249
|
+
def self.from_dynamic!(d)
|
2250
|
+
d = Types::Hash[d]
|
2251
|
+
new(
|
2252
|
+
has_changes: d.fetch("hasChanges"),
|
2253
|
+
secrets: d["secrets"]&.map { |x| SecretResponse.from_dynamic!(x) },
|
2254
|
+
)
|
2255
|
+
end
|
2256
|
+
|
2257
|
+
def self.from_json!(json)
|
2258
|
+
from_dynamic!(JSON.parse(json))
|
2259
|
+
end
|
2260
|
+
|
2261
|
+
def to_dynamic
|
2262
|
+
{
|
2263
|
+
"hasChanges" => has_changes,
|
2264
|
+
"secrets" => secrets&.map { |x| x.to_dynamic },
|
2265
|
+
}
|
2266
|
+
end
|
2267
|
+
|
2268
|
+
def to_json(options = nil)
|
2269
|
+
JSON.generate(to_dynamic, options)
|
2270
|
+
end
|
2271
|
+
end
|
2272
|
+
|
2273
|
+
class ResponseForSecretsSyncResponse < Dry::Struct
|
2274
|
+
|
2275
|
+
# The response data. Populated if `success` is true.
|
2276
|
+
attribute :data, SecretsSyncResponse.optional.optional
|
2277
|
+
|
2278
|
+
# A message for any error that may occur. Populated if `success` is false.
|
2279
|
+
attribute :error_message, Types::String.optional.optional
|
2280
|
+
|
2281
|
+
# Whether or not the SDK request succeeded.
|
2282
|
+
attribute :success, Types::Bool
|
2283
|
+
|
2284
|
+
def self.from_dynamic!(d)
|
2285
|
+
d = Types::Hash[d]
|
2286
|
+
new(
|
2287
|
+
data: d["data"] ? SecretsSyncResponse.from_dynamic!(d["data"]) : nil,
|
2288
|
+
error_message: d["errorMessage"],
|
2289
|
+
success: d.fetch("success"),
|
2290
|
+
)
|
2291
|
+
end
|
2292
|
+
|
2293
|
+
def self.from_json!(json)
|
2294
|
+
from_dynamic!(JSON.parse(json))
|
2295
|
+
end
|
2296
|
+
|
2297
|
+
def to_dynamic
|
2298
|
+
{
|
2299
|
+
"data" => data&.to_dynamic,
|
2300
|
+
"errorMessage" => error_message,
|
2301
|
+
"success" => success,
|
2302
|
+
}
|
2303
|
+
end
|
2304
|
+
|
2305
|
+
def to_json(options = nil)
|
2306
|
+
JSON.generate(to_dynamic, options)
|
2307
|
+
end
|
2308
|
+
end
|
2309
|
+
|
2098
2310
|
class ProjectResponse < Dry::Struct
|
2099
2311
|
attribute :creation_date, Types::String
|
2100
2312
|
attribute :id, Types::String
|
@@ -2321,6 +2533,43 @@ class ResponseForProjectsDeleteResponse < Dry::Struct
|
|
2321
2533
|
end
|
2322
2534
|
end
|
2323
2535
|
|
2536
|
+
class ResponseForString < Dry::Struct
|
2537
|
+
|
2538
|
+
# The response data. Populated if `success` is true.
|
2539
|
+
attribute :data, Types::String.optional.optional
|
2540
|
+
|
2541
|
+
# A message for any error that may occur. Populated if `success` is false.
|
2542
|
+
attribute :error_message, Types::String.optional.optional
|
2543
|
+
|
2544
|
+
# Whether or not the SDK request succeeded.
|
2545
|
+
attribute :success, Types::Bool
|
2546
|
+
|
2547
|
+
def self.from_dynamic!(d)
|
2548
|
+
d = Types::Hash[d]
|
2549
|
+
new(
|
2550
|
+
data: d["data"],
|
2551
|
+
error_message: d["errorMessage"],
|
2552
|
+
success: d.fetch("success"),
|
2553
|
+
)
|
2554
|
+
end
|
2555
|
+
|
2556
|
+
def self.from_json!(json)
|
2557
|
+
from_dynamic!(JSON.parse(json))
|
2558
|
+
end
|
2559
|
+
|
2560
|
+
def to_dynamic
|
2561
|
+
{
|
2562
|
+
"data" => data,
|
2563
|
+
"errorMessage" => error_message,
|
2564
|
+
"success" => success,
|
2565
|
+
}
|
2566
|
+
end
|
2567
|
+
|
2568
|
+
def to_json(options = nil)
|
2569
|
+
JSON.generate(to_dynamic, options)
|
2570
|
+
end
|
2571
|
+
end
|
2572
|
+
|
2324
2573
|
class FingerprintResponse < Dry::Struct
|
2325
2574
|
attribute :fingerprint, Types::String
|
2326
2575
|
|
@@ -3081,58 +3330,6 @@ class Folder < Dry::Struct
|
|
3081
3330
|
end
|
3082
3331
|
end
|
3083
3332
|
|
3084
|
-
module PolicyType
|
3085
|
-
ActivateAutofill = "ActivateAutofill"
|
3086
|
-
DisablePersonalVaultExport = "DisablePersonalVaultExport"
|
3087
|
-
DisableSend = "DisableSend"
|
3088
|
-
MasterPassword = "MasterPassword"
|
3089
|
-
MaximumVaultTimeout = "MaximumVaultTimeout"
|
3090
|
-
PasswordGenerator = "PasswordGenerator"
|
3091
|
-
PersonalOwnership = "PersonalOwnership"
|
3092
|
-
RequireSso = "RequireSso"
|
3093
|
-
ResetPassword = "ResetPassword"
|
3094
|
-
SendOptions = "SendOptions"
|
3095
|
-
SingleOrg = "SingleOrg"
|
3096
|
-
TwoFactorAuthentication = "TwoFactorAuthentication"
|
3097
|
-
end
|
3098
|
-
|
3099
|
-
class Policy < Dry::Struct
|
3100
|
-
attribute :data, Types::Hash.meta(of: Types::Any).optional.optional
|
3101
|
-
attribute :enabled, Types::Bool
|
3102
|
-
attribute :id, Types::String
|
3103
|
-
attribute :organization_id, Types::String
|
3104
|
-
attribute :policy_type, Types::PolicyType
|
3105
|
-
|
3106
|
-
def self.from_dynamic!(d)
|
3107
|
-
d = Types::Hash[d]
|
3108
|
-
new(
|
3109
|
-
data: Types::Hash.optional[d["data"]]&.map { |k, v| [k, Types::Any[v]] }&.to_h,
|
3110
|
-
enabled: d.fetch("enabled"),
|
3111
|
-
id: d.fetch("id"),
|
3112
|
-
organization_id: d.fetch("organization_id"),
|
3113
|
-
policy_type: d.fetch("type"),
|
3114
|
-
)
|
3115
|
-
end
|
3116
|
-
|
3117
|
-
def self.from_json!(json)
|
3118
|
-
from_dynamic!(JSON.parse(json))
|
3119
|
-
end
|
3120
|
-
|
3121
|
-
def to_dynamic
|
3122
|
-
{
|
3123
|
-
"data" => data,
|
3124
|
-
"enabled" => enabled,
|
3125
|
-
"id" => id,
|
3126
|
-
"organization_id" => organization_id,
|
3127
|
-
"type" => policy_type,
|
3128
|
-
}
|
3129
|
-
end
|
3130
|
-
|
3131
|
-
def to_json(options = nil)
|
3132
|
-
JSON.generate(to_dynamic, options)
|
3133
|
-
end
|
3134
|
-
end
|
3135
|
-
|
3136
3333
|
class ProfileOrganizationResponse < Dry::Struct
|
3137
3334
|
attribute :id, Types::String
|
3138
3335
|
|
@@ -3194,145 +3391,6 @@ class ProfileResponse < Dry::Struct
|
|
3194
3391
|
end
|
3195
3392
|
end
|
3196
3393
|
|
3197
|
-
class SendFile < Dry::Struct
|
3198
|
-
attribute :file_name, Types::String
|
3199
|
-
attribute :id, Types::String.optional.optional
|
3200
|
-
attribute :size, Types::String.optional.optional
|
3201
|
-
|
3202
|
-
# Readable size, ex: "4.2 KB" or "1.43 GB"
|
3203
|
-
attribute :size_name, Types::String.optional.optional
|
3204
|
-
|
3205
|
-
def self.from_dynamic!(d)
|
3206
|
-
d = Types::Hash[d]
|
3207
|
-
new(
|
3208
|
-
file_name: d.fetch("fileName"),
|
3209
|
-
id: d["id"],
|
3210
|
-
size: d["size"],
|
3211
|
-
size_name: d["sizeName"],
|
3212
|
-
)
|
3213
|
-
end
|
3214
|
-
|
3215
|
-
def self.from_json!(json)
|
3216
|
-
from_dynamic!(JSON.parse(json))
|
3217
|
-
end
|
3218
|
-
|
3219
|
-
def to_dynamic
|
3220
|
-
{
|
3221
|
-
"fileName" => file_name,
|
3222
|
-
"id" => id,
|
3223
|
-
"size" => size,
|
3224
|
-
"sizeName" => size_name,
|
3225
|
-
}
|
3226
|
-
end
|
3227
|
-
|
3228
|
-
def to_json(options = nil)
|
3229
|
-
JSON.generate(to_dynamic, options)
|
3230
|
-
end
|
3231
|
-
end
|
3232
|
-
|
3233
|
-
module SendType
|
3234
|
-
File = "File"
|
3235
|
-
Text = "Text"
|
3236
|
-
end
|
3237
|
-
|
3238
|
-
class SendText < Dry::Struct
|
3239
|
-
attribute :hidden, Types::Bool
|
3240
|
-
attribute :text, Types::String.optional.optional
|
3241
|
-
|
3242
|
-
def self.from_dynamic!(d)
|
3243
|
-
d = Types::Hash[d]
|
3244
|
-
new(
|
3245
|
-
hidden: d.fetch("hidden"),
|
3246
|
-
text: d["text"],
|
3247
|
-
)
|
3248
|
-
end
|
3249
|
-
|
3250
|
-
def self.from_json!(json)
|
3251
|
-
from_dynamic!(JSON.parse(json))
|
3252
|
-
end
|
3253
|
-
|
3254
|
-
def to_dynamic
|
3255
|
-
{
|
3256
|
-
"hidden" => hidden,
|
3257
|
-
"text" => text,
|
3258
|
-
}
|
3259
|
-
end
|
3260
|
-
|
3261
|
-
def to_json(options = nil)
|
3262
|
-
JSON.generate(to_dynamic, options)
|
3263
|
-
end
|
3264
|
-
end
|
3265
|
-
|
3266
|
-
class Send < Dry::Struct
|
3267
|
-
attribute :access_count, Types::Integer
|
3268
|
-
attribute :access_id, Types::String.optional.optional
|
3269
|
-
attribute :deletion_date, Types::String
|
3270
|
-
attribute :disabled, Types::Bool
|
3271
|
-
attribute :expiration_date, Types::String.optional.optional
|
3272
|
-
attribute :file, SendFile.optional.optional
|
3273
|
-
attribute :hide_email, Types::Bool
|
3274
|
-
attribute :id, Types::String.optional.optional
|
3275
|
-
attribute :key, Types::String
|
3276
|
-
attribute :max_access_count, Types::Integer.optional.optional
|
3277
|
-
attribute :send_name, Types::String
|
3278
|
-
attribute :notes, Types::String.optional.optional
|
3279
|
-
attribute :password, Types::String.optional.optional
|
3280
|
-
attribute :revision_date, Types::String
|
3281
|
-
attribute :text, SendText.optional.optional
|
3282
|
-
attribute :send_type, Types::SendType
|
3283
|
-
|
3284
|
-
def self.from_dynamic!(d)
|
3285
|
-
d = Types::Hash[d]
|
3286
|
-
new(
|
3287
|
-
access_count: d.fetch("accessCount"),
|
3288
|
-
access_id: d["accessId"],
|
3289
|
-
deletion_date: d.fetch("deletionDate"),
|
3290
|
-
disabled: d.fetch("disabled"),
|
3291
|
-
expiration_date: d["expirationDate"],
|
3292
|
-
file: d["file"] ? SendFile.from_dynamic!(d["file"]) : nil,
|
3293
|
-
hide_email: d.fetch("hideEmail"),
|
3294
|
-
id: d["id"],
|
3295
|
-
key: d.fetch("key"),
|
3296
|
-
max_access_count: d["maxAccessCount"],
|
3297
|
-
send_name: d.fetch("name"),
|
3298
|
-
notes: d["notes"],
|
3299
|
-
password: d["password"],
|
3300
|
-
revision_date: d.fetch("revisionDate"),
|
3301
|
-
text: d["text"] ? SendText.from_dynamic!(d["text"]) : nil,
|
3302
|
-
send_type: d.fetch("type"),
|
3303
|
-
)
|
3304
|
-
end
|
3305
|
-
|
3306
|
-
def self.from_json!(json)
|
3307
|
-
from_dynamic!(JSON.parse(json))
|
3308
|
-
end
|
3309
|
-
|
3310
|
-
def to_dynamic
|
3311
|
-
{
|
3312
|
-
"accessCount" => access_count,
|
3313
|
-
"accessId" => access_id,
|
3314
|
-
"deletionDate" => deletion_date,
|
3315
|
-
"disabled" => disabled,
|
3316
|
-
"expirationDate" => expiration_date,
|
3317
|
-
"file" => file&.to_dynamic,
|
3318
|
-
"hideEmail" => hide_email,
|
3319
|
-
"id" => id,
|
3320
|
-
"key" => key,
|
3321
|
-
"maxAccessCount" => max_access_count,
|
3322
|
-
"name" => send_name,
|
3323
|
-
"notes" => notes,
|
3324
|
-
"password" => password,
|
3325
|
-
"revisionDate" => revision_date,
|
3326
|
-
"text" => text&.to_dynamic,
|
3327
|
-
"type" => send_type,
|
3328
|
-
}
|
3329
|
-
end
|
3330
|
-
|
3331
|
-
def to_json(options = nil)
|
3332
|
-
JSON.generate(to_dynamic, options)
|
3333
|
-
end
|
3334
|
-
end
|
3335
|
-
|
3336
3394
|
class SyncResponse < Dry::Struct
|
3337
3395
|
|
3338
3396
|
# List of ciphers accessible by the user
|
@@ -3341,14 +3399,11 @@ class SyncResponse < Dry::Struct
|
|
3341
3399
|
attribute :collections, Types.Array(Collection)
|
3342
3400
|
attribute :domains, DomainResponse.optional.optional
|
3343
3401
|
attribute :folders, Types.Array(Folder)
|
3344
|
-
attribute :policies, Types.Array(Policy)
|
3345
3402
|
|
3346
3403
|
# Data about the user, including their encryption keys and the organizations they are a
|
3347
3404
|
# part of
|
3348
3405
|
attribute :profile, ProfileResponse
|
3349
3406
|
|
3350
|
-
attribute :sends, Types.Array(Send)
|
3351
|
-
|
3352
3407
|
def self.from_dynamic!(d)
|
3353
3408
|
d = Types::Hash[d]
|
3354
3409
|
new(
|
@@ -3356,9 +3411,7 @@ class SyncResponse < Dry::Struct
|
|
3356
3411
|
collections: d.fetch("collections").map { |x| Collection.from_dynamic!(x) },
|
3357
3412
|
domains: d["domains"] ? DomainResponse.from_dynamic!(d["domains"]) : nil,
|
3358
3413
|
folders: d.fetch("folders").map { |x| Folder.from_dynamic!(x) },
|
3359
|
-
policies: d.fetch("policies").map { |x| Policy.from_dynamic!(x) },
|
3360
3414
|
profile: ProfileResponse.from_dynamic!(d.fetch("profile")),
|
3361
|
-
sends: d.fetch("sends").map { |x| Send.from_dynamic!(x) },
|
3362
3415
|
)
|
3363
3416
|
end
|
3364
3417
|
|
@@ -3372,9 +3425,7 @@ class SyncResponse < Dry::Struct
|
|
3372
3425
|
"collections" => collections.map { |x| x.to_dynamic },
|
3373
3426
|
"domains" => domains&.to_dynamic,
|
3374
3427
|
"folders" => folders.map { |x| x.to_dynamic },
|
3375
|
-
"policies" => policies.map { |x| x.to_dynamic },
|
3376
3428
|
"profile" => profile.to_dynamic,
|
3377
|
-
"sends" => sends.map { |x| x.to_dynamic },
|
3378
3429
|
}
|
3379
3430
|
end
|
3380
3431
|
|
@@ -3520,12 +3571,6 @@ class ResponseForUserAPIKeyResponse < Dry::Struct
|
|
3520
3571
|
end
|
3521
3572
|
end
|
3522
3573
|
|
3523
|
-
class String1
|
3524
|
-
def self.from_json!(json)
|
3525
|
-
JSON.parse(json, quirks_mode: true)
|
3526
|
-
end
|
3527
|
-
end
|
3528
|
-
|
3529
3574
|
class EncString
|
3530
3575
|
def self.from_json!(json)
|
3531
3576
|
JSON.parse(json, quirks_mode: true)
|
data/lib/secrets.rb
CHANGED
@@ -36,7 +36,23 @@ module BitwardenSDKSecrets
|
|
36
36
|
error_response(secrets_response)
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def sync(organization_id, last_synced_date)
|
40
|
+
command = create_command(
|
41
|
+
sync: SecretsSyncRequest.new(organization_id: organization_id, last_synced_date: last_synced_date)
|
42
|
+
)
|
43
|
+
response = run_command(command)
|
44
|
+
|
45
|
+
secrets_response = ResponseForSecretsSyncResponse.from_json!(response).to_dynamic
|
46
|
+
|
47
|
+
if secrets_response.key?('success') && secrets_response['success'] == true &&
|
48
|
+
secrets_response.key?('data')
|
49
|
+
return secrets_response['data']
|
50
|
+
end
|
51
|
+
|
52
|
+
error_response(secrets_response)
|
53
|
+
end
|
54
|
+
|
55
|
+
def create(organization_id, key, value, note, project_ids)
|
40
56
|
command = create_command(
|
41
57
|
create: SecretCreateRequest.new(
|
42
58
|
key: key, note: note, organization_id: organization_id, project_ids: project_ids, value: value
|
@@ -68,7 +84,7 @@ module BitwardenSDKSecrets
|
|
68
84
|
error_response(secrets_response)
|
69
85
|
end
|
70
86
|
|
71
|
-
def update(id, key,
|
87
|
+
def update(organization_id, id, key, value, note, project_ids)
|
72
88
|
command = create_command(
|
73
89
|
update: SecretPutRequest.new(
|
74
90
|
id: id, key: key, note: note, organization_id: organization_id, project_ids: project_ids, value: value
|
@@ -86,7 +102,7 @@ module BitwardenSDKSecrets
|
|
86
102
|
error_response(secrets_response)
|
87
103
|
end
|
88
104
|
|
89
|
-
def
|
105
|
+
def delete(ids)
|
90
106
|
command = create_command(delete: SecretsDeleteRequest.new(ids: ids))
|
91
107
|
response = run_command(command)
|
92
108
|
|
data/lib/version.rb
CHANGED
Binary file
|
data/sig/auth.rbs
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module BitwardenSDKSecrets
|
2
|
+
class BitwardenSettings
|
3
|
+
@api_url: untyped
|
4
|
+
|
5
|
+
@identity_url: untyped
|
6
|
+
|
7
|
+
attr_accessor api_url: untyped
|
8
|
+
|
9
|
+
attr_accessor identity_url: untyped
|
10
|
+
|
11
|
+
def initialize: (untyped api_url, untyped identity_url) -> void
|
12
|
+
end
|
13
|
+
|
14
|
+
class BitwardenClient
|
15
|
+
@bitwarden: untyped
|
16
|
+
|
17
|
+
@handle: untyped
|
18
|
+
|
19
|
+
@command_runner: untyped
|
20
|
+
|
21
|
+
@projects: untyped
|
22
|
+
|
23
|
+
@secrets: untyped
|
24
|
+
|
25
|
+
@auth: untyped
|
26
|
+
|
27
|
+
attr_reader bitwarden: untyped
|
28
|
+
|
29
|
+
attr_reader projects: untyped
|
30
|
+
|
31
|
+
attr_reader secrets: untyped
|
32
|
+
|
33
|
+
attr_reader auth: untyped
|
34
|
+
|
35
|
+
def initialize: (untyped bitwarden_settings) -> void
|
36
|
+
|
37
|
+
def free_mem: () -> untyped
|
38
|
+
end
|
39
|
+
end
|
data/sig/command_runner.rbs
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module BitwardenSDKSecrets
|
2
|
+
class CommandRunner
|
3
|
+
@bitwarden_sdk: untyped
|
4
|
+
|
5
|
+
@handle: untyped
|
6
|
+
|
7
|
+
def initialize: (untyped bitwarden_sdk, untyped handle) -> void
|
8
|
+
|
9
|
+
# @param [Dry-Struct] cmd
|
10
|
+
def run: (untyped cmd) -> untyped
|
11
|
+
end
|
4
12
|
end
|
data/sig/projects.rbs
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module BitwardenSDKSecrets
|
2
|
+
class ProjectsClient
|
3
|
+
@command_runner: untyped
|
4
|
+
|
5
|
+
def initialize: (untyped command_runner) -> void
|
6
|
+
|
7
|
+
def create: (untyped organization_id, untyped project_name) -> untyped
|
8
|
+
|
9
|
+
def get: (untyped project_id) -> untyped
|
10
|
+
|
11
|
+
def list: (untyped organization_id) -> untyped
|
12
|
+
|
13
|
+
def update: (untyped organization_id, untyped id, untyped project_put_request_name) -> untyped
|
14
|
+
|
15
|
+
def delete: (untyped ids) -> untyped
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def error_response: (untyped response) -> untyped
|
20
|
+
|
21
|
+
def create_command: (untyped commands) -> untyped
|
22
|
+
|
23
|
+
def parse_response: (untyped command) -> untyped
|
24
|
+
end
|
25
|
+
end
|
data/sig/secrets.rbs
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module BitwardenSDKSecrets
|
2
|
+
class SecretsClient
|
3
|
+
@command_runner: untyped
|
4
|
+
|
5
|
+
def initialize: (untyped command_runner) -> void
|
6
|
+
|
7
|
+
def get: (untyped id) -> untyped
|
8
|
+
|
9
|
+
def get_by_ids: (untyped ids) -> untyped
|
10
|
+
|
11
|
+
def sync: (untyped organization_id, untyped last_synced_date) -> untyped
|
12
|
+
|
13
|
+
def create: (untyped organization_id, untyped key, untyped value, untyped note, untyped project_ids) -> untyped
|
14
|
+
|
15
|
+
def list: (untyped organization_id) -> untyped
|
16
|
+
|
17
|
+
def update: (untyped organization_id, untyped id, untyped key, untyped value, untyped note, untyped project_ids) -> untyped
|
18
|
+
|
19
|
+
def delete: (untyped ids) -> untyped
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def error_response: (untyped response) -> (untyped | nil | untyped)
|
24
|
+
|
25
|
+
def create_command: (untyped commands) -> untyped
|
26
|
+
|
27
|
+
def run_command: (untyped command) -> untyped
|
28
|
+
end
|
29
|
+
end
|
data/sig/version.rbs
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitwarden-sdk-secrets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bitwarden Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-struct
|
@@ -103,6 +103,7 @@ extra_rdoc_files: []
|
|
103
103
|
files:
|
104
104
|
- Rakefile
|
105
105
|
- bitwarden-sdk-secrets.gemspec
|
106
|
+
- lib/auth.rb
|
106
107
|
- lib/bitwarden-sdk-secrets.rb
|
107
108
|
- lib/bitwarden_error.rb
|
108
109
|
- lib/bitwarden_lib.rb
|
@@ -116,12 +117,14 @@ files:
|
|
116
117
|
- lib/secrets.rb
|
117
118
|
- lib/version.rb
|
118
119
|
- lib/windows-x64/bitwarden_c.dll
|
119
|
-
- sig/
|
120
|
-
- sig/
|
120
|
+
- sig/auth.rbs
|
121
|
+
- sig/bitwarden-sdk-secrets.rbs
|
122
|
+
- sig/bitwarden_error.rbs
|
123
|
+
- sig/bitwarden_lib.rbs
|
121
124
|
- sig/command_runner.rbs
|
122
|
-
- sig/
|
123
|
-
- sig/
|
124
|
-
- sig/
|
125
|
+
- sig/projects.rbs
|
126
|
+
- sig/secrets.rbs
|
127
|
+
- sig/version.rbs
|
125
128
|
homepage: https://bitwarden.com/products/secrets-manager/
|
126
129
|
licenses: []
|
127
130
|
metadata:
|
data/sig/bitwarden-sdk.rbs
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require_relative '../lib/schemas'
|
2
|
-
|
3
|
-
class BitwardenClient
|
4
|
-
@command_runner: CommandRunner
|
5
|
-
|
6
|
-
attr_reader bitwarden: Module
|
7
|
-
attr_reader project_client: ProjectsClient
|
8
|
-
attr_reader secrets_client: SecretsClient
|
9
|
-
|
10
|
-
def initialize: (BitwardenSettings) -> void
|
11
|
-
def access_token_login: (String) -> JSON
|
12
|
-
def free_mem: () -> nil
|
13
|
-
end
|
data/sig/bitwarden_settings.rbs
DELETED
data/sig/projects_client.rbs
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require_once '../lib/extended_schemas/schemas.rbs'
|
2
|
-
require_once '../schemas.rbs'
|
3
|
-
|
4
|
-
class ProjectsClient
|
5
|
-
@command_runner: CommandRunner
|
6
|
-
def initialize: (command_runner: CommandRunner) -> void
|
7
|
-
def create_project: (project_name: String, organization_id: String) -> ProjectsResponse
|
8
|
-
def get: (project_id: String) -> ProjectsResponse
|
9
|
-
def list_projects: (organization_id: String) -> Array(DatumElement)
|
10
|
-
def update_project: (id: String, project_put_request_name: String, organization_id: String) -> ProjectsResponse
|
11
|
-
def delete_projects: (ids: Array[String]) -> Array(ProjectDeleteResponse)
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def create_command: (SelectiveProjectsCommand) -> SelectiveCommand
|
16
|
-
def parse_response: (ResponseForProjectResponse) -> ResponseForProjectResponse
|
17
|
-
end
|
data/sig/sdk.rbs
DELETED
data/sig/secrets_client.rbs
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require_once '../lib/extended_schemas/schemas.rbs'
|
2
|
-
require_once '../schemas.rbs'
|
3
|
-
|
4
|
-
class SecretsClient
|
5
|
-
# @command_runner: CommandRunner
|
6
|
-
def initialize: (command_runner: CommandRunner) -> void
|
7
|
-
def get: (id: String) -> SecretResponse
|
8
|
-
def get_by_ids: (ids: Array[String]) -> Array(SecretIdentifierResponse)
|
9
|
-
def create: (key: String, note: String, organization_id: String, project_ids: Array[String], value: String) -> SecretResponse
|
10
|
-
def list: (organization_id: String) -> Array(SecretIdentifierResponse)
|
11
|
-
def update: (id: String, key: String, note: String, organization_id: String, project_ids: Array[String], value: String) -> SecretResponse
|
12
|
-
def delete_secret: (ids: Array[String]) -> Array(SecretDeleteResponse)
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def create_command: (SelectiveSecretsCommand) -> SelectiveCommand
|
17
|
-
def parse_response: (SelectiveSecretCommand) -> ResponseForSecretResponse
|
18
|
-
end
|