ichverstehe-chowder 0.1

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.
@@ -0,0 +1,28 @@
1
+ require 'sinatra/base'
2
+
3
+ module Sinatra
4
+ module Chowder
5
+ def current_user
6
+ session[:current_user]
7
+ end
8
+
9
+ def authorized?
10
+ current_user
11
+ end
12
+
13
+ def login
14
+ session[:redirect_to] = request.path_info
15
+ redirect '/login'
16
+ end
17
+
18
+ def logout
19
+ session[:current_user] = nil
20
+ end
21
+
22
+ def require_user
23
+ login unless authorized?
24
+ end
25
+ end
26
+
27
+ helpers Chowder
28
+ end
data/lib/chowder.rb ADDED
@@ -0,0 +1,95 @@
1
+ require 'sinatra/base'
2
+ require 'ostruct'
3
+ require 'openid'
4
+ require 'openid/store/filesystem'
5
+
6
+ module Chowder
7
+ class Base < Sinatra::Base
8
+ LOGIN_VIEW = <<-HTML
9
+ <form action="/login" method="POST">
10
+ Login: <input type="text" name="login" /><br />
11
+ Password: <input type="password" name="password" /><br />
12
+ <input type="submit" value="Login" />
13
+ </form>
14
+ OpenID:
15
+ <form action="/openid/initiate" method="POST">
16
+ URL: <input type="text" name="openid_identifier" /><br />
17
+ <input type="submit" value="Login" />
18
+ </form>
19
+ HTML
20
+
21
+ # Override this until in Sinatra supports it. See
22
+ # http://sinatra.lighthouseapp.com/projects/9779/tickets/160
23
+ def initialize(app=nil, *args, &block)
24
+ @app = app
25
+ @middleware = OpenStruct.new(:args => args, :block => block)
26
+ end
27
+
28
+ def authorize(user)
29
+ session[:current_user] = user
30
+ end
31
+
32
+ def return_or_redirect_to(path)
33
+ redirect(session[:return_to] || path)
34
+ end
35
+
36
+ def find_login_template
37
+ views_dir = self.options.views || "./views"
38
+ template = Dir[File.join(views_dir, 'login.*')].first
39
+ end
40
+
41
+ get '/login' do
42
+ if template = find_login_template
43
+ engine = File.extname(template)[1..-1]
44
+ send(engine, :login)
45
+ else
46
+ LOGIN_VIEW
47
+ end
48
+ end
49
+
50
+ get '/logout' do
51
+ session[:current_user] = nil
52
+ redirect '/'
53
+ end
54
+ end
55
+
56
+ class Basic < Base
57
+ post '/login' do
58
+ login, password = params[:login], params[:password]
59
+ if authorize @middleware.block.call(login, password)
60
+ return_or_redirect_to '/'
61
+ else
62
+ redirect '/login'
63
+ end
64
+ end
65
+ end
66
+
67
+ class OpenID < Base
68
+ def host
69
+ host = env['HTTP_HOST'] || "#{env['SERVER_NAME']}:#{env['SERVER_PORT']}"
70
+ "http://#{host}"
71
+ end
72
+
73
+ def setup_consumer
74
+ store = ::OpenID::Store::Filesystem.new('.openid')
75
+ osession = session[:openid] ||= {}
76
+ @consumer = ::OpenID::Consumer.new(osession, store)
77
+ end
78
+
79
+ post '/openid/initiate' do
80
+ setup_consumer
81
+ url = @consumer.begin(params['openid_identifier']).redirect_url(host, host + '/openid/authenticate')
82
+ redirect url
83
+ end
84
+
85
+ get '/openid/authenticate' do
86
+ setup_consumer
87
+ res = @consumer.complete(request.params, host + '/openid/authenticate')
88
+ user = @middleware.block.call(res.identity_url)
89
+ if res.is_a?(::OpenID::Consumer::SuccessResponse) && authorize(user)
90
+ return_or_redirect_to '/'
91
+ end
92
+ redirect '/login'
93
+ end
94
+ end
95
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ichverstehe-chowder
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.1"
5
+ platform: ruby
6
+ authors:
7
+ - Harry Vangberg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-26 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: harry@vangberg.name
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/chowder.rb
26
+ - lib/chowder/helpers/sinatra.rb
27
+ has_rdoc: false
28
+ homepage: http://github.com/ichverstehe/chowder
29
+ post_install_message:
30
+ rdoc_options: []
31
+
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: "0"
39
+ version:
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
+ version:
46
+ requirements: []
47
+
48
+ rubyforge_project:
49
+ rubygems_version: 1.2.0
50
+ signing_key:
51
+ specification_version: 2
52
+ summary: rack middleware providing session based authentication
53
+ test_files: []
54
+