mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-25 23:56:22 +00:00
autenticacion
This commit is contained in:
parent
a572455b5d
commit
c5b56f0f50
12 changed files with 178 additions and 0 deletions
2
.rubocop.yml
Normal file
2
.rubocop.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Style/AsciiComments:
|
||||||
|
Enabled: false
|
4
Gemfile
4
Gemfile
|
@ -1,7 +1,11 @@
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem 'email_address'
|
||||||
|
gem 'haml'
|
||||||
gem 'jekyll'
|
gem 'jekyll'
|
||||||
|
gem 'rack-flash3'
|
||||||
gem 'sinatra'
|
gem 'sinatra'
|
||||||
|
gem 'sinatra_warden'
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'pry'
|
gem 'pry'
|
||||||
|
|
20
Gemfile.lock
20
Gemfile.lock
|
@ -6,8 +6,14 @@ GEM
|
||||||
ast (2.3.0)
|
ast (2.3.0)
|
||||||
coderay (1.1.2)
|
coderay (1.1.2)
|
||||||
colorator (1.1.0)
|
colorator (1.1.0)
|
||||||
|
email_address (0.1.3)
|
||||||
|
netaddr
|
||||||
|
simpleidn
|
||||||
ffi (1.9.18)
|
ffi (1.9.18)
|
||||||
forwardable-extended (2.6.0)
|
forwardable-extended (2.6.0)
|
||||||
|
haml (5.0.1)
|
||||||
|
temple (>= 0.8.0)
|
||||||
|
tilt
|
||||||
jekyll (3.6.0)
|
jekyll (3.6.0)
|
||||||
addressable (~> 2.4)
|
addressable (~> 2.4)
|
||||||
colorator (~> 1.0)
|
colorator (~> 1.0)
|
||||||
|
@ -31,6 +37,7 @@ GEM
|
||||||
mercenary (0.3.6)
|
mercenary (0.3.6)
|
||||||
method_source (0.8.2)
|
method_source (0.8.2)
|
||||||
mustermann (1.0.1)
|
mustermann (1.0.1)
|
||||||
|
netaddr (1.5.1)
|
||||||
parallel (1.12.0)
|
parallel (1.12.0)
|
||||||
parser (2.4.0.0)
|
parser (2.4.0.0)
|
||||||
ast (~> 2.2)
|
ast (~> 2.2)
|
||||||
|
@ -42,6 +49,8 @@ GEM
|
||||||
method_source (~> 0.8.1)
|
method_source (~> 0.8.1)
|
||||||
public_suffix (3.0.0)
|
public_suffix (3.0.0)
|
||||||
rack (2.0.3)
|
rack (2.0.3)
|
||||||
|
rack-flash3 (1.0.5)
|
||||||
|
rack
|
||||||
rack-protection (2.0.0)
|
rack-protection (2.0.0)
|
||||||
rack
|
rack
|
||||||
rainbow (2.2.2)
|
rainbow (2.2.2)
|
||||||
|
@ -65,22 +74,33 @@ GEM
|
||||||
sass-listen (4.0.0)
|
sass-listen (4.0.0)
|
||||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||||
rb-inotify (~> 0.9, >= 0.9.7)
|
rb-inotify (~> 0.9, >= 0.9.7)
|
||||||
|
simpleidn (0.0.9)
|
||||||
sinatra (2.0.0)
|
sinatra (2.0.0)
|
||||||
mustermann (~> 1.0)
|
mustermann (~> 1.0)
|
||||||
rack (~> 2.0)
|
rack (~> 2.0)
|
||||||
rack-protection (= 2.0.0)
|
rack-protection (= 2.0.0)
|
||||||
tilt (~> 2.0)
|
tilt (~> 2.0)
|
||||||
|
sinatra_warden (0.3.2)
|
||||||
|
sinatra (>= 1.0.0)
|
||||||
|
warden (~> 1.0)
|
||||||
|
temple (0.8.0)
|
||||||
tilt (2.0.8)
|
tilt (2.0.8)
|
||||||
unicode-display_width (1.3.0)
|
unicode-display_width (1.3.0)
|
||||||
|
warden (1.2.7)
|
||||||
|
rack (>= 1.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
email_address
|
||||||
|
haml
|
||||||
jekyll
|
jekyll
|
||||||
pry
|
pry
|
||||||
|
rack-flash3
|
||||||
rubocop
|
rubocop
|
||||||
sinatra
|
sinatra
|
||||||
|
sinatra_warden
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.15.4
|
1.15.4
|
||||||
|
|
7
config.ru
Normal file
7
config.ru
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# require 'rack/protection'
|
||||||
|
require_relative 'sutty'
|
||||||
|
|
||||||
|
# use Rack::Protection
|
||||||
|
run Sutty::App
|
25
lib/sutty.rb
Normal file
25
lib/sutty.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rack-flash'
|
||||||
|
require 'sinatra/base'
|
||||||
|
require 'sinatra_warden'
|
||||||
|
require_relative 'sutty/login'
|
||||||
|
|
||||||
|
module Sutty
|
||||||
|
# Sutty
|
||||||
|
class App < Sinatra::Base
|
||||||
|
use Rack::Flash
|
||||||
|
use Sutty::Login
|
||||||
|
register Sinatra::Warden
|
||||||
|
|
||||||
|
set :root, File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
||||||
|
|
||||||
|
before do
|
||||||
|
authorize! '/login'
|
||||||
|
end
|
||||||
|
|
||||||
|
get '/' do
|
||||||
|
haml :index
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
34
lib/sutty/login.rb
Normal file
34
lib/sutty/login.rb
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'net/imap'
|
||||||
|
require 'rack-flash'
|
||||||
|
require 'sinatra/base'
|
||||||
|
require 'sinatra_warden'
|
||||||
|
require_relative '../warden/imap'
|
||||||
|
require_relative 'models/usuaria'
|
||||||
|
|
||||||
|
module Sutty
|
||||||
|
# Login
|
||||||
|
class Login < Sinatra::Base
|
||||||
|
use Rack::Flash
|
||||||
|
register Sinatra::Warden
|
||||||
|
|
||||||
|
enable :sessions
|
||||||
|
enable :logging
|
||||||
|
enable :auth_use_referrer
|
||||||
|
|
||||||
|
# Configura Warden para usar la estrategia IMAP y obtener la cuenta
|
||||||
|
# de usuaria a partir de la cookie.
|
||||||
|
use Warden::Manager do |config|
|
||||||
|
config.default_scope = :user
|
||||||
|
config.scope_defaults :user, strategies: [:imap]
|
||||||
|
|
||||||
|
config.serialize_into_session(&:username)
|
||||||
|
config.serialize_from_session { |u| Usuaria.find(u) }
|
||||||
|
|
||||||
|
config.failure_app = self
|
||||||
|
end
|
||||||
|
|
||||||
|
set :root, File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
||||||
|
end
|
||||||
|
end
|
10
lib/sutty/models/usuaria.rb
Normal file
10
lib/sutty/models/usuaria.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Sutty
|
||||||
|
# Una usuaria de Sutty
|
||||||
|
class Usuaria < OpenStruct
|
||||||
|
def self.find(username)
|
||||||
|
Usuaria.new(username: username)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
57
lib/warden/imap.rb
Normal file
57
lib/warden/imap.rb
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'net/imap'
|
||||||
|
require 'warden'
|
||||||
|
require 'email_address'
|
||||||
|
|
||||||
|
# XXX Separación de concerns?
|
||||||
|
require_relative '../sutty/models/usuaria'
|
||||||
|
|
||||||
|
module Warden
|
||||||
|
module IMAP
|
||||||
|
# Una estrategia de autenticación por IMAP
|
||||||
|
class Strategy < Warden::Strategies::Base
|
||||||
|
def valid?
|
||||||
|
return false unless params.include? 'username'
|
||||||
|
return false unless params.include? 'password'
|
||||||
|
|
||||||
|
@email = EmailAddress.new(params['username'])
|
||||||
|
|
||||||
|
return false unless @email.valid?
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def authenticate!
|
||||||
|
imap_connect
|
||||||
|
imap_login
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def imap_connect
|
||||||
|
# No vamos a enviar la contraseña en texto plano a ningún lado
|
||||||
|
@imap = Net::IMAP.new(@email.host_name, ssl: true)
|
||||||
|
# Errores más comunes según
|
||||||
|
# https://ruby-doc.org/stdlib-2.0.0/libdoc/net/imap/rdoc/Net/IMAP.html
|
||||||
|
rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT, Errno::ENETUNREACH,
|
||||||
|
SocketError, Net::IMAP::ByeResponseError => e
|
||||||
|
|
||||||
|
@imap.disconnect
|
||||||
|
fail! e.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def imap_login
|
||||||
|
@imap.login(@email.normal, params['password'])
|
||||||
|
@imap.disconnect
|
||||||
|
|
||||||
|
success! Sutty::Usuaria.find(@email.normal)
|
||||||
|
rescue EOFError => e
|
||||||
|
@imap.disconnect
|
||||||
|
fail! e.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Warden::Strategies.add(:imap, Warden::IMAP::Strategy)
|
4
sutty.rb
Normal file
4
sutty.rb
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'pry' unless ENV['RACK_ENV'] == 'production'
|
||||||
|
require_relative 'lib/sutty'
|
1
views/500.haml
Normal file
1
views/500.haml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
%h1 Hubo un error 500!
|
3
views/index.haml
Normal file
3
views/index.haml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
%h1
|
||||||
|
Hola
|
||||||
|
= current_user.username
|
11
views/login.haml
Normal file
11
views/login.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
%h1 Hola!
|
||||||
|
|
||||||
|
- if flash[:error]
|
||||||
|
.alert.alert-danger{role: 'alert'}
|
||||||
|
= flash[:error]
|
||||||
|
|
||||||
|
%form{method: 'post', action: '/login'}
|
||||||
|
%input{type: 'email', name: 'username', placeholder: 'Correo'}
|
||||||
|
%input{type: 'password', name: 'password', placeholder: 'Contraseña'}
|
||||||
|
|
||||||
|
%input{type: 'submit', value: 'Ingresar'}
|
Loading…
Reference in a new issue