cred_hubble 0.0.1.pre → 0.1.0.pre
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 +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -1
- data/.travis.yml +3 -1
- data/README.md +353 -13
- data/cred_hubble.gemspec +3 -0
- data/lib/cred_hubble.rb +3 -2
- data/lib/cred_hubble/client.rb +119 -13
- data/lib/cred_hubble/http/client.rb +39 -4
- data/lib/cred_hubble/resources/certificate_credential.rb +25 -0
- data/lib/cred_hubble/resources/credential.rb +32 -0
- data/lib/cred_hubble/resources/credential_collection.rb +21 -0
- data/lib/cred_hubble/resources/credential_factory.rb +41 -0
- data/lib/cred_hubble/resources/immutable_resource.rb +2 -2
- data/lib/cred_hubble/resources/json_credential.rb +13 -0
- data/lib/cred_hubble/resources/password_credential.rb +13 -0
- data/lib/cred_hubble/resources/permission.rb +10 -0
- data/lib/cred_hubble/resources/permission_collection.rb +21 -0
- data/lib/cred_hubble/resources/resource.rb +10 -0
- data/lib/cred_hubble/resources/resources.rb +15 -0
- data/lib/cred_hubble/resources/{base_resource.rb → rest_resource.rb} +6 -2
- data/lib/cred_hubble/resources/rsa_credential.rb +24 -0
- data/lib/cred_hubble/resources/ssh_credential.rb +39 -0
- data/lib/cred_hubble/resources/user_credential.rb +39 -0
- data/lib/cred_hubble/resources/value_credential.rb +13 -0
- data/lib/cred_hubble/version.rb +1 -1
- data/spec/cred_hubble/client_spec.rb +487 -3
- data/spec/cred_hubble/http/client_spec.rb +347 -53
- data/spec/cred_hubble/resources/certificate_credential_spec.rb +49 -0
- data/spec/cred_hubble/resources/credential_collection_spec.rb +59 -0
- data/spec/cred_hubble/resources/credential_factory_spec.rb +154 -0
- data/spec/cred_hubble/resources/credential_spec.rb +10 -0
- data/spec/cred_hubble/resources/json_credential_spec.rb +52 -0
- data/spec/cred_hubble/resources/password_credential_spec.rb +41 -0
- data/spec/cred_hubble/resources/permission_collection_spec.rb +87 -0
- data/spec/cred_hubble/resources/permission_spec.rb +36 -0
- data/spec/cred_hubble/resources/rsa_credential_spec.rb +46 -0
- data/spec/cred_hubble/resources/ssh_credential_spec.rb +73 -0
- data/spec/cred_hubble/resources/user_credential_spec.rb +72 -0
- data/spec/cred_hubble/resources/value_credential_spec.rb +42 -0
- data/spec/support/shared_examples/resource_examples.rb +49 -0
- metadata +57 -5
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CredHubble::Resources::CredentialCollection do
|
4
|
+
let(:json) do
|
5
|
+
'{
|
6
|
+
"data":[
|
7
|
+
{
|
8
|
+
"type":"value",
|
9
|
+
"version_created_at":"2017-10-03T04:12:21Z",
|
10
|
+
"id":"5298e0e4-c3f5-4c73-a156-9ffce4c137f5",
|
11
|
+
"name":"/hello-dolly-credz",
|
12
|
+
"value":"Put on your Sunday clothes there\'s lots of world out there"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"type":"value",
|
16
|
+
"version_created_at":"2017-10-03T04:12:19Z",
|
17
|
+
"id":"6980ec59-c7e6-449a-b525-298648cfe6a7",
|
18
|
+
"name":"/hello-dolly-credz",
|
19
|
+
"value":"Get out the brilliantine and dime cigars"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"type":"value",
|
23
|
+
"version_created_at":"2017-10-02T01:56:54Z",
|
24
|
+
"id":"3e709d6e-585c-4526-ac0d-fe99316f2255",
|
25
|
+
"name":"/hello-dolly-credz",
|
26
|
+
"value":"We\'re gonna find adventure in the evening air"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}'
|
30
|
+
end
|
31
|
+
|
32
|
+
subject { CredHubble::Resources::CredentialCollection.from_json(json) }
|
33
|
+
|
34
|
+
describe '.from_json' do
|
35
|
+
subject { CredHubble::Resources::CredentialCollection }
|
36
|
+
|
37
|
+
it 'deserializes all of the credentials into Credential objects' do
|
38
|
+
credentials = subject.from_json(json).data
|
39
|
+
expect(credentials).to all(be_a(CredHubble::Resources::ValueCredential))
|
40
|
+
expect(credentials.map(&:name)).to match_array(%w[/hello-dolly-credz /hello-dolly-credz /hello-dolly-credz])
|
41
|
+
expect(credentials.map(&:id)).to match_array(
|
42
|
+
%w[
|
43
|
+
5298e0e4-c3f5-4c73-a156-9ffce4c137f5
|
44
|
+
6980ec59-c7e6-449a-b525-298648cfe6a7
|
45
|
+
3e709d6e-585c-4526-ac0d-fe99316f2255
|
46
|
+
]
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
it_behaves_like 'a JSON deserializing resource'
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#each' do
|
54
|
+
it 'is iterable' do
|
55
|
+
expect(subject).to respond_to(:each)
|
56
|
+
expect(subject.map(&:name)).to match_array(%w[/hello-dolly-credz /hello-dolly-credz /hello-dolly-credz])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CredHubble::Resources::CredentialFactory do
|
4
|
+
describe '.from_json' do
|
5
|
+
subject { CredHubble::Resources::CredentialFactory }
|
6
|
+
|
7
|
+
context 'when the Credential type is "value"' do
|
8
|
+
let(:value_json) do
|
9
|
+
'{
|
10
|
+
"id": "cdbb371a-cc03-4a6f-aa21-c6461d66ed96",
|
11
|
+
"name": "/the-grid",
|
12
|
+
"type": "value",
|
13
|
+
"value": "biodigital-jazz-man",
|
14
|
+
"version_created_at": "1985-01-01T01:01:01Z"
|
15
|
+
}'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns instantiates a ValueCredential' do
|
19
|
+
expect(subject.from_json(value_json)).to be_a(CredHubble::Resources::ValueCredential)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when the Credential type is "json"' do
|
24
|
+
let(:json_json) do
|
25
|
+
'{
|
26
|
+
"id": "f2dcb184-cd60-4306-a858-166f44e8cacf",
|
27
|
+
"name": "/backstreets-back-alright",
|
28
|
+
"type": "json",
|
29
|
+
"value": {
|
30
|
+
"title": "Everybody",
|
31
|
+
"album": "Backstreet\'s Back",
|
32
|
+
"members": ["AJ McLean", "Howie D.", "Nick Carter", "Kevin Richardson", "Brian Littrell"]
|
33
|
+
},
|
34
|
+
"version_created_at": "1985-01-01T01:01:01Z"
|
35
|
+
}'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns instantiates a JsonCredential' do
|
39
|
+
expect(subject.from_json(json_json)).to be_a(CredHubble::Resources::JsonCredential)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when the Credential type is "password"' do
|
44
|
+
let(:password_json) do
|
45
|
+
'{
|
46
|
+
"id": "b1a124c5-3faf-426f-9f8f-fe695b36a4e2",
|
47
|
+
"name": "/top-secret-password",
|
48
|
+
"type": "password",
|
49
|
+
"value": "p4ssw0rd",
|
50
|
+
"version_created_at": "1990-05-18T01:01:01Z"
|
51
|
+
}'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'returns instantiates a PasswordCredential' do
|
55
|
+
expect(subject.from_json(password_json)).to be_a(CredHubble::Resources::PasswordCredential)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when the Credential type is "user"' do
|
60
|
+
let(:user_json) do
|
61
|
+
'{
|
62
|
+
"id": "15811465-8538-460d-9682-5514d44439fd",
|
63
|
+
"name": "/admin-user",
|
64
|
+
"type": "user",
|
65
|
+
"value": {
|
66
|
+
"username": "admin",
|
67
|
+
"password": "2582aaf15ec84e3fa3ba682152663a52",
|
68
|
+
"password_hash": "8efbef4cec28f228fa948daaf4893ac3638fbae81358ff9020be1d7a9a509fc6:1234"
|
69
|
+
},
|
70
|
+
"version_created_at": "1990-05-18T01:01:01Z"
|
71
|
+
}'
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'returns instantiates a UserCredential' do
|
75
|
+
expect(subject.from_json(user_json)).to be_a(CredHubble::Resources::UserCredential)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'when the Credential type is "certificate"' do
|
80
|
+
let(:certificate_json) do
|
81
|
+
'{
|
82
|
+
"id": "15811465-8538-460d-9682-5514d44439fd",
|
83
|
+
"name": "/load-balancer-tls-cert",
|
84
|
+
"type": "certificate",
|
85
|
+
"value": {
|
86
|
+
"ca": "-----BEGIN CERTIFICATE-----\n... CA CERT ...\n-----END CERTIFICATE-----",
|
87
|
+
"certificate": "-----BEGIN CERTIFICATE-----\n... CERTIFICATE ...\n-----END CERTIFICATE-----",
|
88
|
+
"private_key": "-----BEGIN RSA PRIVATE KEY-----\n... RSA PRIVATE KEY ...\n-----END RSA PRIVATE KEY-----"
|
89
|
+
},
|
90
|
+
"version_created_at": "1990-05-18T01:01:01Z"
|
91
|
+
}'
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'returns instantiates a CertificateCredential' do
|
95
|
+
expect(subject.from_json(certificate_json)).to be_a(CredHubble::Resources::CertificateCredential)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when the Credential type is "rsa"' do
|
100
|
+
let(:rsa_json) do
|
101
|
+
'{
|
102
|
+
"id": "15811465-8538-460d-9682-5514d44439fd",
|
103
|
+
"name": "/rsa-key-1",
|
104
|
+
"type": "rsa",
|
105
|
+
"value": {
|
106
|
+
"public_key": "-----BEGIN PUBLIC KEY-----\n... PUBLIC KEY ...\n-----END PUBLIC KEY-----",
|
107
|
+
"private_key": "-----BEGIN RSA PRIVATE KEY-----\n... RSA PRIVATE KEY ...\n-----END RSA PRIVATE KEY-----"
|
108
|
+
},
|
109
|
+
"version_created_at": "1990-05-18T01:01:01Z"
|
110
|
+
}'
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'returns instantiates a RsaCredential' do
|
114
|
+
expect(subject.from_json(rsa_json)).to be_a(CredHubble::Resources::RsaCredential)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when the Credential type is "ssh"' do
|
119
|
+
let(:ssh_json) do
|
120
|
+
'{
|
121
|
+
"id": "15811465-8538-460d-9682-5514d44439fd",
|
122
|
+
"name": "/ssh-key-1",
|
123
|
+
"type": "ssh",
|
124
|
+
"value": {
|
125
|
+
"public_key": "ssh-rsa AAAAB3NzaC1y...",
|
126
|
+
"private_key": "-----BEGIN RSA PRIVATE KEY-----\n... RSA PRIVATE KEY ...\n-----END RSA PRIVATE KEY-----",
|
127
|
+
"public_key_fingerprint": "9db6ee01f7963db4e8c9966f3c425fd3feeadc148f37b428ddce2a458bd50da6"
|
128
|
+
},
|
129
|
+
"version_created_at": "1990-05-18T01:01:01Z"
|
130
|
+
}'
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'returns instantiates a SshCredential' do
|
134
|
+
expect(subject.from_json(ssh_json)).to be_a(CredHubble::Resources::SshCredential)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'when the Credential type is unknown' do
|
139
|
+
let(:value_json_response) do
|
140
|
+
'{
|
141
|
+
"id": "cdbb371a-cc03-4a6f-aa21-c6461d66ed96",
|
142
|
+
"name": "/the-digital-frontier",
|
143
|
+
"type": "who-knows-man",
|
144
|
+
"value": "🌝",
|
145
|
+
"version_created_at": "1985-01-01T01:01:01Z"
|
146
|
+
}'
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'returns instantiates a base Credential' do
|
150
|
+
expect(subject.from_json(value_json_response)).to be_a(CredHubble::Resources::Credential)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CredHubble::Resources::JsonCredential do
|
4
|
+
subject { CredHubble::Resources::JsonCredential.new }
|
5
|
+
|
6
|
+
let(:json_response) do
|
7
|
+
'{
|
8
|
+
"id": "f2dcb184-cd60-4306-a858-166f44e8cacf",
|
9
|
+
"name": "/backstreets-back-alright",
|
10
|
+
"type": "json",
|
11
|
+
"value": {
|
12
|
+
"title": "Everybody",
|
13
|
+
"album": "Backstreet\'s Back",
|
14
|
+
"members": ["AJ McLean", "Howie D.", "Nick Carter", "Kevin Richardson", "Brian Littrell"]
|
15
|
+
},
|
16
|
+
"version_created_at": "1985-01-01T01:01:01Z"
|
17
|
+
}'
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.from_json' do
|
21
|
+
subject { CredHubble::Resources::JsonCredential }
|
22
|
+
|
23
|
+
context 'when the JSON includes the required attributes' do
|
24
|
+
it 'instantiates a new JsonCredential object' do
|
25
|
+
credential = subject.from_json(json_response)
|
26
|
+
|
27
|
+
expected_value = {
|
28
|
+
'title' => 'Everybody',
|
29
|
+
'album' => "Backstreet's Back",
|
30
|
+
'members' => ['AJ McLean', 'Howie D.', 'Nick Carter', 'Kevin Richardson', 'Brian Littrell']
|
31
|
+
}
|
32
|
+
|
33
|
+
expect(credential).to be_a(CredHubble::Resources::JsonCredential)
|
34
|
+
expect(credential.value).to eq(expected_value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it_behaves_like 'a Credential resource'
|
39
|
+
it_behaves_like 'a JSON deserializing resource'
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#type' do
|
43
|
+
it 'returns "json"' do
|
44
|
+
subject.type = 'attempting-to-overwrite'
|
45
|
+
expect(subject.type).to eq('json')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#to_json' do
|
50
|
+
it_behaves_like 'a JSON serializing resource'
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CredHubble::Resources::PasswordCredential do
|
4
|
+
let(:json_response) do
|
5
|
+
'{
|
6
|
+
"id": "b1a124c5-3faf-426f-9f8f-fe695b36a4e2",
|
7
|
+
"name": "/top-secret-password",
|
8
|
+
"type": "password",
|
9
|
+
"value": "p4ssw0rd",
|
10
|
+
"version_created_at": "1990-05-18T01:01:01Z"
|
11
|
+
}'
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.from_json' do
|
15
|
+
subject { CredHubble::Resources::PasswordCredential }
|
16
|
+
|
17
|
+
context 'when the JSON includes the required attributes' do
|
18
|
+
it 'instantiates a new PasswordCredential object' do
|
19
|
+
credential = subject.from_json(json_response)
|
20
|
+
|
21
|
+
expect(credential).to be_a(CredHubble::Resources::PasswordCredential)
|
22
|
+
expect(credential.value).to eq('p4ssw0rd')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it_behaves_like 'a Credential resource'
|
27
|
+
it_behaves_like 'a JSON deserializing resource'
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#type' do
|
31
|
+
it 'returns "password"' do
|
32
|
+
subject.type = 'attempting-to-overwrite'
|
33
|
+
|
34
|
+
expect(subject.type).to eq('password')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#to_json' do
|
39
|
+
it_behaves_like 'a JSON serializing resource'
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CredHubble::Resources::PermissionCollection do
|
4
|
+
let(:json) do
|
5
|
+
'{
|
6
|
+
"credential_name": "/uaa-client-credentials",
|
7
|
+
"permissions":[
|
8
|
+
{
|
9
|
+
"actor": "mtls-app:5532f504-bb27-43e1-94e9-bad794238f17",
|
10
|
+
"operations": [
|
11
|
+
"read",
|
12
|
+
"write",
|
13
|
+
"delete",
|
14
|
+
"read_acl",
|
15
|
+
"write_acl"
|
16
|
+
]
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"actor": "uaa-user:b2449249-5b51-4893-ab76-648763653c38",
|
20
|
+
"operations": [
|
21
|
+
"read",
|
22
|
+
"write",
|
23
|
+
"delete",
|
24
|
+
"read_acl",
|
25
|
+
"write_acl"
|
26
|
+
]
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}'
|
30
|
+
end
|
31
|
+
|
32
|
+
subject { CredHubble::Resources::PermissionCollection.from_json(json) }
|
33
|
+
|
34
|
+
describe '.from_json' do
|
35
|
+
subject { CredHubble::Resources::PermissionCollection }
|
36
|
+
|
37
|
+
it 'deserializes all of the permissions into Permission objects' do
|
38
|
+
permission_collection = subject.from_json(json)
|
39
|
+
expect(permission_collection.credential_name).to eq('/uaa-client-credentials')
|
40
|
+
|
41
|
+
permissions = permission_collection.permissions
|
42
|
+
expect(permissions).to all(be_a(CredHubble::Resources::Permission))
|
43
|
+
expect(permissions.map(&:actor)).to match_array(
|
44
|
+
%w[
|
45
|
+
mtls-app:5532f504-bb27-43e1-94e9-bad794238f17
|
46
|
+
uaa-user:b2449249-5b51-4893-ab76-648763653c38
|
47
|
+
]
|
48
|
+
)
|
49
|
+
expect(permissions.first.operations).to match_array(%w[read write delete read_acl write_acl])
|
50
|
+
end
|
51
|
+
|
52
|
+
it_behaves_like 'a JSON deserializing resource'
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#each' do
|
56
|
+
it 'is iterable' do
|
57
|
+
expect(subject).to respond_to(:each)
|
58
|
+
expect(subject.first).to be_a(CredHubble::Resources::Permission)
|
59
|
+
expect(subject.map(&:actor)).to match_array(
|
60
|
+
%w[
|
61
|
+
mtls-app:5532f504-bb27-43e1-94e9-bad794238f17
|
62
|
+
uaa-user:b2449249-5b51-4893-ab76-648763653c38
|
63
|
+
]
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#empty?' do
|
69
|
+
context 'when there are permissions' do
|
70
|
+
it 'returns false ' do
|
71
|
+
expect(subject.empty?).to be false
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when are not any permissions' do
|
76
|
+
let(:json) do
|
77
|
+
'{
|
78
|
+
"credential_name": "/uaa-client-credentials",
|
79
|
+
"permissions":[]
|
80
|
+
}'
|
81
|
+
end
|
82
|
+
it 'returns true ' do
|
83
|
+
expect(subject.empty?).to be true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CredHubble::Resources::Permission do
|
4
|
+
let(:json_response) do
|
5
|
+
'{
|
6
|
+
"actor": "mtls-app:5532f504-bb27-43e1-94e9-bad794238f17",
|
7
|
+
"operations": [
|
8
|
+
"read",
|
9
|
+
"write",
|
10
|
+
"delete",
|
11
|
+
"read_acl",
|
12
|
+
"write_acl"
|
13
|
+
]
|
14
|
+
}'
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.from_json' do
|
18
|
+
subject { CredHubble::Resources::Permission }
|
19
|
+
|
20
|
+
context 'when the JSON includes the required attributes' do
|
21
|
+
it 'instantiates a new Permission object' do
|
22
|
+
permission = subject.from_json(json_response)
|
23
|
+
|
24
|
+
expect(permission).to be_a(CredHubble::Resources::Permission)
|
25
|
+
expect(permission.actor).to eq('mtls-app:5532f504-bb27-43e1-94e9-bad794238f17')
|
26
|
+
expect(permission.operations).to match_array(%w[read write delete read_acl write_acl])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it_behaves_like 'a JSON deserializing resource'
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#to_json' do
|
34
|
+
it_behaves_like 'a JSON serializing resource'
|
35
|
+
end
|
36
|
+
end
|