open-sesame 0.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/.rvmrc ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
7
+ # Only full ruby name is supported here, for short names use:
8
+ # echo "rvm use 1.9.3" > .rvmrc
9
+ environment_id="ruby-1.9.3-p194@open-sesame"
10
+
11
+ # Uncomment the following lines if you want to verify rvm version per project
12
+ # rvmrc_rvm_version="1.16.6 (stable)" # 1.10.1 seams as a safe start
13
+ # eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
14
+ # echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
15
+ # return 1
16
+ # }
17
+
18
+ # First we attempt to load the desired environment directly from the environment
19
+ # file. This is very fast and efficient compared to running through the entire
20
+ # CLI and selector. If you want feedback on which environment was used then
21
+ # insert the word 'use' after --create as this triggers verbose mode.
22
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
23
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
24
+ then
25
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
26
+ [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
27
+ \. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
28
+ if [[ $- == *i* ]] # check for interactive shells
29
+ then echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
30
+ else echo "Using: $GEM_HOME" # don't use colors in non-interactive shells
31
+ fi
32
+ else
33
+ # If the environment file has not yet been created, use the RVM CLI to select.
34
+ rvm --create use "$environment_id" || {
35
+ echo "Failed to create RVM environment '${environment_id}'."
36
+ return 1
37
+ }
38
+ fi
39
+
40
+ # If you use bundler, this might be useful to you:
41
+ # if [[ -s Gemfile ]] && {
42
+ # ! builtin command -v bundle >/dev/null ||
43
+ # builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
44
+ # }
45
+ # then
46
+ # printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
47
+ # gem install bundler
48
+ # fi
49
+ # if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
50
+ # then
51
+ # bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
52
+ # fi
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source :rubygems
2
+
3
+ group(:test, :development) do
4
+ gem "rspec", "~> 2.11.0"
5
+ gem "jeweler", "~> 1.8.4"
6
+ gem "simplecov", "~> 0.6.4"
7
+ gem "yard", "~> 0.8.2.1"
8
+ gem "redcarpet", "~> 2.1.1"
9
+ gem "delorean", "~> 2.0.0"
10
+ gem "debugger"
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,52 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ chronic (0.8.0)
5
+ columnize (0.3.6)
6
+ debugger (1.2.0)
7
+ columnize (>= 0.3.1)
8
+ debugger-linecache (~> 1.1.1)
9
+ debugger-ruby_core_source (~> 1.1.3)
10
+ debugger-linecache (1.1.2)
11
+ debugger-ruby_core_source (>= 1.1.1)
12
+ debugger-ruby_core_source (1.1.3)
13
+ delorean (2.0.0)
14
+ chronic
15
+ diff-lcs (1.1.3)
16
+ git (1.2.5)
17
+ jeweler (1.8.4)
18
+ bundler (~> 1.0)
19
+ git (>= 1.2.5)
20
+ rake
21
+ rdoc
22
+ json (1.7.5)
23
+ multi_json (1.3.6)
24
+ rake (0.9.2.2)
25
+ rdoc (3.12)
26
+ json (~> 1.4)
27
+ redcarpet (2.1.1)
28
+ rspec (2.11.0)
29
+ rspec-core (~> 2.11.0)
30
+ rspec-expectations (~> 2.11.0)
31
+ rspec-mocks (~> 2.11.0)
32
+ rspec-core (2.11.1)
33
+ rspec-expectations (2.11.3)
34
+ diff-lcs (~> 1.1.3)
35
+ rspec-mocks (2.11.3)
36
+ simplecov (0.6.4)
37
+ multi_json (~> 1.0)
38
+ simplecov-html (~> 0.5.3)
39
+ simplecov-html (0.5.3)
40
+ yard (0.8.2.1)
41
+
42
+ PLATFORMS
43
+ ruby
44
+
45
+ DEPENDENCIES
46
+ debugger
47
+ delorean (~> 2.0.0)
48
+ jeweler (~> 1.8.4)
49
+ redcarpet (~> 2.1.1)
50
+ rspec (~> 2.11.0)
51
+ simplecov (~> 0.6.4)
52
+ yard (~> 0.8.2.1)
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Ryan Porter
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # OpenSesame
2
+
3
+ A simple way to pass an authenticated user from one Ruby web app to another. The two web apps don't need to share a database or be on the same server. Does not depend on Rails, and works just as well with Sinatra or any other Ruby system.
4
+
5
+ # Mechanism
6
+
7
+ Web Site A has an authenticated user that it wants to send to a protected feature on Web Site B. It generates an authorization token that consists of a cryptographic hash of a timestamp plus a secret, plus the timestamp in plaintext.
8
+
9
+ Example:
10
+
11
+ timestamp: 2009-06-25T10:34:29-04:00
12
+ secret: "OPEN SESAME"
13
+ token: 20090625T1034-93a9d935fc64285645870a59db0d287b58f7caea
14
+
15
+ Web Site B then checks that the timestamp is not more than an hour old, and it checks to verify that the timestamp plus the shared secret produces the correct hash. Web Site B should deny access with a 401 response if the authentication token does not verify.
16
+
17
+ # Installation
18
+
19
+ cd your_app
20
+ script/plugin install git://github.com/endymion/open-sesame.git
21
+
22
+ # Usage
23
+
24
+ The default secret is "OPEN SESAME". You should change that because the default secret is public knowledge. Add the secret to your config/environment.rb:
25
+
26
+ OPEN_SESAME_SECRET = "Don't tell anybody, this is a secret!"
27
+
28
+ Or, if you want to keep that secret out of your source code then you can use an environment variable, like ```ENV['OPEN_SESAME_SECRET']```. You can configure that environment variable on Heroku, for example, by giving this command to the terminal:
29
+
30
+ heroku config:add OPEN_SESAME_SECRET="Don't tell anybody, this is a secret!"
31
+
32
+ For example, with Rails, you could do this in a controller in the first web app:
33
+
34
+ token = OpenSesame::Token.generate(OPEN_SESAME_SECRET)
35
+ redirect_to "http://second-app.net?token=#{token}"
36
+
37
+ In the second Rails app, you can verify the presence and validity of the token with:
38
+
39
+ before_filter :check_token
40
+ def check_token
41
+ return if session[:open_sesame_verified]
42
+ if params[:token].blank? || !OpenSesame::Token.verify(params[:token], OPEN_SESAME_SECRET)
43
+ render :text => 'access denied', :status => 401
44
+ end
45
+ session[:open_sesame_verified] = true
46
+ end
47
+
48
+ # Signing messages
49
+
50
+ You can also pass signed parameters. Let's say you want to identify each user and you don't want them to mess with the ID that you pass.
51
+
52
+ message: 123456789
53
+ secret: "OPEN SESAME"
54
+ token: 123456789-e349b9416e2b9f6954e80f03a5bb63d3f7401b70
55
+
56
+ From the first web app:
57
+
58
+ token = OpenSesame::Token.generate(OPEN_SESAME_SECRET)
59
+ username = OpenSesame::Message.generate('username', OPEN_SESAME_SECRET)
60
+ redirect_to "http://second-app.net?token=#{token}&username=#{username}"
61
+
62
+ In the second app, you can verify both the token and any parameters:
63
+
64
+ before_filter :check_token
65
+ def check_token
66
+ return if session[:open_sesame_verified]
67
+ if params[:token].blank? || !OpenSesame::Token.verify(params[:token], OPEN_SESAME_SECRET)
68
+ render :text => 'access denied', :status => 401
69
+ end
70
+ params.keys.each do |param|
71
+ if OpenSesame::Mesage.verify(params[param])
72
+ session[param] = OPenSesame::Message.message(params[param], OPEN_SESAME_SECRET)
73
+ end
74
+ end
75
+ session[:open_sesame_verified] = true
76
+ end
77
+
78
+
79
+ Copyright (c) 2009 Ryan Porter, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "open-sesame"
16
+ gem.homepage = "http://www.ryanalynporter.com/2009/06/25/authorizing-users-between-web-sites-with-open-sesame/"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{Send authorized traffic from one web site to another with a cryptographic authorization token.}
19
+ gem.description = %Q{Use a time-sensitive cryptographic token based on a shared secret phrase to generate an authorization token for passing traffic from one web site to another.}
20
+ gem.authors = ["Ryan Alyn Porter"]
21
+ # dependencies defined in Gemfile
22
+ end
23
+ Jeweler::RubygemsDotOrgTasks.new
24
+
25
+ require 'rspec/core/rake_task'
26
+ desc "Run specs"
27
+ RSpec::Core::RakeTask.new
28
+
29
+ require 'yard'
30
+ YARD::Rake::YardocTask.new do |t|
31
+ t.files = ['lib/*.rb']
32
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ # Include hook code here
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,77 @@
1
+ require 'date'
2
+ require 'digest/sha1'
3
+
4
+ module OpenSesame
5
+
6
+ # Used for generating time-sensitive, cryptographically secure authorization tokens.
7
+ class Token
8
+ # For really lazy people. You really should set your own secret phrase.
9
+ @@default_secret = "OPEN SESAME"
10
+
11
+ # Generate a token, which will automatically expire after one hour.
12
+ #
13
+ # @param [String] secret The shared secret, which should only be known by the
14
+ # sender and the receiver.
15
+ # @param [DateTime] timestamp Expire the token automatically one hour from this time.
16
+ # Defaults to now.
17
+ # @return [String] The token.
18
+ def self.generate(secret = @@default_secret, timestamp = Time.now.utc.to_datetime)
19
+ timestamp_string = timestamp.strftime('%Y%m%dT%H%M')
20
+ hash = (Digest::SHA1.new << secret + timestamp_string).to_s
21
+ timestamp_string + '-' + hash
22
+ end
23
+
24
+ # Verify a token.
25
+ #
26
+ # @param [String] token The token.
27
+ # @param [String] secret The shared secret.
28
+ def self.verify(token, secret = @@default_secret)
29
+ string = token.split /-/
30
+ timestamp = DateTime.strptime string.first, '%Y%m%dT%H%M'
31
+ one_hour_ago = (Time.now.utc - 3600).to_datetime
32
+ (timestamp >= one_hour_ago) && token.eql?(generate(secret, timestamp))
33
+ end
34
+
35
+ end
36
+
37
+ # Used for passing messages that cannot be altered. This is not for hiding a message
38
+ # from observers. The message is cryptographically signed but it is not encrypted.
39
+ class Message
40
+ @@default_secret = "OPEN SESAME"
41
+
42
+ # Generate a message string that can be verified by another computer that knows
43
+ # the shared secret.
44
+ #
45
+ # @param [String] message The message.
46
+ # @param [String] secret The shared secret phrase.
47
+ def self.generate(message, secret = @@default_secret)
48
+ hash = (Digest::SHA1.new << secret + message).to_s
49
+ message + '-' + hash
50
+ end
51
+
52
+ # Verify that the message has not been altered.
53
+ #
54
+ # @param [String] message The message to verify.
55
+ # @param [String] secret The shared secret phrase.
56
+ def self.verify(message, secret = @@default_secret)
57
+ string = message.split /-/
58
+ message.eql? generate(string.first, secret)
59
+ end
60
+
61
+ # Verify a message that was generated with OpenSesame and return just the message
62
+ # part. Returns nil if the message does not verify.
63
+ #
64
+ # @param [String] message The message that was generated by OpenSesame, which includes
65
+ # a cryptographic hash.
66
+ # @param [String] secret The secret to use for verifying the message.
67
+ def self.message(message, secret = @@default_secret)
68
+ if self.verify(message, secret)
69
+ (message.split /-/).first
70
+ else
71
+ nil
72
+ end
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "open-sesame"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ryan Alyn Porter"]
12
+ s.date = "2012-10-13"
13
+ s.description = "Use a time-sensitive cryptographic token based on a shared secret phrase to generate an authorization token for passing traffic from one web site to another."
14
+ s.extra_rdoc_files = [
15
+ "README.md"
16
+ ]
17
+ s.files = [
18
+ ".rvmrc",
19
+ "Gemfile",
20
+ "Gemfile.lock",
21
+ "MIT-LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "init.rb",
26
+ "install.rb",
27
+ "lib/open-sesame.rb",
28
+ "open-sesame.gemspec",
29
+ "spec/open-sesame_spec.rb",
30
+ "spec/spec_helper.rb",
31
+ "uninstall.rb"
32
+ ]
33
+ s.homepage = "http://www.ryanalynporter.com/2009/06/25/authorizing-users-between-web-sites-with-open-sesame/"
34
+ s.licenses = ["MIT"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = "1.8.24"
37
+ s.summary = "Send authorized traffic from one web site to another with a cryptographic authorization token."
38
+
39
+ if s.respond_to? :specification_version then
40
+ s.specification_version = 3
41
+
42
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
+ s.add_development_dependency(%q<rspec>, ["~> 2.11.0"])
44
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
45
+ s.add_development_dependency(%q<simplecov>, ["~> 0.6.4"])
46
+ s.add_development_dependency(%q<yard>, ["~> 0.8.2.1"])
47
+ s.add_development_dependency(%q<redcarpet>, ["~> 2.1.1"])
48
+ s.add_development_dependency(%q<delorean>, ["~> 2.0.0"])
49
+ s.add_development_dependency(%q<debugger>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<rspec>, ["~> 2.11.0"])
52
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
53
+ s.add_dependency(%q<simplecov>, ["~> 0.6.4"])
54
+ s.add_dependency(%q<yard>, ["~> 0.8.2.1"])
55
+ s.add_dependency(%q<redcarpet>, ["~> 2.1.1"])
56
+ s.add_dependency(%q<delorean>, ["~> 2.0.0"])
57
+ s.add_dependency(%q<debugger>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<rspec>, ["~> 2.11.0"])
61
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
62
+ s.add_dependency(%q<simplecov>, ["~> 0.6.4"])
63
+ s.add_dependency(%q<yard>, ["~> 0.8.2.1"])
64
+ s.add_dependency(%q<redcarpet>, ["~> 2.1.1"])
65
+ s.add_dependency(%q<delorean>, ["~> 2.0.0"])
66
+ s.add_dependency(%q<debugger>, [">= 0"])
67
+ end
68
+ end
69
+
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+ require 'open-sesame'
3
+
4
+ describe OpenSesame do
5
+
6
+ before(:all) do
7
+ @secret = "Don't tell anybody, this is a secret."
8
+ end
9
+
10
+ describe 'secure token' do
11
+
12
+ it 'can be generated.' do
13
+ token = OpenSesame::Token.generate(@secret)
14
+ token.should match /\d{8}T\d{4}-\w{40}/
15
+
16
+ token2 = OpenSesame::Token.generate # Default 'secret'.
17
+ token2.should match /\d{8}T\d{4}-\w{40}/
18
+
19
+ token.should_not == token2
20
+ end
21
+
22
+ it 'can be verified.' do
23
+ token = OpenSesame::Token.generate(@secret)
24
+ OpenSesame::Token.verify(token, @secret).should be_true
25
+
26
+ token2 = OpenSesame::Token.generate # Default 'secret'.
27
+ OpenSesame::Token.verify(token2).should be_true
28
+ end
29
+
30
+ it 'expires after one hour' do
31
+ token = OpenSesame::Token.generate @secret
32
+ Delorean.time_travel_to "59 minutes from now"
33
+ OpenSesame::Token.verify(token, @secret).should be_true
34
+ Delorean.time_travel_to "61 minutes from now"
35
+ OpenSesame::Token.verify(token, @secret).should_not be_true
36
+ end
37
+
38
+ it 'cannot be verified if the time stamp is modified.' do
39
+ token = OpenSesame::Token.generate @secret
40
+ token.gsub!(/^(\d{8})/) {|match| match.to_i + 100 }
41
+ OpenSesame::Token.verify(token, @secret).should_not be_true
42
+ end
43
+
44
+ it 'cannot be verified if the hash is modified.' do
45
+ token = OpenSesame::Token.generate @secret
46
+ token[token.length - 1] = 'z'
47
+ OpenSesame::Token.verify(token, @secret).should_not be_true
48
+ end
49
+
50
+ end
51
+
52
+ describe 'secure message' do
53
+
54
+ it 'can be generated.' do
55
+ message = OpenSesame::Message.generate 'WELL HELLO THERE', @secret
56
+ message.should match /WELL HELLO THERE-\w{40}/
57
+
58
+ message2 = OpenSesame::Message.generate 'WELL HELLO THERE' # Default 'secret'.
59
+ message2.should match /WELL HELLO THERE-\w{40}/
60
+
61
+ message.should_not == message2
62
+ end
63
+
64
+ it 'can be verified.' do
65
+ message = OpenSesame::Message.generate 'WELL HELLO THERE', @secret
66
+ OpenSesame::Message.verify(message, @secret).should be_true
67
+
68
+ message2 = OpenSesame::Message.generate 'WELL HELLO THERE' # Default 'secret'.
69
+ OpenSesame::Message.verify(message2).should be_true
70
+ end
71
+
72
+ it 'cannot be verified if the message is modified' do
73
+ message = OpenSesame::Message.generate 'WELL HELLO THERE', @secret
74
+ message.gsub!(/HELLO/, 'GOODBYE')
75
+ OpenSesame::Message.verify(message, @secret).should_not be_true
76
+ end
77
+
78
+ it 'cannot be verified if the hash is modified' do
79
+ message = OpenSesame::Message.generate 'WELL HELLO THERE', @secret
80
+ message[message.length - 1] = 'z'
81
+ OpenSesame::Message.verify(message, @secret).should_not be_true
82
+ end
83
+
84
+ it 'returns the message if it verifies' do
85
+ message = OpenSesame::Message.generate 'WELL HELLO THERE', @secret
86
+ OpenSesame::Message.message(message, @secret).should == 'WELL HELLO THERE'
87
+ end
88
+
89
+ it 'returns nil if the message is modified' do
90
+ message = OpenSesame::Message.generate 'WELL HELLO THERE', @secret
91
+ message.gsub!(/HELLO/, 'GOODBYE')
92
+ OpenSesame::Message.message(message, @secret).should be_nil
93
+ end
94
+
95
+
96
+ end
97
+
98
+ end
@@ -0,0 +1,5 @@
1
+ require 'debugger'
2
+ require 'delorean'
3
+
4
+ require 'simplecov'
5
+ SimpleCov.start
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: open-sesame
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Alyn Porter
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.11.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.11.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: jeweler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.8.4
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.8.4
46
+ - !ruby/object:Gem::Dependency
47
+ name: simplecov
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.6.4
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.6.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: yard
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.8.2.1
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.8.2.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: redcarpet
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 2.1.1
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 2.1.1
94
+ - !ruby/object:Gem::Dependency
95
+ name: delorean
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 2.0.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 2.0.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: debugger
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Use a time-sensitive cryptographic token based on a shared secret phrase
127
+ to generate an authorization token for passing traffic from one web site to another.
128
+ email:
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files:
132
+ - README.md
133
+ files:
134
+ - .rvmrc
135
+ - Gemfile
136
+ - Gemfile.lock
137
+ - MIT-LICENSE
138
+ - README.md
139
+ - Rakefile
140
+ - VERSION
141
+ - init.rb
142
+ - install.rb
143
+ - lib/open-sesame.rb
144
+ - open-sesame.gemspec
145
+ - spec/open-sesame_spec.rb
146
+ - spec/spec_helper.rb
147
+ - uninstall.rb
148
+ homepage: http://www.ryanalynporter.com/2009/06/25/authorizing-users-between-web-sites-with-open-sesame/
149
+ licenses:
150
+ - MIT
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ segments:
162
+ - 0
163
+ hash: 1526642688662844779
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubyforge_project:
172
+ rubygems_version: 1.8.24
173
+ signing_key:
174
+ specification_version: 3
175
+ summary: Send authorized traffic from one web site to another with a cryptographic
176
+ authorization token.
177
+ test_files: []