parent
2ce7d59cb3
commit
70410d1691
5 changed files with 45 additions and 4 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
## Refactor
|
## Refactor
|
||||||
|
|
||||||
## Bug fixes
|
## Bug fixes
|
||||||
|
* Ignore invalid `diaspora://` links [#7652](https://github.com/diaspora/diaspora/pull/7652)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,19 @@ class Reference < ApplicationRecord
|
||||||
|
|
||||||
def create_references
|
def create_references
|
||||||
text&.scan(DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX)&.each do |author, type, guid|
|
text&.scan(DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX)&.each do |author, type, guid|
|
||||||
class_name = DiasporaFederation::Entity.entity_class(type).to_s.rpartition("::").last
|
add_reference(author, type, guid)
|
||||||
entity = Diaspora::Federation::Mappings.model_class_for(class_name).find_by(guid: guid)
|
|
||||||
references.find_or_create_by(target: entity) if entity.diaspora_handle == author
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def add_reference(author, type, guid)
|
||||||
|
class_name = DiasporaFederation::Entity.entity_class(type).to_s.rpartition("::").last
|
||||||
|
entity = Diaspora::Federation::Mappings.model_class_for(class_name).find_by(guid: guid)
|
||||||
|
references.find_or_create_by(target: entity) if entity&.diaspora_handle == author
|
||||||
|
rescue => e # rubocop:disable Lint/RescueWithoutErrorClass
|
||||||
|
logger.warn "ignoring invalid diaspora-url: diaspora://#{author}/#{type}/#{guid}: #{e.class}: #{e.message}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module Target
|
module Target
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,8 @@ module Diaspora
|
||||||
|
|
||||||
def diaspora_links
|
def diaspora_links
|
||||||
@message = @message.gsub(DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX) {|match_str|
|
@message = @message.gsub(DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX) {|match_str|
|
||||||
Regexp.last_match(2) == "post" ? AppConfig.url_to("/posts/#{Regexp.last_match(3)}") : match_str
|
guid = Regexp.last_match(3)
|
||||||
|
Regexp.last_match(2) == "post" && Post.exists?(guid: guid) ? AppConfig.url_to("/posts/#{guid}") : match_str
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,17 @@ describe Diaspora::MessageRenderer do
|
||||||
text = "You can create diaspora://author/type/guid links!"
|
text = "You can create diaspora://author/type/guid links!"
|
||||||
expect(message(text).html).to match(/#{text}/)
|
expect(message(text).html).to match(/#{text}/)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "ignores a diaspora:// links with a unknown guid" do
|
||||||
|
text = "Try this: `diaspora://unknown@localhost:3000/post/thislookslikeavalidguid123456789`"
|
||||||
|
expect(message(text).html).to match(/#{text}/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "ignores a diaspora:// links with an invalid entity type" do
|
||||||
|
target = FactoryGirl.create(:status_message)
|
||||||
|
text = "Try this: `diaspora://#{target.diaspora_handle}/posts/#{target.guid}`"
|
||||||
|
expect(message(text).html).to match(/#{text}/)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,26 @@ shared_examples_for "a reference source" do
|
||||||
expect(post.references.map(&:target).map(&:guid)).to match_array([target1, target2].map(&:guid))
|
expect(post.references.map(&:target).map(&:guid)).to match_array([target1, target2].map(&:guid))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "ignores a reference with a unknown guid" do
|
||||||
|
text = "Try this: `diaspora://unknown@localhost:3000/post/thislookslikeavalidguid123456789`"
|
||||||
|
|
||||||
|
post = FactoryGirl.build(described_class.to_s.underscore.to_sym, text: text)
|
||||||
|
post.save
|
||||||
|
|
||||||
|
expect(post.references).to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
it "ignores a reference with an invalid entity type" do
|
||||||
|
target = FactoryGirl.create(:status_message)
|
||||||
|
|
||||||
|
text = "Try this: `diaspora://#{target.diaspora_handle}/posts/#{target.guid}`"
|
||||||
|
|
||||||
|
post = FactoryGirl.build(described_class.to_s.underscore.to_sym, text: text)
|
||||||
|
post.save
|
||||||
|
|
||||||
|
expect(post.references).to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
it "only creates one reference, even when it is referenced twice" do
|
it "only creates one reference, even when it is referenced twice" do
|
||||||
target = FactoryGirl.create(:status_message)
|
target = FactoryGirl.create(:status_message)
|
||||||
text = "Have a look at [this post](diaspora://#{target.diaspora_handle}/post/#{target.guid}) and " \
|
text = "Have a look at [this post](diaspora://#{target.diaspora_handle}/post/#{target.guid}) and " \
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue