carpool 0.2.2 → 0.3.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
@@ -1,49 +1,49 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{carpool}
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brent Kirby"]
12
- s.date = %q{2010-11-14}
12
+ s.date = %q{2010-12-06}
13
13
  s.description = %q{Carpool is a single sign on solution for Rack-based applications allowing you to persist sessions across domains.}
14
14
  s.email = %q{dev@kurbmedia.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.md"
17
+ "README.md"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
- ".gitignore",
22
- "LICENSE",
23
- "README.md",
24
- "Rakefile",
25
- "VERSION",
26
- "carpool.gemspec",
27
- "init.rb",
28
- "lib/carpool.rb",
29
- "lib/carpool/driver.rb",
30
- "lib/carpool/mixins/action_controller.rb",
31
- "lib/carpool/mixins/action_view.rb",
32
- "lib/carpool/mixins/core.rb",
33
- "lib/carpool/passenger.rb",
34
- "lib/carpool/rails/railtie.rb",
35
- "lib/carpool/seatbelt.rb",
36
- "test/helper.rb",
37
- "test/test_carpool.rb"
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "carpool.gemspec",
26
+ "init.rb",
27
+ "lib/carpool.rb",
28
+ "lib/carpool/driver.rb",
29
+ "lib/carpool/encryptor.rb",
30
+ "lib/carpool/mixins/action_controller.rb",
31
+ "lib/carpool/mixins/action_view.rb",
32
+ "lib/carpool/mixins/core.rb",
33
+ "lib/carpool/passenger.rb",
34
+ "lib/carpool/rails/railtie.rb",
35
+ "lib/carpool/responder.rb",
36
+ "lib/carpool/seatbelt.rb",
37
+ "test/helper.rb",
38
+ "test/test_carpool.rb"
38
39
  ]
39
40
  s.homepage = %q{http://github.com/kurbmedia/carpool}
40
- s.rdoc_options = ["--charset=UTF-8"]
41
41
  s.require_paths = ["lib"]
42
42
  s.rubygems_version = %q{1.3.7}
43
43
  s.summary = %q{Single Sign On solution for Rack-Based applications}
44
44
  s.test_files = [
45
45
  "test/helper.rb",
46
- "test/test_carpool.rb"
46
+ "test/test_carpool.rb"
47
47
  ]
48
48
 
49
49
  if s.respond_to? :specification_version then
data/init.rb CHANGED
@@ -1 +1 @@
1
- require 'carpool'
1
+ require 'carpool'
@@ -1,23 +1,18 @@
1
1
  require 'carpool/mixins/core'
2
+ require 'carpool/responder'
3
+ require 'carpool/encryptor'
2
4
  require 'carpool/driver'
3
5
  require 'carpool/passenger'
4
6
  require 'carpool/seatbelt'
5
7
  require 'base64'
8
+ require 'fast-aes'
6
9
 
7
10
  require 'carpool/rails/railtie' if defined?(Rails) && defined?(Rails::Railtie)
8
11
 
9
12
  module Carpool
10
13
 
11
14
  class << self
12
-
13
- def auth_attempt=(bool)
14
- @auth_attempt = bool
15
- end
16
-
17
- def auth_attempt?
18
- @auth_attempt ||= false
19
- end
20
-
15
+
21
16
  def driver_uri
22
17
  "#{Carpool::Passenger.driver_uri}/sso/authenticate"
23
18
  end
@@ -31,26 +26,7 @@ module Carpool
31
26
  def acts_as?(type)
32
27
  @acts_as == type.to_sym
33
28
  end
34
-
35
- def redirect_request(loc, message = "Redirecting")
36
- [302,
37
- { 'Content-Type' => 'text/plain',
38
- 'Location' => loc,
39
- 'Cache-Control' => 'private, no-cache, max-age=0, must-revalidate',
40
- 'Content-Length' => "#{message.to_s.length}"
41
- }, message]
42
- end
43
-
44
- end
45
-
46
- def self.generate_site_key(url)
47
- digest = Digest::SHA256.new
48
- digest.update(url)
49
- Base64.encode64(digest.digest).gsub( /\s/, '')
50
- end
51
-
52
- def self.unpack_key(key)
53
- Base64.decode64(key)
29
+
54
30
  end
55
31
 
56
32
  end
@@ -7,8 +7,7 @@ module Carpool
7
7
  include Carpool::Mixins::Core
8
8
 
9
9
  class << self
10
-
11
- attr_accessor :site_key
10
+
12
11
  attr_accessor :unauthorized_uri
13
12
  attr_accessor :revoke_uri
14
13
 
@@ -16,14 +15,8 @@ module Carpool
16
15
  @passengers ||= []
17
16
  end
18
17
 
19
- def passenger(url, options = {})
20
- options[:site_key] ||= Carpool.generate_site_key(url)
21
- options[:secret] ||= Carpool.generate_site_key(url.reverse)
22
- passengers << { url => options }
23
- end
24
-
25
- def site_key
26
- @site_key ||= Carpool.generate_site_key(@env['HTTP_HOST'])
18
+ def passenger(url, secret)
19
+ passengers << { :host => url, :secret => secret }
27
20
  end
28
21
 
29
22
  end
@@ -36,73 +29,39 @@ module Carpool
36
29
  end
37
30
 
38
31
  def call(env)
32
+ @env = env
39
33
 
40
- @env = env
41
- carpool_cookies['scope'] = "driver"
42
-
43
- # TODO: See if this is even necessary? Basically make sure auth_attempt
44
- # is set to true if current_passenger is set. This value shouldn't be set if we've already
45
- # processed a passenger.
46
- Carpool.auth_attempt = true if carpool_cookies['current_passenger']
34
+ env['carpool'] = Carpool::Seatbelt.new(env) unless env['carpool'] && env['carpool'] != Carpool::Seatbelt
35
+ return revoke_all_instances! if is_revoking?
47
36
 
48
- # Unless we are trying to authenticate a passenger, just continue through the stack.
49
- return @app.call(env) unless valid_request? && valid_referrer?
50
-
51
- # Parse the referring site
52
- referrer = URI.parse(@env['HTTP_REFERER'])
53
-
54
- # Unless this domain is listed as a potential passenger, issue a 500.
55
- current_passenger = Carpool::Driver.passengers.reject{ |p| !p.keys.first.downcase.include?(referrer.host) }
56
- if current_passenger.nil? or current_passenger.empty?
57
- return [500, {'Content-Type'=>'text/plain'}, 'Unauthorized request.']
58
- end
59
-
60
- # We are logging out this user, clear out our cookies and reset the session, then pass the request to the normal revoke path.
61
- if is_revoking?
62
- destroy_session!
63
- set_new_path(Carpool::Driver.revoke_uri)
64
- return @app.call(env)
65
- end
66
-
67
- carpool_cookies['current_passenger'] = current_passenger.first[referrer.host.to_s]
37
+ if valid_request?
38
+ manager.auth_request!
39
+ unless manager.authentication_exists?
40
+ return Carpool::Responder.authenticate
41
+ end
42
+ end
68
43
 
69
- # Attempt to find an existing driver session.
70
- # If one is found, redirect back to the passenger site and include our seatbelt
71
- # The seatbelt includes two parts:
72
- # 1) The referring uri, so that Carpool::Passenger on the other end can send the user back to their location one authenticated
73
- # 2) The session payload. This is an AES encrypted hash of whatever attributes you've made available. The encrypted hash is
74
- # keyed with the site_key and secret of the referring site for extra security.
75
- #
76
- if carpool_passenger_token
77
- seatbelt = SeatBelt.new(env)
78
- seatbelt.set_referrer(referrer)
79
- seatbelt = seatbelt.create_payload!
80
- Carpool.auth_attempt = false
81
- cleanup_session!
82
- return Carpool.redirect_request(seatbelt, 'Approved!')
44
+ result = catch(:carpool) do
45
+ @app.call(env)
83
46
  end
84
47
 
85
- Carpool.auth_attempt = true
86
- carpool_cookies['redirect_to'] = referrer
87
-
88
- set_new_path(Carpool::Driver.unauthorized_uri)
89
- return @app.call(env)
90
-
48
+ return result
49
+
91
50
  end
92
51
 
93
52
  private
94
53
 
95
- def valid_referrer?
96
- !(@env['HTTP_REFERER'].nil? or @env['HTTP_REFERER'].blank?)
97
- end
98
-
99
54
  def valid_request?
100
- @env['PATH_INFO'].downcase == "/sso/authenticate" || @env['PATH_INFO'].downcase == "/sso/revoke"
55
+ (@env['PATH_INFO'].downcase == "/sso/authenticate" || @env['PATH_INFO'].downcase == "/sso/revoke") && !@env['HTTP_REFERER'].to_s.blank?
101
56
  end
102
57
 
103
58
  def is_revoking?
104
59
  @env['PATH_INFO'].downcase == "/sso/revoke"
105
60
  end
106
61
 
62
+ def revoke_all_instances!
63
+ [307, {"Location" => Carpool::Driver.revoke_uri}, "Revoking global access."]
64
+ end
65
+
107
66
  end
108
67
  end
@@ -0,0 +1,52 @@
1
+ require 'fast-aes'
2
+ module Carpool
3
+ class Encryptor
4
+
5
+ def self.generate_token(user_hash, token)
6
+ digest = self.create_digest(token)
7
+ aes = FastAES.new(digest.digest)
8
+ encoded = self.encode(user_hash)
9
+ self.encode64(aes.encrypt(encoded))
10
+ end
11
+
12
+ def self.generate_payload(redirection, user_token)
13
+ self.encode64(Marshal.dump({:redirect_to => redirection, :user => user_token}))
14
+ end
15
+
16
+ def self.process_seatbelt(seatbelt)
17
+ seatbelt = Marshal.load(Base64.decode64(seatbelt))
18
+ {
19
+ :redirect_to => seatbelt[:redirect_to],
20
+ :user => self.recover_user(seatbelt[:user])
21
+ }
22
+ end
23
+
24
+ private
25
+
26
+ def self.create_digest(data)
27
+ digest = Digest::SHA256.new
28
+ digest.update(data)
29
+ end
30
+
31
+ def self.encode(data)
32
+ object = Marshal.dump(data)
33
+ self.encode64(object)
34
+ end
35
+
36
+ def self.encode64(data)
37
+ Base64.encode64(data).gsub(/\s/, '')
38
+ end
39
+
40
+ def self.decode(data)
41
+ object = Base64.decode64(data)
42
+ Marshal.load(object)
43
+ end
44
+
45
+ def self.recover_user(user_token)
46
+ digest = self.create_digest(Carpool::Passenger.secret)
47
+ aes = FastAES.new(digest.digest)
48
+ self.decode(aes.decrypt(Base64.decode64(user_token)))
49
+ end
50
+
51
+ end
52
+ end
@@ -10,38 +10,16 @@ module Carpool
10
10
  Carpool.revoke_uri
11
11
  end
12
12
 
13
- def carpool_can_authenticate?
14
- !([carpool_rack_env['X-CARPOOL-PAYLOAD']].flatten.empty?)
15
- end
16
-
17
- def carpool_user
18
- @_carpool_user
19
- end
20
-
21
- def fasten_seatbelt(user)
22
- Carpool::SeatBelt.new(carpool_rack_env).fasten!(user)
23
- end
24
-
25
- def fasten_seatbelt!(user)
26
- redirect_to fasten_seatbelt(user)
27
- end
28
-
29
- def remove_seatbelt!
30
- seatbelt = Carpool::SeatBelt.new(carpool_rack_env).remove!
31
- @_carpool_user = seatbelt.user
32
- seatbelt
13
+ def carpool_manager
14
+ carpool_rack_env['carpool']
33
15
  end
16
+
17
+ private
34
18
 
35
- def revoke_authentication!
36
- if Carpool.acts_as?(:driver)
37
- carpool_rack_env.delete('carpool.cookies')
38
- else
39
- redirect_to carpool_logout_url
40
- end
19
+ def carpool_rack_request
20
+ @_request = Rack::Request.new(carpool_rack_env)
41
21
  end
42
22
 
43
- private
44
-
45
23
  def carpool_rack_env
46
24
  (defined?(env) ? env : request.env)
47
25
  end
@@ -10,34 +10,38 @@ module Carpool
10
10
 
11
11
  def carpool_cookies
12
12
  session['carpool.cookies'] ||= {}
13
- end
13
+ end
14
14
 
15
- def carpool_passenger_token
16
- carpool_cookies['passenger_token']
15
+ def request
16
+ @request ||= Rack::Request.new(@env)
17
17
  end
18
18
 
19
- def carpool_passenger_token=(token)
20
- carpool_cookies['passenger_token'] = token
19
+ def session
20
+ request.session
21
21
  end
22
22
 
23
23
  def cleanup_session!
24
- ['redirect_to', 'current_passenger'].each{ |k| carpool_cookies.delete(k) }
24
+ carpool_cookies.delete('requesting_authentication')
25
+ carpool_cookies.delete('passenger_uri')
25
26
  end
26
27
 
27
28
  def destroy_session!
28
- session.clear
29
+ cleanup_session!
30
+ carpool_cookies = {}
31
+ session.delete('carpool.cookies')
29
32
  end
30
33
 
31
- def request
32
- @request ||= Rack::Request.new(@env)
34
+ def manager
35
+ @env['carpool']
33
36
  end
34
37
 
35
- def session
36
- @env['rack.session']
38
+ def carpool_passenger_tokens
39
+ carpool_cookies['passenger_tokens'] ||= []
37
40
  end
38
41
 
39
- def set_new_path(p)
40
- @env['PATH_INFO'] = p
42
+ def update_authentication!(new_token)
43
+ carpool_passenger_tokens << new_token
44
+ carpool_passenger_tokens.uniq!
41
45
  end
42
46
 
43
47
  end
@@ -1,5 +1,3 @@
1
- require 'net/http'
2
-
3
1
  module Carpool
4
2
  class Passenger
5
3
 
@@ -21,43 +19,21 @@ module Carpool
21
19
 
22
20
  def call(env)
23
21
  @env = env
24
- @params = CGI.parse(env['QUERY_STRING'])
25
22
 
26
- carpool_cookies['scope'] ||= "passenger"
23
+ env['carpool'] = Carpool::Seatbelt.new(env) unless env['carpool'] && env['carpool'] != Carpool::Seatbelt
27
24
 
28
- # If this isn't an authorize request from the driver, just ignore it.
29
- return @app.call(env) unless valid_request? && valid_referrer?
30
-
31
- # If we can't find our payload, then we need to abort.
32
- return [500, {}, 'Invalid seatbelt.'] if @params['seatbelt'].nil? or @params['seatbelt'].blank?
33
-
34
- # Set a custom HTTP header for our payload and send the request to the user's /sso/authorize handler.
35
- env['X-CARPOOL-PAYLOAD'] = @params['seatbelt']
36
-
37
- return @app.call(env)
25
+ return @app.call(env) unless valid_request?
26
+ result = catch(:carpool) do
27
+ @app.call(env)
28
+ end
29
+ return result
38
30
 
39
31
  end
40
32
 
41
33
  private
42
34
 
43
35
  def valid_request?
44
- @env['PATH_INFO'] == "/sso/authorize" || @env['PATH_INFO'] == "/sso/remote_authentication"
45
- end
46
-
47
- def valid_referrer?
48
- return false if @env['HTTP_REFERER'].nil? or @env['HTTP_REFERER'].blank?
49
- return false if @params['driver'].nil? or @params['driver'].blank?
50
-
51
- referring_uri = @params['driver'].to_s
52
- secret_match = Digest::SHA256.new
53
- secret_match = secret_match.update(Carpool::Passenger.secret).to_s
54
- referring_uri = referring_uri.to_s.gsub(/(\[|\]|\")/,'') # TODO: Figure out why ruby 1.9.2 has extra chars.
55
- secret_match = secret_match.to_s
56
- referring_uri == secret_match
57
- end
58
-
59
- def authenticate_from_remote!
60
-
36
+ @env['PATH_INFO'] == "/sso/authorize"
61
37
  end
62
38
 
63
39
  end
@@ -0,0 +1,19 @@
1
+ module Carpool
2
+
3
+ class Responder
4
+
5
+ def self.authenticate
6
+ [307, {"Location" => Carpool::Driver.unauthorized_uri}, "Redirecing for authentication."]
7
+ end
8
+
9
+ def self.passenger_redirect(passenger, payload)
10
+ new_uri = "#{passenger.scheme}://"
11
+ new_uri << passenger.host
12
+ new_uri << ((passenger.port != 80 && passenger.port != 443) ? ":#{passenger.port}" : "")
13
+ new_uri << "/sso/authorize?seatbelt=#{payload}"
14
+ [303, {"Location" => new_uri}, "Redirecting...."]
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -1,95 +1,66 @@
1
- require 'fast-aes'
2
- require 'yaml'
3
-
4
1
  module Carpool
5
- class SeatBelt
2
+ class Seatbelt
6
3
 
7
4
  include Carpool::Mixins::Core
8
5
 
9
- attr_accessor :env
10
- attr_accessor :redirect_uri
11
- attr_accessor :user
6
+ attr_accessor :env, :current_passenger, :current_user, :redirect_to
12
7
 
13
- # SeatBelt instances require access to the rack environment.
14
8
  def initialize(env)
15
9
  @env = env
16
10
  end
17
11
 
18
- # 'Attaches' the current user into the session so it can be re-authenticated when
19
- # a passenger requests it at a later date. We 'fasten' the users seatbelt for the trip back to the
20
- # referring site.
21
- # Fasten! returns a url for redirection back to our passenger site including the seatbelt used for authentication
22
- # on the other end.
23
- #
24
- def fasten!(user)
25
- carpool_cookies['passenger_token'] = generate_token(user)
26
- Carpool.auth_attempt = false
27
- payload = create_payload!
28
- cleanup_session!
29
- payload
12
+ def authentication_exists?
13
+ !carpool_passenger_tokens.empty?
30
14
  end
31
15
 
32
- # Restore the user from our payload. We 'remove' their seatbelt because they have arrived!
33
- def remove!
34
- payload = @env['X-CARPOOL-PAYLOAD']
35
- payload = payload.flatten.first if payload.is_a?(Array) # TODO: Figure out why our header is an array?
36
- seatbelt = YAML.load(Base64.decode64(CGI.unescape(payload))).to_hash
37
- seatbelt = stringify_keys(seatbelt)
38
- user = Base64.decode64(seatbelt['user'])
39
- key = Carpool.generate_site_key(@env['SERVER_NAME'])
40
- secret = Carpool::Passenger.secret
41
- digest = Digest::SHA256.new
42
- digest.update("#{key}--#{secret}")
43
- aes = FastAES.new(digest.digest)
44
- data = aes.decrypt(user)
45
- @redirect_uri = seatbelt['redirect_uri'].to_s
46
- @user = YAML.load(data).to_hash
47
- self
16
+ def authenticate!
17
+ throw(:carpool, Carpool::Responder.authenticate) unless authentication_exists?
48
18
  end
49
19
 
50
- # Create a redirection payload to be sent back to our passenger
51
- def create_payload!
52
- seatbelt = self.to_s
53
- referrer = carpool_cookies['redirect_to']
54
- driver = Digest::SHA256.new
55
- driver = driver.update(carpool_cookies['current_passenger'][:secret]).to_s
56
- new_uri = "#{referrer.scheme}://"
57
- new_uri << referrer.host
58
- new_uri << ((referrer.port != 80 && referrer.port != 443) ? ":#{referrer.port}" : "")
59
- new_uri << "/sso/authorize?seatbelt=#{seatbelt}&driver=#{driver}"
20
+ def authorize!(user = nil)
21
+ unless Carpool.acts_as?(:passenger)
22
+ return false unless auth_request?
23
+ update_authentication!(passenger_for_auth[:secret])
24
+ token = Carpool::Encryptor.generate_token(user.encrypted_credentials, passenger_for_auth[:secret])
25
+ payload = Carpool::Encryptor.generate_payload(current_passenger, token)
26
+ throw(:carpool, Carpool::Responder.passenger_redirect(current_passenger, payload))
27
+ else
28
+ seatbelt = Carpool::Encryptor.process_seatbelt(request.params['seatbelt'])
29
+ throw(:carpool, Carpool::Responder.invalid) and return unless seatbelt[:user].is_a?(Hash)
30
+ @current_user = seatbelt[:user]
31
+ @redirect_to = seatbelt[:redirect_to]
32
+ end
60
33
  end
61
34
 
62
- def to_s
63
- CGI.escape(Base64.encode64({ 'redirect_uri' => carpool_cookies['redirect_to'].to_s, 'user' => carpool_cookies['passenger_token'] }.to_yaml.to_s).gsub( /\s/, ''))
35
+ def auth_request!
36
+ return if auth_request?
37
+ carpool_cookies['passenger_uri'] = @env['HTTP_REFERER']
38
+ carpool_cookies['requesting_authentication'] = true
64
39
  end
65
40
 
66
- def set_referrer(ref)
67
- carpool_cookies['redirect_to'] = ref
41
+ def auth_request?
42
+ carpool_cookies['requesting_authentication'] && carpool_cookies['requesting_authentication'] == true
68
43
  end
69
44
 
70
- private
45
+ def current_passenger
46
+ URI.parse(carpool_cookies['passenger_uri'])
47
+ end
71
48
 
72
- def generate_token(user)
73
- referrer = carpool_cookies['redirect_to']
74
- passenger = Carpool::Driver.passengers.reject{ |p| p.keys.first.downcase != referrer.host }.first.values.first
75
-
76
- digest = Digest::SHA256.new
77
- digest.update("#{passenger[:site_key]}--#{passenger[:secret]}")
78
- aes = FastAES.new(digest.digest)
79
- Base64.encode64(aes.encrypt(gather_credentials(user).to_yaml.to_s)).gsub( /\s/, '')
80
-
49
+ def revoke!
50
+ destroy_session!
81
51
  end
82
52
 
83
- def gather_credentials(user)
84
- user.encrypted_credentials
53
+ def success!
54
+ throw(:carpool, [303, {"Location" => @redirect_to.to_s}, "Authorized!"])
85
55
  end
86
56
 
87
- def stringify_keys(hash)
88
- hash.inject({}) do |options, (key, value)|
89
- options[key.to_s] = value
90
- options
91
- end
57
+ private
58
+
59
+ def passenger_for_auth
60
+ passenger = Carpool::Driver.passengers.detect{ |p| p[:host].downcase.include?(current_passenger.host.downcase) }
61
+ throw(:carpool, Carpool::Responder.invalid) and return if current_passenger.nil?
62
+ passenger
92
63
  end
93
-
94
- end
64
+
65
+ end
95
66
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
8
- - 2
9
- version: 0.2.2
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Brent Kirby
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-14 00:00:00 -05:00
17
+ date: 2010-12-06 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -54,7 +54,6 @@ extra_rdoc_files:
54
54
  - README.md
55
55
  files:
56
56
  - .document
57
- - .gitignore
58
57
  - LICENSE
59
58
  - README.md
60
59
  - Rakefile
@@ -63,11 +62,13 @@ files:
63
62
  - init.rb
64
63
  - lib/carpool.rb
65
64
  - lib/carpool/driver.rb
65
+ - lib/carpool/encryptor.rb
66
66
  - lib/carpool/mixins/action_controller.rb
67
67
  - lib/carpool/mixins/action_view.rb
68
68
  - lib/carpool/mixins/core.rb
69
69
  - lib/carpool/passenger.rb
70
70
  - lib/carpool/rails/railtie.rb
71
+ - lib/carpool/responder.rb
71
72
  - lib/carpool/seatbelt.rb
72
73
  - test/helper.rb
73
74
  - test/test_carpool.rb
@@ -76,8 +77,8 @@ homepage: http://github.com/kurbmedia/carpool
76
77
  licenses: []
77
78
 
78
79
  post_install_message:
79
- rdoc_options:
80
- - --charset=UTF-8
80
+ rdoc_options: []
81
+
81
82
  require_paths:
82
83
  - lib
83
84
  required_ruby_version: !ruby/object:Gem::Requirement
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC