lato 3.5.9 → 3.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +0 -1
- data/app/assets/stylesheets/lato/application.scss +10 -0
- data/app/controllers/lato/account_controller.rb +26 -0
- data/app/controllers/lato/authentication_controller.rb +56 -8
- data/app/models/lato/user.rb +32 -1
- data/app/views/lato/account/_form-authenticator.html.erb +41 -0
- data/app/views/lato/account/index.html.erb +11 -0
- data/app/views/lato/authentication/_form-authenticator.html.erb +28 -0
- data/app/views/lato/authentication/authenticator.html.erb +10 -0
- data/app/views/lato/components/_index.html.erb +1 -1
- data/config/locales/en.yml +10 -0
- data/config/locales/it.yml +10 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20240318074025_add_authenticator_secret_to_user.rb +5 -0
- data/lib/lato/config.rb +6 -1
- data/lib/lato/version.rb +1 -1
- data/lib/lato.rb +2 -0
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b455041febf6fa0199543a3540a560dce02db7840ae8a6efc274018961b1d44
|
4
|
+
data.tar.gz: d0694e1fd297058319ddaac053256ed7fd053ca80a04cb41332e4b2dfe757b52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6d1b5d9c26e8d00013d9ca8304d893c397e0f01670a6a1a6deb502efce183d03dd9ae2c0d8c6fec689a66da6e1b4f573f363ebb3e79c5bab4e7380c8766434b
|
7
|
+
data.tar.gz: d091db10a8e2ae22476886330d068f817e5a5cad1893465a9d5d57b4fc14653624b0e6947da9debcd54b4a77c5782506df9c2273ae27ce16ee36e09b9b8546bc
|
data/README.md
CHANGED
@@ -66,6 +66,9 @@ main {
|
|
66
66
|
|
67
67
|
aside {
|
68
68
|
width: 280px;
|
69
|
+
max-height: 100vh;
|
70
|
+
position: sticky;
|
71
|
+
top: 0;
|
69
72
|
}
|
70
73
|
|
71
74
|
main, aside {
|
@@ -117,3 +120,10 @@ main, aside {
|
|
117
120
|
border-radius: 50%;
|
118
121
|
}
|
119
122
|
}
|
123
|
+
|
124
|
+
.lato-index-col-sort {
|
125
|
+
.btn {
|
126
|
+
font-size: 12px;
|
127
|
+
padding: 0.15rem 0.3rem;
|
128
|
+
}
|
129
|
+
}
|
@@ -55,6 +55,32 @@ module Lato
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
+
def update_authenticator_action
|
59
|
+
return respond_to_with_not_found unless Lato.config.authenticator_connection
|
60
|
+
|
61
|
+
if @session.user.authenticator_secret
|
62
|
+
respond_to do |format|
|
63
|
+
if @session.user.remove_authenticator_secret
|
64
|
+
format.html { redirect_to lato.account_path }
|
65
|
+
format.json { render json: @session.user }
|
66
|
+
else
|
67
|
+
format.html { render :index, status: :unprocessable_entity }
|
68
|
+
format.json { render json: @session.user.errors, status: :unprocessable_entity }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
else
|
72
|
+
respond_to do |format|
|
73
|
+
if @session.user.generate_authenticator_secret
|
74
|
+
format.html { redirect_to lato.account_path }
|
75
|
+
format.json { render json: @session.user }
|
76
|
+
else
|
77
|
+
format.html { render :index, status: :unprocessable_entity }
|
78
|
+
format.json { render json: @session.user.errors, status: :unprocessable_entity }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
58
84
|
def request_verify_email_action
|
59
85
|
respond_to do |format|
|
60
86
|
if @session.user.request_verify_email
|
@@ -10,6 +10,7 @@ module Lato
|
|
10
10
|
before_action :lock_signup_if_disabled, only: %i[signup signup_action]
|
11
11
|
before_action :lock_recover_password_if_disabled, only: %i[recover_password recover_password_action update_password update_password_action]
|
12
12
|
before_action :lock_web3_if_disabled, only: %i[web3_signin web3_signin_action]
|
13
|
+
before_action :lock_authenticator_if_disabled, only: %i[authenticator authenticator_action]
|
13
14
|
|
14
15
|
before_action :hide_sidebar
|
15
16
|
|
@@ -28,10 +29,13 @@ module Lato
|
|
28
29
|
ip_address: request.remote_ip,
|
29
30
|
user_agent: request.user_agent
|
30
31
|
))
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
if create_session_or_start_authenticator(@user)
|
33
|
+
format.html { redirect_to lato.root_path }
|
34
|
+
format.json { render json: @user }
|
35
|
+
else
|
36
|
+
format.html { redirect_to lato.authentication_authenticator_path }
|
37
|
+
format.json { render json: @user }
|
38
|
+
end
|
35
39
|
else
|
36
40
|
format.html { render :signin, status: :unprocessable_entity }
|
37
41
|
format.json { render json: @user.errors, status: :unprocessable_entity }
|
@@ -54,10 +58,13 @@ module Lato
|
|
54
58
|
web3_nonce: session[:web3_nonce]
|
55
59
|
))
|
56
60
|
session[:web3_nonce] = nil
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
+
if create_session_or_start_authenticator(@user)
|
62
|
+
format.html { redirect_to lato.root_path }
|
63
|
+
format.json { render json: @user }
|
64
|
+
else
|
65
|
+
format.html { redirect_to lato.authentication_authenticator_path }
|
66
|
+
format.json { render json: @user }
|
67
|
+
end
|
61
68
|
else
|
62
69
|
session[:web3_nonce] = nil
|
63
70
|
format.html { render :web3_signin, status: :unprocessable_entity }
|
@@ -183,6 +190,31 @@ module Lato
|
|
183
190
|
end
|
184
191
|
end
|
185
192
|
|
193
|
+
# Authenticator
|
194
|
+
##
|
195
|
+
|
196
|
+
def authenticator
|
197
|
+
@user = Lato::User.find_by_id(session[:authenticator_user_id])
|
198
|
+
return respond_to_with_not_found unless @user
|
199
|
+
end
|
200
|
+
|
201
|
+
def authenticator_action
|
202
|
+
@user = Lato::User.find_by_id(session[:authenticator_user_id])
|
203
|
+
|
204
|
+
respond_to do |format|
|
205
|
+
if @user.authenticator(params.require(:user).permit(:authenticator_code))
|
206
|
+
session[:authenticator_user_id] = nil
|
207
|
+
session_create(@user.id)
|
208
|
+
|
209
|
+
format.html { redirect_to lato.root_path }
|
210
|
+
format.json { render json: @user }
|
211
|
+
else
|
212
|
+
format.html { render :authenticator, status: :unprocessable_entity }
|
213
|
+
format.json { render json: @user.errors, status: :unprocessable_entity }
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
186
218
|
private
|
187
219
|
|
188
220
|
def registration_params
|
@@ -199,6 +231,16 @@ module Lato
|
|
199
231
|
respond_to_with_not_found unless @invitation
|
200
232
|
end
|
201
233
|
|
234
|
+
def create_session_or_start_authenticator(user)
|
235
|
+
if !Lato.config.authenticator_connection || Lato.config.auth_disable_authenticator || !user.authenticator_enabled?
|
236
|
+
session_create(user.id)
|
237
|
+
return true
|
238
|
+
end
|
239
|
+
|
240
|
+
session[:authenticator_user_id] = user.id
|
241
|
+
false
|
242
|
+
end
|
243
|
+
|
202
244
|
def lock_signup_if_disabled
|
203
245
|
return unless Lato.config.auth_disable_signup
|
204
246
|
|
@@ -215,6 +257,12 @@ module Lato
|
|
215
257
|
return if Lato.config.web3_connection && !Lato.config.auth_disable_web3
|
216
258
|
|
217
259
|
|
260
|
+
respond_to_with_not_found
|
261
|
+
end
|
262
|
+
|
263
|
+
def lock_authenticator_if_disabled
|
264
|
+
return if Lato.config.authenticator_connection && !Lato.config.auth_disable_authenticator
|
265
|
+
|
218
266
|
respond_to_with_not_found
|
219
267
|
end
|
220
268
|
end
|
data/app/models/lato/user.rb
CHANGED
@@ -54,6 +54,10 @@ module Lato
|
|
54
54
|
@valid_accepted_terms_and_conditions_version ||= accepted_terms_and_conditions_version >= Lato.config.legal_terms_and_conditions_version
|
55
55
|
end
|
56
56
|
|
57
|
+
def authenticator_enabled?
|
58
|
+
!authenticator_secret.blank?
|
59
|
+
end
|
60
|
+
|
57
61
|
# Helpers
|
58
62
|
##
|
59
63
|
|
@@ -65,6 +69,10 @@ module Lato
|
|
65
69
|
@gravatar_image_url ||= "https://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(email)}?s=#{size}"
|
66
70
|
end
|
67
71
|
|
72
|
+
def authenticator_qr_code_base64(size = 200)
|
73
|
+
"data:image/png;base64,#{Base64.strict_encode64(RQRCode::QRCode.new(ROTP::TOTP.new(authenticator_secret, :issuer => Lato.config.application_title).provisioning_uri(email).to_s).as_png(size: size, border_modules: 0).to_s)}"
|
74
|
+
end
|
75
|
+
|
68
76
|
# Operations
|
69
77
|
##
|
70
78
|
|
@@ -224,7 +232,9 @@ module Lato
|
|
224
232
|
|
225
233
|
c_password_update_code('')
|
226
234
|
|
227
|
-
update(params.permit(:password, :password_confirmation)
|
235
|
+
update(params.permit(:password, :password_confirmation).merge(
|
236
|
+
authenticator_secret: nil # Reset authenticator secret when password is updated
|
237
|
+
))
|
228
238
|
end
|
229
239
|
|
230
240
|
def update_accepted_privacy_policy_version(params)
|
@@ -292,6 +302,27 @@ module Lato
|
|
292
302
|
true
|
293
303
|
end
|
294
304
|
|
305
|
+
def generate_authenticator_secret
|
306
|
+
update(authenticator_secret: ROTP::Base32.random)
|
307
|
+
end
|
308
|
+
|
309
|
+
def remove_authenticator_secret
|
310
|
+
update(authenticator_secret: nil)
|
311
|
+
end
|
312
|
+
|
313
|
+
def authenticator(params)
|
314
|
+
return false unless authenticator_enabled?
|
315
|
+
|
316
|
+
totp = ROTP::TOTP.new(authenticator_secret)
|
317
|
+
result = totp.verify(params[:authenticator_code])
|
318
|
+
unless result
|
319
|
+
errors.add(:base, :authenticator_code_invalid)
|
320
|
+
return
|
321
|
+
end
|
322
|
+
|
323
|
+
true
|
324
|
+
end
|
325
|
+
|
295
326
|
# Cache
|
296
327
|
##
|
297
328
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
user ||= Lato::User.new
|
4
|
+
|
5
|
+
%>
|
6
|
+
|
7
|
+
<%= turbo_frame_tag 'account_form-authenticator' do %>
|
8
|
+
<%= form_with model: user, url: lato.account_update_authenticator_action_path, data: { turbo_frame: '_self', controller: 'lato-form' } do |form| %>
|
9
|
+
<%= lato_form_notices class: %w[mb-3] %>
|
10
|
+
<%= lato_form_errors user, class: %w[mb-3] %>
|
11
|
+
|
12
|
+
<% if user.authenticator_secret %>
|
13
|
+
<div class="d-block d-md-flex align-items-stretch">
|
14
|
+
<div class="text-center mb-3 mb-md-0 me-md-3">
|
15
|
+
<img class="shadow-sm rounded" src="<%= user.authenticator_qr_code_base64 %>" />
|
16
|
+
</div>
|
17
|
+
<div class="d-flex flex-column justify-content-between">
|
18
|
+
<div class="alert alert-light">
|
19
|
+
<p class="mb-0">
|
20
|
+
<%= raw I18n.t('lato.account_authenticator_ready_qr') %>
|
21
|
+
</p>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="d-flex justify-content-end">
|
25
|
+
<%= lato_form_submit form, I18n.t('lato.cancel_authenticator'), class: %w[btn-danger] %>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
<% else %>
|
30
|
+
<div class="alert alert-light mb-0">
|
31
|
+
<h4 class="alert-heading"><%= I18n.t('lato.account_authenticator_start_title') %></h4>
|
32
|
+
<p>
|
33
|
+
<%= raw I18n.t('lato.account_authenticator_start_description') %>
|
34
|
+
</p>
|
35
|
+
<p class="mb-0">
|
36
|
+
<%= lato_form_submit form, I18n.t('lato.generate_qr_code'), class: %w[btn-primary] %>
|
37
|
+
</p>
|
38
|
+
</div>
|
39
|
+
<% end %>
|
40
|
+
<% end %>
|
41
|
+
<% end %>
|
@@ -32,6 +32,17 @@
|
|
32
32
|
</div>
|
33
33
|
<% end %>
|
34
34
|
|
35
|
+
<% if Lato.config.authenticator_connection %>
|
36
|
+
<div class="card mb-4">
|
37
|
+
<div class="card-header">
|
38
|
+
<h2 class="fs-4 mb-0"><%= I18n.t('lato.account_authenticator') %></h2>
|
39
|
+
</div>
|
40
|
+
<div class="card-body">
|
41
|
+
<%= render 'lato/account/form-authenticator', user: @session.user %>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
<% end %>
|
45
|
+
|
35
46
|
<div class="card mb-4">
|
36
47
|
<div class="card-header">
|
37
48
|
<h2 class="fs-4 mb-0"><%= I18n.t('lato.account_delete') %></h2>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
user ||= Lato::User.new
|
4
|
+
|
5
|
+
%>
|
6
|
+
|
7
|
+
<%= turbo_frame_tag 'authentication_form-authenticator' do %>
|
8
|
+
<%= form_with model: user, url: lato.authentication_authenticator_action_path, method: :post, data: { turbo_frame: '_self', controller: 'lato-form' } do |form| %>
|
9
|
+
<%= lato_form_notices class: %w[mb-3] %>
|
10
|
+
<%= lato_form_errors user, class: %w[mb-3] %>
|
11
|
+
|
12
|
+
<div class="mb-3 text-center">
|
13
|
+
<p><%= raw I18n.t('lato.authenticator_code_help', email: user.email) %></p>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="mb-3">
|
17
|
+
<%= lato_form_item_input_text form, :authenticator_code, required: true %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div>
|
21
|
+
<%= lato_form_submit form, I18n.t('lato.confirm'), class: %w[d-block w-100] %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="text-center mt-3 mb-3">
|
25
|
+
<%= I18n.t('lato.or').downcase %> <%= link_to I18n.t('lato.reset_password').downcase, lato.authentication_recover_password_path %>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<div class="w-100 h-100 d-flex justify-content-center align-items-center" style="min-height: calc(100vh - 54px - 2rem)">
|
2
|
+
<div class="card w-100" style="max-width: 400px">
|
3
|
+
<div class="card-header">
|
4
|
+
<h1 class="fs-3 mb-0 text-center"><%= I18n.t('lato.authenticator') %></h1>
|
5
|
+
</div>
|
6
|
+
<div class="card-body">
|
7
|
+
<%= render 'lato/authentication/form-authenticator', user: @user %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</div>
|
@@ -89,7 +89,7 @@ collection_total = collection.respond_to?(:total_count) ? collection.total_count
|
|
89
89
|
column: column
|
90
90
|
}) %></span>
|
91
91
|
<% if sortable_columns.include?(column) %>
|
92
|
-
<div class="btn-group ms-3">
|
92
|
+
<div class="btn-group ms-3 lato-index-col-sort">
|
93
93
|
<div class="position-relative btn btn-sm <%= params[:sort_by] == "#{column}|ASC" ? 'btn-primary' : 'btn-outline-primary' %>">
|
94
94
|
<input type="submit" name="sort_by" value="<%= column %>|ASC" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0">
|
95
95
|
<i class="bi bi-sort-up"></i>
|
data/config/locales/en.yml
CHANGED
@@ -49,6 +49,15 @@ en:
|
|
49
49
|
web3_signin: Web3 Login
|
50
50
|
retry: Retry
|
51
51
|
back: Go back
|
52
|
+
account_authenticator: Google Authenticator
|
53
|
+
account_authenticator_start_title: Enable Google Authenticator
|
54
|
+
account_authenticator_start_description: Generate a QR code by clicking the button below and scan it with the Google Authenticator app on your phone.<br>This will allow you to use the protect your account with a second factor authentication.
|
55
|
+
account_authenticator_ready_qr: Scan the QR code with the Google Authenticator app to use the account protection with a second factor authentication.
|
56
|
+
generate_qr_code: Generate QR code
|
57
|
+
cancel_authenticator: Disconnect
|
58
|
+
authenticator: Two-factor authentication
|
59
|
+
authenticator_code_help: Insert the code generated by the Google Authenticator app for the account <b>%{email}</b>
|
60
|
+
reset_password: Reset your password
|
52
61
|
|
53
62
|
account_controller:
|
54
63
|
update_user_action_notice: Account information properly updated
|
@@ -82,6 +91,7 @@ en:
|
|
82
91
|
terms_and_conditions_invalid: To accept the terms and conditions you must select the confirmation checkbox
|
83
92
|
web3_address_invalid: The address you send is not corretly signed
|
84
93
|
web3_connection_error: Impossible to connect the wallet
|
94
|
+
authenticator_code_invalid: The code you inserted is not correct
|
85
95
|
password:
|
86
96
|
not_correct: not correct
|
87
97
|
email:
|
data/config/locales/it.yml
CHANGED
@@ -51,6 +51,15 @@ it:
|
|
51
51
|
web3_signin: Accedi con Web3
|
52
52
|
retry: Riprova
|
53
53
|
back: Torna indietro
|
54
|
+
account_authenticator: Google Authenticator
|
55
|
+
account_authenticator_start_title: Abilita Google Authenticator
|
56
|
+
account_authenticator_start_description: Genera un codice QR cliccando il pulsante sottostante e scansionalo con l'app Google Authenticator sul tuo telefono.<br>Questo ti permetterà di proteggere il tuo account con un'autenticazione a due fattori.
|
57
|
+
account_authenticator_ready_qr: Scansiona il codice QR con l'app Google Authenticator per utilizzare la protezione dell'account con un'autenticazione a due fattori.
|
58
|
+
generate_qr_code: Genera codice QR
|
59
|
+
cancel_authenticator: Disconnetti
|
60
|
+
authenticator: Autenticazione a due fattori
|
61
|
+
authenticator_code_help: Inserisci il codice generato dall'app Google Authenticator per l'account <b>%{email}</b>
|
62
|
+
reset_password: Reimposta la tua password
|
54
63
|
|
55
64
|
account_controller:
|
56
65
|
update_user_action_notice: Informazioni account aggiornate correttamente
|
@@ -90,6 +99,7 @@ it:
|
|
90
99
|
invitation_invalid: Invito non valido
|
91
100
|
web3_address_invalid: L'inidirizzo inviato non è correttamente firmato
|
92
101
|
web3_connection_error: Impossibile connettere il wallet
|
102
|
+
authenticator_code_invalid: Il codice inserito non è corretto
|
93
103
|
password:
|
94
104
|
not_correct: non corretta
|
95
105
|
password_confirmation:
|
data/config/routes.rb
CHANGED
@@ -26,6 +26,8 @@ Lato::Engine.routes.draw do
|
|
26
26
|
patch 'update_password_action', to: 'authentication#update_password_action', as: :authentication_update_password_action
|
27
27
|
get 'accept_invitation', to: 'authentication#accept_invitation', as: :authentication_accept_invitation
|
28
28
|
post 'accept_invitation_action', to: 'authentication#accept_invitation_action', as: :authentication_accept_invitation_action
|
29
|
+
get 'authenticator', to: 'authentication#authenticator', as: :authentication_authenticator
|
30
|
+
post 'authenticator_action', to: 'authentication#authenticator_action', as: :authentication_authenticator_action
|
29
31
|
end
|
30
32
|
|
31
33
|
# Account
|
@@ -35,6 +37,7 @@ Lato::Engine.routes.draw do
|
|
35
37
|
get '', to: 'account#index', as: :account
|
36
38
|
patch 'update_user_action', to: 'account#update_user_action', as: :account_update_user_action
|
37
39
|
patch 'update_web3_action', to: 'account#update_web3_action', as: :account_update_web3_action
|
40
|
+
patch 'update_authenticator_action', to: 'account#update_authenticator_action', as: :account_update_authenticator_action
|
38
41
|
patch 'request_verify_email_action', to: 'account#request_verify_email_action', as: :account_request_verify_email_action
|
39
42
|
patch 'update_password_action', to: 'account#update_password_action', as: :account_update_password_action
|
40
43
|
delete 'destroy_action', to: 'account#destroy_action', as: :account_destroy_action
|
data/lib/lato/config.rb
CHANGED
@@ -10,7 +10,7 @@ module Lato
|
|
10
10
|
attr_accessor :session_lifetime, :session_root_path
|
11
11
|
|
12
12
|
# Authentication configs
|
13
|
-
attr_accessor :auth_disable_signup, :auth_disable_recover_password, :auth_disable_web3
|
13
|
+
attr_accessor :auth_disable_signup, :auth_disable_recover_password, :auth_disable_web3, :auth_disable_authenticator
|
14
14
|
|
15
15
|
# Assets configs
|
16
16
|
attr_accessor :assets_stylesheet_entry
|
@@ -25,6 +25,9 @@ module Lato
|
|
25
25
|
# NOTE: It requires the gem 'eth' to be installed in the application Gemfile
|
26
26
|
attr_accessor :web3_connection
|
27
27
|
|
28
|
+
# Authenticator connection
|
29
|
+
attr_accessor :authenticator_connection
|
30
|
+
|
28
31
|
def initialize
|
29
32
|
@application_title = 'Lato'
|
30
33
|
@application_version = '1.0.0'
|
@@ -35,6 +38,7 @@ module Lato
|
|
35
38
|
@auth_disable_signup = false
|
36
39
|
@auth_disable_recover_password = false
|
37
40
|
@auth_disable_web3 = false
|
41
|
+
@auth_disable_authenticator = false
|
38
42
|
|
39
43
|
@assets_stylesheet_entry = 'application'
|
40
44
|
|
@@ -49,6 +53,7 @@ module Lato
|
|
49
53
|
@legal_terms_and_conditions_version = 1
|
50
54
|
|
51
55
|
@web3_connection = false
|
56
|
+
@authenticator_connection = false
|
52
57
|
end
|
53
58
|
end
|
54
59
|
end
|
data/lib/lato/version.rb
CHANGED
data/lib/lato.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lato
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregorio Galante
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rqrcode
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rotp
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: eth
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,6 +190,7 @@ files:
|
|
162
190
|
- app/models/lato/user.rb
|
163
191
|
- app/views/lato/account/_alert-accepted-privacy-policy-version.html.erb
|
164
192
|
- app/views/lato/account/_alert-accepted-terms-and-conditions-version.html.erb
|
193
|
+
- app/views/lato/account/_form-authenticator.html.erb
|
165
194
|
- app/views/lato/account/_form-destroy.html.erb
|
166
195
|
- app/views/lato/account/_form-password.html.erb
|
167
196
|
- app/views/lato/account/_form-user.html.erb
|
@@ -169,6 +198,7 @@ files:
|
|
169
198
|
- app/views/lato/account/index.html.erb
|
170
199
|
- app/views/lato/authentication/_fields-registration.html.erb
|
171
200
|
- app/views/lato/authentication/_form-accept-invitation.html.erb
|
201
|
+
- app/views/lato/authentication/_form-authenticator.html.erb
|
172
202
|
- app/views/lato/authentication/_form-recover-password.html.erb
|
173
203
|
- app/views/lato/authentication/_form-signin.html.erb
|
174
204
|
- app/views/lato/authentication/_form-signup.html.erb
|
@@ -176,6 +206,7 @@ files:
|
|
176
206
|
- app/views/lato/authentication/_form-verify-email.html.erb
|
177
207
|
- app/views/lato/authentication/_form-web3-signin.html.erb
|
178
208
|
- app/views/lato/authentication/accept_invitation.html.erb
|
209
|
+
- app/views/lato/authentication/authenticator.html.erb
|
179
210
|
- app/views/lato/authentication/recover_password.html.erb
|
180
211
|
- app/views/lato/authentication/signin.html.erb
|
181
212
|
- app/views/lato/authentication/signout.html.erb
|
@@ -226,6 +257,7 @@ files:
|
|
226
257
|
- db/migrate/20230823165716_create_lato_log_user_signups.rb
|
227
258
|
- db/migrate/20240222125124_add_web3_to_lato_users.rb
|
228
259
|
- db/migrate/20240222171418_add_indexes_on_lato_users_email.rb
|
260
|
+
- db/migrate/20240318074025_add_authenticator_secret_to_user.rb
|
229
261
|
- lib/lato.rb
|
230
262
|
- lib/lato/btstrap.rb
|
231
263
|
- lib/lato/config.rb
|