dm-is-authenticatable 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 0.3.0 / 2013-04-22
2
+
3
+ * If `encrypted_password` is `nil`, have
4
+ {DataMapper::Is::Authenticatable::InstanceMethods#has_password?} only accept
5
+ `nil` or `""`.
6
+
1
7
  ### 0.2.0 / 2012-10-06
2
8
 
3
9
  * Added {DataMapper::Is::Authenticatable::InstanceMethods#password_required?}.
data/Gemfile CHANGED
@@ -80,7 +80,7 @@
80
80
  # Gemfile.lock is added to the .gitignore file, so you don't need to worry
81
81
  # about accidentally checking it into version control.
82
82
 
83
- source :rubygems
83
+ source 'https://rubygems.org'
84
84
 
85
85
  DATAMAPPER = 'http://github.com/datamapper'
86
86
  DM_VERSION = '~> 1.0'
@@ -95,7 +95,7 @@ gem 'dm-types', DM_VERSION, :git => "#{DATAMAPPER}/dm-types.git"
95
95
  gem 'dm-validations', DM_VERSION, :git => "#{DATAMAPPER}/dm-validations.git"
96
96
 
97
97
  group :development do
98
- gem 'rake', '~> 0.8'
98
+ gem 'rake', '~> 10.0'
99
99
  gem 'rubygems-tasks', '~> 0.1'
100
100
  gem 'rspec', '~> 2.4'
101
101
 
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2012 Hal Brodigan
1
+ Copyright (c) 2010-2013 Hal Brodigan
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -85,10 +85,10 @@ Using dm-is-authenticatable with [warden]:
85
85
 
86
86
  ## Requirements
87
87
 
88
- * [bcrypt-ruby](https://github.com/codahale/bcrypt-ruby#readme) ~> 3.0, >= 2.1.0
89
- * [dm-core](https://github.com/datamapper/dm-core#readme) ~> 1.0
90
- * [dm-types](https://github.com/datamapper/dm-types#readme) ~> 1.0
91
- * [dm-validations](https://github.com/datamapper/dm-validations#readme) ~> 1.0
88
+ * [bcrypt-ruby] ~> 3.0, >= 2.1.0
89
+ * [dm-core] ~> 1.0
90
+ * [dm-types] ~> 1.0
91
+ * [dm-validations] ~> 1.0
92
92
 
93
93
  ## Install
94
94
 
@@ -96,10 +96,15 @@ Using dm-is-authenticatable with [warden]:
96
96
 
97
97
  ## License
98
98
 
99
- Copyright (c) 2010-2012 Hal Brodigan
99
+ Copyright (c) 2010-2013 Hal Brodigan
100
100
 
101
101
  See {file:LICENSE.txt} for license information.
102
102
 
103
103
  [warden]: https://github.com/hassox/warden#readme
104
104
  [sinatra_warden]: https://github.com/jsmestad/sinatra_warden#readme
105
105
  [padrino-warden]: https://github.com/jondot/padrino-warden#readme
106
+
107
+ [bcrypt-ruby]: https://github.com/codahale/bcrypt-ruby#readme
108
+ [dm-core]: https://github.com/datamapper/dm-core#readme
109
+ [dm-types]: https://github.com/datamapper/dm-types#readme
110
+ [dm-validations]: https://github.com/datamapper/dm-validations#readme
data/Rakefile CHANGED
@@ -23,6 +23,7 @@ Gem::Tasks.new
23
23
 
24
24
  require 'rspec/core/rake_task'
25
25
  RSpec::Core::RakeTask.new
26
+ task :test => :spec
26
27
  task :default => :spec
27
28
 
28
29
  require 'yard'
@@ -2,126 +2,59 @@
2
2
 
3
3
  require 'yaml'
4
4
 
5
- Gem::Specification.new do |gemspec|
6
- files = if File.directory?('.git')
7
- `git ls-files`.split($/)
8
- elsif File.directory?('.hg')
9
- `hg manifest`.split($/)
10
- elsif File.directory?('.svn')
11
- `svn ls -R`.split($/).select { |path| File.file?(path) }
12
- else
13
- Dir['{**/}{.*,*}'].select { |path| File.file?(path) }
14
- end
5
+ Gem::Specification.new do |gem|
6
+ gemspec = YAML.load_file('gemspec.yml')
15
7
 
16
- filter_files = lambda { |paths|
17
- case paths
18
- when Array
19
- (files & paths)
20
- when String
21
- (files & Dir[paths])
22
- end
23
- }
24
-
25
- version = {
26
- :file => 'lib/dm-is-authenticatable/version.rb',
27
- :constant => 'DataMapper::Is::Authenticatable::VERSION'
28
- }
29
-
30
- defaults = {
31
- 'name' => File.basename(File.dirname(__FILE__)),
32
- 'files' => files,
33
- 'executables' => filter_files['bin/*'].map { |path| File.basename(path) },
34
- 'test_files' => filter_files['{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'],
35
- 'extra_doc_files' => filter_files['*.{txt,rdoc,md,markdown,tt,textile}'],
36
- }
37
-
38
- metadata = defaults.merge(YAML.load_file('gemspec.yml'))
39
-
40
- gemspec.name = metadata.fetch('name',defaults[:name])
41
- gemspec.version = if metadata['version']
42
- metadata['version']
43
- elsif File.file?(version[:file])
44
- require File.join('.',version[:file])
45
- eval(version[:constant])
46
- end
47
-
48
- gemspec.summary = metadata.fetch('summary',metadata['description'])
49
- gemspec.description = metadata.fetch('description',metadata['summary'])
50
-
51
- case metadata['license']
52
- when Array
53
- gemspec.licenses = metadata['license']
54
- when String
55
- gemspec.license = metadata['license']
56
- end
57
-
58
- case metadata['authors']
59
- when Array
60
- gemspec.authors = metadata['authors']
61
- when String
62
- gemspec.author = metadata['authors']
63
- end
8
+ gem.name = gemspec.fetch('name')
9
+ gem.version = gemspec.fetch('version') do
10
+ lib_dir = File.join(File.dirname(__FILE__),'lib')
11
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
64
12
 
65
- gemspec.email = metadata['email']
66
- gemspec.homepage = metadata['homepage']
13
+ require 'dm-is-authenticatable/is/authenticatable/version'
14
+ DataMapper::Is::Authenticatable::VERSION
15
+ end
67
16
 
68
- case metadata['require_paths']
69
- when Array
70
- gemspec.require_paths = metadata['require_paths']
71
- when String
72
- gemspec.require_path = metadata['require_paths']
73
- end
17
+ gem.summary = gemspec['summary']
18
+ gem.description = gemspec['description']
19
+ gem.licenses = Array(gemspec['license'])
20
+ gem.authors = Array(gemspec['authors'])
21
+ gem.email = gemspec['email']
22
+ gem.homepage = gemspec['homepage']
74
23
 
75
- gemspec.files = filter_files[metadata['files']]
24
+ glob = lambda { |patterns| gem.files & Dir[*patterns] }
76
25
 
77
- gemspec.executables = metadata['executables']
78
- gemspec.extensions = metadata['extensions']
26
+ gem.files = `git ls-files`.split($/)
27
+ gem.files = glob[gemspec['files']] if gemspec['files']
79
28
 
80
- if Gem::VERSION < '1.7.'
81
- gemspec.default_executable = gemspec.executables.first
29
+ gem.executables = gemspec.fetch('executables') do
30
+ glob['bin/*'].map { |path| File.basename(path) }
82
31
  end
32
+ gem.default_executable = gem.executables.first if Gem::VERSION < '1.7.'
83
33
 
84
- gemspec.test_files = filter_files[metadata['test_files']]
85
-
86
- unless gemspec.files.include?('.document')
87
- gemspec.extra_rdoc_files = metadata['extra_doc_files']
88
- end
89
-
90
- gemspec.post_install_message = metadata['post_install_message']
91
- gemspec.requirements = metadata['requirements']
92
-
93
- if gemspec.respond_to?(:required_ruby_version=)
94
- gemspec.required_ruby_version = metadata['required_ruby_version']
95
- end
34
+ gem.extensions = glob[gemspec['extensions'] || 'ext/**/extconf.rb']
35
+ gem.test_files = glob[gemspec['test_files'] || '{test/{**/}*_test.rb']
36
+ gem.extra_rdoc_files = glob[gemspec['extra_doc_files'] || '*.{txt,md}']
96
37
 
97
- if gemspec.respond_to?(:required_rubygems_version=)
98
- gemspec.required_rubygems_version = metadata['required_rubygems_version']
99
- end
38
+ gem.require_paths = Array(gemspec.fetch('require_paths') {
39
+ %w[ext lib].select { |dir| File.directory?(dir) }
40
+ })
100
41
 
101
- parse_versions = lambda { |versions|
102
- case versions
103
- when Array
104
- versions.map { |v| v.to_s }
105
- when String
106
- versions.split(/,\s*/)
107
- end
108
- }
42
+ gem.requirements = gemspec['requirements']
43
+ gem.required_ruby_version = gemspec['required_ruby_version']
44
+ gem.required_rubygems_version = gemspec['required_rubygems_version']
45
+ gem.post_install_message = gemspec['post_install_message']
109
46
 
110
- if metadata['dependencies']
111
- metadata['dependencies'].each do |name,versions|
112
- gemspec.add_dependency(name,parse_versions[versions])
113
- end
114
- end
47
+ split = lambda { |string| string.split(/,\s*/) }
115
48
 
116
- if metadata['runtime_dependencies']
117
- metadata['runtime_dependencies'].each do |name,versions|
118
- gemspec.add_runtime_dependency(name,parse_versions[versions])
49
+ if gemspec['dependencies']
50
+ gemspec['dependencies'].each do |name,versions|
51
+ gem.add_dependency(name,split[versions])
119
52
  end
120
53
  end
121
54
 
122
- if metadata['development_dependencies']
123
- metadata['development_dependencies'].each do |name,versions|
124
- gemspec.add_development_dependency(name,parse_versions[versions])
55
+ if gemspec['development_dependencies']
56
+ gemspec['development_dependencies'].each do |name,versions|
57
+ gem.add_development_dependency(name,split[versions])
125
58
  end
126
59
  end
127
60
  end
data/gemspec.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  name: dm-is-authenticatable
2
- version: 0.2.0
2
+ version: 0.3.0
3
3
  summary: DataMapper plugin for adding authentication to models.
4
4
  description:
5
5
  A DataMapper plugin for adding authentication and encrypted passwords to
@@ -4,6 +4,10 @@ require 'dm-validations'
4
4
  module DataMapper
5
5
  module Is
6
6
  module Authenticatable
7
+ #
8
+ # Adds the `encrypted_password property` and mixs in {ClassMethods}
9
+ # and {InstanceMethods}.
10
+ #
7
11
  def is_authenticatable(options={})
8
12
  # The encrypted password
9
13
  property :encrypted_password, DataMapper::Property::BCryptHash
@@ -14,6 +18,9 @@ module DataMapper
14
18
  validates_confirmation_of :password
15
19
  end
16
20
 
21
+ #
22
+ # Class methods.
23
+ #
17
24
  module ClassMethods
18
25
  #
19
26
  # Finds and authenticates a resource.
@@ -38,6 +45,9 @@ module DataMapper
38
45
  end
39
46
  end
40
47
 
48
+ #
49
+ # Instance methods.
50
+ #
41
51
  module InstanceMethods
42
52
  # The clear-text password
43
53
  attr_reader :password
@@ -83,7 +93,11 @@ module DataMapper
83
93
  # @since 0.2.0
84
94
  #
85
95
  def has_password?(submitted_password)
86
- !password_required? || (self.encrypted_password == submitted_password)
96
+ if password_required?
97
+ self.encrypted_password == submitted_password
98
+ else
99
+ submitted_password.nil? || submitted_password.empty?
100
+ end
87
101
  end
88
102
  end
89
103
  end
@@ -72,8 +72,16 @@ describe DataMapper::Is::Authenticatable do
72
72
  context "when #password_required? is false" do
73
73
  before { subject.stub(:password_required?).and_return(false) }
74
74
 
75
- it "should return true" do
76
- subject.should have_password('does not matter')
75
+ it "should return true for nil" do
76
+ subject.should have_password(nil)
77
+ end
78
+
79
+ it "should return true for ''" do
80
+ subject.should have_password('')
81
+ end
82
+
83
+ it "should return false for any other String" do
84
+ subject.should_not have_password('foo')
77
85
  end
78
86
  end
79
87
  end
@@ -117,5 +125,29 @@ describe DataMapper::Is::Authenticatable do
117
125
 
118
126
  user.should be_nil
119
127
  end
128
+
129
+ context "when encrypted password is nil" do
130
+ before(:all) do
131
+ User.first(:name => name).update(:encrypted_password => nil)
132
+ end
133
+
134
+ it "should allow authenticating with a nil password" do
135
+ user = subject.authenticate(:name => name, :password => nil)
136
+
137
+ user.name.should == name
138
+ end
139
+
140
+ it "should allow authenticating with an empty password" do
141
+ user = subject.authenticate(:name => name, :password => '')
142
+
143
+ user.name.should == name
144
+ end
145
+
146
+ it "should not allow authenticating with any other password" do
147
+ user = subject.authenticate(:name => name, :password => 'foo')
148
+
149
+ user.should be_nil
150
+ end
151
+ end
120
152
  end
121
153
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-is-authenticatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-07 00:00:00.000000000 Z
12
+ date: 2013-04-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bcrypt-ruby
@@ -159,9 +159,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
159
159
  version: '0'
160
160
  requirements: []
161
161
  rubyforge_project:
162
- rubygems_version: 1.8.24
162
+ rubygems_version: 1.8.25
163
163
  signing_key:
164
164
  specification_version: 3
165
165
  summary: DataMapper plugin for adding authentication to models.
166
- test_files:
167
- - spec/integration/authenticatable_spec.rb
166
+ test_files: []