idnio 2.3.3b → 2.3.4b

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.
@@ -7,6 +7,29 @@ require "idnio/markdown"
7
7
 
8
8
  module Roles
9
9
 
10
+ #
11
+ # Gets Role Name from ID
12
+ #
13
+ def self.get_name_from_id( id )
14
+ result = ReferenceResolver.search_for_single_object( "roles", "id:#{id}" )
15
+ unless result.nil?
16
+ return result['name']
17
+ end
18
+ return nil
19
+ end
20
+
21
+ #
22
+ # Gets Role ID from Name
23
+ #
24
+ def self.get_id_from_name( name )
25
+ result = ReferenceResolver.search_for_single_object( "roles", "name:#{name}" )
26
+ unless result.nil?
27
+ return result['id']
28
+ end
29
+ return nil
30
+ end
31
+
32
+
10
33
  def self.querysearch( query )
11
34
 
12
35
  response = IDNAPI.get( "#{$url}/v2/search/roles?offset=0&limit=10&query=#{query}", $token )
@@ -33,40 +56,47 @@ module Roles
33
56
 
34
57
  response = IDNAPI.get( "#{$url}/cc/api/role/list", $token )
35
58
 
36
- unless response.nil?
59
+ case response
60
+ when Net::HTTPSuccess
37
61
 
38
62
  roles = JSON.parse( response.body )
39
63
 
40
- $log.info "\tDetected #{roles['count']} roles."
64
+ $log.info "\tRetrieved #{roles['count']} roles."
41
65
 
42
66
  roles['items'].each do |role|
43
67
 
44
- apNames = ""
45
-
46
68
  $log.info "\tRole: #{role["displayName"]}"
47
69
 
48
- role_response = IDNAPI.get( "#{$url}/cc/api/role/get/?id=#{role["id"]}", $token )
70
+ response = IDNAPI.get( "#{$url}/cc/api/role/get/?id=#{role["id"]}", $token )
49
71
 
50
- full_role = JSON.parse( role_response.body )
72
+ case response
73
+ when Net::HTTPSuccess
51
74
 
52
- full_role['accessProfileIds'].each do |ap|
75
+ role = JSON.parse( response.body )
53
76
 
54
- response = IDNAPI.get( "#{$url}/v2/search/accessprofiles?query='id=#{ap}''", $token )
77
+ access_profile_names = []
55
78
 
56
- unless response.nil?
57
- result = JSON.parse( response.body )
58
- result.each do |r|
59
-
60
- apNames << r['name']
61
- apNames << ";"
79
+ role['accessProfileIds'].each do |access_profile_id|
80
+ access_profile_name = AccessProfiles.get_name_from_id( access_profile_id )
81
+ unless access_profile_name.nil?
82
+ access_profile_names.push( access_profile_name )
62
83
  end
63
84
  end
64
- end
65
- full_role['accessProfileNames'] = apNames
66
85
 
67
- Program.write_file( "#{directory}/roles/", "Role - #{full_role["displayName"]}.json", JSON.pretty_generate(full_role) )
68
- end
69
- end
86
+ role['accessProfileNames'] = access_profile_names
87
+
88
+ Program.write_file( "#{directory}/roles/", "Role - #{role["displayName"]}.json", JSON.pretty_generate( role ) )
89
+
90
+ else
91
+ $log.error "\tError: Unable to retrieve role details."
92
+ end # case response
93
+
94
+ end # roles['items'].each do |role|
95
+
96
+ else
97
+ $log.error "\tError: Unable to retrieve roles."
98
+ end # case response
99
+
70
100
  end
71
101
 
72
102
  #
@@ -80,36 +110,64 @@ module Roles
80
110
  # Documents Role configurations.
81
111
  #
82
112
  def self.doc
83
- Markdown.h2( "Roles" )
84
-
85
- Markdown.text( "| Name | Description | Selector | Access Profiles |\n")
86
- Markdown.text( "|------|-------------|----------|-----------------|\n")
87
113
 
88
114
  response = IDNAPI.get( "#{$url}/cc/api/role/list", $token )
89
- unless response.nil?
90
- roles = JSON.parse( response.body )
91
-
92
- $log.info "\tDetected #{roles['count']} roles."
93
-
94
- roles['items'].each do |role|
95
- $log.info "\tRole: #{role["displayName"]}"
96
- role_response = IDNAPI.get( "#{$url}/cc/api/role/get/?id=#{role["id"]}", $token )
97
- full_role = JSON.parse( role_response.body )
98
- search_role = Roles.querysearch( "name:\"#{role["displayName"]}\"" )
99
- accessProfileNames = ""
100
-
101
- unless search_role["accessProfiles"].nil?
102
- search_role["accessProfiles"].each do |ap|
103
- if accessProfileNames != ""
104
- accessProfileNames += ","
105
- end
106
- accessProfileNames += ap["name"]
107
- end
115
+
116
+ case response
117
+ when Net::HTTPSuccess
118
+
119
+ roles = JSON.parse( response.body )
120
+
121
+ $log.info "\tRetrieved #{roles['count']} roles."
122
+
123
+ Markdown.h2 "Roles"
124
+ Markdown.text "| Name | Description | Disabled? | Requestable? | Assignment | Access Profiles |\n"
125
+ Markdown.text "|------|-------------|-----------|--------------|------------|-----------------|\n"
126
+
127
+ roles['items'].each do |role|
128
+
129
+ $log.info "\tRole: #{role["displayName"]}"
130
+
131
+ response = IDNAPI.get( "#{$url}/cc/api/role/get/?id=#{role["id"]}", $token )
132
+
133
+ case response
134
+ when Net::HTTPSuccess
135
+
136
+ access_profile_names = []
137
+
138
+ role = JSON.parse( response.body )
139
+
140
+ role['accessProfileIds'].each do |access_profile_id|
141
+ access_profile_name = AccessProfiles.get_name_from_id( access_profile_id )
142
+ unless access_profile_name.nil?
143
+ access_profile_names.push( access_profile_name )
108
144
  end
109
- #end
110
- Markdown.text( "|#{full_role["displayName"]}|#{full_role["description"]}|#{full_role["selector"]}|#{accessProfileNames}|\n")
111
- end
112
- end
145
+ end
146
+
147
+ case role["selector"]["type"]
148
+ when "COMPLEX_CRITERIA"
149
+ assignment = "Standard"
150
+ when "IDENTITY_LIST"
151
+ assignment = "Identity List"
152
+ when "CUSTOM"
153
+ assignment = "Custom (Rule)"
154
+ when "UNDEFINED"
155
+ assignment = "None"
156
+ else
157
+ assignment = "None"
158
+ end
159
+
160
+ Markdown.text( "|#{role["displayName"]}|#{role["description"]}|#{Program.humanize( role["disabled"] )}|#{Program.humanize( role["requestable"] )}|#{assignment}|#{access_profile_names.join( ", " )}|\n")
161
+
162
+ else
163
+ $log.error "\tError: Unable to retrieve role details."
164
+ end # case response
165
+
166
+ end # roles['items'].each do |role|
167
+
168
+ else
169
+ $log.error "\tError: Unable to retrieve roles."
170
+ end # case response
113
171
 
114
172
  Markdown.write
115
173
  end
@@ -112,7 +112,7 @@ module Rules
112
112
 
113
113
  rules = JSON.parse( response.body )
114
114
 
115
- $log.info "\tDetected #{rules["count"]} rules."
115
+ $log.info "\tRetrieved rules."
116
116
 
117
117
  rules["items"].each do |rule|
118
118
 
@@ -128,14 +128,14 @@ module Rules
128
128
 
129
129
  else
130
130
 
131
- $log.info "\tSkipping Default Rule: #{rule["name"]}"
131
+ $log.debug "\tSkipping Default Rule: #{rule["name"]}"
132
132
 
133
133
  end # if (!@@default_transforms.include? transform["id"]...
134
134
 
135
135
  end # rules["items"].each do |rule|
136
136
 
137
137
  else
138
- $log.error "\tError: Unable to fetch rules."
138
+ $log.error "\tError: Unable to retrieve rules."
139
139
  end # case response
140
140
 
141
141
  end
@@ -159,7 +159,7 @@ module Rules
159
159
 
160
160
  rules = JSON.parse( response.body )
161
161
 
162
- $log.info "\tDetected #{rules["count"]} rules."
162
+ $log.info "\tRetrieved rules."
163
163
 
164
164
  Markdown.h2 "Rules"
165
165
 
@@ -183,14 +183,14 @@ module Rules
183
183
 
184
184
  else
185
185
 
186
- $log.info "\tSkipping Default Rule: #{rule["name"]}"
186
+ $log.debug "\tSkipping Default Rule: #{rule["name"]}"
187
187
 
188
188
  end # if (!@@default_transforms.include? transform["id"]...
189
189
 
190
190
  end # rules["items"].each do |rule|
191
191
 
192
192
  else
193
- $log.error "\tError: Unable to fetch rules."
193
+ $log.error "\tError: Unable to retrieve rules."
194
194
  end # case response
195
195
 
196
196
  Markdown.write
@@ -78,7 +78,7 @@ module Sources
78
78
  # Determine the total count based what the API tells us.
79
79
  if ( count < 0 && !response['X-Total-Count'].nil? )
80
80
  count = response['X-Total-Count'].to_i
81
- $log.info "\tDetected #{count} sources."
81
+ $log.info "\tRetrieved #{count} sources."
82
82
  end
83
83
 
84
84
  # If we don't have any sources, lets give up. There is nothing to do.
@@ -100,7 +100,8 @@ module Sources
100
100
  offset += limit
101
101
 
102
102
  else
103
- $log.error "\tError: Unable to fetch sources."
103
+ $log.error "\tError: Unable to retrieve sources."
104
+ break
104
105
  end # case response
105
106
 
106
107
  end # loop do
@@ -116,7 +117,7 @@ module Sources
116
117
  # Read from the file system to determine how many source configurations we have.
117
118
  #
118
119
  sources = Program.read_directory("#{directory}/sources")
119
- $log.info "\tDetected #{sources.length} sources."
120
+ $log.info "\tRetrieved #{sources.length} sources."
120
121
 
121
122
  #
122
123
  # Iterate through each source.
@@ -151,7 +152,7 @@ module Sources
151
152
 
152
153
  IDNAPI.post_json( "#{$url}/beta/sources/", $token, template_source )
153
154
 
154
- $log.info "\t\t\tCreated source."
155
+ $log.debug "\t\t\tCreated source."
155
156
 
156
157
  #
157
158
  # If we don't have an existing source, lets update the one we have.
@@ -175,7 +176,7 @@ module Sources
175
176
 
176
177
  IDNAPI.put_json( "#{$url}/beta/sources/#{existing_source["id"]}", $token, template_source )
177
178
 
178
- $log.info "\t\t\tUpdated source."
179
+ $log.debug "\t\t\tUpdated source."
179
180
 
180
181
  end # if existing_source.nil?
181
182
 
@@ -188,30 +189,60 @@ module Sources
188
189
  #
189
190
  def self.doc
190
191
 
191
- Markdown.h2( "Sources" )
192
+ limit = 100
193
+ offset = 0
194
+ count = -1
195
+
196
+ loop do
197
+
198
+ response = IDNAPI.get( "#{$url}/beta/sources?limit=#{limit}&offset=#{offset}&count=true", $token )
199
+
200
+ case response
201
+ when Net::HTTPSuccess
202
+
203
+ # Determine the total count based what the API tells us.
204
+ if ( count < 0 && !response['X-Total-Count'].nil? )
205
+ count = response['X-Total-Count'].to_i
206
+ $log.info "\tRetrieved #{count} sources."
207
+ end
208
+
209
+ # If we don't have any sources, lets give up. There is nothing to do.
210
+ break if count == 0
192
211
 
193
- response = IDNAPI.get( "#{$url}/cc/api/source/list", $token )
194
- unless response.nil?
195
- sources = JSON.parse( response.body )
212
+ # If we're here, we have sources to process.
213
+ sources = JSON.parse( response.body )
196
214
 
197
- $log.info "\tDetected #{sources.count} sources."
215
+ # Give up if our sources are null or empty. This is also a failsafe if count doesn't come back for some reason.
216
+ break if sources.nil? || sources.empty?
198
217
 
199
- Markdown.text( "| Name | Connector | Owner | Description | Features |\n")
200
- Markdown.text( "|------|-----------|-------|-------------|----------|\n")
218
+ Markdown.h2 "Sources"
219
+ Markdown.text "| Name | Connector | Owner | Description | Authoritative | Features |\n"
220
+ Markdown.text "|------|-----------|-------|-------------|---------------|----------|\n"
201
221
 
202
- sources.each do |source|
222
+ # Iterate through the sources list
223
+ sources.each do |source|
203
224
 
204
- $log.info "\tSource: #{source["name"]}"
225
+ $log.info "\tSource: #{source["name"]}"
205
226
 
206
- features = []
207
- if source["useForAccounts"] then features.push( "Account Aggregation" ) end
208
- if source["useForAuthentication"] then features.push( "Authentication" ) end
209
- if source["useForProvisioning"] then features.push( "Provisioning" ) end
210
- if source["useForPasswordManagement"] then features.push( "Password Management" ) end
211
- Markdown.text( "|#{source["name"]}|#{source["sourceConnectorName"]}|#{source.dig("owner", "name")}|#{source["description"]}| #{features.join(", ")} |\n")
227
+ features = [ "Account Aggregation" ]
228
+ if source["features"].include? "ENABLE" then features.push( "Account Enable / Disable" ) end
229
+ if source["features"].include? "UNLOCK" then features.push( "Account Unlock" ) end
230
+ if source["features"].include? "PROVISIONING" then features.push( "Account Provisioning" ) end
231
+ if source["features"].include? "PASSWORD" then features.push( "Password Management" ) end
232
+ if source["features"].include? "AUTHENTICATE" then features.push( "Pass-through Authentication" ) end
233
+ Markdown.text( "|#{source["name"]} | #{source["type"]} | #{source.dig("owner", "name")} | #{source["description"]} | #{Program.humanize( source['authoritative'] )} | #{features.join(", ")} |\n")
234
+
235
+ end
236
+
237
+ # Setup our offset for the next iteration
238
+ offset += limit
239
+
240
+ else
241
+ $log.error "\tError: Unable to retrieve sources."
242
+ end # case response
243
+
244
+ end # loop do
212
245
 
213
- end
214
- end
215
246
  Markdown.write
216
247
  end
217
248
  end
@@ -43,7 +43,7 @@ module Transforms
43
43
 
44
44
  transforms = JSON.parse( response.body )
45
45
 
46
- $log.info "\tDetected #{transforms["count"]} transforms."
46
+ $log.info "\tRetrieved transforms."
47
47
 
48
48
  transforms["items"].each do |transform|
49
49
 
@@ -54,14 +54,14 @@ module Transforms
54
54
 
55
55
  else
56
56
 
57
- $log.info "\tSkipping Default Transform: #{transform["id"]}"
57
+ $log.debug "\tSkipping Default Transform: #{transform["id"]}"
58
58
 
59
59
  end # if (!@@default_transforms.include? transform["id"]...
60
60
 
61
61
  end # transforms["items"].each do |transform|
62
62
 
63
63
  else
64
- $log.error "\tError: Unable to fetch transforms."
64
+ $log.error "\tError: Unable to retrieve transforms."
65
65
  end # case response
66
66
 
67
67
  end
@@ -73,7 +73,7 @@ module Transforms
73
73
 
74
74
  # Read from the file system to determine how many transforms we have.
75
75
  transforms = Program.read_directory( "#{directory}/transforms" )
76
- $log.info "\tDetected #{transforms.length} transforms."
76
+ $log.info "\tRetrieved #{transforms.length} transforms."
77
77
 
78
78
  # Iterate through each transform.
79
79
  transforms.each do |transform|
@@ -96,7 +96,7 @@ module Transforms
96
96
  IDNAPI.post_json( "#{$url}/cc/api/transform/create", $token, template_transform )
97
97
 
98
98
  else
99
- $log.info "\t\tSkipping default transform."
99
+ $log.debug "\t\tSkipping default transform."
100
100
  end
101
101
 
102
102
  # If we don't have an existing transform, lets update the one we have.
@@ -110,7 +110,7 @@ module Transforms
110
110
  IDNAPI.post_json( "#{$url}/cc/api/transform/update", $token, template_transform )
111
111
 
112
112
  else
113
- $log.info "\t\tSkipping default transform."
113
+ $log.debug "\t\tSkipping default transform."
114
114
  end
115
115
  end
116
116
  end
@@ -128,7 +128,7 @@ module Transforms
128
128
 
129
129
  transforms = JSON.parse( response.body )
130
130
 
131
- $log.info "\tDetected #{transforms["count"]} transforms."
131
+ $log.info "\tRetrieved transforms."
132
132
 
133
133
  Markdown.h2( "Transforms" )
134
134
 
@@ -142,14 +142,14 @@ module Transforms
142
142
 
143
143
  else
144
144
 
145
- $log.info "\tSkipping Default Transform: #{transform["id"]}"
145
+ $log.debug "\tSkipping Default Transform: #{transform["id"]}"
146
146
 
147
147
  end # if (!@@default_transforms.include? transform["id"]...
148
148
 
149
149
  end # transforms["items"].each do |transform|
150
150
 
151
151
  else
152
- $log.error "\tError: Unable to fetch transforms."
152
+ $log.error "\tError: Unable to retrieve transforms."
153
153
  end # case response
154
154
 
155
155
  Markdown.write
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idnio
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3b
4
+ version: 2.3.4b
5
5
  platform: ruby
6
6
  authors:
7
7
  - neil-mcglennon-sp
@@ -61,7 +61,7 @@ dependencies:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
63
  version: '10.0'
64
- description: Container of all IdentityNow I/O logic
64
+ description: Handles input and output of IdentityNow configurations.
65
65
  email:
66
66
  - neil.mcglennon@sailpoint.com
67
67
  executables: []
@@ -120,5 +120,5 @@ rubyforge_project:
120
120
  rubygems_version: 2.7.6
121
121
  signing_key:
122
122
  specification_version: 4
123
- summary: IdentityNow I/O Gem
123
+ summary: IdentityNow I/O
124
124
  test_files: []