sinatra-auth 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ pkg
2
+ *.gemspec
@@ -0,0 +1,19 @@
1
+ Simple authentication for Sinatra
2
+
3
+ Simplest case:
4
+
5
+ auth :password => 'p4ssw3rd'
6
+
7
+ Which is shorter than calling the rack middleware:
8
+
9
+ use Rack::Auth::Basic do |_, password|
10
+ password == 'p4ssw3rd'
11
+ end
12
+
13
+ Also supports scoping:
14
+
15
+ auth '/admin',
16
+ :username => 'myles',
17
+ :password => 'p4ssw3rd'
18
+
19
+ ... and some other options. See examples.rb
@@ -0,0 +1,28 @@
1
+ task :default => :examples
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |s|
6
+ s.name = "sinatra-auth"
7
+ s.homepage = "http://github.com/quackingduck/sinatra-auth"
8
+ s.summary = "Simple authentication for sinatra"
9
+ s.email = "myles@myles.id.au"
10
+ s.authors = ["Myles Byrne"]
11
+
12
+ s.add_dependency 'sinatra', '>= 0.9.4'
13
+ s.add_development_dependency 'exemplor', '>= 2010.0.0'
14
+ s.add_development_dependency 'rack-test', '0.4.0'
15
+ s.add_development_dependency 'pow', '0.2.2'
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Install jeweler to build gem"
20
+ end
21
+
22
+ task(:examples) { ruby "examples.rb" }
23
+ task :test => :examples
24
+
25
+ task :tag_version do
26
+ version = File.read('VERSION')
27
+ system "git tag -a v#{version} -m v#{version}"
28
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.9
@@ -0,0 +1,102 @@
1
+ require 'exemplor'
2
+ require 'pow'
3
+
4
+ require 'rack/test'
5
+ require 'sinatra/base'
6
+ require Pow!('../lib/sinatra/auth')
7
+
8
+ eg "Username and password" do
9
+ app do
10
+ auth :username => 'myles',
11
+ :password => 'p4ssw3rd'
12
+
13
+ get('/') { 'sekrets' }
14
+ end
15
+
16
+ check_auth
17
+ end
18
+
19
+ eg "Username, password and realm name" do
20
+ app do
21
+ auth :username => 'myles',
22
+ :password => 'p4ssw3rd',
23
+ :realm => 'Admin'
24
+
25
+ get('/') { 'sekrets' }
26
+ end
27
+
28
+ check_auth :realm => 'Admin'
29
+ end
30
+
31
+ eg "Non-root scope" do
32
+ app do
33
+ auth '/admin',
34
+ :password => 'p4ssw3rd'
35
+
36
+ get('/') { 'not secret' }
37
+ get('/admin') { 'sekrets' }
38
+ get('/admin/foo') { 'sekrets' }
39
+ end
40
+
41
+ Check(get('/').body).is('not secret')
42
+ check_auth '/admin'
43
+ check_auth '/admin/foo'
44
+ end
45
+
46
+ eg "Just password (any user name valid)" do
47
+ app do
48
+ auth :password => 'p4ssw3rd'
49
+
50
+ get('/') { 'sekrets' }
51
+ end
52
+
53
+ check_auth
54
+ end
55
+
56
+ eg "Block for authentication" do
57
+ app do
58
+ auth do |username,password|
59
+ username == 'myles' && password == 'p4ssw3rd'
60
+ end
61
+
62
+ get('/') { 'sekrets' }
63
+ end
64
+
65
+ check_auth
66
+ end
67
+
68
+ # --
69
+
70
+ eg.helpers do
71
+
72
+ include Rack::Test::Methods
73
+
74
+ def check_auth(path_or_options = '/', options = {})
75
+ options = case path_or_options
76
+ when Hash: {:path => '/'}.merge(path_or_options)
77
+ when String: options.merge(:path => path_or_options)
78
+ end
79
+
80
+ allowed = get options[:path], {}, basic_auth
81
+ Check(allowed.status).is(200)
82
+ denied = get options[:path]
83
+ Check(denied.status).is(401)
84
+ Check(denied['WWW-Authenticate']).is(%{Basic realm="#{options[:realm] || 'Protected Area'}"})
85
+ end
86
+
87
+ def basic_auth(user="myles", password="p4ssw3rd")
88
+ credentials = ["#{user}:#{password}"].pack("m*")
89
+
90
+ { "HTTP_AUTHORIZATION" => "Basic #{credentials}" }
91
+ end
92
+
93
+ def app(&blk)
94
+ if blk
95
+ @app = Class.new Sinatra::Application # Sinatra::Base doesn't work
96
+ @app.set :environment, :test
97
+ @app.class_eval &blk
98
+ end
99
+ @app
100
+ end
101
+
102
+ end
@@ -0,0 +1,105 @@
1
+ module Sinatra
2
+
3
+ module AuthDSL
4
+
5
+ # Only call this. Everything else is implementation. See examples.rb for usuage examples
6
+ def auth(*args, &blk)
7
+ auths << Auth.new(*args,&blk)
8
+ setup_authorization_filter if auths.size == 1
9
+ end
10
+
11
+ def setup_authorization_filter
12
+ before do
13
+ authenticator = self.class.auths.reverse.find { |auth| auth.protecting?(request.path_info) }
14
+ authenticate_with authenticator if authenticator
15
+ end
16
+ end
17
+
18
+ def auths
19
+ @auths ||= []
20
+ end
21
+
22
+ def self.registered(app)
23
+ app.helpers AuthHelpers
24
+ end
25
+
26
+ end
27
+
28
+ module AuthHelpers
29
+
30
+ def authenticate_with(authenticator)
31
+ auth = Rack::Auth::Basic::Request.new(request.env)
32
+ unauthorized!(authenticator.realm) unless auth.provided?
33
+ bad_request! unless auth.basic?
34
+ unauthorized!(authenticator.realm) unless authenticator.authorized?(*auth.credentials)
35
+ end
36
+
37
+ def unauthorized!(realm)
38
+ response["WWW-Authenticate"] = %(Basic realm="#{realm}")
39
+ throw :halt, [ 401, 'Authorization Required' ]
40
+ end
41
+
42
+ def bad_request!
43
+ throw :halt, [ 400, 'Bad Request' ]
44
+ end
45
+ end
46
+
47
+
48
+ class Auth
49
+
50
+ def self.new(*args, &blk)
51
+ super(parse_args(args, &blk))
52
+ end
53
+
54
+ def self.parse_args(args,&blk)
55
+ conf = {}
56
+ conf[:auth_proc] = blk
57
+ case args.size
58
+ when 1
59
+ conf.merge!(args.first)
60
+ when 2
61
+ conf[:scope] = args.first
62
+ conf.merge!(args.last)
63
+ end
64
+ conf
65
+ end
66
+
67
+ attr_reader :conf
68
+
69
+ def initialize(conf)
70
+ @conf = conf
71
+ end
72
+
73
+ def authorized?(usename,password)
74
+ conf[:auth_proc] ||= proc { |u,p| self.valid_user?(u) && self.password == p }
75
+ return conf[:auth_proc].call(usename,password)
76
+ end
77
+
78
+ def protecting?(path)
79
+ scope_pattern =~ path
80
+ end
81
+
82
+ def valid_user?(username)
83
+ return true if conf[:username].nil?
84
+ conf[:username] == username
85
+ end
86
+
87
+ def password
88
+ conf[:password]
89
+ end
90
+
91
+ def realm
92
+ conf[:realm] ||= "Protected Area"
93
+ end
94
+
95
+ def scope_pattern
96
+ @scope_pattern ||= case conf[:scope]
97
+ when nil: //
98
+ when String: /^#{conf[:scope]}/
99
+ else; conf[:scope]
100
+ end
101
+ end
102
+ end
103
+
104
+ register AuthDSL
105
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra-auth
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ platform: ruby
6
+ authors:
7
+ - Myles Byrne
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-14 00:00:00 +11:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sinatra
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.9.4
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: exemplor
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2010.0.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rack-test
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.4.0
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: pow
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.2.2
54
+ version:
55
+ description:
56
+ email: myles@myles.id.au
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - README.md
63
+ files:
64
+ - .gitignore
65
+ - README.md
66
+ - Rakefile
67
+ - VERSION
68
+ - examples/examples.rb
69
+ - lib/sinatra/auth.rb
70
+ has_rdoc: true
71
+ homepage: http://github.com/quackingduck/sinatra-auth
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options:
76
+ - --charset=UTF-8
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ version:
91
+ requirements: []
92
+
93
+ rubyforge_project:
94
+ rubygems_version: 1.3.5
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: Simple authentication for sinatra
98
+ test_files:
99
+ - examples/examples.rb