duse 0.0.3 → 0.0.4
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 +8 -8
- data/lib/duse/cli/command.rb +1 -1
- data/lib/duse/cli/help.rb +1 -1
- data/lib/duse/cli/secret_add.rb +6 -3
- data/lib/duse/cli/secret_get.rb +8 -2
- data/lib/duse/cli/secret_list.rb +3 -2
- data/lib/duse/cli/secret_update.rb +3 -4
- data/lib/duse/cli/share_with_user.rb +2 -2
- data/lib/duse/client/entity.rb +14 -1
- data/lib/duse/client/secret.rb +68 -40
- data/lib/duse/client/user.rb +4 -0
- data/lib/duse/encryption.rb +89 -17
- data/lib/duse/version.rb +1 -1
- data/spec/cli/commands/login_spec.rb +1 -1
- data/spec/cli/commands/secret_spec.rb +15 -19
- data/spec/client/secret_spec.rb +84 -27
- data/spec/client/user_spec.rb +4 -4
- data/spec/support/mock_api.rb +19 -15
- metadata +2 -3
- data/spec/client/secret_marshaller_spec.rb +0 -32
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
ZDc4NmU1MWM3MzJhOGZhY2MxOWE1YjA3OTk0MDliNmEwNDg3NWI1Mw==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
NDQ4ZGRmNWI3MjI5ZjgxMDdkOWFjM2Q4Y2NlNzZiNzc1NTBhM2U3OA==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
MGNlMzllOGQ5ODU2OGRmYWU1OWM0NzViYzU1ZWM4NjQ4MjViOTI3YmVkODU3
|
|
10
|
+
ODVkZTQ0N2UxNTFmMjgxMjg1OGJkYjNiNzAzOGM2MzE0YmFmOWJkMjBiMTgz
|
|
11
|
+
MGI0MDkwNGM5NWNjNTllMTNlYjcwNWNhZWUwN2RjN2JiOTdjYjM=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
NTlhMjczMmIwOTM5MjI1NTczYTQwYTQyNjYwMWI0ODg4OWExZTYxMGE4Y2E4
|
|
14
|
+
N2FhMTQ0M2MzY2FiYmMyYmFmNWZhZWM0YzVkYTVjMzhmZDU3NWFlMjczYWJi
|
|
15
|
+
NjRhNjM5MTFkMmIxZDkyY2ZiYzRlODVlMGUwYWE4YThiOWIyYTg=
|
data/lib/duse/cli/command.rb
CHANGED
|
@@ -174,7 +174,7 @@ module Duse
|
|
|
174
174
|
result = "#{self.class.description}\n\n"
|
|
175
175
|
result << "Usage: duse #{full_command} COMMAND ...\n\nAvailable commands:\n\n"
|
|
176
176
|
self.class.subcommands.each { |command_class| result << "\t#{color(command_class.command_name, :command).ljust(22)} #{color(command_class.description, :info)}\n" }
|
|
177
|
-
result << "\nrun
|
|
177
|
+
result << "\nrun `duse help #{full_command} COMMAND` for more infos"
|
|
178
178
|
result
|
|
179
179
|
end
|
|
180
180
|
|
data/lib/duse/cli/help.rb
CHANGED
|
@@ -11,7 +11,7 @@ module Duse
|
|
|
11
11
|
else
|
|
12
12
|
say "Usage: duse COMMAND ...\n\nAvailable commands:\n\n"
|
|
13
13
|
commands.each { |c| say "\t#{color(c.command_name, :command).ljust(22)} #{color(c.description, :info)}" }
|
|
14
|
-
say "\nrun
|
|
14
|
+
say "\nrun `duse help COMMAND` for more infos"
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
data/lib/duse/cli/secret_add.rb
CHANGED
|
@@ -10,7 +10,7 @@ module Duse
|
|
|
10
10
|
include KeyHelper
|
|
11
11
|
include ShareWithUser
|
|
12
12
|
|
|
13
|
-
description '
|
|
13
|
+
description 'Interactively create a new secret, or set values via options'
|
|
14
14
|
|
|
15
15
|
on('-t', '--title [TITLE]', 'The title for the secret to save')
|
|
16
16
|
on('-s', '--secret [SECRET]', 'The secret to save')
|
|
@@ -27,8 +27,11 @@ module Duse
|
|
|
27
27
|
user = Duse::User.current
|
|
28
28
|
ensure_matching_keys_for user
|
|
29
29
|
private_key = config.private_key_for user
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
secret_hash = Duse::Client::CreateSecret.with(
|
|
31
|
+
title: self.title,
|
|
32
|
+
secret_text: self.secret,
|
|
33
|
+
users: users
|
|
34
|
+
).sign_with(private_key).build
|
|
32
35
|
|
|
33
36
|
response = Duse::Secret.create secret_hash
|
|
34
37
|
success 'Secret successfully created!'
|
data/lib/duse/cli/secret_get.rb
CHANGED
|
@@ -11,7 +11,13 @@ module Duse
|
|
|
11
11
|
on('-p', '--plain', 'Print the decrypted secret plain, without additional information.')
|
|
12
12
|
|
|
13
13
|
def run(secret_id = nil)
|
|
14
|
-
secret_id
|
|
14
|
+
if secret_id.nil?
|
|
15
|
+
secrets = Duse::Secret.all
|
|
16
|
+
secrets.each do |s|
|
|
17
|
+
say "#{s.id}: #{s.title}"
|
|
18
|
+
end
|
|
19
|
+
secret_id = terminal.ask("\nSelect the id of the secret to retrieve: ").to_i
|
|
20
|
+
end
|
|
15
21
|
|
|
16
22
|
secret = Duse::Secret.find secret_id
|
|
17
23
|
print_secret(secret)
|
|
@@ -32,7 +38,7 @@ module Duse
|
|
|
32
38
|
say "
|
|
33
39
|
Name: #{secret.title}
|
|
34
40
|
Secret: #{plain_secret}
|
|
35
|
-
Access: #{secret.users.map(&:username).join(', ')}
|
|
41
|
+
Access: #{secret.users.delete_if(&:server?).map(&:username).join(', ')}
|
|
36
42
|
".gsub(/^( |\t)+/, "")
|
|
37
43
|
end
|
|
38
44
|
end
|
data/lib/duse/cli/secret_list.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'duse/cli'
|
|
2
|
+
require 'duse/cli/secret_add'
|
|
2
3
|
|
|
3
4
|
module Duse
|
|
4
5
|
module CLI
|
|
@@ -8,11 +9,11 @@ module Duse
|
|
|
8
9
|
def run
|
|
9
10
|
secrets = Duse::Secret.all
|
|
10
11
|
secrets.each do |s|
|
|
11
|
-
|
|
12
|
+
say "#{s.id}: #{s.title}"
|
|
12
13
|
end
|
|
13
14
|
if secrets.empty?
|
|
14
15
|
say 'You have not yet saved any secrets, ' \
|
|
15
|
-
|
|
16
|
+
"you can do so with \"duse #{SecretAdd.full_command}\"."
|
|
16
17
|
end
|
|
17
18
|
end
|
|
18
19
|
end
|
|
@@ -19,8 +19,7 @@ module Duse
|
|
|
19
19
|
private_key = config.private_key_for user
|
|
20
20
|
secret = Duse::Secret.find secret_id
|
|
21
21
|
print_secret secret, private_key
|
|
22
|
-
|
|
23
|
-
secret_hash = Duse::Client::SecretMarshaller.new(secret, private_key).to_h
|
|
22
|
+
secret_hash = Duse::Client::UpdateSecret.values(secret, values_to_update).encrypt_with(private_key).build
|
|
24
23
|
|
|
25
24
|
response = Duse::Secret.update secret_id, secret_hash
|
|
26
25
|
success 'Secret successfully updated!'
|
|
@@ -33,11 +32,11 @@ module Duse
|
|
|
33
32
|
puts "Secret: #{secret.decrypt(private_key)}\n"
|
|
34
33
|
end
|
|
35
34
|
|
|
36
|
-
def
|
|
35
|
+
def values_to_update
|
|
37
36
|
title = terminal.ask 'What do you want to call this secret? ' if terminal.agree 'Change the title? '
|
|
38
37
|
secret_text = terminal.ask 'Secret to save: ' if terminal.agree 'Change the secret? '
|
|
39
38
|
users = who_to_share_with if terminal.agree 'Change accessible users? '
|
|
40
|
-
|
|
39
|
+
{ title: title, secret_text: secret_text, users: users }.delete_if { |k, v| v.nil? }
|
|
41
40
|
end
|
|
42
41
|
end
|
|
43
42
|
end
|
|
@@ -17,7 +17,7 @@ module Duse
|
|
|
17
17
|
|
|
18
18
|
def who_to_share_with
|
|
19
19
|
required_users = [Duse::User.find('me'), Duse::User.find('server')]
|
|
20
|
-
wants_to_share = terminal.agree 'Do you want to share this secret?[
|
|
20
|
+
wants_to_share = terminal.agree 'Do you want to share this secret?[y/n] '
|
|
21
21
|
return required_users unless wants_to_share
|
|
22
22
|
required_users + select_users(required_users)
|
|
23
23
|
end
|
|
@@ -32,7 +32,7 @@ module Duse
|
|
|
32
32
|
|
|
33
33
|
def select_from_list(subjects, method = :to_s)
|
|
34
34
|
print_list(subjects, method)
|
|
35
|
-
selection = terminal.ask '
|
|
35
|
+
selection = terminal.ask 'Type the ids of the users you want to share with (separate with commas to select multiple)'
|
|
36
36
|
CommaSeparatedIntegerList.new(selection).map do |i|
|
|
37
37
|
fail InvalidSelection if subjects[i-1].nil?
|
|
38
38
|
subjects[i-1]
|
data/lib/duse/client/entity.rb
CHANGED
|
@@ -41,6 +41,14 @@ module Duse
|
|
|
41
41
|
define_method("#{name}?") { !!send(name) } unless dummy.respond_to? "#{name}?"
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
def self.ignore_in_json(*attributes)
|
|
45
|
+
@ignored_attributes ||= []
|
|
46
|
+
attributes.each do |attribute|
|
|
47
|
+
@ignored_attributes << attribute
|
|
48
|
+
end
|
|
49
|
+
@ignored_attributes
|
|
50
|
+
end
|
|
51
|
+
|
|
44
52
|
def self.id_field(key = nil)
|
|
45
53
|
@id_field = key.to_s if key
|
|
46
54
|
@id_field
|
|
@@ -48,7 +56,6 @@ module Duse
|
|
|
48
56
|
|
|
49
57
|
attr_accessor :curry
|
|
50
58
|
attr_reader :attributes
|
|
51
|
-
alias_method :to_h, :attributes
|
|
52
59
|
|
|
53
60
|
def initialize(options = {})
|
|
54
61
|
@attributes = {}
|
|
@@ -82,6 +89,12 @@ module Duse
|
|
|
82
89
|
return false unless self.class.attributes.include? name
|
|
83
90
|
!attributes.key?(name)
|
|
84
91
|
end
|
|
92
|
+
|
|
93
|
+
def to_h
|
|
94
|
+
result = attributes.clone
|
|
95
|
+
self.class.ignore_in_json.each { |e| result.delete e.to_s }
|
|
96
|
+
result
|
|
97
|
+
end
|
|
85
98
|
end
|
|
86
99
|
end
|
|
87
100
|
end
|
data/lib/duse/client/secret.rb
CHANGED
|
@@ -4,65 +4,93 @@ require 'secret_sharing'
|
|
|
4
4
|
|
|
5
5
|
module Duse
|
|
6
6
|
module Client
|
|
7
|
-
class
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
class UpdateSecret
|
|
8
|
+
# Possible Scenarios
|
|
9
|
+
# ------------------
|
|
10
|
+
# change title
|
|
11
|
+
# change secret -> changes cipher + shares
|
|
12
|
+
# change users -> changes shares
|
|
13
|
+
def initialize(secret, values_to_update)
|
|
14
|
+
@secret = secret
|
|
15
|
+
@values = values_to_update
|
|
11
16
|
end
|
|
12
17
|
|
|
13
|
-
def
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
secret_hash['parts'] = parts_from_secret if @secret.secret_text
|
|
17
|
-
secret_hash
|
|
18
|
+
def encrypt_with(private_key)
|
|
19
|
+
@private_key = private_key
|
|
20
|
+
self
|
|
18
21
|
end
|
|
19
22
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{"user_id" => user.id, "content" => content, "signature" => signature}
|
|
29
|
-
end
|
|
23
|
+
def build
|
|
24
|
+
result = {}
|
|
25
|
+
result[:title] = @values[:title] if @values[:title]
|
|
26
|
+
if @values[:secret_text]
|
|
27
|
+
users = @secret.users || @values[:current_users]
|
|
28
|
+
cipher_text, shares = Encryption.encrypt(@values[:secret_text], users, @private_key)
|
|
29
|
+
result[:cipher_text] = cipher_text
|
|
30
|
+
result[:shares] = shares
|
|
30
31
|
end
|
|
32
|
+
if @values[:secret_text].nil? && @values[:users]
|
|
33
|
+
symmetric_key = Encryption.decrypt_symmetric_key(@secret.shares, @private_key)
|
|
34
|
+
result[:shares] = Encryption.encrypt_symmetric_key(symmetric_key, @values[:users], @private_key)
|
|
35
|
+
end
|
|
36
|
+
result
|
|
31
37
|
end
|
|
32
38
|
|
|
33
|
-
def
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
def self.values(secret, value_hash)
|
|
40
|
+
new(secret, value_hash)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class CreateSecret
|
|
45
|
+
class CreatableSecret
|
|
46
|
+
def initialize(options)
|
|
47
|
+
@options = options
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def build
|
|
51
|
+
cipher_text, shares = Encryption.encrypt(@options[:secret_text], @options[:users], @options[:private_key])
|
|
52
|
+
{
|
|
53
|
+
title: @options[:title],
|
|
54
|
+
cipher_text: cipher_text,
|
|
55
|
+
shares: shares
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.with(options)
|
|
61
|
+
new(options)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def initialize(options)
|
|
65
|
+
@title = options.fetch(:title)
|
|
66
|
+
@secret_text = options.fetch(:secret_text)
|
|
67
|
+
@users = options.fetch(:users)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def sign_with(private_key)
|
|
71
|
+
CreatableSecret.new(
|
|
72
|
+
title: @title,
|
|
73
|
+
secret_text: @secret_text,
|
|
74
|
+
users: @users,
|
|
75
|
+
private_key: private_key
|
|
76
|
+
)
|
|
36
77
|
end
|
|
37
78
|
end
|
|
38
79
|
|
|
39
80
|
class Secret < Entity
|
|
40
|
-
attributes :id, :title, :
|
|
81
|
+
attributes :id, :title, :shares, :cipher_text
|
|
41
82
|
has :users
|
|
42
83
|
|
|
43
|
-
attr_accessor :secret_text
|
|
44
|
-
|
|
45
84
|
id_field :id
|
|
46
85
|
one :secret
|
|
47
86
|
many :secrets
|
|
48
87
|
|
|
49
88
|
def decrypt(private_key)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
end
|
|
54
|
-
self.secret_text = Encryption.decode(secret_text)
|
|
55
|
-
end
|
|
56
|
-
self.secret_text
|
|
57
|
-
end
|
|
89
|
+
# require private_key to be private rsa key
|
|
90
|
+
# require shares to be set (real shares object in the future)
|
|
91
|
+
# require cipher_text to be set
|
|
58
92
|
|
|
59
|
-
|
|
60
|
-
return nil if load_attribute('parts').nil?
|
|
61
|
-
load_attribute('parts').map do |part|
|
|
62
|
-
part.map do |share|
|
|
63
|
-
Duse::Encryption.decrypt private_key, share
|
|
64
|
-
end
|
|
65
|
-
end
|
|
93
|
+
Encryption.decrypt(self.cipher_text, self.shares, private_key)
|
|
66
94
|
end
|
|
67
95
|
end
|
|
68
96
|
end
|
data/lib/duse/client/user.rb
CHANGED
data/lib/duse/encryption.rb
CHANGED
|
@@ -1,38 +1,110 @@
|
|
|
1
1
|
require 'openssl'
|
|
2
|
+
require 'digest/sha2'
|
|
2
3
|
require 'base64'
|
|
3
4
|
|
|
4
5
|
module Duse
|
|
5
6
|
module Encryption
|
|
6
|
-
|
|
7
|
+
module Encoding
|
|
8
|
+
def encode(plain_text)
|
|
9
|
+
Base64.encode64(plain_text).encode('utf-8')
|
|
10
|
+
end
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
[encode(encrypted), signature]
|
|
12
|
+
def decode(encoded_text)
|
|
13
|
+
Base64.decode64(encoded_text.encode('ascii-8bit')).force_encoding('utf-8')
|
|
14
|
+
end
|
|
12
15
|
end
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
module Asymmetric
|
|
18
|
+
extend self
|
|
19
|
+
extend Duse::Encryption::Encoding
|
|
20
|
+
|
|
21
|
+
def encrypt(private_key, public_key, text)
|
|
22
|
+
encrypted = public_key.public_encrypt text.force_encoding('ascii-8bit')
|
|
23
|
+
signature = sign(private_key, encrypted)
|
|
24
|
+
[encode(encrypted), signature]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def sign(private_key, text)
|
|
28
|
+
encode(private_key.sign(digest, text))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def decrypt(private_key, text)
|
|
32
|
+
private_key.private_decrypt(decode(text)).force_encoding('utf-8')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def verify(public_key, signature, encrypted)
|
|
36
|
+
public_key.verify digest, decode(signature), decode(encrypted)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def digest
|
|
40
|
+
OpenSSL::Digest::SHA256.new
|
|
41
|
+
end
|
|
16
42
|
end
|
|
17
43
|
|
|
18
|
-
|
|
19
|
-
|
|
44
|
+
module Symmetric
|
|
45
|
+
extend self
|
|
46
|
+
extend Duse::Encryption::Encoding
|
|
47
|
+
|
|
48
|
+
def encrypt(plaintext)
|
|
49
|
+
plaintext = encode(plaintext)
|
|
50
|
+
cipher = symmetric_algorithm
|
|
51
|
+
cipher.encrypt
|
|
52
|
+
key = cipher.random_key
|
|
53
|
+
iv = cipher.random_iv
|
|
54
|
+
|
|
55
|
+
cipher_text = cipher.update(plaintext)
|
|
56
|
+
cipher_text << cipher.final
|
|
57
|
+
|
|
58
|
+
[encode(key), encode(iv), encode(cipher_text)]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def decrypt(key, iv, cipher_text)
|
|
62
|
+
key = decode(key)
|
|
63
|
+
iv = decode(iv)
|
|
64
|
+
cipher_text = decode(cipher_text)
|
|
65
|
+
|
|
66
|
+
cipher = symmetric_algorithm
|
|
67
|
+
cipher.decrypt
|
|
68
|
+
cipher.key = key
|
|
69
|
+
cipher.iv = iv
|
|
70
|
+
|
|
71
|
+
plaintext = cipher.update(cipher_text)
|
|
72
|
+
plaintext << cipher.final
|
|
73
|
+
decode(plaintext)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def symmetric_algorithm
|
|
77
|
+
OpenSSL::Cipher.new('AES-256-CBC')
|
|
78
|
+
end
|
|
20
79
|
end
|
|
21
80
|
|
|
22
|
-
|
|
23
|
-
|
|
81
|
+
extend self
|
|
82
|
+
|
|
83
|
+
def encrypt(secret_text, users, private_key)
|
|
84
|
+
key, iv, cipher_text = Encryption::Symmetric.encrypt secret_text
|
|
85
|
+
shares = encrypt_symmetric_key("#{key.strip} #{iv.strip}", users, private_key)
|
|
86
|
+
[cipher_text, shares]
|
|
24
87
|
end
|
|
25
88
|
|
|
26
|
-
def
|
|
27
|
-
|
|
89
|
+
def decrypt(cipher_text, shares, private_key)
|
|
90
|
+
key, iv = decrypt_symmetric_key(shares, private_key).split ' '
|
|
91
|
+
Encryption::Symmetric.decrypt(key, iv, cipher_text)
|
|
28
92
|
end
|
|
29
93
|
|
|
30
|
-
def
|
|
31
|
-
|
|
94
|
+
def encrypt_symmetric_key(symmetric_key, users, private_key)
|
|
95
|
+
raw_shares = SecretSharing.split_secret(symmetric_key, 2, users.length)
|
|
96
|
+
users.map.with_index do |user, index|
|
|
97
|
+
share = raw_shares[index]
|
|
98
|
+
content, signature = Encryption::Asymmetric.encrypt(private_key, user.public_key, share)
|
|
99
|
+
{"user_id" => user.id, "content" => content, "signature" => signature}
|
|
100
|
+
end
|
|
32
101
|
end
|
|
33
102
|
|
|
34
|
-
def
|
|
35
|
-
|
|
103
|
+
def decrypt_symmetric_key(shares, private_key)
|
|
104
|
+
raw_shares = shares.map do |share|
|
|
105
|
+
Encryption::Asymmetric.decrypt private_key, share
|
|
106
|
+
end
|
|
107
|
+
SecretSharing.recover_secret(raw_shares)
|
|
36
108
|
end
|
|
37
109
|
end
|
|
38
110
|
end
|
data/lib/duse/version.rb
CHANGED
|
@@ -10,7 +10,7 @@ describe 'duse login' do
|
|
|
10
10
|
context 'correct credentials' do
|
|
11
11
|
it 'writes the auth token in the config file' do
|
|
12
12
|
open(File.join(Duse::CLIConfig.config_dir, 'flower-pot'), 'w') do |f|
|
|
13
|
-
f.puts "-----BEGIN RSA PRIVATE KEY-----\
|
|
13
|
+
f.puts "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAmMm3Ovh7gU0rLHK4NiHhWaYRrV9PH6XtHqV0GoiHH7awrjVk\nT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ7FLTWMZNoZ/uh41g4Iv17Wh1I3Fg\nqihdm83cSWvJ81qQCVGBaKeVitSa49zT/MmooBvYFwulaqJjhqFc3862Rl3WowzG\nVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1nng06HIAvMqUcGMebgoju9SuKaR+C\n46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHSI9hTEuPopPSyRqz/EVQfbhi0Lbkd\nDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7AwIDAQABAoIBAQCGSVyLLxRWC/4z\nPc0cfuCyy5xj1g4UEeD7+421OGQTAp39L54vgTzG76SJL/hIsn660b46ZL7BxUd8\nPiK2Mi/C1fU95GUc9hVO/Hq2QS1wcUvrT94XEA1eQCwqN9uy0Nkh54om8owkDkLo\nnRGQ76kOuApQDwNfWsTA8phPeT6JTtr+2K2yc0H4G5G0+py2GDclq56E99SljAqq\nwjFKGazqF0pxJvqLRCR9uVt0FgrRANOLGvxPMNZtnkVBVHmXs1iRD7BUALfESGS1\nHXZxjvD487E2h0Vjkli7rqnu6FZNgQ8Mq5TOfIm5i04LeGCgSTNP9sw7vdZgaYgT\nDPK9BIlZAoGBAMlhenDUOkT1dm28CjGCkygM1kUgDTQDLyBXW/JacotRp3GVZLr2\nV/2rZ3JPxva0cjjs3X4q/CxYsHvqI/ImXbsTBOYIT1/y1fgmXvN6AbiVW5Qne1UD\nneEGqCyB6YfKV2/8CX5Ru01Ay1EYVQDU4APkR1P4H38CuTMeu8SHK/BHAoGBAMI6\nR6TeEIdLprWRmUKU8Iuiwwm0SVxle2trSj6mknsJ93sK7gQkoKNzw0qwZdM6ApKH\nbJo/LiwiZ1Znx1NOyDsKT/ET6CSl59jOBuSUoxqTJ8XvrWlSD8pkbOJ2zWF8WqFR\ncC74bNFgd+n0tftR/7dwkriebITrp5IpF6P2Z9llAoGAAqO3ciEl/l9lRPzw+UMn\n4J+Cc3d/FM5x4K+kceHDnJXeZvu5TUYLUzTa70Gibvtgf+SC5rNziLVE4urnu7XL\nBreyGb3EJJLPQShnmDNiMGQsxh1aXXvlptxqeeLeB7ycNsiL607w8ItH3vE9s/wW\nT5a/ZJdc+lIz0Tq25VWMOuMCgYAejVZZu8izz5WguA94pr8T5/1wGFj13MzGP/FE\n26TtD8tLIpQAONa//2S36fmKeXSQIhdWSBv2O08wC1ESbLEYgG3EyVHZ+fL3aqkw\n6aSieIVoIGSRzaPIPXXXRcLW093ZxFq2OMO9R8R1G9ZIe0STUXTy75C4c+0/E5Gx\nbAA39QKBgDLjtjmG3nJGpQuaftAAjJR+AcA3svSdVug7w5k6D+lxBeM/x4pGP9z4\nkdOrqeD6bv1cctouVVywK/ZQ8dyLczJoGfJIlCvacI1L7fyVUpBp2Lby/uwYMd5w\ngswew+6Xnvtx15SirvYQmDRzA71KBSA4GxpaFwthRIxIwn881m5U\n-----END RSA PRIVATE KEY-----\n"
|
|
14
14
|
end
|
|
15
15
|
stub_user_me_get
|
|
16
16
|
stub_request(:post, "https://example.com/users/token").
|
|
@@ -6,22 +6,8 @@ RSpec.describe 'duse secret' do
|
|
|
6
6
|
f.puts 'uri: https://example.com/'
|
|
7
7
|
f.puts 'token: token'
|
|
8
8
|
end
|
|
9
|
-
open(Duse::CLIConfig.
|
|
10
|
-
f.puts "-----BEGIN RSA PRIVATE KEY-----"
|
|
11
|
-
f.puts "MIICWgIBAAKBgQCftZvHkB6uKWVDvrIzmy2p496Hv9PD/hhRk+DSXcE/CPtRmvYZ"
|
|
12
|
-
f.puts "zbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTeNdlaH9cRFV2wc2A/hbg2kaIS"
|
|
13
|
-
f.puts "xrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET2XM6tZcuwFULX6bl8QIDAQAB"
|
|
14
|
-
f.puts "AoGAEJwyt26lwjdL8N/EaNmaxjCM1FF/FMM4hEN8/mQB1Sx59uLG9agPWzrDJcoS"
|
|
15
|
-
f.puts "lH7ZalKLwpORTuCYvCtKH7Qm+fgnjKl/qyn6/cDmtk6VtJvPjQGi3oh2eRIMcwZv"
|
|
16
|
-
f.puts "va+NQLF11bm0kVtZG5viIKlb1snHzkpPjFAOPBqQj2FNdgECQQDQdHWC5XYww2RQ"
|
|
17
|
-
f.puts "/FpRBacJPIxb8PAwb7+EjqJSaruGO9CtLiDiCzlmidGP0Q++zwjAxksSqP4qkr6k"
|
|
18
|
-
f.puts "pKvDqkydAkEAxCLuq0c+6gnE9X1PUy4Bl/hUOxrk3ZQRCMUCE4XB8mNmJTLNY43O"
|
|
19
|
-
f.puts "cY7Z1sdaCu7pAiGxQqojUYgwFACGmbOcZQJAZAvg8mfq59B/bxcOyeAqoRY8T0w+"
|
|
20
|
-
f.puts "GyEnDBng8iljwzMmHlgLVDIK5Jm0yI+QPQXkr5D8KwKMqiYv9ZlLDufHSQJAJs9i"
|
|
21
|
-
f.puts "urGWWWkleA4brDHmTtPsluVzdATgegPBrWtCPVw90g6DZbehqgbCRCWeQ5uSr8FK"
|
|
22
|
-
f.puts "+g4AfxmbqdmQyMkpoQI/HvHjjPB9a/2qkpyjeiJIx2gmCmhBke9V/b3XFGBy3ci7"
|
|
23
|
-
f.puts "LZRZUZLlAdJORX177Ief6MWqgXldlcP1N7mzWskE"
|
|
24
|
-
f.puts "-----END RSA PRIVATE KEY-----"
|
|
9
|
+
open(File.join(Duse::CLIConfig.config_dir, 'flower-pot'), 'w') do |f|
|
|
10
|
+
f.puts "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAmMm3Ovh7gU0rLHK4NiHhWaYRrV9PH6XtHqV0GoiHH7awrjVk\nT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ7FLTWMZNoZ/uh41g4Iv17Wh1I3Fg\nqihdm83cSWvJ81qQCVGBaKeVitSa49zT/MmooBvYFwulaqJjhqFc3862Rl3WowzG\nVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1nng06HIAvMqUcGMebgoju9SuKaR+C\n46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHSI9hTEuPopPSyRqz/EVQfbhi0Lbkd\nDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7AwIDAQABAoIBAQCGSVyLLxRWC/4z\nPc0cfuCyy5xj1g4UEeD7+421OGQTAp39L54vgTzG76SJL/hIsn660b46ZL7BxUd8\nPiK2Mi/C1fU95GUc9hVO/Hq2QS1wcUvrT94XEA1eQCwqN9uy0Nkh54om8owkDkLo\nnRGQ76kOuApQDwNfWsTA8phPeT6JTtr+2K2yc0H4G5G0+py2GDclq56E99SljAqq\nwjFKGazqF0pxJvqLRCR9uVt0FgrRANOLGvxPMNZtnkVBVHmXs1iRD7BUALfESGS1\nHXZxjvD487E2h0Vjkli7rqnu6FZNgQ8Mq5TOfIm5i04LeGCgSTNP9sw7vdZgaYgT\nDPK9BIlZAoGBAMlhenDUOkT1dm28CjGCkygM1kUgDTQDLyBXW/JacotRp3GVZLr2\nV/2rZ3JPxva0cjjs3X4q/CxYsHvqI/ImXbsTBOYIT1/y1fgmXvN6AbiVW5Qne1UD\nneEGqCyB6YfKV2/8CX5Ru01Ay1EYVQDU4APkR1P4H38CuTMeu8SHK/BHAoGBAMI6\nR6TeEIdLprWRmUKU8Iuiwwm0SVxle2trSj6mknsJ93sK7gQkoKNzw0qwZdM6ApKH\nbJo/LiwiZ1Znx1NOyDsKT/ET6CSl59jOBuSUoxqTJ8XvrWlSD8pkbOJ2zWF8WqFR\ncC74bNFgd+n0tftR/7dwkriebITrp5IpF6P2Z9llAoGAAqO3ciEl/l9lRPzw+UMn\n4J+Cc3d/FM5x4K+kceHDnJXeZvu5TUYLUzTa70Gibvtgf+SC5rNziLVE4urnu7XL\nBreyGb3EJJLPQShnmDNiMGQsxh1aXXvlptxqeeLeB7ycNsiL607w8ItH3vE9s/wW\nT5a/ZJdc+lIz0Tq25VWMOuMCgYAejVZZu8izz5WguA94pr8T5/1wGFj13MzGP/FE\n26TtD8tLIpQAONa//2S36fmKeXSQIhdWSBv2O08wC1ESbLEYgG3EyVHZ+fL3aqkw\n6aSieIVoIGSRzaPIPXXXRcLW093ZxFq2OMO9R8R1G9ZIe0STUXTy75C4c+0/E5Gx\nbAA39QKBgDLjtjmG3nJGpQuaftAAjJR+AcA3svSdVug7w5k6D+lxBeM/x4pGP9z4\nkdOrqeD6bv1cctouVVywK/ZQ8dyLczJoGfJIlCvacI1L7fyVUpBp2Lby/uwYMd5w\ngswew+6Xnvtx15SirvYQmDRzA71KBSA4GxpaFwthRIxIwn881m5U\n-----END RSA PRIVATE KEY-----\n"
|
|
25
11
|
end
|
|
26
12
|
end
|
|
27
13
|
|
|
@@ -32,7 +18,7 @@ RSpec.describe 'duse secret' do
|
|
|
32
18
|
stub_user_me_get
|
|
33
19
|
stub_server_user_get
|
|
34
20
|
expect(run_cli('secret', 'get', '1').out).to eq(
|
|
35
|
-
"\nName: test\nSecret: test\nAccess:
|
|
21
|
+
"\nName: test\nSecret: test\nAccess: flower-pot\n"
|
|
36
22
|
)
|
|
37
23
|
end
|
|
38
24
|
|
|
@@ -58,11 +44,12 @@ RSpec.describe 'duse secret' do
|
|
|
58
44
|
|
|
59
45
|
context 'secret exists' do
|
|
60
46
|
it 'asks for the secret id' do
|
|
47
|
+
stub_get_secrets
|
|
61
48
|
stub_secret_get
|
|
62
49
|
stub_user_me_get
|
|
63
50
|
stub_server_user_get
|
|
64
51
|
expect(run_cli('secret', 'get') { |i| i.puts('1') }.out).to eq(
|
|
65
|
-
"
|
|
52
|
+
"1: test\n\nSelect the id of the secret to retrieve: \nName: test\nSecret: test\nAccess: flower-pot\n"
|
|
66
53
|
)
|
|
67
54
|
end
|
|
68
55
|
end
|
|
@@ -115,9 +102,18 @@ RSpec.describe 'duse secret' do
|
|
|
115
102
|
expect(run_cli('secret', 'add') do |i|
|
|
116
103
|
i.puts 'test'
|
|
117
104
|
i.puts 'test'
|
|
118
|
-
i.puts '
|
|
105
|
+
i.puts 'y'
|
|
119
106
|
i.puts '1'
|
|
120
107
|
end.success?).to be true
|
|
108
|
+
|
|
109
|
+
expect(last_run.out).to eq(
|
|
110
|
+
"What do you want to call this secret? " + # new lines are in stdin not stdout
|
|
111
|
+
"Secret to save: " +
|
|
112
|
+
"Do you want to share this secret?[y/n] " +
|
|
113
|
+
"Who do you want to share this secret with?\n" +
|
|
114
|
+
"1: adracus\n" +
|
|
115
|
+
"Type the ids of the users you want to share with (separate with commas to select multiple)\n"
|
|
116
|
+
)
|
|
121
117
|
end
|
|
122
118
|
end
|
|
123
119
|
|
data/spec/client/secret_spec.rb
CHANGED
|
@@ -23,7 +23,7 @@ RSpec.describe Duse::Client::Secret do
|
|
|
23
23
|
context 'secret exists' do
|
|
24
24
|
it 'loads a single secret with shares' do
|
|
25
25
|
stub_secret_get
|
|
26
|
-
private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\
|
|
26
|
+
private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAmMm3Ovh7gU0rLHK4NiHhWaYRrV9PH6XtHqV0GoiHH7awrjVk\nT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ7FLTWMZNoZ/uh41g4Iv17Wh1I3Fg\nqihdm83cSWvJ81qQCVGBaKeVitSa49zT/MmooBvYFwulaqJjhqFc3862Rl3WowzG\nVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1nng06HIAvMqUcGMebgoju9SuKaR+C\n46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHSI9hTEuPopPSyRqz/EVQfbhi0Lbkd\nDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7AwIDAQABAoIBAQCGSVyLLxRWC/4z\nPc0cfuCyy5xj1g4UEeD7+421OGQTAp39L54vgTzG76SJL/hIsn660b46ZL7BxUd8\nPiK2Mi/C1fU95GUc9hVO/Hq2QS1wcUvrT94XEA1eQCwqN9uy0Nkh54om8owkDkLo\nnRGQ76kOuApQDwNfWsTA8phPeT6JTtr+2K2yc0H4G5G0+py2GDclq56E99SljAqq\nwjFKGazqF0pxJvqLRCR9uVt0FgrRANOLGvxPMNZtnkVBVHmXs1iRD7BUALfESGS1\nHXZxjvD487E2h0Vjkli7rqnu6FZNgQ8Mq5TOfIm5i04LeGCgSTNP9sw7vdZgaYgT\nDPK9BIlZAoGBAMlhenDUOkT1dm28CjGCkygM1kUgDTQDLyBXW/JacotRp3GVZLr2\nV/2rZ3JPxva0cjjs3X4q/CxYsHvqI/ImXbsTBOYIT1/y1fgmXvN6AbiVW5Qne1UD\nneEGqCyB6YfKV2/8CX5Ru01Ay1EYVQDU4APkR1P4H38CuTMeu8SHK/BHAoGBAMI6\nR6TeEIdLprWRmUKU8Iuiwwm0SVxle2trSj6mknsJ93sK7gQkoKNzw0qwZdM6ApKH\nbJo/LiwiZ1Znx1NOyDsKT/ET6CSl59jOBuSUoxqTJ8XvrWlSD8pkbOJ2zWF8WqFR\ncC74bNFgd+n0tftR/7dwkriebITrp5IpF6P2Z9llAoGAAqO3ciEl/l9lRPzw+UMn\n4J+Cc3d/FM5x4K+kceHDnJXeZvu5TUYLUzTa70Gibvtgf+SC5rNziLVE4urnu7XL\nBreyGb3EJJLPQShnmDNiMGQsxh1aXXvlptxqeeLeB7ycNsiL607w8ItH3vE9s/wW\nT5a/ZJdc+lIz0Tq25VWMOuMCgYAejVZZu8izz5WguA94pr8T5/1wGFj13MzGP/FE\n26TtD8tLIpQAONa//2S36fmKeXSQIhdWSBv2O08wC1ESbLEYgG3EyVHZ+fL3aqkw\n6aSieIVoIGSRzaPIPXXXRcLW093ZxFq2OMO9R8R1G9ZIe0STUXTy75C4c+0/E5Gx\nbAA39QKBgDLjtjmG3nJGpQuaftAAjJR+AcA3svSdVug7w5k6D+lxBeM/x4pGP9z4\nkdOrqeD6bv1cctouVVywK/ZQ8dyLczJoGfJIlCvacI1L7fyVUpBp2Lby/uwYMd5w\ngswew+6Xnvtx15SirvYQmDRzA71KBSA4GxpaFwthRIxIwn881m5U\n-----END RSA PRIVATE KEY-----\n"
|
|
27
27
|
|
|
28
28
|
secret = Duse::Secret.find 1
|
|
29
29
|
|
|
@@ -61,36 +61,93 @@ RSpec.describe Duse::Client::Secret do
|
|
|
61
61
|
describe '.create' do
|
|
62
62
|
it 'builds a secret' do
|
|
63
63
|
stub_create_secret
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
content: "XMcasmkkD0eOB52ilT3sGUOy9ehHpsuIFnbmErKLsTq0PExcvSuGT6RwMKjE\nM3rS7Lu2nHgWm0IPSzi5Vd8ieJTgyayYgT9VCOOnKGqfAMmCpV0WrHpfNwLu\nUgH7VC3Wfk1F+6yzWAFOoYXBDUuIRRau4uswCpedp1pe3csmO+I=\n",
|
|
77
|
-
signature: "dAhhcWeebiE5E9jfhexu+/zem1emWG2vBQed06f4CJJ24xrWDwUgX9kggHka\nsOWgu/RnCN/qzIuN8XCPgh2I1zQegd9d5FdAHUqXJRgpT2bvmAYPZ6DM6UYs\nB8OJ7+QgQy9EahTfhfbrSKuqtnX9103ftTZtiGagzFdYi5ylMNM=\n"
|
|
78
|
-
}
|
|
79
|
-
]]
|
|
80
|
-
})
|
|
64
|
+
current_user_private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAmMm3Ovh7gU0rLHK4NiHhWaYRrV9PH6XtHqV0GoiHH7awrjVk\nT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ7FLTWMZNoZ/uh41g4Iv17Wh1I3Fg\nqihdm83cSWvJ81qQCVGBaKeVitSa49zT/MmooBvYFwulaqJjhqFc3862Rl3WowzG\nVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1nng06HIAvMqUcGMebgoju9SuKaR+C\n46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHSI9hTEuPopPSyRqz/EVQfbhi0Lbkd\nDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7AwIDAQABAoIBAQCGSVyLLxRWC/4z\nPc0cfuCyy5xj1g4UEeD7+421OGQTAp39L54vgTzG76SJL/hIsn660b46ZL7BxUd8\nPiK2Mi/C1fU95GUc9hVO/Hq2QS1wcUvrT94XEA1eQCwqN9uy0Nkh54om8owkDkLo\nnRGQ76kOuApQDwNfWsTA8phPeT6JTtr+2K2yc0H4G5G0+py2GDclq56E99SljAqq\nwjFKGazqF0pxJvqLRCR9uVt0FgrRANOLGvxPMNZtnkVBVHmXs1iRD7BUALfESGS1\nHXZxjvD487E2h0Vjkli7rqnu6FZNgQ8Mq5TOfIm5i04LeGCgSTNP9sw7vdZgaYgT\nDPK9BIlZAoGBAMlhenDUOkT1dm28CjGCkygM1kUgDTQDLyBXW/JacotRp3GVZLr2\nV/2rZ3JPxva0cjjs3X4q/CxYsHvqI/ImXbsTBOYIT1/y1fgmXvN6AbiVW5Qne1UD\nneEGqCyB6YfKV2/8CX5Ru01Ay1EYVQDU4APkR1P4H38CuTMeu8SHK/BHAoGBAMI6\nR6TeEIdLprWRmUKU8Iuiwwm0SVxle2trSj6mknsJ93sK7gQkoKNzw0qwZdM6ApKH\nbJo/LiwiZ1Znx1NOyDsKT/ET6CSl59jOBuSUoxqTJ8XvrWlSD8pkbOJ2zWF8WqFR\ncC74bNFgd+n0tftR/7dwkriebITrp5IpF6P2Z9llAoGAAqO3ciEl/l9lRPzw+UMn\n4J+Cc3d/FM5x4K+kceHDnJXeZvu5TUYLUzTa70Gibvtgf+SC5rNziLVE4urnu7XL\nBreyGb3EJJLPQShnmDNiMGQsxh1aXXvlptxqeeLeB7ycNsiL607w8ItH3vE9s/wW\nT5a/ZJdc+lIz0Tq25VWMOuMCgYAejVZZu8izz5WguA94pr8T5/1wGFj13MzGP/FE\n26TtD8tLIpQAONa//2S36fmKeXSQIhdWSBv2O08wC1ESbLEYgG3EyVHZ+fL3aqkw\n6aSieIVoIGSRzaPIPXXXRcLW093ZxFq2OMO9R8R1G9ZIe0STUXTy75C4c+0/E5Gx\nbAA39QKBgDLjtjmG3nJGpQuaftAAjJR+AcA3svSdVug7w5k6D+lxBeM/x4pGP9z4\nkdOrqeD6bv1cctouVVywK/ZQ8dyLczJoGfJIlCvacI1L7fyVUpBp2Lby/uwYMd5w\ngswew+6Xnvtx15SirvYQmDRzA71KBSA4GxpaFwthRIxIwn881m5U\n-----END RSA PRIVATE KEY-----\n"
|
|
65
|
+
current_user_public_key = OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
66
|
+
server_user_public_key = OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyvyAf7lnVx9eQcAS7JL\nYRHrqJJe51rAdanaUiiy8eek2Iyh6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/p\ncxutggTWCnUQUvXmEEm5qZ1KOIIlEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc\n8w+02wpcmWuzWKjoY/G5KV33UDz/LxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/\n7DyXIuiBosVpj9E9T4kpxs3/7RmUfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mb\nSVO6yf2YOcrPDRa3pgz7PIr225QJ+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SO\npQIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
67
|
+
current_user = OpenStruct.new id: 1, public_key: current_user_public_key
|
|
68
|
+
server_user = OpenStruct.new id: 2, public_key: server_user_public_key
|
|
69
|
+
|
|
70
|
+
secret_json = Duse::Client::CreateSecret.with(
|
|
71
|
+
title: 'secret title',
|
|
72
|
+
secret_text: 'test',
|
|
73
|
+
users: [current_user, server_user]
|
|
74
|
+
).sign_with(current_user_private_key).build
|
|
75
|
+
secret = Duse::Secret.create secret_json
|
|
81
76
|
|
|
82
77
|
expect(secret.title).to eq 'test'
|
|
83
|
-
expect(secret.decrypt(
|
|
78
|
+
expect(secret.decrypt(current_user_private_key)).to eq 'test'
|
|
84
79
|
end
|
|
85
80
|
end
|
|
86
81
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
82
|
+
describe 'creation process' do
|
|
83
|
+
context 'own and server user' do
|
|
84
|
+
def test_working_encryption_and_decryption_for(plaintext)
|
|
85
|
+
current_user_private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAmMm3Ovh7gU0rLHK4NiHhWaYRrV9PH6XtHqV0GoiHH7awrjVk\nT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ7FLTWMZNoZ/uh41g4Iv17Wh1I3Fg\nqihdm83cSWvJ81qQCVGBaKeVitSa49zT/MmooBvYFwulaqJjhqFc3862Rl3WowzG\nVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1nng06HIAvMqUcGMebgoju9SuKaR+C\n46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHSI9hTEuPopPSyRqz/EVQfbhi0Lbkd\nDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7AwIDAQABAoIBAQCGSVyLLxRWC/4z\nPc0cfuCyy5xj1g4UEeD7+421OGQTAp39L54vgTzG76SJL/hIsn660b46ZL7BxUd8\nPiK2Mi/C1fU95GUc9hVO/Hq2QS1wcUvrT94XEA1eQCwqN9uy0Nkh54om8owkDkLo\nnRGQ76kOuApQDwNfWsTA8phPeT6JTtr+2K2yc0H4G5G0+py2GDclq56E99SljAqq\nwjFKGazqF0pxJvqLRCR9uVt0FgrRANOLGvxPMNZtnkVBVHmXs1iRD7BUALfESGS1\nHXZxjvD487E2h0Vjkli7rqnu6FZNgQ8Mq5TOfIm5i04LeGCgSTNP9sw7vdZgaYgT\nDPK9BIlZAoGBAMlhenDUOkT1dm28CjGCkygM1kUgDTQDLyBXW/JacotRp3GVZLr2\nV/2rZ3JPxva0cjjs3X4q/CxYsHvqI/ImXbsTBOYIT1/y1fgmXvN6AbiVW5Qne1UD\nneEGqCyB6YfKV2/8CX5Ru01Ay1EYVQDU4APkR1P4H38CuTMeu8SHK/BHAoGBAMI6\nR6TeEIdLprWRmUKU8Iuiwwm0SVxle2trSj6mknsJ93sK7gQkoKNzw0qwZdM6ApKH\nbJo/LiwiZ1Znx1NOyDsKT/ET6CSl59jOBuSUoxqTJ8XvrWlSD8pkbOJ2zWF8WqFR\ncC74bNFgd+n0tftR/7dwkriebITrp5IpF6P2Z9llAoGAAqO3ciEl/l9lRPzw+UMn\n4J+Cc3d/FM5x4K+kceHDnJXeZvu5TUYLUzTa70Gibvtgf+SC5rNziLVE4urnu7XL\nBreyGb3EJJLPQShnmDNiMGQsxh1aXXvlptxqeeLeB7ycNsiL607w8ItH3vE9s/wW\nT5a/ZJdc+lIz0Tq25VWMOuMCgYAejVZZu8izz5WguA94pr8T5/1wGFj13MzGP/FE\n26TtD8tLIpQAONa//2S36fmKeXSQIhdWSBv2O08wC1ESbLEYgG3EyVHZ+fL3aqkw\n6aSieIVoIGSRzaPIPXXXRcLW093ZxFq2OMO9R8R1G9ZIe0STUXTy75C4c+0/E5Gx\nbAA39QKBgDLjtjmG3nJGpQuaftAAjJR+AcA3svSdVug7w5k6D+lxBeM/x4pGP9z4\nkdOrqeD6bv1cctouVVywK/ZQ8dyLczJoGfJIlCvacI1L7fyVUpBp2Lby/uwYMd5w\ngswew+6Xnvtx15SirvYQmDRzA71KBSA4GxpaFwthRIxIwn881m5U\n-----END RSA PRIVATE KEY-----\n"
|
|
86
|
+
current_user_public_key = OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
87
|
+
server_user_private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAvyvyAf7lnVx9eQcAS7JLYRHrqJJe51rAdanaUiiy8eek2Iyh\n6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/pcxutggTWCnUQUvXmEEm5qZ1KOIIl\nEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc8w+02wpcmWuzWKjoY/G5KV33UDz/\nLxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/7DyXIuiBosVpj9E9T4kpxs3/7RmU\nfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mbSVO6yf2YOcrPDRa3pgz7PIr225QJ\n+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SOpQIDAQABAoIBAQCHXFJrX1St64Nc\nYryu3HvLK6k1Hw7bucJ0jePsMK0j4+Uw/8LUrfp380ZOsYeTZ2IzZiaXl6v9x9St\nFbKXYb3mpz5fxZTYqrL4Suyvs8QmeRzIjj44obYmD4yKz2BoHPfBVkUgyZ5Uayl3\nRQX0aqbr478nKVsPttayfEawHcQBqTHPE9dfavuT14/64iqkrIya4ejFVXd1vYG2\nx+oKedPAnD3jr9foEHTqj1D4AeORwonbxFllh3K91IcabV3zdIZH0ICvYaaryceU\n2npp1H0mqETMZ97o3uMo8S5AEK7TsyB26WlD1IUSfwaP3apkog2WMNvgU4c2OD/q\nX8l3mA2BAoGBAOHGaZtBXQUSUD95eQAG/03F1Non21dD+aUtMbDn1Li6aOD+C+a4\ncJVZ+D2nMMIoQz3nEBIVoEdK4prugQXZJ87pvWwpZ/afRmTNSYWHnJmmg5/rvrZ5\nuvR17DwmS5ucTVOWcdryoG0O5KZqyAnpshLecr5PALY+cfG+fjo6KxNpAoGBANjD\noeFiSZ5a9aS8QR4pHkHz4zjDh/JglN4F7QFSLBLdnn54HHguq8oyg6VXQVMv6IA6\nnFv4wcypyjO+wRktwW+pklpoIuPaTNbHykBTjWD+Ew82iEIzh2m9j43UdGM+Kfmh\nGUSCYorwZG41v2GyepnCDWC5H3RslmxZ6+e9XcXdAoGALz3GAS93GEWRtwZi1Cei\nqhJYDGHEmojlprNDL4IC17hhk5p0wQ0cuZN+xt/B6w5jq4M6sJ4H0IMR0VtQcfnT\nQ49TDFvJnigLobH2zVLn6JqX9hFs8V+dR+OYz6kvrtrQr0nOfwK/oLI6E7xKKRDW\nKu6S0dFUE84TJ4M1hFeBhekCgYEAnYX9vBZ7PXMIlECiadKjxHYCKBwgTUlWpcpU\no+MdWFBpf6q1tbjk6rmu5Zb1SAjGw3jUbBnobFzvLo9vMGcJ7aWjT8PhpwfbUzI5\njmmpklTRcPrGJqXfwD4bdoxwUDa6tkgWXq0KA8ISmezBObREWDynECU38JmA7xih\n0PTSkpkCgYBUUASKsz2ThzQiAU+Ivu2Y/QON78N0ZyQ/0kDhxZ8AUnbtGZAOq5pV\nRMj053t5oJMr2eWkMZ5aBYmjo0Uy4vrRCV6SXrlAs3YsN1mh1P+xGRRmX99xwalJ\n6dQaTBdtQ33MhY0+17EXr6WUGRZHIcFM6uGa32MKSmeqkATuV7eyzg==\n-----END RSA PRIVATE KEY-----\n"
|
|
88
|
+
server_user_public_key = OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyvyAf7lnVx9eQcAS7JL\nYRHrqJJe51rAdanaUiiy8eek2Iyh6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/p\ncxutggTWCnUQUvXmEEm5qZ1KOIIlEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc\n8w+02wpcmWuzWKjoY/G5KV33UDz/LxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/\n7DyXIuiBosVpj9E9T4kpxs3/7RmUfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mb\nSVO6yf2YOcrPDRa3pgz7PIr225QJ+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SO\npQIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
89
|
+
current_user = OpenStruct.new id: 1, public_key: current_user_public_key
|
|
90
|
+
server_user = OpenStruct.new id: 2, public_key: server_user_public_key
|
|
91
|
+
secret = Duse::Client::CreateSecret.with(
|
|
92
|
+
title: 'test',
|
|
93
|
+
secret_text: plaintext,
|
|
94
|
+
users: [current_user, server_user]
|
|
95
|
+
).sign_with(current_user_private_key).build
|
|
96
|
+
|
|
97
|
+
shares = secret[:shares].map { |s| s['content'] }
|
|
98
|
+
server_share = Duse::Encryption::Asymmetric.decrypt(server_user_private_key, shares[1])
|
|
99
|
+
shares[1], _ = Duse::Encryption::Asymmetric.encrypt(current_user_private_key, current_user_public_key, server_share)
|
|
100
|
+
|
|
101
|
+
secret = Duse::Client::Secret.new shares: shares, cipher_text: secret[:cipher_text]
|
|
102
|
+
decrypted_secret = secret.decrypt(current_user_private_key)
|
|
103
|
+
|
|
104
|
+
expect(decrypted_secret).to eq plaintext
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'can decrypt the encrypted' do
|
|
108
|
+
secret_text = 'test'
|
|
109
|
+
test_working_encryption_and_decryption_for(secret_text)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it 'can hable 4096 bit rsa keys' do
|
|
113
|
+
secret_text = "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgQCftZvHkB6uKWVDvrIzmy2p496Hv9PD/hhRk+DSXcE/CPtRmvYZ\nzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTeNdlaH9cRFV2wc2A/hbg2kaIS\nxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET2XM6tZcuwFULX6bl8QIDAQAB\nAoGAEJwyt26lwjdL8N/EaNmaxjCM1FF/FMM4hEN8/mQB1Sx59uLG9agPWzrDJcoS\nlH7ZalKLwpORTuCYvCtKH7Qm+fgnjKl/qyn6/cDmtk6VtJvPjQGi3oh2eRIMcwZv\nva+NQLF11bm0kVtZG5viIKlb1snHzkpPjFAOPBqQj2FNdgECQQDQdHWC5XYww2RQ\n/FpRBacJPIxb8PAwb7+EjqJSaruGO9CtLiDiCzlmidGP0Q++zwjAxksSqP4qkr6k\npKvDqkydAkEAxCLuq0c+6gnE9X1PUy4Bl/hUOxrk3ZQRCMUCE4XB8mNmJTLNY43O\ncY7Z1sdaCu7pAiGxQqojUYgwFACGmbOcZQJAZAvg8mfq59B/bxcOyeAqoRY8T0w+\nGyEnDBng8iljwzMmHlgLVDIK5Jm0yI+QPQXkr5D8KwKMqiYv9ZlLDufHSQJAJs9i\nurGWWWkleA4brDHmTtPsluVzdATgegPBrWtCPVw90g6DZbehqgbCRCWeQ5uSr8FK\n+g4AfxmbqdmQyMkpoQI/HvHjjPB9a/2qkpyjeiJIx2gmCmhBke9V/b3XFGBy3ci7\nLZRZUZLlAdJORX177Ief6MWqgXldlcP1N7mzWskE\n-----END RSA PRIVATE KEY-----\n"
|
|
114
|
+
test_working_encryption_and_decryption_for(secret_text)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it 'can handle any utf-8 character' do
|
|
118
|
+
secret_text = 'äõüß'
|
|
119
|
+
test_working_encryption_and_decryption_for(secret_text)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
describe 'update process' do
|
|
125
|
+
context 'changin users' do
|
|
126
|
+
it 'leaves the cipher text unchanged and generates new shares' do
|
|
127
|
+
stub_secret_get
|
|
128
|
+
current_user_private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAmMm3Ovh7gU0rLHK4NiHhWaYRrV9PH6XtHqV0GoiHH7awrjVk\nT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ7FLTWMZNoZ/uh41g4Iv17Wh1I3Fg\nqihdm83cSWvJ81qQCVGBaKeVitSa49zT/MmooBvYFwulaqJjhqFc3862Rl3WowzG\nVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1nng06HIAvMqUcGMebgoju9SuKaR+C\n46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHSI9hTEuPopPSyRqz/EVQfbhi0Lbkd\nDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7AwIDAQABAoIBAQCGSVyLLxRWC/4z\nPc0cfuCyy5xj1g4UEeD7+421OGQTAp39L54vgTzG76SJL/hIsn660b46ZL7BxUd8\nPiK2Mi/C1fU95GUc9hVO/Hq2QS1wcUvrT94XEA1eQCwqN9uy0Nkh54om8owkDkLo\nnRGQ76kOuApQDwNfWsTA8phPeT6JTtr+2K2yc0H4G5G0+py2GDclq56E99SljAqq\nwjFKGazqF0pxJvqLRCR9uVt0FgrRANOLGvxPMNZtnkVBVHmXs1iRD7BUALfESGS1\nHXZxjvD487E2h0Vjkli7rqnu6FZNgQ8Mq5TOfIm5i04LeGCgSTNP9sw7vdZgaYgT\nDPK9BIlZAoGBAMlhenDUOkT1dm28CjGCkygM1kUgDTQDLyBXW/JacotRp3GVZLr2\nV/2rZ3JPxva0cjjs3X4q/CxYsHvqI/ImXbsTBOYIT1/y1fgmXvN6AbiVW5Qne1UD\nneEGqCyB6YfKV2/8CX5Ru01Ay1EYVQDU4APkR1P4H38CuTMeu8SHK/BHAoGBAMI6\nR6TeEIdLprWRmUKU8Iuiwwm0SVxle2trSj6mknsJ93sK7gQkoKNzw0qwZdM6ApKH\nbJo/LiwiZ1Znx1NOyDsKT/ET6CSl59jOBuSUoxqTJ8XvrWlSD8pkbOJ2zWF8WqFR\ncC74bNFgd+n0tftR/7dwkriebITrp5IpF6P2Z9llAoGAAqO3ciEl/l9lRPzw+UMn\n4J+Cc3d/FM5x4K+kceHDnJXeZvu5TUYLUzTa70Gibvtgf+SC5rNziLVE4urnu7XL\nBreyGb3EJJLPQShnmDNiMGQsxh1aXXvlptxqeeLeB7ycNsiL607w8ItH3vE9s/wW\nT5a/ZJdc+lIz0Tq25VWMOuMCgYAejVZZu8izz5WguA94pr8T5/1wGFj13MzGP/FE\n26TtD8tLIpQAONa//2S36fmKeXSQIhdWSBv2O08wC1ESbLEYgG3EyVHZ+fL3aqkw\n6aSieIVoIGSRzaPIPXXXRcLW093ZxFq2OMO9R8R1G9ZIe0STUXTy75C4c+0/E5Gx\nbAA39QKBgDLjtjmG3nJGpQuaftAAjJR+AcA3svSdVug7w5k6D+lxBeM/x4pGP9z4\nkdOrqeD6bv1cctouVVywK/ZQ8dyLczJoGfJIlCvacI1L7fyVUpBp2Lby/uwYMd5w\ngswew+6Xnvtx15SirvYQmDRzA71KBSA4GxpaFwthRIxIwn881m5U\n-----END RSA PRIVATE KEY-----\n"
|
|
129
|
+
current_user_public_key = OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
130
|
+
server_user_private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAvyvyAf7lnVx9eQcAS7JLYRHrqJJe51rAdanaUiiy8eek2Iyh\n6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/pcxutggTWCnUQUvXmEEm5qZ1KOIIl\nEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc8w+02wpcmWuzWKjoY/G5KV33UDz/\nLxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/7DyXIuiBosVpj9E9T4kpxs3/7RmU\nfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mbSVO6yf2YOcrPDRa3pgz7PIr225QJ\n+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SOpQIDAQABAoIBAQCHXFJrX1St64Nc\nYryu3HvLK6k1Hw7bucJ0jePsMK0j4+Uw/8LUrfp380ZOsYeTZ2IzZiaXl6v9x9St\nFbKXYb3mpz5fxZTYqrL4Suyvs8QmeRzIjj44obYmD4yKz2BoHPfBVkUgyZ5Uayl3\nRQX0aqbr478nKVsPttayfEawHcQBqTHPE9dfavuT14/64iqkrIya4ejFVXd1vYG2\nx+oKedPAnD3jr9foEHTqj1D4AeORwonbxFllh3K91IcabV3zdIZH0ICvYaaryceU\n2npp1H0mqETMZ97o3uMo8S5AEK7TsyB26WlD1IUSfwaP3apkog2WMNvgU4c2OD/q\nX8l3mA2BAoGBAOHGaZtBXQUSUD95eQAG/03F1Non21dD+aUtMbDn1Li6aOD+C+a4\ncJVZ+D2nMMIoQz3nEBIVoEdK4prugQXZJ87pvWwpZ/afRmTNSYWHnJmmg5/rvrZ5\nuvR17DwmS5ucTVOWcdryoG0O5KZqyAnpshLecr5PALY+cfG+fjo6KxNpAoGBANjD\noeFiSZ5a9aS8QR4pHkHz4zjDh/JglN4F7QFSLBLdnn54HHguq8oyg6VXQVMv6IA6\nnFv4wcypyjO+wRktwW+pklpoIuPaTNbHykBTjWD+Ew82iEIzh2m9j43UdGM+Kfmh\nGUSCYorwZG41v2GyepnCDWC5H3RslmxZ6+e9XcXdAoGALz3GAS93GEWRtwZi1Cei\nqhJYDGHEmojlprNDL4IC17hhk5p0wQ0cuZN+xt/B6w5jq4M6sJ4H0IMR0VtQcfnT\nQ49TDFvJnigLobH2zVLn6JqX9hFs8V+dR+OYz6kvrtrQr0nOfwK/oLI6E7xKKRDW\nKu6S0dFUE84TJ4M1hFeBhekCgYEAnYX9vBZ7PXMIlECiadKjxHYCKBwgTUlWpcpU\no+MdWFBpf6q1tbjk6rmu5Zb1SAjGw3jUbBnobFzvLo9vMGcJ7aWjT8PhpwfbUzI5\njmmpklTRcPrGJqXfwD4bdoxwUDa6tkgWXq0KA8ISmezBObREWDynECU38JmA7xih\n0PTSkpkCgYBUUASKsz2ThzQiAU+Ivu2Y/QON78N0ZyQ/0kDhxZ8AUnbtGZAOq5pV\nRMj053t5oJMr2eWkMZ5aBYmjo0Uy4vrRCV6SXrlAs3YsN1mh1P+xGRRmX99xwalJ\n6dQaTBdtQ33MhY0+17EXr6WUGRZHIcFM6uGa32MKSmeqkATuV7eyzg==\n-----END RSA PRIVATE KEY-----\n"
|
|
131
|
+
server_user_public_key = OpenSSL::PKey::RSA.new "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyvyAf7lnVx9eQcAS7JL\nYRHrqJJe51rAdanaUiiy8eek2Iyh6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/p\ncxutggTWCnUQUvXmEEm5qZ1KOIIlEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc\n8w+02wpcmWuzWKjoY/G5KV33UDz/LxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/\n7DyXIuiBosVpj9E9T4kpxs3/7RmUfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mb\nSVO6yf2YOcrPDRa3pgz7PIr225QJ+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SO\npQIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
132
|
+
current_user = OpenStruct.new id: 1, public_key: current_user_public_key
|
|
133
|
+
server_user = OpenStruct.new id: 2, public_key: server_user_public_key
|
|
134
|
+
secret = Duse::Secret.find(1)
|
|
135
|
+
secret_hash = Duse::Client::UpdateSecret.values(
|
|
136
|
+
secret,
|
|
137
|
+
{ users: [current_user, server_user] }
|
|
138
|
+
).encrypt_with(current_user_private_key).build
|
|
139
|
+
|
|
140
|
+
shares = secret_hash[:shares].map { |s| s['content'] }
|
|
141
|
+
server_share = Duse::Encryption::Asymmetric.decrypt(server_user_private_key, shares[1])
|
|
142
|
+
shares[1], _ = Duse::Encryption::Asymmetric.encrypt(current_user_private_key, current_user_public_key, server_share)
|
|
143
|
+
|
|
144
|
+
new_secret = Duse::Client::Secret.new shares: shares, cipher_text: secret.cipher_text
|
|
145
|
+
decrypted_secret = new_secret.decrypt(current_user_private_key)
|
|
146
|
+
|
|
147
|
+
expect(decrypted_secret).to eq 'test'
|
|
148
|
+
expect(new_secret.shares).not_to eq secret.shares
|
|
149
|
+
end
|
|
150
|
+
end
|
|
95
151
|
end
|
|
96
152
|
end
|
|
153
|
+
|
data/spec/client/user_spec.rb
CHANGED
|
@@ -53,7 +53,7 @@ RSpec.describe Duse::Client::User do
|
|
|
53
53
|
context 'own user' do
|
|
54
54
|
it 'creates the correct entity when requesting own user' do
|
|
55
55
|
stub_user_me_get
|
|
56
|
-
public_key = "-----BEGIN PUBLIC KEY-----\
|
|
56
|
+
public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
57
57
|
|
|
58
58
|
user = Duse::User.find 'me'
|
|
59
59
|
|
|
@@ -66,7 +66,7 @@ RSpec.describe Duse::Client::User do
|
|
|
66
66
|
context 'server user' do
|
|
67
67
|
it 'creates the correct entity when requesting the server user' do
|
|
68
68
|
stub_server_user_get
|
|
69
|
-
public_key = "-----BEGIN PUBLIC KEY-----\
|
|
69
|
+
public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyvyAf7lnVx9eQcAS7JL\nYRHrqJJe51rAdanaUiiy8eek2Iyh6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/p\ncxutggTWCnUQUvXmEEm5qZ1KOIIlEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc\n8w+02wpcmWuzWKjoY/G5KV33UDz/LxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/\n7DyXIuiBosVpj9E9T4kpxs3/7RmUfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mb\nSVO6yf2YOcrPDRa3pgz7PIr225QJ+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SO\npQIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
70
70
|
|
|
71
71
|
user = Duse::User.find 'server'
|
|
72
72
|
|
|
@@ -79,7 +79,7 @@ RSpec.describe Duse::Client::User do
|
|
|
79
79
|
context 'any user' do
|
|
80
80
|
it 'creates the correct entity when requesting a specific user' do
|
|
81
81
|
stub_get_other_user
|
|
82
|
-
public_key = "-----BEGIN PUBLIC KEY-----\
|
|
82
|
+
public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Y1b9awjW0nshQXk64uO\n1v+GYliBH8ogu6QjQDn0eoLIfcOibrotbhJuSS0G46yOhboOCZQWrwyqi4MYtTMB\nH3ITTmNkhzOkdRXLJGJXXv3OCYR0J+PdCXbrtfYkvqOgyJE4RAR6YBEO/XcQk0Em\nE4IDFq22Aar7MxSjrLk17LX9mTifdzg1xdxX5myX4NrXGVWTWKeS5klLWCe9AigQ\n35b8c2Zyehx6jxHk+jt5CguMC9VqSyJobKdu926W4k2AgzWRdZh0EvCg2wWjlYjc\nhJEnrpHLeJxGMEThPoGqgQWiG5BBYIl9kx1vg1QZmS2biS6djGpGIn8l8PN30+QS\n5QIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
83
83
|
|
|
84
84
|
user = Duse::User.find 3
|
|
85
85
|
|
|
@@ -100,6 +100,6 @@ RSpec.describe Duse::Client::User do
|
|
|
100
100
|
expect(user.attributes['public_key']).to be nil
|
|
101
101
|
expect(user.username).to eq 'adracus'
|
|
102
102
|
expect(user.email).to eq 'adracus@example.org'
|
|
103
|
-
expect(user.public_key.to_s).to eq "-----BEGIN PUBLIC KEY-----\
|
|
103
|
+
expect(user.public_key.to_s).to eq "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Y1b9awjW0nshQXk64uO\n1v+GYliBH8ogu6QjQDn0eoLIfcOibrotbhJuSS0G46yOhboOCZQWrwyqi4MYtTMB\nH3ITTmNkhzOkdRXLJGJXXv3OCYR0J+PdCXbrtfYkvqOgyJE4RAR6YBEO/XcQk0Em\nE4IDFq22Aar7MxSjrLk17LX9mTifdzg1xdxX5myX4NrXGVWTWKeS5klLWCe9AigQ\n35b8c2Zyehx6jxHk+jt5CguMC9VqSyJobKdu926W4k2AgzWRdZh0EvCg2wWjlYjc\nhJEnrpHLeJxGMEThPoGqgQWiG5BBYIl9kx1vg1QZmS2biS6djGpGIn8l8PN30+QS\n5QIDAQAB\n-----END PUBLIC KEY-----\n"
|
|
104
104
|
end
|
|
105
105
|
end
|
data/spec/support/mock_api.rb
CHANGED
|
@@ -29,7 +29,7 @@ module MockAPI
|
|
|
29
29
|
'id' => 2,
|
|
30
30
|
'username' => 'flower-pot',
|
|
31
31
|
'email' => 'flower-pot@example.org',
|
|
32
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
32
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
33
33
|
'url' => 'https://example.com/users/2'
|
|
34
34
|
}.to_json
|
|
35
35
|
|
|
@@ -43,7 +43,7 @@ module MockAPI
|
|
|
43
43
|
'id' => 1,
|
|
44
44
|
'username' => 'server',
|
|
45
45
|
'email' => 'server@localhost',
|
|
46
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
46
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyvyAf7lnVx9eQcAS7JL\nYRHrqJJe51rAdanaUiiy8eek2Iyh6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/p\ncxutggTWCnUQUvXmEEm5qZ1KOIIlEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc\n8w+02wpcmWuzWKjoY/G5KV33UDz/LxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/\n7DyXIuiBosVpj9E9T4kpxs3/7RmUfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mb\nSVO6yf2YOcrPDRa3pgz7PIr225QJ+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SO\npQIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
47
47
|
'url' => 'https://example.com/users/1'
|
|
48
48
|
}.to_json
|
|
49
49
|
|
|
@@ -52,12 +52,13 @@ module MockAPI
|
|
|
52
52
|
to_return(status: 200, body: payload)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
# private key for documentation is: "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA0Y1b9awjW0nshQXk64uO1v+GYliBH8ogu6QjQDn0eoLIfcOi\nbrotbhJuSS0G46yOhboOCZQWrwyqi4MYtTMBH3ITTmNkhzOkdRXLJGJXXv3OCYR0\nJ+PdCXbrtfYkvqOgyJE4RAR6YBEO/XcQk0EmE4IDFq22Aar7MxSjrLk17LX9mTif\ndzg1xdxX5myX4NrXGVWTWKeS5klLWCe9AigQ35b8c2Zyehx6jxHk+jt5CguMC9Vq\nSyJobKdu926W4k2AgzWRdZh0EvCg2wWjlYjchJEnrpHLeJxGMEThPoGqgQWiG5BB\nYIl9kx1vg1QZmS2biS6djGpGIn8l8PN30+QS5QIDAQABAoIBAQC3pXYRMOHvkDKr\nRcYgs7bkLx47tCq9jGvxZmDKWcArWdCRf1EsTxefXqGumbpu73wcMDk7JcBXevc/\nuw19R4zVXSkUSsEASD75qbbVVSYTBsV5y83sY6MEN2dNmcEMHeS7waEY4v/Ij0qe\n0akCFFdlQ0ynpGdcwNbTJmRm7A4ZOrLMoVTJaI/enRJcQSEzBkQ/oHpMlcDBoFJq\nIB61tfm5JD6IPM2BKlXvSOpV8ItPpJYG4PJxUDT7YEhrXy0vGHKyjaKoE04EdLvI\nvfEkP67if9BTR0tMP+dxaeZ8c9ydGCHC9p1rDJMdpGoS4gwBLueEkDxNEchtrf5p\nM+fPan5lAoGBAPR6YLODhK6YIl6M1EMxbXlytnwAwr5vJvMmRBiVyXLnXKoVFI8V\nHkPsjO6wUH8OjZjEflteoo7Co2pawvfUuPhtHPrWVpW8tAdIELGfazOnsdxvcIAJ\nTUB7tHSS/WeWEcsloCAOTb+6wjZdah9CDly95madbI1IYtz9s0Z/TPMXAoGBANtt\nmhAIxNs/8X9lDWbkbQRWdIr/sb6LCQcBN/Jc5mdz9Kp3sXu2Ag4aRsSPbbtu+XBY\nkl+aSIIYWlHJJE1kKKMDJ+cEpCdx8+kdhz/NIfAdbo3RsZ3cDy7ZM28iHNO4LVRX\ndu/VlBrm4CXCBdlug4+GhZK7on1YnPtrqldV7RdjAoGBALb6nUPejMEMdrTjnL8J\n0JEUjYZ0H03e7X0RR+hKu7L3fUCDdJa+zJ8z/itr5WOjZdFQR+5k/y/wd9TTR5es\nLCErsYQARl/eE7RbeLsowVixC4scEUyTKbG4pNCXb3hHNtwgNh+n9QMqac+8zP/G\nNe+t5jMpYiTAZ9ZVQAfkoZhTAoGAezIG7Hev5pT5Bph6tMkM+AF+P0gdyCgRcnBZ\ns+Y6qdytgkPfTuC6OKbCErugVTqSK2RfEfPyP7BijUaL7jOMqTEtZwPxEgBle/1L\nISQPqNstZcxUl5ekop3pxbx2SNw//vl4WmEkXRJAyJItbI0iqiNRvTdBnHRy9qnV\nImGo0pcCgYEA5SJk+Fx/9bJXyKEJIp/Q+Zjq5Oc/4Th9b8ydSBCeksoz9qF+5pWq\nWpDXCa1fdLUxXK+cG39VxF3w2pok5NASeTgF+0myUofc8z/+K/qCDCn8wbojCZpi\nJwB1XlU0M+ZV9emAI1L1DGtoz7i8LT0uG8U5wWFZNljI3GXhfOYpWD4=\n-----END RSA PRIVATE KEY-----\n"
|
|
55
56
|
def stub_get_other_user
|
|
56
57
|
payload = {
|
|
57
58
|
'id' => 3,
|
|
58
59
|
'username' => 'adracus',
|
|
59
60
|
'email' => 'adracus@example.org',
|
|
60
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
61
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Y1b9awjW0nshQXk64uO\n1v+GYliBH8ogu6QjQDn0eoLIfcOibrotbhJuSS0G46yOhboOCZQWrwyqi4MYtTMB\nH3ITTmNkhzOkdRXLJGJXXv3OCYR0J+PdCXbrtfYkvqOgyJE4RAR6YBEO/XcQk0Em\nE4IDFq22Aar7MxSjrLk17LX9mTifdzg1xdxX5myX4NrXGVWTWKeS5klLWCe9AigQ\n35b8c2Zyehx6jxHk+jt5CguMC9VqSyJobKdu926W4k2AgzWRdZh0EvCg2wWjlYjc\nhJEnrpHLeJxGMEThPoGqgQWiG5BBYIl9kx1vg1QZmS2biS6djGpGIn8l8PN30+QS\n5QIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
61
62
|
'url' => 'https://example.com/users/3'
|
|
62
63
|
}.to_json
|
|
63
64
|
stub_request(:get, "https://example.com/users/3").
|
|
@@ -80,21 +81,22 @@ module MockAPI
|
|
|
80
81
|
payload = {
|
|
81
82
|
'id' => 1,
|
|
82
83
|
'title' => 'test',
|
|
83
|
-
'
|
|
84
|
-
|
|
85
|
-
"
|
|
86
|
-
|
|
84
|
+
'cipher_text' => "DZTJUbyBLTtJ2TFETHfbvw==\n",
|
|
85
|
+
'shares' => [
|
|
86
|
+
"XY0lnt5J0ngppNqD6O2ZWSb2GJc44p+JPCvbGPggaOkzkEFWjwoBsT8sgtGp\nWJA34ve9CfUUSJOZA0UwjKpECLQWOSm5ioxs2PEP/BwBUhAjro++9Xh2PYX6\nqzJnyYZOUBGI20mUNaM3yFR4qJnuOm4CmGKZw0qLLBAJyR5MjFwjc0nZjWDo\nQ77UHQ5OieCPNo8sRv3fBqYtYSXd/Fl6iywkvWAFrjgDcAhc6VKaQm1NE/T0\nWY1Bz5uGRfDt1ADzIt4U9Ho4pqv8aI2piUKhysJOo/Sf3ykg3gj605/kt1+k\nRsNN3a/bTAvsHnmzqshpzHguiiXcT2fgNeqHwr2gtw==\n",
|
|
87
|
+
"QUEyuQxtCJBzpErkFdTBEicLpfr2sNZDnOLNMy5bRw2WcbqW6wzlwbkhOJ8u\n3O7FgGJUHhjKishPbXQPMjlLin2fL2wZpKmHDrgWCWfcoQ/OmO1tNbIkrbjZ\nhIyb86ueffEYt53GzKo9QDNQstF4VuJgciASVwksEO6FiwOWKp5ZvYnB+1zm\nFxWlpy38ODCgNsw4WLJtH6FAPTuX8BKbp+ZNs+GAp9A1Ao6GeUCWsIdCvXbN\nxje8ghebdLWvNNxF0fIPS42ZGGoG5J/VNdTBvu1W0QPvF4YOEmIeAXu5yXjU\n8JVzE7HNBJuevGpiulwobh+X95dgAYLLO3grJFNAGA==\n"
|
|
88
|
+
],
|
|
87
89
|
'users' => [{
|
|
88
90
|
'id' => 1,
|
|
89
91
|
'username' => 'server',
|
|
90
92
|
'email' => 'server@localhost',
|
|
91
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
93
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyvyAf7lnVx9eQcAS7JL\nYRHrqJJe51rAdanaUiiy8eek2Iyh6JG551EK7x4n9/Y7r0fW2sNmy+Bp3FpL8E/p\ncxutggTWCnUQUvXmEEm5qZ1KOIIlEQNp5glToAenJ7pxotJsTMlVw4tizsKScenc\n8w+02wpcmWuzWKjoY/G5KV33UDz/LxVo1RJdJp94JiL/OinIl+uk+Vf7VZj/E8g/\n7DyXIuiBosVpj9E9T4kpxs3/7RmUfDzUisVq0UvgflRjvP1V+1KdpNnjVB+H08mb\nSVO6yf2YOcrPDRa3pgz7PIr225QJ+HmVjPTg5VAy7rUxhCK+q+HNd2oz35zA70SO\npQIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
92
94
|
'url' => 'https://example.com/users/1'
|
|
93
95
|
}, {
|
|
94
96
|
'id' => 2,
|
|
95
97
|
'username' => 'flower-pot',
|
|
96
98
|
'email' => 'flower-pot@example.org',
|
|
97
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
99
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
98
100
|
'url' => 'https://example.com/users/2'
|
|
99
101
|
}],
|
|
100
102
|
'url' => 'http://example.com/secrets/1'
|
|
@@ -115,25 +117,27 @@ module MockAPI
|
|
|
115
117
|
payload = {
|
|
116
118
|
'id' => 1,
|
|
117
119
|
'title' => 'test',
|
|
120
|
+
'cipher_text' => "DZTJUbyBLTtJ2TFETHfbvw==\n",
|
|
121
|
+
'shares' => [
|
|
122
|
+
"XY0lnt5J0ngppNqD6O2ZWSb2GJc44p+JPCvbGPggaOkzkEFWjwoBsT8sgtGp\nWJA34ve9CfUUSJOZA0UwjKpECLQWOSm5ioxs2PEP/BwBUhAjro++9Xh2PYX6\nqzJnyYZOUBGI20mUNaM3yFR4qJnuOm4CmGKZw0qLLBAJyR5MjFwjc0nZjWDo\nQ77UHQ5OieCPNo8sRv3fBqYtYSXd/Fl6iywkvWAFrjgDcAhc6VKaQm1NE/T0\nWY1Bz5uGRfDt1ADzIt4U9Ho4pqv8aI2piUKhysJOo/Sf3ykg3gj605/kt1+k\nRsNN3a/bTAvsHnmzqshpzHguiiXcT2fgNeqHwr2gtw==\n",
|
|
123
|
+
"QUEyuQxtCJBzpErkFdTBEicLpfr2sNZDnOLNMy5bRw2WcbqW6wzlwbkhOJ8u\n3O7FgGJUHhjKishPbXQPMjlLin2fL2wZpKmHDrgWCWfcoQ/OmO1tNbIkrbjZ\nhIyb86ueffEYt53GzKo9QDNQstF4VuJgciASVwksEO6FiwOWKp5ZvYnB+1zm\nFxWlpy38ODCgNsw4WLJtH6FAPTuX8BKbp+ZNs+GAp9A1Ao6GeUCWsIdCvXbN\nxje8ghebdLWvNNxF0fIPS42ZGGoG5J/VNdTBvu1W0QPvF4YOEmIeAXu5yXjU\n8JVzE7HNBJuevGpiulwobh+X95dgAYLLO3grJFNAGA==\n"
|
|
124
|
+
],
|
|
118
125
|
'users' => [{
|
|
119
126
|
'id' => 1,
|
|
120
127
|
'username' => 'server',
|
|
121
128
|
'email' => 'server@localhost',
|
|
122
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
129
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
123
130
|
'url' => 'https://example.com/users/1'
|
|
124
131
|
}, {
|
|
125
132
|
'id' => 2,
|
|
126
133
|
'username' => 'flower-pot',
|
|
127
134
|
'email' => 'flower-pot@example.org',
|
|
128
|
-
'public_key' => "-----BEGIN PUBLIC KEY-----\
|
|
135
|
+
'public_key' => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMm3Ovh7gU0rLHK4NiHh\nWaYRrV9PH6XtHqV0GoiHH7awrjVkT1aZiS+nlBxckfuvuQjRXakVCZh18UdQadVQ\n7FLTWMZNoZ/uh41g4Iv17Wh1I3Fgqihdm83cSWvJ81qQCVGBaKeVitSa49zT/Mmo\noBvYFwulaqJjhqFc3862Rl3WowzGVqGf+OiYhFrBbnIqXijDmVKsbqkG5AILGo1n\nng06HIAvMqUcGMebgoju9SuKaR+C46KT0K5sPpNw/tNcDEZqZAd25QjAroGnpRHS\nI9hTEuPopPSyRqz/EVQfbhi0LbkdDW9S5ECw7GfFPFpRp2239fjl/9ybL6TkeZL7\nAwIDAQAB\n-----END PUBLIC KEY-----\n",
|
|
129
136
|
'url' => 'https://example.com/users/2'
|
|
130
137
|
}],
|
|
131
|
-
'parts' => [[
|
|
132
|
-
"dVp1FjdfbtGF371TABXSeJ9HNPm9uBYQGaSyBasXqFmnGQqCiZEF0UWPTaG9\nwM7KV1GPwbj/GowwPT0Q8mv9wZ/bCQ2NlQ8Usuiol2SWtGtAYU74C6jzbQH6\ni1gq55I/T8JMiZmebnlnh/7rr9hOh9lQcjylbH792stsntxwlu4=\n",
|
|
133
|
-
"ZfP2yMLwNOe2yBU6UDrOjnE9OX0SX/xbfG+s4mjji6cvfmN7uuyoWTPa3tb8\n6/hNENIpRa/RPGTzeh/jeU7wYIiG3HGb6Z221S6ikEXYNtRqL0plOq8nY+kh\nxV+3PlBXhNNdUvtUTf3D5dtfWdxL2tuPJUnTnWyoNSDko+NXlHM=\n"
|
|
134
|
-
]],
|
|
135
138
|
'url' => 'http://example.com/secrets/1'
|
|
136
139
|
}.to_json
|
|
140
|
+
|
|
137
141
|
stub_request(:post, "https://example.com/secrets").
|
|
138
142
|
with(headers: {'Accept'=>'application/vnd.duse.1+json'}).
|
|
139
143
|
to_return(status: 201, body: payload, headers: {})
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: duse
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Frederic Branczyk
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-
|
|
11
|
+
date: 2015-05-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: highline
|
|
@@ -126,7 +126,6 @@ files:
|
|
|
126
126
|
- spec/cli/commands/login_spec.rb
|
|
127
127
|
- spec/cli/commands/register_spec.rb
|
|
128
128
|
- spec/cli/commands/secret_spec.rb
|
|
129
|
-
- spec/client/secret_marshaller_spec.rb
|
|
130
129
|
- spec/client/secret_spec.rb
|
|
131
130
|
- spec/client/user_spec.rb
|
|
132
131
|
- spec/spec_helper.rb
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
RSpec.describe Duse::Client::SecretMarshaller do
|
|
2
|
-
before :each do
|
|
3
|
-
Duse.config = Duse::CLIConfig.new({ 'uri' => 'https://example.com/' })
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
describe '#to_h' do
|
|
7
|
-
context 'own and server user' do
|
|
8
|
-
it 'marshalls a secret without errors' do
|
|
9
|
-
private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgQCftZvHkB6uKWVDvrIzmy2p496Hv9PD/hhRk+DSXcE/CPtRmvYZ\nzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTeNdlaH9cRFV2wc2A/hbg2kaIS\nxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET2XM6tZcuwFULX6bl8QIDAQAB\nAoGAEJwyt26lwjdL8N/EaNmaxjCM1FF/FMM4hEN8/mQB1Sx59uLG9agPWzrDJcoS\nlH7ZalKLwpORTuCYvCtKH7Qm+fgnjKl/qyn6/cDmtk6VtJvPjQGi3oh2eRIMcwZv\nva+NQLF11bm0kVtZG5viIKlb1snHzkpPjFAOPBqQj2FNdgECQQDQdHWC5XYww2RQ\n/FpRBacJPIxb8PAwb7+EjqJSaruGO9CtLiDiCzlmidGP0Q++zwjAxksSqP4qkr6k\npKvDqkydAkEAxCLuq0c+6gnE9X1PUy4Bl/hUOxrk3ZQRCMUCE4XB8mNmJTLNY43O\ncY7Z1sdaCu7pAiGxQqojUYgwFACGmbOcZQJAZAvg8mfq59B/bxcOyeAqoRY8T0w+\nGyEnDBng8iljwzMmHlgLVDIK5Jm0yI+QPQXkr5D8KwKMqiYv9ZlLDufHSQJAJs9i\nurGWWWkleA4brDHmTtPsluVzdATgegPBrWtCPVw90g6DZbehqgbCRCWeQ5uSr8FK\n+g4AfxmbqdmQyMkpoQI/HvHjjPB9a/2qkpyjeiJIx2gmCmhBke9V/b3XFGBy3ci7\nLZRZUZLlAdJORX177Ief6MWqgXldlcP1N7mzWskE\n-----END RSA PRIVATE KEY-----\n"
|
|
10
|
-
current_user = OpenStruct.new public_key: OpenSSL::PKey::RSA.new("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCftZvHkB6uKWVDvrIzmy2p496H\nv9PD/hhRk+DSXcE/CPtRmvYZzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTe\nNdlaH9cRFV2wc2A/hbg2kaISxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET\n2XM6tZcuwFULX6bl8QIDAQAB\n-----END PUBLIC KEY-----\n")
|
|
11
|
-
server_user = OpenStruct.new public_key: OpenSSL::PKey::RSA.new("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC8Z1K4aCksOb6rsbKNcF4fNcN\n1Tbyv+ids751YvmfU2WHDXB3wIVoN1YRdb8Dk8608YlGAAqVaGVwfgYdyLMppIGs\nglZIMjwZFM2F84T4swKOEJJx6o3ZCRnP9ZQcceqzcIuTjiIqC7xu+QOvtADAMW68\nzZIpFOHjjiuxkA7PQQIDAQAB\n-----END PUBLIC KEY-----\n")
|
|
12
|
-
secret_text = "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgQCftZvHkB6uKWVDvrIzmy2p496Hv9PD/hhRk+DSXcE/CPtRmvYZ\nzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTeNdlaH9cRFV2wc2A/hbg2kaIS\nxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET2XM6tZcuwFULX6bl8QIDAQAB\nAoGAEJwyt26lwjdL8N/EaNmaxjCM1FF/FMM4hEN8/mQB1Sx59uLG9agPWzrDJcoS\nlH7ZalKLwpORTuCYvCtKH7Qm+fgnjKl/qyn6/cDmtk6VtJvPjQGi3oh2eRIMcwZv\nva+NQLF11bm0kVtZG5viIKlb1snHzkpPjFAOPBqQj2FNdgECQQDQdHWC5XYww2RQ\n/FpRBacJPIxb8PAwb7+EjqJSaruGO9CtLiDiCzlmidGP0Q++zwjAxksSqP4qkr6k\npKvDqkydAkEAxCLuq0c+6gnE9X1PUy4Bl/hUOxrk3ZQRCMUCE4XB8mNmJTLNY43O\ncY7Z1sdaCu7pAiGxQqojUYgwFACGmbOcZQJAZAvg8mfq59B/bxcOyeAqoRY8T0w+\nGyEnDBng8iljwzMmHlgLVDIK5Jm0yI+QPQXkr5D8KwKMqiYv9ZlLDufHSQJAJs9i\nurGWWWkleA4brDHmTtPsluVzdATgegPBrWtCPVw90g6DZbehqgbCRCWeQ5uSr8FK\n+g4AfxmbqdmQyMkpoQI/HvHjjPB9a/2qkpyjeiJIx2gmCmhBke9V/b3XFGBy3ci7\nLZRZUZLlAdJORX177Ief6MWqgXldlcP1N7mzWskE\n-----END RSA PRIVATE KEY-----\n"
|
|
13
|
-
secret = Duse::Client::Secret.new title: 'test', secret_text: secret_text, users: [current_user, server_user]
|
|
14
|
-
Duse::Client::SecretMarshaller.new(secret, private_key).to_h
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
context 'own, server user and another user' do
|
|
19
|
-
it 'marshalls a secret with more users than self and server without errors' do
|
|
20
|
-
private_key = OpenSSL::PKey::RSA.new "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgQCftZvHkB6uKWVDvrIzmy2p496Hv9PD/hhRk+DSXcE/CPtRmvYZ\nzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTeNdlaH9cRFV2wc2A/hbg2kaIS\nxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET2XM6tZcuwFULX6bl8QIDAQAB\nAoGAEJwyt26lwjdL8N/EaNmaxjCM1FF/FMM4hEN8/mQB1Sx59uLG9agPWzrDJcoS\nlH7ZalKLwpORTuCYvCtKH7Qm+fgnjKl/qyn6/cDmtk6VtJvPjQGi3oh2eRIMcwZv\nva+NQLF11bm0kVtZG5viIKlb1snHzkpPjFAOPBqQj2FNdgECQQDQdHWC5XYww2RQ\n/FpRBacJPIxb8PAwb7+EjqJSaruGO9CtLiDiCzlmidGP0Q++zwjAxksSqP4qkr6k\npKvDqkydAkEAxCLuq0c+6gnE9X1PUy4Bl/hUOxrk3ZQRCMUCE4XB8mNmJTLNY43O\ncY7Z1sdaCu7pAiGxQqojUYgwFACGmbOcZQJAZAvg8mfq59B/bxcOyeAqoRY8T0w+\nGyEnDBng8iljwzMmHlgLVDIK5Jm0yI+QPQXkr5D8KwKMqiYv9ZlLDufHSQJAJs9i\nurGWWWkleA4brDHmTtPsluVzdATgegPBrWtCPVw90g6DZbehqgbCRCWeQ5uSr8FK\n+g4AfxmbqdmQyMkpoQI/HvHjjPB9a/2qkpyjeiJIx2gmCmhBke9V/b3XFGBy3ci7\nLZRZUZLlAdJORX177Ief6MWqgXldlcP1N7mzWskE\n-----END RSA PRIVATE KEY-----\n"
|
|
21
|
-
current_user = OpenStruct.new public_key: OpenSSL::PKey::RSA.new("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCftZvHkB6uKWVDvrIzmy2p496H\nv9PD/hhRk+DSXcE/CPtRmvYZzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTe\nNdlaH9cRFV2wc2A/hbg2kaISxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET\n2XM6tZcuwFULX6bl8QIDAQAB\n-----END PUBLIC KEY-----\n")
|
|
22
|
-
server_user = OpenStruct.new public_key: OpenSSL::PKey::RSA.new("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC8Z1K4aCksOb6rsbKNcF4fNcN\n1Tbyv+ids751YvmfU2WHDXB3wIVoN1YRdb8Dk8608YlGAAqVaGVwfgYdyLMppIGs\nglZIMjwZFM2F84T4swKOEJJx6o3ZCRnP9ZQcceqzcIuTjiIqC7xu+QOvtADAMW68\nzZIpFOHjjiuxkA7PQQIDAQAB\n-----END PUBLIC KEY-----\n")
|
|
23
|
-
other_user = OpenStruct.new public_key: OpenSSL::PKey::RSA.new("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTF2gEqXRy2hJ6+xjj6IbzAgHG\nHvnLNnZlwkYm0ZV89uiPxL9mKYNiW4KA1azZlvJZviTF4218WAwO1IGIH+PppdXF\nIK8vmB6IIaQcO4UTjSA6ZTn8Uwf1fwS4EAuL3Zr3IVdjVYQ4+/ZNtmSyVMmo+7zP\nyOa31hUhDNYrJO1iEQIDAQAB\n-----END PUBLIC KEY-----\n")
|
|
24
|
-
secret_text = "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgQCftZvHkB6uKWVDvrIzmy2p496Hv9PD/hhRk+DSXcE/CPtRmvYZ\nzbWbbBup9hkvhyH/P1O5EF8KSZm4Cdnz6p37idTeNdlaH9cRFV2wc2A/hbg2kaIS\nxrDxUqRbywBE9NOBSjXu2wRpy0TMo85eM2A0E2ET2XM6tZcuwFULX6bl8QIDAQAB\nAoGAEJwyt26lwjdL8N/EaNmaxjCM1FF/FMM4hEN8/mQB1Sx59uLG9agPWzrDJcoS\nlH7ZalKLwpORTuCYvCtKH7Qm+fgnjKl/qyn6/cDmtk6VtJvPjQGi3oh2eRIMcwZv\nva+NQLF11bm0kVtZG5viIKlb1snHzkpPjFAOPBqQj2FNdgECQQDQdHWC5XYww2RQ\n/FpRBacJPIxb8PAwb7+EjqJSaruGO9CtLiDiCzlmidGP0Q++zwjAxksSqP4qkr6k\npKvDqkydAkEAxCLuq0c+6gnE9X1PUy4Bl/hUOxrk3ZQRCMUCE4XB8mNmJTLNY43O\ncY7Z1sdaCu7pAiGxQqojUYgwFACGmbOcZQJAZAvg8mfq59B/bxcOyeAqoRY8T0w+\nGyEnDBng8iljwzMmHlgLVDIK5Jm0yI+QPQXkr5D8KwKMqiYv9ZlLDufHSQJAJs9i\nurGWWWkleA4brDHmTtPsluVzdATgegPBrWtCPVw90g6DZbehqgbCRCWeQ5uSr8FK\n+g4AfxmbqdmQyMkpoQI/HvHjjPB9a/2qkpyjeiJIx2gmCmhBke9V/b3XFGBy3ci7\nLZRZUZLlAdJORX177Ief6MWqgXldlcP1N7mzWskE\n-----END RSA PRIVATE KEY-----\n"
|
|
25
|
-
secret = Duse::Client::Secret.new title: 'test', secret_text: secret_text, users: [other_user, current_user, server_user]
|
|
26
|
-
|
|
27
|
-
Duse::Client::SecretMarshaller.new(secret, private_key).to_h
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|