cookieless_sessions 1.0.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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +6 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +24 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +102 -0
  11. data/Rakefile +7 -0
  12. data/cookieless_sessions.gemspec +31 -0
  13. data/lib/cookieless_sessions.rb +31 -0
  14. data/lib/cookieless_sessions/version.rb +3 -0
  15. data/spec/controllers/cookieless_controller_spec.rb +38 -0
  16. data/spec/controllers/sub_cookie_controller_from_cookieless_controller_spec.rb +36 -0
  17. data/spec/cookieless_sessions_spec.rb +4 -0
  18. data/spec/dummy/README.rdoc +28 -0
  19. data/spec/dummy/Rakefile +6 -0
  20. data/spec/dummy/app/assets/images/.keep +0 -0
  21. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  22. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  24. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/mailers/.keep +0 -0
  27. data/spec/dummy/app/models/.keep +0 -0
  28. data/spec/dummy/app/models/concerns/.keep +0 -0
  29. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  30. data/spec/dummy/bin/bundle +3 -0
  31. data/spec/dummy/bin/rails +4 -0
  32. data/spec/dummy/bin/rake +4 -0
  33. data/spec/dummy/config.ru +4 -0
  34. data/spec/dummy/config/application.rb +30 -0
  35. data/spec/dummy/config/boot.rb +5 -0
  36. data/spec/dummy/config/database.yml +25 -0
  37. data/spec/dummy/config/environment.rb +5 -0
  38. data/spec/dummy/config/environments/development.rb +37 -0
  39. data/spec/dummy/config/environments/production.rb +83 -0
  40. data/spec/dummy/config/environments/test.rb +39 -0
  41. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  42. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  43. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  44. data/spec/dummy/config/initializers/inflections.rb +16 -0
  45. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  46. data/spec/dummy/config/initializers/session_store.rb +13 -0
  47. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  48. data/spec/dummy/config/locales/en.yml +23 -0
  49. data/spec/dummy/config/routes.rb +2 -0
  50. data/spec/dummy/config/secrets.yml +22 -0
  51. data/spec/dummy/lib/assets/.keep +0 -0
  52. data/spec/dummy/public/404.html +67 -0
  53. data/spec/dummy/public/422.html +67 -0
  54. data/spec/dummy/public/500.html +66 -0
  55. data/spec/dummy/public/favicon.ico +0 -0
  56. data/spec/features/cookieless_spec.rb +69 -0
  57. data/spec/spec_helper.rb +41 -0
  58. data/spec/support/cookieless_controller.rb +25 -0
  59. metadata +295 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bcbba977e6ff02b91577d6dd884eab647310f40a
4
+ data.tar.gz: 38045f2f7e63afc1a5c953c4fc33a8e432802ef1
5
+ SHA512:
6
+ metadata.gz: 3c14c0055fe304a5197a48d96feb8cfa8d8605bc14c977be2985e3b1d679ee3409e9180ea787599ed20f0c050ce3890e43d7ff720b7c01d832833eec2ac6d6a3
7
+ data.tar.gz: 15bd37dfa92e899864ee7c28037c5cf8cf6617268f26f5344528819ec55cf5eb8dfaae7d13b1dd8756c28591cce003d0c5cdce6c22322dfc9f0c5f912b183b32
data/.gitignore ADDED
@@ -0,0 +1,25 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+
24
+ spec/dummy/log
25
+ spec/dummy/db
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ cookieless_sessions
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.1
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - 2.1.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cookieless_sessions.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,24 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ # Rails example
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
+ watch('config/routes.rb') { "spec/routing" }
15
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
16
+
17
+ # Capybara features specs
18
+ watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
19
+
20
+ # Turnip features and steps
21
+ watch(%r{^spec/acceptance/(.+)\.feature$})
22
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
23
+ end
24
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Taktsoft GmbH & Co. KG
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # CookielessSessions
2
+ [![Gem Version](https://badge.fury.io/rb/cookieless_sessions.png)](http://badge.fury.io/rb/cookieless_sessions)
3
+ [![Build Status](https://api.travis-ci.org/taktsoft/cookieless_sessions.png)](https://travis-ci.org/taktsoft/cookieless_sessions)
4
+ [![Code Climate](https://codeclimate.com/github/taktsoft/cookieless_sessions.png)](https://codeclimate.com/github/taktsoft/cookieless_sessions)
5
+
6
+ CookielessSessions implements a fallback mechanism for keeping Session-IDs _(via GET-Parameter)_ on clients that doesn't support or allow cookies.
7
+
8
+ By default, the server sends a _Set-Cookie_ header to the client. If the client supports and allows cookies, it will send back this _Cookie_ header back in the next request. If not, then there won't be a _Cookie_ header in the next requests from the client to the server and the server will initiate a new session for the client, in every request. In this case, sessions won't work.
9
+
10
+ This is what this gem was built for. There is only one other way to transfer a Session-ID between server and client: via GET-Paramters _(and of course POST-Parameters)_.
11
+
12
+ ## Implementation
13
+
14
+ There isn't any magic in this gem. This gem consists of one module which implements a concern for controllers. The important method in this module is _default_url_options_ and it only adds the _session_key_ with the _session_id_ to the options hash.
15
+
16
+ Rails uses the result of _default_url_options_ method for Path / URL generation. Because of that, the _session_key_ and _session_id_ will be added to every Paths and URL generated in _(cookieless_session enabled)_ controllers.
17
+
18
+ ## Requirements
19
+
20
+ An application based on Rails 3.x or 4.x configured with a session storage that supports the _cookie_only: false_ option (e.g. [redis-session-store](https://rubygems.org/gems/redis-session-store)).
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ gem 'cookieless_sessions'
27
+
28
+ And then execute:
29
+
30
+ $ bundle
31
+
32
+ Or install it yourself as:
33
+
34
+ $ gem install cookieless_sessions
35
+
36
+ ## Usage
37
+
38
+ First, you need a cookie storage which supports the _cookie_only_ option and turn it off. Rails built in session storages (_cookie_store_ and _active_record_store_) doesn't support this option. That's why you need another cookie_storage. For example: this gem uses _redis_session_store_ from the [redis-session-store](https://rubygems.org/gems/redis-session-store) gem and a [Redis](http://redis.io/) database for its tests.
39
+
40
+ Include the module into the controller where you want to enable sessions via GET parameter:
41
+
42
+ ```ruby
43
+ class YourController < ApplicationController
44
+ include CookielessSessions::EnabledController
45
+
46
+ # ...
47
+ end
48
+ ```
49
+
50
+ If you want to enable sessions via GET parameter for the whole application, include the module into your _ApplicationController_:
51
+
52
+ ```ruby
53
+ class ApplicationController < ActionController::Base
54
+ include CookielessSessions::EnabledController
55
+
56
+ # ...
57
+ end
58
+ ```
59
+
60
+ If you want to disable sessions via GET parameter for a certain controller, you can do this by excepting the _sessions_key_ from the _default_url_options_:
61
+
62
+ ```ruby
63
+ class OtherController < ApplicationController
64
+ def default_url_options
65
+ super.except(session_key)
66
+ end
67
+ end
68
+ ```
69
+
70
+ ### Hint
71
+
72
+ If you want to overwrite _default_url_options_ in one of your controllers that use _cookieless_sessions_ and you want to keep that functionality, you should use _super.dup_ and work on a copy:
73
+
74
+ ```ruby
75
+ class AnotherController < ApplicationController
76
+ def default_url_options
77
+ options ||= super.dup || {}
78
+ options[:foo] = :bar
79
+ return options
80
+ end
81
+ end
82
+ ```
83
+
84
+ ## Security
85
+
86
+ There is one security impact: If you copy & paste a URL with your Sessions-ID to a friend and he has cookies disabled _(this won't be happen if he has cookies enabled)_, he will get your session _(e.g. he will be logged in with your account, depends on the application)_.
87
+
88
+ Two countermeasure could be to bind sessions to the client's IP-Address and add a session lifetime. For both you can use the [frikandel](https://rubygems.org/gems/frikandel) gem. This should make it harder to steal and fix sessions.
89
+
90
+ ## Changes
91
+
92
+ * v1.0.0 -- first release with complete README; no code changes
93
+ * v0.0.2 -- improved and more flexible version with tests
94
+ * v0.0.1 -- initial and work-in-progress version without any tests
95
+
96
+ ## Contributing
97
+
98
+ 1. Fork it ( https://github.com/taktsoft/cookieless_sessions/fork )
99
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
100
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
101
+ 4. Push to the branch (`git push origin my-new-feature`)
102
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new("spec")
5
+
6
+ # If you want to make this the default task
7
+ task :default => :spec
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cookieless_sessions/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cookieless_sessions"
8
+ spec.version = CookielessSessions::VERSION
9
+ spec.authors = ["Taktsoft"]
10
+ spec.email = ["developers@taktsoft.com"]
11
+ spec.summary = "#{spec.name} implements a fallback mechanism for keeping Session-IDs (via GET-Parameter) on clients that doesn't support or allow cookies."
12
+ spec.description = spec.summary
13
+ spec.homepage = "https://github.com/taktsoft/cookieless_sessions"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake", "~> 10.3"
23
+ spec.add_development_dependency "rspec-rails", "~> 2.14"
24
+ spec.add_development_dependency "guard-rspec", "~> 4.2"
25
+ spec.add_development_dependency "capybara", "~> 2.2"
26
+ spec.add_development_dependency "poltergeist", "~> 1.5"
27
+ spec.add_development_dependency "pry", "~> 0.9"
28
+ spec.add_development_dependency "rails", [">= 3.0.0", "< 5.0"]
29
+ spec.add_development_dependency "sqlite3", "~> 1.3"
30
+ spec.add_development_dependency "redis-session-store", "~> 0.7"
31
+ end
@@ -0,0 +1,31 @@
1
+ require "cookieless_sessions/version"
2
+
3
+ module CookielessSessions
4
+ module EnabledController
5
+ extend ActiveSupport::Concern
6
+
7
+ protected
8
+
9
+ def default_url_options
10
+ options = super.dup || {} # super.dup is very important here!
11
+
12
+ if session_id.present?
13
+ options[session_key] = session_id
14
+ end
15
+
16
+ return options
17
+ end
18
+
19
+ def session_key
20
+ Rails.application.config.session_options[:key]
21
+ end
22
+
23
+ def session_id
24
+ request.session_options[:id]
25
+ end
26
+
27
+ def session_is_not_cookie_only?
28
+ Rails.application.config.session_options[:cookie_only] == false
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module CookielessSessions
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'support/cookieless_controller'
3
+
4
+ describe CookielessController do
5
+
6
+ it "includes default_url_options from superclass" do
7
+ ApplicationController.send(:define_method, :default_url_options, -> {
8
+ { application_controller_option: 1337 }
9
+ })
10
+
11
+ controller.send(:default_url_options).should include(:application_controller_option)
12
+ end
13
+
14
+ it "includes session_key in default_url_options" do
15
+ controller.send(:default_url_options).should include(rails_app_session_key)
16
+ end
17
+
18
+ it "doesn't include session_key in default_url_options if session_id isn't present" do
19
+ controller.stub(:session_id).and_return(nil)
20
+
21
+ controller.send(:default_url_options).should_not include(rails_app_session_key)
22
+ end
23
+
24
+ it "generates pathes with session_key=session_id in params" do
25
+ controller.stub(:session_key).and_return('some_session_key')
26
+ controller.stub(:session_id).and_return('some_session_id')
27
+
28
+ controller.root_path.should include("some_session_key=some_session_id")
29
+ end
30
+
31
+ it "generates urls with session_key=session_id in params" do
32
+ controller.stub(:session_key).and_return('some_session_key')
33
+ controller.stub(:session_id).and_return('some_session_id')
34
+
35
+ controller.redirect_to_root_url.should include("some_session_key=some_session_id")
36
+ end
37
+
38
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'support/cookieless_controller'
3
+
4
+
5
+ class SubCookieController < CookielessController
6
+
7
+ def index
8
+ render text: "SubCookieController#Index"
9
+ end
10
+
11
+ protected
12
+
13
+ def default_url_options
14
+ super.except(session_key)
15
+ end
16
+ end
17
+
18
+
19
+ describe SubCookieController do
20
+
21
+ it "doesn't include session_key in default_url_options" do
22
+ controller.stub(:session_key).and_return('some_session_key')
23
+ controller.stub(:session_id).and_return('some_session_id')
24
+
25
+ controller.send(:default_url_options).should_not include('some_session_key')
26
+ end
27
+
28
+ it "doesn't include session_key=session_id in generated path or url" do
29
+ controller.stub(:session_key).and_return('some_session_key')
30
+ controller.stub(:session_id).and_return('some_session_id')
31
+
32
+ controller.root_path.should_not include("some_session_key=some_session_id")
33
+ controller.root_url.should_not include("some_session_key=some_session_id")
34
+ end
35
+
36
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe CookielessSessions do
4
+ end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
File without changes
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */