ssl_routes 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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