diff --git a/app/models/topic_link.rb b/app/models/topic_link.rb index b4ada546c..1e86d11ad 100644 --- a/app/models/topic_link.rb +++ b/app/models/topic_link.rb @@ -102,7 +102,10 @@ class TopicLink < ActiveRecord::Base internal = false topic_id = nil post_number = nil - if parsed.host == Discourse.current_hostname || !parsed.host + + if Upload.has_been_uploaded?(url) + internal = !Upload.is_on_s3?(url) + elsif parsed.host == Discourse.current_hostname || !parsed.host internal = true route = Rails.application.routes.recognize_path(parsed.path) diff --git a/app/models/upload.rb b/app/models/upload.rb index 828eacee5..fedb1ac4f 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -91,7 +91,7 @@ class Upload < ActiveRecord::Base end def self.is_relative?(url) - (url =~ /^\/[^\/]/) == 0 + url.start_with?("/uploads/") end def self.is_local?(url) diff --git a/spec/models/topic_link_spec.rb b/spec/models/topic_link_spec.rb index d2d960afb..0318089a1 100644 --- a/spec/models/topic_link_spec.rb +++ b/spec/models/topic_link_spec.rb @@ -176,6 +176,42 @@ describe TopicLink do end end + context "link to a local attachments" do + let(:post) { @topic.posts.create(user: @user, raw: 'ruby.rb') } + + it "extracts the link" do + TopicLink.extract_from(post) + link = @topic.topic_links.first + # extracted the link + link.should be_present + # is set to internal + link.should be_internal + # has the correct url + link.url.should == "/uploads/default/208/87bb3d8428eb4783.rb" + # should not be the reflection + link.should_not be_reflection + end + + end + + context "link to an attachments uploaded on S3" do + let(:post) { @topic.posts.create(user: @user, raw: 'ruby.rb') } + + it "extracts the link" do + TopicLink.extract_from(post) + link = @topic.topic_links.first + # extracted the link + link.should be_present + # is not internal + link.should_not be_internal + # has the correct url + link.url.should == "//s3.amazonaws.com/bucket/2104a0211c9ce41ed67989a1ed62e9a394c1fbd1446.rb" + # should not be the reflection + link.should_not be_reflection + end + + end + end describe 'internal link from pm' do diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb index 268a52b01..f0a07fcbb 100644 --- a/spec/models/upload_spec.rb +++ b/spec/models/upload_spec.rb @@ -153,7 +153,7 @@ describe Upload do it "identifies internal or relatives urls" do Discourse.expects(:base_url_no_prefix).returns("http://discuss.site.com") Upload.has_been_uploaded?("http://discuss.site.com/uploads/default/42/0123456789ABCDEF.jpg").should == true - Upload.has_been_uploaded?("/upload/42/0123456789ABCDEF.jpg").should == true + Upload.has_been_uploaded?("/uploads/42/0123456789ABCDEF.jpg").should == true end it "identifies internal urls when using a CDN" do diff --git a/test/javascripts/components/utilities_test.js b/test/javascripts/components/utilities_test.js index 20b4b1f2a..23e3af690 100644 --- a/test/javascripts/components/utilities_test.js +++ b/test/javascripts/components/utilities_test.js @@ -91,13 +91,13 @@ var getUploadMarkdown = function(filename) { filesize: 42, width: 100, height: 200, - url: "/upload/123/abcdef.ext" + url: "/uploads/123/abcdef.ext" }); }; test("getUploadMarkdown", function() { - ok(getUploadMarkdown("lolcat.gif") === ''); - ok(getUploadMarkdown("important.txt") === 'important.txt(42 Bytes)'); + ok(getUploadMarkdown("lolcat.gif") === ''); + ok(getUploadMarkdown("important.txt") === 'important.txt(42 Bytes)'); }); test("isAnImage", function() {