authlogic_crowd_rest 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.0.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{authlogic_crowd_rest}
8
- s.version = "1.0.1"
8
+ s.version = "1.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rob Di Marco"]
12
- s.date = %q{2011-02-26}
12
+ s.date = %q{2011-03-07}
13
13
  s.description = %q{Foo}
14
14
  s.email = %q{rob.dimarco@416software.com}
15
15
  s.extra_rdoc_files = [
@@ -39,7 +39,7 @@ Gem::Specification.new do |s|
39
39
  s.homepage = %q{http://github.com/robdimarco/authlogic_crowd_rest}
40
40
  s.licenses = ["MIT"]
41
41
  s.require_paths = ["lib"]
42
- s.rubygems_version = %q{1.5.2}
42
+ s.rubygems_version = %q{1.6.0}
43
43
  s.summary = %q{An Authlogic plugin to connect with Atlassian Crowd REST APIs}
44
44
  s.test_files = [
45
45
  "test/acts_as_authentic_test.rb",
@@ -8,13 +8,32 @@ module AuthlogicCrowdRest
8
8
  end
9
9
 
10
10
  module Config
11
+ # Whether or not to validate the crowd_login field. If set to false ALL crowd validation will need to be
12
+ # handled by you.
13
+ #
14
+ # * <tt>Default:</tt> true
15
+ # * <tt>Accepts:</tt> Boolean
16
+ def validate_crowd_login(value = nil)
17
+ rw_config(:validate_crowd_login, value, true)
18
+ end
19
+ alias_method :validate_crowd_login=, :validate_crowd_login
11
20
  end
12
21
 
13
22
  module Methods
14
23
  def self.included(klass)
24
+ return if !klass.column_names.include?("crowd_login")
15
25
  klass.class_eval do
26
+ attr_accessor :crowd_password
27
+
28
+ if validate_crowd_login
29
+ validates_uniqueness_of :crowd_login, :scope => validations_scope, :if => :using_crowd?
30
+ end
16
31
  end
17
32
  end
33
+ private
34
+ def using_crowd?
35
+ respond_to?(:crowd_login) && !crowd_login.blank?
36
+ end
18
37
  end
19
38
  end
20
39
  end
@@ -35,12 +35,56 @@ module AuthlogicCrowdRest
35
35
  rw_config(:crowd_application_password, value)
36
36
  end
37
37
  alias_method :crowd_application_password=, :crowd_application_password
38
+
39
+ # Once Crowd authentication has succeeded we need to find the user in the database. By default this just calls the
40
+ # find_by_crowd_login method provided by ActiveRecord. If you have a more advanced set up and need to find users
41
+ # differently specify your own method and define your logic in there.
42
+ #
43
+ # For example, if you allow users to store multiple crowd logins with their account, you might do something like:
44
+ #
45
+ # class User < ActiveRecord::Base
46
+ # def self.find_by_crowd_login(login)
47
+ # first(:conditions => ["#{CrowdLogin.table_name}.login = ?", login], :join => :crowd_logins)
48
+ # end
49
+ # end
50
+ #
51
+ # * <tt>Default:</tt> :find_by_crowd_login
52
+ # * <tt>Accepts:</tt> Symbol
53
+ def find_by_crowd_login_method(value = nil)
54
+ rw_config(:find_by_crowd_login_method, value, :find_by_crowd_login)
55
+ end
56
+ alias_method :find_by_crowd_login_method=, :find_by_crowd_login_method
38
57
  end
39
58
 
40
59
  module Methods
41
60
  def self.included(klass)
42
61
  klass.class_eval do
43
62
  validate :validate_by_crowd_rest, :if => :authenticating_with_crowd_rest?
63
+ attr_accessor :crowd_login
64
+ attr_accessor :crowd_password
65
+ end
66
+ end
67
+
68
+ # Hooks into credentials so that you can pass an :ldap_login and :ldap_password key.
69
+ # Hooks into credentials to print out meaningful credentials for LDAP authentication.
70
+ def credentials
71
+ if authenticating_with_crowd_rest?
72
+ details = {}
73
+ details[:crowd_login] = send(login_field)
74
+ details[:crowd_password] = "<protected>"
75
+ details
76
+ else
77
+ super
78
+ end
79
+ end
80
+
81
+ def credentials=(value)
82
+ super
83
+ values = value.is_a?(Array) ? value : [value]
84
+ hash = values.first.is_a?(Hash) ? values.first.with_indifferent_access : nil
85
+ if !hash.nil?
86
+ self.crowd_login = hash[:crowd_login] if hash.key?(:crowd_login)
87
+ self.crowd_password = hash[:crowd_password] if hash.key?(:crowd_password)
44
88
  end
45
89
  end
46
90
 
@@ -51,41 +95,40 @@ module AuthlogicCrowdRest
51
95
 
52
96
  def validate_by_crowd_rest
53
97
  self.invalid_password = false
54
- errors.add(login_field, I18n.t('error_messages.login_blank', :default => "cannot be blank")) if send(login_field).blank?
55
- errors.add(password_field, I18n.t('error_messages.password_blank', :default => "cannot be blank")) if send("protected_#{password_field}").blank?
98
+
99
+ errors.add(:crowd_login, I18n.t('error_messages.crowd_login_blank', :default => "can not be blank")) if crowd_login.blank?
100
+ errors.add(:crowd_password, I18n.t('error_messages.crowd_password_blank', :default => "can not be blank")) if crowd_password.blank?
56
101
  return if errors.count > 0
57
102
 
58
- self.attempted_record = search_for_record(find_by_login_method, send(login_field))
103
+ self.attempted_record = search_for_record(find_by_crowd_login_method, crowd_login)
59
104
  if attempted_record.blank?
60
105
  generalize_credentials_error_messages? ?
61
106
  add_general_credentials_error :
62
- errors.add(login_field, I18n.t('error_messages.login_not_found', :default => "is not valid"))
107
+ errors.add("crowd_login", I18n.t('error_messages.crowd_login_not_found', :default => "is not valid"))
63
108
  return
64
109
  end
65
110
 
66
111
  if !(send( :verify_crowd_password, attempted_record))
67
- puts "Invalid!"
68
112
  self.invalid_password = true
69
113
  generalize_credentials_error_messages? ?
70
114
  add_general_credentials_error :
71
- errors.add(password_field, I18n.t('error_messages.password_invalid', :default => "is not valid"))
115
+ errors.add("crowd_password", I18n.t('error_messages.crowd_password_invalid', :default => "is not valid"))
72
116
  return
73
117
  end
74
118
  end
75
119
 
76
120
  def verify_crowd_password(attempted_record)
77
- password = attempted_record.send(verify_password_method, send("protected_#{password_field}"))
78
121
  require 'net/http'
79
122
  require 'net/https'
80
- uri = URI.parse(send("crowd_base_url"))
123
+ uri = URI.parse(send("crowd_base_url") + "/rest/usermanagement/latest/authentication")
81
124
 
82
125
  begin
83
126
  http = Net::HTTP.new(uri.host, uri.port)
84
127
  http.use_ssl = uri.scheme == "https"
85
128
  http.start {|http|
86
- req = Net::HTTP::Post.new(uri.path + "?" + "username=#{send(login_field)}")
129
+ req = Net::HTTP::Post.new(uri.path + "?" + "username=#{crowd_login}")
87
130
  req.basic_auth send("crowd_application_name"), send("crowd_application_password")
88
- req.body="<password><value>#{send("protected_#{password_field}")}</value></password>"
131
+ req.body="<password><value>#{crowd_password}</value></password>"
89
132
  req.add_field 'Content-Type', 'text/xml'
90
133
  resp, data = http.request(req)
91
134
  resp.code.to_i == 200
@@ -105,6 +148,9 @@ module AuthlogicCrowdRest
105
148
  def crowd_base_url
106
149
  self.class.crowd_base_url
107
150
  end
151
+ def find_by_crowd_login_method
152
+ self.class.find_by_crowd_login_method
153
+ end
108
154
  end
109
155
  end
110
156
  end
data/test/session_test.rb CHANGED
@@ -4,42 +4,43 @@ class SessionTest < ActiveSupport::TestCase
4
4
  setup :setup_http_stubs, :setup_users
5
5
 
6
6
  def setup_http_stubs
7
- stub_request(:post, "http://example:bogus@localhost/crowd/console?username=ben").
8
- with(:body => "<password><value>benrocks</value></password>",
7
+ stub_request(:post, "http://example:bogus@localhost/crowd/console/rest/usermanagement/latest/authentication?username=ben").
8
+ with(:body => "<password><value>benrocks</value></password>",
9
9
  :headers => {'Accept'=>'*/*', 'Content-Type'=>'text/xml'}).
10
10
  to_return(:status => 200, :body => %q[<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user name="ben" expand="attributes"><link rel="self" href="http://localhost/crowd/rest/usermanagement/latest/user?username=ben"/><first-name>Ben</first-name><last-name>Johnson</last-name><display-name>Rob Dimarco</display-name><email>ben@foo.com</email><password><link rel="edit" href="http://localhost/crowd/rest/usermanagement/latest/user/password?username=ben"/></password><active>true</active><attributes><link rel="self" href="http://localhost/crowd/rest/usermanagement/latest/user/attribute?username=ben"/></attributes></user>], :headers => {})
11
-
12
- stub_request(:post, "http://example:bogus@localhost/crowd/console?username=ben").
13
- with(:body => "<password><value>bogus</value></password>",
11
+
12
+ stub_request(:post, "http://example:bogus@localhost/crowd/console/rest/usermanagement/latest/authentication?username=ben").
13
+ with(:body => "<password><value>bogus</value></password>",
14
14
  :headers => {'Accept'=>'*/*', 'Content-Type'=>'text/xml'}).
15
15
  to_return(:status => 400, :body => %q[Incorrect], :headers => {})
16
16
  end
17
-
17
+
18
18
  def setup_users
19
- User.find_or_create_by_login :login=>"ben", :email=>"foo@bar.com", :password=>"benrocks", :password_confirmation => "benrocks"
19
+ u = User.find_or_create_by_crowd_login :crowd_login=>"ben", :email=>"foo@bar.com"
20
+ raise "Problem creating user...#{u.errors.inspect}" unless u.valid?
20
21
  end
21
-
22
+
22
23
  def test_use_crowd_rest_authentication
23
- assert_not_nil User.find_by_login 'ben'
24
+ assert_not_nil User.find_by_crowd_login 'ben'
24
25
 
25
26
  UserSession.crowd_base_url = "http://localhost/crowd/console"
26
27
  UserSession.crowd_application_name = "example"
27
28
  UserSession.crowd_application_password = "bogus"
28
-
29
- session = UserSession.new(:login => 'ben', :password => "benrocks")
29
+
30
+ session = UserSession.new(:crowd_login => 'ben', :crowd_password => "benrocks")
30
31
 
31
32
  assert session.save
32
33
  end
33
34
 
34
35
  def test_invalid_password
35
- assert_not_nil User.find_by_login 'ben'
36
+ assert_not_nil User.find_by_crowd_login 'ben'
36
37
  UserSession.crowd_base_url = "http://localhost/crowd/console"
37
38
  UserSession.crowd_application_name = "example"
38
39
  UserSession.crowd_application_password = "bogus"
39
-
40
- session = UserSession.new(:login => 'ben', :password => "bogus")
40
+
41
+ session = UserSession.new(:crowd_login => 'ben', :crowd_password => "bogus")
41
42
 
42
43
  assert !session.save
43
- assert_equal ["Password is not valid"], session.errors.full_messages
44
+ assert_equal ["Crowd password is not valid"], session.errors.full_messages
44
45
  end
45
46
  end
data/test/test_helper.rb CHANGED
@@ -32,15 +32,13 @@ ActiveRecord::Schema.define(:version => 1) do
32
32
  t.datetime :created_at
33
33
  t.datetime :updated_at
34
34
  t.integer :lock_version, :default => 0
35
- t.string :login
36
- t.string :crypted_password
37
- t.string :password_salt
38
35
  t.string :persistence_token
39
36
  t.string :single_access_token
40
37
  t.string :perishable_token
41
38
  t.string :email
42
39
  t.string :first_name
43
40
  t.string :last_name
41
+ t.string :crowd_login
44
42
  t.integer :login_count, :default => 0, :null => false
45
43
  t.integer :failed_login_count, :default => 0, :null => false
46
44
  t.datetime :last_request_at
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authlogic_crowd_rest
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 1
10
- version: 1.0.1
9
+ - 2
10
+ version: 1.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rob Di Marco
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-26 00:00:00 -05:00
18
+ date: 2011-03-07 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -29,8 +29,8 @@ dependencies:
29
29
  segments:
30
30
  - 0
31
31
  version: "0"
32
- name: authlogic
33
32
  version_requirements: *id001
33
+ name: authlogic
34
34
  prerelease: false
35
35
  - !ruby/object:Gem::Dependency
36
36
  type: :development
@@ -45,8 +45,8 @@ dependencies:
45
45
  - 0
46
46
  - 0
47
47
  version: 1.0.0
48
- name: bundler
49
48
  version_requirements: *id002
49
+ name: bundler
50
50
  prerelease: false
51
51
  - !ruby/object:Gem::Dependency
52
52
  type: :development
@@ -61,8 +61,8 @@ dependencies:
61
61
  - 5
62
62
  - 2
63
63
  version: 1.5.2
64
- name: jeweler
65
64
  version_requirements: *id003
65
+ name: jeweler
66
66
  prerelease: false
67
67
  - !ruby/object:Gem::Dependency
68
68
  type: :development
@@ -75,8 +75,8 @@ dependencies:
75
75
  segments:
76
76
  - 0
77
77
  version: "0"
78
- name: rcov
79
78
  version_requirements: *id004
79
+ name: rcov
80
80
  prerelease: false
81
81
  - !ruby/object:Gem::Dependency
82
82
  type: :development
@@ -89,8 +89,8 @@ dependencies:
89
89
  segments:
90
90
  - 0
91
91
  version: "0"
92
- name: actionpack
93
92
  version_requirements: *id005
93
+ name: actionpack
94
94
  prerelease: false
95
95
  - !ruby/object:Gem::Dependency
96
96
  type: :development
@@ -103,8 +103,8 @@ dependencies:
103
103
  segments:
104
104
  - 0
105
105
  version: "0"
106
- name: activerecord
107
106
  version_requirements: *id006
107
+ name: activerecord
108
108
  prerelease: false
109
109
  - !ruby/object:Gem::Dependency
110
110
  type: :development
@@ -117,8 +117,8 @@ dependencies:
117
117
  segments:
118
118
  - 0
119
119
  version: "0"
120
- name: sqlite3
121
120
  version_requirements: *id007
121
+ name: sqlite3
122
122
  prerelease: false
123
123
  - !ruby/object:Gem::Dependency
124
124
  type: :development
@@ -131,8 +131,8 @@ dependencies:
131
131
  segments:
132
132
  - 0
133
133
  version: "0"
134
- name: webmock
135
134
  version_requirements: *id008
135
+ name: webmock
136
136
  prerelease: false
137
137
  description: Foo
138
138
  email: rob.dimarco@416software.com
@@ -192,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
192
  requirements: []
193
193
 
194
194
  rubyforge_project:
195
- rubygems_version: 1.5.2
195
+ rubygems_version: 1.6.0
196
196
  signing_key:
197
197
  specification_version: 3
198
198
  summary: An Authlogic plugin to connect with Atlassian Crowd REST APIs