Skip to content

Commit c7e83fa

Browse files
Honeypot fields and logic (#48)
Co-authored-by: Rocket <[email protected]>
1 parent 4220508 commit c7e83fa

19 files changed

+110
-9
lines changed

app-rails/app/controllers/users/passwords_controller.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ def forgot
99

1010
def send_reset_password_instructions
1111
email = params[:users_forgot_password_form][:email]
12-
@form = Users::ForgotPasswordForm.new(email: email)
12+
spam_trap = params[:users_forgot_password_form][:spam_trap]
13+
@form = Users::ForgotPasswordForm.new(email: email, spam_trap: spam_trap)
1314

1415
if @form.invalid?
1516
flash.now[:errors] = @form.errors.full_messages
@@ -59,6 +60,6 @@ def auth_service
5960
end
6061

6162
def reset_password_params
62-
params.require(:users_reset_password_form).permit(:email, :code, :password)
63+
params.require(:users_reset_password_form).permit(:email, :code, :password, :spam_trap)
6364
end
6465
end

app-rails/app/controllers/users/registrations_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def auth_service
7777
end
7878

7979
def registration_params
80-
params.require(:users_registration_form).permit(:email, :password, :password_confirmation, :role)
80+
params.require(:users_registration_form).permit(:email, :password, :password_confirmation, :role, :spam_trap)
8181
end
8282

8383
def verify_account_params

app-rails/app/controllers/users/sessions_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def auth_service
9494
def new_session_params
9595
# If :users_new_session_form is renamed, make sure to also update it in
9696
# cognito_authenticatable.rb otherwise login will not work.
97-
params.require(:users_new_session_form).permit(:email, :password)
97+
params.require(:users_new_session_form).permit(:email, :password, :spam_trap)
9898
end
9999

100100
# This is similar to the default Devise SessionController implementation
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
class Users::ForgotPasswordForm
22
include ActiveModel::Model
33

4-
attr_accessor :email
4+
attr_accessor :email, :spam_trap
55

66
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
7+
8+
validates :spam_trap, absence: true
79
end

app-rails/app/forms/users/new_session_form.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
class Users::NewSessionForm
44
include ActiveModel::Model
55

6-
attr_accessor :email, :password
6+
attr_accessor :email, :password, :spam_trap
77

88
validates :email, :password, presence: true
99
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }, if: -> { email.present? }
10+
11+
validates :spam_trap, absence: true
1012
end

app-rails/app/forms/users/registration_form.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
class Users::RegistrationForm
44
include ActiveModel::Model
55

6-
attr_accessor :email, :password, :password_confirmation, :role
6+
attr_accessor :email, :password, :password_confirmation, :role, :spam_trap
77

88
validates :email, :password, :role, presence: true
99
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }, if: -> { email.present? }
1010

1111
validates :password, confirmation: true, if: -> { password.present? }
12+
13+
validates :spam_trap, absence: true
1214
end

app-rails/app/forms/users/reset_password_form.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
class Users::ResetPasswordForm
44
include ActiveModel::Model
55

6-
attr_accessor :email, :password, :code
6+
attr_accessor :email, :password, :code, :spam_trap
77

88
validates :email, :password, :code, presence: true
99
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }, if: -> { email.present? }
1010
validates :code, length: { is: 6 }, if: -> { code.present? }
11+
12+
validates :spam_trap, absence: true
1113
end

app-rails/app/helpers/uswds_form_builder.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ def submit(value = nil, options = {})
7878
super(value, options)
7979
end
8080

81+
def honeypot_field
82+
spam_trap_classes = "opacity-0 position-absolute z-bottom top-0 left-0 height-0 width-0"
83+
label_text = "Do not fill in this field. It is an anti-spam measure."
84+
85+
@template.content_tag(:div, class: "usa-form-group #{spam_trap_classes}") do
86+
label(:spam_trap, label_text, { tabindex: -1, class: "usa-label #{spam_trap_classes}" }) +
87+
@template.text_field(@object_name, :spam_trap, { autocomplete: "false", tabindex: -1, class: "usa-input #{spam_trap_classes}" })
88+
end
89+
end
90+
8191
########################################
8292
# Custom helpers
8393
########################################

app-rails/app/views/users/passwords/forgot.html.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
<%= us_form_with model: @form, url: users_forgot_password_path, local: true do |f| %>
77
<%= f.email_field :email, { autocomplete: "username" } %>
8+
<%= f.honeypot_field %>
89

910
<%= f.submit t(".submit") %>
1011
<% end %>

app-rails/app/views/users/passwords/reset.html.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<h1><%= t(".title") %></h1>
1313

1414
<%= us_form_with model: @form, url: users_reset_password_path, local: true do |f| %>
15+
<%= f.honeypot_field %>
1516
<%= f.text_field :code, { autocomplete: "off", label: t('.code'), width: "md" } %>
1617

1718
<%= f.email_field :email, { autocomplete: "username" } %>

0 commit comments

Comments
 (0)