public
Last active — forked from dstrelau/app.rb

Gollum protected by HTTP Basic

  • Download Gist
app.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
require 'gollum/frontend/app'
require 'digest/sha1'
 
class App < Precious::App
User = Struct.new(:name, :email, :password_hash, :can_write)
 
before { authenticate! }
before /^\/(edit|create|delete|livepreview|revert)/ do authorize_write! ; end
 
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 authorize_write!
throw(:halt, [403, "Forbidden\n"]) unless @user.can_write
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
config.ru
Ruby
1 2 3 4 5 6 7 8 9
__DIR__ = File.expand_path(File.dirname(__FILE__))
$: << __DIR__
require 'rubygems'
require 'yaml'
require 'app'
App.set(:gollum_path, __DIR__ + "/wikidata")
App.set(:authorized_users, YAML.load_file(File.expand_path('users.yml', __DIR__)))
App.set(:wiki_options, {})
run App
serve.sh
Shell
1 2 3 4 5 6
#!/bin/bash
# kill any running gollums
ps -ef | grep rackup | grep -v grep | awk '{print $2}' | xargs kill -9
# start gollum as a background process
# you can pipe output to /dev/null instead, if you don't want a log
nohup rackup -p 4567 config.ru > /var/log/gollum.log &
users.yml
YAML
1 2 3 4 5 6 7 8 9
---
- - User Name
- user@example.com
- e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4 # secret
- true
- - Another User
- another@example.com
- b4341ce88a4943631b9573d9e0e5b28991de945d # p455w0rd
- true

Hi

I would like to use this, but I have no idea how to. Can you please explain what I need to do to add this to my gollum install. Thanks

This just extends Gollum. So make sure you have that up and running first. I think requirements are low - Try to run gem install gollum (Assuming you have installed Ruby + rubygems).

Launch Gollum by running serve.sh. You might want to wrap this in something that makes sure to relaunch the service, if it fails as well as on machine boot. Also, if you want to expose this to the internet at large, I suggest that you put nginx+mod_cache in front of it. Google for plenty of descriptions on how.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.