soar-registry-identity 4.0.3 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +106 -11
- data/lib/soar/registry/identity/factory.rb +1 -1
- data/lib/soar/registry/identity/model.rb +6 -3
- data/lib/soar/registry/identity/provider/customer/client_number.rb +7 -2
- data/lib/soar/registry/identity/provider/customer/email.rb +5 -2
- data/lib/soar/registry/identity/provider/customer/uuid.rb +116 -3
- data/lib/soar/registry/identity/provider/staff/email.rb +5 -2
- data/lib/soar/registry/identity/provider/staff/uuid.rb +69 -32
- data/lib/soar/registry/identity/test/fixtures/client_table.sql +91 -0
- data/lib/soar/registry/identity/test/fixtures/roles_table.json +27 -0
- data/lib/soar/registry/identity/test/orchestration_provider/customer/uuid.rb +201 -0
- data/lib/soar/registry/identity/test/orchestration_provider/staff/uuid.rb +207 -0
- data/lib/soar/registry/identity/test/orchestrator.rb +86 -0
- metadata +10 -14
- data/lib/soar/registry/identity/test/fixtures/customer/identities.json +0 -18
- data/lib/soar/registry/identity/test/fixtures/roles.json +0 -52
- data/lib/soar/registry/identity/test/fixtures/staff/identities.json +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 821dd803bad9432b1c2206c11c46708bed15d4e0
|
4
|
+
data.tar.gz: baea63429adf243703b68e74f9b3d0d46aac8d41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf1e42b3b28c05e5f01c0b72a77fc82c287c9cfd2d8334b25dae439b3cae1663a06b6710acebb500d69659f3cf9669ed8f9fa13706324f31d2db21218ce0c09e
|
7
|
+
data.tar.gz: b577f82ccedd6db4a7b8d4a5b5f8f5798d4001623a67ad006defac2de9af286f71333f244e543684b731392e9832b13b60139820093c3027bc86766ee0b028c0
|
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
## Quickstart
|
4
4
|
|
5
5
|
### Example data
|
6
|
+
|
6
7
|
```javascript
|
7
8
|
identities = [{
|
8
9
|
"uuid": "62936e70-1815-439b-bf89-8492855a7e6b",
|
@@ -23,6 +24,7 @@ Create a directory provider
|
|
23
24
|
```
|
24
25
|
|
25
26
|
Create a directory
|
27
|
+
|
26
28
|
```ruby
|
27
29
|
> directory = Soar::Registry::Directory.new(directory_provider)
|
28
30
|
```
|
@@ -32,7 +34,7 @@ Create a directory
|
|
32
34
|
#### Manual instantiation
|
33
35
|
|
34
36
|
##### Staff Email IDR
|
35
|
-
Search for identifiers by email address. Used by [soar-authentication-
|
37
|
+
Search for identifiers by email address. Used by [soar-authentication-identity_uuid_translator](https://github.com/hetznerZA/soar-authentication-identity_uuid_translator) to translate an authenticated identifier to an UUID.
|
36
38
|
```ruby
|
37
39
|
require 'soar/registry/identity'
|
38
40
|
identity_provider = Soar::Registry::Identity::Provider::Staff::Email.new({
|
@@ -48,7 +50,8 @@ identity_provider = Soar::Registry::Identity::Provider::Staff::Email.new({
|
|
48
50
|
|
49
51
|
#### Factory instantiation
|
50
52
|
|
51
|
-
|
53
|
+
Create a selector
|
54
|
+
|
52
55
|
```ruby
|
53
56
|
> require 'object_selector'
|
54
57
|
> selector = ObjectSelector.new(
|
@@ -83,7 +86,8 @@ identity_provider = Soar::Registry::Identity::Provider::Staff::Email.new({
|
|
83
86
|
)
|
84
87
|
```
|
85
88
|
|
86
|
-
|
89
|
+
Get an IDR
|
90
|
+
|
87
91
|
```ruby
|
88
92
|
> selector_value = 'your-string-here'
|
89
93
|
idr = Soar::Registry::Identity::Factory.create({
|
@@ -94,14 +98,16 @@ idr = Soar::Registry::Identity::Factory.create({
|
|
94
98
|
|
95
99
|
### Use your IDR
|
96
100
|
|
97
|
-
|
101
|
+
Getting a list of identifiers
|
102
|
+
|
98
103
|
```ruby
|
99
104
|
> identifiers = @email_idr.get_identifiers("admin@hetzner.co.za")
|
100
105
|
> puts identifiers.inspect
|
101
106
|
["admin@hetzner.co.za", "identity-820d5660-2204-4f7d-8c04-746313439b81"]
|
102
107
|
```
|
103
108
|
|
104
|
-
|
109
|
+
Getting a list of roles
|
110
|
+
|
105
111
|
```ruby
|
106
112
|
> roles = @uuid_idr.get_roles("identity-820d5660-2204-4f7d-8c04-746313439b81")
|
107
113
|
> # get_roles is not applicable to staff email idr
|
@@ -109,7 +115,8 @@ idr = Soar::Registry::Identity::Factory.create({
|
|
109
115
|
["staff", "configuration_publisher", "configuration_consumer"]
|
110
116
|
```
|
111
117
|
|
112
|
-
|
118
|
+
Getting a hash of attributes for a role
|
119
|
+
|
113
120
|
```ruby
|
114
121
|
> role = 'staff'
|
115
122
|
> attributes = @uuid_idr.get_attributes("identity-820d5660-2204-4f7d-8c04-746313439b81", role)
|
@@ -123,7 +130,8 @@ idr = Soar::Registry::Identity::Factory.create({
|
|
123
130
|
|
124
131
|
```
|
125
132
|
|
126
|
-
|
133
|
+
Getting a hash of all attributes
|
134
|
+
|
127
135
|
```ruby
|
128
136
|
> attributes = @uuid_idr.get_attributes("identity-820d5660-2204-4f7d-8c04-746313439b81")
|
129
137
|
> # get_attributes is not applicate to staff email idr
|
@@ -154,15 +162,102 @@ idr = Soar::Registry::Identity::Factory.create({
|
|
154
162
|
## Tests
|
155
163
|
|
156
164
|
### Local
|
165
|
+
|
166
|
+
Start container dependencies
|
167
|
+
|
168
|
+
```bash
|
169
|
+
$ docker-compose up --build --remove-orphans --force-recreate
|
170
|
+
```
|
171
|
+
|
172
|
+
Soar::Registry::Identity::Provider::Customer::Uuid
|
173
|
+
|
157
174
|
```bash
|
158
|
-
$ bundle exec
|
175
|
+
$ CUSTOMER_DIRECTORY_CONFIG_FILE=config.mysql.yml ROLES_DIRECTORY_CONFIG_FILE=config.dynamo_db.yml TEST_ORCHESTRATION_PROVIDER=Customer::Uuid bundle exec cucumber
|
176
|
+
```
|
177
|
+
|
178
|
+
Soar::Registry::Identity::Provider::Staff::Uuid
|
179
|
+
|
180
|
+
```bash
|
181
|
+
$ STAFF_DIRECTORY_CONFIG_FILE=config.ldap.yml ROLES_DIRECTORY_CONFIG_FILE=config.dynamo_db.yml TEST_ORCHESTRATION_PROVIDER=Staff::Uuid bundle exec cucumber
|
182
|
+
```
|
183
|
+
|
184
|
+
Soar::Registry::Identity::Provider::Staff::Email
|
185
|
+
|
186
|
+
```bash
|
187
|
+
$ bundle exec rspec spec/staff/email_spec.rb
|
188
|
+
```
|
189
|
+
|
190
|
+
Soar::Registry::Identity::Provider::Customer::Email
|
191
|
+
|
192
|
+
```bash
|
193
|
+
$ bundle exec rspec spec/customer/email_spec.rb
|
194
|
+
```
|
195
|
+
|
196
|
+
Soar::Registry::Identity::Provider::Customer::ClientNumber
|
197
|
+
|
198
|
+
```bash
|
199
|
+
$ bundle exec rspec spec/customer/client_number_spec.rb
|
200
|
+
```
|
201
|
+
|
202
|
+
Soar::Registry::Identity::Factory
|
203
|
+
|
204
|
+
```bash
|
205
|
+
$ bundle exec rspec spec/authenticated_identity_factory_spec.rb spec/identity_uuid_factory_spec.rb
|
159
206
|
```
|
160
207
|
|
161
208
|
### CI
|
209
|
+
|
210
|
+
Soar::Registry::Identity::Provider::Staff::Email
|
211
|
+
|
212
|
+
```bash
|
213
|
+
docker-compose --file docker-compose.ci.staff-email.yml --project-name soar-registry-identity-provider-staff-email up --abort-on-container-exit --remove-orphans --build --force-recreate
|
214
|
+
EXIT_CODE=$(docker ps -a -f "name=soarregistryidentityproviderstaffemail_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}");
|
215
|
+
docker-compose --file docker-compose.ci.staff-email.yml --project-name soar-registry-identity-provider-staff-email down --rmi local
|
216
|
+
exit $EXIT_CODE;
|
217
|
+
```
|
218
|
+
|
219
|
+
Soar::Registry::Identity::Provider::Customer::Email
|
220
|
+
|
221
|
+
```bash
|
222
|
+
docker-compose --file docker-compose.ci.customer-email.yml --project-name soar-registry-identity-provider-customer-email up --abort-on-container-exit --remove-orphans --build --force-recreate
|
223
|
+
EXIT_CODE=$(docker ps -a -f "name=soarregistryidentityprovidercustomeremail_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}");
|
224
|
+
docker-compose --file docker-compose.ci.customer-email.yml --project-name soar-registry-identity-provider-customer-email down --rmi local
|
225
|
+
exit $EXIT_CODE;
|
226
|
+
```
|
227
|
+
|
228
|
+
Soar::Registry::Identity::Provider::Customer::ClientNumber
|
229
|
+
|
230
|
+
```bash
|
231
|
+
docker-compose --file docker-compose.ci.customer-client_number.yml --project-name soar-registry-identity-provider-customer-client_number up --abort-on-container-exit --remove-orphans --build --force-recreate
|
232
|
+
EXIT_CODE=$(docker ps -a -f "name=soarregistryidentityprovidercustomerclientnumber_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}");
|
233
|
+
docker-compose --file docker-compose.ci.customer-client_number.yml --project-name soar-registry-identity-provider-customer-client_number down --rmi local
|
234
|
+
exit $EXIT_CODE;
|
235
|
+
```
|
236
|
+
|
237
|
+
Soar::Registry::Identity::Factory
|
238
|
+
|
239
|
+
```bash
|
240
|
+
docker-compose --file docker-compose.ci.factory.yml --project-name soar-registry-identity-factory up --abort-on-container-exit --remove-orphans --build --force-recreate
|
241
|
+
EXIT_CODE=$(docker ps -a -f "name=soarregistryidentityfactory_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}");
|
242
|
+
docker-compose --file docker-compose.ci.factory.yml --project-name soar-registry-identity-factory down --rmi local
|
243
|
+
exit $EXIT_CODE;
|
244
|
+
```
|
245
|
+
|
246
|
+
Soar::Registry::Identity::Provider::Staff::Uuid
|
247
|
+
|
248
|
+
```bash
|
249
|
+
docker-compose --file docker-compose.ci.staff-uuid.yml --project-name soar-registry-identity-provider-staff-uuid up --abort-on-container-exit --remove-orphans --build --force-recreate
|
250
|
+
EXIT_CODE=$(docker ps -a -f "name=soarregistryidentityproviderstaffuuid_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}");
|
251
|
+
docker-compose --file docker-compose.ci.staff-uuid.yml --project-name soar-registry-identity-provider-staff-uuid down --rmi local
|
252
|
+
exit $EXIT_CODE;
|
253
|
+
```
|
254
|
+
|
255
|
+
Soar::Registry::Identity::Provider::Customer::Uuid
|
256
|
+
|
162
257
|
```bash
|
163
|
-
docker-compose --file docker-compose.ci.yml --project-name soar-registry-identity up --abort-on-container-exit --remove-orphans --build --force-recreate
|
164
|
-
EXIT_CODE=$(docker ps -a -f "name=
|
165
|
-
docker-compose --file docker-compose.ci.yml --project-name soar-registry-identity down --rmi local
|
258
|
+
docker-compose --file docker-compose.ci.customer-uuid.yml --project-name soar-registry-identity-provider-customer-uuid up --abort-on-container-exit --remove-orphans --build --force-recreate
|
259
|
+
EXIT_CODE=$(docker ps -a -f "name=soarregistryidentityprovidercustomeruuid_tests" -q | xargs docker inspect -f "{{ .State.ExitCode }}");
|
260
|
+
docker-compose --file docker-compose.ci.customer-uuid.yml --project-name soar-registry-identity-provider-customer-uuid down --rmi local
|
166
261
|
exit $EXIT_CODE;
|
167
262
|
```
|
168
263
|
|
@@ -2,6 +2,7 @@ require 'soar/registry/identity/provider/staff/email'
|
|
2
2
|
require 'soar/registry/identity/provider/staff/uuid'
|
3
3
|
require 'soar/registry/identity/provider/customer/client_number'
|
4
4
|
require 'soar/registry/identity/provider/customer/email'
|
5
|
+
require 'soar/registry/identity/provider/customer/uuid'
|
5
6
|
|
6
7
|
module Soar
|
7
8
|
module Registry
|
@@ -15,7 +16,7 @@ module Soar
|
|
15
16
|
end
|
16
17
|
|
17
18
|
##
|
18
|
-
# @param [String] identifier
|
19
|
+
# @param [String] identifier
|
19
20
|
# @return [Array<String>] list of roles
|
20
21
|
##
|
21
22
|
def get_roles(identifier)
|
@@ -25,7 +26,8 @@ module Soar
|
|
25
26
|
##
|
26
27
|
# @param [String] identifier
|
27
28
|
# @param [String] role
|
28
|
-
# @return [Hash
|
29
|
+
# @return [Hash{String => String, Hash, Number}]
|
30
|
+
# if a role is specified the returned hash is keyed by role
|
29
31
|
# else it's keyed by attribute name
|
30
32
|
##
|
31
33
|
def get_attributes(identifier, role = nil)
|
@@ -34,7 +36,8 @@ module Soar
|
|
34
36
|
|
35
37
|
##
|
36
38
|
# @param [String] identifier
|
37
|
-
# @return [Array<String>]
|
39
|
+
# @return [Array<String>]
|
40
|
+
# array of identity identifiers
|
38
41
|
##
|
39
42
|
def get_identifiers(identifier)
|
40
43
|
@provider.get_identifiers(identifier)
|
@@ -9,6 +9,8 @@ module Soar
|
|
9
9
|
|
10
10
|
##
|
11
11
|
# @param [Soar::Registry::Directory] directory
|
12
|
+
# @param [String] fetch_index
|
13
|
+
# @param [String] search_index
|
12
14
|
##
|
13
15
|
def initialize(directory:, fetch_index: , search_index: )
|
14
16
|
@directory = directory
|
@@ -17,12 +19,15 @@ module Soar
|
|
17
19
|
end
|
18
20
|
|
19
21
|
##
|
20
|
-
# @param [String]
|
22
|
+
# @param [String] identity_identifier
|
23
|
+
# a client_number that uniquely identifies an identity
|
21
24
|
# @return [Hash] an identity
|
22
25
|
##
|
23
26
|
def calculate_identities(identity_identifier)
|
27
|
+
return @identities if not @identities.nil?
|
24
28
|
entries = @directory.search(@search_index, identity_identifier)
|
25
|
-
|
29
|
+
@identities = entries.empty? ? [] : [entries[0]]
|
30
|
+
return @identities
|
26
31
|
end
|
27
32
|
|
28
33
|
##
|
@@ -17,12 +17,15 @@ module Soar
|
|
17
17
|
end
|
18
18
|
|
19
19
|
##
|
20
|
-
# @param [String]
|
20
|
+
# @param [String] identity_identifier
|
21
|
+
# an email address that uniquely identifies an identity
|
21
22
|
# @return [Hash] an identity
|
22
23
|
##
|
23
24
|
def calculate_identities(identity_identifier)
|
25
|
+
return @identities if not @identities.nil?
|
24
26
|
entries = @directory.search(@search_index, identity_identifier)
|
25
|
-
|
27
|
+
@identities = entries.empty? ? [] : [entries[0]]
|
28
|
+
return @identities
|
26
29
|
end
|
27
30
|
|
28
31
|
##
|
@@ -12,11 +12,124 @@ module Soar
|
|
12
12
|
class Uuid < SoarIdm::IdmApi
|
13
13
|
|
14
14
|
##
|
15
|
-
# @param [
|
16
|
-
# @
|
15
|
+
# @param [Hash] identity
|
16
|
+
# @option identity [Soar::Registry::Directory] :directory
|
17
|
+
# @option identity [String] :fetch_index
|
18
|
+
# @option identity [String] :search_index
|
19
|
+
#
|
20
|
+
# @param [Hash] roles
|
21
|
+
# @option roles [Soar::Registry::Directory] :directory
|
22
|
+
# @option roles [String] :fetch_index
|
23
|
+
# @option roles [String] :search_index
|
24
|
+
#
|
25
|
+
# @raise [ArgumentError]
|
26
|
+
##
|
27
|
+
def initialize(identity:, roles:)
|
28
|
+
raise ArgumentError if not identity.key?(:directory) or not identity.key?(:fetch_index) or not identity.key?(:search_index)
|
29
|
+
raise ArgumentError if not roles.key?(:directory) or not roles.key?(:fetch_index) or not roles.key?(:search_index)
|
30
|
+
@identity = identity
|
31
|
+
@roles = roles
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# @param [Hash{String => String,Number}] identity
|
36
|
+
# @return [Array<String>] list of roles
|
37
|
+
##
|
38
|
+
def calculate_roles(identity)
|
39
|
+
entries = @roles[:directory].search(@roles[:search_index], identity[@roles[:search_index]])
|
40
|
+
roles = []
|
41
|
+
entries.each do |entry|
|
42
|
+
roles << entry[@roles[:fetch_index][1]]
|
43
|
+
end
|
44
|
+
return roles
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# @param [Hash{String => String, Number}] identity
|
49
|
+
# @return [Array<String,Number>] list of identifiers
|
50
|
+
##
|
51
|
+
def calculate_identifiers(identity)
|
52
|
+
indexes = @identity[:directory].index
|
53
|
+
#indexes.delete(@identity[:directory])
|
54
|
+
identifiers = []
|
55
|
+
indexes.each { |index|
|
56
|
+
identifiers << identity[index.to_s]
|
57
|
+
}
|
58
|
+
identifiers << identity[@roles[:fetch_index][0]]
|
59
|
+
return identifiers.reverse
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# @param [Hash{String => String, Number}] identity
|
64
|
+
# @param [String] role
|
65
|
+
# @return [Hash{String => String, Number, Hash, Array}] A hash of attributes
|
66
|
+
##
|
67
|
+
def calculate_attributes(identity, role)
|
68
|
+
primary_key = {
|
69
|
+
@roles[:fetch_index][0] => identity[@roles[:fetch_index][0]],
|
70
|
+
@roles[:fetch_index][1] => role
|
71
|
+
}
|
72
|
+
result = @roles[:directory].fetch(primary_key)
|
73
|
+
attributes = {
|
74
|
+
role => result.key?('identity_role_attributes') ? result['identity_role_attributes'] : {}
|
75
|
+
}
|
76
|
+
return attributes
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# @param [Hash{String => String, Number}] identity
|
81
|
+
# @return [Hash{String => String, Number, Hash, Array}] A hash of attributes
|
82
|
+
def calculate_all_attributes(identity)
|
83
|
+
identity = Marshal.load(Marshal.dump(identity))
|
84
|
+
identity_uuid = identity[@roles[:search_index]]
|
85
|
+
role_entries = @roles[:directory].search(@roles[:search_index], identity_uuid)
|
86
|
+
roles = {}
|
87
|
+
role_entries.each do |role_entry|
|
88
|
+
roles[role_entry['identity_role']] = role_entry.key?('identity_role_attributes') ? role_entry['identity_role_attributes'] : {}
|
89
|
+
end
|
90
|
+
identity[:roles] = roles
|
91
|
+
attributes = Hashie.stringify_keys(identity)
|
92
|
+
return attributes
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# @param [String] identifier a string that uniquely identifies an identity
|
97
|
+
# @return [Array<Hash{String => String, Number }>] identities
|
17
98
|
##
|
18
99
|
def calculate_identities(identifier)
|
19
|
-
return
|
100
|
+
return @identities if not @identities.nil?
|
101
|
+
identities = @roles[:directory].search(@roles[:search_index], identifier)
|
102
|
+
identity = { @roles[:search_index] => identifier }
|
103
|
+
return [identity] if identities.length == 0
|
104
|
+
identity_source = get_identity_source(identities)
|
105
|
+
identity_id = get_identity_id(identity_source) if not identity_source.nil?
|
106
|
+
#raise SoarIdm::IdentityError if identity_id.nil?
|
107
|
+
begin
|
108
|
+
identity = @identity[:directory].fetch(identity_id)
|
109
|
+
identity = {
|
110
|
+
"email" => identity[:Notifyemail_Invoice],
|
111
|
+
"firstname" => identity[:First_Name],
|
112
|
+
"lastname" =>identity[:Surname]
|
113
|
+
}
|
114
|
+
rescue Soar::Registry::Directory::Error::NoEntriesFoundError
|
115
|
+
end
|
116
|
+
identity[@roles[:search_index]] = identifier
|
117
|
+
@identities = [identity]
|
118
|
+
return @identities
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def get_identity_id(identity_source)
|
124
|
+
result = identity_source.split(":")
|
125
|
+
return result.last.to_i if result[0] === "mysql" and result[1] === "genie" and result[2] === "client" and result[3] === "id"
|
126
|
+
end
|
127
|
+
|
128
|
+
def get_identity_source(identities)
|
129
|
+
identity_source = identities.each { |identity|
|
130
|
+
break identity["identity_source"] if identity.key?("identity_source")
|
131
|
+
}
|
132
|
+
return identity_source if identity_source.is_a?(String)
|
20
133
|
end
|
21
134
|
|
22
135
|
end
|
@@ -17,12 +17,15 @@ module Soar
|
|
17
17
|
end
|
18
18
|
|
19
19
|
##
|
20
|
-
# @param [String]
|
20
|
+
# @param [String] identity_identifier
|
21
|
+
# an email address that uniquely identifies an identity
|
21
22
|
# @return [Hash] an identity
|
22
23
|
##
|
23
24
|
def calculate_identities(identity_identifier)
|
25
|
+
return @identities if not @identities.nil?
|
24
26
|
entries = @directory.search(@search_index, identity_identifier)
|
25
|
-
|
27
|
+
@identities = entries.empty? ? [] : [entries[0]]
|
28
|
+
return @identities
|
26
29
|
end
|
27
30
|
|
28
31
|
##
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'soar_idm/soar_idm'
|
2
|
+
require 'hashie'
|
2
3
|
|
3
4
|
module Soar
|
4
5
|
module Registry
|
@@ -6,71 +7,107 @@ module Soar
|
|
6
7
|
module Provider
|
7
8
|
module Staff
|
8
9
|
|
9
|
-
##
|
10
|
-
# Work in progress. Do not use.
|
11
|
-
##
|
12
10
|
class Uuid < SoarIdm::IdmApi
|
13
11
|
|
14
12
|
##
|
15
|
-
# @param [Hash]
|
16
|
-
# @option
|
17
|
-
# @option
|
13
|
+
# @param [Hash] identity
|
14
|
+
# @option identity [Soar::Registry::Directory] :directory
|
15
|
+
# @option identity [String] :fetch_index
|
16
|
+
# @option identity [String] :search_index
|
17
|
+
#
|
18
|
+
# @param [Hash] roles
|
19
|
+
# @option roles [Soar::Registry::Directory] :directory
|
20
|
+
# @option roles [String] :fetch_index
|
21
|
+
# @option roles [String] :search_index
|
22
|
+
#
|
23
|
+
# @raise [ArgumentError]
|
18
24
|
##
|
19
|
-
def initialize(
|
20
|
-
raise
|
21
|
-
|
22
|
-
@
|
25
|
+
def initialize(identity:, roles:)
|
26
|
+
raise ArgumentError if not identity.key?(:directory) or not identity.key?(:fetch_index) or not identity.key?(:search_index)
|
27
|
+
raise ArgumentError if not roles.key?(:directory) or not roles.key?(:fetch_index) or not roles.key?(:search_index)
|
28
|
+
@identity = identity
|
29
|
+
@roles = roles
|
23
30
|
end
|
24
31
|
|
25
32
|
##
|
26
|
-
# @param [Hash] identity
|
27
|
-
# @return [Array] list of roles
|
33
|
+
# @param [Hash{String => String}] identity
|
34
|
+
# @return [Array<String>] list of roles
|
35
|
+
##
|
28
36
|
def calculate_roles(identity)
|
29
|
-
|
30
|
-
return nil if not entry
|
37
|
+
entries = @roles[:directory].search(@roles[:search_index], identity[@identity[:fetch_index]])
|
31
38
|
roles = []
|
32
|
-
|
33
|
-
roles <<
|
39
|
+
entries.each do |entry|
|
40
|
+
roles << entry[@roles[:fetch_index][1]]
|
34
41
|
end
|
35
|
-
roles
|
42
|
+
#raise SoarIdm::IdentityError if identity.nil? and roles.length == 0
|
43
|
+
return roles
|
36
44
|
end
|
37
45
|
|
38
46
|
##
|
39
|
-
# @param [Hash] identity
|
40
|
-
# @return [Array] list of identifiers
|
47
|
+
# @param [Hash{String => String, Number}] identity
|
48
|
+
# @return [Array<String,Number>] list of identifiers
|
41
49
|
##
|
42
50
|
def calculate_identifiers(identity)
|
43
|
-
indexes = @
|
51
|
+
indexes = @identity[:directory].index
|
44
52
|
identifiers = []
|
45
53
|
indexes.each { |index|
|
46
|
-
identifiers << identity[index]
|
54
|
+
identifiers << identity[index.to_s]
|
47
55
|
}
|
48
56
|
identifiers
|
49
57
|
end
|
50
58
|
|
51
59
|
##
|
52
|
-
# @param [Hash] identity
|
60
|
+
# @param [Hash{String => String, Number}] identity
|
53
61
|
# @param [String] role
|
54
|
-
# @return [Hash] A hash of attributes
|
62
|
+
# @return [Hash{String => String, Number, Hash, Array}] A hash of attributes
|
63
|
+
##
|
55
64
|
def calculate_attributes(identity, role)
|
56
|
-
|
57
|
-
|
58
|
-
|
65
|
+
primary_key = {
|
66
|
+
@roles[:fetch_index][0] => identity[@identity[:fetch_index]],
|
67
|
+
@roles[:fetch_index][1] => role
|
68
|
+
}
|
69
|
+
result = @roles[:directory].fetch(primary_key)
|
70
|
+
attributes = {
|
71
|
+
role => result.key?('identity_role_attributes') ? result['identity_role_attributes'] : {}
|
72
|
+
}
|
73
|
+
return attributes
|
59
74
|
end
|
60
75
|
|
76
|
+
##
|
77
|
+
# @param [Hash{String => String, Number}] identity
|
78
|
+
# @return [Hash{String => String, Number, Hash, Array}] A hash of attributes
|
61
79
|
##
|
62
|
-
# @param [Hash] identity
|
63
|
-
# @return [Hash] Hash of attributes keyed by role
|
64
80
|
def calculate_all_attributes(identity)
|
65
|
-
|
81
|
+
identity_uuid = identity[@identity[:fetch_index]]
|
82
|
+
role_entries = @roles[:directory].search(@roles[:search_index], identity_uuid)
|
83
|
+
roles = {}
|
84
|
+
role_entries.each do |role_entry|
|
85
|
+
roles[role_entry['identity_role']] = role_entry.key?('identity_role_attributes') ? role_entry['identity_role_attributes'] : {}
|
86
|
+
end
|
87
|
+
attributes = {
|
88
|
+
identity_uuid: identity_uuid,
|
89
|
+
firstname: identity['givenName'],
|
90
|
+
lastname: identity['sn'],
|
91
|
+
email: identity[@identity[:search_index]],
|
92
|
+
roles: roles
|
93
|
+
}
|
94
|
+
return attributes.stringify_keys
|
66
95
|
end
|
67
96
|
|
68
97
|
##
|
69
|
-
# @param [String] identifier
|
70
|
-
# @return [Hash]
|
98
|
+
# @param [String] identifier a string that uniquely identifies an identity
|
99
|
+
# @return [Array<Hash{String => String}>] identities
|
100
|
+
# @raise [Soar::Registry::Directory::Error::NoEntriesFoundError]
|
71
101
|
##
|
72
102
|
def calculate_identities(identifier)
|
73
|
-
return
|
103
|
+
return @identities if not @identities.nil?
|
104
|
+
begin
|
105
|
+
result = @identity[:directory].fetch(identifier)
|
106
|
+
@identities = [Hashie.stringify_keys(result)]
|
107
|
+
return @identities
|
108
|
+
rescue Soar::Registry::Directory::Error::NoEntriesFoundError => e
|
109
|
+
raise SoarIdm::IdentityError
|
110
|
+
end
|
74
111
|
end
|
75
112
|
|
76
113
|
end
|