2010-09-13 08:58:49 +00:00
|
|
|
require 'rubygems'
|
|
|
|
require 'sinatra'
|
|
|
|
require 'sequel'
|
|
|
|
require 'uri'
|
|
|
|
|
|
|
|
configure do
|
|
|
|
Sequel::Model.plugin(:schema)
|
|
|
|
|
|
|
|
Sequel.connect(ENV['DATABASE_URL'] || 'sqlite://shorten.db')
|
|
|
|
|
|
|
|
require 'ostruct'
|
|
|
|
Shorten = OpenStruct.new(
|
2010-10-28 03:05:12 +00:00
|
|
|
:base_url => ENV['url'],
|
2011-06-20 03:00:58 +00:00
|
|
|
:service_name => "amd.im",
|
|
|
|
:button_text => "shorten",
|
2010-09-14 05:00:03 +00:00
|
|
|
:path_size => 4
|
2010-09-13 08:58:49 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/lib')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/lib')
|
|
|
|
|
|
|
|
require 'shortenurl'
|
|
|
|
|
|
|
|
helpers do
|
|
|
|
def show_information
|
|
|
|
erb :information, :layout => false
|
|
|
|
end
|
|
|
|
|
|
|
|
def validate_link(link)
|
|
|
|
halt 401, 'We do not accept local URLs to be shortened' unless valid_url? link
|
|
|
|
end
|
|
|
|
|
|
|
|
# Determine if a URL is valid. We run it through
|
|
|
|
def valid_url?(url)
|
|
|
|
if url.include? "%3A"
|
|
|
|
url = URI.unescape(url)
|
|
|
|
end
|
|
|
|
|
|
|
|
retval = true
|
|
|
|
|
|
|
|
begin
|
|
|
|
uri = URI.parse(URI.escape(url))
|
|
|
|
if uri.class != URI::HTTP
|
|
|
|
retval = false
|
|
|
|
end
|
|
|
|
|
|
|
|
host = (URI.split(url))[2]
|
|
|
|
if host =~ /^(localhost|192\.168\.\d{1,3}\.\d{1,3}|127\.0\.0\.1|172\.((1[6-9])|(2[0-9])|(3[0-1])).\d{1,3}\.\d{1,3}|10.\d{1,3}\.\d{1,3}.\d{1,3})/
|
|
|
|
retval = false
|
|
|
|
end
|
|
|
|
rescue URI::InvalidURIError
|
|
|
|
retval = false
|
|
|
|
end
|
|
|
|
|
|
|
|
retval
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get '/' do
|
2011-06-20 03:00:58 +00:00
|
|
|
@information = show_information
|
|
|
|
erb :index
|
|
|
|
end
|
|
|
|
|
|
|
|
get '/new' do
|
2010-09-14 04:02:57 +00:00
|
|
|
@information = show_information
|
|
|
|
erb :new, :locals => { :type => "main" }
|
|
|
|
end
|
|
|
|
|
2010-09-13 08:58:49 +00:00
|
|
|
get %r(/(api-){0,1}create/(.*)) do |api, link|
|
|
|
|
validate_link link
|
|
|
|
|
|
|
|
url = ShortenUrl.create_url(link)
|
|
|
|
|
|
|
|
if api == "api-"
|
|
|
|
"#{url.short_url}"
|
|
|
|
else
|
|
|
|
erb :finished, :locals => { :url => url, :type => "finished" }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
get %r(/(api-){0,1}create) do |api|
|
|
|
|
if request['url']
|
|
|
|
validate_link request['url']
|
|
|
|
url = ShortenUrl.create_url(request['url'])
|
|
|
|
if api == "api-"
|
|
|
|
"#{url.short_url}"
|
|
|
|
else
|
|
|
|
erb :finished, :locals => { :url => url, :type => "finished" }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-09-14 05:00:03 +00:00
|
|
|
post '/' do
|
2010-09-13 08:58:49 +00:00
|
|
|
validate_link params[:url]
|
|
|
|
|
2010-10-28 03:05:12 +00:00
|
|
|
url = ShortenUrl.create_url(params[:url], params[:image])
|
2010-09-13 08:58:49 +00:00
|
|
|
|
2010-10-28 03:05:12 +00:00
|
|
|
erb :finished, :locals => { :url => url, :type => "finished", :image => params[:image] }
|
2010-09-13 08:58:49 +00:00
|
|
|
end
|
|
|
|
|
2010-10-28 03:05:12 +00:00
|
|
|
get '/upload' do
|
|
|
|
|
|
|
|
erb :upload
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
post '/upload' do
|
|
|
|
require 'aws/s3'
|
|
|
|
|
|
|
|
# establish connection
|
|
|
|
AWS::S3::Base.establish_connection!(
|
|
|
|
:access_key_id => ENV['s3_key'],
|
|
|
|
:secret_access_key => ENV['s3_secret']
|
|
|
|
)
|
|
|
|
|
|
|
|
# generate key and check uniqueness
|
|
|
|
key = Anybase::Base62.random(Shorten.path_size)
|
|
|
|
key_check = ShortenUrl.filter(:url => key).first
|
|
|
|
|
|
|
|
while key_check
|
|
|
|
key = Anybase::Base62.random(Shorten.path_size)
|
|
|
|
key_check = ShortenUrl.filter(:url => key).first
|
|
|
|
end
|
|
|
|
|
|
|
|
# merge key and extension
|
|
|
|
ext = File.extname(params[:file][:filename])
|
|
|
|
filename = key + ext
|
|
|
|
#filename = params[:file][:filename]
|
|
|
|
|
|
|
|
# upload to S3
|
2011-06-20 03:00:58 +00:00
|
|
|
AWS::S3::S3Object.store(filename, open(params[:file][:tempfile]), 'amdim', :access => :public_read)
|
2010-10-28 03:05:12 +00:00
|
|
|
object_url = AWS::S3::S3Object.url_for(filename, 'shorten', :authenticated => false)
|
|
|
|
|
|
|
|
# generate shorturl
|
|
|
|
url = ShortenUrl.new(:url => object_url, :key => key, :image => params[:image])
|
|
|
|
url.save
|
|
|
|
#url = ShortenUrl.create_url(object_url, params[:image])
|
|
|
|
|
|
|
|
erb :finished, :locals => { :url => url, :type => "finished", :image => params[:image] }
|
|
|
|
end
|
|
|
|
|
2010-09-13 08:58:49 +00:00
|
|
|
get '/:short' do
|
2010-10-28 03:05:12 +00:00
|
|
|
|
2010-09-14 05:12:52 +00:00
|
|
|
url = ShortenUrl.find(:key => params[:short])
|
2010-10-28 03:05:12 +00:00
|
|
|
|
2010-09-13 08:58:49 +00:00
|
|
|
halt 404, "Page not found" unless url
|
2010-10-28 03:05:12 +00:00
|
|
|
|
|
|
|
if url.image == true
|
|
|
|
erb :image, :locals => {:url => url.url}
|
|
|
|
else
|
|
|
|
redirect url.url
|
|
|
|
end
|
|
|
|
|
2010-09-13 08:58:49 +00:00
|
|
|
end
|
2010-10-28 03:05:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
|