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 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: []