rack-googlemarketplace 0.0.1.pre

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/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rack-google-marketplace.gemspec
4
+ gemspec
5
+
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/config.ru ADDED
@@ -0,0 +1,7 @@
1
+ ENV["RACK_ENV"] ||= 'development'
2
+ require "rack/googlemarketplace"
3
+
4
+ use Rack::Reloader
5
+ use Rack::GoogleMarketplace
6
+
7
+ run lambda { |env| [ 200, { "Content-Type" => "text/html" }, [] ] }
@@ -0,0 +1,80 @@
1
+ require "rack"
2
+ require "rack/openid"
3
+
4
+ module Rack
5
+ class GoogleMarketplace
6
+ attr_accessor :domain_param, :session_key
7
+
8
+ def initialize app, &block
9
+ @app = app
10
+
11
+ # Set default values
12
+ @domain_param ||= "domain"
13
+ @session_key ||= "user_id"
14
+ @return_to ||= "/"
15
+
16
+ yield self if block_given?
17
+ end
18
+
19
+ # Duplicate self on call to make code thread safe
20
+ def call env
21
+ dup._call env
22
+ end
23
+
24
+ def _call env
25
+ status, headers, response = @app.call env
26
+ request = Rack::Request.new env
27
+ session = env["rack.session"]
28
+ @domain = request[domain_param]
29
+
30
+ if env["PATH_INFO"] == "/login" and @domain
31
+ status = 401
32
+ headers["WWW-Authenticate"] = Rack::OpenID.build_header(
33
+ :identifier => identifier,
34
+ :return_to => "/?#{query({@domain_param => @domain})}",
35
+ :required => ax_required,
36
+ :method => "post"
37
+ )
38
+ elsif resp = env["rack.openid.response"] and @domain
39
+ if resp.status == :success
40
+ user = {}
41
+ user[:email] = ax_response ax_schema("contact/email")
42
+ user[:first_name] = ax_response ax_schema("namePerson/first")
43
+ user[:last_name] = ax_response ax_schema("namePerson/last")
44
+
45
+ env["rack.googlemarketplace.openid_response"] = resp
46
+ env["rack.googlemarketplace.user"] = user
47
+ env["rack.googlemarketplace.domain"] = @domain
48
+ end
49
+ status = 302
50
+ headers["Location"] = @return_to
51
+ end
52
+
53
+ [ status, headers, response ]
54
+ end
55
+
56
+ def identifier
57
+ "https://www.google.com/accounts/o8/site-xrds?hd=#{@domain}"
58
+ end
59
+
60
+ def ax_required
61
+ [ ax_schema("contact/email"),
62
+ ax_schema("namePerson/first"),
63
+ ax_schema("namePerson/last") ]
64
+ end
65
+
66
+ def ax_response resp
67
+ OpenID::AX::FetchResponse.from_success_response(resp)
68
+ end
69
+
70
+ private
71
+ def ax_schema path
72
+ "http://axschema.org/#{path}"
73
+ end
74
+
75
+ def query(params = {})
76
+ Rack::Utils.build_query params
77
+ end
78
+ end
79
+ end
80
+
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "rack-googlemarketplace"
6
+ s.version = "0.0.1.pre"
7
+ s.authors = ["Erlend Finvåg"]
8
+ s.email = ["erlend.finvag@gmail.com"]
9
+ s.homepage = "http://github.com/erlend/rack-googlemarketplace"
10
+ s.summary = %q{Write a gem summary}
11
+ s.description = %q{Write a gem description}
12
+
13
+ s.rubyforge_project = "rack-googlemarketplace"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib/rack"]
19
+
20
+ # specify any dependencies here; for example:
21
+ s.add_development_dependency "rspec", "~> 2.8"
22
+ s.add_development_dependency "rake", "~> 0.9"
23
+ s.add_development_dependency "rack-test", "~> 0.6"
24
+ s.add_development_dependency "sinatra", "~> 1.3"
25
+ s.add_development_dependency "guard-rspec"
26
+
27
+ s.add_runtime_dependency "oauth", "~> 0.4.5"
28
+ s.add_runtime_dependency "rack-openid", "~> 1.3.1"
29
+ s.add_runtime_dependency "ruby-openid-apps-discovery", "1.2.0"
30
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "rack-google-marketplace" do
4
+ include Rack::Test::Methods
5
+
6
+ def app
7
+ @app ||= Rack::Builder.new do
8
+ use Rack::GoogleMarketplace do |config|
9
+ config.domain_param = "domain_name"
10
+ end
11
+
12
+ run lambda { |env| [ 200, {}, [ "Hello" ] ] }
13
+ end
14
+ end
15
+
16
+ # Do nothing
17
+ describe "GET", "/" do
18
+ before { get "/" }
19
+ subject { last_response }
20
+
21
+ its(:status) { should eq(200) }
22
+ its(:body) { should eq("Hello") }
23
+ end
24
+
25
+ # Initialize and authenticate
26
+ describe "GET", "/login" do
27
+ before { get "/login?domain_name=wepack.no" }
28
+ subject { last_response }
29
+
30
+ its(:status) { should eq(401) }
31
+
32
+ describe "WWW-Authenticate header" do
33
+ subject { Rack::OpenID.parse_header(
34
+ last_response.headers["WWW-Authenticate"]) }
35
+
36
+ it { should include("identifier") }
37
+ it { should include("method") }
38
+ it { should include("required") }
39
+ it { should include("return_to") }
40
+
41
+ it "should have the correct identifier" do
42
+ subject["identifier"].should eq("https://www.google.com/accounts/o8/site-xrds?hd=wepack.no")
43
+ end
44
+
45
+ it "should have the return_to method" do
46
+ subject["method"].should eq("post")
47
+ end
48
+
49
+ pending "should have the correct realm" do
50
+ subject["realm"].should eq("https://localhost:9000")
51
+ end
52
+
53
+ it "should have the correct return_to" do
54
+ subject["return_to"].should eq("/?domain_name=wepack.no")
55
+ end
56
+
57
+ it "should have the correct required" do
58
+ subject["required"].should include("http://axschema.org/contact/email")
59
+ subject["required"].should include("http://axschema.org/namePerson/first")
60
+ subject["required"].should include("http://axschema.org/namePerson/last")
61
+ end
62
+ end
63
+ end
64
+
65
+ # Sign in
66
+ describe "POST" do
67
+ before { post "/?domain_name=wepack.no" }
68
+ subject { last_response }
69
+
70
+ its(:status) { should eq(200) }
71
+ end
72
+ end
@@ -0,0 +1,11 @@
1
+ ENV["RACK_ENV"] ||= 'test'
2
+ require "rspec"
3
+ require "rack/test"
4
+ require "rack/googlemarketplace"
5
+
6
+ RSpec.configure do |config|
7
+ config.include(Rack::Test::Methods)
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.filter_run focus: true
10
+ config.run_all_when_everything_filtered = true
11
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-googlemarketplace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Erlend Finvåg
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-17 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70162351295720 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.8'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70162351295720
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70162351295220 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '0.9'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70162351295220
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack-test
38
+ requirement: &70162351294760 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '0.6'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70162351294760
47
+ - !ruby/object:Gem::Dependency
48
+ name: sinatra
49
+ requirement: &70162351294300 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70162351294300
58
+ - !ruby/object:Gem::Dependency
59
+ name: guard-rspec
60
+ requirement: &70162351293920 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70162351293920
69
+ - !ruby/object:Gem::Dependency
70
+ name: oauth
71
+ requirement: &70162351293380 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 0.4.5
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70162351293380
80
+ - !ruby/object:Gem::Dependency
81
+ name: rack-openid
82
+ requirement: &70162351292880 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 1.3.1
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70162351292880
91
+ - !ruby/object:Gem::Dependency
92
+ name: ruby-openid-apps-discovery
93
+ requirement: &70162351292420 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - =
97
+ - !ruby/object:Gem::Version
98
+ version: 1.2.0
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *70162351292420
102
+ description: Write a gem description
103
+ email:
104
+ - erlend.finvag@gmail.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - .gitignore
110
+ - .rspec
111
+ - Gemfile
112
+ - Guardfile
113
+ - Rakefile
114
+ - config.ru
115
+ - lib/rack/googlemarketplace.rb
116
+ - rack-googlemarketplace.gemspec
117
+ - spec/googlemarketplace_spec.rb
118
+ - spec/spec_helper.rb
119
+ homepage: http://github.com/erlend/rack-googlemarketplace
120
+ licenses: []
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib/rack
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ segments:
132
+ - 0
133
+ hash: -4323997729412537861
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ! '>'
138
+ - !ruby/object:Gem::Version
139
+ version: 1.3.1
140
+ requirements: []
141
+ rubyforge_project: rack-googlemarketplace
142
+ rubygems_version: 1.8.6
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: Write a gem summary
146
+ test_files:
147
+ - spec/googlemarketplace_spec.rb
148
+ - spec/spec_helper.rb