From 5e8cda6fc089d4bb33a8260cf9873b400716f4f7 Mon Sep 17 00:00:00 2001 From: ricola Date: Sun, 6 Apr 2025 17:04:31 -0600 Subject: [PATCH] Start with basic authentication --- .bundle/config | 2 ++ Gemfile | 4 ++++ views/home.erb | 5 ++++ views/layout.erb | 10 ++++++++ views/login.erb | 9 ++++++++ vote.rb | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 .bundle/config create mode 100644 Gemfile create mode 100644 views/home.erb create mode 100644 views/layout.erb create mode 100644 views/login.erb create mode 100644 vote.rb diff --git a/.bundle/config b/.bundle/config new file mode 100644 index 0000000..6efc687 --- /dev/null +++ b/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_PATH: "gems" diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..a963765 --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source "http://rubygems.org" + +gem "sinatra" +gem "bcrypt" diff --git a/views/home.erb b/views/home.erb new file mode 100644 index 0000000..e0fb120 --- /dev/null +++ b/views/home.erb @@ -0,0 +1,5 @@ +

Home

+

Hello, <%= current_user.email %>.

+
+ +
diff --git a/views/layout.erb b/views/layout.erb new file mode 100644 index 0000000..4e19a4e --- /dev/null +++ b/views/layout.erb @@ -0,0 +1,10 @@ + + + + + Title + + + <%= yield %> + + diff --git a/views/login.erb b/views/login.erb new file mode 100644 index 0000000..dc175d7 --- /dev/null +++ b/views/login.erb @@ -0,0 +1,9 @@ +

Log in

+<% if @error %> +

<%= @error %>

+<% end %> +
+ + + +
diff --git a/vote.rb b/vote.rb new file mode 100644 index 0000000..690eb40 --- /dev/null +++ b/vote.rb @@ -0,0 +1,59 @@ +require 'sinatra' +require 'bcrypt' + +def hash_password(password) + BCrypt::Password.create(password).to_s +end + +def verify_password(password, hash) + BCrypt::Password.new(hash) == password +end + +User = Struct.new(:id, :email, :password_hash) +USERS = [ + User.new(1, 'P1', hash_password('P1')), + User.new(2, 'P2', hash_password('P2')), + User.new(3, 'P3', hash_password('P3')), +] + +enable :sessions + +get '/' do + if current_user + erb :home + else + redirect '/login' + end +end + +get '/login' do + erb :login +end + +post '/login' do + puts params + user = USERS.find { |u| u.email == params[:email] } + if user && verify_password(params[:password], user.password_hash) + session.clear + session[:user_id] = user.id + redirect '/' + else + @error = 'Username or password was incorrect' + erb :login + end +end + +post '/logout' do + session.clear + redirect '/login' +end + +helpers do + def current_user + if session[:user_id] + USERS.find { |u| u.id == session[:user_id] } + else + nil + end + end +end