diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 968a0c2..678b1f9 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -1,26 +1,31 @@ class Admin::BaseController < ApplicationController - before_action :require_admin + before_action :require_admin, except: [:login] # GET /admin # POST /admin def index @client_ids = Client.pluck(:ClientId) get_charts render 'admin/index' end + # GET /admin/login + def login + render 'admin/login' + end + protected def get_charts days_ago = params.fetch(:days_back, 7).to_i rescue 7 @job_status = ChartGenerator.job_statuses(@client_ids, days_ago) @job_stats = ChartGenerator.job_stats(@client_ids, days_ago - 1) end def require_admin return if current_user.try(:admin?) flash[:alert] = 'You need to log in first' - redirect_to root_path + redirect_to admin_login_path end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f8f1ed9..81ca1e0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,78 +1,92 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception helper_method :current_user, :warden def index redirect_to clients_path if current_user end def unauthenticated flash[:error] = warden.message - redirect_to root_path + if attempted_path == '/grnet' + redirect_to admin_login_path + else + redirect_to root_path + end end - # POST /login - def login - if params[:admin] == 'admin' - warden.authenticate(:admin) - current_user + # POST /grnet + def grnet + if current_user + warden.logout + reset_current_user + end + begin + warden.authenticate!(:admin) + rescue + return unauthenticated end + current_user redirect_to admin_path end # POST /vima def vima begin warden.authenticate!(:vima) rescue return unauthenticated end current_user redirect_to clients_path end def logout warden.logout reset_current_user redirect_to root_path end protected def warden request.env['warden'] end def current_user @current_user ||= warden.user end def reset_current_user @current_user = nil end def fetch_logs days_ago = params.fetch(:days_back, 7).to_i rescue 7 if @client @logs = Log.includes(:job).joins(job: :client).where(Client: { ClientId: @client.id }) else @logs = Log.includes(:job).joins(job: { client: { host: :users } }). where(users: { id: current_user.id }) end @logs = @logs.where('Time > ?', days_ago.days.ago). order(Time: :desc, LogId: :desc).page(params[:page]) end private def require_logged_in return if current_user flash[:alert] = 'You need to log in first' redirect_to root_path end + + def attempted_path + (request.env['warden.options'] || {})[:attempted_path] + end end diff --git a/app/views/admin/login.html.erb b/app/views/admin/login.html.erb new file mode 100644 index 0000000..1adf61a --- /dev/null +++ b/app/views/admin/login.html.erb @@ -0,0 +1,25 @@ +
+
+
+

+ + Login +

+
+ +
+ + <%= bootstrap_form_tag(url: grnet_path, method: :post, layout: :horizontal, + label_col: 'col-xs-3', control_col: 'col-xs-8' ) do |f| %> + <%= f.text_field(:username, required: true) %> + <%= f.password_field(:password, required: true) %> + +
+
+ <%= f.submit 'Login', class: 'btn btn-default' %> +
+
+ <% end %> +
+
+
diff --git a/config/routes.rb b/config/routes.rb index fb6e90c..5f840c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,79 +1,81 @@ Rails.application.routes.draw do root 'application#index' - post 'login' => 'application#login' + post 'grnet' => 'application#grnet' match 'vima', to: 'application#vima', :via => [:get, :post] get 'logout' => 'application#logout' resources :clients, only: [:index, :show] do member do get :jobs get :logs get :stats post :stats get :users get :restore post :run_restore end collection do post :index end end resources :hosts, only: [:new, :create, :show, :edit, :update, :destroy] do member do post :submit_config post :disable delete :revoke end resources :jobs, only: [:new, :create, :show, :edit, :update, :destroy] do member do patch :toggle_enable post :backup_now end end resources :filesets, only: [:show, :new, :create, :destroy] resources :schedules, only: [:show, :new, :edit, :create, :update, :destroy] end namespace :admin do match '/', to: 'base#index', via: [:get, :post] + get '/login' => 'base#login', as: :login + resources :settings, only: [:index, :new, :create, :edit, :update] do member do delete :reset end end resources :clients, only: [:index, :show] do member do get :jobs get :logs get :stats post :stats get :configuration post :disable delete :revoke end end resources :hosts, only: [:show] do collection do get :unverified end member do post :verify end end resources :users, only: [:index] do member do patch :ban patch :unban end end end end