Merge branch 'features/users-raw_bio' into 'develop'
authorrinpatch <rinpatch@sdf.org>
Wed, 17 Jun 2020 10:34:23 +0000 (10:34 +0000)
committerrinpatch <rinpatch@sdf.org>
Wed, 17 Jun 2020 10:34:23 +0000 (10:34 +0000)
User: Add raw_bio, storing unformatted bio

See merge request pleroma/pleroma!2326

1  2 
lib/pleroma/user.ex
lib/pleroma/web/mastodon_api/controllers/account_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
test/support/factory.ex
test/web/mastodon_api/views/account_view_test.exs

diff --combined lib/pleroma/user.ex
index 52ac9052baa923216856b383da670f940a235b87,23ca8c9f3e2b2eb0e3c4f8edf4d28872b7ad53a3..ff3ec1197e16956be0a37bc4fcdfcfdbc07aacfc
@@@ -79,6 -79,7 +79,7 @@@ defmodule Pleroma.User d
  
    schema "users" do
      field(:bio, :string)
+     field(:raw_bio, :string)
      field(:email, :string)
      field(:name, :string)
      field(:nickname, :string)
        params,
        [
          :bio,
+         :raw_bio,
          :name,
          :emoji,
          :avatar,
  
      struct
      |> confirmation_changeset(need_confirmation: need_confirmation?)
-     |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation, :emoji])
+     |> cast(params, [
+       :bio,
+       :raw_bio,
+       :email,
+       :name,
+       :nickname,
+       :password,
+       :password_confirmation,
+       :emoji
+     ])
      |> validate_required([:name, :nickname, :password, :password_confirmation])
      |> validate_confirmation(:password)
      |> unique_constraint(:email)
      end)
  
      delete_user_activities(user)
 +    delete_notifications_from_user_activities(user)
 +
 +    delete_outgoing_pending_follow_requests(user)
  
      delete_or_deactivate(user)
    end
      })
    end
  
 +  def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do
 +    Notification
 +    |> join(:inner, [n], activity in assoc(n, :activity))
 +    |> where([n, a], fragment("? = ?", a.actor, ^ap_id))
 +    |> Repo.delete_all()
 +  end
 +
    def delete_user_activities(%User{ap_id: ap_id} = user) do
      ap_id
      |> Activity.Queries.by_actor()
  
    defp delete_activity(_activity, _user), do: "Doing nothing"
  
 +  defp delete_outgoing_pending_follow_requests(user) do
 +    user
 +    |> FollowingRelationship.outgoing_pending_follow_requests_query()
 +    |> Repo.delete_all()
 +  end
 +
    def html_filter_policy(%User{no_rich_text: true}) do
      Pleroma.HTML.Scrubber.TwitterText
    end
index 7cdd8f458734a95a77ff35a30a9114b396f8c5a0,ebfa533dd58b547f47a42c60f5449baef446c680..c38c2b895b09a8631886273141757521af4710df
@@@ -165,6 -165,7 +165,7 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
        end)
        |> Maps.put_if_present(:name, params[:display_name])
        |> Maps.put_if_present(:bio, params[:note])
+       |> Maps.put_if_present(:raw_bio, params[:note])
        |> Maps.put_if_present(:avatar, params[:avatar])
        |> Maps.put_if_present(:banner, params[:header])
        |> Maps.put_if_present(:background, params[:pleroma_background_image])
        params =
          params
          |> Map.delete(:tagged)
 -        |> Enum.filter(&(not is_nil(&1)))
 -        |> Map.new(fn {key, value} -> {to_string(key), value} end)
 -        |> Map.put("tag", params[:tagged])
 +        |> Map.put(:tag, params[:tagged])
  
        activities = ActivityPub.fetch_user_activities(user, reading_user, params)
  
index 9fc06bf9d39187bf51f7675ce78b2fc3fc7ab93a,5326b02c637c312cb8197e3b7ccaf7ccf58633b4..68beb69b8f91bab2ab75f0b78029800ce69a615a
@@@ -224,7 -224,7 +224,7 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
        fields: user.fields,
        bot: bot,
        source: %{
-         note: prepare_user_bio(user),
+         note: user.raw_bio || "",
          sensitive: false,
          fields: user.raw_fields,
          pleroma: %{
  
        # Pleroma extension
        pleroma: %{
 +        ap_id: user.ap_id,
          confirmation_pending: user.confirmation_pending,
          tags: user.tags,
          hide_followers_count: user.hide_followers_count,
      |> maybe_put_unread_notification_count(user, opts[:for])
    end
  
-   defp prepare_user_bio(%User{bio: ""}), do: ""
-   defp prepare_user_bio(%User{bio: bio}) when is_binary(bio) do
-     bio
-     |> String.replace(~r(<br */?>), "\n")
-     |> Pleroma.HTML.strip_tags()
-     |> HtmlEntities.decode()
-   end
-   defp prepare_user_bio(_), do: ""
    defp username_from_nickname(string) when is_binary(string) do
      hd(String.split(string, "@"))
    end
diff --combined test/support/factory.ex
index e517d5bc642ebec72be42bcda3227a0f45cbe499,1a9b96180ec4e30719386373894fd97e05267c9a..6e22b66a417e7837cf4986f0d082b6f9884ef826
@@@ -42,7 -42,8 +42,8 @@@ defmodule Pleroma.Factory d
        user
        | ap_id: User.ap_id(user),
          follower_address: User.ap_followers(user),
-         following_address: User.ap_following(user)
+         following_address: User.ap_following(user),
+         raw_bio: user.bio
      }
    end
  
      }
    end
  
 -  def config_factory do
 +  def config_factory(attrs \\ %{}) do
      %Pleroma.ConfigDB{
 -      key:
 -        sequence(:key, fn key ->
 -          # Atom dynamic registration hack in tests
 -          "some_key_#{key}"
 -          |> String.to_atom()
 -          |> inspect()
 -        end),
 -      group: ":pleroma",
 +      key: sequence(:key, &String.to_atom("some_key_#{&1}")),
 +      group: :pleroma,
        value:
          sequence(
            :value,
 -          fn key ->
 -            :erlang.term_to_binary(%{another_key: "#{key}somevalue", another: "#{key}somevalue"})
 -          end
 +          &%{another_key: "#{&1}somevalue", another: "#{&1}somevalue"}
          )
      }
 +    |> merge_attributes(attrs)
    end
  
    def marker_factory do
index 044f088a42f1ddb88a7ebf2df45d1654438e8d24,7ac70dc582b105827d33ba62d474ebac7f744da5..80b1f734c041da92081c3f120fac8ab0911a5ef3
@@@ -33,7 -33,8 +33,8 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
          bio:
            "<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f '&<>\"",
          inserted_at: ~N[2017-08-15 15:47:06.597036],
-         emoji: %{"karjalanpiirakka" => "/file.png"}
+         emoji: %{"karjalanpiirakka" => "/file.png"},
+         raw_bio: "valid html. a\nb\nc\nd\nf '&<>\""
        })
  
      expected = %{
@@@ -72,7 -73,6 +73,7 @@@
          fields: []
        },
        pleroma: %{
 +        ap_id: user.ap_id,
          background_image: "https://example.com/images/asuka_hospital.png",
          confirmation_pending: false,
          tags: [],
          fields: []
        },
        pleroma: %{
 +        ap_id: user.ap_id,
          background_image: nil,
          confirmation_pending: false,
          tags: [],