masks 0.4.0 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/LICENSE +21 -0
- data/README.md +215 -29
- data/app/controllers/masks/rails/base_controller.rb +13 -0
- data/app/controllers/masks/rails/handshakes_controller.rb +87 -0
- data/app/controllers/masks/rails/sessions_controller.rb +113 -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 +10 -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 +103 -0
- data/lib/masks/client/errors.rb +52 -0
- data/lib/masks/client/handshake.rb +104 -0
- data/lib/masks/client/http.rb +81 -0
- data/lib/masks/client/introspection.rb +29 -0
- data/lib/masks/client/issuer.rb +76 -0
- data/lib/masks/client/pkce.rb +27 -0
- data/lib/masks/client/rack.rb +62 -0
- data/lib/masks/client/registration.rb +91 -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 +217 -0
- data/lib/masks/rails/configurable.rb +11 -0
- data/lib/masks/rails/configuration.rb +172 -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 +47 -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,167 +0,0 @@
|
|
|
1
|
-
<div data-controller="one_time_code">
|
|
2
|
-
<div class="flex items-center gap-4">
|
|
3
|
-
<div class="flex flex-col">
|
|
4
|
-
<h3 class="font-bold">
|
|
5
|
-
<%= t(".heading") %>
|
|
6
|
-
</h3>
|
|
7
|
-
<span class="text-xs">
|
|
8
|
-
<%= t(".tfa") %>
|
|
9
|
-
—
|
|
10
|
-
<span class="italic">
|
|
11
|
-
<%= @actor.totp_secret ? t(".enabled") : t(".disabled") %>
|
|
12
|
-
</span>
|
|
13
|
-
</span>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
|
-
<% if !@actor.totp_secret %>
|
|
18
|
-
<div class='divider my-2 mb-4'></div>
|
|
19
|
-
<div class="">
|
|
20
|
-
<div>
|
|
21
|
-
<div class="flex gap-4 mb-3">
|
|
22
|
-
<div class="w-[125px] h-[125px] overflow-hidden">
|
|
23
|
-
<%= totp_svg(@actor.totp_uri, module_size: 2.25, fill: "fff", offset: 5) %>
|
|
24
|
-
</div>
|
|
25
|
-
<div class="max-w-[175px] max-w-[250px] space-y-3 mb-2">
|
|
26
|
-
<div>
|
|
27
|
-
<%= t(".enable_qr") %>
|
|
28
|
-
</div>
|
|
29
|
-
<div class="text-sm">
|
|
30
|
-
<%= t(".enable_manual") %>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
|
|
35
|
-
<div class="text-sm flex items-center gap-3 mt-3">
|
|
36
|
-
<span class="font-bold text-xs">
|
|
37
|
-
<%= t(".secret") %>
|
|
38
|
-
</span>
|
|
39
|
-
<span class="flex-grow">
|
|
40
|
-
<input
|
|
41
|
-
class="input input-xs w-full"
|
|
42
|
-
name="secret"
|
|
43
|
-
value="<%= @actor.random_totp_secret %>">
|
|
44
|
-
</span>
|
|
45
|
-
</div>
|
|
46
|
-
<div class='divider mt-3 mb-2 text-xs'></div>
|
|
47
|
-
</div>
|
|
48
|
-
<div class="mb-4 flex items-center">
|
|
49
|
-
next, enter your password and the one-time code shown in your
|
|
50
|
-
authenticator app.
|
|
51
|
-
</div>
|
|
52
|
-
|
|
53
|
-
<% if flash[:errors]&.any? %>
|
|
54
|
-
<div role="alert" class="alert mb-2">
|
|
55
|
-
<div class="flex items-center gap-4">
|
|
56
|
-
<%= lucide_icon("x", class: "stroke-error") %>
|
|
57
|
-
<span><%= flash[:errors][0] %></span>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
<% end %>
|
|
61
|
-
|
|
62
|
-
<%= form_with url: one_time_code_path, method: :post, class: 'pt-2 flex flex-col gap-2', data: { one_time_code_target: 'add' } do |form| %>
|
|
63
|
-
<input
|
|
64
|
-
type="hidden"
|
|
65
|
-
name="one_time_code[secret]"
|
|
66
|
-
value="<%= @actor.random_totp_secret %>">
|
|
67
|
-
<label class="flex gap-3 items-center w-full flex-grow input input-bordered" data-controller="password-visibility">
|
|
68
|
-
<%= lucide_icon("shield-check") %>
|
|
69
|
-
|
|
70
|
-
<input
|
|
71
|
-
type="password"
|
|
72
|
-
data-one-time-password-target="password"
|
|
73
|
-
data-action="one_time_code#updatePassword"
|
|
74
|
-
data-password-visibility-target="input"
|
|
75
|
-
spellcheck="false"
|
|
76
|
-
placeholder="<%= t('.placeholder.password') %>"
|
|
77
|
-
name="session[password]"
|
|
78
|
-
class="w-full flex-grow">
|
|
79
|
-
|
|
80
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
81
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
82
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
83
|
-
</button>
|
|
84
|
-
</label>
|
|
85
|
-
<div class="flex items-center gap-2">
|
|
86
|
-
<label class="flex gap-3 items-center input input-bordered flex-grow" data-controller="password-visibility">
|
|
87
|
-
<%= lucide_icon("key-square") %>
|
|
88
|
-
|
|
89
|
-
<input
|
|
90
|
-
type="password"
|
|
91
|
-
data-one-time-password-target="code"
|
|
92
|
-
data-action="one_time_code#updateCode"
|
|
93
|
-
placeholder="<%= t('.placeholder.otp') %>"
|
|
94
|
-
data-password-visibility-target="input"
|
|
95
|
-
spellcheck="false"
|
|
96
|
-
name="one_time_code[code]"
|
|
97
|
-
class="w-full flex-grow">
|
|
98
|
-
|
|
99
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
100
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
101
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
102
|
-
</button>
|
|
103
|
-
</label>
|
|
104
|
-
<%= form.submit t(".submit"),
|
|
105
|
-
class: "btn btn-secondary",
|
|
106
|
-
data: {
|
|
107
|
-
one_time_code_target: "submit",
|
|
108
|
-
} %>
|
|
109
|
-
</div>
|
|
110
|
-
<% end %>
|
|
111
|
-
</div>
|
|
112
|
-
<% else %>
|
|
113
|
-
<div class="join join-vertical">
|
|
114
|
-
<div class="join-item alert bg-neutral mt-4">
|
|
115
|
-
<%= lucide_icon("check", class: "stroke-success") %>
|
|
116
|
-
<h3>
|
|
117
|
-
after login you will be asked to enter a one-time code, a backup
|
|
118
|
-
code, or use a different secondary credential.
|
|
119
|
-
</h3>
|
|
120
|
-
</div>
|
|
121
|
-
<div
|
|
122
|
-
class="join-item card bg-base-100 pt-2 pb-3 px-4 w-full text-right"
|
|
123
|
-
role="alert">
|
|
124
|
-
<a href="<%= backup_codes_path %>" class="text-sm underline">
|
|
125
|
-
<%= t(@actor.should_save_backup_codes? ? ".backup_codes" : ".reset_codes") %>
|
|
126
|
-
</a>
|
|
127
|
-
</div>
|
|
128
|
-
</div>
|
|
129
|
-
|
|
130
|
-
<div class='divider my-4 text-xs'><%= t(".delete_div") %></div>
|
|
131
|
-
|
|
132
|
-
<%= form_with url: one_time_code_path, method: :delete, class: '', data: { one_time_code_target: 'add' } do |form| %>
|
|
133
|
-
<input
|
|
134
|
-
type="hidden"
|
|
135
|
-
name="one_time_code[secret]"
|
|
136
|
-
value="<%= @actor.random_totp_secret %>">
|
|
137
|
-
|
|
138
|
-
<div class="flex gap-2">
|
|
139
|
-
<label class="flex gap-3 items-center flex-grow input input-sm input-bordered" data-controller="password-visibility">
|
|
140
|
-
<%= lucide_icon("shield-check") %>
|
|
141
|
-
<input
|
|
142
|
-
type="password"
|
|
143
|
-
data-one-time-password-target="password"
|
|
144
|
-
data-action="one_time_code#updatePassword"
|
|
145
|
-
data-password-visibility-target="input"
|
|
146
|
-
spellcheck="false"
|
|
147
|
-
placeholder="<%= t('.placeholder.delete') %>"
|
|
148
|
-
name="session[password]"
|
|
149
|
-
class="w-full flex-grow">
|
|
150
|
-
|
|
151
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-xs btn-ghost -mr-2">
|
|
152
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye', size: 16) %></span>
|
|
153
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off', size: 16) %></span>
|
|
154
|
-
</button>
|
|
155
|
-
</label>
|
|
156
|
-
|
|
157
|
-
<div>
|
|
158
|
-
<%= form.submit t(".delete"),
|
|
159
|
-
class: "btn hover:btn-error btn-outline btn-sm",
|
|
160
|
-
data: {
|
|
161
|
-
one_time_code_target: "submit",
|
|
162
|
-
} %>
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
165
|
-
<% end %>
|
|
166
|
-
<% end %>
|
|
167
|
-
</div>
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<div class="hero">
|
|
2
|
-
<div class="hero-content text-left">
|
|
3
|
-
<div>
|
|
4
|
-
<div class="flex items-center gap-4 mb-4 justify-center">
|
|
5
|
-
<span class="text-warning pt-1">
|
|
6
|
-
<%= lucide_icon('alert-triangle', size: 28) %>
|
|
7
|
-
</span>
|
|
8
|
-
|
|
9
|
-
<h1 class="text-3xl font-bold text-black dark:text-white">
|
|
10
|
-
<%= t('.title') %>
|
|
11
|
-
</h1>
|
|
12
|
-
</div>
|
|
13
|
-
<p class="mb-6 text-center">
|
|
14
|
-
<%= t('.description') %>
|
|
15
|
-
</p>
|
|
16
|
-
<div class="flex items-center gap-4 justify-center">
|
|
17
|
-
<a href="/" class="btn btn-primary btn-sm">
|
|
18
|
-
<%= t('.home') %>
|
|
19
|
-
</a>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
<div>
|
|
2
|
-
<%= form_with url: request.url, method: :post, data: { turbo: false } do |form| %>
|
|
3
|
-
<div class="hero">
|
|
4
|
-
<div class="hero-content text-left">
|
|
5
|
-
<div class="">
|
|
6
|
-
<h1 class="text-4xl font-bold mb-4 text-black dark:text-white">
|
|
7
|
-
<%= t(".authorize_client", name: @authorization.client.name) %>
|
|
8
|
-
</h1>
|
|
9
|
-
|
|
10
|
-
<p class="mb-4 text-left">
|
|
11
|
-
<% if @authorization.scopes.any? %>
|
|
12
|
-
<%= t('.authorize_scoped', name: @authorization.client.name) %>
|
|
13
|
-
<% else %>
|
|
14
|
-
<%= t('.authorize_account', name: @authorization.client.name) %>
|
|
15
|
-
<% end %>
|
|
16
|
-
</p>
|
|
17
|
-
|
|
18
|
-
<% if @authorization.scopes.any? %>
|
|
19
|
-
<div class="divider my-0"></div>
|
|
20
|
-
|
|
21
|
-
<table class="table">
|
|
22
|
-
<tbody>
|
|
23
|
-
<% @authorization.scopes.each do |scope| %>
|
|
24
|
-
<tr>
|
|
25
|
-
<th><%= t("scope.#{scope}_name") %></td>
|
|
26
|
-
<td>
|
|
27
|
-
<%= t("scope.#{scope}_desc") %>
|
|
28
|
-
</td>
|
|
29
|
-
</tr>
|
|
30
|
-
<% end %>
|
|
31
|
-
</tbody>
|
|
32
|
-
</table>
|
|
33
|
-
|
|
34
|
-
<div class="divider mt-0 mb-4"></div>
|
|
35
|
-
<% end %>
|
|
36
|
-
|
|
37
|
-
<div class="flex items-center gap-4 justify-center">
|
|
38
|
-
<input type="submit" name="approve" value="<%= t('.approve') %>" class="btn btn-success btn-sm">
|
|
39
|
-
<span>or</span>
|
|
40
|
-
<input type="submit" name="deny" value="<%= t('.deny') %>" class="btn btn-error btn-sm">
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
<% end %>
|
|
46
|
-
</div>
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
<div class="space-y-3">
|
|
2
|
-
<div class="flex flex-col">
|
|
3
|
-
<span class="font-bold">
|
|
4
|
-
your password
|
|
5
|
-
</span>
|
|
6
|
-
<span class="text-xs">
|
|
7
|
-
last changed
|
|
8
|
-
<% if @actor.changed_password_at %>
|
|
9
|
-
<%= time_ago_in_words(@actor.changed_password_at) %>
|
|
10
|
-
ago
|
|
11
|
-
<% else %>
|
|
12
|
-
<span class="italic">
|
|
13
|
-
never
|
|
14
|
-
</span>
|
|
15
|
-
<% end %>
|
|
16
|
-
</span>
|
|
17
|
-
</div>
|
|
18
|
-
<% if flash[:errors]&.any? %>
|
|
19
|
-
<div role="alert" class="alert mb-2">
|
|
20
|
-
<div class="flex items-center gap-4">
|
|
21
|
-
<%= lucide_icon("x", class: "stroke-error") %>
|
|
22
|
-
<span><%= flash[:errors][0] %></span>
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
|
25
|
-
<% end %>
|
|
26
|
-
|
|
27
|
-
<%= form_with url: password_path, method: :post, class: 'pt-2 flex flex-col gap-2', data: { password_target: 'add' } do |form| %>
|
|
28
|
-
<label class="flex gap-3 items-center input input-bordered" data-controller="password-visibility">
|
|
29
|
-
<%= lucide_icon("shield-plus") %>
|
|
30
|
-
<input
|
|
31
|
-
type="password"
|
|
32
|
-
data-password-target="code"
|
|
33
|
-
data-action="password#updateChanged"
|
|
34
|
-
data-password-visibility-target="input"
|
|
35
|
-
spellcheck="false"
|
|
36
|
-
placeholder="<%= t('.placeholder.change') %>"
|
|
37
|
-
name="password[change]"
|
|
38
|
-
class="w-full">
|
|
39
|
-
|
|
40
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
41
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
42
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
43
|
-
</button>
|
|
44
|
-
</label>
|
|
45
|
-
<div class="flex items-center gap-2" data-controller="password-visibility">
|
|
46
|
-
<label class="flex gap-3 items-center w-full flex-grow input input-bordered">
|
|
47
|
-
<%= lucide_icon("shield-check") %>
|
|
48
|
-
|
|
49
|
-
<input
|
|
50
|
-
type="password"
|
|
51
|
-
data-password-target="password"
|
|
52
|
-
data-action="password#updatePassword"
|
|
53
|
-
data-password-visibility-target="input"
|
|
54
|
-
spellcheck="false"
|
|
55
|
-
placeholder="<%= t('.placeholder.password') %>"
|
|
56
|
-
name="session[password]"
|
|
57
|
-
class="w-full flex-grow">
|
|
58
|
-
|
|
59
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
60
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
61
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
62
|
-
</button>
|
|
63
|
-
</label>
|
|
64
|
-
<%= form.submit t(".submit"),
|
|
65
|
-
class: "btn btn-secondary",
|
|
66
|
-
data: {
|
|
67
|
-
password_target: "submit",
|
|
68
|
-
} %>
|
|
69
|
-
</div>
|
|
70
|
-
<% end %>
|
|
71
|
-
</div>
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
<div data-controller="recover">
|
|
2
|
-
<% if flash[:recovery] %>
|
|
3
|
-
<div role="alert" class="alert alert-success shadow-lg mb-4 flex items-center gap-4 text-left">
|
|
4
|
-
<%= lucide_icon('check') %>
|
|
5
|
-
<div>
|
|
6
|
-
<h3 class="font-bold"><%= t('.submitted.heading') %></h3>
|
|
7
|
-
<div class="text-xs"><%= t('.submitted.description') %></div>
|
|
8
|
-
</div>
|
|
9
|
-
</div>
|
|
10
|
-
<% else %>
|
|
11
|
-
<div role="alert" class="alert mb-4 text-left">
|
|
12
|
-
<div class="flex flex-col">
|
|
13
|
-
<div class="flex items-center gap-4">
|
|
14
|
-
<%= lucide_icon("shield-question", class: "stroke-info") %>
|
|
15
|
-
<span class="flex-grow"><%= t(".heading") %></span>
|
|
16
|
-
<div class="dropdown dropdown-bottom dropdown-end">
|
|
17
|
-
<div tabindex="0" role="button" class="btn btn-xs text-sm -mr-2"><%= t(".help_button") %></div>
|
|
18
|
-
<div
|
|
19
|
-
tabindex="0"
|
|
20
|
-
class="
|
|
21
|
-
dropdown-content z-[1] mt-4 card card-compact w-[275px] px-2 pb-2 shadow bg-info
|
|
22
|
-
text-info-content
|
|
23
|
-
">
|
|
24
|
-
<div class="card-body">
|
|
25
|
-
<h4 class="card-title"><%= t(".help_title") %></h4>
|
|
26
|
-
<span><%= t(".help_body") %></span>
|
|
27
|
-
<% if t('.support_url', default: false) %>
|
|
28
|
-
<span class="italic">
|
|
29
|
-
<%= t(".help_more") %>
|
|
30
|
-
<a class="not-italic underline" href="<%= t('.support_url') %>"><%= t(".help_contact") %></a>
|
|
31
|
-
</span>
|
|
32
|
-
<% end %>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
37
|
-
<div class="divider my-1 -mr-4"></div>
|
|
38
|
-
<div class="text-sm -mr-2">
|
|
39
|
-
<%= t(".subheading") %>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
<% end %>
|
|
44
|
-
<%= form_with url: recover_path, method: :post do |form| %>
|
|
45
|
-
<div class="flex flex-col gap-4">
|
|
46
|
-
<label class="form-control w-full">
|
|
47
|
-
<input
|
|
48
|
-
type="text"
|
|
49
|
-
data-recover-target="input"
|
|
50
|
-
data-action="recover#updateInput"
|
|
51
|
-
placeholder="<%= t('.placeholder') %>"
|
|
52
|
-
name="recover[value]"
|
|
53
|
-
class="input input-bordered w-full">
|
|
54
|
-
</label>
|
|
55
|
-
<div class="flex items-center gap-4">
|
|
56
|
-
<%= form.submit t(".submit"),
|
|
57
|
-
class: "btn btn-active btn-info",
|
|
58
|
-
data: {
|
|
59
|
-
recover_target: "submit",
|
|
60
|
-
},
|
|
61
|
-
disabled: true %>
|
|
62
|
-
<div class="text-xs opacity-60">
|
|
63
|
-
or
|
|
64
|
-
<a href="<%= Masks.configuration.site_links[:login] %>" class="underline"><%= t(".back") %></a>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
<% end %>
|
|
69
|
-
</div>
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
<% if @recovery %>
|
|
2
|
-
<div data-controller="recover-password">
|
|
3
|
-
<div role="alert" class="alert mb-4">
|
|
4
|
-
<div class="flex flex-col">
|
|
5
|
-
<div class="flex items-center gap-4">
|
|
6
|
-
<%= lucide_icon("rotate-cw", class: "stroke-warning") %>
|
|
7
|
-
<span class="flex-grow font-bold"><%= t(".heading") %></span>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="divider my-1 -mr-4"></div>
|
|
10
|
-
<div class="text-sm -mr-4">
|
|
11
|
-
<%= t(".subheading") %>
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
<% if flash[:errors]&.any? %>
|
|
16
|
-
<div role="alert" class="alert alert-error mb-4">
|
|
17
|
-
<%= lucide_icon("x") %>
|
|
18
|
-
<%= flash[:errors][0] %>
|
|
19
|
-
</div>
|
|
20
|
-
<% end %>
|
|
21
|
-
|
|
22
|
-
<%= form_with url: recover_password_path, method: :post do |form| %>
|
|
23
|
-
<div class="flex flex-col gap-4">
|
|
24
|
-
<div class="flex items-center gap-4">
|
|
25
|
-
<input type="hidden" name="token" value="<%= @recovery.token %>">
|
|
26
|
-
<input
|
|
27
|
-
type="text"
|
|
28
|
-
data-recover-password-target="password"
|
|
29
|
-
data-action="recover-password#updatePassword"
|
|
30
|
-
placeholder="<%= t('.placeholder') %>"
|
|
31
|
-
name="recover[password]"
|
|
32
|
-
class="input input-bordered w-full">
|
|
33
|
-
<%= form.submit t(".submit"),
|
|
34
|
-
class: "btn btn-warning btn-info",
|
|
35
|
-
data: {
|
|
36
|
-
recover_password_target: "submit",
|
|
37
|
-
} %>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
<% end %>
|
|
41
|
-
</div>
|
|
42
|
-
<% else %>
|
|
43
|
-
<div role="alert" class="alert mb-4">
|
|
44
|
-
<div class="flex flex-col">
|
|
45
|
-
<div class="flex items-center gap-4">
|
|
46
|
-
<%= lucide_icon(
|
|
47
|
-
flash[:reset] ? "rotate-cw" : "x",
|
|
48
|
-
class: flash[:reset] ? "stroke-success" : "stroke-error",
|
|
49
|
-
) %>
|
|
50
|
-
<span class="flex-grow font-bold"><%= flash[:reset] ? t(".heading_success") : t(".heading_expired") %></span>
|
|
51
|
-
</div>
|
|
52
|
-
<div class="divider my-1 -mr-4"></div>
|
|
53
|
-
<div class="text-sm -mr-4">
|
|
54
|
-
<%= flash[:reset] ? t(".subheading_success") : t(".subheading_expired") %>
|
|
55
|
-
</div>
|
|
56
|
-
<% if flash[:reset] %>
|
|
57
|
-
<div class="text-sm -mr-4 mt-3">
|
|
58
|
-
<a href="<%= Masks.configuration.site_links[:login] %>" class="underline"><%= t(".login") %></a>
|
|
59
|
-
</div>
|
|
60
|
-
<% end %>
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
<% end %>
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
<div data-controller="session">
|
|
2
|
-
<%= form_with url: session_path, method: :post do |form| %>
|
|
3
|
-
<div role="alert" class="alert mb-4 text-left" data-session-target="flash">
|
|
4
|
-
<% if flash[:errors]&.any? && !factor2_required? %>
|
|
5
|
-
<div class="flex items-center gap-4">
|
|
6
|
-
<%= lucide_icon("shield-x", class: "stroke-error") %>
|
|
7
|
-
<span><%= flash[:errors][0] %></span>
|
|
8
|
-
</div>
|
|
9
|
-
<% elsif logged_in? %>
|
|
10
|
-
<div class="flex items-center gap-4">
|
|
11
|
-
<%= lucide_icon("check", class: "stroke-success") %>
|
|
12
|
-
<span><%= t(".logged_in") %></span>
|
|
13
|
-
</div>
|
|
14
|
-
<% else %>
|
|
15
|
-
<div data-flash="enter-factor2" class="hidden flex items-center gap-4">
|
|
16
|
-
<%= lucide_icon("key-square", class: "stroke-warning") %>
|
|
17
|
-
<span><%= t(".enter_factor2") %></span>
|
|
18
|
-
</div>
|
|
19
|
-
<div data-flash="enter-credentials" class="flex items-center gap-4">
|
|
20
|
-
<%= lucide_icon("shield-alert", class: "stroke-warning") %>
|
|
21
|
-
<span><%= t(".enter_credentials") %></span>
|
|
22
|
-
</div>
|
|
23
|
-
<div data-flash="enter-password" class="hidden flex items-center gap-4">
|
|
24
|
-
<%= lucide_icon("shield-ellipsis", class: "stroke-warning") %>
|
|
25
|
-
<span><%= t(".enter_password") %></span>
|
|
26
|
-
</div>
|
|
27
|
-
<div data-flash="continue" class="hidden flex items-center gap-4">
|
|
28
|
-
<%= lucide_icon("shield-question", class: "stroke-accent") %>
|
|
29
|
-
<span><%= t(".continue") %></span>
|
|
30
|
-
</div>
|
|
31
|
-
<% end %>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<% if factor2_required? %>
|
|
35
|
-
<div class="w-full">
|
|
36
|
-
<div role="tablist" class="tabs tabs-bordered mb-4">
|
|
37
|
-
<% if @actor.totp_secret %>
|
|
38
|
-
<input
|
|
39
|
-
checked
|
|
40
|
-
name="factor2"
|
|
41
|
-
type="radio"
|
|
42
|
-
role="tab"
|
|
43
|
-
class="tab whitespace-nowrap"
|
|
44
|
-
aria-label="<%= t('.tab.one_time_code') %>">
|
|
45
|
-
<div role="tabpanel" class="tab-content p-4 bg-base-100 rounded-b">
|
|
46
|
-
<p class="flex items-center gap-4 text-sm mb-4">
|
|
47
|
-
<%= lucide_icon("qr-code") %>
|
|
48
|
-
<%= t(".one_time_code") %>
|
|
49
|
-
</p>
|
|
50
|
-
<label class="form-control w-full">
|
|
51
|
-
<input
|
|
52
|
-
type="text"
|
|
53
|
-
data-action="session#updateCode"
|
|
54
|
-
data-session-target="oneTimeCode"
|
|
55
|
-
placeholder="<%= t('.placeholder.one_time_code') %>"
|
|
56
|
-
name="session[one_time_code]"
|
|
57
|
-
class="input input-bordered w-full">
|
|
58
|
-
</label>
|
|
59
|
-
</div>
|
|
60
|
-
<% end %>
|
|
61
|
-
|
|
62
|
-
<% if @actor.saved_backup_codes? %>
|
|
63
|
-
<input
|
|
64
|
-
type="radio"
|
|
65
|
-
name="factor2"
|
|
66
|
-
role="tab"
|
|
67
|
-
class="tab whitespace-nowrap"
|
|
68
|
-
aria-label="<%= t('.tab.backup_code') %>">
|
|
69
|
-
<div role="tabpanel" class="tab-content p-4 bg-base-100 rounded-b">
|
|
70
|
-
<p class="flex items-center gap-4 text-sm mb-4">
|
|
71
|
-
<%= lucide_icon("rotate-cw") %>
|
|
72
|
-
<%= t(".backup_code") %>
|
|
73
|
-
</p>
|
|
74
|
-
<label class="form-control w-full">
|
|
75
|
-
<input
|
|
76
|
-
type="text"
|
|
77
|
-
data-action="session#updateCode"
|
|
78
|
-
data-session-target="backupCode"
|
|
79
|
-
placeholder="<%= t('.placeholder.backup_code') %>"
|
|
80
|
-
name="session[backup_code]"
|
|
81
|
-
class="input input-bordered w-full">
|
|
82
|
-
</label>
|
|
83
|
-
</div>
|
|
84
|
-
<% end %>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
<% elsif !logged_in? %>
|
|
88
|
-
<div class="flex flex-col gap-2">
|
|
89
|
-
<label class="form-control w-full">
|
|
90
|
-
<input
|
|
91
|
-
type="text"
|
|
92
|
-
data-action="session#updateNickname"
|
|
93
|
-
data-session-target="nickname"
|
|
94
|
-
placeholder="<%= t('.placeholder.nickname') %>"
|
|
95
|
-
name="session[nickname]"
|
|
96
|
-
class="input input-bordered w-full">
|
|
97
|
-
</label>
|
|
98
|
-
<label class="form-control input input-bordered w-full flex flex-row items-center gap-2" data-controller="password-visibility">
|
|
99
|
-
<input
|
|
100
|
-
type="password"
|
|
101
|
-
data-action="session#updatePassword"
|
|
102
|
-
data-session-target="password"
|
|
103
|
-
data-password-visibility-target="input"
|
|
104
|
-
spellcheck="false"
|
|
105
|
-
placeholder="<%= t('.placeholder.password') %>"
|
|
106
|
-
name="session[password]"
|
|
107
|
-
class="flex-grow">
|
|
108
|
-
|
|
109
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
110
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
111
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
112
|
-
</button>
|
|
113
|
-
</label>
|
|
114
|
-
<% if @config.site_links[:recover] %>
|
|
115
|
-
<div class="label">
|
|
116
|
-
<span class="label-text-alt opacity-60 hover:opacity-100"><a
|
|
117
|
-
class="hover:underline"
|
|
118
|
-
href="<%= @config.site_links[:recover] %>"><%= t(".recover_credentials") %></a></span>
|
|
119
|
-
</div>
|
|
120
|
-
<% end %>
|
|
121
|
-
</div>
|
|
122
|
-
<% end %>
|
|
123
|
-
|
|
124
|
-
<% unless logged_in? %>
|
|
125
|
-
<div class="flex items-center gap-4">
|
|
126
|
-
<%= form.submit t(".submit"),
|
|
127
|
-
class: "btn btn-active",
|
|
128
|
-
data: {
|
|
129
|
-
session_target: "submit",
|
|
130
|
-
} %>
|
|
131
|
-
<div class="form-control" data-session-target="remember">
|
|
132
|
-
<label class="label cursor-pointer">
|
|
133
|
-
<input type="checkbox" name="session[remember_me]" class="toggle toggle-sm">
|
|
134
|
-
<span class="label-text pl-2"><%= t(".remember_me") %></span>
|
|
135
|
-
</label>
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
<% end %>
|
|
139
|
-
<% end %>
|
|
140
|
-
|
|
141
|
-
<% if factor2_required? %>
|
|
142
|
-
<div class="mt-2 opacity-60 hover:opacity-100">
|
|
143
|
-
<%= form_with url: session_path, method: :delete do |form| %>
|
|
144
|
-
<span class="text-xs">
|
|
145
|
-
<%= t(".start_over.text") %>
|
|
146
|
-
<%= form.submit t(".start_over.link"), class: "cursor-pointer underline" %>
|
|
147
|
-
</span>
|
|
148
|
-
|
|
149
|
-
<% end %>
|
|
150
|
-
</div>
|
|
151
|
-
<% end %>
|
|
152
|
-
</div>
|
data/config/brakeman.ignore
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"ignored_warnings": [
|
|
3
|
-
{
|
|
4
|
-
"warning_type": "Cross-Site Request Forgery",
|
|
5
|
-
"warning_code": 7,
|
|
6
|
-
"fingerprint": "2c0ec97f978f7a612f1fa0567846c86ec02c072be7784e4c707fd4ba81fe5021",
|
|
7
|
-
"check_name": "ForgerySetting",
|
|
8
|
-
"message": "`protect_from_forgery` should be called in `ApplicationController`",
|
|
9
|
-
"file": "dummy/app/controllers/application_controller.rb",
|
|
10
|
-
"line": 1,
|
|
11
|
-
"link": "https://brakemanscanner.org/docs/warning_types/cross-site_request_forgery/",
|
|
12
|
-
"code": null,
|
|
13
|
-
"render_path": null,
|
|
14
|
-
"location": {
|
|
15
|
-
"type": "controller",
|
|
16
|
-
"controller": "ApplicationController"
|
|
17
|
-
},
|
|
18
|
-
"user_input": null,
|
|
19
|
-
"confidence": "High",
|
|
20
|
-
"cwe_id": [
|
|
21
|
-
352
|
|
22
|
-
],
|
|
23
|
-
"note": ""
|
|
24
|
-
}
|
|
25
|
-
],
|
|
26
|
-
"updated": "2024-02-07 16:03:41 -0500",
|
|
27
|
-
"brakeman_version": "6.1.2"
|
|
28
|
-
}
|