Forked from
Digital Experience Group / UNL Resource Scheduler
114 commits behind the upstream repository.
-
Tyler Lemburg authoredTyler Lemburg authored
app.rb 4.00 KiB
require 'sinatra'
require 'rest-client'
require 'rack/session/abstract/id'
require 'rack/cas'
require 'rack-cas'
require 'rack-cas/session_store/active_record'
require 'models/session'
require 'models/user'
require 'models/service_space'
include ERB::Util
module Rack
module Session
class RackCASActiveRecordStore < Rack::Session::Abstract::ID
include RackCAS::ActiveRecordStore
end
end
end
use Rack::Session::RackCASActiveRecordStore
use Rack::CAS, server_url: 'https://login.unl.edu/cas',
session_store: RackCAS::ActiveRecordStore
Time.zone = "America/Chicago"
DIRECTORY_URL = 'http://directory.unl.edu/'
# this gives the user messages
def flash(type, header, message)
session["notice"] ||= []
session["notice"] << {
:type => type,
:header => header,
:message => message
}
end
before do
session['init'] = true
# site defaults
@title = 'UNL Resource Scheduler'
@breadcrumbs = [
{
:href => 'http://www.unl.edu/',
:text => 'UNL',
:title => 'University of Nebraska–Lincoln'
},
{
:href => '/',
:text => 'UNL Resource Scheduler'
}
]
end
def calculate_time(date_string, hour, minute, am_pm)
hour ||= 0
minute ||= 0
am_pm ||= 'am'
hour = hour.to_i % 12
hour = hour + 12 if am_pm == 'pm'
date_strings = date_string.split('/')
date_string = "#{date_strings[2]}-#{date_strings[0]}-#{date_strings[1]}"
date = Time.parse(date_string)
Time.new(date.year, date.month, date.day, hour, minute, 0)
end
helpers do
def load_service_space
url_name = params[:service_space_url_name]
space = ServiceSpace.find_by(:url_name => url_name)
raise Sinatra::NotFound if space.nil?
@space = space
if @user && !@user.in_space?(@space)
flash :error, 'Unauthorized', 'Sorry, you don\'t have access to this service space.'
redirect '/'
end
@breadcrumbs << {:text => @space.name, :href => @space.href}
end
def check_login
if !session['cas'].nil? && !session['cas']['user'].nil?
@user = User.find_by(:username => session['cas']['user'], :creation_method => 'CAS')
end
end
def require_login
if session['cas'].nil? || session['cas']['user'].nil?
halt 401
else
# check if the user already exists in this app's db
@user = User.find_by(:username => session['cas']['user'], :creation_method => 'CAS')
if @user.nil?
# get this user's info from UNL Directory
RestClient.get("#{DIRECTORY_URL}?uid=#{session['cas']['user']}&format=json") do |response, request, result|
case response.code
when 200
info = JSON.parse(response.body)
# create this user
@user = User.create(
username: session['cas']['user'],
email: info['mail'][0] rescue nil,
first_name: info['givenName'][0] rescue nil,
last_name: info['sn'][0] rescue nil,
date_created: Time.now,
creation_method: 'CAS',
is_admin: false
)
else
flash :error, 'User Not Found in UNL Directory', "This user was not found in the UNL Directory."
redirect back
end
end
end
end
end
end
not_found do
@breadcrumbs << {:text => 'Not Found'}
erb 'That page was not found.', :layout => :fixed
end
error do
@breadcrumbs << {:text => 'Error'}
flash(:danger, 'Sorry! There was an error.', "We apologize. A really bad error occurred and it didn't work. We're fixing this as we speak.")
erb 'In the meantime, you can <a href="/">go back to the homepage</a>.', :layout => :fixed
end
get '/' do
require_login
@breadcrumbs << {:text => 'Home'}
# get the service spaces that this user has access to
spaces = @user.service_spaces
erb :home, :layout => :fixed, :locals => {
spaces: spaces
}
end
get '/kiosk-logout/' do
erb :kiosk_logout, :layout => :fixed, :locals => {
url_redirect: params[:url_redirect],
kiosk_mode: 'true'
}
end
Dir.glob("#{ROOT}/routes/*.rb") { |file| require file }