sinatra-authentication 0.1.1 → 0.2.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/Manifest CHANGED
@@ -5,6 +5,8 @@ TODO
5
5
  lib/models/abstract_user.rb
6
6
  lib/models/datamapper_user.rb
7
7
  lib/models/dm_adapter.rb
8
+ lib/models/mongomapper_user.rb
9
+ lib/models/mm_adapter.rb
8
10
  lib/models/rufus_tokyo_user.rb
9
11
  lib/models/tc_adapter.rb
10
12
  lib/sinatra-authentication.rb
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ begin
6
6
 
7
7
  Jeweler::Tasks.new do |gemspec|
8
8
  gemspec.name = 'sinatra-authentication'
9
- gemspec.version = '0.1.1'
9
+ gemspec.version = '0.2.0'
10
10
  gemspec.description = "Simple authentication plugin for sinatra."
11
11
  gemspec.summary = "Simple authentication plugin for sinatra."
12
12
  gemspec.homepage = "http://github.com/maxjustus/sinatra-authentication"
@@ -25,3 +25,12 @@ rescue LoadError
25
25
  end
26
26
 
27
27
  Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new do |t|
32
+ t.libs << "test"
33
+ t.test_files = FileList['test/mongomapper_test.rb']
34
+ t.verbose = true
35
+ end
36
+
@@ -4,9 +4,12 @@ if Object.const_defined?("DataMapper")
4
4
  require 'dm-validations'
5
5
  require Pathname(__FILE__).dirname.expand_path + "datamapper_user.rb"
6
6
  require Pathname(__FILE__).dirname.expand_path + "dm_adapter.rb"
7
- elsif Object.const_defined?("Rufus") && Rufus.const_defined?("Tokyo")
7
+ elsif Object.const_defined?("Rufus")
8
8
  require Pathname(__FILE__).dirname.expand_path + "rufus_tokyo_user.rb"
9
9
  require Pathname(__FILE__).dirname.expand_path + "tc_adapter.rb"
10
+ elsif Object.const_defined?("MongoMapper")
11
+ require Pathname(__FILE__).dirname.expand_path + "mongomapper_user.rb"
12
+ require Pathname(__FILE__).dirname.expand_path + "mm_adapter.rb"
10
13
  end
11
14
 
12
15
  class User
@@ -14,8 +17,10 @@ class User
14
17
  include DmAdapter
15
18
  elsif Object.const_defined?("Rufus")
16
19
  include TcAdapter
20
+ elsif Object.const_defined?("MongoMapper")
21
+ include MmAdapter
17
22
  else
18
- throw "you need to require either 'dm-core' or 'rufus-tokyo' for sinatra-authentication to work"
23
+ throw "you need to require either 'dm-core', 'mongo_mapper', or 'rufus-tokyo' for sinatra-authentication to work"
19
24
  end
20
25
 
21
26
  def initialize(interfacing_class_instance)
@@ -0,0 +1,53 @@
1
+ module MmAdapter
2
+ def self.included(base)
3
+ base.extend ClassMethods
4
+ base.class_eval { include MmAdapter::InstanceMethods }
5
+ end
6
+
7
+ module ClassMethods
8
+ def all
9
+ result = MmUser.all
10
+ result.collect {|instance| self.new instance}
11
+ end
12
+
13
+ def get(hash)
14
+ if user = MmUser.first(hash)
15
+ self.new user
16
+ else
17
+ nil
18
+ end
19
+ end
20
+
21
+ def set(attributes)
22
+ puts attributes.inspect
23
+ user = MmUser.new attributes
24
+ puts user.inspect
25
+ puts user.to_json
26
+ user.save
27
+ user
28
+ end
29
+
30
+ def set!(attributes)
31
+ user = MmUser.new attributes
32
+ user.save!
33
+ user
34
+ end
35
+
36
+ def delete(pk)
37
+ user = User.first(:id => pk)
38
+ user.destroy
39
+ end
40
+ end
41
+
42
+ module InstanceMethods
43
+ def update(attributes)
44
+ @instance.update_attributes attributes
45
+ @instance.save
46
+ end
47
+
48
+ def method_missing(meth, *args, &block)
49
+ #cool I just found out * on an array turns the array into a list of args for a function
50
+ @instance.send(meth, *args, &block)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,41 @@
1
+ class MmUser
2
+ include MongoMapper::Document
3
+
4
+ key :email, String, :length => (5..40), :unique => true
5
+ key :hashed_password, String
6
+ key :salt, String
7
+ key :created_at, DateTime
8
+ key :permission_level, Integer, :default => 1
9
+ if Sinatra.const_defined?('FacebookObject')
10
+ key :fb_uid, String
11
+ end
12
+
13
+ attr_accessor :password, :password_confirmation
14
+ #protected equievelant? :protected => true doesn't exist in dm 0.10.0
15
+ #protected :id, :salt
16
+ #doesn't behave correctly, I'm not even sure why I did this.
17
+
18
+ #validates_presence_of :password_confirmation, :unless => Proc.new { |t| t.hashed_password }
19
+ #validates_presence_of :password, :unless => Proc.new { |t| t.hashed_password }
20
+ #validates_is_confirmed :password
21
+
22
+ def password=(pass)
23
+ @password = pass
24
+ self.salt = User.random_string(10) if !self.salt
25
+ self.hashed_password = User.encrypt(@password, self.salt)
26
+ end
27
+
28
+ def admin?
29
+ self.permission_level == -1 || self.id == 1
30
+ end
31
+
32
+ def site_admin?
33
+ self.id == 1
34
+ end
35
+
36
+ protected
37
+
38
+ def method_missing(m, *args)
39
+ return false
40
+ end
41
+ end
@@ -36,9 +36,9 @@ class TcUser
36
36
  def self.query(&block)
37
37
  connection = TcUserTable.new
38
38
  result_set = connection.query(&block)
39
- output = result_set.collect { |result_hash| TcUser.new(result_hash) }
39
+ result_set.collect! { |result_hash| TcUser.new(result_hash) }
40
40
  connection.close
41
- output
41
+ result_set
42
42
  end
43
43
 
44
44
  def self.get(key)
@@ -2,10 +2,6 @@ require 'sinatra/base'
2
2
  require 'pathname'
3
3
  require Pathname(__FILE__).dirname.expand_path + "models/abstract_user"
4
4
 
5
- module SinatraAuthentication
6
- VERSION = "0.0.3"
7
- end
8
-
9
5
  module Sinatra
10
6
  module LilAuthentication
11
7
  def self.registered(app)
@@ -17,12 +13,10 @@ module Sinatra
17
13
  #loading the view from this path into a string and rendering it
18
14
  set :lil_authentication_view_path, Pathname(__FILE__).dirname.expand_path + "views/"
19
15
 
20
- #TODO write captain sinatra developer man and inform him that the documentation
21
- #concerning the writing of extensions is somewhat outdaded/incorrect.
22
- #you do not need to to do self.get/self.post when writing an extension
23
- #In fact, it doesn't work. You have to use the plain old sinatra DSL
24
-
25
16
  get '/users' do
17
+ login_required
18
+ redirect "/" unless current_user.admin?
19
+
26
20
  @users = User.all
27
21
  if @users != []
28
22
  haml get_view_as_string("index.haml"), :layout => use_layout?
@@ -52,18 +46,18 @@ module Sinatra
52
46
  end
53
47
 
54
48
  post '/login' do
55
- if user = User.authenticate(params[:email], params[:password])
56
- session[:user] = user.id
57
- if session[:return_to]
58
- redirect_url = session[:return_to]
59
- session[:return_to] = false
60
- redirect redirect_url
61
- else
62
- redirect '/'
63
- end
49
+ if user = User.authenticate(params[:email], params[:password])
50
+ session[:user] = user.id
51
+ if session[:return_to]
52
+ redirect_url = session[:return_to]
53
+ session[:return_to] = false
54
+ redirect redirect_url
64
55
  else
65
- redirect '/login'
56
+ redirect '/'
66
57
  end
58
+ else
59
+ redirect '/login'
60
+ end
67
61
  end
68
62
 
69
63
  get '/logout' do
@@ -212,19 +206,19 @@ module Sinatra
212
206
  logout_parameters = html_attributes
213
207
  # a tad janky?
214
208
  logout_parameters.delete(:rel)
215
- result += "<a href='/users/#{current_user.id}/edit' class='#{css_classes} sinatra-authentication-edit' #{parameters}>edit account</a> "
209
+ result += "<a href='/users/#{current_user.id}/edit' class='#{css_classes} sinatra-authentication-edit' #{parameters}>Edit account</a> "
216
210
  if Sinatra.const_defined?('FacebookObject')
217
211
  if fb[:user]
218
- result += "<a href='javascript:FB.Connect.logoutAndRedirect(\"/logout\");' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
212
+ result += "<a href='javascript:FB.Connect.logoutAndRedirect(\"/logout\");' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>Logout</a>"
219
213
  else
220
- result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
214
+ result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>Logout</a>"
221
215
  end
222
216
  else
223
- result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>logout</a>"
217
+ result += "<a href='/logout' class='#{css_classes} sinatra-authentication-logout' #{logout_parameters}>Logout</a>"
224
218
  end
225
219
  else
226
- result += "<a href='/signup' class='#{css_classes} sinatra-authentication-signup' #{parameters}>signup</a> "
227
- result += "<a href='/login' class='#{css_classes} sinatra-authentication-login' #{parameters}>login</a>"
220
+ result += "<a href='/signup' class='#{css_classes} sinatra-authentication-signup' #{parameters}>Signup</a> "
221
+ result += "<a href='/login' class='#{css_classes} sinatra-authentication-login' #{parameters}>Login</a>"
228
222
  end
229
223
 
230
224
  result += "</div>"
data/lib/views/edit.haml CHANGED
@@ -1,6 +1,6 @@
1
1
  #sinatra_authentication
2
2
  %h1
3
- Editing
3
+ Edit
4
4
  - if @user.id == current_user.id
5
5
  account
6
6
  - else
data/lib/views/login.haml CHANGED
@@ -1,13 +1,18 @@
1
1
  #sinatra_authentication
2
2
  %h1 Login
3
3
  %form{:action => "/login", :method => "post"}
4
- %input{:id => "user_email", :name => "email", :size => 30, :type => "text"}
5
- email
4
+ %p
5
+ %label{:for => "user_email'"} Email
6
+ %br
7
+ %input{:id => "user_email", :name => "email", :size => 30, :type => "text"}
8
+ %p
9
+ %label{:for => "user_password"} Password
10
+ %br
11
+ %input{:id => "user_password", :name => "password", :size => 30, :type => "password"}
12
+ %p
13
+ %input{:value => "login", :type => "submit"}
14
+ %a{:href => "/signup"}
15
+ Signup
6
16
  %br
7
- %input{:id => "user_password", :name => "password", :size => 30, :type => "password"}
8
- password
9
- %br
10
- %input{:value => "login", :type => "submit"}
11
17
  - if Sinatra.const_defined?('FacebookObject')
12
- |
13
18
  = render_facebook_connect_link
@@ -1,13 +1,17 @@
1
1
  #sinatra_authentication
2
2
  %h1 Signup
3
3
  %form{:action => "/signup", :method => "post"}
4
- %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text" }
5
- email
6
- %br
7
- %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
8
- password
9
- %br
10
- %input{ :id => "user_password_confirmation", :name => "user[password_confirmation]", :size => 30, :type => "password" }
11
- confirm
12
- %br
13
- %input{ :value => "sign up", :type => "submit" }
4
+ %p
5
+ %label{:for => "user_email"} Email
6
+ %br
7
+ %input{ :id => "user_email", :name => "user[email]", :size => 30, :type => "text" }
8
+ %p
9
+ %label{:for => "user_password"} Password
10
+ %br
11
+ %input{ :id => "user_password", :name => "user[password]", :size => 30, :type => "password" }
12
+ %p
13
+ %label{:for => "user_password_confirmation"} Confirm Password
14
+ %br
15
+ %input{ :id => "user_password_confirmation", :name => "user[password_confirmation]", :size => 30, :type => "password" }
16
+ %p
17
+ %input{ :value => "Create account", :type => "submit" }
@@ -5,13 +5,16 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra-authentication}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Max Justus Spransy"]
12
- s.date = %q{2009-12-05}
12
+ s.date = %q{2010-01-13}
13
13
  s.description = %q{Simple authentication plugin for sinatra.}
14
14
  s.email = %q{maxjustus@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "TODO"
17
+ ]
15
18
  s.files = [
16
19
  ".gitignore",
17
20
  "History.txt",
@@ -21,6 +24,8 @@ Gem::Specification.new do |s|
21
24
  "lib/models/abstract_user.rb",
22
25
  "lib/models/datamapper_user.rb",
23
26
  "lib/models/dm_adapter.rb",
27
+ "lib/models/mm_adapter.rb",
28
+ "lib/models/mongomapper_user.rb",
24
29
  "lib/models/rufus_tokyo_user.rb",
25
30
  "lib/models/tc_adapter.rb",
26
31
  "lib/sinatra-authentication.rb",
@@ -35,8 +40,10 @@ Gem::Specification.new do |s|
35
40
  "test/lib/dm_app.rb",
36
41
  "test/lib/dm_sinbook.rb",
37
42
  "test/lib/helper.rb",
43
+ "test/lib/mm_app.rb",
38
44
  "test/lib/tc_app.rb",
39
45
  "test/lib/tc_sinbook.rb",
46
+ "test/mongomapper_test.rb",
40
47
  "test/route_tests.rb",
41
48
  "test/rufus_tokyo_test.rb"
42
49
  ]
@@ -48,10 +55,12 @@ Gem::Specification.new do |s|
48
55
  s.test_files = [
49
56
  "test/lib/dm_sinbook.rb",
50
57
  "test/lib/tc_app.rb",
58
+ "test/lib/mm_app.rb",
51
59
  "test/lib/tc_sinbook.rb",
52
60
  "test/lib/helper.rb",
53
61
  "test/lib/dm_app.rb",
54
62
  "test/datamapper_test.rb",
63
+ "test/mongomapper_test.rb",
55
64
  "test/rufus_tokyo_test.rb",
56
65
  "test/route_tests.rb"
57
66
  ]
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'sinatra/base'
3
+ require 'haml'
4
+ require 'mongo_mapper'
5
+ require File.join(File.dirname(__FILE__), '../../lib/sinatra-authentication')
6
+
7
+ logger = Logger.new($stdout)
8
+ MongoMapper.connection = Mongo::Connection.new('db.mongohq.com', 27017, :logger => logger)
9
+ MongoMapper.database = "fdbk"
10
+ MongoMapper.database.authenticate(ENV['mongohq_user'], ENV['mongohq_pass'])
11
+
12
+ class TestApp < Sinatra::Base
13
+ use Rack::Session::Cookie, :secret => "heyhihello"
14
+
15
+ register Sinatra::LilAuthentication
16
+
17
+ set :environment, 'development'
18
+ set :public, 'public'
19
+ set :views, 'views'
20
+
21
+ get '/' do
22
+ haml "= render_login_logout", :layout => :layout
23
+ end
24
+ end
@@ -0,0 +1,39 @@
1
+ require 'lib/mm_app'
2
+ require 'lib/helper'
3
+ require 'test/unit'
4
+ require 'rack/test'
5
+
6
+ Test::Unit::TestCase.send :include, Rack::Test::Methods
7
+
8
+ class SinatraAuthMongoMapperTest < Test::Unit::TestCase
9
+ include Rack::Test::Methods
10
+
11
+ def app
12
+ TestApp
13
+ end
14
+
15
+ def setup
16
+ post '/signup', TestHelper.gen_user
17
+ follow_redirect!
18
+ get '/logout'
19
+ end
20
+
21
+ def test_should_login
22
+ post '/login', {'email' => TestHelper.gen_user['user[email]'], 'password' => TestHelper.gen_user['user[password]']}
23
+ follow_redirect!
24
+
25
+ assert_equal 'http://example.org/', last_request.url
26
+ #assert cookie_jar['user']
27
+ assert last_request.env['rack.session'][:user]
28
+ assert last_response.ok?
29
+ end
30
+
31
+ def test_should_logout
32
+ post '/login', {'email' => TestHelper.gen_user['user[email]'], 'password' => TestHelper.gen_user['user[password]']}
33
+ get '/logout'
34
+ follow_redirect!
35
+
36
+ assert !last_request.env['rack.session'][:user]
37
+ assert_equal 'http://example.org/', last_request.url
38
+ end
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-authentication
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Justus Spransy
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-05 00:00:00 -06:00
12
+ date: 2010-01-13 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -78,8 +78,8 @@ executables: []
78
78
 
79
79
  extensions: []
80
80
 
81
- extra_rdoc_files: []
82
-
81
+ extra_rdoc_files:
82
+ - TODO
83
83
  files:
84
84
  - .gitignore
85
85
  - History.txt
@@ -89,6 +89,8 @@ files:
89
89
  - lib/models/abstract_user.rb
90
90
  - lib/models/datamapper_user.rb
91
91
  - lib/models/dm_adapter.rb
92
+ - lib/models/mm_adapter.rb
93
+ - lib/models/mongomapper_user.rb
92
94
  - lib/models/rufus_tokyo_user.rb
93
95
  - lib/models/tc_adapter.rb
94
96
  - lib/sinatra-authentication.rb
@@ -103,8 +105,10 @@ files:
103
105
  - test/lib/dm_app.rb
104
106
  - test/lib/dm_sinbook.rb
105
107
  - test/lib/helper.rb
108
+ - test/lib/mm_app.rb
106
109
  - test/lib/tc_app.rb
107
110
  - test/lib/tc_sinbook.rb
111
+ - test/mongomapper_test.rb
108
112
  - test/route_tests.rb
109
113
  - test/rufus_tokyo_test.rb
110
114
  has_rdoc: true
@@ -138,9 +142,11 @@ summary: Simple authentication plugin for sinatra.
138
142
  test_files:
139
143
  - test/lib/dm_sinbook.rb
140
144
  - test/lib/tc_app.rb
145
+ - test/lib/mm_app.rb
141
146
  - test/lib/tc_sinbook.rb
142
147
  - test/lib/helper.rb
143
148
  - test/lib/dm_app.rb
144
149
  - test/datamapper_test.rb
150
+ - test/mongomapper_test.rb
145
151
  - test/rufus_tokyo_test.rb
146
152
  - test/route_tests.rb