X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Factivity_pub%2Fviews%2Fuser_view.ex;h=0b1d5a9fa59461277fac543ee1c8bbd35cab4975;hb=38361e7b5e24cbbd4654bd76fce4b3c66562ab59;hp=b3b02c4fba230a989288fc2deac55006ff8b65b9;hpb=52200998c997576c9008cbe50b0a7b9f0e6134cc;p=akkoma diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index b3b02c4fb..0b1d5a9fa 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -1,28 +1,21 @@ defmodule Pleroma.Web.ActivityPub.UserView do use Pleroma.Web, :view alias Pleroma.Web.Salmon + alias Pleroma.Web.WebFinger alias Pleroma.User + alias Pleroma.Repo + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.ActivityPub.Utils + import Ecto.Query def render("user.json", %{user: user}) do + {:ok, user} = WebFinger.ensure_keys_present(user) {:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"]) - public_key = :public_key.pem_entry_encode(:RSAPublicKey, public_key) + public_key = :public_key.pem_entry_encode(:SubjectPublicKeyInfo, public_key) public_key = :public_key.pem_encode([public_key]) + %{ - "@context" => [ - "https://www.w3.org/ns/activitystreams", - "https://w3id.org/security/v1", - %{ - "manuallyApprovesFollowers" => "as:manuallyApprovesFollowers", - "sensitive" => "as:sensitive", - "Hashtag" => "as:Hashtag", - "ostatus" => "http://ostatus.org#", - "atomUri" => "ostatus:atomUri", - "inReplyToAtomUri" => "ostatus:inReplyToAtomUri", - "conversation" => "ostatus:conversation", - "toot" => "http://joinmastodon.org/ns#", - "Emoji" => "toot:Emoji" - } - ], "id" => user.ap_id, "type" => "Person", "following" => "#{user.ap_id}/following", @@ -33,19 +26,138 @@ defmodule Pleroma.Web.ActivityPub.UserView do "name" => user.name, "summary" => user.bio, "url" => user.ap_id, - "manuallyApprovesFollowers" => false, + "manuallyApprovesFollowers" => user.info["locked"] || false, "publicKey" => %{ "id" => "#{user.ap_id}#main-key", "owner" => user.ap_id, "publicKeyPem" => public_key }, "endpoints" => %{ - "sharedInbox" => "#{Pleroma.Web.Endpoint.url}/inbox" + "sharedInbox" => "#{Pleroma.Web.Endpoint.url()}/inbox" }, "icon" => %{ "type" => "Image", "url" => User.avatar_url(user) + }, + "image" => %{ + "type" => "Image", + "url" => User.banner_url(user) + } + } + |> Map.merge(Utils.make_json_ld_header()) + end + + def render("following.json", %{user: user, page: page}) do + query = User.get_friends_query(user) + query = from(user in query, select: [:ap_id]) + following = Repo.all(query) + + collection(following, "#{user.ap_id}/following", page) + |> Map.merge(Utils.make_json_ld_header()) + end + + def render("following.json", %{user: user}) do + query = User.get_friends_query(user) + query = from(user in query, select: [:ap_id]) + following = Repo.all(query) + + %{ + "id" => "#{user.ap_id}/following", + "type" => "OrderedCollection", + "totalItems" => length(following), + "first" => collection(following, "#{user.ap_id}/following", 1) + } + |> Map.merge(Utils.make_json_ld_header()) + end + + def render("followers.json", %{user: user, page: page}) do + query = User.get_followers_query(user) + query = from(user in query, select: [:ap_id]) + followers = Repo.all(query) + + collection(followers, "#{user.ap_id}/followers", page) + |> Map.merge(Utils.make_json_ld_header()) + end + + def render("followers.json", %{user: user}) do + query = User.get_followers_query(user) + query = from(user in query, select: [:ap_id]) + followers = Repo.all(query) + + %{ + "id" => "#{user.ap_id}/followers", + "type" => "OrderedCollection", + "totalItems" => length(followers), + "first" => collection(followers, "#{user.ap_id}/followers", 1) + } + |> Map.merge(Utils.make_json_ld_header()) + end + + def render("outbox.json", %{user: user, max_id: max_qid}) do + # XXX: technically note_count is wrong for this, but it's better than nothing + info = User.user_info(user) + + params = %{ + "limit" => "10" + } + + params = + if max_qid != nil do + Map.put(params, "max_id", max_qid) + else + params + end + + activities = ActivityPub.fetch_user_activities(user, nil, params) + min_id = Enum.at(Enum.reverse(activities), 0).id + max_id = Enum.at(activities, 0).id + + collection = + Enum.map(activities, fn act -> + {:ok, data} = Transmogrifier.prepare_outgoing(act.data) + data + end) + + iri = "#{user.ap_id}/outbox" + + page = %{ + "id" => "#{iri}?max_id=#{max_id}", + "type" => "OrderedCollectionPage", + "partOf" => iri, + "totalItems" => info.note_count, + "orderedItems" => collection, + "next" => "#{iri}?max_id=#{min_id - 1}" + } + + if max_qid == nil do + %{ + "id" => iri, + "type" => "OrderedCollection", + "totalItems" => info.note_count, + "first" => page } + |> Map.merge(Utils.make_json_ld_header()) + else + page |> Map.merge(Utils.make_json_ld_header()) + end + end + + def collection(collection, iri, page, total \\ nil) do + offset = (page - 1) * 10 + items = Enum.slice(collection, offset, 10) + items = Enum.map(items, fn user -> user.ap_id end) + total = total || length(collection) + + map = %{ + "id" => "#{iri}?page=#{page}", + "type" => "OrderedCollectionPage", + "partOf" => iri, + "totalItems" => total, + "orderedItems" => items } + + if offset < total do + Map.put(map, "next", "#{iri}?page=#{page + 1}") + end end end