guillotine 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
3
  gem 'sinatra'
4
+ gem 'addressable'
4
5
 
5
6
  group :test do
6
7
  gem 'rack-test'
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.5'
16
+ s.version = '0.1.0'
17
17
  s.date = '2011-08-17'
18
18
  s.rubyforge_project = 'guillotine'
19
19
 
@@ -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].to_s
18
+ url = Addressable::URI.parse params[:url]
16
19
  code = params[:code]
17
20
 
18
- if url.empty?
19
- halt 422, "Invalid url: #{url.inspect}"
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
@@ -2,7 +2,7 @@ require 'base64'
2
2
  require 'digest/md5'
3
3
 
4
4
  module Guillotine
5
- VERSION = "0.0.5"
5
+ VERSION = "0.1.0"
6
6
 
7
7
  dir = File.expand_path '../guillotine', __FILE__
8
8
  autoload :App, "#{dir}/app"
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.5
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: &70280178489080 !ruby/object:Gem::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: *70280178489080
24
+ version_requirements: *70175244899260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack-test
27
- requirement: &70280178488700 !ruby/object:Gem::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: *70280178488700
35
+ version_requirements: *70175244898880
36
36
  description: Adaptable private URL shortener
37
37
  email: technoweenie@gmail.com
38
38
  executables: []