authlogic_wind 0.1.0 → 0.1.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.
- data/VERSION +1 -1
- data/authlogic_wind.gemspec +7 -1
- data/init.rb +1 -0
- data/lib/authlogic_wind/acts_as_authentic.rb +84 -0
- data/lib/authlogic_wind/helper.rb +16 -0
- data/lib/authlogic_wind/session.rb +185 -0
- data/lib/authlogic_wind.rb +3 -3
- data/lib/wind_callback_filter.rb +13 -0
- data/rails/init.rb +10 -0
- metadata +7 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/authlogic_wind.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{authlogic_wind}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["James Stuart"]
|
@@ -24,7 +24,13 @@ Gem::Specification.new do |s|
|
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
26
|
"authlogic_wind.gemspec",
|
27
|
+
"init.rb",
|
27
28
|
"lib/authlogic_wind.rb",
|
29
|
+
"lib/authlogic_wind/acts_as_authentic.rb",
|
30
|
+
"lib/authlogic_wind/helper.rb",
|
31
|
+
"lib/authlogic_wind/session.rb",
|
32
|
+
"lib/wind_callback_filter.rb",
|
33
|
+
"rails/init.rb",
|
28
34
|
"test/authlogic_wind_test.rb",
|
29
35
|
"test/test_helper.rb"
|
30
36
|
]
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
File.dirname(__FILE__) + "/rails/init.rb"
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
|
4
|
+
# This module is responsible for adding wind functionality to Authlogic. Checkout the README for more info and please
|
5
|
+
# see the sub modules for detailed documentation.
|
6
|
+
module AuthlogicWind
|
7
|
+
# This module is responsible for adding in the wind functionality to your models. It hooks itself into the
|
8
|
+
# acts_as_authentic method provided by Authlogic.
|
9
|
+
module ActsAsAuthentic
|
10
|
+
# Adds in the neccesary modules for acts_as_authentic to include and also disabled password validation if
|
11
|
+
# wind is being used.
|
12
|
+
def self.included(klass)
|
13
|
+
klass.class_eval do
|
14
|
+
extend Config
|
15
|
+
add_acts_as_authentic_module(Methods, :prepend)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Config
|
20
|
+
# The name of the wind login field in the database.
|
21
|
+
#
|
22
|
+
# * <tt>Default:</tt> :wind_login, :login, or :username, if they exist
|
23
|
+
# * <tt>Accepts:</tt> Symbol
|
24
|
+
def wind_login_field(value = nil)
|
25
|
+
rw_config(:wind_login_field, value, first_column_to_exist(nil, :wind_login, :login, :username))
|
26
|
+
end
|
27
|
+
alias_method :wind_login_field=, :wind_login_field
|
28
|
+
|
29
|
+
# Whether or not to validate the wind_login field. If set to false ALL wind validation will need to be
|
30
|
+
# handled by you.
|
31
|
+
#
|
32
|
+
# * <tt>Default:</tt> true
|
33
|
+
# * <tt>Accepts:</tt> Boolean
|
34
|
+
def validate_wind_login(value = nil)
|
35
|
+
rw_config(:validate_wind_login, value, true)
|
36
|
+
end
|
37
|
+
alias_method :validate_wind_login=, :validate_wind_login
|
38
|
+
|
39
|
+
|
40
|
+
def find_by_wind_login_field(login)
|
41
|
+
find(wind_login_field, login)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module Methods
|
46
|
+
# Set up some simple validations
|
47
|
+
def self.included(klass)
|
48
|
+
klass.class_eval do
|
49
|
+
validate :validate_by_wind, :if => :authenticating_with_wind?
|
50
|
+
|
51
|
+
validates_uniqueness_of :wind_login, :scope => validations_scope, :if => :using_wind?
|
52
|
+
validates_length_of_password_field_options validates_length_of_password_field_options.merge(:if => :validate_password_with_wind?)
|
53
|
+
validates_confirmation_of_password_field_options validates_confirmation_of_password_field_options.merge(:if => :validate_password_with_wind?)
|
54
|
+
validates_length_of_password_confirmation_field_options validates_length_of_password_confirmation_field_options.merge(:if => :validate_password_with_wind?)
|
55
|
+
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def authenticating_with_wind?
|
65
|
+
|
66
|
+
# Controller isn't available in all contexts (e.g. irb)
|
67
|
+
return false unless session_class.controller
|
68
|
+
|
69
|
+
# Initial request when user presses one of the button helpers
|
70
|
+
(session_class.controller.params && !session_class.controller.params[:login_with_wind].blank?) ||
|
71
|
+
# When the oauth provider responds and we made the initial request
|
72
|
+
(wind_response && session_class.controller.session && session_class.controller.session[:wind_request_class] == self.class.name)
|
73
|
+
end
|
74
|
+
|
75
|
+
def validate_password_with_wind?
|
76
|
+
!using_wind? && require_password?
|
77
|
+
end
|
78
|
+
|
79
|
+
def using_wind?
|
80
|
+
!wind_login.blank?
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AuthlogicWind
|
2
|
+
module Helper
|
3
|
+
def oauth_register_button(options = {})
|
4
|
+
oauth_button('register_with_oauth', options)
|
5
|
+
end
|
6
|
+
|
7
|
+
def oauth_login_button(options = {})
|
8
|
+
oauth_button('login_with_oauth', options)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def oauth_button(name, options = {})
|
13
|
+
"<input type='submit' value='#{options[:value]}' name='#{name}' id='user_submit' class='#{options[:class]}'/>"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module AuthlogicWind
|
2
|
+
module Session
|
3
|
+
def self.included(klass)
|
4
|
+
klass.class_eval do
|
5
|
+
extend Config
|
6
|
+
include Methods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Config
|
11
|
+
# The host of your WIND server.
|
12
|
+
#
|
13
|
+
# * <tt>Default:</tt> nil
|
14
|
+
# * <tt>Accepts:</tt> String
|
15
|
+
def wind_host(value = nil)
|
16
|
+
rw_config(:wind_host, value)
|
17
|
+
end
|
18
|
+
alias_method :wind_host=, :wind_host
|
19
|
+
|
20
|
+
# The service name of your WIND server.
|
21
|
+
#
|
22
|
+
# * <tt>Default:</tt> nil
|
23
|
+
# * <tt>Accepts:</tt> String
|
24
|
+
def wind_service(value = nil)
|
25
|
+
rw_config(:wind_service, value)
|
26
|
+
end
|
27
|
+
alias_method :wind_service=, :wind_service
|
28
|
+
|
29
|
+
|
30
|
+
def find_by_wind_method(value = nil)
|
31
|
+
rw_config(:find_by_wind_method, value, :find_by_wind_login)
|
32
|
+
end
|
33
|
+
alias_method :find_by_wind_method=, :find_by_wind_method
|
34
|
+
|
35
|
+
|
36
|
+
# Add this in your Session object to Auto Register a new user using openid via sreg
|
37
|
+
def auto_register(value=nil)
|
38
|
+
rw_config(:auto_register,value,false)
|
39
|
+
end
|
40
|
+
|
41
|
+
alias_method :auto_register=,:auto_register
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
module Methods
|
47
|
+
def self.included(klass)
|
48
|
+
klass.class_eval do
|
49
|
+
validate :validate_by_wind, :if => :authenticating_with_wind?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def credentials=(value)
|
54
|
+
super
|
55
|
+
values = value.is_a?(Array) ? value : [value]
|
56
|
+
hash = values.first.is_a?(Hash) ? values.first.with_indifferent_access : nil
|
57
|
+
self.record = hash[:priority_record] if !hash.nil? && hash.key?(:priority_record)
|
58
|
+
end
|
59
|
+
|
60
|
+
def save(&block)
|
61
|
+
block = nil if redirecting_to_wind_server?
|
62
|
+
super(&block)
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
private
|
67
|
+
def authenticating_with_wind?
|
68
|
+
# Initial request when user presses one of the button helpers
|
69
|
+
(controller.params && !controller.params[:login_with_wind].blank?) ||
|
70
|
+
# When the oauth provider responds and we made the initial request
|
71
|
+
(wind_response && controller.session && controller.session[:wind_request_class] == self.class.name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def using_wind?
|
75
|
+
respond_to(:wind_login) && !wind_login.blank?
|
76
|
+
end
|
77
|
+
|
78
|
+
def authenticate_with_wind
|
79
|
+
|
80
|
+
if @record
|
81
|
+
self.attempted_record = record
|
82
|
+
|
83
|
+
if !attempted_record
|
84
|
+
errors.add_to_base("Could not find user in our database.")
|
85
|
+
end
|
86
|
+
|
87
|
+
else
|
88
|
+
uni = generate_verified_login
|
89
|
+
if uni
|
90
|
+
self.attempted_record = search_for_record(find_by_wind_method, uni)
|
91
|
+
if !attempted_record
|
92
|
+
if auto_register?
|
93
|
+
self.attempted_record = klass.new(:login => uni, :wind_login => uni)
|
94
|
+
self.attempted_record.reset_persistence_token
|
95
|
+
else
|
96
|
+
errors.add_to_base("Could not find UNI #{uni} in our database")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
else
|
100
|
+
errors.add_to_base("WIND Ticket did not verify properly.")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
def wind_host
|
107
|
+
self.class.wind_host
|
108
|
+
end
|
109
|
+
|
110
|
+
def wind_service
|
111
|
+
self.class.wind_service
|
112
|
+
end
|
113
|
+
|
114
|
+
def find_by_wind_method
|
115
|
+
self.class.find_by_wind_method
|
116
|
+
end
|
117
|
+
|
118
|
+
def auto_register?
|
119
|
+
self.class.auto_register == true
|
120
|
+
end
|
121
|
+
|
122
|
+
def validate_by_wind
|
123
|
+
validate_email_field = false
|
124
|
+
if wind_response.blank?
|
125
|
+
redirect_to_wind
|
126
|
+
else
|
127
|
+
authenticate_with_wind
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
def redirecting_to_wind_server?
|
133
|
+
authenticating_with_wind? && wind_response.blank?
|
134
|
+
end
|
135
|
+
|
136
|
+
def redirect_to_wind
|
137
|
+
# Store the class which is redirecting, so we can ensure other classes
|
138
|
+
# don't get confused and attempt to use the response
|
139
|
+
wind_controller.session[:wind_request_class] = self.class.name
|
140
|
+
|
141
|
+
# Tell our rack callback filter what method the current request is using
|
142
|
+
wind_controller.session[:wind_callback_method] = wind_controller.request.method
|
143
|
+
|
144
|
+
wind_controller.redirect_to wind_controller.url_for(:host => wind_host, :controller => "login", :protocol => "https", :service => wind_service, :destination => build_callback_url)
|
145
|
+
end
|
146
|
+
|
147
|
+
def build_callback_url
|
148
|
+
wind_controller.url_for :controller => wind_controller.controller_name, :action => wind_controller.action_name
|
149
|
+
end
|
150
|
+
|
151
|
+
def generate_verified_login
|
152
|
+
if (ticketid = wind_controller.params[:ticketid])
|
153
|
+
url = "/validate?ticketid=#{ticketid}"
|
154
|
+
h = Net::HTTP.new("wind.columbia.edu", 443)
|
155
|
+
h.use_ssl = true
|
156
|
+
resp, data = h.get(url, nil)
|
157
|
+
uni = data.split[1] unless data[0,2] == "no"
|
158
|
+
return uni
|
159
|
+
else
|
160
|
+
nil
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def wind_response
|
165
|
+
wind_controller.params && wind_controller.params[:ticketid]
|
166
|
+
end
|
167
|
+
|
168
|
+
def wind_controller
|
169
|
+
is_auth_session? ? controller : session_class.controller
|
170
|
+
end
|
171
|
+
|
172
|
+
def wind
|
173
|
+
is_auth_session? ? self.class.wind_consumer : session_class.wind_consumer
|
174
|
+
end
|
175
|
+
|
176
|
+
def is_auth_session?
|
177
|
+
self.is_a?(Authlogic::Session::Base)
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
data/lib/authlogic_wind.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "authlogic_wind/acts_as_authentic"
|
2
|
+
require "authlogic_wind/session"
|
3
|
+
require "authlogic_wind/helper"
|
4
4
|
|
5
5
|
ActiveRecord::Base.send(:include, AuthlogicWind::ActsAsAuthentic)
|
6
6
|
Authlogic::Session::Base.send(:include, AuthlogicWind::Session)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class WindCallbackFilter
|
2
|
+
def initialize(app)
|
3
|
+
@app = app
|
4
|
+
end
|
5
|
+
|
6
|
+
def call(env)
|
7
|
+
unless env["rack.session"][:wind_callback_method].blank?
|
8
|
+
# env["QUERY_STRING"].gsub!(/ticketid\=/,"user_session[ticketid]=")
|
9
|
+
env["REQUEST_METHOD"] = env["rack.session"].delete(:wind_callback_method).to_s.upcase
|
10
|
+
end
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require "authlogic_wind"
|
2
|
+
require "wind_callback_filter"
|
3
|
+
|
4
|
+
# Throw callback rack app into the middleware stack
|
5
|
+
ActionController::Dispatcher.middleware = ActionController::MiddlewareStack.new do |m|
|
6
|
+
ActionController::Dispatcher.middleware.each do |klass|
|
7
|
+
m.use klass
|
8
|
+
end
|
9
|
+
m.use WindCallbackFilter
|
10
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: authlogic_wind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Stuart
|
@@ -49,7 +49,13 @@ files:
|
|
49
49
|
- Rakefile
|
50
50
|
- VERSION
|
51
51
|
- authlogic_wind.gemspec
|
52
|
+
- init.rb
|
52
53
|
- lib/authlogic_wind.rb
|
54
|
+
- lib/authlogic_wind/acts_as_authentic.rb
|
55
|
+
- lib/authlogic_wind/helper.rb
|
56
|
+
- lib/authlogic_wind/session.rb
|
57
|
+
- lib/wind_callback_filter.rb
|
58
|
+
- rails/init.rb
|
53
59
|
- test/authlogic_wind_test.rb
|
54
60
|
- test/test_helper.rb
|
55
61
|
has_rdoc: true
|