samorau 0.1.1 → 0.2.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/Rakefile +2 -1
- data/bin/samorau +16 -0
- data/lib/heroku/samorau.rb +66 -5
- data/samorau.gemspec +9 -4
- data/test/sso_check_test.rb +38 -0
- metadata +20 -4
data/Rakefile
CHANGED
@@ -14,8 +14,9 @@ begin
|
|
14
14
|
gemspec.add_dependency(%q<rest-client>, ["~> 1.2.0"])
|
15
15
|
gemspec.add_dependency(%q<yajl-ruby>, ["~> 0.6"])
|
16
16
|
gemspec.add_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
17
|
+
gemspec.add_dependency(%q<launchy>, [">= 0.3.2"])
|
17
18
|
|
18
|
-
gemspec.version = '0.
|
19
|
+
gemspec.version = '0.2.0'
|
19
20
|
end
|
20
21
|
rescue LoadError
|
21
22
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
data/bin/samorau
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'optparse'
|
4
4
|
require 'term/ansicolor'
|
5
|
+
require 'launchy'
|
5
6
|
require 'heroku/samorau'
|
6
7
|
|
7
8
|
fn="addon-manifest.json"
|
@@ -88,6 +89,10 @@ when "test"
|
|
88
89
|
id = ARGV.shift || abort("! no id specified; see usage")
|
89
90
|
run ManifestCheck, fn
|
90
91
|
run DeleteCheck, fn, :id => id, :async => async, :env => env
|
92
|
+
when "sso"
|
93
|
+
id = ARGV.shift || abort("! no id specified; see usage")
|
94
|
+
run ManifestCheck, fn
|
95
|
+
run SsoCheck, fn, :id => id, :env => env
|
91
96
|
else
|
92
97
|
abort "! Unknown test '#{check}'; see usage"
|
93
98
|
end
|
@@ -95,6 +100,12 @@ when "run"
|
|
95
100
|
abort "! missing command to run; see usage" if ARGV.empty?
|
96
101
|
run ManifestCheck, fn
|
97
102
|
run AllCheck, fn, :args => ARGV, :async => async, :env => env
|
103
|
+
when "sso"
|
104
|
+
id = ARGV.shift || abort("! no id specified; see usage")
|
105
|
+
data = Yajl::Parser.parse(resolve_manifest(fn)).merge(:id => id)
|
106
|
+
sso = Sso.new(data)
|
107
|
+
puts "Opening #{sso.full_url}"
|
108
|
+
Launchy.open sso.full_url
|
98
109
|
else
|
99
110
|
abort File.read(__FILE__).split('__END__').last
|
100
111
|
end
|
@@ -124,6 +135,8 @@ COMMANDS
|
|
124
135
|
|
125
136
|
run <command> Provisions a resource and runs command in returned ENV
|
126
137
|
|
138
|
+
sso <id> Launches the browser on a Heroku session for the specified id
|
139
|
+
|
127
140
|
TEST TYPES
|
128
141
|
|
129
142
|
provision
|
@@ -132,6 +145,9 @@ TEST TYPES
|
|
132
145
|
deprovision <id>
|
133
146
|
Simulate a deprovision call from Heroku.
|
134
147
|
|
148
|
+
sso <id>
|
149
|
+
Simulate a single sign-on call from Heroku.
|
150
|
+
|
135
151
|
manifest
|
136
152
|
Confirm that the manifest is valid. Automatically runs before all tests.
|
137
153
|
|
data/lib/heroku/samorau.rb
CHANGED
@@ -21,6 +21,7 @@ module Heroku
|
|
21
21
|
"api" => {
|
22
22
|
"username" => "heroku",
|
23
23
|
"password" => generate_password,
|
24
|
+
"sso_salt" => generate_password(40),
|
24
25
|
"test" => "http://localhost:4567/",
|
25
26
|
"production" => "https://yourapp.com/",
|
26
27
|
"config_vars" => ["MYADDON_URL"]
|
@@ -36,8 +37,8 @@ module Heroku
|
|
36
37
|
}
|
37
38
|
end
|
38
39
|
|
39
|
-
def self.generate_password
|
40
|
-
Array.new(
|
40
|
+
def self.generate_password(size=16)
|
41
|
+
Array.new(size/2) { rand(256) }.pack('C*').unpack('H*').first
|
41
42
|
end
|
42
43
|
|
43
44
|
end
|
@@ -246,6 +247,11 @@ module Heroku
|
|
246
247
|
|
247
248
|
module HTTP
|
248
249
|
|
250
|
+
def get(path, params={})
|
251
|
+
path = "#{path}?" + params.map { |k, v| "#{k}=#{v}" }.join("&") unless params.empty?
|
252
|
+
request(:get, [], path)
|
253
|
+
end
|
254
|
+
|
249
255
|
def post(credentials, path, payload=nil)
|
250
256
|
request(:post, credentials, path, payload)
|
251
257
|
end
|
@@ -315,7 +321,7 @@ module Heroku
|
|
315
321
|
reader, writer = nil
|
316
322
|
|
317
323
|
payload = {
|
318
|
-
:
|
324
|
+
:heroku_id => APPID,
|
319
325
|
:plan => "Basic",
|
320
326
|
:callback_url => callback
|
321
327
|
}
|
@@ -421,6 +427,60 @@ module Heroku
|
|
421
427
|
end
|
422
428
|
|
423
429
|
|
430
|
+
class Sso
|
431
|
+
attr_accessor :id, :url
|
432
|
+
|
433
|
+
def initialize(data)
|
434
|
+
@id = data[:id]
|
435
|
+
@salt = data['api']['sso_salt']
|
436
|
+
@url = data["api"]["test"].chomp('/')
|
437
|
+
end
|
438
|
+
|
439
|
+
def path
|
440
|
+
"/heroku/resources/#{id}"
|
441
|
+
end
|
442
|
+
|
443
|
+
def full_url
|
444
|
+
t = Time.now.to_i
|
445
|
+
"#{url}#{path}?token=#{make_token(t)}×tamp=#{t}"
|
446
|
+
end
|
447
|
+
|
448
|
+
def make_token(t)
|
449
|
+
Digest::SHA1.hexdigest([@id, @salt, t].join(':'))
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
|
454
|
+
class SsoCheck < ApiCheck
|
455
|
+
include HTTP
|
456
|
+
|
457
|
+
def call!
|
458
|
+
sso = Sso.new(data)
|
459
|
+
t = Time.now.to_i
|
460
|
+
|
461
|
+
test "GET #{sso.path}"
|
462
|
+
check "validates token" do
|
463
|
+
code, _ = get(sso.path, { :token => 'invalid', :timestamp => t })
|
464
|
+
error("expected 403, got #{code}") if code != 403
|
465
|
+
true
|
466
|
+
end
|
467
|
+
|
468
|
+
check "validates timestamp" do
|
469
|
+
prev = (Time.now - 60*6).to_i
|
470
|
+
code, _ = get(sso.path, { :token => sso.make_token(prev), :timestamp => prev })
|
471
|
+
error("expected 403, got #{code}") if code != 403
|
472
|
+
true
|
473
|
+
end
|
474
|
+
|
475
|
+
check "logs in" do
|
476
|
+
code, _ = get(sso.path, { :token => sso.make_token(t), :timestamp => t })
|
477
|
+
error("expected 200, got #{code}") if code != 200
|
478
|
+
true
|
479
|
+
end
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
|
424
484
|
##
|
425
485
|
# On Testing:
|
426
486
|
# I've opted to not write tests for this
|
@@ -435,7 +495,7 @@ module Heroku
|
|
435
495
|
run CreateCheck, data
|
436
496
|
|
437
497
|
response = data[:create_response]
|
438
|
-
id
|
498
|
+
data.merge!(:id => response["id"])
|
439
499
|
config = response["config"] || Hash.new
|
440
500
|
|
441
501
|
if args
|
@@ -449,7 +509,8 @@ module Heroku
|
|
449
509
|
screen.message "End of #{args.first}"
|
450
510
|
end
|
451
511
|
|
452
|
-
run
|
512
|
+
run SsoCheck, data
|
513
|
+
run DeleteCheck, data
|
453
514
|
end
|
454
515
|
|
455
516
|
def run_in_env(env)
|
data/samorau.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{samorau}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Blake Mizerany", "Pedro Belo", "Adam Wiggins"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-03-04}
|
13
13
|
s.default_executable = %q{samorau}
|
14
14
|
s.description = %q{}
|
15
15
|
s.email = %q{pedro@heroku.com}
|
@@ -32,7 +32,8 @@ Gem::Specification.new do |s|
|
|
32
32
|
"test/create_response_check_test.rb",
|
33
33
|
"test/delete_check.rb",
|
34
34
|
"test/helper.rb",
|
35
|
-
"test/manifest_check_test.rb"
|
35
|
+
"test/manifest_check_test.rb",
|
36
|
+
"test/sso_check_test.rb"
|
36
37
|
]
|
37
38
|
s.homepage = %q{http://heroku.com}
|
38
39
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -44,7 +45,8 @@ Gem::Specification.new do |s|
|
|
44
45
|
"test/create_response_check_test.rb",
|
45
46
|
"test/delete_check.rb",
|
46
47
|
"test/helper.rb",
|
47
|
-
"test/manifest_check_test.rb"
|
48
|
+
"test/manifest_check_test.rb",
|
49
|
+
"test/sso_check_test.rb"
|
48
50
|
]
|
49
51
|
|
50
52
|
if s.respond_to? :specification_version then
|
@@ -58,6 +60,7 @@ Gem::Specification.new do |s|
|
|
58
60
|
s.add_runtime_dependency(%q<rest-client>, ["~> 1.2.0"])
|
59
61
|
s.add_runtime_dependency(%q<yajl-ruby>, ["~> 0.6"])
|
60
62
|
s.add_runtime_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
63
|
+
s.add_runtime_dependency(%q<launchy>, [">= 0.3.2"])
|
61
64
|
else
|
62
65
|
s.add_dependency(%q<turn>, [">= 0"])
|
63
66
|
s.add_dependency(%q<contest>, [">= 0"])
|
@@ -65,6 +68,7 @@ Gem::Specification.new do |s|
|
|
65
68
|
s.add_dependency(%q<rest-client>, ["~> 1.2.0"])
|
66
69
|
s.add_dependency(%q<yajl-ruby>, ["~> 0.6"])
|
67
70
|
s.add_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
71
|
+
s.add_dependency(%q<launchy>, [">= 0.3.2"])
|
68
72
|
end
|
69
73
|
else
|
70
74
|
s.add_dependency(%q<turn>, [">= 0"])
|
@@ -73,6 +77,7 @@ Gem::Specification.new do |s|
|
|
73
77
|
s.add_dependency(%q<rest-client>, ["~> 1.2.0"])
|
74
78
|
s.add_dependency(%q<yajl-ruby>, ["~> 0.6"])
|
75
79
|
s.add_dependency(%q<term-ansicolor>, ["~> 1.0"])
|
80
|
+
s.add_dependency(%q<launchy>, [">= 0.3.2"])
|
76
81
|
end
|
77
82
|
end
|
78
83
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/helper"
|
2
|
+
require "heroku/samorau"
|
3
|
+
|
4
|
+
class SsoCheckTest < Test::Unit::TestCase
|
5
|
+
include Heroku::Samorau
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@data = Manifest.skeleton.merge :id => 123
|
9
|
+
@responses = [
|
10
|
+
[403, ""],
|
11
|
+
[403, ""],
|
12
|
+
[200, ""]
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
def check ; SsoCheck ; end
|
17
|
+
|
18
|
+
test "rejects bad token" do
|
19
|
+
@responses[0] = [200, ""]
|
20
|
+
assert_invalid do |check|
|
21
|
+
stub :get, check, @responses
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
test "rejects bad timestamp do" do
|
26
|
+
@responses[1] = [200, ""]
|
27
|
+
assert_invalid do |check|
|
28
|
+
stub :get, check, @responses
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
test "accepts sso otherwise" do
|
33
|
+
assert_valid do |check|
|
34
|
+
stub :get, check, @responses
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Blake Mizerany
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-
|
19
|
+
date: 2010-03-04 00:00:00 -08:00
|
20
20
|
default_executable: samorau
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -96,6 +96,20 @@ dependencies:
|
|
96
96
|
version: "1.0"
|
97
97
|
type: :runtime
|
98
98
|
version_requirements: *id006
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: launchy
|
101
|
+
prerelease: false
|
102
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
- 3
|
109
|
+
- 2
|
110
|
+
version: 0.3.2
|
111
|
+
type: :runtime
|
112
|
+
version_requirements: *id007
|
99
113
|
description: ""
|
100
114
|
email: pedro@heroku.com
|
101
115
|
executables:
|
@@ -120,6 +134,7 @@ files:
|
|
120
134
|
- test/delete_check.rb
|
121
135
|
- test/helper.rb
|
122
136
|
- test/manifest_check_test.rb
|
137
|
+
- test/sso_check_test.rb
|
123
138
|
has_rdoc: true
|
124
139
|
homepage: http://heroku.com
|
125
140
|
licenses: []
|
@@ -156,3 +171,4 @@ test_files:
|
|
156
171
|
- test/delete_check.rb
|
157
172
|
- test/helper.rb
|
158
173
|
- test/manifest_check_test.rb
|
174
|
+
- test/sso_check_test.rb
|