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 +4 -0
- data/.rspec +2 -0
- data/Gemfile +5 -0
- data/Guardfile +6 -0
- data/Rakefile +6 -0
- data/config.ru +7 -0
- data/lib/rack/googlemarketplace.rb +80 -0
- data/rack-googlemarketplace.gemspec +30 -0
- data/spec/googlemarketplace_spec.rb +72 -0
- data/spec/spec_helper.rb +11 -0
- metadata +148 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/Rakefile
ADDED
data/config.ru
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|