rack-auth-kerberos 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +2 -0
- data/MANIFEST +7 -0
- data/README +31 -0
- data/Rakefile +54 -0
- data/lib/rack/auth/kerberos.rb +94 -0
- data/rack-auth-kerberos.gemspec +22 -0
- data/test/test_rack_auth_kerberos.rb +22 -0
- metadata +83 -0
data/CHANGES
ADDED
data/MANIFEST
ADDED
data/README
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
= Description
|
2
|
+
The rack-kerberos library is a Rack library that uses Kerberos to authenicate
|
3
|
+
users against your Kerberos server.
|
4
|
+
|
5
|
+
= Prerequisites
|
6
|
+
rack 1.0.0 or later
|
7
|
+
krb5-auth 0.7 or later
|
8
|
+
|
9
|
+
= Usage
|
10
|
+
use "Rack::Auth::Kerberos", "user_field", "password_field", "YOUR.REALM_NAME"
|
11
|
+
|
12
|
+
= Default Fields
|
13
|
+
The default user field is "username".
|
14
|
+
The default password field is "password".
|
15
|
+
The default realm is whatever you've got set in your krb5.conf file.
|
16
|
+
|
17
|
+
= Details
|
18
|
+
This rack library only handles requests that contain a username and password
|
19
|
+
parameter. If both are not present, the request is forwarded normally.
|
20
|
+
|
21
|
+
If a username and password are detected, then they're authenicated against
|
22
|
+
your Kerberos server. If valid, then env['AUTH_USER'] is set to the username
|
23
|
+
and env['AUTH_FAIL'] is deleted. If invalid, then env['AUTH_USER'] is deleted
|
24
|
+
and env['AUTH_FAIL'] is set to an error message explaining what went wrong.
|
25
|
+
|
26
|
+
Note that if env['AUTH_USER'] or env['AUTH_FAIL'] are already set, then the
|
27
|
+
request is forwarded normally.
|
28
|
+
|
29
|
+
= Authors
|
30
|
+
Daniel Berger
|
31
|
+
Charlie O'Keefe
|
data/Rakefile
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rbconfig'
|
4
|
+
|
5
|
+
desc 'Install the rack-auth-kerberos library (non-gem)'
|
6
|
+
task :install do
|
7
|
+
dir = File.join(CONFIG['sitelibdir'], 'rack', 'auth')
|
8
|
+
FileUtils.mkdir_p(dir) unless File.exists?(dir)
|
9
|
+
file = 'lib/rack/auth/kerberos.rb'
|
10
|
+
FileUtils.cp_r(file, dir, :verbose => true)
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Build the gem'
|
14
|
+
task :gem do
|
15
|
+
spec = eval(IO.read('rack-auth-kerberos.gemspec'))
|
16
|
+
Gem::Builder.new(spec).build
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'Install the rack-auth-kerberos library as a gem'
|
20
|
+
task :install_gem => [:gem] do
|
21
|
+
file = Dir["*.gem"].first
|
22
|
+
sh "gem install #{file}"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'Export the git archive to a .zip, .gz and .bz2 file in your home directory'
|
26
|
+
task :export, :output_file do |t, args|
|
27
|
+
file = args[:output_file]
|
28
|
+
|
29
|
+
sh "git archive --prefix #{file}/ --output #{ENV['HOME']}/#{file}.tar master"
|
30
|
+
|
31
|
+
Dir.chdir(ENV['HOME']) do
|
32
|
+
sh "gzip -f #{ENV['HOME']}/#{file}.tar"
|
33
|
+
end
|
34
|
+
|
35
|
+
sh "git archive --prefix #{file}/ --output #{ENV['HOME']}/#{file}.tar master"
|
36
|
+
|
37
|
+
Dir.chdir(ENV['HOME']) do
|
38
|
+
sh "bzip2 -f #{ENV['HOME']}/#{file}.tar"
|
39
|
+
end
|
40
|
+
|
41
|
+
sh "git archive --prefix #{file}/ --output #{ENV['HOME']}/#{file}.zip --format zip master"
|
42
|
+
|
43
|
+
Dir.chdir(ENV['HOME']) do
|
44
|
+
sh "unzip #{file}.zip"
|
45
|
+
Dir.chdir(file) do
|
46
|
+
sh "rake gem"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Rake::TestTask.new do |t|
|
52
|
+
t.verbose = true
|
53
|
+
t.warning = true
|
54
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'krb5_auth'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
module Auth
|
5
|
+
class Kerberos
|
6
|
+
# The version of the rack-auth-kerberos library.
|
7
|
+
VERSION = '0.1.0'
|
8
|
+
|
9
|
+
# Creates a new Rack::Kerberos object. The +user_field+ and +password_field+
|
10
|
+
# are the params looked for in the call method. The defaults are 'username'
|
11
|
+
# and 'password', respectively.
|
12
|
+
#
|
13
|
+
# If the optional +realm+ parameter is supplied it will override the
|
14
|
+
# default realm specified in your krb5.conf file.
|
15
|
+
#
|
16
|
+
# The realm is automatically appended to the username if not already
|
17
|
+
# present. This makes it easier for application developers, i.e. they can
|
18
|
+
# supply a username with or without a realm and it will Just Work (TM).
|
19
|
+
#
|
20
|
+
def initialize(app, user_field = 'username', password_field = 'password', realm = nil)
|
21
|
+
@app = app
|
22
|
+
@user_field = user_field
|
23
|
+
@password_field = password_field
|
24
|
+
@kerberos = Krb5Auth::Krb5.new
|
25
|
+
|
26
|
+
if realm
|
27
|
+
@realm = realm
|
28
|
+
else
|
29
|
+
@realm = @kerberos.get_default_realm
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# The call method we've defined first checks to see if the AUTH_USER
|
34
|
+
# environment variable is set. If it is, we assume that the user has
|
35
|
+
# already been authenticated and move on.
|
36
|
+
#
|
37
|
+
# If AUTH_USER is not set, and AUTH_FAIL is not set, we then attempt
|
38
|
+
# to authenticate the user against the Kerberos server. If successful
|
39
|
+
# then AUTH_USER is set to the username.
|
40
|
+
#
|
41
|
+
# If unsuccessful then AUTH_USER is set to nil and AUTH_FAIL is
|
42
|
+
# set to an appropriate error message.
|
43
|
+
#
|
44
|
+
# It is then up to the application to check for the presence of AUTH_USER
|
45
|
+
# and/or AUTH_FAIL and act as necessary.
|
46
|
+
#
|
47
|
+
def call(env)
|
48
|
+
request = Rack::Request.new(env)
|
49
|
+
|
50
|
+
user = request.params[@user_field]
|
51
|
+
password = request.params[@password_field]
|
52
|
+
|
53
|
+
# Only authenticate user if both the username and password fields are present
|
54
|
+
unless user && password
|
55
|
+
return @app.call(env)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Automatically append the realm if not already present
|
59
|
+
user_with_realm = user.dup
|
60
|
+
user_with_realm += "@#{@realm}" unless user.include?('@')
|
61
|
+
|
62
|
+
# Do not authenticate if either one of these is set
|
63
|
+
if env['AUTH_USER'] || env['AUTH_FAIL']
|
64
|
+
return @app.call(env)
|
65
|
+
end
|
66
|
+
|
67
|
+
begin
|
68
|
+
@kerberos.get_init_creds_password(user_with_realm, password)
|
69
|
+
env['AUTH_USER'] = user
|
70
|
+
env.delete('AUTH_FAIL')
|
71
|
+
rescue Krb5Auth::Krb5::Exception => err
|
72
|
+
case err.message
|
73
|
+
when /client not found/i
|
74
|
+
msg = "Invalid userid '#{user}'"
|
75
|
+
when /integrity check failed/i
|
76
|
+
msg = "Invalid password for '#{user}'"
|
77
|
+
else
|
78
|
+
msg = "Error attempting to validate userid and password"
|
79
|
+
end
|
80
|
+
|
81
|
+
env.delete('AUTH_USER')
|
82
|
+
env['AUTH_FAIL'] = msg
|
83
|
+
rescue => err
|
84
|
+
env.delete('AUTH_USER')
|
85
|
+
env['AUTH_FAIL'] = "Unexpected failure during Kerberos authentication"
|
86
|
+
ensure
|
87
|
+
@kerberos.close
|
88
|
+
end
|
89
|
+
|
90
|
+
@app.call(env)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.name = 'rack-auth-kerberos'
|
5
|
+
gem.version = '0.1.0'
|
6
|
+
gem.authors = ["Daniel Berger", "Charlie O'Keefe"]
|
7
|
+
gem.email = 'dberger@globe.gov'
|
8
|
+
gem.homepage = 'http://www.github.com/rack-kerberos'
|
9
|
+
gem.summary = 'A Rack library that authenticates people using Kerberos'
|
10
|
+
gem.test_file = 'test/test_rack_auth_kerberos.rb'
|
11
|
+
gem.files = Dir['**/*'].delete_if{ |item| item.include?('git') }
|
12
|
+
|
13
|
+
gem.extra_rdoc_files = ['CHANGES', 'README', 'MANIFEST']
|
14
|
+
|
15
|
+
gem.add_dependency('rack', '>= 1.0.0')
|
16
|
+
gem.add_dependency('krb5-auth', '>= 0.7')
|
17
|
+
|
18
|
+
gem.description = <<-EOF
|
19
|
+
The rack-kerberos library provides a Rack middleware interface for
|
20
|
+
authenticating users against a Kerberos server.
|
21
|
+
EOF
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rack/auth/kerberos'
|
3
|
+
|
4
|
+
class TC_Rack_Auth_Kerberos < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@app = 1 # Placeholder
|
7
|
+
@env = 1 # Placeholder
|
8
|
+
@rack = Rack::Auth::Kerberos.new(@app)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_constructor_basic
|
12
|
+
assert_nothing_raised{ Rack::Auth::Kerberos.new(@app) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_version
|
16
|
+
assert_equal('0.1.0', Rack::Auth::Kerberos::VERSION)
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
@rack = nil
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-auth-kerberos
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Berger
|
8
|
+
- Charlie O'Keefe
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2009-12-11 00:00:00 -07:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rack
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.0.0
|
25
|
+
version:
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: krb5-auth
|
28
|
+
type: :runtime
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0.7"
|
35
|
+
version:
|
36
|
+
description: " The rack-kerberos library provides a Rack middleware interface for\n authenticating users against a Kerberos server.\n"
|
37
|
+
email: dberger@globe.gov
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files:
|
43
|
+
- CHANGES
|
44
|
+
- README
|
45
|
+
- MANIFEST
|
46
|
+
files:
|
47
|
+
- MANIFEST
|
48
|
+
- test/test_rack_auth_kerberos.rb
|
49
|
+
- Rakefile
|
50
|
+
- CHANGES
|
51
|
+
- README
|
52
|
+
- lib/rack/auth/kerberos.rb
|
53
|
+
- rack-auth-kerberos.gemspec
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://www.github.com/rack-kerberos
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
version:
|
75
|
+
requirements: []
|
76
|
+
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.3.5
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: A Rack library that authenticates people using Kerberos
|
82
|
+
test_files:
|
83
|
+
- test/test_rack_auth_kerberos.rb
|