2015-08-04 22:21:12 +00:00
|
|
|
module Projects
|
|
|
|
class DownloadService < BaseService
|
|
|
|
|
|
|
|
WHITELIST = [
|
|
|
|
/^[^.]+\.fogbugz.com$/
|
|
|
|
]
|
|
|
|
|
|
|
|
def initialize(project, url)
|
|
|
|
@project, @url = project, url
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute
|
|
|
|
return nil unless valid_url?(@url)
|
|
|
|
|
|
|
|
uploader = FileUploader.new(@project)
|
|
|
|
uploader.download!(@url)
|
|
|
|
uploader.store!
|
|
|
|
|
|
|
|
filename = uploader.image? ? uploader.file.basename : uploader.file.filename
|
|
|
|
|
2016-01-07 12:37:14 +00:00
|
|
|
escaped_filename = filename.gsub("]", "\\]")
|
|
|
|
markdown = "[#{escaped_filename}](#{uploader.secure_url})"
|
|
|
|
markdown.prepend("!") if uploader.image?
|
|
|
|
|
2015-08-04 22:21:12 +00:00
|
|
|
{
|
|
|
|
'alt' => filename,
|
|
|
|
'url' => uploader.secure_url,
|
2016-01-07 12:37:14 +00:00
|
|
|
'is_image' => uploader.image?,
|
|
|
|
'markdown' => markdown
|
2015-08-04 22:21:12 +00:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def valid_url?(url)
|
|
|
|
url && http?(url) && valid_domain?(url)
|
|
|
|
end
|
|
|
|
|
|
|
|
def http?(url)
|
|
|
|
url =~ /\A#{URI::regexp(['http', 'https'])}\z/
|
|
|
|
end
|
|
|
|
|
|
|
|
def valid_domain?(url)
|
|
|
|
host = URI.parse(url).host
|
|
|
|
WHITELIST.any? { |entry| entry === host }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|