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,33 +0,0 @@
|
|
|
1
|
-
<div class="flex flex-col gap-4">
|
|
2
|
-
<div role="alert" class="flex gap-4 items-center">
|
|
3
|
-
<%= t(".subheading") %>
|
|
4
|
-
</div>
|
|
5
|
-
<div class="card bg-neutral">
|
|
6
|
-
<div class="p-5">
|
|
7
|
-
<div class="flex items-center gap-4">
|
|
8
|
-
<div class="flex-grow flex flex-col">
|
|
9
|
-
<span class="font-mono font-bold">
|
|
10
|
-
<%= @email.email %>
|
|
11
|
-
</span>
|
|
12
|
-
<span class="text-xs">
|
|
13
|
-
<%= t(".added") %>
|
|
14
|
-
<%= @email.created_at.strftime("on %B%e, %Y") %>
|
|
15
|
-
</span>
|
|
16
|
-
</div>
|
|
17
|
-
<a
|
|
18
|
-
role="button"
|
|
19
|
-
href="<%= email_verify_url(email: @email, approve: true) %>"
|
|
20
|
-
class="btn">
|
|
21
|
-
<%= lucide_icon("mail-check", class: "stroke-success") %>
|
|
22
|
-
<%= t(".verify") %>
|
|
23
|
-
</a>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
<div>
|
|
28
|
-
<%= t(".call_to_action") %>
|
|
29
|
-
</div>
|
|
30
|
-
<div>
|
|
31
|
-
<%= t(".sign_off") %>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
<div class="space-y-3">
|
|
2
|
-
<div class="join join-vertical w-full">
|
|
3
|
-
<div class="join-item alert bg-neutral flex items-center rounded-box">
|
|
4
|
-
<%= lucide_icon("user") %>
|
|
5
|
-
<div class="flex items-center gap-4 text-left w-full">
|
|
6
|
-
<div class="flex flex-col flex-grow">
|
|
7
|
-
<span class="font-bold">
|
|
8
|
-
<%= @actor.nickname %>
|
|
9
|
-
</span>
|
|
10
|
-
|
|
11
|
-
<span class="text-xs">
|
|
12
|
-
<% if @actor.last_login_at %>
|
|
13
|
-
<%= t(".last_login") %>
|
|
14
|
-
<%= time_ago_in_words(@actor.last_login_at) %> <%= t('.ago') %>…
|
|
15
|
-
<% else %>
|
|
16
|
-
<%= t(".created") %>
|
|
17
|
-
<%= time_ago_in_words(@actor.created_at) %> <%= t('.ago') %>…
|
|
18
|
-
<% end %>
|
|
19
|
-
</span>
|
|
20
|
-
</div>
|
|
21
|
-
|
|
22
|
-
<ul class="menu menu-horizontal p-0">
|
|
23
|
-
<li>
|
|
24
|
-
<details>
|
|
25
|
-
<summary class="font-bold">manage</summary>
|
|
26
|
-
<ul>
|
|
27
|
-
<li>
|
|
28
|
-
<%= form_with url: session_path, method: :delete do |form| %>
|
|
29
|
-
<%= form.submit t(".logout") %>
|
|
30
|
-
<% end %>
|
|
31
|
-
</li>
|
|
32
|
-
</ul>
|
|
33
|
-
</details>
|
|
34
|
-
</li>
|
|
35
|
-
</ul>
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<div class="join-item alert text-left flex items-center gap-4 <%= @actor.emails.any? ? 'bg-neutral' : 'bg-base-100' %>">
|
|
40
|
-
<%= lucide_icon("mail") %>
|
|
41
|
-
<span class="flex-grow">
|
|
42
|
-
<%= t(
|
|
43
|
-
".emails",
|
|
44
|
-
count: @actor.email_addresses.length,
|
|
45
|
-
email: @actor.email_addresses[0],
|
|
46
|
-
) %>
|
|
47
|
-
</span>
|
|
48
|
-
|
|
49
|
-
<a href="<%= emails_path %>" class="btn btn-sm btn-ghost hover:btn-info">
|
|
50
|
-
<%= t(@actor.emails.empty? ? ".add_email" : ".add_more_email") %>
|
|
51
|
-
</a>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
<div class="divider text-xs">
|
|
56
|
-
<%= t(".credentials") %>
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
<div class="alert text-left bg-neutral flex items-center gap-4">
|
|
60
|
-
<%= lucide_icon("check-circle-2", class: "stroke-success") %>
|
|
61
|
-
|
|
62
|
-
<span class="flex-grow">
|
|
63
|
-
<%= t(".password") %>
|
|
64
|
-
</span>
|
|
65
|
-
<a
|
|
66
|
-
href="<%= password_path %>"
|
|
67
|
-
class="btn btn-sm btn-ghost hover:btn-secondary">
|
|
68
|
-
<%= t(".change") %>
|
|
69
|
-
</a>
|
|
70
|
-
</div>
|
|
71
|
-
|
|
72
|
-
<div class="alert text-left flex items-center gap-4 <%= @actor.totp_secret ? 'bg-neutral' : 'bg-base-100' %>">
|
|
73
|
-
<% if @actor.totp_secret %>
|
|
74
|
-
<%= lucide_icon("check-circle-2", class: "stroke-success") %>
|
|
75
|
-
<% else %>
|
|
76
|
-
<%= lucide_icon("minus-circle") %>
|
|
77
|
-
<% end %>
|
|
78
|
-
|
|
79
|
-
<span class="flex-grow">
|
|
80
|
-
<%= t(".one_time_codes") %>
|
|
81
|
-
</span>
|
|
82
|
-
<a
|
|
83
|
-
href="<%= one_time_codes_path %>"
|
|
84
|
-
class="btn btn-sm btn-ghost hover:btn-secondary">
|
|
85
|
-
<%= @actor.totp_secret ? t(".manage") : t(".enable") %>
|
|
86
|
-
</a>
|
|
87
|
-
</div>
|
|
88
|
-
|
|
89
|
-
<% if @actor.factor2? %>
|
|
90
|
-
<div
|
|
91
|
-
class="alert text-left flex items-center gap-4 <%= @actor.saved_backup_codes? ? 'bg-neutral' : 'bg-base-100' %>">
|
|
92
|
-
<% if @actor.saved_backup_codes? %>
|
|
93
|
-
<%= lucide_icon("check-circle-2", class: "stroke-success") %>
|
|
94
|
-
<% else %>
|
|
95
|
-
<%= lucide_icon("minus-circle") %>
|
|
96
|
-
<% end %>
|
|
97
|
-
<span class="flex-grow">
|
|
98
|
-
<%= t(".backup_codes") %>
|
|
99
|
-
</span>
|
|
100
|
-
<a
|
|
101
|
-
href="<%= backup_codes_path %>"
|
|
102
|
-
class="btn btn-sm btn-ghost hover:btn-secondary">
|
|
103
|
-
<%= @actor.saved_backup_codes? ? t(".manage") : t(".enable") %>
|
|
104
|
-
</a>
|
|
105
|
-
</div>
|
|
106
|
-
<% end %>
|
|
107
|
-
|
|
108
|
-
<div
|
|
109
|
-
class="alert text-left flex items-center gap-4 <%= @actor.keys.any? ? 'bg-neutral' : 'bg-base-100' %>">
|
|
110
|
-
<% if @actor.keys.any? %>
|
|
111
|
-
<%= lucide_icon("check-circle-2", class: "stroke-success") %>
|
|
112
|
-
<% else %>
|
|
113
|
-
<%= lucide_icon("minus-circle") %>
|
|
114
|
-
<% end %>
|
|
115
|
-
<span class="flex-grow">
|
|
116
|
-
<%= t(".keys") %>
|
|
117
|
-
</span>
|
|
118
|
-
<a
|
|
119
|
-
href="<%= keys_path %>"
|
|
120
|
-
class="btn btn-sm btn-ghost hover:btn-secondary">
|
|
121
|
-
<%= @actor.keys.any? ? t(".add_more_key") : t(".add_key") %>
|
|
122
|
-
</a>
|
|
123
|
-
</div>
|
|
124
|
-
|
|
125
|
-
<div class="divider text-xs"><%= t('.devices') %></div>
|
|
126
|
-
|
|
127
|
-
<% @actor.devices.each do |device| %>
|
|
128
|
-
<div class="flex items-center gap-4">
|
|
129
|
-
<%= lucide_icon(device_icon(device)) %>
|
|
130
|
-
|
|
131
|
-
<span class="flex-grow flex flex-col">
|
|
132
|
-
<span class="">
|
|
133
|
-
<%= device.name %> @ <span class="font-mono"><%= device.ip_address %></span>
|
|
134
|
-
</span>
|
|
135
|
-
<span class="text-xs">
|
|
136
|
-
<%= t('.last_accessed') %> <%= time_ago_in_words(device.accessed_at) %> <%= t('.ago') %>
|
|
137
|
-
</span>
|
|
138
|
-
</span>
|
|
139
|
-
|
|
140
|
-
<%= form_with url: device_path(key: device.key), method: :update do |form| %>
|
|
141
|
-
<%= form.submit t(".logout"), name: 'reset', class: 'btn btn-xs hover:btn-error focus:btn-error' %>
|
|
142
|
-
<% end %>
|
|
143
|
-
</div>
|
|
144
|
-
<% end %>
|
|
145
|
-
</div>
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<div class="navbar gap-2 px-1">
|
|
2
|
-
<div class="flex-1">
|
|
3
|
-
<% if @config.site_url %>
|
|
4
|
-
<a
|
|
5
|
-
href="<%= @config.site_url %>"
|
|
6
|
-
class="text-xl flex items-center gap-3 hover:underline">
|
|
7
|
-
<% if @config.site_logo %>
|
|
8
|
-
<div class="w-7 h-7 overflow-hidden">
|
|
9
|
-
<img src="<%= @config.site_logo %>">
|
|
10
|
-
</div>
|
|
11
|
-
<% else %>
|
|
12
|
-
<%= lucide_icon("lock") %>
|
|
13
|
-
<% end %>
|
|
14
|
-
<span class="font-bold">
|
|
15
|
-
<%= @config.site_name %>
|
|
16
|
-
</span>
|
|
17
|
-
</a>
|
|
18
|
-
<% else %>
|
|
19
|
-
<span class="text-2xl"><%= @config.site_name %></span>
|
|
20
|
-
<% end %>
|
|
21
|
-
</div>
|
|
22
|
-
<% if logged_in? %>
|
|
23
|
-
<span class="whitespace-nowrap text-sm italic">
|
|
24
|
-
<%= t(".logged_in") %>
|
|
25
|
-
<a href="<%= current_path %>" class="not-italic underline pl-1">
|
|
26
|
-
<%= @session.actor.nickname %>
|
|
27
|
-
</a>
|
|
28
|
-
</span>
|
|
29
|
-
<% end %>
|
|
30
|
-
</div>
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
<div>
|
|
2
|
-
<div class="flex items-center gap-4 mb-2">
|
|
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.saved_backup_codes? ? t(".enabled") : t(".disabled") %>
|
|
12
|
-
</span>
|
|
13
|
-
</span>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
|
|
17
|
-
<% if !@actor.backup_codes %>
|
|
18
|
-
<div class="card bg-neutral p-4 mt-4 mb-3 flex flex-col gap-2">
|
|
19
|
-
<span class="font-bold flex items-center gap-4">
|
|
20
|
-
<%= lucide_icon("alert-triangle", class: "stroke-warning") %>
|
|
21
|
-
<span class="text-sm font-normal">
|
|
22
|
-
<%= t(".empty_detail") %>
|
|
23
|
-
</span>
|
|
24
|
-
</span>
|
|
25
|
-
</div>
|
|
26
|
-
<% elsif @actor.should_save_backup_codes? %>
|
|
27
|
-
<div class="divider mt-2 mb-0.5"></div>
|
|
28
|
-
<div class="flex gap-3 mb-4">
|
|
29
|
-
<span class="">
|
|
30
|
-
<%= t(".save_codes") %>
|
|
31
|
-
</span>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
<div class="grid grid-cols-3 bg-base-100 p-4 my-3 mb-0 rounded-md shadow-inner">
|
|
35
|
-
<% @actor.backup_codes.each do |code, enabled| %>
|
|
36
|
-
<% if enabled %>
|
|
37
|
-
<span class="font-mono text-sm">
|
|
38
|
-
<%= code %>
|
|
39
|
-
</span>
|
|
40
|
-
<% end %>
|
|
41
|
-
<% end %>
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
<%= form_with url: backup_codes_path, method: :post, class: 'w-full' do |form| %>
|
|
45
|
-
<div class="divider my-2"></div>
|
|
46
|
-
<div class="flex items-center mb-2 gap-4">
|
|
47
|
-
<label class="flex gap-3 items-center w-full flex-grow input input-bordered" data-controller="password-visibility">
|
|
48
|
-
<%= lucide_icon("shield-check") %>
|
|
49
|
-
|
|
50
|
-
<input
|
|
51
|
-
type="password"
|
|
52
|
-
data-password-visibility-target="input"
|
|
53
|
-
spellcheck="false"
|
|
54
|
-
placeholder="<%= t('.placeholder.password') %>"
|
|
55
|
-
name="session[password]"
|
|
56
|
-
class="w-full flex-grow">
|
|
57
|
-
|
|
58
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
59
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
60
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
61
|
-
</button>
|
|
62
|
-
</label>
|
|
63
|
-
<%= form.submit t(".enable"),
|
|
64
|
-
name: "backup_codes[enable]",
|
|
65
|
-
class: "btn btn-secondary",
|
|
66
|
-
data: {
|
|
67
|
-
one_time_code_target: "submit",
|
|
68
|
-
} %>
|
|
69
|
-
</div>
|
|
70
|
-
<% end %>
|
|
71
|
-
<% else %>
|
|
72
|
-
<div class="alert bg-neutral my-4 flex items-center gap-4">
|
|
73
|
-
<%= lucide_icon("download", class: "stroke-success") %>
|
|
74
|
-
|
|
75
|
-
<span>
|
|
76
|
-
saved
|
|
77
|
-
<%= time_ago_in_words @actor.saved_backup_codes_at %>
|
|
78
|
-
ago...
|
|
79
|
-
</span>
|
|
80
|
-
</div>
|
|
81
|
-
|
|
82
|
-
<div class="join join-vertical">
|
|
83
|
-
<div class="join-item bg-base-100 flex gap-3 alert">
|
|
84
|
-
<span class="text-sm text-left">
|
|
85
|
-
<%= t(".reset_codes") %>
|
|
86
|
-
</span>
|
|
87
|
-
</div>
|
|
88
|
-
|
|
89
|
-
<%= form_with url: backup_codes_path, method: :post, class: 'w-full' do |form| %>
|
|
90
|
-
<div class="alert join-item flex items-center gap-4">
|
|
91
|
-
<label class="flex gap-3 items-center w-full flex-grow input input-bordered" data-controller="password-visibility">
|
|
92
|
-
<%= lucide_icon("shield-check") %>
|
|
93
|
-
|
|
94
|
-
<input
|
|
95
|
-
type="password"
|
|
96
|
-
data-password-visibility-target="input"
|
|
97
|
-
spellcheck="false"
|
|
98
|
-
placeholder="<%= t('.placeholder.password') %>"
|
|
99
|
-
name="session[password]"
|
|
100
|
-
class="w-full flex-grow">
|
|
101
|
-
|
|
102
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
103
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
104
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
105
|
-
</button>
|
|
106
|
-
</label>
|
|
107
|
-
<%= form.submit t(".delete"),
|
|
108
|
-
name: "backup_codes[reset]",
|
|
109
|
-
class: "btn btn-sm btn-outline hover:btn-error",
|
|
110
|
-
data: {
|
|
111
|
-
one_time_code_target: "submit",
|
|
112
|
-
} %>
|
|
113
|
-
</div>
|
|
114
|
-
<% end %>
|
|
115
|
-
</div>
|
|
116
|
-
<% end %>
|
|
117
|
-
</div>
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
<div data-controller="emails" class="-mt-2">
|
|
2
|
-
<% if !@emails.any? %>
|
|
3
|
-
<div class="card bg-neutral p-4 mt-4 mb-3 flex flex-col gap-2">
|
|
4
|
-
<span class="font-bold flex items-center gap-4">
|
|
5
|
-
<%= lucide_icon("mail-question", class: "stroke-warning") %>
|
|
6
|
-
<%= t(".no_emails", count: @emails.length) %>
|
|
7
|
-
</span>
|
|
8
|
-
<div class="text-sm">
|
|
9
|
-
<%= t(".no_emails_detail") %>
|
|
10
|
-
</div>
|
|
11
|
-
</div>
|
|
12
|
-
<% else %>
|
|
13
|
-
<div class="mt-4 flex flex-col gap-2">
|
|
14
|
-
<span class="font-bold flex items-center gap-4">
|
|
15
|
-
<%= t(".heading_new", count: @emails.length) %>
|
|
16
|
-
</span>
|
|
17
|
-
</div>
|
|
18
|
-
<% end %>
|
|
19
|
-
<% if @emails.any? %>
|
|
20
|
-
<div class="flex flex-col gap-1">
|
|
21
|
-
<% @emails.each do |email| %>
|
|
22
|
-
<div class="divider my-1"></div>
|
|
23
|
-
<div class="flex items-center gap-4">
|
|
24
|
-
<%= lucide_icon(
|
|
25
|
-
email.verified? ? "mail-check" : "mail-question",
|
|
26
|
-
class: email.verified? ? "stroke-success" : "",
|
|
27
|
-
) %>
|
|
28
|
-
<span class="flex-grow flex flex-col">
|
|
29
|
-
<span class="flex-grow font-mono">
|
|
30
|
-
<%= email.email %>
|
|
31
|
-
</span>
|
|
32
|
-
<span class="text-xs mb-1 flex items-center gap-1">
|
|
33
|
-
<% if email.verified? %>
|
|
34
|
-
<%= t(".email_verified", ago: time_ago_in_words(email.verified_at)) %>
|
|
35
|
-
<% elsif email.taken? %>
|
|
36
|
-
<%= t(".email_taken") %>
|
|
37
|
-
<% elsif email.expired? %>
|
|
38
|
-
<%= t(".expired_verification") %>
|
|
39
|
-
<%= form_with url: emails_path, method: :patch do |form| %>
|
|
40
|
-
<input type="hidden" name="email[value]" value="<%= email.email %>">
|
|
41
|
-
<button type="submit" class="underline">
|
|
42
|
-
<%= t(".resend") %>
|
|
43
|
-
</button>
|
|
44
|
-
<% end %>
|
|
45
|
-
<% else %>
|
|
46
|
-
<%= t(".pending_verification") %>
|
|
47
|
-
<% end %>
|
|
48
|
-
</span>
|
|
49
|
-
</span>
|
|
50
|
-
<%= form_with url: emails_path, method: :delete, class: 'flex items-center gap-4' do |form| %>
|
|
51
|
-
<input type="hidden" name="email[value]" value="<%= email.email %>">
|
|
52
|
-
<button type="submit">
|
|
53
|
-
<%= lucide_icon("x", class: "stroke-error") %>
|
|
54
|
-
</button>
|
|
55
|
-
<% end %>
|
|
56
|
-
</div>
|
|
57
|
-
<% end %>
|
|
58
|
-
</div>
|
|
59
|
-
<% end %>
|
|
60
|
-
<div class='divider my-2 text-xs'><%= t(".add") %></div>
|
|
61
|
-
<% if flash[:errors]&.any? %>
|
|
62
|
-
<div role="alert" class="alert mb-2">
|
|
63
|
-
<div class="flex items-center gap-4">
|
|
64
|
-
<%= lucide_icon("mail-x", class: "stroke-error") %>
|
|
65
|
-
<span><%= flash[:errors][0] %></span>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
<% end %>
|
|
69
|
-
<div class=" <%= @emails.empty? ? 'mt-2' : '' %>">
|
|
70
|
-
<%= form_with url: emails_path, method: :post, class: 'pt-2 flex flex-col gap-2', data: { emails_target: 'add' } do |form| %>
|
|
71
|
-
<label class="flex gap-4 items-center input input-bordered">
|
|
72
|
-
<%= lucide_icon("mail-plus") %>
|
|
73
|
-
<input
|
|
74
|
-
type="text"
|
|
75
|
-
data-emails-target="email"
|
|
76
|
-
data-action="emails#updateEmail"
|
|
77
|
-
placeholder="<%= t('.placeholder.email', count: @emails.length) %>"
|
|
78
|
-
name="email[value]"
|
|
79
|
-
class="w-full">
|
|
80
|
-
</label>
|
|
81
|
-
<div class="flex items-center gap-2">
|
|
82
|
-
<label class="flex gap-3 items-center w-full flex-grow input input-bordered" data-controller="password-visibility">
|
|
83
|
-
<%= lucide_icon("shield-check") %>
|
|
84
|
-
|
|
85
|
-
<input
|
|
86
|
-
type="password"
|
|
87
|
-
data-emails-target="password"
|
|
88
|
-
data-action="emails#updatePassword"
|
|
89
|
-
data-password-visibility-target="input"
|
|
90
|
-
spellcheck="false"
|
|
91
|
-
placeholder="<%= t('.placeholder.password') %>"
|
|
92
|
-
name="session[password]"
|
|
93
|
-
class="w-full flex-grow">
|
|
94
|
-
|
|
95
|
-
<button data-action="password-visibility#toggle" type="button" class="btn btn-sm btn-ghost -mr-2">
|
|
96
|
-
<span data-password-visibility-target="icon"><%= lucide_icon('eye') %></span>
|
|
97
|
-
<span data-password-visibility-target="icon" class="hidden"><%= lucide_icon('eye-off') %></span>
|
|
98
|
-
</button>
|
|
99
|
-
</label>
|
|
100
|
-
<%= form.submit t(".submit"),
|
|
101
|
-
class: "btn btn-info",
|
|
102
|
-
data: {
|
|
103
|
-
emails_target: "submit",
|
|
104
|
-
},
|
|
105
|
-
disabled: true %>
|
|
106
|
-
</div>
|
|
107
|
-
<% end %>
|
|
108
|
-
</div>
|
|
109
|
-
</div>
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<div>
|
|
2
|
-
<% if !@email || @email.expired? %>
|
|
3
|
-
<div class="alert alert-error text-error-content mb-2" role="alert">
|
|
4
|
-
<%= lucide_icon("mail-x") %>
|
|
5
|
-
<div>
|
|
6
|
-
<h3>
|
|
7
|
-
<%= t(".verification_expired") %>
|
|
8
|
-
</h3>
|
|
9
|
-
<h3 class="flex items-center gap-4 text-xs">
|
|
10
|
-
<span>
|
|
11
|
-
<a class="underline" href="<%= emails_path %>"><%= t(".emails") %></a>
|
|
12
|
-
<%= t(".manage_expired") %>
|
|
13
|
-
</span>
|
|
14
|
-
</h3>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
<% elsif @email %>
|
|
18
|
-
<div class="alert alert-success mb-2" role="alert">
|
|
19
|
-
<%= lucide_icon("mail-check") %>
|
|
20
|
-
<div>
|
|
21
|
-
<h3 class="mb-1"><span class="font-mono"><%= @email.email %></span>
|
|
22
|
-
<%= t(".verified") %>
|
|
23
|
-
</h3>
|
|
24
|
-
<h3 class="flex items-center gap-4 text-xs">
|
|
25
|
-
<span>
|
|
26
|
-
<a class="underline" href="<%= emails_path %>"><%= t(".emails") %></a>
|
|
27
|
-
<%= t(".manage") %>
|
|
28
|
-
</span>
|
|
29
|
-
</h3>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
<div class="card bg-base-100">
|
|
33
|
-
<div class="card-body">
|
|
34
|
-
<div class="card-title">
|
|
35
|
-
<%= t(".card_title") %>
|
|
36
|
-
</div>
|
|
37
|
-
<div>
|
|
38
|
-
<p class="mb-4 text-sm flex items-center gap-3">
|
|
39
|
-
<%= t(".details") %>
|
|
40
|
-
</p>
|
|
41
|
-
<ul class="text-sm list-disc pl-4 space-y-2 mb-4">
|
|
42
|
-
<%= t(".list_html") %>
|
|
43
|
-
</ul>
|
|
44
|
-
<p class="text-sm">
|
|
45
|
-
<%= t(".privacy") %>
|
|
46
|
-
</p>
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
</div>
|
|
50
|
-
<% end %>
|
|
51
|
-
</div>
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
<div data-controller="keys">
|
|
2
|
-
<div class="flex items-center gap-4 mb-4">
|
|
3
|
-
<div class="flex flex-col">
|
|
4
|
-
<h3 class="font-bold">
|
|
5
|
-
<%= t(".heading") %>
|
|
6
|
-
</h3>
|
|
7
|
-
<span class="text-xs">
|
|
8
|
-
<%= t(".added") %>
|
|
9
|
-
</span>
|
|
10
|
-
</div>
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
<% if flash[:key] %>
|
|
14
|
-
<div role="alert" class="alert alert-success shadow-lg mb-4 flex items-center gap-4 text-left">
|
|
15
|
-
<%= lucide_icon('check') %>
|
|
16
|
-
<div>
|
|
17
|
-
<h3 class="font-bold">created "<%= flash[:key]['name'] %>"</h3>
|
|
18
|
-
<div class="text-xs">keep the secret somewhere safe:<br><span class="font-mono"><%= flash[:key]['secret'] %></span></div>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
<% elsif flash[:notice] %>
|
|
22
|
-
<div class="alert alert-info shadow-lg mb-4 flex items-center gap-4 text-left">
|
|
23
|
-
<%= lucide_icon('info') %>
|
|
24
|
-
<span>
|
|
25
|
-
<%= flash[:notice] %>
|
|
26
|
-
</span>
|
|
27
|
-
</div>
|
|
28
|
-
<% elsif flash[:error] %>
|
|
29
|
-
<div class="alert alert-error shadow-lg mb-4 flex items-center gap-2 text-left">
|
|
30
|
-
<%= lucide_icon('x-circle') %>
|
|
31
|
-
<span>
|
|
32
|
-
<%= flash[:error] %>
|
|
33
|
-
</span>
|
|
34
|
-
</div>
|
|
35
|
-
<% end %>
|
|
36
|
-
|
|
37
|
-
<%= form_with(url: keys_path, method: :post, class: 'join join-vertical w-full') do |form| %>
|
|
38
|
-
<div class="p-4 bg-base-100 join-item rounded-xl flex gap-3 items-center max-w-full">
|
|
39
|
-
<div class="w-4 h-4 flex items-center">
|
|
40
|
-
<%= lucide_icon('key') %>
|
|
41
|
-
</div>
|
|
42
|
-
|
|
43
|
-
<input type="text" name="key[name]" placeholder="<%= t('.placeholder.name') %>" class="input input-bordered input-sm w-full">
|
|
44
|
-
|
|
45
|
-
<button class="w-4 h-4 flex items-center" data-action="keys#toggleSettings">
|
|
46
|
-
<%= lucide_icon('settings-2') %>
|
|
47
|
-
</button>
|
|
48
|
-
|
|
49
|
-
<%= form.submit t('.add'), class: 'btn btn-sm' %>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
<div class="bg-base-200 join-item p-4 max-h-[260px] overflow-auto <%= @actor.keys.any? ? 'hidden' : '' %>" data-keys-target="settings">
|
|
53
|
-
<div class="font-bold text-sm mb-2">
|
|
54
|
-
secret
|
|
55
|
-
</div>
|
|
56
|
-
<input type="password" name="key[secret]" placeholder="<%= t('.placeholder.secret') %>" class="input input-bordered input-sm w-full">
|
|
57
|
-
|
|
58
|
-
<% if @actor.scopes.any? %>
|
|
59
|
-
<div class="font-bold text-sm my-4 mb-2">
|
|
60
|
-
scopes
|
|
61
|
-
</div>
|
|
62
|
-
<% @actor.scopes.each do |scope| %>
|
|
63
|
-
<div class="form-control w-full">
|
|
64
|
-
<label class="cursor-pointer label">
|
|
65
|
-
<span class="label-text font-mono"><%= scope %></span>
|
|
66
|
-
<input type="checkbox" class="toggle toggle-success toggle-sm" name="key[scopes][]" value="<%= scope %>">
|
|
67
|
-
</label>
|
|
68
|
-
</div>
|
|
69
|
-
<% end %>
|
|
70
|
-
<% end %>
|
|
71
|
-
</div>
|
|
72
|
-
<% end %>
|
|
73
|
-
|
|
74
|
-
<% if @actor.keys.any? %>
|
|
75
|
-
<div class="">
|
|
76
|
-
<table class="table">
|
|
77
|
-
<tbody>
|
|
78
|
-
<% @actor.keys.latest.each do |key| %>
|
|
79
|
-
<tr>
|
|
80
|
-
<td>
|
|
81
|
-
<div class="dropdown dropdown-start mr-1">
|
|
82
|
-
<div tabindex="0" role="button flex items-center gap-1">
|
|
83
|
-
<span class="inline-block underline decoration-wavy truncate md:max-w-full max-w-[150px] cursor-help"><%= key.name %></span>
|
|
84
|
-
|
|
85
|
-
<% if key.scopes&.any? %>
|
|
86
|
-
<span class="inline-block text-xs">(<%= key.scopes.length %>)</span>
|
|
87
|
-
<% end %>
|
|
88
|
-
</div>
|
|
89
|
-
<div tabindex="0" class="card compact dropdown-content z-[1] shadow bg-base-100 rounded-box">
|
|
90
|
-
<div tabindex="0" class="card-body">
|
|
91
|
-
<% if key.scopes&.any? %>
|
|
92
|
-
<p class="font-bold text-sm mb-2">scopes</p>
|
|
93
|
-
|
|
94
|
-
<ul class="text-left">
|
|
95
|
-
<% key.scopes.each do |scope| %>
|
|
96
|
-
<li class="font-mono"><%= scope %></li>
|
|
97
|
-
<% end %>
|
|
98
|
-
</ul>
|
|
99
|
-
<div class="divider my-0"></div>
|
|
100
|
-
<% end %>
|
|
101
|
-
|
|
102
|
-
<h2 class="whitespace-nowrap card-title font-normal italic text-sm">created <%= time_ago_in_words(key.created_at) %> ago</h2>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
106
|
-
</td>
|
|
107
|
-
<td class="w-full whitespace-nowrap">
|
|
108
|
-
<span class="text-xs"><%= time_ago_in_words(key.created_at) %> ago</span>
|
|
109
|
-
</td>
|
|
110
|
-
<td class="whitespace-nowrap">
|
|
111
|
-
<%= form_with(url: keys_path, method: :delete) do |form| %>
|
|
112
|
-
<input type="hidden" name="id" value="<%= key.id %>">
|
|
113
|
-
|
|
114
|
-
<button class="btn btn-circle btn-ghost btn-xs" type="submit">
|
|
115
|
-
<span class="flex items-center w-4 h-4">
|
|
116
|
-
<%= lucide_icon('trash-2') %>
|
|
117
|
-
</span>
|
|
118
|
-
</button>
|
|
119
|
-
<% end %>
|
|
120
|
-
</td>
|
|
121
|
-
</tr>
|
|
122
|
-
<% end %>
|
|
123
|
-
</tbody>
|
|
124
|
-
</table>
|
|
125
|
-
</div>
|
|
126
|
-
<% end %>
|
|
127
|
-
</div>
|