diff options
| author | kaniini <nenolod@gmail.com> | 2019-01-07 17:09:52 +0000 | 
|---|---|---|
| committer | kaniini <nenolod@gmail.com> | 2019-01-07 17:09:52 +0000 | 
| commit | 74e109373238c3c915bdf23b364aedd0ca0f6970 (patch) | |
| tree | 0c34f8d887b3c20b1f92b538b48eeca31732bf5f | |
| parent | b640cf0ce09f2c3f81ad8f74a4a536be34605c49 (diff) | |
| parent | 7382adf407301945e30ee38aa4efe28a819fcf44 (diff) | |
| download | pleroma-74e109373238c3c915bdf23b364aedd0ca0f6970.tar.gz pleroma-74e109373238c3c915bdf23b364aedd0ca0f6970.zip  | |
Merge branch 'resilient-user-view' into 'develop'
Make TwAPI UserView more resilient to issues.
See merge request pleroma/pleroma!634
| -rw-r--r-- | lib/pleroma/user.ex | 9 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/views/activity_view.ex | 16 | ||||
| -rw-r--r-- | test/web/twitter_api/views/activity_view_test.exs | 28 | 
3 files changed, 52 insertions, 1 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 0e5e2d943..85d0f9fce 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -367,6 +367,15 @@ defmodule Pleroma.User do      Repo.get_by(User, ap_id: ap_id)    end +  # This is mostly an SPC migration fix. This guesses the user nickname (by taking the last part of the ap_id and the domain) and tries to get that user +  def get_by_guessed_nickname(ap_id) do +    domain = URI.parse(ap_id).host +    name = List.last(String.split(ap_id, "/")) +    nickname = "#{name}@#{domain}" + +    get_by_nickname(nickname) +  end +    def update_and_set_cache(changeset) do      with {:ok, user} <- Repo.update(changeset) do        Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user) diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index ad0cc76ed..0bae3d06f 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -94,11 +94,25 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do        ap_id == "https://www.w3.org/ns/activitystreams#Public" ->          nil +      user = User.get_cached_by_ap_id(ap_id) -> +        user + +      user = User.get_by_guessed_nickname(ap_id) -> +        user +        true -> -        User.get_cached_by_ap_id(ap_id) +        error_user()      end    end +  defp error_user do +    %User{ +      info: %User.Info{}, +      nickname: "erroruser@example.com", +      inserted_at: NaiveDateTime.utc_now() +    } +  end +    def render("index.json", opts) do      context_ids = collect_context_ids(opts.activities)      users = collect_users(opts.activities) diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs index 05780a54a..7f003c214 100644 --- a/test/web/twitter_api/views/activity_view_test.exs +++ b/test/web/twitter_api/views/activity_view_test.exs @@ -25,6 +25,34 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do    import Mock +  test "returns an error user for activities missing users" do +    user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + +    Repo.delete(user) +    Cachex.clear(:user_cache) + +    result = ActivityView.render("activity.json", activity: activity) +    assert result +  end + +  test "tries to get a user by nickname if fetching by ap_id doesn't work" do +    user = insert(:user) + +    {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"}) + +    {:ok, user} = +      user +      |> Ecto.Changeset.change(%{ap_id: "#{user.ap_id}/extension/#{user.nickname}"}) +      |> Repo.update() + +    Cachex.clear(:user_cache) + +    result = ActivityView.render("activity.json", activity: activity) +    assert result["user"]["id"] == user.id +  end +    test "a create activity with a html status" do      text = """      #Bike log - Commute Tuesday\nhttps://pla.bike/posts/20181211/\n#cycling #CHScycling #commute\nMVIMG_20181211_054020.jpg  | 
