masks 0.3.2 → 0.5.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.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE +21 -0
  4. data/README.md +215 -29
  5. data/app/controllers/masks/rails/base_controller.rb +13 -0
  6. data/app/controllers/masks/rails/handshakes_controller.rb +87 -0
  7. data/app/controllers/masks/rails/sessions_controller.rb +113 -0
  8. data/app/views/layouts/masks/rails/plain.html.erb +47 -0
  9. data/app/views/masks/rails/handshakes/refused.html.erb +12 -0
  10. data/app/views/masks/rails/handshakes/show.html.erb +40 -0
  11. data/config/routes.rb +10 -45
  12. data/lib/generators/masks/install/install_generator.rb +35 -22
  13. data/lib/generators/masks/install/templates/masks.rb.tt +38 -0
  14. data/lib/masks/client/claims.rb +103 -0
  15. data/lib/masks/client/errors.rb +52 -0
  16. data/lib/masks/client/handshake.rb +104 -0
  17. data/lib/masks/client/http.rb +81 -0
  18. data/lib/masks/client/introspection.rb +29 -0
  19. data/lib/masks/client/issuer.rb +76 -0
  20. data/lib/masks/client/pkce.rb +27 -0
  21. data/lib/masks/client/rack.rb +62 -0
  22. data/lib/masks/client/registration.rb +91 -0
  23. data/lib/masks/client/registry.rb +25 -0
  24. data/lib/masks/client/resource.rb +92 -0
  25. data/lib/masks/client/session.rb +146 -0
  26. data/lib/masks/client/stores.rb +40 -0
  27. data/lib/masks/client/tokens.rb +70 -0
  28. data/lib/masks/client/tracker.rb +122 -0
  29. data/lib/masks/client/verifier.rb +42 -0
  30. data/lib/masks/client.rb +51 -0
  31. data/lib/masks/rails/authentication.rb +217 -0
  32. data/lib/masks/rails/configurable.rb +11 -0
  33. data/lib/masks/rails/configuration.rb +172 -0
  34. data/lib/masks/rails/credentials.rb +60 -0
  35. data/lib/masks/rails/engine.rb +20 -0
  36. data/lib/masks/rails/protected_resource.rb +51 -0
  37. data/lib/masks/rails.rb +10 -0
  38. data/lib/masks/version.rb +1 -3
  39. data/lib/masks.rb +3 -182
  40. metadata +47 -368
  41. data/MIT-LICENSE +0 -20
  42. data/Rakefile +0 -11
  43. data/app/assets/builds/application.css +0 -4764
  44. data/app/assets/builds/application.js +0 -8236
  45. data/app/assets/builds/application.js.map +0 -7
  46. data/app/assets/builds/masks/application.css +0 -1
  47. data/app/assets/builds/masks/application.js +0 -8462
  48. data/app/assets/builds/masks/application.js.map +0 -7
  49. data/app/assets/images/masks.png +0 -0
  50. data/app/assets/javascripts/application.js +0 -2
  51. data/app/assets/javascripts/controllers/application.js +0 -9
  52. data/app/assets/javascripts/controllers/emails_controller.js +0 -28
  53. data/app/assets/javascripts/controllers/index.js +0 -12
  54. data/app/assets/javascripts/controllers/keys_controller.js +0 -20
  55. data/app/assets/javascripts/controllers/recover_controller.js +0 -21
  56. data/app/assets/javascripts/controllers/recover_password_controller.js +0 -21
  57. data/app/assets/javascripts/controllers/session_controller.js +0 -94
  58. data/app/assets/manifest.js +0 -2
  59. data/app/assets/masks_manifest.js +0 -2
  60. data/app/assets/stylesheets/application.css +0 -26
  61. data/app/controllers/concerns/masks/controller.rb +0 -114
  62. data/app/controllers/masks/actors_controller.rb +0 -15
  63. data/app/controllers/masks/application_controller.rb +0 -35
  64. data/app/controllers/masks/backup_codes_controller.rb +0 -34
  65. data/app/controllers/masks/debug_controller.rb +0 -9
  66. data/app/controllers/masks/devices_controller.rb +0 -20
  67. data/app/controllers/masks/emails_controller.rb +0 -60
  68. data/app/controllers/masks/error_controller.rb +0 -14
  69. data/app/controllers/masks/keys_controller.rb +0 -45
  70. data/app/controllers/masks/manage/actor_controller.rb +0 -35
  71. data/app/controllers/masks/manage/actors_controller.rb +0 -12
  72. data/app/controllers/masks/manage/base_controller.rb +0 -12
  73. data/app/controllers/masks/one_time_code_controller.rb +0 -49
  74. data/app/controllers/masks/passwords_controller.rb +0 -33
  75. data/app/controllers/masks/recoveries_controller.rb +0 -43
  76. data/app/controllers/masks/sessions_controller.rb +0 -53
  77. data/app/helpers/masks/application_helper.rb +0 -49
  78. data/app/jobs/masks/application_job.rb +0 -7
  79. data/app/jobs/masks/expire_actors_job.rb +0 -15
  80. data/app/jobs/masks/expire_recoveries_job.rb +0 -15
  81. data/app/mailers/masks/actor_mailer.rb +0 -22
  82. data/app/mailers/masks/application_mailer.rb +0 -15
  83. data/app/models/concerns/masks/access.rb +0 -162
  84. data/app/models/concerns/masks/actor.rb +0 -132
  85. data/app/models/concerns/masks/adapter.rb +0 -68
  86. data/app/models/concerns/masks/role.rb +0 -9
  87. data/app/models/concerns/masks/scoped.rb +0 -54
  88. data/app/models/masks/access/actor_password.rb +0 -20
  89. data/app/models/masks/access/actor_scopes.rb +0 -18
  90. data/app/models/masks/access/actor_signup.rb +0 -22
  91. data/app/models/masks/actors/anonymous.rb +0 -40
  92. data/app/models/masks/actors/system.rb +0 -24
  93. data/app/models/masks/adapters/active_record.rb +0 -85
  94. data/app/models/masks/application_model.rb +0 -15
  95. data/app/models/masks/application_record.rb +0 -8
  96. data/app/models/masks/check.rb +0 -192
  97. data/app/models/masks/credential.rb +0 -166
  98. data/app/models/masks/credentials/backup_code.rb +0 -30
  99. data/app/models/masks/credentials/device.rb +0 -59
  100. data/app/models/masks/credentials/email.rb +0 -48
  101. data/app/models/masks/credentials/factor2.rb +0 -71
  102. data/app/models/masks/credentials/key.rb +0 -38
  103. data/app/models/masks/credentials/last_login.rb +0 -12
  104. data/app/models/masks/credentials/masquerade.rb +0 -32
  105. data/app/models/masks/credentials/nickname.rb +0 -63
  106. data/app/models/masks/credentials/one_time_code.rb +0 -34
  107. data/app/models/masks/credentials/password.rb +0 -28
  108. data/app/models/masks/credentials/recovery.rb +0 -71
  109. data/app/models/masks/credentials/session.rb +0 -67
  110. data/app/models/masks/device.rb +0 -30
  111. data/app/models/masks/error.rb +0 -51
  112. data/app/models/masks/event.rb +0 -14
  113. data/app/models/masks/mask.rb +0 -255
  114. data/app/models/masks/rails/actor.rb +0 -190
  115. data/app/models/masks/rails/actor_role.rb +0 -12
  116. data/app/models/masks/rails/device.rb +0 -47
  117. data/app/models/masks/rails/email.rb +0 -96
  118. data/app/models/masks/rails/key.rb +0 -61
  119. data/app/models/masks/rails/recovery.rb +0 -116
  120. data/app/models/masks/rails/role.rb +0 -20
  121. data/app/models/masks/rails/scope.rb +0 -15
  122. data/app/models/masks/session.rb +0 -447
  123. data/app/models/masks/sessions/access.rb +0 -26
  124. data/app/models/masks/sessions/inline.rb +0 -16
  125. data/app/models/masks/sessions/request.rb +0 -42
  126. data/app/resources/masks/actor_resource.rb +0 -9
  127. data/app/resources/masks/session_resource.rb +0 -15
  128. data/app/views/layouts/masks/application.html.erb +0 -17
  129. data/app/views/layouts/masks/mailer.html.erb +0 -17
  130. data/app/views/layouts/masks/mailer.text.erb +0 -1
  131. data/app/views/layouts/masks/manage.html.erb +0 -25
  132. data/app/views/masks/actor_mailer/recover_credentials.html.erb +0 -33
  133. data/app/views/masks/actor_mailer/recover_credentials.text.erb +0 -1
  134. data/app/views/masks/actor_mailer/verify_email.html.erb +0 -34
  135. data/app/views/masks/actor_mailer/verify_email.text.erb +0 -8
  136. data/app/views/masks/actors/current.html.erb +0 -152
  137. data/app/views/masks/application/_header.html.erb +0 -31
  138. data/app/views/masks/backup_codes/new.html.erb +0 -103
  139. data/app/views/masks/emails/new.html.erb +0 -103
  140. data/app/views/masks/emails/verify.html.erb +0 -51
  141. data/app/views/masks/keys/new.html.erb +0 -127
  142. data/app/views/masks/manage/actor/show.html.erb +0 -126
  143. data/app/views/masks/manage/actors/index.html.erb +0 -40
  144. data/app/views/masks/one_time_code/new.html.erb +0 -150
  145. data/app/views/masks/passwords/edit.html.erb +0 -58
  146. data/app/views/masks/recoveries/new.html.erb +0 -71
  147. data/app/views/masks/recoveries/password.html.erb +0 -64
  148. data/app/views/masks/sessions/new.html.erb +0 -153
  149. data/config/brakeman.ignore +0 -28
  150. data/config/locales/en.yml +0 -286
  151. data/db/migrate/20231205173845_create_actors.rb +0 -94
  152. data/lib/generators/masks/install/USAGE +0 -8
  153. data/lib/generators/masks/install/templates/initializer.rb +0 -5
  154. data/lib/generators/masks/install/templates/masks.json +0 -6
  155. data/lib/masks/configuration.rb +0 -236
  156. data/lib/masks/engine.rb +0 -25
  157. data/lib/masks/middleware.rb +0 -70
  158. data/lib/tasks/masks_tasks.rake +0 -72
  159. data/masks.json +0 -277
@@ -1,236 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "set"
4
- require "recursive-open-struct"
5
-
6
- module Masks
7
- # Container for masks configuration data.
8
- class Configuration
9
- include ActiveModel::Model
10
- include ActiveModel::Validations
11
- include ActiveModel::Attributes
12
- include ActiveModel::Serializers::JSON
13
-
14
- attribute :data
15
- attribute :name
16
- attribute :adapter, default: "Masks::Adapters::ActiveRecord"
17
- attribute :theme
18
- attribute :site_name
19
- attribute :site_url
20
- attribute :site_links
21
- attribute :site_logo
22
- attribute :lifetimes
23
- attribute :masks
24
- attribute :models
25
- attribute :version
26
-
27
- # Returns all configuration data as +RecursiveOpenStruct+.
28
- #
29
- # @return RecursiveOpenStruct
30
- def dat
31
- RecursiveOpenStruct.new(data)
32
- end
33
-
34
- # Returns a string to use as the "issuer" for various secrets—TOTP, JWT, etc.
35
- # @return [String]
36
- def issuer
37
- data.fetch(:name, "masks").parameterize
38
- end
39
-
40
- # Returns a site theme to use on the frontend.
41
- # @return [String]
42
- def theme
43
- super || data.fetch(:theme, "dark")
44
- end
45
-
46
- # Returns the site logo, used for visual identification of the site.
47
- # @return [String]
48
- def site_logo
49
- super || data.fetch(:logo, nil)
50
- end
51
-
52
- # Returns the site name, used for referring to the site (e.g. in the logo).
53
- # @return [String]
54
- def site_name
55
- super || data.fetch(:name, "masks")
56
- end
57
-
58
- # Returns the site title, used primarily in meta tags.
59
- # @return [String]
60
- def site_title
61
- super || data.fetch(:title, "")
62
- end
63
-
64
- # Returns the canonical url for the site.
65
- # @return [String]
66
- def site_url
67
- super || data.fetch(:url, nil)
68
- end
69
-
70
- # A hash of links—urls to various places on the frontend.
71
- #
72
- # These default to generated rails routes, but can be overridden
73
- # where necessary.
74
- #
75
- # @return [Hash]
76
- def site_links
77
- {
78
- root: rails_url.try(:root_path) || "/",
79
- recover: rails_url.recover_path,
80
- login: rails_url.session_path,
81
- after_login: rails_url.session_path,
82
- after_logout: rails_url.session_path
83
- }.merge(super || data.fetch(:links, {}))
84
- end
85
-
86
- # Returns the current global session key.
87
- # @return [String]
88
- def version
89
- super || "v1"
90
- end
91
-
92
- # A hash of expiration times for various resources.
93
- #
94
- # These values are used to override expiration times for things like
95
- # password reset emails and other time-based authentication methods.
96
- #
97
- # @return [Hash]
98
- def lifetimes
99
- (super || dat.lifetimes&.to_h || {}).transform_values do |seconds|
100
- seconds.to_i.seconds
101
- end
102
- end
103
-
104
- # A hash of default models the app relies on.
105
- #
106
- # The following keys are available:
107
- #
108
- # actor: +Masks::Rails::Actor+
109
- # role: +Masks::Rails::Role+
110
- # scope: +Masks::Rails::Scope+
111
- # email: +Masks::Rails::Email+
112
- # recovery: +Masks::Rails::Recovery+
113
- #
114
- # This makes it easy to provide a substitute for key models
115
- # while still relying on the base active record implementation.
116
- #
117
- # @return [Hash{Symbol => String}]
118
- def models
119
- {
120
- actor: "Masks::Rails::Actor",
121
- scope: "Masks::Rails::Scope",
122
- role: "Masks::Rails::Role",
123
- email: "Masks::Rails::Email",
124
- recovery: "Masks::Rails::Recovery",
125
- device: "Masks::Rails::Device",
126
- key: "Masks::Rails::Key",
127
- session_json: "Masks::SessionResource",
128
- request: "Masks::Sessions::Request",
129
- inline: "Masks::Sessions::Inline",
130
- access: "Masks::Sessions::Access"
131
- }.merge(super || data.fetch(:models, {}))
132
- end
133
-
134
- # Returns a model +Class+.
135
- #
136
- # @return [Class]
137
- def model(name)
138
- models[name]&.constantize
139
- end
140
-
141
- # Returns configuration data for a given mask type.
142
- #
143
- # @param [String] type
144
- # @return [Hash]
145
- def mask(type)
146
- config = data.dig(:types, type.to_sym)
147
- raise Masks::Error::InvalidConfiguration, type unless config
148
-
149
- config
150
- end
151
-
152
- # Returns all configured masks.
153
- #
154
- # @return [Array<Masks::Mask>]
155
- def masks
156
- @masks ||=
157
- begin
158
- masks = super || data.fetch(:masks, [])
159
- masks.map do |opts|
160
- case opts
161
- when Masks::Mask
162
- opts
163
- when Hash
164
- Masks::Mask.new(opts.merge(config: self))
165
- end
166
- end
167
- end
168
- end
169
-
170
- # Returns configuration data for the given access name.
171
- # @param [String] name
172
- # @return [Hash]
173
- def access(name)
174
- defaults = Masks::Access.defaults(name)
175
- raise Masks::Error::UnknownAccess, name unless defaults
176
-
177
- defaults.deep_merge(access_types&.fetch(name, {}))
178
- end
179
-
180
- # Returns configuration data for all access types.
181
- #
182
- # This does not include defaults created with +Masks::Access.access+.
183
- #
184
- # @return [Hash]
185
- def access_types
186
- data
187
- .fetch(:access, {})
188
- .to_h do |name, opts|
189
- [name, opts.merge(name:, cls: opts[:cls]&.constantize)]
190
- end
191
- end
192
-
193
- # Setter for whether or not sigups are allowed.
194
- #
195
- # @param [Boolean] value
196
- def signups=(value)
197
- data[:signups] = value
198
- end
199
-
200
- # Whether or not sigups are allowed.
201
- #
202
- # @return [Boolean]
203
- def signups?
204
- data[:signups]
205
- end
206
-
207
- delegate :find_key,
208
- :find_actor,
209
- :find_actors,
210
- :build_actor,
211
- :find_device,
212
- :find_recovery,
213
- :build_recovery,
214
- :expire_actors,
215
- :expire_recoveries,
216
- to: :adapt
217
-
218
- private
219
-
220
- def rails_url
221
- Masks::Engine.routes.url_helpers
222
- end
223
-
224
- def adapt
225
- @adapt =
226
- case adapter
227
- when String
228
- adapter.constantize.new(self)
229
- when Class
230
- adapter.new(self)
231
- else
232
- raise Masks::Error::InvalidConfiguration, adapter
233
- end
234
- end
235
- end
236
- end
data/lib/masks/engine.rb DELETED
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "middleware"
4
- module Masks
5
- # The Rails engine/railtie for Masks.
6
- #
7
- # Adds two initializers:
8
- #
9
- # - masks.assets.precompile - ensures masks assets are precompiled and added to the Rails asset pipeline
10
- # - masks.middleware - appends +Masks::Middleware+ to the middleware chain
11
- #
12
- class Engine < ::Rails::Engine
13
- isolate_namespace Masks
14
-
15
- initializer "masks.assets.precompile" do |app|
16
- app.config.assets.precompile += %w[masks_manifest.js] if app.config.try(
17
- :assets
18
- )
19
- end
20
-
21
- initializer "masks.middleware" do |app|
22
- app.config.app_middleware.use Masks::Middleware
23
- end
24
- end
25
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # Integrate masks with Rails, via middleware.
5
- #
6
- # This middleware creates a new session for every request using
7
- # +Masks.request+. If the session is +passed?+ the middleware
8
- # chain is allowed to continue.
9
- #
10
- # The middleware uses the +fail+ value on the session's mask to
11
- # determine what to do otherwise. If +false+ the chain is allowed
12
- # to continue regardless of pass/fail status. It will also accept
13
- # a URI or path for redirects, an HTTP status code, or a controller
14
- # action in the form of +ControllerClass#action_name+.
15
- #
16
- # The session is stored in the rack environment under the name
17
- # +Mask::Middleware::SESSION_KEY+, which is how it is made available to
18
- # controllers in +Masks::Controller#masked_session+.
19
- #
20
- # @see Masks.request Masks.request
21
- # @see Masks::Session Masks::Session
22
- # @see Masks::Controller Masks::Controller
23
- class Middleware
24
- SESSION_KEY = "masks.session"
25
-
26
- def initialize(app)
27
- @app = app
28
- end
29
-
30
- def call(env)
31
- request = ActionDispatch::Request.new(env)
32
- session = Masks.request(request)
33
-
34
- ::Rails.logger.info(
35
- [
36
- "Mask #{session.passed? ? "allowed" : "blocked"}",
37
- "by type=#{session.mask.type}",
38
- session.mask.name ? "name=#{session.mask.name}" : ""
39
- ].join(" ")
40
- )
41
-
42
- env[SESSION_KEY] = session
43
- app = @app
44
- app = (session.passed? ? app : error_app(session, app))
45
-
46
- app.call(env)
47
- end
48
-
49
- private
50
-
51
- def error_app(session, app)
52
- value = session.mask.fail
53
- case value
54
- when false
55
- app
56
- when /.+\#.+/
57
- controller, action = value.split("#")
58
- controller.constantize.action(action)
59
- when %r{/.*}, %r{https?://.+}
60
- Masks::ErrorController.action(:redirect)
61
- when /\d+/
62
- Masks::ErrorController.action("render_#{value}")
63
- when /\w+/
64
- Masks::ErrorController.action(value)
65
- else
66
- Masks::ErrorController.action(:render_unauthorized)
67
- end
68
- end
69
- end
70
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- def cli_access(access_name, **opts)
4
- access = nil
5
- actor = opts.delete(:as) || ENV["ACTOR"] || Masks::ANON
6
-
7
- Masks.mask("cli", as: actor, **opts) do |session|
8
- access = session.access(access_name)
9
- end
10
-
11
- access
12
- end
13
-
14
- namespace :masks do
15
- task boot: :environment do
16
- # required to ensure access classes (and others) are registered properly
17
- Rails.application.eager_load!
18
- end
19
-
20
- task :signup, %i[nickname password] => :boot do |_task, args|
21
- access = cli_access("actor.signup", args:)
22
- signup = access.signup(**args) if access
23
-
24
- if !access
25
- puts "could not find actor..."
26
- elsif signup.invalid?
27
- puts "failed to signup '#{signup.nickname}'"
28
- puts "error: #{signup.errors.full_messages.join(", ")}"
29
- else
30
- puts "created '#{signup.nickname}'!"
31
- end
32
- end
33
-
34
- task :assign_scopes, %i[actor scopes] => :boot do |_task, args|
35
- if !args[:actor] || !args[:scopes]
36
- puts "specify an actor and scopes, e.g. masks:assign_scopes[@foo,scope1;scope2;scope3]"
37
- exit 1
38
- end
39
-
40
- scopes = args[:scopes].split(';')
41
- access = cli_access("actor.scopes", as: args[:actor])
42
- access&.assign_scopes(scopes)
43
-
44
- if !access
45
- puts "could not find actor..."
46
- elsif access.actor.invalid?
47
- puts "failed to assign scopes to '#{access.actor.nickname}'"
48
- puts "error: #{access.actor.errors.full_messages.join(", ")}"
49
- else
50
- puts "assigned scopes '#{scopes.join(', ')}' to '#{access.actor.nickname}'"
51
- end
52
- end
53
-
54
- task :change_password, %i[actor password] => :boot do |_task, args|
55
- if !args[:actor] || !args[:password]
56
- puts "specify an actor and password, e.g. masks:change_password[@foo,password]"
57
- exit 1
58
- end
59
-
60
- access = cli_access("actor.password", as: args[:actor])
61
- access&.change_password(args[:password])
62
-
63
- if !access
64
- puts "could not find actor..."
65
- elsif access.actor.invalid?
66
- puts "failed to change password for '#{access.actor.nickname}'"
67
- puts "error: #{access.actor.errors.full_messages.join(", ")}"
68
- else
69
- puts "changed password for '#{access.actor.nickname}'"
70
- end
71
- end
72
- end
data/masks.json DELETED
@@ -1,277 +0,0 @@
1
- {
2
- "name": "masks",
3
- "url": "http://localhost:3000",
4
- "title": "masks",
5
- "signups": true,
6
- "nickname": {
7
- "format": "^[\\w]+$",
8
- "length": { "min": 5, "max": 36 }
9
- },
10
- "password": {
11
- "length": { "min": 8, "max": 128 }
12
- },
13
- "masks": [
14
- {
15
- "skip": true,
16
- "request": {
17
- "method": "get",
18
- "path": ["/assets/*", "/debug"]
19
- }
20
- },
21
- {
22
- "type": "anon",
23
- "request": {
24
- "method": "get",
25
- "path": "/anon"
26
- },
27
- "anon": true,
28
- "fail": false
29
- },
30
- {
31
- "type": "api",
32
- "request": {
33
- "path": ["*"],
34
- "header": "Authorization"
35
- }
36
- },
37
- {
38
- "type": "authenticate",
39
- "request": {
40
- "method": "post",
41
- "path": "/session"
42
- },
43
- "fail": false
44
- },
45
- {
46
- "type": "session",
47
- "request": {
48
- "method": ["get", "delete"],
49
- "path": "/session"
50
- },
51
- "fail": false
52
- },
53
- {
54
- "type": "recovery",
55
- "request": {
56
- "method": ["get", "post"],
57
- "path": ["/recovery", "/recover"]
58
- },
59
- "fail": false
60
- },
61
- {
62
- "type": "sudo",
63
- "request": {
64
- "method": ["post"],
65
- "path": "/emails"
66
- },
67
- "fail": false
68
- },
69
- {
70
- "type": "session",
71
- "request": {
72
- "method": ["delete", "patch"],
73
- "path": "/emails"
74
- },
75
- "fail": false
76
- },
77
- {
78
- "type": "session",
79
- "request": {
80
- "method": "get",
81
- "path": "/email/*/verify"
82
- },
83
- "fail": false
84
- },
85
- {
86
- "type": "sudo",
87
- "request": {
88
- "method": ["post", "delete"],
89
- "path": "/one-time-codes"
90
- },
91
- "fail": false
92
- },
93
- {
94
- "type": "sudo",
95
- "request": {
96
- "method": ["post"],
97
- "path": "/backup-codes"
98
- },
99
- "fail": false
100
- },
101
- {
102
- "type": "session",
103
- "access": ["actor.password"],
104
- "request": {
105
- "method": ["get"],
106
- "path": "/password"
107
- }
108
- },
109
- {
110
- "type": "sudo",
111
- "access": ["actor.password"],
112
- "request": {
113
- "method": ["post"],
114
- "path": "/password"
115
- },
116
- "fail": false
117
- },
118
- {
119
- "type": "session",
120
- "request": {
121
- "path": "/cable",
122
- "method": "get"
123
- }
124
- },
125
- {
126
- "type": "session",
127
- "request": {
128
- "path": "/private"
129
- }
130
- },
131
- {
132
- "type": "sudo",
133
- "request": {
134
- "method": "patch",
135
- "path": "/actor"
136
- }
137
- },
138
- {
139
- "type": "sudo",
140
- "request": {
141
- "method": "post",
142
- "path": "/session",
143
- "param": "sudo"
144
- }
145
- },
146
- {
147
- "type": "manage",
148
- "request": {
149
- "path": ["/actors", "/actors/*"]
150
- },
151
- "fail": "/session"
152
- },
153
- {
154
- "type": "session",
155
- "request": {
156
- "path": "*"
157
- },
158
- "fail": "/session"
159
- },
160
- {
161
- "name": "cli",
162
- "type": "masquerade",
163
- "access": ["actor.signup", "actor.password", "actor.scopes"]
164
- },
165
- {
166
- "access": "actor.signup"
167
- },
168
- {
169
- "access": "actor.password"
170
- },
171
- {
172
- "access": "actor.scopes"
173
- }
174
- ],
175
- "types": {
176
- "anon": {
177
- "checks": null,
178
- "credentials": null
179
- },
180
- "public": {
181
- "checks": {
182
- "actor": {
183
- "lifetime": "P1M",
184
- "optional": true
185
- }
186
- },
187
- "credentials": ["Session"]
188
- },
189
- "authenticate": {
190
- "checks": {
191
- "actor": {
192
- "lifetime": "PT12H"
193
- },
194
- "password": {
195
- "lifetime": "PT12H"
196
- },
197
- "factor2": {
198
- "lifetime": "PT12H",
199
- "optional": true
200
- },
201
- "device": {}
202
- },
203
- "credentials": [
204
- "Email",
205
- "Nickname",
206
- "Session",
207
- "Password",
208
- "BackupCode",
209
- "OneTimeCode",
210
- "LastLogin",
211
- "Device"
212
- ]
213
- },
214
- "sudo": {
215
- "checks": {
216
- "actor": {
217
- "lifetime": "PT12H"
218
- },
219
- "password": {},
220
- "device": {}
221
- },
222
- "credentials": ["Session", "Password", "Device"]
223
- },
224
- "session": {
225
- "checks": {
226
- "actor": {
227
- "lifetime": "PT12H"
228
- },
229
- "password": {
230
- "lifetime": "PT12H"
231
- },
232
- "factor2": {
233
- "lifetime": "PT12H",
234
- "optional": true
235
- },
236
- "device": {}
237
- },
238
- "credentials": ["Session", "Device"]
239
- },
240
- "manage": {
241
- "checks": {
242
- "actor": {
243
- "lifetime": "PT12H"
244
- },
245
- "password": {
246
- "lifetime": "PT12H"
247
- },
248
- "factor2": {
249
- "lifetime": "PT12H",
250
- "optional": true
251
- },
252
- "device": {}
253
- },
254
- "credentials": ["Session", "Device"],
255
- "scopes": "masks:manager"
256
- },
257
- "recovery": {
258
- "checks": {
259
- "recovery": {}
260
- },
261
- "credentials": ["Session", "Recovery", "Device"]
262
- },
263
- "api": {
264
- "checks": {
265
- "key": {},
266
- "device": {}
267
- },
268
- "credentials": ["Key", "Device"]
269
- },
270
- "masquerade": {
271
- "checks": {
272
- "actor": {}
273
- },
274
- "credentials": ["Masquerade"]
275
- }
276
- }
277
- }