strongdm 1.0.0 → 1.0.1

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.
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()