]> cat aescling's git repositories - mastodon.git/commitdiff
Adding e-mail confirmations
authorEugen Rochko <eugen@zeonfederated.com>
Mon, 3 Oct 2016 14:38:22 +0000 (16:38 +0200)
committerEugen Rochko <eugen@zeonfederated.com>
Mon, 3 Oct 2016 14:51:00 +0000 (16:51 +0200)
15 files changed:
app/assets/stylesheets/application.scss
app/controllers/application_controller.rb
app/controllers/auth/confirmations_controller.rb [new file with mode: 0644]
app/controllers/auth/sessions_controller.rb
app/models/user.rb
app/views/auth/confirmations/new.html.haml [new file with mode: 0644]
app/views/auth/mailer/confirmation_instructions.html.erb [new file with mode: 0644]
app/views/auth/passwords/edit.html.erb [deleted file]
app/views/auth/passwords/edit.html.haml [new file with mode: 0644]
app/views/auth/shared/_links.html.haml
app/views/layouts/auth.html.haml
config/routes.rb
db/migrate/20161003142332_add_confirmable_to_users.rb [new file with mode: 0644]
db/schema.rb
spec/fabricators/user_fabricator.rb

index e6ae1d915d46a7b959baffec5e351943a0b67673..8c90eb065aa2b136d37cb1c5b0ab6dae9c946bb8 100644 (file)
@@ -104,6 +104,7 @@ body {
 .logo-container {
   max-width: 400px;
   margin: 100px auto;
+  margin-bottom: 0;
   cursor: default;
 
   @media screen and (max-width: 360px) {
@@ -276,6 +277,13 @@ body {
     }
   }
 
+  .flash-message {
+    text-align: center;
+    font-size: 14px;
+    margin-bottom: 30px;
+    font-weight: 500;
+  }
+
   .form-footer {
     margin-top: 30px;
     text-align: center;
index 91904ecf070f6f8b842e1d0a1c3f50fbe31bfdad..cd4b686f71e62eaf81026d326ed88b26e5563e78 100644 (file)
@@ -10,7 +10,7 @@ class ApplicationController < ActionController::Base
   rescue_from ActionController::RoutingError, with: :not_found
   rescue_from ActiveRecord::RecordNotFound, with: :not_found
 
-  before_filter :store_current_location, :unless => :devise_controller?
+  before_action :store_current_location, :unless => :devise_controller?
 
   def raise_not_found
     raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}"
diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb
new file mode 100644 (file)
index 0000000..b8e9316
--- /dev/null
@@ -0,0 +1,3 @@
+class Auth::ConfirmationsController < Devise::ConfirmationsController
+  layout 'auth'
+end
index e50a9835c881d8a8211fcc6ef69297f20b55c429..bd41ffd3d8f2c4c23025826ecce348623ab11ea7 100644 (file)
@@ -12,6 +12,12 @@ class Auth::SessionsController < Devise::SessionsController
   protected
 
   def after_sign_in_path_for(_resource)
-    stored_location_for(:user) || root_path
+    last_url = stored_location_for(:user)
+
+    if [about_path].include?(last_url)
+      root_path
+    else
+      last_url || root_path
+    end
   end
 end
index da096d6e9b97f48d6a5b00cc4162562f1932cb93..c1243e9accfa0c2ecd58ae14ad6ac2a157432434 100644 (file)
@@ -1,5 +1,5 @@
 class User < ApplicationRecord
-  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
+  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
 
   belongs_to :account, inverse_of: :user
   accepts_nested_attributes_for :account
diff --git a/app/views/auth/confirmations/new.html.haml b/app/views/auth/confirmations/new.html.haml
new file mode 100644 (file)
index 0000000..5c1cf57
--- /dev/null
@@ -0,0 +1,9 @@
+= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f|
+  = devise_error_messages!
+
+  .field
+    = f.email_field :email, autofocus: true, required: true, placeholder: 'E-mail address'
+  .actions
+    = f.button "Resend confirmation instructions", type: 'submit'
+
+.form-footer= render "auth/shared/links"
diff --git a/app/views/auth/mailer/confirmation_instructions.html.erb b/app/views/auth/mailer/confirmation_instructions.html.erb
new file mode 100644 (file)
index 0000000..ef17b28
--- /dev/null
@@ -0,0 +1,5 @@
+<p>Welcome <%= @resource.email %>!</p>
+
+<p>You can confirm your account email through the link below:</p>
+
+<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
diff --git a/app/views/auth/passwords/edit.html.erb b/app/views/auth/passwords/edit.html.erb
deleted file mode 100644 (file)
index 6a796b0..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-<h2>Change your password</h2>
-
-<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
-  <%= devise_error_messages! %>
-  <%= f.hidden_field :reset_password_token %>
-
-  <div class="field">
-    <%= f.label :password, "New password" %><br />
-    <% if @minimum_password_length %>
-      <em>(<%= @minimum_password_length %> characters minimum)</em><br />
-    <% end %>
-    <%= f.password_field :password, autofocus: true, autocomplete: "off" %>
-  </div>
-
-  <div class="field">
-    <%= f.label :password_confirmation, "Confirm new password" %><br />
-    <%= f.password_field :password_confirmation, autocomplete: "off" %>
-  </div>
-
-  <div class="actions">
-    <%= f.submit "Change my password" %>
-  </div>
-<% end %>
-
-<%= render "devise/shared/links" %>
diff --git a/app/views/auth/passwords/edit.html.haml b/app/views/auth/passwords/edit.html.haml
new file mode 100644 (file)
index 0000000..0d5f0fe
--- /dev/null
@@ -0,0 +1,12 @@
+= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
+  = devise_error_messages!
+  = f.hidden_field :reset_password_token
+
+  .field
+    = f.password_field :password, autofocus: true, autocomplete: "off", placeholder: 'New password'
+  .field
+    = f.password_field :password_confirmation, autocomplete: "off", placeholder: 'Confirm new password'
+  .actions
+    = f.button "Change my password", type: :submit
+
+= render "devise/shared/links"
index 6f89eed75974563c4196d084472404686c9d4c0b..d24c7d98fab71e814806f26d014c316aa6621aa4 100644 (file)
@@ -13,7 +13,3 @@
 
   - if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks'
     %li= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name)
-
-  - if devise_mapping.omniauthable?
-    - resource_class.omniauth_providers.each do |provider|
-      %li= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider)
index 54aa07e2cd5c8d94d6b36e64135024602827fe54..52d567280b09944d4c8b8109bd49b03785d2099b 100644 (file)
@@ -7,6 +7,12 @@
           %small= Rails.configuration.x.local_domain
 
     .form-container
+      - if flash[:notice]
+        .flash-message.notice= flash[:notice]
+
+      - if flash[:alert]
+        .flash-message.alert= flash[:alert]
+
       = yield
 
 = render template: "layouts/application"
index 77129445328f9a2e35a9c934219e1e4acdbd803b..ec151137ee3fb50bc5d5c23dba5f5dff40a4d429 100644 (file)
@@ -15,7 +15,8 @@ Rails.application.routes.draw do
   devise_for :users, path: 'auth', controllers: {
     sessions:           'auth/sessions',
     registrations:      'auth/registrations',
-    passwords:          'auth/passwords'
+    passwords:          'auth/passwords',
+    confirmations:      'auth/confirmations'
   }
 
   resources :accounts, path: 'users', only: [:show], param: :username do
diff --git a/db/migrate/20161003142332_add_confirmable_to_users.rb b/db/migrate/20161003142332_add_confirmable_to_users.rb
new file mode 100644 (file)
index 0000000..cbef4c4
--- /dev/null
@@ -0,0 +1,9 @@
+class AddConfirmableToUsers < ActiveRecord::Migration[5.0]
+  def change
+    add_column :users, :confirmation_token, :string
+    add_column :users, :confirmed_at, :datetime
+    add_column :users, :confirmation_sent_at, :datetime
+    add_column :users, :unconfirmed_email, :string
+    add_index :users, :confirmation_token, unique: true
+  end
+end
index f0d7cf5d34753dbea7a34a48eec4c45575357f5e..f835c21b8d01ce2a524b2e7de7716c363ec2d4d1 100644 (file)
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20160926213048) do
+ActiveRecord::Schema.define(version: 20161003142332) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -158,7 +158,12 @@ ActiveRecord::Schema.define(version: 20160926213048) do
     t.inet     "current_sign_in_ip"
     t.inet     "last_sign_in_ip"
     t.boolean  "admin",                  default: false
+    t.string   "confirmation_token"
+    t.datetime "confirmed_at"
+    t.datetime "confirmation_sent_at"
+    t.string   "unconfirmed_email"
     t.index ["account_id"], name: "index_users_on_account_id", using: :btree
+    t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
     t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
     t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
   end
index 87d86b428576839c392f241528d9d892ba5d5859..c08559137feae7229941292475a87e7dab871106 100644 (file)
@@ -1,5 +1,6 @@
 Fabricator(:user) do
   account
-  email    "alice@example.com"
-  password "123456789"
+  email        "alice@example.com"
+  password     "123456789"
+  confirmed_at { Time.now }
 end