Skip to content

Instantly share code, notes, and snippets.

@dstrelau
Created November 22, 2010 20:36
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save dstrelau/710627 to your computer and use it in GitHub Desktop.
Save dstrelau/710627 to your computer and use it in GitHub Desktop.
Gollum protected by HTTP Basic
require 'gollum/frontend/app'
require 'digest/sha1'
class App < Precious::App
User = Struct.new(:name, :email, :password_hash)
before { authenticate! }
helpers do
def authenticate!
@_auth ||= Rack::Auth::Basic::Request.new(request.env)
if @_auth.provided?
end
if @_auth.provided? && @_auth.basic? && @_auth.credentials &&
@user = detected_user(@_auth.credentials)
return @user
else
response['WWW-Authenticate'] = %(Basic realm="Gollum Wiki")
throw(:halt, [401, "Not authorized\n"])
end
end
def users
@_users ||= settings.authorized_users.map {|u| User.new(*u) }
end
def detected_user(credentials)
users.detect do |u|
[u.email, u.password_hash] ==
[credentials[0], Digest::SHA1.hexdigest(credentials[1])]
end
end
end
def commit_message
{
:message => params[:message],
:name => @user.name,
:email => @user.email
}
end
end
__DIR__ = File.expand_path(File.dirname(__FILE__))
$: << __DIR__
require 'app'
App.set(:gollum_path, __DIR__)
App.set(:authorized_users, YAML.load_file(File.expand_path('users.yml', __DIR__)))
run App
---
- - User Name
- user@name.co
- `puts Digest::SHA1.hexdigest('password')`
- - Another User
- another@user.co
- `puts Digest::SHA1.hexdigest('p455w0rd')`
@gpolitis
Copy link

users.yml inline password encoding didn't work for me, not sure why. I replaced with actual SHA1 hash. Also, I think a require 'yaml' is missing in config.ru.

Thanks for sharing :)

@leopoldodonnell
Copy link

Use ERB to preprocess your users.yml file.

In config.ru replace

App.set(:authorized_users, YAML.load_file(File.expand_path('users.yml', __DIR__)))

with

App.set(:authorized_users, YAML.load(ERB.new(File.read(File.expand_path('users.yml', __DIR__))).result))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment