From a3c6cd7b380f579e016a65508de92a423c903f69 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 5 Aug 2015 12:15:08 +1000 Subject: [PATCH] FIX: handle link tracking correctly for cdn based urls (usually attachments) --- app/models/topic_link_click.rb | 18 ++++++++++-------- spec/models/topic_link_click_spec.rb | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/models/topic_link_click.rb b/app/models/topic_link_click.rb index 5dd8901fece..4a51ca5200a 100644 --- a/app/models/topic_link_click.rb +++ b/app/models/topic_link_click.rb @@ -29,6 +29,15 @@ class TopicLinkClick < ActiveRecord::Base urls << uri.path if uri.try(:host) == Discourse.current_hostname urls << url.sub(/\?.*$/, '') if url.include?('?') + # add a cdn link + if uri && Discourse.asset_host.present? + cdn_uri = URI.parse(Discourse.asset_host) rescue nil + if cdn_uri && cdn_uri.hostname == uri.hostname && uri.path.starts_with?(cdn_uri.path) + is_cdn_link = true + urls << uri.path[(cdn_uri.path.length)..-1] + end + end + link = TopicLink.select([:id, :user_id]) # test for all possible URLs @@ -54,14 +63,7 @@ class TopicLinkClick < ActiveRecord::Base return nil unless uri # Only redirect to whitelisted hostnames - return url if WHITELISTED_REDIRECT_HOSTNAMES.include?(uri.hostname) - - if Discourse.asset_host.present? - cdn_uri = URI.parse(Discourse.asset_host) rescue nil - if cdn_uri - return url if cdn_uri.hostname == uri.hostname && uri.path.starts_with?(cdn_uri.path) - end - end + return url if WHITELISTED_REDIRECT_HOSTNAMES.include?(uri.hostname) || is_cdn_link return nil end diff --git a/spec/models/topic_link_click_spec.rb b/spec/models/topic_link_click_spec.rb index 909e662883a..b8c4bb8c7c1 100644 --- a/spec/models/topic_link_click_spec.rb +++ b/spec/models/topic_link_click_spec.rb @@ -122,6 +122,24 @@ describe TopicLinkClick do ip: '127.0.0.3') expect(url).to eq(nil) + + # cdn better link track + path = "/uploads/site/29/5b585f848d8761d5.xls" + + post = Fabricate(:post, topic: @topic, raw: "[test](#{path})") + TopicLink.extract_from(post) + + url = TopicLinkClick.create_from( + url: "https://cdn.discourse.org/stuff#{path}", + topic_id: post.topic_id, + post_id: post.id, + ip: '127.0.0.3') + + expect(url).to eq("https://cdn.discourse.org/stuff#{path}") + + click = TopicLinkClick.order('id desc').first + + expect(click.topic_link_id).to eq(TopicLink.order('id desc').first.id) end end