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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/LICENSE +21 -0
- data/README.md +235 -29
- data/app/controllers/masks/rails/avatars_controller.rb +51 -0
- data/app/controllers/masks/rails/base_controller.rb +13 -0
- data/app/controllers/masks/rails/handshakes_controller.rb +86 -0
- data/app/controllers/masks/rails/sessions_controller.rb +118 -0
- data/app/views/layouts/masks/rails/plain.html.erb +47 -0
- data/app/views/masks/rails/handshakes/refused.html.erb +12 -0
- data/app/views/masks/rails/handshakes/show.html.erb +40 -0
- data/config/routes.rb +11 -82
- data/lib/generators/masks/install/install_generator.rb +35 -22
- data/lib/generators/masks/install/templates/masks.rb.tt +38 -0
- data/lib/masks/client/claims.rb +144 -0
- data/lib/masks/client/errors.rb +60 -0
- data/lib/masks/client/handshake.rb +104 -0
- data/lib/masks/client/http.rb +96 -0
- data/lib/masks/client/introspection.rb +29 -0
- data/lib/masks/client/issuer.rb +92 -0
- data/lib/masks/client/pkce.rb +27 -0
- data/lib/masks/client/rack.rb +62 -0
- data/lib/masks/client/registration.rb +115 -0
- data/lib/masks/client/registry.rb +25 -0
- data/lib/masks/client/resource.rb +92 -0
- data/lib/masks/client/session.rb +146 -0
- data/lib/masks/client/stores.rb +40 -0
- data/lib/masks/client/tokens.rb +70 -0
- data/lib/masks/client/tracker.rb +122 -0
- data/lib/masks/client/verifier.rb +42 -0
- data/lib/masks/client.rb +51 -0
- data/lib/masks/rails/authentication.rb +260 -0
- data/lib/masks/rails/configurable.rb +11 -0
- data/lib/masks/rails/configuration.rb +184 -0
- data/lib/masks/rails/credentials.rb +60 -0
- data/lib/masks/rails/engine.rb +20 -0
- data/lib/masks/rails/protected_resource.rb +51 -0
- data/lib/masks/rails.rb +10 -0
- data/lib/masks/version.rb +1 -3
- data/lib/masks.rb +3 -183
- metadata +48 -416
- data/MIT-LICENSE +0 -20
- data/Rakefile +0 -11
- data/app/assets/builds/masks/application.css +0 -1
- data/app/assets/builds/masks/application.js +0 -8549
- data/app/assets/builds/masks/application.js.map +0 -7
- data/app/assets/images/masks.png +0 -0
- data/app/assets/javascripts/application.js +0 -2
- data/app/assets/javascripts/controllers/application.js +0 -9
- data/app/assets/javascripts/controllers/emails_controller.js +0 -28
- data/app/assets/javascripts/controllers/index.js +0 -21
- data/app/assets/javascripts/controllers/keys_controller.js +0 -20
- data/app/assets/javascripts/controllers/recover_controller.js +0 -21
- data/app/assets/javascripts/controllers/recover_password_controller.js +0 -21
- data/app/assets/javascripts/controllers/session_controller.js +0 -94
- data/app/assets/javascripts/controllers/table_controller.js +0 -15
- data/app/assets/manifest.js +0 -2
- data/app/assets/masks_manifest.js +0 -2
- data/app/assets/stylesheets/application.css +0 -34
- data/app/controllers/concerns/masks/controller.rb +0 -114
- data/app/controllers/masks/actors_controller.rb +0 -15
- data/app/controllers/masks/application_controller.rb +0 -35
- data/app/controllers/masks/backup_codes_controller.rb +0 -34
- data/app/controllers/masks/debug_controller.rb +0 -9
- data/app/controllers/masks/devices_controller.rb +0 -20
- data/app/controllers/masks/emails_controller.rb +0 -60
- data/app/controllers/masks/error_controller.rb +0 -14
- data/app/controllers/masks/keys_controller.rb +0 -45
- data/app/controllers/masks/manage/actors_controller.rb +0 -83
- data/app/controllers/masks/manage/base_controller.rb +0 -20
- data/app/controllers/masks/manage/clients_controller.rb +0 -84
- data/app/controllers/masks/manage/dashboard_controller.rb +0 -15
- data/app/controllers/masks/manage/devices_controller.rb +0 -19
- data/app/controllers/masks/one_time_code_controller.rb +0 -49
- data/app/controllers/masks/openid/authorizations_controller.rb +0 -45
- data/app/controllers/masks/openid/discoveries_controller.rb +0 -55
- data/app/controllers/masks/openid/tokens_controller.rb +0 -45
- data/app/controllers/masks/openid/userinfo_controller.rb +0 -28
- data/app/controllers/masks/passwords_controller.rb +0 -33
- data/app/controllers/masks/recoveries_controller.rb +0 -43
- data/app/controllers/masks/sessions_controller.rb +0 -53
- data/app/helpers/masks/application_helper.rb +0 -49
- data/app/jobs/masks/application_job.rb +0 -7
- data/app/jobs/masks/expire_actors_job.rb +0 -15
- data/app/jobs/masks/expire_recoveries_job.rb +0 -15
- data/app/mailers/masks/actor_mailer.rb +0 -22
- data/app/mailers/masks/application_mailer.rb +0 -15
- data/app/models/concerns/masks/access.rb +0 -162
- data/app/models/concerns/masks/actor.rb +0 -132
- data/app/models/concerns/masks/adapter.rb +0 -68
- data/app/models/concerns/masks/role.rb +0 -9
- data/app/models/concerns/masks/scoped.rb +0 -54
- data/app/models/masks/access/actor_password.rb +0 -21
- data/app/models/masks/access/actor_scopes.rb +0 -18
- data/app/models/masks/access/actor_signup.rb +0 -21
- data/app/models/masks/actors/anonymous.rb +0 -40
- data/app/models/masks/actors/system.rb +0 -24
- data/app/models/masks/adapters/active_record.rb +0 -85
- data/app/models/masks/application_model.rb +0 -15
- data/app/models/masks/application_record.rb +0 -8
- data/app/models/masks/check.rb +0 -192
- data/app/models/masks/credential.rb +0 -166
- data/app/models/masks/credentials/access_token.rb +0 -60
- data/app/models/masks/credentials/backup_code.rb +0 -30
- data/app/models/masks/credentials/device.rb +0 -59
- data/app/models/masks/credentials/email.rb +0 -48
- data/app/models/masks/credentials/factor2.rb +0 -71
- data/app/models/masks/credentials/key.rb +0 -38
- data/app/models/masks/credentials/last_login.rb +0 -12
- data/app/models/masks/credentials/masquerade.rb +0 -32
- data/app/models/masks/credentials/nickname.rb +0 -63
- data/app/models/masks/credentials/one_time_code.rb +0 -34
- data/app/models/masks/credentials/password.rb +0 -28
- data/app/models/masks/credentials/recovery.rb +0 -71
- data/app/models/masks/credentials/return_to.rb +0 -27
- data/app/models/masks/credentials/session.rb +0 -67
- data/app/models/masks/device.rb +0 -30
- data/app/models/masks/error.rb +0 -51
- data/app/models/masks/event.rb +0 -14
- data/app/models/masks/mask.rb +0 -266
- data/app/models/masks/openid/authorization.rb +0 -116
- data/app/models/masks/openid/token.rb +0 -56
- data/app/models/masks/rails/actor.rb +0 -212
- data/app/models/masks/rails/actor_role.rb +0 -12
- data/app/models/masks/rails/device.rb +0 -47
- data/app/models/masks/rails/email.rb +0 -96
- data/app/models/masks/rails/key.rb +0 -61
- data/app/models/masks/rails/openid/access_token.rb +0 -55
- data/app/models/masks/rails/openid/authorization.rb +0 -45
- data/app/models/masks/rails/openid/client.rb +0 -186
- data/app/models/masks/rails/openid/id_token.rb +0 -43
- data/app/models/masks/rails/recovery.rb +0 -116
- data/app/models/masks/rails/role.rb +0 -20
- data/app/models/masks/rails/scope.rb +0 -15
- data/app/models/masks/session.rb +0 -447
- data/app/models/masks/sessions/access.rb +0 -27
- data/app/models/masks/sessions/inline.rb +0 -16
- data/app/models/masks/sessions/request.rb +0 -42
- data/app/resources/masks/actor_resource.rb +0 -9
- data/app/resources/masks/session_resource.rb +0 -15
- data/app/views/layouts/masks/application.html.erb +0 -17
- data/app/views/layouts/masks/mailer.html.erb +0 -17
- data/app/views/layouts/masks/mailer.text.erb +0 -1
- data/app/views/layouts/masks/manage.html.erb +0 -42
- data/app/views/masks/actor_mailer/recover_credentials.html.erb +0 -32
- data/app/views/masks/actor_mailer/recover_credentials.text.erb +0 -1
- data/app/views/masks/actor_mailer/verify_email.html.erb +0 -33
- data/app/views/masks/actor_mailer/verify_email.text.erb +0 -8
- data/app/views/masks/actors/current.html.erb +0 -145
- data/app/views/masks/application/_header.html.erb +0 -30
- data/app/views/masks/backup_codes/new.html.erb +0 -117
- data/app/views/masks/emails/new.html.erb +0 -109
- data/app/views/masks/emails/verify.html.erb +0 -51
- data/app/views/masks/keys/new.html.erb +0 -127
- data/app/views/masks/manage/actors/index.html.erb +0 -104
- data/app/views/masks/manage/actors/show.html.erb +0 -172
- data/app/views/masks/manage/clients/index.html.erb +0 -102
- data/app/views/masks/manage/clients/show.html.erb +0 -156
- data/app/views/masks/manage/dashboard/index.html.erb +0 -10
- data/app/views/masks/manage/devices/index.html.erb +0 -47
- data/app/views/masks/one_time_code/new.html.erb +0 -167
- data/app/views/masks/openid/authorizations/error.html.erb +0 -23
- data/app/views/masks/openid/authorizations/new.html.erb +0 -46
- data/app/views/masks/passwords/edit.html.erb +0 -71
- data/app/views/masks/recoveries/new.html.erb +0 -69
- data/app/views/masks/recoveries/password.html.erb +0 -63
- data/app/views/masks/sessions/new.html.erb +0 -152
- data/config/brakeman.ignore +0 -28
- data/config/initializers/inflections.rb +0 -5
- data/config/locales/en.yml +0 -307
- data/db/migrate/20231205173845_create_actors.rb +0 -94
- data/db/migrate/20240329182422_support_openid.rb +0 -64
- data/lib/generators/masks/install/USAGE +0 -8
- data/lib/generators/masks/install/templates/initializer.rb +0 -5
- data/lib/generators/masks/install/templates/masks.json +0 -9
- data/lib/masks/configuration.rb +0 -249
- data/lib/masks/engine.rb +0 -25
- data/lib/masks/middleware.rb +0 -70
- data/lib/tasks/masks_tasks.rake +0 -72
- 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,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
|