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
|
-
|