lato 3.5.3 → 3.5.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 610cd08cd020b1b26a751748428a2f3d67bad1e3aac70ff532d4ace4b12ee018
4
- data.tar.gz: afa483e3d08332a1ba970a0688f9a71a920fd9b6918a900a7a0df073a77c6113
3
+ metadata.gz: f4dc0f435932a6eb561b49dc030c8d331ac306331ca42e9ea65a37418820c682
4
+ data.tar.gz: 6cfd69cae2762adbd4790af754f9b30e4f7f621f46f0f41ab5906f7c35c43b17
5
5
  SHA512:
6
- metadata.gz: 74c33bc114d471e79cff2828221b86d3af314e247be371c4278c57f147e9a7fbe3f2f630c305e967c615af234374c65526bd89e3a99ee62ce35b62b3ae7083fc
7
- data.tar.gz: b56cac710dc65f72d779a990588d364c2904d5ab972410b0955817ccb8b2d0654b98ed0172640fc367f31dee9702f4ed87f1cc72d44f24edf2efbde58db368c1
6
+ metadata.gz: b4738ffe8f9a83428305903f6253bdf844f7e64b87aa12f061597f579b558236e14357f51f091f646010186bd8d6dcf84348de019b16e512e53fcd8040295945
7
+ data.tar.gz: 645f8fad8ddcc489f954ddf704c44fa8ad1a088f20d768c9a0ce0524e19c227b62528701eabdb5ab3201e5576674873006ba3ac3ff7358c60b6ff88ed5bb5e28
@@ -20,7 +20,7 @@ module Lato
20
20
  def update_web3_action
21
21
  return respond_to_with_not_found unless Lato.config.web3_connection
22
22
 
23
- if @session.user.web3_connection_completed?
23
+ if @session.user.web3_address
24
24
  respond_to do |format|
25
25
  if @session.user.remove_web3_connection
26
26
  format.html { redirect_to lato.account_path }
@@ -30,19 +30,21 @@ module Lato
30
30
  format.json { render json: @session.user.errors, status: :unprocessable_entity }
31
31
  end
32
32
  end
33
- elsif @session.user.web3_connection_started?
33
+ elsif session[:web3_nonce]
34
34
  respond_to do |format|
35
- if @session.user.complete_web3_connection(params.require(:user).permit(:web3_address, :web3_signed_nonce))
35
+ if @session.user.add_web3_connection(params.require(:user).permit(:web3_address, :web3_signed_nonce).merge(web3_nonce: session[:web3_nonce]))
36
+ session[:web3_nonce] = nil
36
37
  format.html { redirect_to lato.account_path }
37
38
  format.json { render json: @session.user }
38
39
  else
40
+ session[:web3_nonce] = nil
39
41
  format.html { render :index, status: :unprocessable_entity }
40
42
  format.json { render json: @session.user.errors, status: :unprocessable_entity }
41
43
  end
42
44
  end
43
45
  else
44
46
  respond_to do |format|
45
- if @session.user.start_web3_connection
47
+ if session[:web3_nonce] = SecureRandom.hex(32)
46
48
  format.html { redirect_to lato.account_path }
47
49
  format.json { render json: @session.user }
48
50
  else
@@ -40,27 +40,26 @@ module Lato
40
40
  end
41
41
 
42
42
  def web3_signin
43
- session[:web3_signin_id] = SecureRandom.hex
44
-
45
43
  @user = Lato::User.new
46
- @user.id = session[:web3_signin_id] # This is a temporary id to identify the user
47
- @user.start_web3_signin
44
+ session[:web3_nonce] = SecureRandom.hex(32)
48
45
  end
49
46
 
50
47
  def web3_signin_action
51
48
  @user = Lato::User.new
52
- @user.id = session[:web3_signin_id] # This is a temporary id to identify the user
53
49
 
54
50
  respond_to do |format|
55
51
  if @user.web3_signin(params.require(:user).permit(:web3_address, :web3_signed_nonce).merge(
56
52
  ip_address: request.remote_ip,
57
- user_agent: request.user_agent
53
+ user_agent: request.user_agent,
54
+ web3_nonce: session[:web3_nonce]
58
55
  ))
56
+ session[:web3_nonce] = nil
59
57
  session_create(@user.id)
60
58
 
61
59
  format.html { redirect_to lato.root_path }
62
60
  format.json { render json: @user }
63
61
  else
62
+ session[:web3_nonce] = nil
64
63
  format.html { render :web3_signin, status: :unprocessable_entity }
65
64
  format.json { render json: @user.errors, status: :unprocessable_entity }
66
65
  end
@@ -29,6 +29,7 @@ module Lato
29
29
 
30
30
  before_validation do
31
31
  self.email = email&.downcase&.strip
32
+ self.web3_address = web3_address&.downcase&.strip
32
33
  end
33
34
 
34
35
  before_create do
@@ -39,7 +40,6 @@ module Lato
39
40
  self.email_verified_at = nil if email_changed?
40
41
  self.accepted_privacy_policy_version = Lato.config.legal_privacy_policy_version if accepted_privacy_policy_version_changed?
41
42
  self.accepted_terms_and_conditions_version = Lato.config.legal_terms_and_conditions_version if accepted_terms_and_conditions_version_changed?
42
- self.web3_address = web3_address&.downcase&.strip if web3_address_changed?
43
43
  end
44
44
 
45
45
  # Questions
@@ -53,14 +53,6 @@ module Lato
53
53
  @valid_accepted_terms_and_conditions_version ||= accepted_terms_and_conditions_version >= Lato.config.legal_terms_and_conditions_version
54
54
  end
55
55
 
56
- def web3_connection_completed?
57
- @web3_connection_completed ||= !web3_address.blank?
58
- end
59
-
60
- def web3_connection_started?
61
- @web3_connection_started ||= !c_web3_nonce.blank?
62
- end
63
-
64
56
  # Helpers
65
57
  ##
66
58
 
@@ -119,10 +111,6 @@ module Lato
119
111
  true
120
112
  end
121
113
 
122
- def start_web3_signin
123
- c_web3_nonce(SecureRandom.hex(32))
124
- end
125
-
126
114
  def web3_signin(params)
127
115
  self.web3_address = params[:web3_address]
128
116
 
@@ -132,7 +120,7 @@ module Lato
132
120
  return
133
121
  end
134
122
 
135
- signature_pubkey = Eth::Signature.personal_recover(c_web3_nonce, params[:web3_signed_nonce])
123
+ signature_pubkey = Eth::Signature.personal_recover(params[:web3_nonce], params[:web3_signed_nonce])
136
124
  signature_address = Eth::Util.public_key_to_address signature_pubkey
137
125
  unless signature_address.to_s.downcase == params[:web3_address].downcase
138
126
  errors.add(:web3_signed_nonce, :not_correct)
@@ -151,8 +139,10 @@ module Lato
151
139
  Rails.logger.error(e)
152
140
  end
153
141
 
154
- c_web3_nonce__clear
155
142
  true
143
+ rescue StandardError => e
144
+ errors.add(:base, :web3_connection_error)
145
+ false
156
146
  end
157
147
 
158
148
  def request_verify_email
@@ -278,23 +268,8 @@ module Lato
278
268
  end
279
269
  end
280
270
 
281
- def start_web3_connection
282
- update(web3_address: nil)
283
- c_web3_nonce(SecureRandom.hex(32))
284
-
285
- true
286
- end
287
-
288
- def complete_web3_connection(params)
289
- nonce = c_web3_nonce
290
- c_web3_nonce__clear # Important to rollback to status 0 of web3 connection
291
-
292
- unless nonce
293
- errors.add(:base, :web3_nonce_expired)
294
- return
295
- end
296
-
297
- signature_pubkey = Eth::Signature.personal_recover(nonce, params[:web3_signed_nonce])
271
+ def add_web3_connection(params)
272
+ signature_pubkey = Eth::Signature.personal_recover(params[:web3_nonce], params[:web3_signed_nonce])
298
273
  signature_address = Eth::Util.public_key_to_address signature_pubkey
299
274
  unless signature_address.to_s.downcase == params[:web3_address].downcase
300
275
  errors.add(:base, :web3_address_invalid)
@@ -303,14 +278,12 @@ module Lato
303
278
 
304
279
  update(web3_address: params[:web3_address])
305
280
  rescue StandardError => e
306
- c_web3_nonce__clear # Important to rollback to status 0 of web3 connection
307
281
  errors.add(:base, :web3_connection_error)
308
282
  false
309
283
  end
310
284
 
311
285
  def remove_web3_connection
312
286
  update(web3_address: nil)
313
- c_web3_nonce__clear
314
287
  true
315
288
  end
316
289
 
@@ -340,21 +313,5 @@ module Lato
340
313
  Rails.cache.write(cache_key, value, expires_in: 30.minutes)
341
314
  value
342
315
  end
343
-
344
- def c_web3_nonce(value = nil)
345
- cache_key = "Lato::User/c_web3_nonce/#{id}"
346
- return Rails.cache.read(cache_key) if value.nil?
347
-
348
- Rails.cache.write(cache_key, value, expires_in: 1.minutes)
349
- @web3_connection_started = nil # HARD FIX: reset web3 connection status
350
- value
351
- end
352
-
353
- def c_web3_nonce__clear
354
- cache_key = "Lato::User/c_web3_nonce/#{id}"
355
- Rails.cache.delete(cache_key)
356
- @web3_connection_started = nil # HARD FIX: reset web3 connection status
357
- true
358
- end
359
316
  end
360
317
  end
@@ -9,12 +9,12 @@ user ||= Lato::User.new
9
9
  <%= lato_form_notices class: %w[mb-3] %>
10
10
  <%= lato_form_errors user, class: %w[mb-3] %>
11
11
 
12
- <% if user.web3_connection_completed? %>
12
+ <% if user.web3_address %>
13
13
  <div class="row">
14
14
  <div class="col col-12 mb-3">
15
15
  <%= lato_form_item_label form, :web3_address %>
16
16
  <div class="input-group">
17
- <%= lato_form_item_input_text form, :web3_address, required: true, readonly: true %>
17
+ <input value="<%= user.web3_address %>" class="form-control" readonly>
18
18
  <button class="btn btn-outline-success" style="pointer-events: none"><%= I18n.t('lato.connected_wallet') %></button>
19
19
  </div>
20
20
  </div>
@@ -23,7 +23,7 @@ user ||= Lato::User.new
23
23
  <div class="d-flex justify-content-end">
24
24
  <%= lato_form_submit form, I18n.t('lato.disconnect_wallet'), class: %w[btn-danger] %>
25
25
  </div>
26
- <% elsif user.web3_connection_started? %>
26
+ <% elsif session[:web3_nonce] %>
27
27
  <div class="alert alert-light mb-0">
28
28
  <h4 class="alert-heading">Connecting..</h4>
29
29
  <div class="progress" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
@@ -31,7 +31,7 @@ user ||= Lato::User.new
31
31
  </div>
32
32
  </div>
33
33
 
34
- <span id="account_form-web3__nonce" style="display: none;"><%= user.c_web3_nonce %></span>
34
+ <span id="account_form-web3__nonce" style="display: none;"><%= session[:web3_nonce] %></span>
35
35
  <%= form.hidden_field :web3_address, id: 'account_form-web3__input-web3_address' %>
36
36
  <%= form.hidden_field :web3_signed_nonce, id: 'account_form-web3__input-web3_signed_nonce' %>
37
37
  <%= lato_form_submit form, 'Confirm', class: %w[btn-primary d-none], id: 'account_form-web3__submit' %>
@@ -48,12 +48,16 @@ user ||= Lato::User.new
48
48
  let address = ''
49
49
  let signedNonce = ''
50
50
 
51
- if (window.ethereum) {
52
- const provider = new ethers.ethers.providers.Web3Provider(window.ethereum)
53
- await provider.send('eth_requestAccounts', [])
54
- const signer = provider.getSigner()
55
- address = await signer.getAddress()
56
- signedNonce = await signer.signMessage(nonce)
51
+ try {
52
+ if (window.ethereum) {
53
+ const provider = new ethers.ethers.providers.Web3Provider(window.ethereum)
54
+ await provider.send('eth_requestAccounts', [])
55
+ const signer = provider.getSigner()
56
+ address = await signer.getAddress()
57
+ signedNonce = await signer.signMessage(nonce)
58
+ }
59
+ } catch (error) {
60
+ console.error(error)
57
61
  }
58
62
 
59
63
  inputAddress.value = address
@@ -8,43 +8,59 @@ user ||= Lato::User.new
8
8
  <%= form_with model: user, url: lato.authentication_web3_signin_action_path, data: { turbo_frame: '_self', controller: 'lato-form' } do |form| %>
9
9
  <%= lato_form_notices class: %w[mb-3] %>
10
10
  <%= lato_form_errors user, class: %w[mb-3] %>
11
+
12
+ <% if session[:web3_nonce] %>
11
13
 
12
- <div class="alert alert-light mb-0 text-center">
13
- <h4 class="alert-heading">Connecting..</h4>
14
- <div class="progress" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
15
- <div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 100%"></div>
14
+ <div class="alert alert-light mb-0 text-center">
15
+ <h4 class="alert-heading">Connecting..</h4>
16
+ <div class="progress" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
17
+ <div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 100%"></div>
18
+ </div>
16
19
  </div>
17
- </div>
18
-
19
- <span id="account_form-web3__nonce" style="display: none;"><%= user.c_web3_nonce %></span>
20
- <%= form.hidden_field :web3_address, id: 'account_form-web3__input-web3_address' %>
21
- <%= form.hidden_field :web3_signed_nonce, id: 'account_form-web3__input-web3_signed_nonce' %>
22
- <%= lato_form_submit form, 'Confirm', class: %w[btn-primary d-none], id: 'account_form-web3__submit' %>
23
-
24
- <script>
25
- (async () => {
26
- const ethers = await import('https://cdnjs.cloudflare.com/ajax/libs/ethers/5.7.2/ethers.esm.min.js')
27
-
28
- const nonce = document.getElementById('account_form-web3__nonce').innerText
29
- const inputAddress = document.getElementById('account_form-web3__input-web3_address')
30
- const inputSignedNonce = document.getElementById('account_form-web3__input-web3_signed_nonce')
31
- const submitButton = document.getElementById('account_form-web3__submit')
32
-
33
- let address = ''
34
- let signedNonce = ''
35
-
36
- if (window.ethereum) {
37
- const provider = new ethers.ethers.providers.Web3Provider(window.ethereum)
38
- await provider.send('eth_requestAccounts', [])
39
- const signer = provider.getSigner()
40
- address = await signer.getAddress()
41
- signedNonce = await signer.signMessage(nonce)
42
- }
43
-
44
- inputAddress.value = address
45
- inputSignedNonce.value = signedNonce
46
- submitButton.click()
47
- })()
48
- </script>
20
+
21
+ <span id="account_form-web3__nonce" style="display: none;"><%= session[:web3_nonce] %></span>
22
+ <%= form.hidden_field :web3_address, id: 'account_form-web3__input-web3_address' %>
23
+ <%= form.hidden_field :web3_signed_nonce, id: 'account_form-web3__input-web3_signed_nonce' %>
24
+ <%= lato_form_submit form, 'Confirm', class: %w[btn-primary d-none], id: 'account_form-web3__submit' %>
25
+
26
+ <script>
27
+ (async () => {
28
+ const ethers = await import('https://cdnjs.cloudflare.com/ajax/libs/ethers/5.7.2/ethers.esm.min.js')
29
+
30
+ const nonce = document.getElementById('account_form-web3__nonce').innerText
31
+ const inputAddress = document.getElementById('account_form-web3__input-web3_address')
32
+ const inputSignedNonce = document.getElementById('account_form-web3__input-web3_signed_nonce')
33
+ const submitButton = document.getElementById('account_form-web3__submit')
34
+
35
+ let address = ''
36
+ let signedNonce = ''
37
+
38
+ try {
39
+ if (window.ethereum) {
40
+ const provider = new ethers.ethers.providers.Web3Provider(window.ethereum)
41
+ await provider.send('eth_requestAccounts', [])
42
+ const signer = provider.getSigner()
43
+ address = await signer.getAddress()
44
+ signedNonce = await signer.signMessage(nonce)
45
+ }
46
+ } catch (error) {
47
+ console.error(error)
48
+ }
49
+
50
+ inputAddress.value = address
51
+ inputSignedNonce.value = signedNonce
52
+ submitButton.click()
53
+ })()
54
+ </script>
55
+
56
+ <% else %>
57
+ <div class="text-center">
58
+ <%= link_to I18n.t('lato.retry'), lato.authentication_web3_signin_path, class: %w[btn btn-primary], data: { turbo_frame: '_self' } %>
59
+
60
+ <div class="mt-3">
61
+ <%= I18n.t('lato.or').downcase %> <%= link_to I18n.t('lato.back').downcase, lato.authentication_signin_path %>
62
+ </div>
63
+ </div>
64
+ <% end %>
49
65
  <% end %>
50
66
  <% end %>
@@ -47,6 +47,8 @@ en:
47
47
  disconnect_wallet: Disconnect
48
48
  connected_wallet: Connected
49
49
  web3_signin: Web3 Login
50
+ retry: Retry
51
+ back: Go back
50
52
 
51
53
  account_controller:
52
54
  update_user_action_notice: Account information properly updated
@@ -79,7 +81,6 @@ en:
79
81
  privacy_policy_invalid: To accept the privacy policy you must select the confirmation checkbox
80
82
  terms_and_conditions_invalid: To accept the terms and conditions you must select the confirmation checkbox
81
83
  web3_address_invalid: The address you send is not corretly signed
82
- web3_nonce_expired: The nonce used to sign the address is expired
83
84
  web3_connection_error: Impossible to connect the wallet
84
85
  password:
85
86
  not_correct: not correct
@@ -49,6 +49,8 @@ it:
49
49
  disconnect_wallet: Disconnetti
50
50
  connected_wallet: Connesso
51
51
  web3_signin: Accedi con Web3
52
+ retry: Riprova
53
+ back: Torna indietro
52
54
 
53
55
  account_controller:
54
56
  update_user_action_notice: Informazioni account aggiornate correttamente
@@ -87,7 +89,6 @@ it:
87
89
  terms_and_conditions_invalid: Per accettare i termini e condizioni devi selezionare la checkbox di conferma
88
90
  invitation_invalid: Invito non valido
89
91
  web3_address_invalid: L'inidirizzo inviato non è correttamente firmato
90
- web3_nonce_expired: Il nonce utilizzato per firmare l'indirizzo è scaduto
91
92
  web3_connection_error: Impossibile connettere il wallet
92
93
  password:
93
94
  not_correct: non corretta
data/lib/lato/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lato
2
- VERSION = "3.5.3"
2
+ VERSION = "3.5.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lato
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.3
4
+ version: 3.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregorio Galante