From 737ff62cfc33d89755806107a0c0122ada3424cb Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Mon, 13 Jul 2015 18:42:36 +0200 Subject: [PATCH] Trying to get authlogic running --- app/assets/javascripts/user_sessions.coffee | 3 ++ app/assets/javascripts/users.coffee | 3 ++ app/assets/stylesheets/user_sessions.scss | 3 ++ app/assets/stylesheets/users.scss | 3 ++ app/controllers/application_controller.rb | 48 +++++++++++++++++++ app/controllers/user_sessions_controller.rb | 22 +++++++++ app/controllers/users_controller.rb | 43 +++++++++++++++++ app/helpers/user_sessions_helper.rb | 2 + app/helpers/users_helper.rb | 2 + app/models/user.rb | 3 ++ app/models/user_session.rb | 7 +++ app/views/shared/_error_messages.slim | 6 +++ app/views/user_sessions/new.slim | 15 ++++++ app/views/users/_form.slim | 20 ++++++++ app/views/users/show.slim | 28 +++++++++++ config/routes.rb | 12 +++++ ...0150713153950_change_users_to_authlogic.rb | 23 +++++++++ .../20150713155458_create_user_sessions.rb | 13 +++++ db/schema.rb | 26 ++++++++-- .../user_sessions_controller_test.rb | 7 +++ test/controllers/users_controller_test.rb | 7 +++ test/helpers/user_sessions_helper_test.rb | 7 +++ test/helpers/users_helper_test.rb | 7 +++ 23 files changed, 306 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/user_sessions.coffee create mode 100644 app/assets/javascripts/users.coffee create mode 100644 app/assets/stylesheets/user_sessions.scss create mode 100644 app/assets/stylesheets/users.scss create mode 100644 app/controllers/user_sessions_controller.rb create mode 100644 app/controllers/users_controller.rb create mode 100644 app/helpers/user_sessions_helper.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/models/user_session.rb create mode 100644 app/views/shared/_error_messages.slim create mode 100644 app/views/user_sessions/new.slim create mode 100644 app/views/users/_form.slim create mode 100644 app/views/users/show.slim create mode 100644 db/migrate/20150713153950_change_users_to_authlogic.rb create mode 100644 db/migrate/20150713155458_create_user_sessions.rb create mode 100644 test/controllers/user_sessions_controller_test.rb create mode 100644 test/controllers/users_controller_test.rb create mode 100644 test/helpers/user_sessions_helper_test.rb create mode 100644 test/helpers/users_helper_test.rb diff --git a/app/assets/javascripts/user_sessions.coffee b/app/assets/javascripts/user_sessions.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/user_sessions.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/users.coffee b/app/assets/javascripts/users.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/users.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/user_sessions.scss b/app/assets/stylesheets/user_sessions.scss new file mode 100644 index 0000000..1d3eacb --- /dev/null +++ b/app/assets/stylesheets/user_sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the user_sessions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000..1efc835 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 10b8733..9d025db 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,6 +5,12 @@ class ApplicationController < ActionController::Base before_filter :create_user_token + # Do not mention passwords in the log file + # filter_parameter_logging :password + + # AuthLogic + helper_method :current_user_session, :current_user + # Assign the visitor a unique hash so that we can track their uploads # and show them even before moderation. def create_user_token @@ -12,4 +18,46 @@ class ApplicationController < ActionController::Base session[:ip] ||= request.remote_ip end + # ----------------- + private + + def current_user_session + return @current_user_session if defined?(@current_user_session) + @current_user_session = UserSession.find + end + + def current_user + return @current_user if defined?(@current_user) + @current_user = current_user_session && current_user_session.user + end + + def require_user + logger.debug "ApplicationController::require_user" + unless current_user + store_location + flash[:notice] = "You must be logged in to access this page" + redirect_to new_user_session_url + return false + end + end + + def require_no_user + logger.debug "ApplicationController::require_no_user" + if current_user + store_location + flash[:notice] = "You must be logged out to access this page" + # redirect_to home_index_path + return false + end + end + + def store_location + #session[:return_to] = request.request_uri + end + + def redirect_back_or_default(default) + redirect_to(session[:return_to] || default) + session[:return_to] = nil + end + end diff --git a/app/controllers/user_sessions_controller.rb b/app/controllers/user_sessions_controller.rb new file mode 100644 index 0000000..831859e --- /dev/null +++ b/app/controllers/user_sessions_controller.rb @@ -0,0 +1,22 @@ +class UserSessionsController < ApplicationController + + def new + @user_session = UserSession.new + end + + def create + @user_session = UserSession.new(params[:user_session]) + if @user_session.save + flash[:notice] = "Login successful!" + redirect_back_or_default account_url(@current_user) + else + render :action => :new + end + end + + def destroy + current_user_session.destroy + flash[:notice] = "Logout successful!" + redirect_back_or_default new_user_session_url + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000..196391e --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,43 @@ +class UsersController < ApplicationController + + before_filter :require_user, :only => [:show, :edit, :update] + + def new + @user = User.new + end + + def create + @user = User.new(params[:user]) + + # Saving without session maintenance to skip + # auto-login which can't happen here because + # the User has not yet been activated + if @user.save + flash[:notice] = "Your account has been created." + redirect_to signup_url + else + flash[:notice] = "There was a problem creating you." + render :action => :new + end + + end + + def show + @user = current_user + end + + def edit + @user = current_user + end + + def update + @user = current_user # makes our views "cleaner" and more consistent + if @user.update_attributes(params[:user]) + flash[:notice] = "Account updated!" + redirect_to account_url + else + render :action => :edit + end + end + +end diff --git a/app/helpers/user_sessions_helper.rb b/app/helpers/user_sessions_helper.rb new file mode 100644 index 0000000..2018402 --- /dev/null +++ b/app/helpers/user_sessions_helper.rb @@ -0,0 +1,2 @@ +module UserSessionsHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000..2310a24 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/user.rb b/app/models/user.rb index 4a57cf0..06ca47d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,2 +1,5 @@ class User < ActiveRecord::Base + acts_as_authentic do |c| + c.login_field = 'email' + end end diff --git a/app/models/user_session.rb b/app/models/user_session.rb new file mode 100644 index 0000000..0e212cd --- /dev/null +++ b/app/models/user_session.rb @@ -0,0 +1,7 @@ +# User sessions. Refers to the "User" class automatically (by its name). +# See also: https://github.com/binarylogic/authlogic +class UserSession < Authlogic::Session::Base + # specify configuration here, such as: + # logout_on_timeout true + # ...many more options in the documentation +end diff --git a/app/views/shared/_error_messages.slim b/app/views/shared/_error_messages.slim new file mode 100644 index 0000000..386a006 --- /dev/null +++ b/app/views/shared/_error_messages.slim @@ -0,0 +1,6 @@ +- if target.errors.any? + div id="errorExplanation" + h2 Errors + ul + - target.errors.full_messages.each do |msg| + li = msg diff --git a/app/views/user_sessions/new.slim b/app/views/user_sessions/new.slim new file mode 100644 index 0000000..2c42cfa --- /dev/null +++ b/app/views/user_sessions/new.slim @@ -0,0 +1,15 @@ +- raise @user_session +- form_for @user_session, :as => :user_session, :url => { :action => "create" } do |f| + = render "shared/error_messages", :target => @user_session + = f.label :email + br + = f.text_field :email + br + = f.label :password + br + = f.password_field :password + br + = f.check_box :remember_me + = f.label :remember_me + br + = f.submit "Login" diff --git a/app/views/users/_form.slim b/app/views/users/_form.slim new file mode 100644 index 0000000..e6161d2 --- /dev/null +++ b/app/views/users/_form.slim @@ -0,0 +1,20 @@ += render "shared/error_messages", :target => @user + +p + = form.label :name % + br + = form.text_field :name +p + = form.label :email + br + = form.text_field :email +p + = form.label :password, form.object.new_record? ? nil : "Change password" + br + = form.password_field :password +p + = form.label :password_confirmation + br + = form.password_field :password_confirmation + += link_to 'Edit Account', edit_account_path diff --git a/app/views/users/show.slim b/app/views/users/show.slim new file mode 100644 index 0000000..aae3998 --- /dev/null +++ b/app/views/users/show.slim @@ -0,0 +1,28 @@ +p + b Email: + =h @user.email + +p + b Login count: + + =h @user.login_count + +p + b Last request at: + =h @user.last_request_at + +p + b Last login at: + =h @user.last_login_at + +p + b Current login at: + =h @user.current_login_at + +p + b Last login ip: + =h @user.last_login_ip + +p + b Current login ip: + =h @user.current_login_ip diff --git a/config/routes.rb b/config/routes.rb index 2ac291c..86713f3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,6 +21,18 @@ Debshots::Application.routes.draw do get 'about' => 'welcome#about' get 'thumbnail/:name' => 'packages#thumbnail', as: :thumbnail_image, name: /[^\/]+/ + # Authentication + resources :user_sessions + + get 'login' => "user_sessions#new", :as => :login + get 'logout' => "user_sessions#destroy", :as => :logout + + resources :users # give us our some normal resource routes for users + resource :user, :as => 'account' # a convenience route + + #match 'signup' => 'users#new', :as => :signup + + # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/db/migrate/20150713153950_change_users_to_authlogic.rb b/db/migrate/20150713153950_change_users_to_authlogic.rb new file mode 100644 index 0000000..29aebb2 --- /dev/null +++ b/db/migrate/20150713153950_change_users_to_authlogic.rb @@ -0,0 +1,23 @@ +class ChangeUsersToAuthlogic < ActiveRecord::Migration + def change + change_table :users do |t| + # Remove the password column that was previously introduced + t.remove :password + + # Create AuthLogic fields + t.string :password_salt, :null => false # optional, but highly recommended + t.string :persistence_token, :null => false # required + + # Magic columns, just like ActiveRecord's created_at and updated_at. These are automatically maintained by Authlogic if they are present. + t.integer :login_count, :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns + t.integer :failed_login_count, :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns + t.datetime :last_request_at # optional, see Authlogic::Session::MagicColumns + t.datetime :current_login_at # optional, see Authlogic::Session::MagicColumns + t.datetime :last_login_at # optional, see Authlogic::Session::MagicColumns + t.string :current_login_ip # optional, see Authlogic::Session::MagicColumns + t.string :last_login_ip # optional, see Authlogic::Session::MagicColumns + end + change_column :packages, :long_description, :text + + end +end diff --git a/db/migrate/20150713155458_create_user_sessions.rb b/db/migrate/20150713155458_create_user_sessions.rb new file mode 100644 index 0000000..bc70a50 --- /dev/null +++ b/db/migrate/20150713155458_create_user_sessions.rb @@ -0,0 +1,13 @@ +class CreateUserSessions < ActiveRecord::Migration + def change + create_table :user_sessions do |t| + t.string :session_id, :null => false + t.text :data + t.timestamps + end + + add_index :user_sessions, :session_id + add_index :user_sessions, :updated_at + + end +end diff --git a/db/schema.rb b/db/schema.rb index 1b902bc..1f3b9b9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150628113425) do +ActiveRecord::Schema.define(version: 20150713155458) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -64,12 +64,30 @@ ActiveRecord::Schema.define(version: 20150628113425) do add_index "screenshots", ["id", "approved"], name: "id_approved", using: :btree add_index "screenshots", ["id", "uploaderhash"], name: "id_uploaderhash", using: :btree + create_table "user_sessions", force: :cascade do |t| + t.string "session_id", null: false + t.text "data" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "user_sessions", ["session_id"], name: "index_user_sessions_on_session_id", using: :btree + add_index "user_sessions", ["updated_at"], name: "index_user_sessions_on_updated_at", using: :btree + create_table "users", force: :cascade do |t| t.text "email" t.text "realname" - t.text "password" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "password_salt", null: false + t.string "persistence_token", null: false + t.integer "login_count", default: 0, null: false + t.integer "failed_login_count", default: 0, null: false + t.datetime "last_request_at" + t.datetime "current_login_at" + t.datetime "last_login_at" + t.string "current_login_ip" + t.string "last_login_ip" end add_foreign_key "screenshots", "packages", name: "screenshots_package_id_fkey" diff --git a/test/controllers/user_sessions_controller_test.rb b/test/controllers/user_sessions_controller_test.rb new file mode 100644 index 0000000..2b8f395 --- /dev/null +++ b/test/controllers/user_sessions_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class UserSessionsControllerTest < ActionController::TestCase + def test_sanity + flunk "Need real tests" + end +end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 0000000..96ac2b7 --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class UsersControllerTest < ActionController::TestCase + def test_sanity + flunk "Need real tests" + end +end diff --git a/test/helpers/user_sessions_helper_test.rb b/test/helpers/user_sessions_helper_test.rb new file mode 100644 index 0000000..e8030ab --- /dev/null +++ b/test/helpers/user_sessions_helper_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class UserSessionsHelperTest < ActionView::TestCase + def test_sanity + flunk "Need real tests" + end +end diff --git a/test/helpers/users_helper_test.rb b/test/helpers/users_helper_test.rb new file mode 100644 index 0000000..d940efc --- /dev/null +++ b/test/helpers/users_helper_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class UsersHelperTest < ActionView::TestCase + def test_sanity + flunk "Need real tests" + end +end