diff options
17 files changed, 252 insertions, 188 deletions
| diff --git a/CHANGELOG.md b/CHANGELOG.md index 13641b3c2..7d0243e36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  - Fixed lowercase HTTP HEAD method in the Media Proxy Preview code  - Removed useless notification call on Delete activities  - Improved performance for filtering out deactivated and invisible users +- RSS and Atom feeds for users work again +- TwitterCard meta tags conformance  ### Removed  - Quack, the logging backend that pushes to Slack channels diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex index 35a5f9482..449659f4b 100644 --- a/lib/pleroma/web/feed/feed_view.ex +++ b/lib/pleroma/web/feed/feed_view.ex @@ -14,14 +14,8 @@ defmodule Pleroma.Web.Feed.FeedView do    require Pleroma.Constants -  @spec pub_date(String.t() | DateTime.t()) :: String.t() -  def pub_date(date) when is_binary(date) do -    date -    |> Timex.parse!("{ISO:Extended}") -    |> pub_date -  end - -  def pub_date(%DateTime{} = date), do: Timex.format!(date, "{RFC822}") +  @days ~w(Mon Tue Wed Thu Fri Sat Sun) +  @months ~w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)    def prepare_activity(activity, opts \\ []) do      object = Object.normalize(activity, fetch: false) @@ -41,13 +35,18 @@ defmodule Pleroma.Web.Feed.FeedView do    def most_recent_update(activities) do      with %{updated_at: updated_at} <- List.first(activities) do -      NaiveDateTime.to_iso8601(updated_at) +      to_rfc3339(updated_at)      end    end -  def most_recent_update(activities, user) do +  def most_recent_update(activities, user, :atom) do      (List.first(activities) || user).updated_at -    |> NaiveDateTime.to_iso8601() +    |> to_rfc3339() +  end + +  def most_recent_update(activities, user, :rss) do +    (List.first(activities) || user).updated_at +    |> to_rfc2822()    end    def feed_logo do @@ -61,6 +60,10 @@ defmodule Pleroma.Web.Feed.FeedView do      |> MediaProxy.url()    end +  def email(user) do +    user.nickname <> "@" <> Pleroma.Web.Endpoint.host() +  end +    def logo(user) do      user      |> User.avatar_url() @@ -69,18 +72,34 @@ defmodule Pleroma.Web.Feed.FeedView do    def last_activity(activities), do: List.last(activities) -  def activity_title(%{"content" => content}, opts \\ %{}) do -    content +  def activity_title(%{"content" => content, "summary" => summary} = data, opts \\ %{}) do +    title = +      cond do +        summary != "" -> summary +        content != "" -> activity_content(data) +        true -> "a post" +      end + +    title      |> Pleroma.Web.Metadata.Utils.scrub_html()      |> Pleroma.Emoji.Formatter.demojify()      |> Formatter.truncate(opts[:max_length], opts[:omission]) -    |> escape() +  end + +  def activity_description(data) do +    content = activity_content(data) +    summary = data["summary"] + +    cond do +      content != "" -> escape(content) +      summary != "" -> escape(summary) +      true -> escape(data["type"]) +    end    end    def activity_content(%{"content" => content}) do      content      |> String.replace(~r/[\n\r]/, "") -    |> escape()    end    def activity_content(_), do: "" @@ -112,4 +131,60 @@ defmodule Pleroma.Web.Feed.FeedView do      |> html_escape()      |> safe_to_string()    end + +  @spec to_rfc3339(String.t() | NativeDateTime.t()) :: String.t() +  def to_rfc3339(date) when is_binary(date) do +    date +    |> Timex.parse!("{ISO:Extended}") +    |> to_rfc3339() +  end + +  def to_rfc3339(nd) do +    nd +    |> Timex.to_datetime() +    |> Timex.format!("{RFC3339}") +  end + +  @spec to_rfc2822(String.t() | DateTime.t() | NativeDateTime.t()) :: String.t() +  def to_rfc2822(datestr) when is_binary(datestr) do +    datestr +    |> Timex.parse!("{ISO:Extended}") +    |> to_rfc2822() +  end + +  def to_rfc2822(%DateTime{} = date) do +    date +    |> DateTime.to_naive() +    |> NaiveDateTime.to_erl() +    |> rfc2822_from_erl() +  end + +  def to_rfc2822(nd) do +    nd +    |> Timex.to_datetime() +    |> DateTime.to_naive() +    |> NaiveDateTime.to_erl() +    |> rfc2822_from_erl() +  end + +  @doc """ +  Builds a RFC2822 timestamp from an Erlang timestamp +  [RFC2822 3.3 - Date and Time Specification](https://tools.ietf.org/html/rfc2822#section-3.3) +  This function always assumes the Erlang timestamp is in Universal time, not Local time +  """ +  def rfc2822_from_erl({{year, month, day} = date, {hour, minute, second}}) do +    day_name = Enum.at(@days, :calendar.day_of_the_week(date) - 1) +    month_name = Enum.at(@months, month - 1) + +    date_part = "#{day_name}, #{day} #{month_name} #{year}" +    time_part = "#{pad(hour)}:#{pad(minute)}:#{pad(second)}" + +    date_part <> " " <> time_part <> " +0000" +  end + +  defp pad(num) do +    num +    |> Integer.to_string() +    |> String.pad_leading(2, "0") +  end  end diff --git a/lib/pleroma/web/metadata/providers/twitter_card.ex b/lib/pleroma/web/metadata/providers/twitter_card.ex index bf0a12212..2dac22ee2 100644 --- a/lib/pleroma/web/metadata/providers/twitter_card.ex +++ b/lib/pleroma/web/metadata/providers/twitter_card.ex @@ -20,12 +20,12 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do      [        title_tag(user), -      {:meta, [property: "twitter:description", content: scrubbed_content], []} +      {:meta, [name: "twitter:description", content: scrubbed_content], []}      ] ++        if attachments == [] or Metadata.activity_nsfw?(object) do          [            image_tag(user), -          {:meta, [property: "twitter:card", content: "summary"], []} +          {:meta, [name: "twitter:card", content: "summary"], []}          ]        else          attachments @@ -37,20 +37,19 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do      with truncated_bio = Utils.scrub_html_and_truncate(user.bio) do        [          title_tag(user), -        {:meta, [property: "twitter:description", content: truncated_bio], []}, +        {:meta, [name: "twitter:description", content: truncated_bio], []},          image_tag(user), -        {:meta, [property: "twitter:card", content: "summary"], []} +        {:meta, [name: "twitter:card", content: "summary"], []}        ]      end    end    defp title_tag(user) do -    {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []} +    {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []}    end    def image_tag(user) do -    {:meta, [property: "twitter:image", content: MediaProxy.preview_url(User.avatar_url(user))], -     []} +    {:meta, [name: "twitter:image", content: MediaProxy.preview_url(User.avatar_url(user))], []}    end    defp build_attachments(id, %{data: %{"attachment" => attachments}}) do @@ -60,10 +59,10 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do            case Utils.fetch_media_type(@media_types, url["mediaType"]) do              "audio" ->                [ -                {:meta, [property: "twitter:card", content: "player"], []}, -                {:meta, [property: "twitter:player:width", content: "480"], []}, -                {:meta, [property: "twitter:player:height", content: "80"], []}, -                {:meta, [property: "twitter:player", content: player_url(id)], []} +                {:meta, [name: "twitter:card", content: "player"], []}, +                {:meta, [name: "twitter:player:width", content: "480"], []}, +                {:meta, [name: "twitter:player:height", content: "80"], []}, +                {:meta, [name: "twitter:player", content: player_url(id)], []}                  | acc                ] @@ -74,10 +73,10 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do              # workaround.              "image" ->                [ -                {:meta, [property: "twitter:card", content: "summary_large_image"], []}, +                {:meta, [name: "twitter:card", content: "summary_large_image"], []},                  {:meta,                   [ -                   property: "twitter:player", +                   name: "twitter:player",                     content: MediaProxy.url(url["href"])                   ], []}                  | acc @@ -90,14 +89,14 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do                width = url["width"] || 480                [ -                {:meta, [property: "twitter:card", content: "player"], []}, -                {:meta, [property: "twitter:player", content: player_url(id)], []}, -                {:meta, [property: "twitter:player:width", content: "#{width}"], []}, -                {:meta, [property: "twitter:player:height", content: "#{height}"], []}, -                {:meta, [property: "twitter:player:stream", content: MediaProxy.url(url["href"])], +                {:meta, [name: "twitter:card", content: "player"], []}, +                {:meta, [name: "twitter:player", content: player_url(id)], []}, +                {:meta, [name: "twitter:player:width", content: "#{width}"], []}, +                {:meta, [name: "twitter:player:height", content: "#{height}"], []}, +                {:meta, [name: "twitter:player:stream", content: MediaProxy.url(url["href"])],                   []}, -                {:meta, -                 [property: "twitter:player:stream:content_type", content: url["mediaType"]], []} +                {:meta, [name: "twitter:player:stream:content_type", content: url["mediaType"]], +                 []}                  | acc                ] @@ -123,8 +122,8 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do        !is_nil(url["height"]) && !is_nil(url["width"]) ->          metadata ++            [ -            {:meta, [property: "twitter:player:width", content: "#{url["width"]}"], []}, -            {:meta, [property: "twitter:player:height", content: "#{url["height"]}"], []} +            {:meta, [name: "twitter:player:width", content: "#{url["width"]}"], []}, +            {:meta, [name: "twitter:player:height", content: "#{url["height"]}"], []}            ]        true -> diff --git a/lib/pleroma/web/templates/feed/feed/_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_activity.atom.eex index 57bd92468..260338772 100644 --- a/lib/pleroma/web/templates/feed/feed/_activity.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/_activity.atom.eex @@ -3,15 +3,15 @@    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>    <id><%= @data["id"] %></id>    <title><%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %></title> -  <content type="html"><%= activity_content(@data) %></content> -  <published><%= @activity.data["published"] %></published> -  <updated><%= @activity.data["published"] %></updated> +  <content type="html"><%= activity_description(@data) %></content> +  <published><%= to_rfc3339(@activity.data["published"]) %></published> +  <updated><%= to_rfc3339(@activity.data["published"]) %></updated>    <ostatus:conversation ref="<%= activity_context(@activity) %>">      <%= activity_context(@activity) %>    </ostatus:conversation>    <link href="<%= activity_context(@activity) %>" rel="ostatus:conversation"/> -  <%= if @data["summary"] do %> +  <%= if @data["summary"] != "" do %>      <summary><%= escape(@data["summary"]) %></summary>    <% end %> diff --git a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex index 279f2171d..5c8f35fe4 100644 --- a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex @@ -3,17 +3,12 @@    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>    <guid><%= @data["id"] %></guid>    <title><%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %></title> -  <description><%= activity_content(@data) %></description> -  <pubDate><%= @activity.data["published"] %></pubDate> -  <updated><%= @activity.data["published"] %></updated> +  <description><%= activity_description(@data) %></description> +  <pubDate><%= to_rfc2822(@activity.data["published"]) %></pubDate>    <ostatus:conversation ref="<%= activity_context(@activity) %>">      <%= activity_context(@activity) %>    </ostatus:conversation> -  <%= if @data["summary"] do %> -    <description><%= escape(@data["summary"]) %></description> -  <% end %> -    <%= if @activity.local do %>      <link><%= @data["id"] %></link>    <% else %> @@ -27,7 +22,7 @@    <% end %>    <%= for attachment <- @data["attachment"] || [] do %> -    <link type="<%= attachment_type(attachment) %>"><%= attachment_href(attachment) %></link> +    <enclosure url="<%= attachment_href(attachment) %>" type="<%= attachment_type(attachment) %>" />    <% end %>    <%= if @data["inReplyTo"] do %> diff --git a/lib/pleroma/web/templates/feed/feed/_author.atom.eex b/lib/pleroma/web/templates/feed/feed/_author.atom.eex index 25cbffada..90be8a559 100644 --- a/lib/pleroma/web/templates/feed/feed/_author.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/_author.atom.eex @@ -1,17 +1,14 @@  <author> -  <id><%= @user.ap_id %></id> -  <activity:object>http://activitystrea.ms/schema/1.0/person</activity:object>    <uri><%= @user.ap_id %></uri> +  <name><%= @user.nickname %></name> +  <activity:object>http://activitystrea.ms/schema/1.0/person</activity:object> +  <activity:displayName><%= @user.name %></activity:displayName> +  <activity:image><%= User.avatar_url(@user) %></activity:image> +  <activity:id><%= @user.ap_id %></activity:id> +  <activity:published><%= to_rfc3339(@user.inserted_at) %></activity:published> +  <activity:updated><%= to_rfc3339(@user.updated_at) %></activity:updated> +  <activity:url><%= @user.ap_id %></activity:url>    <poco:preferredUsername><%= @user.nickname %></poco:preferredUsername>    <poco:displayName><%= @user.name %></poco:displayName>    <poco:note><%= escape(@user.bio) %></poco:note> -  <summary><%= escape(@user.bio) %></summary> -  <name><%= @user.nickname %></name> -  <link rel="avatar" href="<%= User.avatar_url(@user) %>"/> -  <%= if User.banner_url(@user) do %> -    <link rel="header" href="<%= User.banner_url(@user) %>"/> -  <% end %> -  <%= if @user.local do %> -    <ap_enabled>true</ap_enabled> -  <% end %>  </author> diff --git a/lib/pleroma/web/templates/feed/feed/_author.rss.eex b/lib/pleroma/web/templates/feed/feed/_author.rss.eex index 526aeddcf..22477e6b1 100644 --- a/lib/pleroma/web/templates/feed/feed/_author.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/_author.rss.eex @@ -1,17 +1,10 @@ -<managingEditor> -  <guid><%= @user.ap_id %></guid> -  <activity:object>http://activitystrea.ms/schema/1.0/person</activity:object> -  <uri><%= @user.ap_id %></uri> -  <poco:preferredUsername><%= @user.nickname %></poco:preferredUsername> -  <poco:displayName><%= @user.name %></poco:displayName> -  <poco:note><%= escape(@user.bio) %></poco:note> -  <description><%= escape(@user.bio) %></description> -  <name><%= @user.nickname %></name> -  <link rel="avatar"><%= User.avatar_url(@user) %></link> -  <%= if User.banner_url(@user) do %> -    <link rel="header"><%= User.banner_url(@user) %></link> -  <% end %> -  <%= if @user.local do %> -    <ap_enabled>true</ap_enabled> -  <% end %> -</managingEditor> +<managingEditor><%= "#{email(@user)} (#{escape(@user.name)})" %></managingEditor> +<activity:object>http://activitystrea.ms/schema/1.0/person</activity:object> +<activity:displayName><%= @user.name %></activity:displayName> +<activity:image><%= User.avatar_url(@user) %></activity:image> +<activity:id><%= @user.ap_id %></activity:id> +<activity:published><%= to_rfc3339(@user.inserted_at) %></activity:published> +<activity:updated><%= to_rfc3339(@user.updated_at) %></activity:updated> +<poco:preferredUsername><%= @user.nickname %></poco:preferredUsername> +<poco:displayName><%= @user.name %></poco:displayName> +<poco:note><%= escape(@user.bio) %></poco:note> diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex index 7e2e587e1..25980c1e4 100644 --- a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex @@ -1,12 +1,22 @@  <entry> -    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> -    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb> +  <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> +  <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>      <%= render Phoenix.Controller.view_module(@conn), "_tag_author.atom", assigns %> -    <id><%= @data["id"] %></id> -    <title><%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %></title> -    <content type="html"><%= activity_content(@data) %></content> +  <id><%= @data["id"] %></id> +  <title><%= activity_title(@data, Keyword.get(@feed_config, :post_title, %{})) %></title> +  <content type="html"><%= activity_description(@data) %></content> +  <published><%= to_rfc3339(@activity.data["published"]) %></published> +  <updated><%= to_rfc3339(@activity.data["published"]) %></updated> +  <ostatus:conversation ref="<%= activity_context(@activity) %>"> +    <%= activity_context(@activity) %> +  </ostatus:conversation> +  <link href="<%= activity_context(@activity) %>" rel="ostatus:conversation"/> + +  <%= if @data["summary"] != "" do %> +    <summary><%= @data["summary"] %></summary> +  <% end %>    <%= if @activity.local do %>      <link type="application/atom+xml" href='<%= @data["id"] %>' rel="self"/> @@ -15,37 +25,25 @@      <link type="text/html" href='<%= @data["external_url"] %>' rel="alternate"/>    <% end %> -    <published><%= @activity.data["published"] %></published> -    <updated><%= @activity.data["published"] %></updated> - -    <ostatus:conversation ref="<%= activity_context(@activity) %>"> -      <%= activity_context(@activity) %> -    </ostatus:conversation> -    <link href="<%= activity_context(@activity) %>" rel="ostatus:conversation"/> - -   <%= if @data["summary"] do %> -    <summary><%= @data["summary"] %></summary> -   <% end %> - -    <%= for id <- @activity.recipients do %> -      <%= if id == Pleroma.Constants.as_public() do %> +  <%= for id <- @activity.recipients do %> +    <%= if id == Pleroma.Constants.as_public() do %> +      <link rel="mentioned" +            ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" +            href="http://activityschema.org/collection/public"/> +    <% else %> +      <%= unless Regex.match?(~r/^#{Pleroma.Web.Endpoint.url()}.+followers$/, id) do %>          <link rel="mentioned" -          ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" -          href="http://activityschema.org/collection/public"/> -      <% else %> -        <%= unless Regex.match?(~r/^#{Pleroma.Web.Endpoint.url()}.+followers$/, id) do %> -          <link rel="mentioned" -            ostatus:object-type="http://activitystrea.ms/schema/1.0/person" -            href="<%= id %>" /> -        <% end %> +              ostatus:object-type="http://activitystrea.ms/schema/1.0/person" +              href="<%= id %>" />        <% end %>      <% end %> +  <% end %> -    <%= for tag <- Pleroma.Object.hashtags(@object) do %> -      <category term="<%= tag %>"></category> -    <% end %> +  <%= for tag <- Pleroma.Object.hashtags(@object) do %> +    <category term="<%= tag %>"></category> +  <% end %> -    <%= for {emoji, file} <- @data["emoji"] || %{} do %> -      <link name="<%= emoji %>" rel="emoji" href="<%= file %>"/> -    <% end %> +  <%= for {emoji, file} <- @data["emoji"] || %{} do %> +    <link name="<%= emoji %>" rel="emoji" href="<%= file %>"/> +  <% end %>  </entry> diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex index 2334e24a2..d582c83e8 100644 --- a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex +++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex @@ -4,9 +4,9 @@    <guid isPermalink="true"><%= activity_context(@activity) %></guid>    <link><%= activity_context(@activity) %></link> -  <pubDate><%= pub_date(@activity.data["published"]) %></pubDate> +  <pubDate><%= to_rfc2822(@activity.data["published"]) %></pubDate> -  <description><%= activity_content(@data) %></description> +  <description><%= activity_description(@data) %></description>    <%= for attachment <- @data["attachment"] || [] do %>      <enclosure url="<%= attachment_href(attachment) %>" type="<%= attachment_type(attachment) %>"/>    <% end %> diff --git a/lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex b/lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex index 997c4936e..71c696832 100644 --- a/lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex @@ -1,18 +1,14 @@  <author> -    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type> -    <id><%= @actor.ap_id %></id> -    <uri><%= @actor.ap_id %></uri> -    <name><%= @actor.nickname %></name> -    <summary><%= escape(@actor.bio) %></summary> -    <link rel="avatar" href="<%= User.avatar_url(@actor) %>"/> -    <%= if User.banner_url(@actor) do %> -      <link rel="header" href="<%= User.banner_url(@actor) %>"/> -    <% end %> -    <%= if @actor.local do %> -      <ap_enabled>true</ap_enabled> -    <% end %> -   -    <poco:preferredUsername><%= @actor.nickname %></poco:preferredUsername>         -    <poco:displayName><%= @actor.name %></poco:displayName> -    <poco:note><%= escape(@actor.bio) %></poco:note>     +  <uri><%= @actor.ap_id %></uri> +  <name><%= @actor.nickname %></name> +  <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type> +  <activity:displayName><%= @actor.name %></activity:displayName> +  <activity:image><%= User.avatar_url(@actor) %></activity:image> +  <activity:id><%= @actor.ap_id %></activity:id> +  <activity:published><%= to_rfc3339(@actor.inserted_at) %></activity:published> +  <activity:updated><%= to_rfc3339(@actor.updated_at) %></activity:updated> +  <activity:url><%= @actor.ap_id %></activity:url> +  <poco:preferredUsername><%= @actor.nickname %></poco:preferredUsername> +  <poco:displayName><%= @actor.name %></poco:displayName> +  <poco:note><%= escape(@actor.bio) %></poco:note>  </author> diff --git a/lib/pleroma/web/templates/feed/feed/tag.atom.eex b/lib/pleroma/web/templates/feed/feed/tag.atom.eex index 8c551feaf..14b0ee594 100644 --- a/lib/pleroma/web/templates/feed/feed/tag.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/tag.atom.eex @@ -1,22 +1,20 @@  <?xml version="1.0" encoding="UTF-8"?> +<feed +  xmlns="http://www.w3.org/2005/Atom" +  xmlns:thr="http://purl.org/syndication/thread/1.0" +  xmlns:activity="http://activitystrea.ms/spec/1.0/" +  xmlns:poco="http://portablecontacts.net/spec/1.0" +  xmlns:ostatus="http://ostatus.org/schema/1.0" +  xmlns:statusnet="http://status.net/schema/api/1/"> -<feed xml:lang="<%= Gettext.language_tag() %>" xmlns="http://www.w3.org/2005/Atom" -      xmlns:thr="http://purl.org/syndication/thread/1.0" -      xmlns:georss="http://www.georss.org/georss" -      xmlns:activity="http://activitystrea.ms/spec/1.0/" -      xmlns:media="http://purl.org/syndication/atommedia" -      xmlns:poco="http://portablecontacts.net/spec/1.0" -      xmlns:ostatus="http://ostatus.org/schema/1.0" -      xmlns:statusnet="http://status.net/schema/api/1/"> +  <id><%= Routes.tag_feed_url(@conn, :feed, @tag) <> ".atom" %></id> +  <title>#<%= @tag %></title> +  <subtitle><%= Gettext.dpgettext("static_pages", "tag feed description", "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse.", tag: @tag) %></subtitle> +  <logo><%= feed_logo() %></logo> +  <updated><%= most_recent_update(@activities) %></updated> +  <link rel="self" href="<%= '#{Routes.tag_feed_url(@conn, :feed, @tag)}.atom'  %>" type="application/atom+xml"/> -    <id><%= '#{Routes.tag_feed_url(@conn, :feed, @tag)}.rss' %></id> -    <title>#<%= @tag %></title> - -    <subtitle><%= Gettext.dpgettext("static_pages", "tag feed description", "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse.", tag: @tag) %></subtitle> -    <logo><%= feed_logo() %></logo> -    <updated><%= most_recent_update(@activities) %></updated> -    <link rel="self" href="<%= '#{Routes.tag_feed_url(@conn, :feed, @tag)}.atom'  %>" type="application/atom+xml"/> -    <%= for activity <- @activities do %> -    <%= render Phoenix.Controller.view_module(@conn), "_tag_activity.atom", Map.merge(assigns, prepare_activity(activity, actor: true)) %> -    <% end %> +  <%= for activity <- @activities do %> +  <%= render Phoenix.Controller.view_module(@conn), "_tag_activity.atom", Map.merge(assigns, prepare_activity(activity, actor: true)) %> +  <% end %>  </feed> diff --git a/lib/pleroma/web/templates/feed/feed/tag.rss.eex b/lib/pleroma/web/templates/feed/feed/tag.rss.eex index 86466d367..27dde5627 100644 --- a/lib/pleroma/web/templates/feed/feed/tag.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/tag.rss.eex @@ -1,8 +1,9 @@  <?xml version="1.0" encoding="UTF-8"?> -<rss version="2.0" xmlns:webfeeds="http://webfeeds.org/rss/1.0"> +<rss version="2.0" +     xmlns:webfeeds="http://webfeeds.org/rss/1.0" +     xmlns:thr="http://purl.org/syndication/thread/1.0">    <channel> -      <title>#<%= @tag %></title>      <description><%= Gettext.dpgettext("static_pages", "tag feed description", "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse.", tag: @tag) %></description>      <link><%= '#{Routes.tag_feed_url(@conn, :feed, @tag)}.rss' %></link> diff --git a/lib/pleroma/web/templates/feed/feed/user.atom.eex b/lib/pleroma/web/templates/feed/feed/user.atom.eex index 97a7535ab..e36bfc66c 100644 --- a/lib/pleroma/web/templates/feed/feed/user.atom.eex +++ b/lib/pleroma/web/templates/feed/feed/user.atom.eex @@ -8,7 +8,8 @@    <id><%= Routes.user_feed_url(@conn, :feed, @user.nickname) <> ".atom" %></id>    <title><%= @user.nickname <> "'s timeline" %></title> -  <updated><%= most_recent_update(@activities, @user) %></updated> +  <subtitle><%= escape(@user.bio) %></subtitle> +  <updated><%= most_recent_update(@activities, @user, :atom) %></updated>    <logo><%= logo(@user) %></logo>    <link rel="self" href="<%= '#{Routes.user_feed_url(@conn, :feed, @user.nickname)}.atom' %>" type="application/atom+xml"/> diff --git a/lib/pleroma/web/templates/feed/feed/user.rss.eex b/lib/pleroma/web/templates/feed/feed/user.rss.eex index a9fee244c..fae3fcf3d 100644 --- a/lib/pleroma/web/templates/feed/feed/user.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/user.rss.eex @@ -1,11 +1,21 @@  <?xml version="1.0" encoding="UTF-8" ?> -<rss version="2.0"> +<rss version="2.0" +     xmlns:atom="http://www.w3.org/2005/Atom" +     xmlns:thr="http://purl.org/syndication/thread/1.0" +     xmlns:activity="http://activitystrea.ms/spec/1.0/" +     xmlns:ostatus="http://ostatus.org/schema/1.0" +     xmlns:poco="http://portablecontacts.net/spec/1.0">    <channel> -    <guid><%= Routes.user_feed_url(@conn, :feed, @user.nickname) <> ".rss" %></guid>      <title><%= @user.nickname <> "'s timeline" %></title> -    <updated><%= most_recent_update(@activities, @user) %></updated> -    <image><%= logo(@user) %></image>      <link><%= '#{Routes.user_feed_url(@conn, :feed, @user.nickname)}.rss' %></link> +    <atom:link href="<%= Routes.user_feed_url(@conn, :feed, @user.nickname) <> ".atom" %>" +               rel="self" type="application/rss+xml" /> +    <description><%= escape(@user.bio) %></description> +    <image> +      <url><%= logo(@user) %></url> +      <title><%= @user.nickname <> "'s timeline" %></title> +      <link><%= '#{Routes.user_feed_url(@conn, :feed, @user.nickname)}.rss' %></link> +    </image>      <%= render Phoenix.Controller.view_module(@conn), "_author.rss", assigns %> diff --git a/test/pleroma/web/feed/tag_controller_test.exs b/test/pleroma/web/feed/tag_controller_test.exs index 1bd2b157c..58ab8f137 100644 --- a/test/pleroma/web/feed/tag_controller_test.exs +++ b/test/pleroma/web/feed/tag_controller_test.exs @@ -63,7 +63,6 @@ defmodule Pleroma.Web.Feed.TagControllerTest do             ]      assert xpath(xml, ~x"//feed/entry/author/name/text()"ls) == [user.nickname, user.nickname] -    assert xpath(xml, ~x"//feed/entry/author/id/text()"ls) == [user.ap_id, user.ap_id]      conn =        conn @@ -138,8 +137,8 @@ defmodule Pleroma.Web.Feed.TagControllerTest do             ]      assert xpath(xml, ~x"//channel/item/pubDate/text()"sl) == [ -             FeedView.pub_date(activity2.data["published"]), -             FeedView.pub_date(activity1.data["published"]) +             FeedView.to_rfc2822(activity2.data["published"]), +             FeedView.to_rfc2822(activity1.data["published"])             ]      assert xpath(xml, ~x"//channel/item/enclosure/@url"sl) == [ diff --git a/test/pleroma/web/feed/user_controller_test.exs b/test/pleroma/web/feed/user_controller_test.exs index 38cde3315..de32d3d4b 100644 --- a/test/pleroma/web/feed/user_controller_test.exs +++ b/test/pleroma/web/feed/user_controller_test.exs @@ -74,7 +74,7 @@ defmodule Pleroma.Web.Feed.UserControllerTest do          |> SweetXml.parse()          |> SweetXml.xpath(~x"//entry/title/text()"l) -      assert activity_titles == ['42 & Thi...', 'This & t...'] +      assert activity_titles == ['2hu', '2hu & as']        assert resp =~ FeedView.escape(object.data["content"])        assert resp =~ FeedView.escape(object.data["summary"])        assert resp =~ FeedView.escape(object.data["context"]) @@ -90,7 +90,7 @@ defmodule Pleroma.Web.Feed.UserControllerTest do          |> SweetXml.parse()          |> SweetXml.xpath(~x"//entry/title/text()"l) -      assert activity_titles == ['This & t...'] +      assert activity_titles == ['2hu & as']      end      test "gets a rss feed", %{conn: conn, user: user, object: object, max_id: max_id} do @@ -105,7 +105,7 @@ defmodule Pleroma.Web.Feed.UserControllerTest do          |> SweetXml.parse()          |> SweetXml.xpath(~x"//item/title/text()"l) -      assert activity_titles == ['42 & Thi...', 'This & t...'] +      assert activity_titles == ['2hu', '2hu & as']        assert resp =~ FeedView.escape(object.data["content"])        assert resp =~ FeedView.escape(object.data["summary"])        assert resp =~ FeedView.escape(object.data["context"]) @@ -121,7 +121,7 @@ defmodule Pleroma.Web.Feed.UserControllerTest do          |> SweetXml.parse()          |> SweetXml.xpath(~x"//item/title/text()"l) -      assert activity_titles == ['This & t...'] +      assert activity_titles == ['2hu & as']      end      test "returns 404 for a missing feed", %{conn: conn} do diff --git a/test/pleroma/web/metadata/providers/twitter_card_test.exs b/test/pleroma/web/metadata/providers/twitter_card_test.exs index 1a0cea9ce..be4cfbe7b 100644 --- a/test/pleroma/web/metadata/providers/twitter_card_test.exs +++ b/test/pleroma/web/metadata/providers/twitter_card_test.exs @@ -22,10 +22,10 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      res = TwitterCard.build_tags(%{user: user})      assert res == [ -             {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "born 19 March 1994"], []}, -             {:meta, [property: "twitter:image", content: avatar_url], []}, -             {:meta, [property: "twitter:card", content: "summary"], []} +             {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []}, +             {:meta, [name: "twitter:description", content: "born 19 March 1994"], []}, +             {:meta, [name: "twitter:image", content: avatar_url], []}, +             {:meta, [name: "twitter:card", content: "summary"], []}             ]    end @@ -47,11 +47,11 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})      assert [ -             {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "pleroma in a nutshell"], []}, -             {:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"], +             {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []}, +             {:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []}, +             {:meta, [name: "twitter:image", content: "http://localhost:4001/images/avi.png"],                []}, -             {:meta, [property: "twitter:card", content: "summary"], []} +             {:meta, [name: "twitter:card", content: "summary"], []}             ] == result    end @@ -73,15 +73,15 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})      assert [ -             {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, +             {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []},               {:meta,                [ -                property: "twitter:description", +                name: "twitter:description",                  content: "Public service announcement on caffeine consumption"                ], []}, -             {:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"], +             {:meta, [name: "twitter:image", content: "http://localhost:4001/images/avi.png"],                []}, -             {:meta, [property: "twitter:card", content: "summary"], []} +             {:meta, [name: "twitter:card", content: "summary"], []}             ] == result    end @@ -123,11 +123,11 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})      assert [ -             {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "pleroma in a nutshell"], []}, -             {:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"], +             {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []}, +             {:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []}, +             {:meta, [name: "twitter:image", content: "http://localhost:4001/images/avi.png"],                []}, -             {:meta, [property: "twitter:card", content: "summary"], []} +             {:meta, [name: "twitter:card", content: "summary"], []}             ] == result    end @@ -179,26 +179,26 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do      result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})      assert [ -             {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []}, -             {:meta, [property: "twitter:description", content: "pleroma in a nutshell"], []}, -             {:meta, [property: "twitter:card", content: "summary_large_image"], []}, -             {:meta, [property: "twitter:player", content: "https://pleroma.gov/tenshi.png"], []}, -             {:meta, [property: "twitter:player:width", content: "1280"], []}, -             {:meta, [property: "twitter:player:height", content: "1024"], []}, -             {:meta, [property: "twitter:card", content: "player"], []}, +             {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []}, +             {:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []}, +             {:meta, [name: "twitter:card", content: "summary_large_image"], []}, +             {:meta, [name: "twitter:player", content: "https://pleroma.gov/tenshi.png"], []}, +             {:meta, [name: "twitter:player:width", content: "1280"], []}, +             {:meta, [name: "twitter:player:height", content: "1024"], []}, +             {:meta, [name: "twitter:card", content: "player"], []},               {:meta,                [ -                property: "twitter:player", +                name: "twitter:player",                  content: Router.Helpers.o_status_url(Endpoint, :notice_player, activity.id)                ], []}, -             {:meta, [property: "twitter:player:width", content: "800"], []}, -             {:meta, [property: "twitter:player:height", content: "600"], []}, +             {:meta, [name: "twitter:player:width", content: "800"], []}, +             {:meta, [name: "twitter:player:height", content: "600"], []},               {:meta,                [ -                property: "twitter:player:stream", +                name: "twitter:player:stream",                  content: "https://pleroma.gov/about/juche.webm"                ], []}, -             {:meta, [property: "twitter:player:stream:content_type", content: "video/webm"], []} +             {:meta, [name: "twitter:player:stream:content_type", content: "video/webm"], []}             ] == result    end  end | 
