revo-ssl_requirement 1.0.0 → 1.1.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
- 1.0.0
1
+ 1.1.0
@@ -22,7 +22,7 @@ require "#{File.dirname(__FILE__)}/url_rewriter"
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  module SslRequirement
24
24
  mattr_accessor :ssl_host, :non_ssl_host
25
-
25
+
26
26
  def self.included(controller)
27
27
  controller.extend(ClassMethods)
28
28
  controller.before_filter(:ensure_proper_protocol)
@@ -52,35 +52,67 @@ module SslRequirement
52
52
  end
53
53
 
54
54
  protected
55
- # Returns true if the current action is supposed to run as SSL
56
- def ssl_required?
57
- required = (self.class.read_inheritable_attribute(:ssl_required_actions) || [])
58
- except = self.class.read_inheritable_attribute(:ssl_required_except_actions)
59
-
60
- unless except
61
- required.include?(action_name.to_sym)
62
- else
63
- !except.include?(action_name.to_sym)
64
- end
65
- end
55
+ # Returns true if the current action is supposed to run as SSL
56
+ def ssl_required?
57
+ required = (self.class.read_inheritable_attribute(:ssl_required_actions) || [])
58
+ except = self.class.read_inheritable_attribute(:ssl_required_except_actions)
66
59
 
67
- def ssl_allowed?
68
- (self.class.read_inheritable_attribute(:ssl_allowed_actions) || []).include?(action_name.to_sym)
60
+ unless except
61
+ required.include?(action_name.to_sym)
62
+ else
63
+ !except.include?(action_name.to_sym)
69
64
  end
65
+ end
66
+
67
+ def ssl_allowed?
68
+ (self.class.read_inheritable_attribute(:ssl_allowed_actions) || []).include?(action_name.to_sym)
69
+ end
70
+
71
+ # normal ports are the ports used when no port is specified by the user to the browser
72
+ # i.e. 80 if the protocol is http, 443 is the protocol is https
73
+ NORMAL_PORTS = [80, 443]
70
74
 
71
75
  private
72
- def ensure_proper_protocol
73
- return true if SslRequirement.disable_ssl_check?
74
- return true if ssl_allowed?
75
-
76
- if ssl_required? && !request.ssl?
77
- redirect_to "https://" + (ssl_host || request.host) + request.request_uri
78
- flash.keep
79
- return false
80
- elsif request.ssl? && !ssl_required?
81
- redirect_to "http://" + (non_ssl_host || request.host) + request.request_uri
82
- flash.keep
83
- return false
84
- end
76
+ def ensure_proper_protocol
77
+ return true if SslRequirement.disable_ssl_check?
78
+ return true if ssl_allowed?
79
+
80
+ if ssl_required? && !request.ssl?
81
+ redirect_to determine_redirect_url(request, true)
82
+ flash.keep
83
+ return false
84
+ elsif request.ssl? && !ssl_required?
85
+ redirect_to determine_redirect_url(request, false)
86
+ flash.keep
87
+ return false
85
88
  end
86
- end
89
+ end
90
+
91
+ def determine_redirect_url(request, ssl)
92
+ protocol = ssl ? "https" : "http"
93
+ "#{protocol}://#{determine_host_and_port(request, ssl)}#{request.request_uri}"
94
+ end
95
+
96
+ def determine_host_and_port(request, ssl)
97
+ request_host = request.host
98
+ request_port = request.port
99
+
100
+ if ssl
101
+ "#{(ssl_host || request_host)}#{determine_port_string(request_port)}"
102
+ else
103
+ "#{(non_ssl_host || request_host)}#{determine_port_string(request_port)}"
104
+ end
105
+ end
106
+
107
+ def determine_port_string(port)
108
+ unless port_normal?(port)
109
+ ":#{port}"
110
+ else
111
+ ""
112
+ end
113
+ end
114
+
115
+ def port_normal?(port)
116
+ NORMAL_PORTS.include?(port)
117
+ end
118
+ end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{revo-ssl_requirement}
8
- s.version = "1.0.0"
8
+ s.version = "1.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["RailsJedi", "David Heinemeier Hansson", "jcnetdev", "bcurren", "bmpercy"]
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
33
33
  s.homepage = %q{http://github.com/revo/ssl_requirement}
34
34
  s.rdoc_options = ["--charset=UTF-8"]
35
35
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.3.5}
36
+ s.rubygems_version = %q{1.3.6}
37
37
  s.summary = %q{Allow controller actions to force SSL on specific parts of the site.}
38
38
  s.test_files = [
39
39
  "test/url_rewriter_test.rb",
@@ -1,6 +1,6 @@
1
1
  require 'set'
2
2
  require 'rubygems'
3
- require 'activesupport'
3
+ require 'active_support'
4
4
  begin
5
5
  require 'action_controller'
6
6
  rescue LoadError
@@ -124,6 +124,23 @@ class SslRequirementTest < ActionController::TestCase
124
124
  @non_ssl_host_override = 'www.example.com:8080'
125
125
  end
126
126
 
127
+ # port preservation tests
128
+
129
+ def test_redirect_to_https_preserves_non_normal_port
130
+ assert_not_equal "on", @request.env["HTTPS"]
131
+ @request.port = 4567
132
+ get :b
133
+ assert_response :redirect
134
+ assert_match %r{^https://.*:4567/}, @response.headers['Location']
135
+ end
136
+
137
+ def test_redirect_to_https_does_not_preserve_normal_port
138
+ assert_not_equal "on", @request.env["HTTPS"]
139
+ get :b
140
+ assert_response :redirect
141
+ assert_match %r{^https://.*[^:]/}, @response.headers['Location']
142
+ end
143
+
127
144
  # flash-related tests
128
145
 
129
146
  def test_redirect_to_https_preserves_flash
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: revo-ssl_requirement
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 1
8
+ - 0
9
+ version: 1.1.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - RailsJedi
@@ -52,18 +57,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
52
57
  requirements:
53
58
  - - ">="
54
59
  - !ruby/object:Gem::Version
60
+ segments:
61
+ - 0
55
62
  version: "0"
56
- version:
57
63
  required_rubygems_version: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - ">="
60
66
  - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
61
69
  version: "0"
62
- version:
63
70
  requirements: []
64
71
 
65
72
  rubyforge_project:
66
- rubygems_version: 1.3.5
73
+ rubygems_version: 1.3.6
67
74
  signing_key:
68
75
  specification_version: 3
69
76
  summary: Allow controller actions to force SSL on specific parts of the site.