ssl_routes 0.0.2

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.
@@ -0,0 +1,69 @@
1
+ module SslRoutes::Controller
2
+
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ base.send :include, InstanceMethods
6
+ base.send :alias_method_chain, :url_for, :ssl_support
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def enforce_protocols(&block)
12
+ cattr_accessor :parameter, :secure_session, :enable_ssl
13
+ self.parameter = :protocol
14
+ self.secure_session = false
15
+ self.enable_ssl = false
16
+ yield self if block_given?
17
+ before_filter :ensure_protocol if self.enable_ssl
18
+ end
19
+
20
+ end
21
+
22
+ module InstanceMethods
23
+
24
+ def url_for_with_ssl_support(options)
25
+ if self.enable_ssl
26
+ case options
27
+ when Hash
28
+ current = request.protocol.split(':').first
29
+ target = extract_protocol(options, 'http')
30
+ if current != target
31
+ options.merge!({ :protocol => target, :only_path => false })
32
+ end
33
+ end
34
+ end
35
+ url_for_without_ssl_support(options)
36
+ end
37
+
38
+ private
39
+
40
+ def ensure_protocol
41
+ options = ActionController::Routing::Routes.recognize_path(
42
+ request.path,
43
+ ActionController::Routing::Routes.extract_request_environment(request)
44
+ )
45
+ current = request.protocol.split(':').first
46
+ target = extract_protocol(options, current)
47
+ if current != target
48
+ flash.keep
49
+ redirect_to "#{target}://#{request.host_with_port + request.request_uri}"
50
+ return false
51
+ end
52
+ end
53
+
54
+ def extract_protocol(options, default_protocol)
55
+ protocol = case options[self.parameter]
56
+ when String then options[self.parameter]
57
+ when TrueClass then 'https'
58
+ else default_protocol
59
+ end
60
+ protocol = 'https' if self.secure_session && current_user
61
+ protocol = options[:protocol] if options[:protocol]
62
+ return protocol.split(':').first
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ ActionController::Base.send :include, SslRoutes::Controller
@@ -0,0 +1,15 @@
1
+ # Pollute Thread.current so we can fix S3 urls.
2
+ ActionController::Base.class_eval do
3
+ after_filter :set_protocol
4
+ private
5
+ def set_protocol
6
+ Thread.current[:protocol] = request && request.ssl? ? 'https' : 'http'
7
+ end
8
+ end
9
+
10
+ # Fix protocol in S3 urls.
11
+ module Paperclip::Storage::S3
12
+ def s3_protocol
13
+ Thread.current[:protocol] ||= @s3_protocol
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module SslRoutes
2
+
3
+ VERSION = '0.0.2'
4
+
5
+ end
data/lib/ssl_routes.rb ADDED
@@ -0,0 +1,22 @@
1
+ module SslRoutes
2
+
3
+ # Features:
4
+ # - [DONE] enable/disable ssl
5
+ # - [DONE] enforce protocol in controller
6
+ # - [DONE] route parameter option
7
+ # - [DONE] secure session (firesheep)
8
+ # - [DONE] fix urls (paperclip)
9
+ # - [DONE] fix urls (url_for - controller and view)
10
+ # - presentation plugin
11
+ #
12
+ # Other:
13
+ # - cross protocol form submits
14
+ # - question: canonical urls?
15
+ # - question: fractured pagerank?
16
+
17
+ require 'ruby-debug'
18
+
19
+ require 'ssl_routes/controller'
20
+ require 'ssl_routes/paperclip' if defined?( Paperclip )
21
+
22
+ end
@@ -0,0 +1,14 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
2
+ $: << File.join(File.dirname(__FILE__))
3
+
4
+ require 'rubygems'
5
+ require 'test/unit'
6
+ # require 'sqlite3'
7
+ # require 'mocha'
8
+ # require 'active_support'
9
+ # require 'action_controller'
10
+ # require 'action_controller/test_case'
11
+ # require 'action_view'
12
+ # require 'active_record'
13
+ # require 'ruby-debug'
14
+ require 'spamtrap'
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssl_routes
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - Cedric Howe
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-02 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rails
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 5
30
+ segments:
31
+ - 2
32
+ - 3
33
+ version: "2.3"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: Define your SSL settings in one place to enforce in your controller, generate URLs with the correct protocol, and protect yourself against session hijacking.
37
+ email: cedric@freezerbox.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - lib/ssl_routes/controller.rb
46
+ - lib/ssl_routes/paperclip.rb
47
+ - lib/ssl_routes/version.rb
48
+ - lib/ssl_routes.rb
49
+ - test/test_helper.rb
50
+ has_rdoc: true
51
+ homepage: http://github.com/cedric/ssl_routes/
52
+ licenses: []
53
+
54
+ post_install_message:
55
+ rdoc_options: []
56
+
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ hash: 3
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 23
74
+ segments:
75
+ - 1
76
+ - 3
77
+ - 6
78
+ version: 1.3.6
79
+ requirements: []
80
+
81
+ rubyforge_project: ssl_routes
82
+ rubygems_version: 1.3.7
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Enforce SSL based on your Rails routes.
86
+ test_files:
87
+ - test/test_helper.rb