soar-registry-identity 4.0.3 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|