Merge commit from fork
* Check scheme in account and post links * Harden media attachments * Client-side mitigation * Client-side mitigation for media attachments
This commit is contained in:
		@@ -77,6 +77,17 @@ export function normalizeStatus(status, normalOldStatus) {
 | 
			
		||||
    normalStatus.contentHtml  = emojify(normalStatus.content, emojiMap);
 | 
			
		||||
    normalStatus.spoilerHtml  = emojify(escapeTextContentForBrowser(spoilerText), emojiMap);
 | 
			
		||||
    normalStatus.hidden       = expandSpoilers ? false : spoilerText.length > 0 || normalStatus.sensitive;
 | 
			
		||||
 | 
			
		||||
    if (normalStatus.url && !(normalStatus.url.startsWith('http://') || normalStatus.url.startsWith('https://'))) {
 | 
			
		||||
      normalStatus.url = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    normalStatus.url ||= normalStatus.uri;
 | 
			
		||||
 | 
			
		||||
    normalStatus.media_attachments.forEach(item => {
 | 
			
		||||
      if (item.remote_url && !(item.remote_url.startsWith('http://') || item.remote_url.startsWith('https://')))
 | 
			
		||||
        item.remote_url = null;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (normalOldStatus) {
 | 
			
		||||
 
 | 
			
		||||
@@ -144,5 +144,6 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) {
 | 
			
		||||
    ),
 | 
			
		||||
    note_emojified: emojify(accountJSON.note, emojiMap),
 | 
			
		||||
    note_plain: unescapeHTML(accountJSON.note),
 | 
			
		||||
    url: accountJSON.url.startsWith('http://') || accountJSON.url.startsWith('https://') ? accountJSON.url : accountJSON.uri,
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,13 +15,15 @@ class ActivityPub::Parser::MediaAttachmentParser
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def remote_url
 | 
			
		||||
    Addressable::URI.parse(@json['url'])&.normalize&.to_s
 | 
			
		||||
    url = Addressable::URI.parse(@json['url'])&.normalize&.to_s
 | 
			
		||||
    url unless unsupported_uri_scheme?(url)
 | 
			
		||||
  rescue Addressable::URI::InvalidURIError
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def thumbnail_remote_url
 | 
			
		||||
    Addressable::URI.parse(@json['icon'].is_a?(Hash) ? @json['icon']['url'] : @json['icon'])&.normalize&.to_s
 | 
			
		||||
    url = Addressable::URI.parse(@json['icon'].is_a?(Hash) ? @json['icon']['url'] : @json['icon'])&.normalize&.to_s
 | 
			
		||||
    url unless unsupported_uri_scheme?(url)
 | 
			
		||||
  rescue Addressable::URI::InvalidURIError
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,10 @@ class ActivityPub::Parser::StatusParser
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def url
 | 
			
		||||
    url_to_href(@object['url'], 'text/html') if @object['url'].present?
 | 
			
		||||
    return if @object['url'].blank?
 | 
			
		||||
 | 
			
		||||
    url = url_to_href(@object['url'], 'text/html')
 | 
			
		||||
    url unless unsupported_uri_scheme?(url)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def text
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ require 'singleton'
 | 
			
		||||
 | 
			
		||||
class ActivityPub::TagManager
 | 
			
		||||
  include Singleton
 | 
			
		||||
  include JsonLdHelper
 | 
			
		||||
  include RoutingHelper
 | 
			
		||||
 | 
			
		||||
  CONTEXT = 'https://www.w3.org/ns/activitystreams'
 | 
			
		||||
@@ -17,7 +18,7 @@ class ActivityPub::TagManager
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def url_for(target)
 | 
			
		||||
    return target.url if target.respond_to?(:local?) && !target.local?
 | 
			
		||||
    return unsupported_uri_scheme?(target.url) ? nil : target.url if target.respond_to?(:local?) && !target.local?
 | 
			
		||||
 | 
			
		||||
    return unless target.respond_to?(:object_type)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user