strongdm 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/doc/LICENSE.html +45 -136
  3. data/doc/Object.html +300 -105
  4. data/doc/README_md.html +15 -7
  5. data/doc/SDM.html +16 -24
  6. data/doc/SDM/AKS.html +113 -51
  7. data/doc/SDM/AKSBasicAuth.html +93 -35
  8. data/doc/SDM/AKSServiceAccount.html +88 -31
  9. data/doc/SDM/AccountAttachment.html +77 -27
  10. data/doc/SDM/AccountAttachmentCreateOptions.html +62 -13
  11. data/doc/SDM/AccountAttachmentCreateResponse.html +75 -24
  12. data/doc/SDM/AccountAttachmentDeleteResponse.html +69 -19
  13. data/doc/SDM/AccountAttachmentGetResponse.html +75 -23
  14. data/doc/SDM/AccountAttachments.html +42 -39
  15. data/doc/SDM/AccountCreateResponse.html +80 -27
  16. data/doc/SDM/AccountDeleteResponse.html +69 -17
  17. data/doc/SDM/AccountGetResponse.html +74 -21
  18. data/doc/SDM/AccountGrant.html +89 -39
  19. data/doc/SDM/AccountGrantCreateResponse.html +75 -23
  20. data/doc/SDM/AccountGrantDeleteResponse.html +69 -18
  21. data/doc/SDM/AccountGrantGetResponse.html +75 -22
  22. data/doc/SDM/AccountGrants.html +41 -36
  23. data/doc/SDM/AccountUpdateResponse.html +74 -21
  24. data/doc/SDM/Accounts.html +45 -39
  25. data/doc/SDM/AlreadyExistsError.html +13 -10
  26. data/doc/SDM/AmazonEKS.html +108 -47
  27. data/doc/SDM/AmazonES.html +98 -39
  28. data/doc/SDM/Athena.html +98 -39
  29. data/doc/SDM/AuroraMysql.html +103 -43
  30. data/doc/SDM/AuroraPostgres.html +108 -47
  31. data/doc/SDM/AuthenticationError.html +13 -10
  32. data/doc/SDM/BadRequestError.html +13 -10
  33. data/doc/SDM/BigQuery.html +98 -39
  34. data/doc/SDM/Cassandra.html +103 -43
  35. data/doc/SDM/Client.html +29 -48
  36. data/doc/SDM/Clustrix.html +103 -43
  37. data/doc/SDM/Cockroach.html +108 -47
  38. data/doc/SDM/CreateResponseMetadata.html +59 -9
  39. data/doc/SDM/DeadlineExceededError.html +13 -10
  40. data/doc/SDM/DeleteResponseMetadata.html +60 -10
  41. data/doc/SDM/Druid.html +98 -39
  42. data/doc/SDM/DynamoDB.html +98 -39
  43. data/doc/SDM/Elastic.html +103 -43
  44. data/doc/SDM/ElasticacheRedis.html +98 -39
  45. data/doc/SDM/Gateway.html +89 -38
  46. data/doc/SDM/GetResponseMetadata.html +60 -10
  47. data/doc/SDM/GoogleGKE.html +98 -39
  48. data/doc/SDM/Greenplum.html +108 -47
  49. data/doc/SDM/HTTPAuth.html +103 -43
  50. data/doc/SDM/HTTPBasicAuth.html +108 -47
  51. data/doc/SDM/HTTPNoAuth.html +98 -39
  52. data/doc/SDM/InternalError.html +13 -10
  53. data/doc/SDM/Kubernetes.html +113 -51
  54. data/doc/SDM/KubernetesBasicAuth.html +93 -35
  55. data/doc/SDM/KubernetesServiceAccount.html +88 -31
  56. data/doc/SDM/Maria.html +103 -43
  57. data/doc/SDM/Memcached.html +88 -31
  58. data/doc/SDM/Memsql.html +103 -43
  59. data/doc/SDM/MongoHost.html +108 -47
  60. data/doc/SDM/MongoLegacyHost.html +113 -51
  61. data/doc/SDM/MongoLegacyReplicaset.html +118 -55
  62. data/doc/SDM/MongoReplicaSet.html +118 -55
  63. data/doc/SDM/Mysql.html +103 -43
  64. data/doc/SDM/NodeCreateResponse.html +80 -27
  65. data/doc/SDM/NodeDeleteResponse.html +69 -17
  66. data/doc/SDM/NodeGetResponse.html +74 -21
  67. data/doc/SDM/NodeUpdateResponse.html +74 -21
  68. data/doc/SDM/Nodes.html +46 -41
  69. data/doc/SDM/NotFoundError.html +13 -10
  70. data/doc/SDM/Oracle.html +108 -47
  71. data/doc/SDM/PermissionError.html +13 -10
  72. data/doc/SDM/Plumbing.html +375 -371
  73. data/doc/SDM/Postgres.html +108 -47
  74. data/doc/SDM/Presto.html +108 -47
  75. data/doc/SDM/RDP.html +98 -39
  76. data/doc/SDM/RPCError.html +12 -8
  77. data/doc/SDM/RateLimitError.html +13 -10
  78. data/doc/SDM/RateLimitMetadata.html +81 -29
  79. data/doc/SDM/Redis.html +93 -35
  80. data/doc/SDM/Redshift.html +108 -47
  81. data/doc/SDM/Relay.html +77 -26
  82. data/doc/SDM/ResourceCreateResponse.html +74 -21
  83. data/doc/SDM/ResourceDeleteResponse.html +69 -17
  84. data/doc/SDM/ResourceGetResponse.html +74 -21
  85. data/doc/SDM/ResourceUpdateResponse.html +74 -22
  86. data/doc/SDM/Resources.html +43 -35
  87. data/doc/SDM/Role.html +77 -26
  88. data/doc/SDM/RoleAttachment.html +77 -26
  89. data/doc/SDM/RoleAttachmentCreateResponse.html +75 -24
  90. data/doc/SDM/RoleAttachmentDeleteResponse.html +69 -19
  91. data/doc/SDM/RoleAttachmentGetResponse.html +75 -22
  92. data/doc/SDM/RoleAttachments.html +41 -38
  93. data/doc/SDM/RoleCreateResponse.html +75 -23
  94. data/doc/SDM/RoleDeleteResponse.html +69 -17
  95. data/doc/SDM/RoleGetResponse.html +75 -22
  96. data/doc/SDM/RoleGrant.html +77 -24
  97. data/doc/SDM/RoleGrantCreateResponse.html +75 -23
  98. data/doc/SDM/RoleGrantDeleteResponse.html +69 -18
  99. data/doc/SDM/RoleGrantGetResponse.html +75 -22
  100. data/doc/SDM/RoleGrants.html +41 -38
  101. data/doc/SDM/RoleUpdateResponse.html +75 -23
  102. data/doc/SDM/Roles.html +48 -46
  103. data/doc/SDM/SQLServer.html +113 -51
  104. data/doc/SDM/SSH.html +98 -39
  105. data/doc/SDM/Service.html +76 -24
  106. data/doc/SDM/Snowflake.html +103 -43
  107. data/doc/SDM/Sybase.html +98 -39
  108. data/doc/SDM/SybaseIQ.html +98 -39
  109. data/doc/SDM/Teradata.html +98 -39
  110. data/doc/SDM/UpdateResponseMetadata.html +60 -10
  111. data/doc/SDM/User.html +85 -30
  112. data/doc/V1.html +10 -6
  113. data/doc/V1/AccountAttachments.html +10 -6
  114. data/doc/V1/AccountAttachments/Service.html +11 -8
  115. data/doc/V1/AccountGrants.html +10 -6
  116. data/doc/V1/AccountGrants/Service.html +11 -9
  117. data/doc/V1/Accounts.html +10 -6
  118. data/doc/V1/Accounts/Service.html +12 -10
  119. data/doc/V1/Nodes.html +10 -6
  120. data/doc/V1/Nodes/Service.html +13 -13
  121. data/doc/V1/Resources.html +10 -6
  122. data/doc/V1/Resources/Service.html +10 -6
  123. data/doc/V1/RoleAttachments.html +10 -6
  124. data/doc/V1/RoleAttachments/Service.html +11 -11
  125. data/doc/V1/RoleGrants.html +10 -6
  126. data/doc/V1/RoleGrants/Service.html +11 -11
  127. data/doc/V1/Roles.html +10 -6
  128. data/doc/V1/Roles/Service.html +11 -12
  129. data/doc/created.rid +41 -37
  130. data/doc/css/fonts.css +6 -6
  131. data/doc/css/rdoc.css +22 -1
  132. data/doc/examples/Gemfile.html +14 -4
  133. data/doc/examples/Gemfile_lock.html +14 -4
  134. data/doc/examples/README_md.html +14 -4
  135. data/doc/examples/okta-sync/Gemfile.html +105 -0
  136. data/doc/examples/okta-sync/Gemfile_lock.html +146 -0
  137. data/doc/index.html +15 -8
  138. data/doc/js/darkfish.js +23 -100
  139. data/doc/js/navigation.js +4 -41
  140. data/doc/js/navigation.js.gz +0 -0
  141. data/doc/js/search.js +32 -31
  142. data/doc/js/search_index.js +1 -1
  143. data/doc/js/search_index.js.gz +0 -0
  144. data/doc/js/searcher.js +7 -6
  145. data/doc/js/searcher.js.gz +0 -0
  146. data/doc/lib/version.html +16 -6
  147. data/doc/strongdm_gemspec.html +15 -5
  148. data/doc/table_of_contents.html +981 -260
  149. data/examples/Gemfile +2 -2
  150. data/examples/listUsers.rb +8 -8
  151. data/examples/okta-sync/Gemfile +4 -0
  152. data/examples/okta-sync/Gemfile.lock +38 -0
  153. data/examples/okta-sync/matchers.yml +11 -0
  154. data/examples/okta-sync/oktaSync.rb +173 -0
  155. data/examples/panicButton.rb +103 -119
  156. data/lib/errors/errors.rb +55 -53
  157. data/lib/grpc/account_attachments_pb.rb +9 -9
  158. data/lib/grpc/account_attachments_services_pb.rb +7 -8
  159. data/lib/grpc/account_grants_pb.rb +10 -10
  160. data/lib/grpc/account_grants_services_pb.rb +7 -8
  161. data/lib/grpc/accounts_pb.rb +9 -9
  162. data/lib/grpc/accounts_services_pb.rb +7 -8
  163. data/lib/grpc/drivers_pb.rb +7 -7
  164. data/lib/grpc/nodes_pb.rb +9 -9
  165. data/lib/grpc/nodes_services_pb.rb +7 -8
  166. data/lib/grpc/options_pb.rb +5 -5
  167. data/lib/grpc/plumbing.rb +4083 -4084
  168. data/lib/grpc/protoc-gen-swagger/options/annotations_pb.rb +4 -4
  169. data/lib/grpc/resources_pb.rb +9 -9
  170. data/lib/grpc/resources_services_pb.rb +7 -8
  171. data/lib/grpc/role_attachments_pb.rb +9 -9
  172. data/lib/grpc/role_attachments_services_pb.rb +7 -8
  173. data/lib/grpc/role_grants_pb.rb +9 -9
  174. data/lib/grpc/role_grants_services_pb.rb +7 -8
  175. data/lib/grpc/roles_pb.rb +9 -9
  176. data/lib/grpc/roles_services_pb.rb +7 -8
  177. data/lib/grpc/spec_pb.rb +8 -8
  178. data/lib/models/porcelain.rb +4409 -4017
  179. data/lib/strongdm.rb +94 -95
  180. data/lib/svc.rb +1202 -1224
  181. data/lib/version +1 -1
  182. data/lib/version.rb +6 -6
  183. data/strongdm.gemspec +10 -10
  184. metadata +9 -4
data/examples/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- gem 'strongdm'
3
+ gem "strongdm"
@@ -1,21 +1,21 @@
1
1
  # Copyright 2020 StrongDM Inc
2
- #
2
+ #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
5
5
  # You may obtain a copy of the License at
6
- #
6
+ #
7
7
  # http://www.apache.org/licenses/LICENSE-2.0
8
- #
8
+ #
9
9
  # Unless required by applicable law or agreed to in writing, software
10
10
  # distributed under the License is distributed on an "AS IS" BASIS,
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- #
14
+ #
15
15
  require "strongdm"
16
16
 
17
- client = SDM::Client.new(ENV['SDM_API_ACCESS_KEY'], ENV['SDM_API_SECRET_KEY'])
18
- users = client.accounts.list('')
17
+ client = SDM::Client.new(ENV["SDM_API_ACCESS_KEY"], ENV["SDM_API_SECRET_KEY"])
18
+ users = client.accounts.list("")
19
19
  users.each { |user|
20
- p user
21
- }
20
+ p user
21
+ }
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "strongdm"
4
+ gem "oktakit"
@@ -0,0 +1,38 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.7.0)
5
+ public_suffix (>= 2.0.2, < 5.0)
6
+ faraday (1.0.0)
7
+ multipart-post (>= 1.2, < 3)
8
+ google-protobuf (3.11.4)
9
+ googleapis-common-protos-types (1.0.4)
10
+ google-protobuf (~> 3.0)
11
+ grpc (1.27.0)
12
+ google-protobuf (~> 3.11)
13
+ googleapis-common-protos-types (~> 1.0)
14
+ grpc-tools (1.27.0)
15
+ ipaddr (1.2.2)
16
+ multipart-post (2.1.1)
17
+ oktakit (0.2.0)
18
+ sawyer (~> 0.8.1)
19
+ openssl (2.1.2)
20
+ ipaddr
21
+ public_suffix (4.0.3)
22
+ sawyer (0.8.2)
23
+ addressable (>= 2.3.5)
24
+ faraday (> 0.8, < 2.0)
25
+ strongdm (1.0.0)
26
+ grpc (~> 1.27.0, >= 1.27.0)
27
+ grpc-tools (~> 1.27.0, >= 1.27.0)
28
+ openssl (~> 2.1.2, >= 2.1.2)
29
+
30
+ PLATFORMS
31
+ ruby
32
+
33
+ DEPENDENCIES
34
+ oktakit
35
+ strongdm
36
+
37
+ BUNDLED WITH
38
+ 1.17.2
@@ -0,0 +1,11 @@
1
+ ---
2
+ groups:
3
+ -
4
+ name: db/mongo
5
+ resources:
6
+ - type:mongo name:don*
7
+ - type:ssh name:dev*
8
+ -
9
+ name: app/web
10
+ resources:
11
+ - type:ssh name:dev-web*
@@ -0,0 +1,173 @@
1
+ # Copyright 2020 StrongDM Inc
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ require "yaml"
16
+ require "strongdm"
17
+ require "oktakit"
18
+ require "optparse"
19
+
20
+ SDM_API_ACCESS_KEY = ENV.fetch("SDM_API_ACCESS_KEY", "")
21
+ SDM_API_SECRET_KEY = ENV.fetch("SDM_API_SECRET_KEY", "")
22
+ OKTA_CLIENT_TOKEN = ENV.fetch("OKTA_CLIENT_TOKEN", "")
23
+ OKTA_CLIENT_ORGURL = ENV.fetch("OKTA_CLIENT_ORGURL", "")
24
+
25
+ def okta_sync
26
+ if SDM_API_ACCESS_KEY == "" || SDM_API_SECRET_KEY == "" || OKTA_CLIENT_TOKEN == "" || OKTA_CLIENT_ORGURL == ""
27
+ puts "SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY, OKTA_CLIENT_TOKEN, and OKTA_CLIENT_ORGURL must be set"
28
+ exit
29
+ end
30
+
31
+ report = {
32
+ :start => Time.now,
33
+
34
+ :oktaUsersCount => 0,
35
+ :oktaUsers => [],
36
+
37
+ :sdmUsersCount => 0,
38
+ :sdmUsers => [],
39
+
40
+ :bothUsersCount => 0,
41
+
42
+ :sdmResourcesCount => 0,
43
+ :sdmResources => {},
44
+
45
+ :permissionsGranted => 0,
46
+ :permissionsRevoked => 0,
47
+ :grants => [],
48
+ :revocations => [],
49
+
50
+ :matchers => {},
51
+ }
52
+
53
+ plan = false
54
+ verbose = false
55
+ OptionParser.new do |opts|
56
+ opts.banner = "Usage oktaSync.rb [options]"
57
+ opts.on("-p", "--plan", "calculate changes but do not apply them") do |p|
58
+ plan = p
59
+ end
60
+ opts.on("-v", "--verbose", "print detailed report") do |v|
61
+ verbose = v
62
+ end
63
+ end.parse!
64
+
65
+ client = SDM::Client.new(SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY)
66
+ okta_client = Oktakit.new(token: OKTA_CLIENT_TOKEN, api_endpoint: OKTA_CLIENT_ORGURL + "/api/v1")
67
+ matchers = YAML.load(File.read("matchers.yml"))
68
+ report[:matchers] = matchers
69
+
70
+ all_users = okta_client.list_users({
71
+ 'query': {
72
+ 'search': "profile.department eq \"Engineering\" and (status eq \"ACTIVE\")",
73
+ },
74
+ })
75
+
76
+ okta_users = Array.new()
77
+ all_users[0].each { |u|
78
+ groups = okta_client.get_member_groups(u.id)
79
+ group_names = Array.new()
80
+ groups[0].each { |ug|
81
+ group_names.push(ug.profile.name)
82
+ }
83
+ okta_users.push({ :login => u.profile.login, :first_name => u.profile.firstName, :last_name => u.profile.LastName, :groups => group_names })
84
+ }
85
+ report[:oktaUsers] = okta_users
86
+ report[:oktaUsersCount] = okta_users.size
87
+
88
+ accounts = client.accounts.list("type:user").map { |a| [a.email, a] }.to_h
89
+ report[:sdmUsers] = accounts
90
+ report[:sdmUsersCount] = accounts.size
91
+ grants = client.account_grants.list("").map { |ag| ag }
92
+
93
+ current = {}
94
+ grants.each { |g|
95
+ current[g.account_id] = [] if not current[g.account_id]
96
+ current[g.account_id].push({ :resource_id => g.resource_id, :id => g.id })
97
+ }
98
+
99
+ desired = {}
100
+ overlapping = 0
101
+ matchers["groups"].each { |group|
102
+ group["resources"].each { |resourceQuery|
103
+ client.resources.list(resourceQuery).each { |res|
104
+ report[:sdmResources][res.id] = res
105
+ okta_users.each { |u|
106
+ if u[:groups].include? group["name"]
107
+ account = accounts[u[:login]]
108
+ if account != nil
109
+ overlapping += 1
110
+ desired[account.id] = [] if not desired[account.id]
111
+ desired[account.id].push(res.id)
112
+ end
113
+ end
114
+ }
115
+ }
116
+ }
117
+ }
118
+ report[:bothUsersCount] = overlapping
119
+ report[:sdmResourcesCount] = report[:sdmResources].size
120
+
121
+ revocations = 0
122
+ current.each { |aid, curRes|
123
+ desRes = desired[aid]
124
+ desRes = [] if not desired[aid]
125
+ curRes.each { |r|
126
+ if not(desRes.include? r[:resource_id])
127
+ if plan
128
+ puts "Plan: revoke %s from user %s\n" % [r[:resource_id], aid]
129
+ else
130
+ client.account_grants.delete(r[:id])
131
+ end
132
+ report[:revocations].push(r[:id])
133
+ revocations += 1
134
+ end
135
+ }
136
+ }
137
+ report[:permissionsRevoked] = revocations
138
+
139
+ grants = 0
140
+ desired.each { |aid, desRes|
141
+ curRes = current[aid]
142
+ curRes = [] if not current[aid]
143
+ desRes.each { |r|
144
+ if not(curRes.map { |c| c[:resource_id] }.include? r)
145
+ ag = SDM::AccountGrant.new()
146
+ ag.account_id = aid
147
+ ag.resource_id = r
148
+ if plan
149
+ puts "Plan: grant %s to user %s\n" % [r, aid]
150
+ else
151
+ client.account_grants.create(ag)
152
+ end
153
+ report[:grants].push(ag)
154
+ grants += 1
155
+ end
156
+ }
157
+ }
158
+ report[:permissionsGranted] = grants
159
+
160
+ report[:complete] = Time.now
161
+
162
+ if verbose
163
+ puts report.to_json
164
+ else
165
+ puts "%d Okta users, %d strongDM users, %d overlapping users, %d grants, %d revocations" % [okta_users.size, accounts.size, overlapping, grants, revocations]
166
+ end
167
+ end
168
+
169
+ begin
170
+ okta_sync
171
+ rescue StandardError => ex
172
+ puts "cannot synchronize with okta: " + ex.to_s
173
+ end
@@ -1,18 +1,4 @@
1
1
  # Copyright 2020 StrongDM Inc
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- #
15
- # Copyright 2020 StrongDM Inc
16
2
  #
17
3
  # Licensed under the Apache License, Version 2.0 (the "License");
18
4
  # you may not use this file except in compliance with the License.
@@ -26,7 +12,6 @@
26
12
  # See the License for the specific language governing permissions and
27
13
  # limitations under the License.
28
14
  #
29
-
30
15
  require "strongdm"
31
16
  require "OpenSSL"
32
17
  require "JSON"
@@ -38,117 +23,116 @@ require "JSON"
38
23
  # to revert back to pre-panic state:
39
24
  # ruby panicButton.rb revert
40
25
  def main
41
- access_key = ENV["SDM_API_ACCESS_KEY"]
42
- secret_key = ENV["SDM_API_SECRET_KEY"]
43
- if access_key == nil or secret_key == nil
44
- puts "SDM_API_ACCESS_KEY and SDM_API_SECRET_KEY must be provided"
45
- return
46
- end
47
- client = SDM::Client.new(access_key, secret_key)
48
-
49
- if ARGV.size == 1 and ARGV[0] == "revert"
50
- state_file = File.open("state.json")
51
- state = JSON.load(state_file)
52
-
53
- reinstated_count = 0
26
+ access_key = ENV["SDM_API_ACCESS_KEY"]
27
+ secret_key = ENV["SDM_API_SECRET_KEY"]
28
+ if access_key == nil or secret_key == nil
29
+ puts "SDM_API_ACCESS_KEY and SDM_API_SECRET_KEY must be provided"
30
+ return
31
+ end
32
+ client = SDM::Client.new(access_key, secret_key)
33
+
34
+ if ARGV.size == 1 and ARGV[0] == "revert"
35
+ state_file = File.open("state.json")
36
+ state = JSON.load(state_file)
37
+
38
+ reinstated_count = 0
39
+
40
+ users = client.accounts.list("")
41
+ users.each { |user|
42
+ if user.suspended
43
+ reinstated_count += 1
44
+ user.suspended = false
45
+ client.accounts.update(user)
46
+ end
47
+ }
48
+ state["attachments"].each { |attachment|
49
+ begin
50
+ a = SDM::AccountAttachment.new()
51
+ a.account_id = attachment["account_id"]
52
+ a.role_id = attachment["role_id"]
53
+ client.account_attachments.create(a)
54
+ rescue SDM::AlreadyExistsError
55
+ rescue => ex
56
+ puts "skipping creation of attachment due to error: " + ex.to_s
57
+ end
58
+ }
59
+ state["grants"].each { |attachment|
60
+ begin
61
+ g = SDM::AccountGrant.new()
62
+ g.account_id = attachment["account_id"]
63
+ g.resource_id = attachment["resource_id"]
64
+ client.account_grants.create(g)
65
+ rescue SDM::AlreadyExistsError
66
+ rescue => ex
67
+ puts "skipping creation of grant due to error: " + ex.to_s
68
+ end
69
+ }
54
70
 
55
- users = client.accounts.list('')
56
- users.each{ |user|
57
- if user.suspended
58
- reinstated_count += 1
59
- user.suspended = false
60
- client.accounts.update(user)
61
- end
71
+ puts "reinstated " + reinstated_count.to_s + " users"
72
+ puts "recreated " + state["attachments"].size.to_s + " account attachments"
73
+ puts "recreated " + state["grants"].size.to_s + " account grants"
74
+
75
+ return
76
+ end
77
+
78
+ admin_email = ""
79
+ if ARGV.size == 1
80
+ admin_email = ARGV[0]
81
+ else
82
+ puts "please provide an admin email to preserve"
83
+ return 1
84
+ end
85
+
86
+ admin_user_id = ""
87
+ users = client.accounts.list("email:?", admin_email)
88
+ users.each { |user|
89
+ admin_user_id = user.id
90
+ }
91
+
92
+ account_attachments = client.account_attachments.list("")
93
+ account_grants = client.account_grants.list("")
94
+
95
+ state = {
96
+ 'attachments': account_attachments.map { |x|
97
+ if x.account_id != admin_user_id
98
+ out = {
99
+ 'account_id': x.account_id,
100
+ 'role_id': x.role_id,
62
101
  }
63
- state["attachments"].each { |attachment|
64
- begin
65
- a = SDM::AccountAttachment.new()
66
- a.account_id = attachment["account_id"]
67
- a.role_id = attachment["role_id"]
68
- client.account_attachments.create(a)
69
- rescue SDM::AlreadyExistsError
70
- rescue => ex
71
- puts "skipping creation of attachment due to error: " + ex.to_s
72
- end
73
- }
74
- state["grants"].each { |attachment|
75
- begin
76
- g = SDM::AccountGrant.new()
77
- g.account_id = attachment["account_id"]
78
- g.resource_id = attachment["resource_id"]
79
- client.account_grants.create(g)
80
- rescue SDM::AlreadyExistsError
81
- rescue => ex
82
- puts "skipping creation of grant due to error: " + ex.to_s
83
- end
102
+ end
103
+ }.reject { |x| x == nil },
104
+ 'grants': account_grants.map { |x|
105
+ if x.account_id != admin_user_id and x.valid_until == nil
106
+ out = {
107
+ 'account_id': x.account_id,
108
+ 'resource_id': x.resource_id,
84
109
  }
110
+ end
111
+ }.reject { |x| x == nil },
112
+ }
85
113
 
86
- puts "reinstated " + reinstated_count.to_s + " users"
87
- puts "recreated " + state["attachments"].size.to_s + " account attachments"
88
- puts "recreated " + state["grants"].size.to_s + " account grants"
114
+ puts "storing " + state[:attachments].size.to_s + " account attachments in state"
115
+ puts "storing " + state[:grants].size.to_s + " account grants in state"
89
116
 
90
- return
91
- end
117
+ state_file = File.open("state.json", "w")
118
+ state_file.write(state.to_json)
92
119
 
93
- admin_email = ""
94
- if ARGV.size == 1
95
- admin_email = ARGV[0]
96
- else
97
- puts "please provide an admin email to preserve"
98
- return 1
120
+ suspended_count = 0
121
+ users = client.accounts.list("")
122
+ users.each { |user|
123
+ if user.instance_of? SDM::User and user.email == admin_email
124
+ next
99
125
  end
126
+ user.suspended = true
127
+ begin
128
+ client.accounts.update(user)
129
+ suspended_count += 1
130
+ rescue StandardError => ex
131
+ puts "skipping user " + user.id + " on account of error: " + ex.to_s
132
+ end
133
+ }
100
134
 
101
- admin_user_id = ""
102
- users = client.accounts.list("email:?", admin_email)
103
- users.each{ |user|
104
- admin_user_id = user.id
105
- }
106
-
107
- account_attachments = client.account_attachments.list('')
108
- account_grants = client.account_grants.list('')
109
-
110
- state = {
111
- 'attachments': account_attachments.map{|x|
112
- if x.account_id != admin_user_id
113
- out = {
114
- 'account_id': x.account_id,
115
- 'role_id': x.role_id,
116
- }
117
- end
118
- }.reject{|x| x == nil},
119
- 'grants': account_grants.map{|x|
120
- if x.account_id != admin_user_id and x.valid_until == nil
121
- out = {
122
- 'account_id': x.account_id,
123
- 'resource_id': x.resource_id,
124
- }
125
- end
126
- }.reject{|x| x == nil},
127
- }
128
-
129
- puts "storing " + state[:attachments].size.to_s + " account attachments in state"
130
- puts "storing " + state[:grants].size.to_s + " account grants in state"
131
-
132
- state_file = File.open("state.json", "w")
133
- state_file.write(state.to_json)
134
-
135
- suspended_count = 0
136
- users = client.accounts.list('')
137
- users.each{ |user|
138
- if user.instance_of? SDM::User and user.email == admin_email
139
- next
140
- end
141
- user.suspended = true
142
- begin
143
- client.accounts.update(user)
144
- suspended_count += 1
145
- rescue StandardError => ex
146
- puts "skipping user " + user.id + " on account of error: " + ex.to_s
147
- end
148
- }
149
-
150
- puts "suspended " + suspended_count.to_s + " users"
151
-
135
+ puts "suspended " + suspended_count.to_s + " users"
152
136
  end
153
137
 
154
- main()
138
+ main()