guillotine 0.0.5 → 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/Gemfile +1 -0
- data/guillotine.gemspec +1 -1
- data/lib/guillotine/app.rb +18 -5
- data/lib/guillotine.rb +1 -1
- data/test/app_test.rb +34 -2
- metadata +5 -5
data/Gemfile
CHANGED
data/guillotine.gemspec
CHANGED
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
|
14
14
|
## the sub! line in the Rakefile
|
|
15
15
|
s.name = 'guillotine'
|
|
16
|
-
s.version = '0.0
|
|
16
|
+
s.version = '0.1.0'
|
|
17
17
|
s.date = '2011-08-17'
|
|
18
18
|
s.rubyforge_project = 'guillotine'
|
|
19
19
|
|
data/lib/guillotine/app.rb
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
require 'sinatra/base'
|
|
2
|
+
require 'addressable/uri'
|
|
2
3
|
|
|
3
4
|
module Guillotine
|
|
4
5
|
class App < Sinatra::Base
|
|
6
|
+
set :required_host, nil
|
|
7
|
+
|
|
5
8
|
get "/:code" do
|
|
6
9
|
code = params[:code]
|
|
7
10
|
if url = settings.db.find(code)
|
|
@@ -12,16 +15,26 @@ module Guillotine
|
|
|
12
15
|
end
|
|
13
16
|
|
|
14
17
|
post "/" do
|
|
15
|
-
url = params[:url]
|
|
18
|
+
url = Addressable::URI.parse params[:url]
|
|
16
19
|
code = params[:code]
|
|
17
20
|
|
|
18
|
-
if url.
|
|
19
|
-
halt 422, "Invalid url: #{url
|
|
21
|
+
if !(url && url.scheme =~ /^https?$/)
|
|
22
|
+
halt 422, "Invalid url: #{url}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
case settings.required_host
|
|
26
|
+
when String
|
|
27
|
+
if url.host != settings.required_host
|
|
28
|
+
halt 422, "URL must be from #{settings.required_host}"
|
|
29
|
+
end
|
|
30
|
+
when Regexp
|
|
31
|
+
if url.host.to_s !~ settings.required_host
|
|
32
|
+
halt 422, "URL must match #{settings.required_host.inspect}"
|
|
33
|
+
end
|
|
20
34
|
end
|
|
21
|
-
url.strip!
|
|
22
35
|
|
|
23
36
|
begin
|
|
24
|
-
if code = settings.db.add(url, code)
|
|
37
|
+
if code = settings.db.add(url.to_s.strip, code)
|
|
25
38
|
redirect code
|
|
26
39
|
else
|
|
27
40
|
halt 422, "Unable to shorten #{url}"
|
data/lib/guillotine.rb
CHANGED
data/test/app_test.rb
CHANGED
|
@@ -38,8 +38,8 @@ class AppTest < Guillotine::TestCase
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def test_clashing_urls_raises_error
|
|
41
|
-
code = ADAPTER.add '123'
|
|
42
|
-
post '/', :url => '456', :code => code
|
|
41
|
+
code = ADAPTER.add 'http://github.com/123'
|
|
42
|
+
post '/', :url => 'http://github.com/456', :code => code
|
|
43
43
|
assert_equal 422, last_response.status
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -53,6 +53,38 @@ class AppTest < Guillotine::TestCase
|
|
|
53
53
|
assert_equal 'http://example.org/SWtBvQ', last_response.headers['location']
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
+
def test_rejects_non_http_urls
|
|
57
|
+
post '/', :url => 'ftp://abc.com'
|
|
58
|
+
assert_equal 422, last_response.status
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_reject_shortened_url_from_other_domain
|
|
62
|
+
Guillotine::App.set :required_host, 'abc.com'
|
|
63
|
+
post '/', :url => 'http://github.com'
|
|
64
|
+
assert_equal 422, last_response.status
|
|
65
|
+
assert_match /must be from abc\.com/, last_response.body
|
|
66
|
+
|
|
67
|
+
post '/', :url => 'http://abc.com/def'
|
|
68
|
+
assert_equal 302, last_response.status
|
|
69
|
+
ensure
|
|
70
|
+
Guillotine::App.set :required_host, nil
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_reject_shortened_url_from_other_domain_by_regex
|
|
74
|
+
Guillotine::App.set :required_host, /abc\.com$/
|
|
75
|
+
post '/', :url => 'http://github.com'
|
|
76
|
+
assert_equal 422, last_response.status
|
|
77
|
+
assert_match /must match \/abc\\.com/, last_response.body
|
|
78
|
+
|
|
79
|
+
post '/', :url => 'http://abc.com/def'
|
|
80
|
+
assert_equal 302, last_response.status
|
|
81
|
+
|
|
82
|
+
post '/', :url => 'http://www.abc.com/def'
|
|
83
|
+
assert_equal 302, last_response.status
|
|
84
|
+
ensure
|
|
85
|
+
Guillotine::App.set :required_host, nil
|
|
86
|
+
end
|
|
87
|
+
|
|
56
88
|
def app
|
|
57
89
|
Guillotine::App
|
|
58
90
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: guillotine
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -13,7 +13,7 @@ date: 2011-08-17 00:00:00.000000000Z
|
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: sinatra
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &70175244899260 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ~>
|
|
@@ -21,10 +21,10 @@ dependencies:
|
|
|
21
21
|
version: 1.2.6
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *70175244899260
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: rack-test
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &70175244898880 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ! '>='
|
|
@@ -32,7 +32,7 @@ dependencies:
|
|
|
32
32
|
version: '0'
|
|
33
33
|
type: :development
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *70175244898880
|
|
36
36
|
description: Adaptable private URL shortener
|
|
37
37
|
email: technoweenie@gmail.com
|
|
38
38
|
executables: []
|