masks 0.4.0 → 0.6.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 (180) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/LICENSE +21 -0
  4. data/README.md +235 -29
  5. data/app/controllers/masks/rails/avatars_controller.rb +51 -0
  6. data/app/controllers/masks/rails/base_controller.rb +13 -0
  7. data/app/controllers/masks/rails/handshakes_controller.rb +86 -0
  8. data/app/controllers/masks/rails/sessions_controller.rb +118 -0
  9. data/app/views/layouts/masks/rails/plain.html.erb +47 -0
  10. data/app/views/masks/rails/handshakes/refused.html.erb +12 -0
  11. data/app/views/masks/rails/handshakes/show.html.erb +40 -0
  12. data/config/routes.rb +11 -82
  13. data/lib/generators/masks/install/install_generator.rb +35 -22
  14. data/lib/generators/masks/install/templates/masks.rb.tt +38 -0
  15. data/lib/masks/client/claims.rb +144 -0
  16. data/lib/masks/client/errors.rb +60 -0
  17. data/lib/masks/client/handshake.rb +104 -0
  18. data/lib/masks/client/http.rb +96 -0
  19. data/lib/masks/client/introspection.rb +29 -0
  20. data/lib/masks/client/issuer.rb +92 -0
  21. data/lib/masks/client/pkce.rb +27 -0
  22. data/lib/masks/client/rack.rb +62 -0
  23. data/lib/masks/client/registration.rb +115 -0
  24. data/lib/masks/client/registry.rb +25 -0
  25. data/lib/masks/client/resource.rb +92 -0
  26. data/lib/masks/client/session.rb +146 -0
  27. data/lib/masks/client/stores.rb +40 -0
  28. data/lib/masks/client/tokens.rb +70 -0
  29. data/lib/masks/client/tracker.rb +122 -0
  30. data/lib/masks/client/verifier.rb +42 -0
  31. data/lib/masks/client.rb +51 -0
  32. data/lib/masks/rails/authentication.rb +260 -0
  33. data/lib/masks/rails/configurable.rb +11 -0
  34. data/lib/masks/rails/configuration.rb +184 -0
  35. data/lib/masks/rails/credentials.rb +60 -0
  36. data/lib/masks/rails/engine.rb +20 -0
  37. data/lib/masks/rails/protected_resource.rb +51 -0
  38. data/lib/masks/rails.rb +10 -0
  39. data/lib/masks/version.rb +1 -3
  40. data/lib/masks.rb +3 -183
  41. metadata +48 -416
  42. data/MIT-LICENSE +0 -20
  43. data/Rakefile +0 -11
  44. data/app/assets/builds/masks/application.css +0 -1
  45. data/app/assets/builds/masks/application.js +0 -8549
  46. data/app/assets/builds/masks/application.js.map +0 -7
  47. data/app/assets/images/masks.png +0 -0
  48. data/app/assets/javascripts/application.js +0 -2
  49. data/app/assets/javascripts/controllers/application.js +0 -9
  50. data/app/assets/javascripts/controllers/emails_controller.js +0 -28
  51. data/app/assets/javascripts/controllers/index.js +0 -21
  52. data/app/assets/javascripts/controllers/keys_controller.js +0 -20
  53. data/app/assets/javascripts/controllers/recover_controller.js +0 -21
  54. data/app/assets/javascripts/controllers/recover_password_controller.js +0 -21
  55. data/app/assets/javascripts/controllers/session_controller.js +0 -94
  56. data/app/assets/javascripts/controllers/table_controller.js +0 -15
  57. data/app/assets/manifest.js +0 -2
  58. data/app/assets/masks_manifest.js +0 -2
  59. data/app/assets/stylesheets/application.css +0 -34
  60. data/app/controllers/concerns/masks/controller.rb +0 -114
  61. data/app/controllers/masks/actors_controller.rb +0 -15
  62. data/app/controllers/masks/application_controller.rb +0 -35
  63. data/app/controllers/masks/backup_codes_controller.rb +0 -34
  64. data/app/controllers/masks/debug_controller.rb +0 -9
  65. data/app/controllers/masks/devices_controller.rb +0 -20
  66. data/app/controllers/masks/emails_controller.rb +0 -60
  67. data/app/controllers/masks/error_controller.rb +0 -14
  68. data/app/controllers/masks/keys_controller.rb +0 -45
  69. data/app/controllers/masks/manage/actors_controller.rb +0 -83
  70. data/app/controllers/masks/manage/base_controller.rb +0 -20
  71. data/app/controllers/masks/manage/clients_controller.rb +0 -84
  72. data/app/controllers/masks/manage/dashboard_controller.rb +0 -15
  73. data/app/controllers/masks/manage/devices_controller.rb +0 -19
  74. data/app/controllers/masks/one_time_code_controller.rb +0 -49
  75. data/app/controllers/masks/openid/authorizations_controller.rb +0 -45
  76. data/app/controllers/masks/openid/discoveries_controller.rb +0 -55
  77. data/app/controllers/masks/openid/tokens_controller.rb +0 -45
  78. data/app/controllers/masks/openid/userinfo_controller.rb +0 -28
  79. data/app/controllers/masks/passwords_controller.rb +0 -33
  80. data/app/controllers/masks/recoveries_controller.rb +0 -43
  81. data/app/controllers/masks/sessions_controller.rb +0 -53
  82. data/app/helpers/masks/application_helper.rb +0 -49
  83. data/app/jobs/masks/application_job.rb +0 -7
  84. data/app/jobs/masks/expire_actors_job.rb +0 -15
  85. data/app/jobs/masks/expire_recoveries_job.rb +0 -15
  86. data/app/mailers/masks/actor_mailer.rb +0 -22
  87. data/app/mailers/masks/application_mailer.rb +0 -15
  88. data/app/models/concerns/masks/access.rb +0 -162
  89. data/app/models/concerns/masks/actor.rb +0 -132
  90. data/app/models/concerns/masks/adapter.rb +0 -68
  91. data/app/models/concerns/masks/role.rb +0 -9
  92. data/app/models/concerns/masks/scoped.rb +0 -54
  93. data/app/models/masks/access/actor_password.rb +0 -21
  94. data/app/models/masks/access/actor_scopes.rb +0 -18
  95. data/app/models/masks/access/actor_signup.rb +0 -21
  96. data/app/models/masks/actors/anonymous.rb +0 -40
  97. data/app/models/masks/actors/system.rb +0 -24
  98. data/app/models/masks/adapters/active_record.rb +0 -85
  99. data/app/models/masks/application_model.rb +0 -15
  100. data/app/models/masks/application_record.rb +0 -8
  101. data/app/models/masks/check.rb +0 -192
  102. data/app/models/masks/credential.rb +0 -166
  103. data/app/models/masks/credentials/access_token.rb +0 -60
  104. data/app/models/masks/credentials/backup_code.rb +0 -30
  105. data/app/models/masks/credentials/device.rb +0 -59
  106. data/app/models/masks/credentials/email.rb +0 -48
  107. data/app/models/masks/credentials/factor2.rb +0 -71
  108. data/app/models/masks/credentials/key.rb +0 -38
  109. data/app/models/masks/credentials/last_login.rb +0 -12
  110. data/app/models/masks/credentials/masquerade.rb +0 -32
  111. data/app/models/masks/credentials/nickname.rb +0 -63
  112. data/app/models/masks/credentials/one_time_code.rb +0 -34
  113. data/app/models/masks/credentials/password.rb +0 -28
  114. data/app/models/masks/credentials/recovery.rb +0 -71
  115. data/app/models/masks/credentials/return_to.rb +0 -27
  116. data/app/models/masks/credentials/session.rb +0 -67
  117. data/app/models/masks/device.rb +0 -30
  118. data/app/models/masks/error.rb +0 -51
  119. data/app/models/masks/event.rb +0 -14
  120. data/app/models/masks/mask.rb +0 -266
  121. data/app/models/masks/openid/authorization.rb +0 -116
  122. data/app/models/masks/openid/token.rb +0 -56
  123. data/app/models/masks/rails/actor.rb +0 -212
  124. data/app/models/masks/rails/actor_role.rb +0 -12
  125. data/app/models/masks/rails/device.rb +0 -47
  126. data/app/models/masks/rails/email.rb +0 -96
  127. data/app/models/masks/rails/key.rb +0 -61
  128. data/app/models/masks/rails/openid/access_token.rb +0 -55
  129. data/app/models/masks/rails/openid/authorization.rb +0 -45
  130. data/app/models/masks/rails/openid/client.rb +0 -186
  131. data/app/models/masks/rails/openid/id_token.rb +0 -43
  132. data/app/models/masks/rails/recovery.rb +0 -116
  133. data/app/models/masks/rails/role.rb +0 -20
  134. data/app/models/masks/rails/scope.rb +0 -15
  135. data/app/models/masks/session.rb +0 -447
  136. data/app/models/masks/sessions/access.rb +0 -27
  137. data/app/models/masks/sessions/inline.rb +0 -16
  138. data/app/models/masks/sessions/request.rb +0 -42
  139. data/app/resources/masks/actor_resource.rb +0 -9
  140. data/app/resources/masks/session_resource.rb +0 -15
  141. data/app/views/layouts/masks/application.html.erb +0 -17
  142. data/app/views/layouts/masks/mailer.html.erb +0 -17
  143. data/app/views/layouts/masks/mailer.text.erb +0 -1
  144. data/app/views/layouts/masks/manage.html.erb +0 -42
  145. data/app/views/masks/actor_mailer/recover_credentials.html.erb +0 -32
  146. data/app/views/masks/actor_mailer/recover_credentials.text.erb +0 -1
  147. data/app/views/masks/actor_mailer/verify_email.html.erb +0 -33
  148. data/app/views/masks/actor_mailer/verify_email.text.erb +0 -8
  149. data/app/views/masks/actors/current.html.erb +0 -145
  150. data/app/views/masks/application/_header.html.erb +0 -30
  151. data/app/views/masks/backup_codes/new.html.erb +0 -117
  152. data/app/views/masks/emails/new.html.erb +0 -109
  153. data/app/views/masks/emails/verify.html.erb +0 -51
  154. data/app/views/masks/keys/new.html.erb +0 -127
  155. data/app/views/masks/manage/actors/index.html.erb +0 -104
  156. data/app/views/masks/manage/actors/show.html.erb +0 -172
  157. data/app/views/masks/manage/clients/index.html.erb +0 -102
  158. data/app/views/masks/manage/clients/show.html.erb +0 -156
  159. data/app/views/masks/manage/dashboard/index.html.erb +0 -10
  160. data/app/views/masks/manage/devices/index.html.erb +0 -47
  161. data/app/views/masks/one_time_code/new.html.erb +0 -167
  162. data/app/views/masks/openid/authorizations/error.html.erb +0 -23
  163. data/app/views/masks/openid/authorizations/new.html.erb +0 -46
  164. data/app/views/masks/passwords/edit.html.erb +0 -71
  165. data/app/views/masks/recoveries/new.html.erb +0 -69
  166. data/app/views/masks/recoveries/password.html.erb +0 -63
  167. data/app/views/masks/sessions/new.html.erb +0 -152
  168. data/config/brakeman.ignore +0 -28
  169. data/config/initializers/inflections.rb +0 -5
  170. data/config/locales/en.yml +0 -307
  171. data/db/migrate/20231205173845_create_actors.rb +0 -94
  172. data/db/migrate/20240329182422_support_openid.rb +0 -64
  173. data/lib/generators/masks/install/USAGE +0 -8
  174. data/lib/generators/masks/install/templates/initializer.rb +0 -5
  175. data/lib/generators/masks/install/templates/masks.json +0 -9
  176. data/lib/masks/configuration.rb +0 -249
  177. data/lib/masks/engine.rb +0 -25
  178. data/lib/masks/middleware.rb +0 -70
  179. data/lib/tasks/masks_tasks.rake +0 -72
  180. data/masks.json +0 -315
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- module Manage
6
- class ActorsController < BaseController
7
- section :actors
8
-
9
- before_action :find_actor
10
-
11
- def index
12
- @pagy, @actors = pagy(actor_model.all)
13
- end
14
-
15
- def create
16
- actor =
17
- signup_access.signup(
18
- nickname: params[:nickname],
19
- password: params[:password]
20
- )
21
-
22
- if actor.valid?
23
- redirect_to manage_actor_path(actor)
24
- else
25
- flash[:errors] = actor.errors.full_messages
26
- redirect_to manage_actors_path
27
- end
28
- end
29
-
30
- def update
31
- actor_model.transaction do
32
- if params[:add_scope]
33
- @actor.assign_scopes!(params[:add_scope])
34
- flash[:info] = "added scope \"#{params[:add_scope]}\""
35
- elsif params[:remove_scope]
36
- @actor.remove_scopes!(params[:remove_scope])
37
- flash[:info] = "removed scope \"#{params[:remove_scope]}\""
38
- elsif params[:remove_factor2]
39
- @actor.remove_factor2!
40
- flash[:info] = "removed second factor authentication"
41
- elsif params[:logout]
42
- @actor.logout!
43
- flash[:info] = "logged out of all devices"
44
- elsif password_param
45
- password_access.change_password(password_param, actor: @actor)
46
-
47
- if @actor.valid?
48
- flash[:info] = "password changed"
49
- else
50
- flash[:error] = "invalid password"
51
- end
52
- end
53
-
54
- redirect_to manage_actor_path(@actor)
55
- end
56
-
57
- @actor
58
- end
59
-
60
- private
61
-
62
- def find_actor
63
- @actor = actor_model.find_by(nickname: params[:actor])
64
- end
65
-
66
- def actor_model
67
- Masks.configuration.model(:actor)
68
- end
69
-
70
- def signup_access
71
- masked_session.access("actor.signup")
72
- end
73
-
74
- def password_access
75
- masked_session.access("actor.password")
76
- end
77
-
78
- def password_param
79
- params[:change_password]
80
- end
81
- end
82
- end
83
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- module Manage
6
- class BaseController < ApplicationController
7
- layout "masks/manage"
8
-
9
- class << self
10
- def section(name)
11
- before_action { @section = name }
12
- end
13
- end
14
-
15
- helper_method :current_actor, :section
16
-
17
- attr_accessor :section
18
- end
19
- end
20
- end
@@ -1,84 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- module Manage
6
- class ClientsController < BaseController
7
- section :clients
8
-
9
- before_action :find_client, only: %i[show update destroy]
10
-
11
- rescue_from Pagy::OverflowError do
12
- redirect_to manage_clients_path
13
- end
14
-
15
- def index
16
- @pagy, @clients =
17
- pagy(Masks::Rails::OpenID::Client.all.order(created_at: :desc))
18
- end
19
-
20
- def create
21
- client =
22
- Masks.configuration.model(:openid_client).new(name: params[:name])
23
-
24
- if client.save
25
- redirect_to manage_client_path(client)
26
- else
27
- flash[:errors] = client.errors.full_messages
28
-
29
- redirect_to manage_clients_path
30
- end
31
- end
32
-
33
- def update
34
- Masks
35
- .configuration
36
- .model(:openid_client)
37
- .transaction do
38
- if params[:add_scope]
39
- @client.assign_scopes!(params[:add_scope])
40
- flash[:info] = "added scope"
41
- elsif params[:remove_scope]
42
- @client.remove_scopes!(params[:remove_scope])
43
- flash[:info] = "removed scope"
44
- else
45
- update_client
46
- end
47
-
48
- redirect_to manage_client_path(@client)
49
- end
50
- end
51
-
52
- def destroy
53
- @client.destroy
54
-
55
- flash[:destroyed] = @client.name
56
-
57
- redirect_to manage_clients_path
58
- end
59
-
60
- private
61
-
62
- def update_client
63
- @client.name = params[:name]
64
- @client.secret = params[:secret]
65
- @client.consent = params[:consent]
66
- @client.redirect_uris = params[:redirect_uris].split("\n")
67
- @client.subject_type = params[:subject_type]
68
- @client.code_expires_in = params[:code_expires_in]
69
- @client.token_expires_in = params[:token_expires_in]
70
- @client.refresh_expires_in = params[:refresh_expires_in]
71
- @client.save
72
-
73
- return if @client.valid?
74
-
75
- flash[:errors] = @client.errors.full_messages
76
- end
77
-
78
- def find_client
79
- @client =
80
- Masks.configuration.model(:openid_client).find_by(key: params[:id])
81
- end
82
- end
83
- end
84
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- module Manage
6
- class DashboardController < BaseController
7
- section :dashboard
8
-
9
- def index
10
- @clients = Masks.configuration.model(:openid_client).count
11
- @actors = Masks.configuration.model(:actor).count
12
- end
13
- end
14
- end
15
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- module Manage
6
- class DevicesController < BaseController
7
- section :devices
8
-
9
- rescue_from Pagy::OverflowError do
10
- redirect_to manage_devices_path
11
- end
12
-
13
- def index
14
- @pagy, @devices =
15
- pagy(Masks.configuration.model(:device).all.order(created_at: :desc))
16
- end
17
- end
18
- end
19
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- class OneTimeCodeController < ApplicationController
6
- require_mask type: :session, only: :new
7
-
8
- before_action only: %i[create destroy] do
9
- require_sudo(one_time_code_path)
10
- end
11
-
12
- def new
13
- respond_to { |format| format.html { render(:new) } }
14
- end
15
-
16
- def create
17
- if secret_param && code_param
18
- @actor.totp_secret = secret_param
19
- @actor.totp_code = code_param
20
- @actor.save if @actor.valid?
21
-
22
- flash[:errors] = @actor.errors.full_messages unless @actor.valid?
23
- end
24
-
25
- respond_to { |format| format.html { redirect_to one_time_code_path } }
26
- end
27
-
28
- def destroy
29
- @actor.totp_secret = nil
30
- @actor.save if @actor.valid?
31
-
32
- respond_to { |format| format.html { redirect_to one_time_code_path } }
33
- end
34
-
35
- private
36
-
37
- def create_params
38
- params.require(:one_time_code).permit(:code, :secret)
39
- end
40
-
41
- def code_param
42
- create_params[:code]
43
- end
44
-
45
- def secret_param
46
- create_params[:secret]
47
- end
48
- end
49
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
- module Masks
3
- module OpenID
4
- class AuthorizationsController < ApplicationController
5
- rescue_from Rack::OAuth2::Server::Authorize::BadRequest do |e|
6
- @error = e
7
-
8
- render :error, status: e.status
9
- end
10
-
11
- def new
12
- authorize
13
- end
14
-
15
- def create
16
- authorize approved: params[:approve]
17
- end
18
-
19
- private
20
-
21
- def authorize(**opts)
22
- # TODO: support incoming id_token request object + max_age parameter
23
- @authorization = Authorization.perform(request.env, **opts)
24
-
25
- _status, header, = @authorization.response
26
-
27
- if header["WWW-Authenticate"].present?
28
- headers["WWW-Authenticate"] = header["WWW-Authenticate"]
29
- end
30
-
31
- if header["Location"]
32
- return redirect_to header["Location"], allow_other_host: true
33
- end
34
-
35
- unless @authorization.actor
36
- session[:return_to] = request.url
37
-
38
- return redirect_to session_path
39
- end
40
-
41
- render :new
42
- end
43
- end
44
- end
45
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
- module Masks
3
- module OpenID
4
- class DiscoveriesController < ApplicationController
5
- before_action :find_client
6
-
7
- def jwks
8
- jwks =
9
- JSON::JWK::Set.new(
10
- JSON::JWK.new(client.public_key, use: :sig, kid: client.kid)
11
- )
12
-
13
- render json: jwks
14
- end
15
-
16
- def new
17
- render json:
18
- OpenIDConnect::Discovery::Provider::Config::Response.new(
19
- issuer: client.issuer,
20
- authorization_endpoint: openid_authorization_url,
21
- token_endpoint: openid_token_url,
22
- userinfo_endpoint: openid_userinfo_url,
23
- jwks_uri: openid_jwks_url,
24
- # registration_endpoint: site_url, # TODO
25
- scopes_supported: client.scopes,
26
- response_types_supported: client.response_types,
27
- grant_types_supported: client.grant_types,
28
- claims_parameter_supported: false,
29
- request_parameter_supported: false,
30
- request_uri_parameter_supported: false,
31
- subject_types_supported: [
32
- client.pairwise_subject? ? "pairwise" : "public"
33
- ],
34
- id_token_signing_alg_values_supported: [:RS256],
35
- token_endpoint_auth_methods_supported: %w[
36
- client_secret_basic
37
- client_secret_post
38
- ],
39
- claims_supported: %w[sub iss name email address phone_number]
40
- )
41
- end
42
-
43
- private
44
-
45
- def find_client
46
- head :not_found unless client
47
- end
48
-
49
- def client
50
- @client ||=
51
- Masks.configuration.model(:openid_client).find_by(key: params[:id])
52
- end
53
- end
54
- end
55
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
- module Masks
3
- module OpenID
4
- class TokensController < ApplicationController
5
- rescue_from Rack::OAuth2::Server::Authorize::BadRequest do |e|
6
- @error = e
7
-
8
- render :error, status: e.status
9
- end
10
-
11
- def new
12
- authorize
13
- end
14
-
15
- def create
16
- authorize approved: params[:approve]
17
- end
18
-
19
- private
20
-
21
- def authorize(**opts)
22
- # TODO: support incoming id_token request object + max_age parameter
23
- @authorization = Authorization.perform(request.env, **opts)
24
-
25
- unless @authorization.actor
26
- session[:return_to] = request.url
27
-
28
- return redirect_to session_path
29
- end
30
-
31
- _status, header, = @authorization.response
32
-
33
- if header["WWW-Authenticate"].present?
34
- headers["WWW-Authenticate"] = header["WWW-Authenticate"]
35
- end
36
-
37
- if header["Location"]
38
- redirect_to header["Location"]
39
- else
40
- render :new
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
- module Masks
3
- module OpenID
4
- class UserInfoController < ApplicationController
5
- def show
6
- claims = { sub: openid_client.subject(current_actor) }
7
-
8
- if access_token.scope?("email")
9
- claims[:email] = current_actor.primary_email&.email
10
- end
11
-
12
- if access_token.scope?("phone")
13
- claims[:phone] = current_actor.phone_number
14
- end
15
-
16
- render json: OpenIDConnect::ResponseObject::UserInfo.new(claims)
17
- end
18
-
19
- private
20
-
21
- def access_token
22
- @access_token ||= masked_session.extra(:access_token)
23
- end
24
-
25
- delegate :openid_client, to: :access_token
26
- end
27
- end
28
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- class PasswordsController < ApplicationController
6
- require_mask type: :session, only: :edit
7
- require_access "actor.password", only: :update
8
-
9
- before_action only: %i[update] do
10
- require_sudo(password_path)
11
- end
12
-
13
- def edit
14
- respond_to { |format| format.html { render(:edit) } }
15
- end
16
-
17
- def update
18
- if password_param
19
- current_access.change_password(password_param)
20
-
21
- flash[:errors] = @actor.errors.full_messages unless @actor.valid?
22
- end
23
-
24
- respond_to { |format| format.html { redirect_to password_path } }
25
- end
26
-
27
- private
28
-
29
- def password_param
30
- params.dig(:password, :change)
31
- end
32
- end
33
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- class RecoveriesController < ApplicationController
6
- before_action :redirect_if_logged_in, only: %i[new]
7
-
8
- def new
9
- respond_to { |format| format.html { render(:new) } }
10
- end
11
-
12
- def create
13
- flash[:recovery] = true
14
-
15
- respond_to { |format| format.html { redirect_to recover_path } }
16
- end
17
-
18
- def password
19
- @recovery = masked_session.extra(:recovery)
20
-
21
- respond_to { |format| format.html { render(:password) } }
22
- end
23
-
24
- def reset
25
- @recovery = masked_session.extra(:recovery)
26
-
27
- flash[:reset] = true if @recovery&.destroyed?
28
- flash[:errors] = @recovery.errors.full_messages if @recovery &&
29
- !@recovery&.valid?
30
-
31
- redirect =
32
- @recovery ? recover_password_path(token: @recovery.token) : recover_path
33
-
34
- respond_to { |format| format.html { redirect_to redirect } }
35
- end
36
-
37
- private
38
-
39
- def redirect_if_logged_in
40
- redirect_to Masks.configuration.site_links[:root] if current_actor
41
- end
42
- end
43
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- class SessionsController < ApplicationController
6
- def new
7
- respond_to do |format|
8
- format.json { render json: resource_cls.new(masked_session) }
9
- format.html { render(:new) }
10
- end
11
- end
12
-
13
- def create
14
- flash[
15
- :errors
16
- ] = masked_session.errors.full_messages unless request.format == :json
17
-
18
- respond_to do |format|
19
- format.json { render json: resource_cls.new(masked_session) }
20
- format.html do
21
- path =
22
- (
23
- if masked_session.passed?
24
- session.delete(:return_to) || masked_session.mask.pass ||
25
- Masks.configuration.site_links[:after_login]
26
- else
27
- masked_session.mask.fail ||
28
- Masks.configuration.site_links[:login]
29
- end
30
- )
31
- redirect_to path
32
- end
33
- end
34
- end
35
-
36
- def destroy
37
- masked_session.cleanup!
38
-
39
- respond_to do |format|
40
- format.json { render json: resource_cls.new(masked_session) }
41
- format.html do
42
- redirect_to Masks.configuration.site_links[:after_logout]
43
- end
44
- end
45
- end
46
-
47
- private
48
-
49
- def resource_cls
50
- Masks.configuration.model(:session_json)
51
- end
52
- end
53
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- module ApplicationHelper
6
- include Pagy::Frontend
7
-
8
- def totp_svg(uri, **opts)
9
- qrcode = RQRCode::QRCode.new(uri)
10
- raw qrcode.as_svg(**opts)
11
- end
12
-
13
- def device_icon(device)
14
- case device.device_type
15
- when "desktop"
16
- "computer"
17
- when "smartphone", "feature phone"
18
- "smartphone"
19
- when "tablet", "phablet", "portable media player"
20
- "tablet"
21
- when "console"
22
- "gamepad"
23
- when "tv", "smart display"
24
- "tv-2"
25
- when "car browser"
26
- "car"
27
- when "camera"
28
- "camera"
29
- when "smart speaker", "wearable", "peripheral"
30
- "bluetooth"
31
- else
32
- "question-circle"
33
- end
34
- end
35
-
36
- def logged_in?
37
- @session&.passed? && @session&.actor && !@session.actor.anonymous?
38
- end
39
-
40
- def factor2_required?
41
- checks = @session.checks_for(:session)
42
-
43
- return false unless checks
44
-
45
- checks[:factor2] && !checks[:factor2]&.passed? &&
46
- checks[:actor]&.passed? && checks[:password]&.passed?
47
- end
48
- end
49
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- class ApplicationJob < ActiveJob::Base
6
- end
7
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # Job for deleting actors that have passed their expiration time.
5
- #
6
- # This job effectively delegates its work to the configured
7
- # +Masks::Adapter+, specifically calling +#expire_actors+.
8
- #
9
- # @see Masks::Adapter Masks::Adapter
10
- class ExpireActorsJob < ApplicationJob
11
- def perform
12
- Masks.configuration.expire_actors
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # Job for deleting recovies requests that passed their expiration time.
5
- #
6
- # This job delegates its work to the configured
7
- # +Masks::Adapter+, specifically calling +#expire_recoveries+.
8
- #
9
- # @see Masks::Adapter Masks::Adapter
10
- class ExpireRecoveriesJob < ApplicationJob
11
- def perform
12
- Masks.configuration.expire_recoveries
13
- end
14
- end
15
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Masks
4
- # @visibility private
5
- class ActorMailer < ApplicationMailer
6
- layout "masks/mailer"
7
-
8
- def verify_email
9
- @config = Masks.configuration
10
- @email = params[:email]
11
-
12
- mail(to: @email.email, subject: t(".subject"))
13
- end
14
-
15
- def recover_credentials
16
- @config = Masks.configuration
17
- @recovery = @config.find_recovery(nil, id: params[:recovery])
18
-
19
- mail(to: @recovery.to, subject: t(".subject"))
20
- end
21
- end
22
- end