Feature/activitypub See merge request pleroma/pleroma!67stable
commit
460062f2b0
@ -0,0 +1,25 @@
|
|||||||
|
defmodule Mix.Tasks.FixApUsers do
|
||||||
|
use Mix.Task
|
||||||
|
import Mix.Ecto
|
||||||
|
import Ecto.Query
|
||||||
|
alias Pleroma.{Repo, User}
|
||||||
|
|
||||||
|
@shortdoc "Grab all ap users again"
|
||||||
|
def run([]) do
|
||||||
|
Mix.Task.run("app.start")
|
||||||
|
|
||||||
|
q = from u in User,
|
||||||
|
where: fragment("? @> ?", u.info, ^%{"ap_enabled" => true}),
|
||||||
|
where: u.local == false
|
||||||
|
users = Repo.all(q)
|
||||||
|
|
||||||
|
Enum.each(users, fn(user) ->
|
||||||
|
try do
|
||||||
|
IO.puts("Fetching #{user.nickname}")
|
||||||
|
Pleroma.Web.ActivityPub.Transmogrifier.upgrade_user_from_ap_id(user.ap_id, false)
|
||||||
|
rescue
|
||||||
|
e -> IO.inspect(e)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,27 @@
|
|||||||
|
defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do
|
||||||
|
alias Pleroma.Web.HTTPSignatures
|
||||||
|
import Plug.Conn
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{valid_signature: true}} = conn, opts) do
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, opts) do
|
||||||
|
user = conn.params["actor"]
|
||||||
|
Logger.debug("Checking sig for #{user}")
|
||||||
|
if get_req_header(conn, "signature") do
|
||||||
|
conn = conn
|
||||||
|
|> put_req_header("(request-target)", String.downcase("#{conn.method}") <> " #{conn.request_path}")
|
||||||
|
|
||||||
|
assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn))
|
||||||
|
else
|
||||||
|
Logger.debug("No signature header!")
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,54 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
alias Pleroma.{User, Repo, Object, Activity}
|
||||||
|
alias Pleroma.Web.ActivityPub.{ObjectView, UserView, Transmogrifier}
|
||||||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
alias Pleroma.Web.Federator
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
action_fallback :errors
|
||||||
|
|
||||||
|
def user(conn, %{"nickname" => nickname}) do
|
||||||
|
with %User{} = user <- User.get_cached_by_nickname(nickname),
|
||||||
|
{:ok, user} <- Pleroma.Web.WebFinger.ensure_keys_present(user) do
|
||||||
|
conn
|
||||||
|
|> put_resp_header("content-type", "application/activity+json")
|
||||||
|
|> json(UserView.render("user.json", %{user: user}))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def object(conn, %{"uuid" => uuid}) do
|
||||||
|
with ap_id <- o_status_url(conn, :object, uuid),
|
||||||
|
%Object{} = object <- Object.get_cached_by_ap_id(ap_id) do
|
||||||
|
conn
|
||||||
|
|> put_resp_header("content-type", "application/activity+json")
|
||||||
|
|> json(ObjectView.render("object.json", %{object: object}))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: Ensure that this inbox is a recipient of the message
|
||||||
|
def inbox(%{assigns: %{valid_signature: true}} = conn, params) do
|
||||||
|
Federator.enqueue(:incoming_ap_doc, params)
|
||||||
|
json(conn, "ok")
|
||||||
|
end
|
||||||
|
|
||||||
|
def inbox(conn, params) do
|
||||||
|
headers = Enum.into(conn.req_headers, %{})
|
||||||
|
if !(String.contains?(headers["signature"] || "", params["actor"])) do
|
||||||
|
Logger.info("Signature not from author, relayed message, ignoring.")
|
||||||
|
else
|
||||||
|
Logger.info("Signature error.")
|
||||||
|
Logger.info("Could not validate #{params["actor"]}")
|
||||||
|
Logger.info(inspect(conn.req_headers))
|
||||||
|
end
|
||||||
|
|
||||||
|
json(conn, "ok")
|
||||||
|
end
|
||||||
|
|
||||||
|
def errors(conn, _e) do
|
||||||
|
conn
|
||||||
|
|> put_status(500)
|
||||||
|
|> json("error")
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,298 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
|
@moduledoc """
|
||||||
|
A module to handle coding from internal to wire ActivityPub and back.
|
||||||
|
"""
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Modifies an incoming AP object (mastodon format) to our internal format.
|
||||||
|
"""
|
||||||
|
def fix_object(object) do
|
||||||
|
object
|
||||||
|
|> Map.put("actor", object["attributedTo"])
|
||||||
|
|> fix_attachments
|
||||||
|
|> fix_context
|
||||||
|
|> fix_in_reply_to
|
||||||
|
end
|
||||||
|
|
||||||
|
def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object) when not is_nil(in_reply_to_id) do
|
||||||
|
case ActivityPub.fetch_object_from_id(in_reply_to_id) do
|
||||||
|
{:ok, replied_object} ->
|
||||||
|
activity = Activity.get_create_activity_by_object_ap_id(replied_object.data["id"])
|
||||||
|
object
|
||||||
|
|> Map.put("inReplyTo", replied_object.data["id"])
|
||||||
|
|> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id)
|
||||||
|
|> Map.put("inReplyToStatusId", activity.id)
|
||||||
|
|> Map.put("conversation", replied_object.data["context"] || object["conversation"])
|
||||||
|
|> Map.put("context", replied_object.data["context"] || object["conversation"])
|
||||||
|
e ->
|
||||||
|
Logger.error("Couldn't fetch #{object["inReplyTo"]} #{inspect(e)}")
|
||||||
|
object
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def fix_in_reply_to(object), do: object
|
||||||
|
|
||||||
|
def fix_context(object) do
|
||||||
|
object
|
||||||
|
|> Map.put("context", object["conversation"])
|
||||||
|
end
|
||||||
|
|
||||||
|
def fix_attachments(object) do
|
||||||
|
attachments = (object["attachment"] || [])
|
||||||
|
|> Enum.map(fn (data) ->
|
||||||
|
url = [%{"type" => "Link", "mediaType" => data["mediaType"], "href" => data["url"]}]
|
||||||
|
Map.put(data, "url", url)
|
||||||
|
end)
|
||||||
|
|
||||||
|
object
|
||||||
|
|> Map.put("attachment", attachments)
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: validate those with a Ecto scheme
|
||||||
|
# - tags
|
||||||
|
# - emoji
|
||||||
|
def handle_incoming(%{"type" => "Create", "object" => %{"type" => "Note"} = object} = data) do
|
||||||
|
with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]),
|
||||||
|
%User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do
|
||||||
|
object = fix_object(data["object"])
|
||||||
|
|
||||||
|
params = %{
|
||||||
|
to: data["to"],
|
||||||
|
object: object,
|
||||||
|
actor: user,
|
||||||
|
context: object["conversation"],
|
||||||
|
local: false,
|
||||||
|
published: data["published"],
|
||||||
|
additional: Map.take(data, [
|
||||||
|
"cc",
|
||||||
|
"id"
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ActivityPub.create(params)
|
||||||
|
else
|
||||||
|
%Activity{} = activity -> {:ok, activity}
|
||||||
|
_e -> :error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_incoming(%{"type" => "Follow", "object" => followed, "actor" => follower, "id" => id} = data) do
|
||||||
|
with %User{local: true} = followed <- User.get_cached_by_ap_id(followed),
|
||||||
|
%User{} = follower <- User.get_or_fetch_by_ap_id(follower),
|
||||||
|
{:ok, activity} <- ActivityPub.follow(follower, followed, id, false) do
|
||||||
|
ActivityPub.accept(%{to: [follower.ap_id], actor: followed.ap_id, object: data, local: true})
|
||||||
|
User.follow(follower, followed)
|
||||||
|
{:ok, activity}
|
||||||
|
else
|
||||||
|
_e -> :error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_incoming(%{"type" => "Like", "object" => object_id, "actor" => actor, "id" => id} = data) do
|
||||||
|
with %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
|
||||||
|
{:ok, object} <- get_obj_helper(object_id) || ActivityPub.fetch_object_from_id(object_id),
|
||||||
|
{:ok, activity, object} <- ActivityPub.like(actor, object, id, false) do
|
||||||
|
{:ok, activity}
|
||||||
|
else
|
||||||
|
_e -> :error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_incoming(%{"type" => "Announce", "object" => object_id, "actor" => actor, "id" => id} = data) do
|
||||||
|
with %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
|
||||||
|
{:ok, object} <- get_obj_helper(object_id) || ActivityPub.fetch_object_from_id(object_id),
|
||||||
|
{:ok, activity, object} <- ActivityPub.announce(actor, object, id, false) do
|
||||||
|
{:ok, activity}
|
||||||
|
else
|
||||||
|
_e -> :error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_incoming(%{"type" => "Update", "object" => %{"type" => "Person"} = object, "actor" => actor_id} = data) do
|
||||||
|
with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
|
||||||
|
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
|
||||||
|
|
||||||
|
banner = new_user_data[:info]["banner"]
|
||||||
|
update_data = new_user_data
|
||||||
|
|> Map.take([:name, :bio, :avatar])
|
||||||
|
|> Map.put(:info, Map.merge(actor.info, %{"banner" => banner}))
|
||||||
|
|
||||||
|
actor
|
||||||
|
|> User.upgrade_changeset(update_data)
|
||||||
|
|> User.update_and_set_cache()
|
||||||
|
|
||||||
|
ActivityPub.update(%{local: false, to: data["to"] || [], cc: data["cc"] || [], object: object, actor: actor_id})
|
||||||
|
else
|
||||||
|
e ->
|
||||||
|
Logger.error(e)
|
||||||
|
:error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: Make secure.
|
||||||
|
def handle_incoming(%{"type" => "Delete", "object" => object_id, "actor" => actor, "id" => id} = data) do
|
||||||
|
object_id = case object_id do
|
||||||
|
%{"id" => id} -> id
|
||||||
|
id -> id
|
||||||
|
end
|
||||||
|
with %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
|
||||||
|
{:ok, object} <- get_obj_helper(object_id) || ActivityPub.fetch_object_from_id(object_id),
|
||||||
|
{:ok, activity} <- ActivityPub.delete(object, false) do
|
||||||
|
{:ok, activity}
|
||||||
|
else
|
||||||
|
e -> :error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# Accept
|
||||||
|
# Undo
|
||||||
|
|
||||||
|
def handle_incoming(_), do: :error
|
||||||
|
|
||||||
|
def get_obj_helper(id) do
|
||||||
|
if object = Object.get_by_ap_id(id), do: {:ok, object}, else: nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_object(object) do
|
||||||
|
object
|
||||||
|
|> set_sensitive
|
||||||
|
|> add_hashtags
|
||||||
|
|> add_mention_tags
|
||||||
|
|> add_attributed_to
|
||||||
|
|> prepare_attachments
|
||||||
|
|> set_conversation
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc
|
||||||
|
"""
|
||||||
|
internal -> Mastodon
|
||||||
|
"""
|
||||||
|
def prepare_outgoing(%{"type" => "Create", "object" => %{"type" => "Note"} = object} = data) do
|
||||||
|
object = object
|
||||||
|
|> prepare_object
|
||||||
|
data = data
|
||||||
|
|> Map.put("object", object)
|
||||||
|
|> Map.put("@context", "https://www.w3.org/ns/activitystreams")
|
||||||
|
|
||||||
|
{:ok, data}
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_outgoing(%{"type" => type} = data) do
|
||||||
|
data = data
|
||||||
|
|> Map.put("@context", "https://www.w3.org/ns/activitystreams")
|
||||||
|
|
||||||
|
{:ok, data}
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_hashtags(object) do
|
||||||
|
tags = (object["tag"] || [])
|
||||||
|
|> Enum.map fn (tag) -> %{"href" => Pleroma.Web.Endpoint.url() <> "/tags/#{tag}", "name" => "##{tag}", "type" => "Hashtag"} end
|
||||||
|
|
||||||
|
object
|
||||||
|
|> Map.put("tag", tags)
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_mention_tags(object) do
|
||||||
|
recipients = object["to"] ++ (object["cc"] || [])
|
||||||
|
mentions = recipients
|
||||||
|
|> Enum.map(fn (ap_id) -> User.get_cached_by_ap_id(ap_id) end)
|
||||||
|
|> Enum.filter(&(&1))
|
||||||
|
|> Enum.map(fn(user) -> %{"type" => "Mention", "href" => user.ap_id, "name" => "@#{user.nickname}"} end)
|
||||||
|
|
||||||
|
tags = object["tag"] || []
|
||||||
|
|
||||||
|
object
|
||||||
|
|> Map.put("tag", tags ++ mentions)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_conversation(object) do
|
||||||
|
Map.put(object, "conversation", object["context"])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_sensitive(object) do
|
||||||
|
tags = object["tag"] || []
|
||||||
|
Map.put(object, "sensitive", "nsfw" in tags)
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_attributed_to(object) do
|
||||||
|
attributedTo = object["attributedTo"] || object["actor"]
|
||||||
|
|
||||||
|
object
|
||||||
|
|> Map.put("attributedTo", attributedTo)
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_attachments(object) do
|
||||||
|
attachments = (object["attachment"] || [])
|
||||||
|
|> Enum.map(fn (data) ->
|
||||||
|
[%{"mediaType" => media_type, "href" => href} | _] = data["url"]
|
||||||
|
%{"url" => href, "mediaType" => media_type, "name" => data["name"], "type" => "Document"}
|
||||||
|
end)
|
||||||
|
|
||||||
|
object
|
||||||
|
|> Map.put("attachment", attachments)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp user_upgrade_task(user) do
|
||||||
|
old_follower_address = User.ap_followers(user)
|
||||||
|
q = from u in User,
|
||||||
|
where: ^old_follower_address in u.following,
|
||||||
|
update: [set: [following: fragment("array_replace(?,?,?)", u.following, ^old_follower_address, ^user.follower_address)]]
|
||||||
|
Repo.update_all(q, [])
|
||||||
|
|
||||||
|
maybe_retire_websub(user.ap_id)
|
||||||
|
|
||||||
|
# Only do this for recent activties, don't go through the whole db.
|
||||||
|
since = (Repo.aggregate(Activity, :max, :id) || 0) - 100_000
|
||||||
|
q = from a in Activity,
|
||||||
|
where: ^old_follower_address in a.recipients,
|
||||||
|
where: a.id > ^since,
|
||||||
|
update: [set: [recipients: fragment("array_replace(?,?,?)", a.recipients, ^old_follower_address, ^user.follower_address)]]
|
||||||
|
Repo.update_all(q, [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def upgrade_user_from_ap_id(ap_id, async \\ true) do
|
||||||
|
with %User{local: false} = user <- User.get_by_ap_id(ap_id),
|
||||||
|
{:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id) do
|
||||||
|
data = data
|
||||||
|
|> Map.put(:info, Map.merge(user.info, data[:info]))
|
||||||
|
|
||||||
|
already_ap = User.ap_enabled?(user)
|
||||||
|
{:ok, user} = User.upgrade_changeset(user, data)
|
||||||
|
|> Repo.update()
|
||||||
|
|
||||||
|
if !already_ap do
|
||||||
|
# This could potentially take a long time, do it in the background
|
||||||
|
if async do
|
||||||
|
Task.start(fn ->
|
||||||
|
user_upgrade_task(user)
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
user_upgrade_task(user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
{:ok, user}
|
||||||
|
else
|
||||||
|
e -> e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def maybe_retire_websub(ap_id) do
|
||||||
|
# some sanity checks
|
||||||
|
if is_binary(ap_id) && (String.length(ap_id) > 8) do
|
||||||
|
q = from ws in Pleroma.Web.Websub.WebsubClientSubscription,
|
||||||
|
where: fragment("? like ?", ws.topic, ^"#{ap_id}%")
|
||||||
|
Repo.delete_all(q)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,27 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.ObjectView do
|
||||||
|
use Pleroma.Web, :view
|
||||||
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
||||||
|
|
||||||
|
def render("object.json", %{object: object}) do
|
||||||
|
base = %{
|
||||||
|
"@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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
additional = Transmogrifier.prepare_object(object.data)
|
||||||
|
Map.merge(base, additional)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,57 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.UserView do
|
||||||
|
use Pleroma.Web, :view
|
||||||
|
alias Pleroma.Web.Salmon
|
||||||
|
alias Pleroma.Web.WebFinger
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
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_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",
|
||||||
|
"followers" => "#{user.ap_id}/followers",
|
||||||
|
"inbox" => "#{user.ap_id}/inbox",
|
||||||
|
"outbox" => "#{user.ap_id}/outbox",
|
||||||
|
"preferredUsername" => user.nickname,
|
||||||
|
"name" => user.name,
|
||||||
|
"summary" => user.bio,
|
||||||
|
"url" => user.ap_id,
|
||||||
|
"manuallyApprovesFollowers" => false,
|
||||||
|
"publicKey" => %{
|
||||||
|
"id" => "#{user.ap_id}#main-key",
|
||||||
|
"owner" => user.ap_id,
|
||||||
|
"publicKeyPem" => public_key
|
||||||
|
},
|
||||||
|
"endpoints" => %{
|
||||||
|
"sharedInbox" => "#{Pleroma.Web.Endpoint.url}/inbox"
|
||||||
|
},
|
||||||
|
"icon" => %{
|
||||||
|
"type" => "Image",
|
||||||
|
"url" => User.avatar_url(user)
|
||||||
|
},
|
||||||
|
"image" => %{
|
||||||
|
"type" => "Image",
|
||||||
|
"url" => User.banner_url(user)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,79 @@
|
|||||||
|
# https://tools.ietf.org/html/draft-cavage-http-signatures-08
|
||||||
|
defmodule Pleroma.Web.HTTPSignatures do
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
def split_signature(sig) do
|
||||||
|
default = %{"headers" => "date"}
|
||||||
|
|
||||||
|
sig = sig
|
||||||
|
|> String.trim()
|
||||||
|
|> String.split(",")
|
||||||
|
|> Enum.reduce(default, fn(part, acc) ->
|
||||||
|
[key | rest] = String.split(part, "=")
|
||||||
|
value = Enum.join(rest, "=")
|
||||||
|
Map.put(acc, key, String.trim(value, "\""))
|
||||||
|
end)
|
||||||
|
|
||||||
|
Map.put(sig, "headers", String.split(sig["headers"], ~r/\s/))
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate(headers, signature, public_key) do
|
||||||
|
sigstring = build_signing_string(headers, signature["headers"])
|
||||||
|
{:ok, sig} = Base.decode64(signature["signature"])
|
||||||
|
:public_key.verify(sigstring, :sha256, sig, public_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_conn(conn) do
|
||||||
|
# TODO: How to get the right key and see if it is actually valid for that request.
|
||||||
|
# For now, fetch the key for the actor.
|
||||||
|
with actor_id <- conn.params["actor"],
|
||||||
|
{:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do
|
||||||
|
if validate_conn(conn, public_key) do
|
||||||
|
true
|
||||||
|
else
|
||||||
|
Logger.debug("Could not validate, re-fetching user and trying one more time.")
|
||||||
|
# Fetch user anew and try one more time
|
||||||
|
with actor_id <- conn.params["actor"],
|
||||||
|
{:ok, _user} <- ActivityPub.make_user_from_ap_id(actor_id),
|
||||||
|
{:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do
|
||||||
|
validate_conn(conn, public_key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
e ->
|
||||||
|
Logger.debug("Could not public key!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_conn(conn, public_key) do
|
||||||
|
headers = Enum.into(conn.req_headers, %{})
|
||||||
|
signature = split_signature(headers["signature"])
|
||||||
|
validate(headers, signature, public_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_signing_string(headers, used_headers) do
|
||||||
|
used_headers
|
||||||
|
|> Enum.map(fn (header) -> "#{header}: #{headers[header]}" end)
|
||||||
|
|> Enum.join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
def sign(user, headers) do
|
||||||
|
with {:ok, %{info: %{"keys" => keys}}} <- Pleroma.Web.WebFinger.ensure_keys_present(user),
|
||||||
|
{:ok, private_key, _} = Pleroma.Web.Salmon.keys_from_pem(keys) do
|
||||||
|
sigstring = build_signing_string(headers, Map.keys(headers))
|
||||||
|
signature = :public_key.sign(sigstring, :sha256, private_key)
|
||||||
|
|> Base.encode64()
|
||||||
|
|
||||||
|
[
|
||||||
|
keyId: user.ap_id <> "#main-key",
|
||||||
|
algorithm: "rsa-sha256",
|
||||||
|
headers: Map.keys(headers) |> Enum.join(" "),
|
||||||
|
signature: signature
|
||||||
|
]
|
||||||
|
|> Enum.map(fn({k, v}) -> "#{k}=\"#{v}\"" end)
|
||||||
|
|> Enum.join(",")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
defmodule Pleroma.Repo.Migrations.AddRecipientsToActivities do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:activities) do
|
||||||
|
add :recipients, {:array, :string}
|
||||||
|
end
|
||||||
|
|
||||||
|
create index(:activities, [:recipients], using: :gin)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,21 @@
|
|||||||
|
defmodule Pleroma.Repo.Migrations.FillRecipientsInActivities do
|
||||||
|
use Ecto.Migration
|
||||||
|
alias Pleroma.{Repo, Activity}
|
||||||
|
|
||||||
|
def up do
|
||||||
|
max = Repo.aggregate(Activity, :max, :id)
|
||||||
|
if max do
|
||||||
|
IO.puts("#{max} activities")
|
||||||
|
chunks = 0..(round(max / 10_000))
|
||||||
|
|
||||||
|
Enum.each(chunks, fn (i) ->
|
||||||
|
min = i * 10_000
|
||||||
|
max = min + 10_000
|
||||||
|
execute("""
|
||||||
|
update activities set recipients = array(select jsonb_array_elements_text(data->'to')) where id > #{min} and id <= #{max};
|
||||||
|
""")
|
||||||
|
|> IO.inspect
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,18 @@
|
|||||||
|
defmodule Pleroma.Repo.Migrations.MakeFollowingPostgresArray do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:users) do
|
||||||
|
add :following_temp, {:array, :string}
|
||||||
|
end
|
||||||
|
|
||||||
|
execute """
|
||||||
|
update users set following_temp = array(select jsonb_array_elements_text(following));
|
||||||
|
"""
|
||||||
|
|
||||||
|
alter table(:users) do
|
||||||
|
remove :following
|
||||||
|
end
|
||||||
|
rename table(:users), :following_temp, to: :following
|
||||||
|
end
|
||||||
|
end
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<entry 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:georss="http://www.georss.org/georss" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:statusnet="http://status.net/schema/api/1/">
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-22:noticeId=7369654:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://testing.pleroma.lol/users/lain" class="h-card mention" title="Rael Electric Razor">lain</a> me far right</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7369654"/>
|
||||||
|
<status_net notice_id="7369654"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-22T09:20:12+00:00</published>
|
||||||
|
<updated>2018-02-22T09:20:12+00:00</updated>
|
||||||
|
<author>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
|
||||||
|
<uri>https://shitposter.club/user/5381</uri>
|
||||||
|
<name>shpuld</name>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/shpuld"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="864" media:height="864" href="https://shitposter.club/avatar/5381-original-20171230093854.png"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://shitposter.club/avatar/5381-96-20171230093854.png"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://shitposter.club/avatar/5381-48-20171230093854.png"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://shitposter.club/avatar/5381-24-20171230093900.png"/>
|
||||||
|
<poco:preferredUsername>shpuld</poco:preferredUsername>
|
||||||
|
<poco:displayName>shp</poco:displayName>
|
||||||
|
<followers url="https://shitposter.club/shpuld/subscribers"></followers>
|
||||||
|
<statusnet:profile_info local_id="5381"></statusnet:profile_info>
|
||||||
|
</author>
|
||||||
|
<thr:in-reply-to ref="https://testing.pleroma.lol/objects/b319022a-4946-44c5-9de9-34801f95507b" href="https://testing.pleroma.lol/objects/b319022a-4946-44c5-9de9-34801f95507b"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://testing.pleroma.lol/objects/b319022a-4946-44c5-9de9-34801f95507b"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4378601"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4378601" local_id="4378601" ref="tag:shitposter.club,2018-02-22:objectType=thread:nonce=e5a7c72d60a9c0e4">tag:shitposter.club,2018-02-22:objectType=thread:nonce=e5a7c72d60a9c0e4</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://testing.pleroma.lol/users/lain"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<source>
|
||||||
|
<id>https://shitposter.club/api/statuses/user_timeline/5381.atom</id>
|
||||||
|
<title>shp</title>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/shpuld"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/user_timeline/5381.atom"/>
|
||||||
|
<link rel="license" href="https://shitposter.club/doc/tos"/>
|
||||||
|
<icon>https://shitposter.club/avatar/5381-96-20171230093854.png</icon>
|
||||||
|
<updated>2018-02-23T13:30:15+00:00</updated>
|
||||||
|
</source>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7369654.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7369654.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7369654" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
@ -0,0 +1 @@
|
|||||||
|
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","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":"http://mastodon.example.org/users/admin","type":"Person","following":"http://mastodon.example.org/users/admin/following","followers":"http://mastodon.example.org/users/admin/followers","inbox":"http://mastodon.example.org/users/admin/inbox","outbox":"http://mastodon.example.org/users/admin/outbox","preferredUsername":"admin","name":null,"summary":"\u003cp\u003e\u003c/p\u003e","url":"http://mastodon.example.org/@admin","manuallyApprovesFollowers":false,"publicKey":{"id":"http://mastodon.example.org/users/admin#main-key","owner":"http://mastodon.example.org/users/admin","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc4Tir+3ADhSNF6VKrtW\nOU32T01w7V0yshmQei38YyiVwVvFu8XOP6ACchkdxbJ+C9mZud8qWaRJKVbFTMUG\nNX4+6Q+FobyuKrwN7CEwhDALZtaN2IPbaPd6uG1B7QhWorrY+yFa8f2TBM3BxnUy\nI4T+bMIZIEYG7KtljCBoQXuTQmGtuffO0UwJksidg2ffCF5Q+K//JfQagJ3UzrR+\nZXbKMJdAw4bCVJYs4Z5EhHYBwQWiXCyMGTd7BGlmMkY6Av7ZqHKC/owp3/0EWDNz\nNqF09Wcpr3y3e8nA10X40MJqp/wR+1xtxp+YGbq/Cj5hZGBG7etFOmIpVBrDOhry\nBwIDAQAB\n-----END PUBLIC KEY-----\n"},"endpoints":{"sharedInbox":"http://mastodon.example.org/inbox"},"icon":{"type":"Image","mediaType":"image/jpeg","url":"https://cdn.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"},"image":{"type":"Image","mediaType":"image/png","url":"https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}}
|
@ -0,0 +1 @@
|
|||||||
|
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","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":"https://masto.quad.moe/users/_HellPie","type":"Person","following":"https://masto.quad.moe/users/_HellPie/following","followers":"https://masto.quad.moe/users/_HellPie/followers","inbox":"https://masto.quad.moe/users/_HellPie/inbox","outbox":"https://masto.quad.moe/users/_HellPie/outbox","preferredUsername":"_HellPie","name":"_HellPie","summary":"\u003cp\u003eAndroid (Java) Developer, Linux addict. Often an asshole. Usually mentally ill, sometimes just retarded.\u003c/p\u003e\u003cp\u003eGitHub: \u003ca href=\"https://github.com/HellPie\" rel=\"nofollow noopener\" target=\"_blank\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"\"\u003egithub.com/HellPie\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e","url":"https://masto.quad.moe/@_HellPie","manuallyApprovesFollowers":false,"publicKey":{"id":"https://masto.quad.moe/users/_HellPie#main-key","owner":"https://masto.quad.moe/users/_HellPie","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1fIReYnqpap6e3sIskIx\ni7q130EvfkSOTBTBe01w3Xb/7/JwzWgkmSp+sK5s/ImO2oZb3ljmKZ3iTg4ETtVa\nCrT98/5p4Hlw/Oozb0kTx+tUazrucr023u8lTmn5sVgksKue59gPzKEuJJT1Te7H\nPJg2frz4QZWEY9nuygJoDaWgLvq1aa4oRfctlpo2C4d4oKRZFx2wtgeGVpahsikX\nKFBWuvEMFL2LUWb44BkvN6bTmXL9ryQY2oRsWn0yZHnTvFItq4vkFSNNe6sK13pM\nOHu1rVJrKg2hNVpBowds9YqZM8zP9F0GS7SEARbwPRCaAGLJGNwLjfJolJ/231eU\nKQIDAQAB\n-----END PUBLIC KEY-----\n"},"endpoints":{"sharedInbox":"https://masto.quad.moe/inbox"},"icon":{"type":"Image","mediaType":"image/png","url":"https://masto.quad.moe/system/accounts/avatars/000/012/255/original/39b907e6b169191d.png"},"image":{"type":"Image","mediaType":"image/png","url":"https://masto.quad.moe/system/accounts/headers/000/012/255/original/8d3ace0025bdda431e07230668303945.png"}}
|
@ -0,0 +1 @@
|
|||||||
|
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","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":"https://mstdn.io/users/mayuutann","type":"Person","following":"https://mstdn.io/users/mayuutann/following","followers":"https://mstdn.io/users/mayuutann/followers","inbox":"https://mstdn.io/users/mayuutann/inbox","outbox":"https://mstdn.io/users/mayuutann/outbox","preferredUsername":"mayuutann","name":"Mayutan☕","summary":"\u003cp\u003eI enjoy programming as a hobby.\u003cbr /\u003eJava.Ruby. Practicing English . I love karaoke.\u003cbr /\u003eAichi Japan.\u003cbr /\u003eI\u0026apos;d be glad if you pointed out it when my English is unnatural.\u003c/p\u003e","url":"https://mstdn.io/@mayuutann","manuallyApprovesFollowers":false,"publicKey":{"id":"https://mstdn.io/users/mayuutann#main-key","owner":"https://mstdn.io/users/mayuutann","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz+MncrdPxQ5R99g9m8X\nY6QO1WNOsCj0wXuDmCHJxXfJx5NFYgsYSX3y2UTzoHNcxZIwbSy24HlYR44cEygy\nimiysTk3o0pVquXhFQNDBXJkAkPfY+9O/gz1FTbwEUzFS1m9zmoQUesDjHEBXvpW\nHkNRdVThsDHotiMYjd+WYS09XjCYxhUHcwsnEFZ+55y1Uz6OveY2OZH+jTEluF+s\nLLTDopY37Ogniah0zVm7Q+/WPdbjOullpWh8s/c5fYGl5xMaS950l5r4gkPU7MVE\n4dGSd/v4pUAxlZrhbRHrKMD4c9cmxn9gJuqmW49ZmPzIeG+SaLnad6zh0BN9nveR\njQIDAQAB\n-----END PUBLIC KEY-----\n"},"endpoints":{"sharedInbox":"https://mstdn.io/inbox"},"icon":{"type":"Image","mediaType":"image/jpeg","url":"https://mstdn.io/system/accounts/avatars/000/021/478/original/40fe303d51305ba4.jpg"},"image":{"type":"Image","mediaType":"image/jpeg","url":"https://mstdn.io/system/accounts/headers/000/021/478/original/4e1e9b5e1f350abb.jpg"}}
|
@ -0,0 +1 @@
|
|||||||
|
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","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":"https://mstdn.io/users/mayuutann/statuses/99568293732299394","type":"Note","summary":null,"content":"\u003cp\u003e\u003cspan class=\"h-card\"\u003e\u003ca href=\"https://shitposter.club/shpuld\" class=\"u-url mention\"\u003e@\u003cspan\u003eshpuld\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e \u003cspan class=\"h-card\"\u003e\u003ca href=\"https://testing.pleroma.lol/users/lain\" class=\"u-url mention\"\u003e@\u003cspan\u003elain\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e ポポポォォォ\u003c/p\u003e","inReplyTo":"https://shitposter.club/notice/7369654","published":"2018-02-22T09:26:31Z","url":"https://mstdn.io/@mayuutann/99568293732299394","attributedTo":"https://mstdn.io/users/mayuutann","to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["https://mstdn.io/users/mayuutann/followers","https://testing.pleroma.lol/users/lain","https://shitposter.club/user/5381"],"sensitive":false,"atomUri":"https://mstdn.io/users/mayuutann/statuses/99568293732299394","inReplyToAtomUri":"tag:shitposter.club,2018-02-22:noticeId=7369654:objectType=comment","conversation":"tag:shitposter.club,2018-02-22:objectType=thread:nonce=e5a7c72d60a9c0e4","attachment":[],"tag":[{"type":"Mention","href":"https://testing.pleroma.lol/users/lain","name":"@lain@testing.pleroma.lol"},{"type":"Mention","href":"https://shitposter.club/user/5381","name":"@shpuld@shitposter.club"}]}
|
@ -0,0 +1 @@
|
|||||||
|
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","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":"https://niu.moe/users/rye","type":"Person","following":"https://niu.moe/users/rye/following","followers":"https://niu.moe/users/rye/followers","inbox":"https://niu.moe/users/rye/inbox","outbox":"https://niu.moe/users/rye/outbox","preferredUsername":"rye","name":"♡ rye ♡","summary":"\u003cp\u003elettuce club champion\u003c/p\u003e\u003cp\u003eicon by gomigomipomi\u003c/p\u003e","url":"https://niu.moe/@rye","manuallyApprovesFollowers":false,"publicKey":{"id":"https://niu.moe/users/rye#main-key","owner":"https://niu.moe/users/rye","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA83uRWjCFO35FwfA38mzv\nEL0TUaXB7+2hYvPwNrn1WY6me5DRbqB5zzMrzWMGr0HSooqNqEYBafGsmVTWUqIk\nKM9ehtIBraJI+mT5X7DPR3LrXOJF4a9EEslg8XvAk8MN9IrAhm6UljnvB67RtDcA\nTNB01VWy9yWnxFRtz9o/EMoBPyw5giOaXE2ibVNP8lQIqGKuuBKPzPjSJygdvQ5q\nxfow2z1TpKRqdsNDqn4n6U6zCXYTzkr0J71/tGw7fsgfv78l0Wjrc7EcuBk74OaG\nC65UDiu3X4Q6kxCfCEhPSfuwLN+UZkzxcn6goWR0iYpWs57+4tFKu9nJYP4QJ0K9\nTwIDAQAB\n-----END PUBLIC KEY-----\n"},"endpoints":{"sharedInbox":"https://niu.moe/inbox"},"icon":{"type":"Image","mediaType":"image/jpeg","url":"https://cdn.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"},"image":{"type":"Image","mediaType":"image/png","url":"https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}}
|
@ -0,0 +1,438 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<feed xml:lang="en-US" 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/">
|
||||||
|
<generator uri="https://gnu.io/social" version="1.2.0-beta4">GNU social</generator>
|
||||||
|
<id>https://shitposter.club/api/statuses/user_timeline/5381.atom</id>
|
||||||
|
<title>shpuld timeline</title>
|
||||||
|
<subtitle>Updates from shpuld on Shitposter Club!</subtitle>
|
||||||
|
<logo>https://shitposter.club/avatar/5381-96-20171230093854.png</logo>
|
||||||
|
<updated>2018-02-23T13:42:22+00:00</updated>
|
||||||
|
<author>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
|
||||||
|
<uri>https://shitposter.club/user/5381</uri>
|
||||||
|
<name>shpuld</name>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/shpuld"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="864" media:height="864" href="https://shitposter.club/avatar/5381-original-20171230093854.png"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="96" media:height="96" href="https://shitposter.club/avatar/5381-96-20171230093854.png"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="48" media:height="48" href="https://shitposter.club/avatar/5381-48-20171230093854.png"/>
|
||||||
|
<link rel="avatar" type="image/png" media:width="24" media:height="24" href="https://shitposter.club/avatar/5381-24-20171230093900.png"/>
|
||||||
|
<poco:preferredUsername>shpuld</poco:preferredUsername>
|
||||||
|
<poco:displayName>shp</poco:displayName>
|
||||||
|
<followers url="https://shitposter.club/shpuld/subscribers"></followers>
|
||||||
|
<statusnet:profile_info local_id="5381"></statusnet:profile_info>
|
||||||
|
</author>
|
||||||
|
<link href="https://shitposter.club/shpuld" rel="alternate" type="text/html"/>
|
||||||
|
<link href="https://shitposter.club/main/sup" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
|
||||||
|
<link href="https://shitposter.club/api/statuses/user_timeline/5381.atom?max_id=7387342" rel="next" type="application/atom+xml"/>
|
||||||
|
<link href="https://shitposter.club/main/push/hub" rel="hub"/>
|
||||||
|
<link href="https://shitposter.club/main/salmon/user/5381" rel="salmon"/>
|
||||||
|
<link href="https://shitposter.club/main/salmon/user/5381" rel="http://salmon-protocol.org/ns/salmon-replies"/>
|
||||||
|
<link href="https://shitposter.club/main/salmon/user/5381" rel="http://salmon-protocol.org/ns/salmon-mention"/>
|
||||||
|
<link href="https://shitposter.club/api/statuses/user_timeline/5381.atom" rel="self" type="application/atom+xml"/>
|
||||||
|
<entry>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:fave:5381:comment:7387801:2018-02-23T13:39:40+00:00</id>
|
||||||
|
<title>Favorite</title>
|
||||||
|
<content type="html">shpuld favorited something by mayuutann: <p><span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <a href="https://mstdn.io/media/_Ee-x91XN0udpfZVO_U" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/_Ee-x91XN0udpfZ</span><span class="invisible">VO_U</span></a></p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387804"/>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
|
||||||
|
<published>2018-02-23T13:39:40+00:00</published>
|
||||||
|
<updated>2018-02-23T13:39:40+00:00</updated>
|
||||||
|
<activity:object>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>https://mstdn.io/users/mayuutann/statuses/99574950785668071</id>
|
||||||
|
<title>New comment by mayuutann</title>
|
||||||
|
<content type="html"><p><span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <a href="https://mstdn.io/media/_Ee-x91XN0udpfZVO_U" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/_Ee-x91XN0udpfZ</span><span class="invisible">VO_U</span></a></p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mstdn.io/@mayuutann/99574950785668071"/>
|
||||||
|
<status_net notice_id="7387801"></status_net>
|
||||||
|
</activity:object>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574950785668071" href="https://mstdn.io/@mayuutann/99574950785668071"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574950785668071"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389848"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389848" local_id="4389848" ref="https://freezepeach.xyz/conversation/4182511">https://freezepeach.xyz/conversation/4182511</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387804.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387804.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387804" source="unknown"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387723:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://pleroma.soykaf.com/users/lain" class="h-card mention" title="&#x2468; lain &#x2468;">lain</a> how naive~</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387723"/>
|
||||||
|
<status_net notice_id="7387723"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:30:15+00:00</published>
|
||||||
|
<updated>2018-02-23T13:30:15+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451587:objectType=comment" href="https://freezepeach.xyz/notice/6451587"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451587"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389967"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389967" local_id="4389967" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=2f09acf104aebfe3">tag:shitposter.club,2018-02-23:objectType=thread:nonce=2f09acf104aebfe3</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387723.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387723.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387723" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387703:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://pleroma.soykaf.com/users/lain" class="h-card mention" title="&#x2468; lain &#x2468;">lain</a> you expect anyone to believe that??</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387703"/>
|
||||||
|
<status_net notice_id="7387703"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:28:08+00:00</published>
|
||||||
|
<updated>2018-02-23T13:28:08+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451569:objectType=comment" href="https://freezepeach.xyz/notice/6451569"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451569"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389967"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389967" local_id="4389967" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=2f09acf104aebfe3">tag:shitposter.club,2018-02-23:objectType=thread:nonce=2f09acf104aebfe3</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://pleroma.soykaf.com/users/lain"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387703.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387703.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387703" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387639:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://mstdn.io/users/mayuutann" class="h-card mention" title="Mayutan&#x2615;">mayuutann</a> @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> pacyuri!! <a href="https://shitposter.club/file/eea140be45df3f993c4533026bf9a78fe8facd296d2fa0c6d02b2e347c5dc30e.jpg" title="https://shitposter.club/file/eea140be45df3f993c4533026bf9a78fe8facd296d2fa0c6d02b2e347c5dc30e.jpg" class="attachment" id="attachment-1589462" rel="nofollow external">https://shitposter.club/attachment/1589462</a></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387639"/>
|
||||||
|
<status_net notice_id="7387639"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:20:38+00:00</published>
|
||||||
|
<updated>2018-02-23T13:20:38+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574870416888767" href="https://mstdn.io/@mayuutann/99574870416888767"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574870416888767"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390261"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390261" local_id="4390261" ref="https://freezepeach.xyz/conversation/4183220">https://freezepeach.xyz/conversation/4183220</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mstdn.io/users/mayuutann"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="enclosure" href="https://shitposter.club/file/eea140be45df3f993c4533026bf9a78fe8facd296d2fa0c6d02b2e347c5dc30e.jpg" type="image/jpeg" length="42186"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387639.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387639.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387639" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387611:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> why is pacyu eating a pizza so cute</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387611"/>
|
||||||
|
<status_net notice_id="7387611"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:18:07+00:00</published>
|
||||||
|
<updated>2018-02-23T13:18:07+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451402:objectType=comment" href="https://freezepeach.xyz/notice/6451402"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451402"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390261"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390261" local_id="4390261" ref="https://freezepeach.xyz/conversation/4183220">https://freezepeach.xyz/conversation/4183220</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387611.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387611.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387611" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:fave:5381:comment:7387600:2018-02-23T13:17:52+00:00</id>
|
||||||
|
<title>Favorite</title>
|
||||||
|
<content type="html">shpuld favorited something by mayuutann: <p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> pichu! <a href="https://mstdn.io/media/Crv5eubz1KO0dgBEulI" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/Crv5eubz1KO0dgB</span><span class="invisible">EulI</span></a></p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387606"/>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
|
||||||
|
<published>2018-02-23T13:17:52+00:00</published>
|
||||||
|
<updated>2018-02-23T13:17:52+00:00</updated>
|
||||||
|
<activity:object>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>https://mstdn.io/users/mayuutann/statuses/99574863865459283</id>
|
||||||
|
<title>New comment by mayuutann</title>
|
||||||
|
<content type="html"><p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> pichu! <a href="https://mstdn.io/media/Crv5eubz1KO0dgBEulI" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/Crv5eubz1KO0dgB</span><span class="invisible">EulI</span></a></p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mstdn.io/@mayuutann/99574863865459283"/>
|
||||||
|
<status_net notice_id="7387600"></status_net>
|
||||||
|
</activity:object>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574863865459283" href="https://mstdn.io/@mayuutann/99574863865459283"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574863865459283"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389848"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389848" local_id="4389848" ref="https://freezepeach.xyz/conversation/4182511">https://freezepeach.xyz/conversation/4182511</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387606.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387606.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387606" source="unknown"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:fave:5381:comment:7387544:2018-02-23T13:12:43+00:00</id>
|
||||||
|
<title>Favorite</title>
|
||||||
|
<content type="html">shpuld favorited something by mayuutann: <p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> wa~~i!! :blobcheer:</p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387557"/>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
|
||||||
|
<published>2018-02-23T13:12:43+00:00</published>
|
||||||
|
<updated>2018-02-23T13:12:43+00:00</updated>
|
||||||
|
<activity:object>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>https://mstdn.io/users/mayuutann/statuses/99574840290947233</id>
|
||||||
|
<title>New comment by mayuutann</title>
|
||||||
|
<content type="html"><p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> wa~~i!! :blobcheer:</p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mstdn.io/@mayuutann/99574840290947233"/>
|
||||||
|
<status_net notice_id="7387544"></status_net>
|
||||||
|
</activity:object>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574840290947233" href="https://mstdn.io/@mayuutann/99574840290947233"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574840290947233"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390030"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390030" local_id="4390030" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab">tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387557.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387557.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387557" source="unknown"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387555:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> more!!</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387555"/>
|
||||||
|
<status_net notice_id="7387555"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:12:23+00:00</published>
|
||||||
|
<updated>2018-02-23T13:12:23+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451332:objectType=note" href="https://freezepeach.xyz/notice/6451332"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451332"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390261"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390261" local_id="4390261" ref="https://freezepeach.xyz/conversation/4183220">https://freezepeach.xyz/conversation/4183220</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387555.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387555.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387555" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:fave:5381:note:7387537:2018-02-23T13:12:19+00:00</id>
|
||||||
|
<title>Favorite</title>
|
||||||
|
<content type="html">shpuld favorited something by hakui: you have pacyupacyu'd for: 45 minutes 03 seconds</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387553"/>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
|
||||||
|
<published>2018-02-23T13:12:19+00:00</published>
|
||||||
|
<updated>2018-02-23T13:12:19+00:00</updated>
|
||||||
|
<activity:object>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
|
||||||
|
<id>tag:freezepeach.xyz,2018-02-23:noticeId=6451332:objectType=note</id>
|
||||||
|
<title>New note by hakui</title>
|
||||||
|
<content type="html">you have pacyupacyu'd for: 45 minutes 03 seconds</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://freezepeach.xyz/notice/6451332"/>
|
||||||
|
<status_net notice_id="7387537"></status_net>
|
||||||
|
</activity:object>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451332:objectType=note" href="https://freezepeach.xyz/notice/6451332"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451332"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390261"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390261" local_id="4390261" ref="https://freezepeach.xyz/conversation/4183220">https://freezepeach.xyz/conversation/4183220</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387553.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387553.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387553" source="unknown"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387539:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://mstdn.io/users/mayuutann" class="h-card mention" title="Mayutan&#x2615;">mayuutann</a> ndndnd~</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387539"/>
|
||||||
|
<status_net notice_id="7387539"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:11:04+00:00</published>
|
||||||
|
<updated>2018-02-23T13:11:04+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574837619821505" href="https://mstdn.io/@mayuutann/99574837619821505"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574837619821505"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390030"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390030" local_id="4390030" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab">tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mstdn.io/users/mayuutann"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387539.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387539.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387539" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387518:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://mstdn.io/users/mayuutann" class="h-card mention" title="Mayutan&#x2615;">mayuutann</a> well done! mayumayu is so energetic</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387518"/>
|
||||||
|
<status_net notice_id="7387518"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:08:50+00:00</published>
|
||||||
|
<updated>2018-02-23T13:08:50+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574826506801503" href="https://mstdn.io/@mayuutann/99574826506801503"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574826506801503"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390030"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390030" local_id="4390030" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab">tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mstdn.io/users/mayuutann"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387518.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387518.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387518" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:fave:5381:note:7387503:2018-02-23T13:08:00+00:00</id>
|
||||||
|
<title>Favorite</title>
|
||||||
|
<content type="html">shpuld favorited something by mayuutann: <p>done with FIGURE MAT!!<br /> (Posted with IFTTT)</p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387511"/>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/favorite</activity:verb>
|
||||||
|
<published>2018-02-23T13:08:00+00:00</published>
|
||||||
|
<updated>2018-02-23T13:08:00+00:00</updated>
|
||||||
|
<activity:object>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
|
||||||
|
<id>https://mstdn.io/users/mayuutann/statuses/99574825526201897</id>
|
||||||
|
<title>New note by mayuutann</title>
|
||||||
|
<content type="html"><p>done with FIGURE MAT!!<br /> (Posted with IFTTT)</p></content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mstdn.io/@mayuutann/99574825526201897"/>
|
||||||
|
<status_net notice_id="7387503"></status_net>
|
||||||
|
</activity:object>
|
||||||
|
<thr:in-reply-to ref="https://mstdn.io/users/mayuutann/statuses/99574825526201897" href="https://mstdn.io/@mayuutann/99574825526201897"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://mstdn.io/@mayuutann/99574825526201897"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390240"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390240" local_id="4390240" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=c6aaa9b91e8d242f">tag:shitposter.club,2018-02-23:objectType=thread:nonce=c6aaa9b91e8d242f</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387511.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387511.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387511" source="unknown"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387486:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://a.weirder.earth/users/mutstd" class="h-card mention" title="Mutant Standard">mutstd</a> @<a href="https://donphan.social/users/Siphonay" class="h-card mention" title="Siphonay">siphonay</a> jokes on you I'm oppressively shitposting myself</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387486"/>
|
||||||
|
<status_net notice_id="7387486"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:05:44+00:00</published>
|
||||||
|
<updated>2018-02-23T13:05:44+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451272:objectType=comment" href="https://freezepeach.xyz/notice/6451272"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451272"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389665"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389665" local_id="4389665" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=5d306467336c9661">tag:shitposter.club,2018-02-23:objectType=thread:nonce=5d306467336c9661</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://a.weirder.earth/users/mutstd"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://donphan.social/users/Siphonay"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387486.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387486.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387486" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387466:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://a.weirder.earth/users/mutstd" class="h-card mention" title="Mutant Standard">mutstd</a> @<a href="https://donphan.social/users/Siphonay" class="h-card mention" title="Siphonay">siphonay</a> how does it feel being hostile</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387466"/>
|
||||||
|
<status_net notice_id="7387466"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:04:10+00:00</published>
|
||||||
|
<updated>2018-02-23T13:04:10+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451260:objectType=comment" href="https://freezepeach.xyz/notice/6451260"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451260"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389665"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389665" local_id="4389665" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=5d306467336c9661">tag:shitposter.club,2018-02-23:objectType=thread:nonce=5d306467336c9661</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://a.weirder.earth/users/mutstd"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://donphan.social/users/Siphonay"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387466.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387466.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387466" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387459:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> gorogoro</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387459"/>
|
||||||
|
<status_net notice_id="7387459"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:03:32+00:00</published>
|
||||||
|
<updated>2018-02-23T13:03:32+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451248:objectType=comment" href="https://freezepeach.xyz/notice/6451248"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451248"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389271"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389271" local_id="4389271" ref="https://freezepeach.xyz/conversation/4181784">https://freezepeach.xyz/conversation/4181784</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387459.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387459.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387459" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387432:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> ndnd</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387432"/>
|
||||||
|
<status_net notice_id="7387432"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T13:02:05+00:00</published>
|
||||||
|
<updated>2018-02-23T13:02:05+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:freezepeach.xyz,2018-02-23:noticeId=6451204:objectType=comment" href="https://freezepeach.xyz/notice/6451204"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://freezepeach.xyz/notice/6451204"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4389271"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4389271" local_id="4389271" ref="https://freezepeach.xyz/conversation/4181784">https://freezepeach.xyz/conversation/4181784</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://freezepeach.xyz/user/3458"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387432.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387432.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387432" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387367:objectType=note</id>
|
||||||
|
<title>New note by shpuld</title>
|
||||||
|
<content type="html">dear diary: I'm trying to do work but I can only think of tenshi eating a corndog</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387367"/>
|
||||||
|
<status_net notice_id="7387367"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T12:56:03+00:00</published>
|
||||||
|
<updated>2018-02-23T12:56:03+00:00</updated>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390142"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390142" local_id="4390142" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=57f316da416743fc">tag:shitposter.club,2018-02-23:objectType=thread:nonce=57f316da416743fc</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387367.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387367.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387367" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387354:objectType=note</id>
|
||||||
|
<title>New note by shpuld</title>
|
||||||
|
<content type="html">jesus christ it's such a fridey at work</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387354"/>
|
||||||
|
<status_net notice_id="7387354"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T12:53:50+00:00</published>
|
||||||
|
<updated>2018-02-23T12:53:50+00:00</updated>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390131"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390131" local_id="4390131" ref="tag:shitposter.club,2018-02-23:objectType=thread:nonce=c05eb5e91bdcbdb7">tag:shitposter.club,2018-02-23:objectType=thread:nonce=c05eb5e91bdcbdb7</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387354.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387354.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387354" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
|
||||||
|
<id>tag:shitposter.club,2018-02-23:noticeId=7387343:objectType=comment</id>
|
||||||
|
<title>New comment by shpuld</title>
|
||||||
|
<content type="html">@<a href="https://gs.smuglo.li/user/589" class="h-card mention" title="&#x16DE;&#x16A9;&#x16B3;&#x16C1;&#x16DE;&#x16A9;&#x16B3;&#x16C1;">dokidoki</a> give them free upgrades to krokodil</content>
|
||||||
|
<link rel="alternate" type="text/html" href="https://shitposter.club/notice/7387343"/>
|
||||||
|
<status_net notice_id="7387343"></status_net>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<published>2018-02-23T12:53:15+00:00</published>
|
||||||
|
<updated>2018-02-23T12:53:15+00:00</updated>
|
||||||
|
<thr:in-reply-to ref="tag:gs.smuglo.li,2018-02-23:noticeId=6201061:objectType=note" href="https://gs.smuglo.li/notice/6201061"></thr:in-reply-to>
|
||||||
|
<link rel="related" href="https://gs.smuglo.li/notice/6201061"/>
|
||||||
|
<link rel="ostatus:conversation" href="https://shitposter.club/conversation/4390117"/>
|
||||||
|
<ostatus:conversation href="https://shitposter.club/conversation/4390117" local_id="4390117" ref="https://gs.smuglo.li/conversation/3934774">https://gs.smuglo.li/conversation/3934774</ostatus:conversation>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://gs.smuglo.li/user/589"/>
|
||||||
|
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387343.atom"/>
|
||||||
|
<link rel="edit" type="application/atom+xml" href="https://shitposter.club/api/statuses/show/7387343.atom"/>
|
||||||
|
<statusnet:notice_info local_id="7387343" source="Pleroma FE"></statusnet:notice_info>
|
||||||
|
</entry>
|
||||||
|
</feed>
|
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
|
||||||
|
<Subject>https://shitposter.club/user/5381</Subject>
|
||||||
|
<Alias>acct:shpuld@shitposter.club</Alias>
|
||||||
|
<Alias>https://shitposter.club/shpuld</Alias>
|
||||||
|
<Alias>https://shitposter.club/index.php/user/5381</Alias>
|
||||||
|
<Alias>https://shitposter.club/index.php/shpuld</Alias>
|
||||||
|
<Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://shitposter.club/shpuld"/>
|
||||||
|
<Link rel="http://gmpg.org/xfn/11" type="text/html" href="https://shitposter.club/shpuld"/>
|
||||||
|
<Link rel="describedby" type="application/rdf+xml" href="https://shitposter.club/shpuld/foaf"/>
|
||||||
|
<Link rel="http://apinamespace.org/atom" type="application/atomsvc+xml" href="https://shitposter.club/api/statusnet/app/service/shpuld.xml"/>
|
||||||
|
<Link rel="http://apinamespace.org/twitter" href="https://shitposter.club/api/"/>
|
||||||
|
<Link rel="http://specs.openid.net/auth/2.0/provider" href="https://shitposter.club/shpuld"/>
|
||||||
|
<Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://shitposter.club/api/statuses/user_timeline/5381.atom"/>
|
||||||
|
<Link rel="magic-public-key" href="data:application/magic-public-key,RSA.pkJ_xCKxFzcOKuKPKFhUTkWLWyWAIRDS8onxRLxVvxITQAkHIO1Rl9FS_1DAT3MK_wBcbzXm1TwlVOQFY5I2zrZQGxUvGDUlqcsf9sQyQaNvVVoU83nAV2w9bQZ-GlaLCMHWKN4yBBCTPfu9J6XbItxbHhJg5ub8z5drDF45te8=.AQAB"/>
|
||||||
|
<Link rel="salmon" href="https://shitposter.club/main/salmon/user/5381"/>
|
||||||
|
<Link rel="http://salmon-protocol.org/ns/salmon-replies" href="https://shitposter.club/main/salmon/user/5381"/>
|
||||||
|
<Link rel="http://salmon-protocol.org/ns/salmon-mention" href="https://shitposter.club/main/salmon/user/5381"/>
|
||||||
|
<Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://shitposter.club/main/ostatussub?profile={uri}"/>
|
||||||
|
</XRD>
|
@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"type": "Accept",
|
||||||
|
"signature": {
|
||||||
|
"type": "RsaSignature2017",
|
||||||
|
"signatureValue": "rBzK4Kqhd4g7HDS8WE5oRbWQb2R+HF/6awbUuMWhgru/xCODT0SJWSri0qWqEO4fPcpoUyz2d25cw6o+iy9wiozQb3hQNnu69AR+H5Mytc06+g10KCHexbGhbAEAw/7IzmeXELHUbaqeduaDIbdt1zw4RkwLXdqgQcGXTJ6ND1wM3WMHXQCK1m0flasIXFoBxpliPAGiElV8s0+Ltuh562GvflG3kB3WO+j+NaR0ZfG5G9N88xMj9UQlCKit5gpAE5p6syUsCU2WGBHywTumv73i3OVTIFfq+P9AdMsRuzw1r7zoKEsthW4aOzLQDi01ZjvdBz8zH6JnjDU7SMN/Ig==",
|
||||||
|
"creator": "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"created": "2018-02-17T14:36:41Z"
|
||||||
|
},
|
||||||
|
"object": {
|
||||||
|
"type": "Follow",
|
||||||
|
"object": "http://mastodon.example.org/users/admin",
|
||||||
|
"id": "http://localtesting.pleroma.lol/users/lain#follows/4",
|
||||||
|
"actor": "http://localtesting.pleroma.lol/users/lain"
|
||||||
|
},
|
||||||
|
"nickname": "lain",
|
||||||
|
"id": "http://mastodon.example.org/users/admin#accepts/follows/4",
|
||||||
|
"actor": "http://mastodon.example.org/users/admin",
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"type": "Announce",
|
||||||
|
"to": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
],
|
||||||
|
"signature": {
|
||||||
|
"type": "RsaSignature2017",
|
||||||
|
"signatureValue": "T95DRE0eAligvMuRMkQA01lsoz2PKi4XXF+cyZ0BqbrO12p751TEWTyyRn5a+HH0e4kc77EUhQVXwMq80WAYDzHKVUTf2XBJPBa68vl0j6RXw3+HK4ef5hR4KWFNBU34yePS7S1fEmc1mTG4Yx926wtmZwDpEMTp1CXOeVEjCYzmdyHpepPPH2ZZettiacmPRSqBLPGWZoot7kH/SioIdnrMGY0I7b+rqkIdnnEcdhu9N1BKPEO9Sr+KmxgAUiidmNZlbBXX6gCxp8BiIdH4ABsIcwoDcGNkM5EmWunGW31LVjsEQXhH5c1Wly0ugYYPCg/0eHLNBOhKkY/teSM8Lg==",
|
||||||
|
"creator": "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"created": "2018-02-17T19:39:15Z"
|
||||||
|
},
|
||||||
|
"published": "2018-02-17T19:39:15Z",
|
||||||
|
"object": "http://mastodon.example.org/@admin/99541947525187367",
|
||||||
|
"id": "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity",
|
||||||
|
"cc": [
|
||||||
|
"http://mastodon.example.org/users/admin",
|
||||||
|
"http://mastodon.example.org/users/admin/followers"
|
||||||
|
],
|
||||||
|
"atomUri": "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity",
|
||||||
|
"actor": "http://mastodon.example.org/users/admin",
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"type": "Create",
|
||||||
|
"to": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
],
|
||||||
|
"signature": {
|
||||||
|
"type": "RsaSignature2017",
|
||||||
|
"signatureValue": "KnaBoP7C4XYgzTFbM+CpGlx4p59ahWvNNo4reRGDlb/DmxL3OF1/WugNl0xHCOA3aoIX2rrkHniw+z4Yb+wOBf9ZOxgM+IHTKj69AEcm/4NxGXxStRv603JZNyboY371w8g/mIKmLLtL6dgUI3n2Laam2rYh//8aelEWQ240TxiJi/WcKuOT2DNInWOpfArgxJ4MA11n4tb4xX65RkxInTCFa1kaJG8L+A+EoXtIhTa4rCQDv/BH3a8x7vOJxHfEosEnkk/yVEqG+ccgoTvc+5/kK+TKk3S3GuXch0ro9RKqxfPAHkyg8eetRhNhKWZ/rgPNfcF6bGJKFA0i8TzjHw==",
|
||||||
|
"creator": "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"created": "2018-02-17T17:14:26Z"
|
||||||
|
},
|
||||||
|
"published": "2018-02-17T17:14:26Z",
|
||||||
|
"object": {
|
||||||
|
"url": "http://mastodon.example.org/@admin/99541822081679796",
|
||||||
|
"type": "Note",
|
||||||
|
"to": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
],
|
||||||
|
"tag": [],
|
||||||
|
"summary": null,
|
||||||
|
"sensitive": false,
|
||||||
|
"published": "2018-02-17T17:14:26Z",
|
||||||
|
"inReplyToAtomUri": null,
|
||||||
|
"inReplyTo": null,
|
||||||
|
"id": "http://mastodon.example.org/users/admin/statuses/99541822081679796",
|
||||||
|
"conversation": "tag:mastodon.example.org,2018-02-17:objectId=10:objectType=Conversation",
|
||||||
|
"content": "<p><a href=\"http://mastodon.example.org/media/hw4nrZmV5DPbW2z_hao\" rel=\"nofollow noopener\" target=\"_blank\"><span class=\"invisible\">http://</span><span class=\"ellipsis\">mastodon.example.org/media/hw4</span><span class=\"invisible\">nrZmV5DPbW2z_hao</span></a></p>",
|
||||||
|
"cc": [
|
||||||
|
"http://mastodon.example.org/users/admin/followers"
|
||||||
|
],
|
||||||
|
"attributedTo": "http://mastodon.example.org/users/admin",
|
||||||
|
"attachment": [
|
||||||
|
{
|
||||||
|
"url": "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg",
|
||||||
|
"type": "Document",
|
||||||
|
"name": null,
|
||||||
|
"mediaType": "image/jpeg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"atomUri": "http://mastodon.example.org/users/admin/statuses/99541822081679796"
|
||||||
|
},
|
||||||
|
"id": "http://mastodon.example.org/users/admin/statuses/99541822081679796/activity",
|
||||||
|
"cc": [
|
||||||
|
"http://mastodon.example.org/users/admin/followers"
|
||||||
|
],
|
||||||
|
"actor": "http://mastodon.example.org/users/admin",
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"type": "Delete",
|
||||||
|
"signature": {
|
||||||
|
"type": "RsaSignature2017",
|
||||||
|
"signatureValue": "cw0RlfNREf+5VdsOYcCBDrv521eiLsDTAYNHKffjF0bozhCnOh+wHkFik7WamUk$
|
||||||
|
uEiN4L2H6vPlGRprAZGRhEwgy+A7rIFQNmLrpW5qV5UNVI/2F7kngEHqZQgbQYj9hW+5GMYmPkHdv3D72ZefGw$
|
||||||
|
4Xa2NBLGFpAjQllfzt7kzZLKKY2DM99FdUa64I2Wj3iD04Hs23SbrUdAeuGk/c1Cg6bwGNG4vxoiwn1jikgJLA$
|
||||||
|
NAlSGjsRGdR7LfbC7GqWWsW3cSNsLFPoU6FyALjgTrrYoHiXe0QHggw+L3yMLfzB2S/L46/VRbyb+WDKMBIXUL$
|
||||||
|
5owmzHSi6e/ZtCI3w==",
|
||||||
|
"creator": "http://mastodon.example.org/users/gargron#main-key", "created": "2018-03-03T16:24:11Z"
|
||||||
|
},
|
||||||
|
"object": {
|
||||||
|
"type": "Tombstone",
|
||||||
|
"id": "http://mastodon.example.org/users/gargron/statuses/99620895606148759",
|
||||||
|
"atomUri": "http://mastodon.example.org/users/gargron/statuses/99620895606148759"
|
||||||
|
},
|
||||||
|
"id": "http://mastodon.example.org/users/gargron/statuses/99620895606148759#delete",
|
||||||
|
"actor": "http://mastodon.example.org/users/gargron",
|
||||||
|
"@context": [
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"type": "Follow",
|
||||||
|
"signature": {
|
||||||
|
"type": "RsaSignature2017",
|
||||||
|
"signatureValue": "Kn1/UkAQGJVaXBfWLAHcnwHg8YMAUqlEaBuYLazAG+pz5hqivsyrBmPV186Xzr+B4ZLExA9+SnOoNx/GOz4hBm0kAmukNSILAsUd84tcJ2yT9zc1RKtembK4WiwOw7li0+maeDN0HaB6t+6eTqsCWmtiZpprhXD8V1GGT8yG7X24fQ9oFGn+ng7lasbcCC0988Y1eGqNe7KryxcPuQz57YkDapvtONzk8gyLTkZMV4De93MyRHq6GVjQVIgtiYabQAxrX6Q8C+4P/jQoqdWJHEe+MY5JKyNaT/hMPt2Md1ok9fZQBGHlErk22/zy8bSN19GdG09HmIysBUHRYpBLig==",
|
||||||
|
"creator": "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"created": "2018-02-17T13:29:31Z"
|
||||||
|
},
|
||||||
|
"object": "http://localtesting.pleroma.lol/users/lain",
|
||||||
|
"nickname": "lain",
|
||||||
|
"id": "http://mastodon.example.org/users/admin#follows/2",
|
||||||
|
"actor": "http://mastodon.example.org/users/admin",
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"type": "Like",
|
||||||
|
"signature": {
|
||||||
|
"type": "RsaSignature2017",
|
||||||
|
"signatureValue": "fdxMfQSMwbC6wP6sh6neS/vM5879K67yQkHTbiT5Npr5wAac0y6+o3Ij+41tN3rL6wfuGTosSBTHOtta6R4GCOOhCaCSLMZKypnp1VltCzLDoyrZELnYQIC8gpUXVmIycZbREk22qWUe/w7DAFaKK4UscBlHDzeDVcA0K3Se5Sluqi9/Zh+ldAnEzj/rSEPDjrtvf5wGNf3fHxbKSRKFt90JvKK6hS+vxKUhlRFDf6/SMETw+EhwJSNW4d10yMUakqUWsFv4Acq5LW7l+HpYMvlYY1FZhNde1+uonnCyuQDyvzkff8zwtEJmAXC4RivO/VVLa17SmqheJZfI8oluVg==",
|
||||||
|
"creator": "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"created": "2018-02-17T18:57:49Z"
|
||||||
|
},
|
||||||
|
"object": "http://localtesting.pleroma.lol/objects/eb92579d-3417-42a8-8652-2492c2d4f454",
|
||||||
|
"nickname": "lain",
|
||||||
|
"id": "http://mastodon.example.org/users/admin#likes/2",
|
||||||
|
"actor": "http://mastodon.example.org/users/admin",
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","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":"http://mastodon.example.org/users/admin/statuses/99541947525187367","type":"Note","summary":null,"content":"\u003cp\u003eyeah.\u003c/p\u003e","inReplyTo":null,"published":"2018-02-17T17:46:20Z","url":"http://mastodon.example.org/@admin/99541947525187367","attributedTo":"http://mastodon.example.org/users/admin","to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["http://mastodon.example.org/users/admin/followers"],"sensitive":false,"atomUri":"http://mastodon.example.org/users/admin/statuses/99541947525187367","inReplyToAtomUri":null,"conversation":"tag:mastodon.example.org,2018-02-17:objectId=59:objectType=Conversation","tag":[],
|
||||||
|
"attachment": [
|
||||||
|
{
|
||||||
|
"url": "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg",
|
||||||
|
"type": "Document",
|
||||||
|
"name": null,
|
||||||
|
"mediaType": "image/jpeg"
|
||||||
|
}
|
||||||
|
]}
|
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<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:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
|
||||||
|
<id>https://mastodon.social/users/lambadalambda.atom</id>
|
||||||
|
<title>Critical Value</title>
|
||||||
|
<subtitle></subtitle>
|
||||||
|
<updated>2017-04-16T21:47:25Z</updated>
|
||||||
|
<logo>https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif</logo>
|
||||||
|
<author>
|
||||||
|
<id>https://mastodon.social/users/lambadalambda</id>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
|
||||||
|
<uri>https://mastodon.social/users/lambadalambda</uri>
|
||||||
|
<name>lambadalambda</name>
|
||||||
|
<email>lambadalambda@mastodon.social</email>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
|
||||||
|
<link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif"/>
|
||||||
|
<link rel="header" type="" media:width="700" media:height="335" href="/headers/original/missing.png"/>
|
||||||
|
<poco:preferredUsername>lambadalambda</poco:preferredUsername>
|
||||||
|
<poco:displayName>Critical Value</poco:displayName>
|
||||||
|
<mastodon:scope>public</mastodon:scope>
|
||||||
|
</author>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mastodon.social/@lambadalambda"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda.atom"/>
|
||||||
|
<link rel="hub" href="https://mastodon.social/api/push"/>
|
||||||
|
<link rel="salmon" href="https://mastodon.social/api/salmon/264"/>
|
||||||
|
<entry>
|
||||||
|
<id>tag:mastodon.social,2017-05-10:objectId=5551985:objectType=Status</id>
|
||||||
|
<published>2017-05-10T12:21:36Z</published>
|
||||||
|
<updated>2017-05-10T12:21:36Z</updated>
|
||||||
|
<title>New status by lambadalambda</title>
|
||||||
|
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
|
||||||
|
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
|
||||||
|
<summary xml:lang="sv">technologic</summary>
|
||||||
|
<content type="html" xml:lang="sv"><p>test</p></content>
|
||||||
|
<mastodon:scope>unlisted</mastodon:scope>
|
||||||
|
<link rel="alternate" type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2314748"/>
|
||||||
|
<link rel="self" type="application/atom+xml" href="https://mastodon.social/users/lambadalambda/updates/2314748.atom"/>
|
||||||
|
</entry>
|
||||||
|
</feed>
|
@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"Emoji": "toot:Emoji",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"toot": "http://joinmastodon.org/ns#"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"actor": "http://mastodon.example.org/users/admin",
|
||||||
|
"cc": [
|
||||||
|
"http://mastodon.example.org/users/admin/followers",
|
||||||
|
"http://localtesting.pleroma.lol/users/lain"
|
||||||
|
],
|
||||||
|
"id": "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity",
|
||||||
|
"nickname": "lain",
|
||||||
|
"object": {
|
||||||
|
"atomUri": "http://mastodon.example.org/users/admin/statuses/99512778738411822",
|
||||||
|
"attachment": [],
|
||||||
|
"attributedTo": "http://mastodon.example.org/users/admin",
|
||||||
|
"cc": [
|
||||||
|
"http://mastodon.example.org/users/admin/followers",
|
||||||
|
"http://localtesting.pleroma.lol/users/lain"
|
||||||
|
],
|
||||||
|
"content": "<p><span class=\"h-card\"><a href=\"http://localtesting.pleroma.lol/users/lain\" class=\"u-url mention\">@<span>lain</span></a></span></p>",
|
||||||
|
"conversation": "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation",
|
||||||
|
"id": "http://mastodon.example.org/users/admin/statuses/99512778738411822",
|
||||||
|
"inReplyTo": null,
|
||||||
|
"inReplyToAtomUri": null,
|
||||||
|
"published": "2018-02-12T14:08:20Z",
|
||||||
|
"sensitive": true,
|
||||||
|
"summary": "cw",
|
||||||
|
"tag": [
|
||||||
|
{
|
||||||
|
"href": "http://localtesting.pleroma.lol/users/lain",
|
||||||
|
"name": "@lain@localtesting.pleroma.lol",
|
||||||
|
"type": "Mention"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
],
|
||||||
|
"type": "Note",
|
||||||
|
"url": "http://mastodon.example.org/@admin/99512778738411822"
|
||||||
|
},
|
||||||
|
"published": "2018-02-12T14:08:20Z",
|
||||||
|
"signature": {
|
||||||
|
"created": "2018-02-12T14:08:20Z",
|
||||||
|
"creator": "http://mastodon.example.org/users/admin#main-key",
|
||||||
|
"signatureValue": "rnNfcopkc6+Ju73P806popcfwrK9wGYHaJVG1/ZvrlEbWVDzaHjkXqj9Q3/xju5l8CSn9tvSgCCtPFqZsFQwn/pFIFUcw7ZWB2xi4bDm3NZ3S4XQ8JRaaX7og5hFxAhWkGhJhAkfxVnOg2hG+w2d/7d7vRVSC1vo5ip4erUaA/PkWusZvPIpxnRWoXaxJsFmVx0gJgjpJkYDyjaXUlp+jmaoseeZ4EPQUWqHLKJ59PRG0mg8j2xAjYH9nQaN14qMRmTGPxY8gfv/CUFcatA+8VJU9KEsJkDAwLVvglydNTLGrxpAJU78a2eaht0foV43XUIZGe3DKiJPgE+UOKGCJw==",
|
||||||
|
"type": "RsaSignature2017"
|
||||||
|
},
|
||||||
|
"to": [
|
||||||
|
"https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
],
|
||||||
|
"type": "Create"
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"type": "Update",
|
||||||
|
"object": {
|
||||||
|
"url": "http://mastodon.example.org/@gargron",
|
||||||
|
"type": "Person",
|
||||||
|
"summary": "<p>Some bio</p>",
|
||||||
|
"publicKey": {
|
||||||
|
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gs3VnQf6am3R+CeBV4H\nlfI1HZTNRIBHgvFszRZkCERbRgEWMu+P+I6/7GJC5H5jhVQ60z4MmXcyHOGmYMK/\n5XyuHQz7V2Ssu1AxLfRN5Biq1ayb0+DT/E7QxNXDJPqSTnstZ6C7zKH/uAETqg3l\nBonjCQWyds+IYbQYxf5Sp3yhvQ80lMwHML3DaNCMlXWLoOnrOX5/yK5+dedesg2\n/HIvGk+HEt36vm6hoH7bwPuEkgA++ACqwjXRe5Mta7i3eilHxFaF8XIrJFARV0t\nqOu4GID/jG6oA+swIWndGrtR2QRJIt9QIBFfK3HG5M0koZbY1eTqwNFRHFL3xaD\nUQIDAQAB\n-----END PUBLIC KEY-----\n",
|
||||||
|
"owner": "http://mastodon.example.org/users/gargron",
|
||||||
|
"id": "http://mastodon.example.org/users/gargron#main-key"
|
||||||
|
},
|
||||||
|
"preferredUsername": "gargron",
|
||||||
|
"outbox": "http://mastodon.example.org/users/gargron/outbox",
|
||||||
|
"name": "gargle",
|
||||||
|
"manuallyApprovesFollowers": false,
|
||||||
|
"inbox": "http://mastodon.example.org/users/gargron/inbox",
|
||||||
|
"id": "http://mastodon.example.org/users/gargron",
|
||||||
|
"following": "http://mastodon.example.org/users/gargron/following",
|
||||||
|
"followers": "http://mastodon.example.org/users/gargron/followers",
|
||||||
|
"endpoints": {
|
||||||
|
"sharedInbox": "http://mastodon.example.org/inbox"
|
||||||
|
},
|
||||||
|
"icon":{"type":"Image","mediaType":"image/jpeg","url":"https://cd.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"},"image":{"type":"Image","mediaType":"image/png","url":"https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}
|
||||||
|
},
|
||||||
|
"id": "http://mastodon.example.org/users/gargron#updates/1519563538",
|
||||||
|
"actor": "http://mastodon.example.org/users/gargron",
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
{
|
||||||
|
"toot": "http://joinmastodon.org/ns#",
|
||||||
|
"sensitive": "as:sensitive",
|
||||||
|
"ostatus": "http://ostatus.org#",
|
||||||
|
"movedTo": "as:movedTo",
|
||||||
|
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
|
||||||
|
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
|
||||||
|
"conversation": "ostatus:conversation",
|
||||||
|
"atomUri": "ostatus:atomUri",
|
||||||
|
"Hashtag": "as:Hashtag",
|
||||||
|
"Emoji": "toot:Emoji"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
|
||||||
|
alias Pleroma.{Repo, User}
|
||||||
|
alias Pleroma.Activity
|
||||||
|
|
||||||
|
describe "/users/:nickname" do
|
||||||
|
test "it returns a json representation of the user", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn = conn
|
||||||
|
|> put_req_header("accept", "application/activity+json")
|
||||||
|
|> get("/users/#{user.nickname}")
|
||||||
|
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
|
||||||
|
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "/object/:uuid" do
|
||||||
|
test "it returns a json representation of the object", %{conn: conn} do
|
||||||
|
note = insert(:note)
|
||||||
|
uuid = String.split(note.data["id"], "/") |> List.last
|
||||||
|
|
||||||
|
conn = conn
|
||||||
|
|> put_req_header("accept", "application/activity+json")
|
||||||
|
|> get("/objects/#{uuid}")
|
||||||
|
|
||||||
|
assert json_response(conn, 200) == ObjectView.render("object.json", %{object: note})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "/users/:nickname/inbox" do
|
||||||
|
test "it inserts an incoming activity into the database", %{conn: conn} do
|
||||||
|
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!
|
||||||
|
|
||||||
|
conn = conn
|
||||||
|
|> assign(:valid_signature, true)
|
||||||
|
|> put_req_header("content-type", "application/activity+json")
|
||||||
|
|> post("/inbox", data)
|
||||||
|
|
||||||
|
assert "ok" == json_response(conn, 200)
|
||||||
|
:timer.sleep(500)
|
||||||
|
assert Activity.get_by_ap_id(data["id"])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,277 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
||||||
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.Web.Websub.WebsubClientSubscription
|
||||||
|
alias Pleroma.Web.Websub.WebsubServerSubscription
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
|
describe "handle_incoming" do
|
||||||
|
test "it ignores an incoming notice if we already have it" do
|
||||||
|
activity = insert(:note_activity)
|
||||||
|
|
||||||
|
data = File.read!("test/fixtures/mastodon-post-activity.json")
|
||||||
|
|> Poison.decode!
|
||||||
|
|> Map.put("object", activity.data["object"])
|
||||||
|
|
||||||
|
{:ok, returned_activity} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert activity == returned_activity
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it fetches replied-to activities if we don't have them" do
|
||||||
|
data = File.read!("test/fixtures/mastodon-post-activity.json")
|
||||||
|
|> Poison.decode!
|
||||||
|
|
||||||
|
object = data["object"]
|
||||||
|
|> Map.put("inReplyTo", "https://shitposter.club/notice/2827873")
|
||||||
|
|
||||||
|
data = data
|
||||||
|
|> Map.put("object", object)
|
||||||
|
|
||||||
|
{:ok, returned_activity} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert activity = Activity.get_create_activity_by_object_ap_id("tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment")
|
||||||
|
assert returned_activity.data["object"]["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873"
|
||||||
|
assert returned_activity.data["object"]["inReplyToStatusId"] == activity.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming notices" do
|
||||||
|
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity"
|
||||||
|
assert data["context"] == "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation"
|
||||||
|
assert data["to"] == ["https://www.w3.org/ns/activitystreams#Public"]
|
||||||
|
assert data["cc"] == [
|
||||||
|
"http://mastodon.example.org/users/admin/followers",
|
||||||
|
"http://localtesting.pleroma.lol/users/lain"
|
||||||
|
]
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
|
||||||
|
object = data["object"]
|
||||||
|
assert object["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822"
|
||||||
|
|
||||||
|
assert object["to"] == ["https://www.w3.org/ns/activitystreams#Public"]
|
||||||
|
assert object["cc"] == [
|
||||||
|
"http://mastodon.example.org/users/admin/followers",
|
||||||
|
"http://localtesting.pleroma.lol/users/lain"
|
||||||
|
]
|
||||||
|
assert object["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert object["attributedTo"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert object["context"] == "tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation"
|
||||||
|
assert object["sensitive"] == true
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming follow requests" do
|
||||||
|
user = insert(:user)
|
||||||
|
data = File.read!("test/fixtures/mastodon-follow-activity.json") |> Poison.decode!
|
||||||
|
|> Map.put("object", user.ap_id)
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Follow"
|
||||||
|
assert data["id"] == "http://mastodon.example.org/users/admin#follows/2"
|
||||||
|
assert User.following?(User.get_by_ap_id(data["actor"]), user)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming likes" do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hello"})
|
||||||
|
|
||||||
|
data = File.read!("test/fixtures/mastodon-like.json") |> Poison.decode!
|
||||||
|
|> Map.put("object", activity.data["object"]["id"])
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Like"
|
||||||
|
assert data["id"] == "http://mastodon.example.org/users/admin#likes/2"
|
||||||
|
assert data["object"] == activity.data["object"]["id"]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming announces" do
|
||||||
|
data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Announce"
|
||||||
|
assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
||||||
|
assert data["object"] == "http://mastodon.example.org/users/admin/statuses/99541947525187367"
|
||||||
|
|
||||||
|
assert Activity.get_create_activity_by_object_ap_id(data["object"])
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming announces with an existing activity" do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
|
||||||
|
|
||||||
|
data = File.read!("test/fixtures/mastodon-announce.json")
|
||||||
|
|> Poison.decode!
|
||||||
|
|> Map.put("object", activity.data["object"]["id"])
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
assert data["type"] == "Announce"
|
||||||
|
assert data["id"] == "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
||||||
|
assert data["object"] == activity.data["object"]["id"]
|
||||||
|
|
||||||
|
assert Activity.get_create_activity_by_object_ap_id(data["object"]).id == activity.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming update activities" do
|
||||||
|
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!
|
||||||
|
object = update_data["object"]
|
||||||
|
|> Map.put("actor", data["actor"])
|
||||||
|
|> Map.put("id", data["actor"])
|
||||||
|
|
||||||
|
update_data = update_data
|
||||||
|
|> Map.put("actor", data["actor"])
|
||||||
|
|> Map.put("object", object)
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data)
|
||||||
|
|
||||||
|
user = User.get_cached_by_ap_id(data["actor"])
|
||||||
|
assert user.name == "gargle"
|
||||||
|
assert user.avatar["url"] == [%{"href" => "https://cd.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"}]
|
||||||
|
assert user.info["banner"]["url"] == [%{"href" => "https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}]
|
||||||
|
assert user.bio == "<p>Some bio</p>"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it works for incoming deletes" do
|
||||||
|
activity = insert(:note_activity)
|
||||||
|
data = File.read!("test/fixtures/mastodon-delete.json")
|
||||||
|
|> Poison.decode!
|
||||||
|
|
||||||
|
object = data["object"]
|
||||||
|
|> Map.put("id", activity.data["object"]["id"])
|
||||||
|
|
||||||
|
data = data
|
||||||
|
|> Map.put("object", object)
|
||||||
|
|> Map.put("actor", activity.data["actor"])
|
||||||
|
|
||||||
|
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
||||||
|
|
||||||
|
refute Repo.get(Activity, activity.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "prepare outgoing" do
|
||||||
|
test "it turns mentions into tags" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey, @#{other_user.nickname}, how are ya? #2hu"})
|
||||||
|
|
||||||
|
{:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
|
||||||
|
object = modified["object"]
|
||||||
|
|
||||||
|
expected_mention = %{
|
||||||
|
"href" => other_user.ap_id,
|
||||||
|
"name" => "@#{other_user.nickname}",
|
||||||
|
"type" => "Mention"
|
||||||
|
}
|
||||||
|
|
||||||
|
expected_tag = %{
|
||||||
|
"href" => Pleroma.Web.Endpoint.url <> "/tags/2hu",
|
||||||
|
"type" => "Hashtag",
|
||||||
|
"name" => "#2hu"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Enum.member?(object["tag"], expected_tag)
|
||||||
|
assert Enum.member?(object["tag"], expected_mention)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it adds the sensitive property" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "#nsfw hey"})
|
||||||
|
{:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
|
||||||
|
|
||||||
|
assert modified["object"]["sensitive"]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it adds the json-ld context and the conversation property" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
|
||||||
|
{:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
|
||||||
|
|
||||||
|
assert modified["@context"] == "https://www.w3.org/ns/activitystreams"
|
||||||
|
assert modified["object"]["conversation"] == modified["context"]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it sets the 'attributedTo' property to the actor of the object if it doesn't have one" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
|
||||||
|
{:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
|
||||||
|
|
||||||
|
assert modified["object"]["actor"] == modified["object"]["attributedTo"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "user upgrade" do
|
||||||
|
test "it upgrades a user to activitypub" do
|
||||||
|
user = insert(:user, %{nickname: "rye@niu.moe", local: false, ap_id: "https://niu.moe/users/rye", follower_address: User.ap_followers(%User{nickname: "rye@niu.moe"})})
|
||||||
|
user_two = insert(:user, %{following: [user.follower_address]})
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "test"})
|
||||||
|
{:ok, unrelated_activity} = CommonAPI.post(user_two, %{"status" => "test"})
|
||||||
|
assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients
|
||||||
|
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
assert user.info["note_count"] == 1
|
||||||
|
|
||||||
|
{:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye")
|
||||||
|
assert user.info["ap_enabled"]
|
||||||
|
assert user.info["note_count"] == 1
|
||||||
|
assert user.follower_address == "https://niu.moe/users/rye/followers"
|
||||||
|
|
||||||
|
# Wait for the background task
|
||||||
|
:timer.sleep(1000)
|
||||||
|
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
assert user.info["note_count"] == 1
|
||||||
|
|
||||||
|
activity = Repo.get(Activity, activity.id)
|
||||||
|
assert user.follower_address in activity.recipients
|
||||||
|
assert %{"url" => [%{"href" => "https://cdn.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"}]} = user.avatar
|
||||||
|
assert %{"url" => [%{"href" => "https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}]} = user.info["banner"]
|
||||||
|
refute "..." in activity.recipients
|
||||||
|
|
||||||
|
unrelated_activity = Repo.get(Activity, unrelated_activity.id)
|
||||||
|
refute user.follower_address in unrelated_activity.recipients
|
||||||
|
|
||||||
|
user_two = Repo.get(User, user_two.id)
|
||||||
|
assert user.follower_address in user_two.following
|
||||||
|
refute "..." in user_two.following
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "maybe_retire_websub" do
|
||||||
|
test "it deletes all websub client subscripitions with the user as topic" do
|
||||||
|
subscription = %WebsubClientSubscription{topic: "https://niu.moe/users/rye.atom"}
|
||||||
|
{:ok, ws} = Repo.insert(subscription)
|
||||||
|
|
||||||
|
subscription = %WebsubClientSubscription{topic: "https://niu.moe/users/pasty.atom"}
|
||||||
|
{:ok, ws2} = Repo.insert(subscription)
|
||||||
|
|
||||||
|
Transmogrifier.maybe_retire_websub("https://niu.moe/users/rye")
|
||||||
|
|
||||||
|
refute Repo.get(WebsubClientSubscription, ws.id)
|
||||||
|
assert Repo.get(WebsubClientSubscription, ws2.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,17 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Web.ActivityPub.ObjectView
|
||||||
|
|
||||||
|
test "renders a note object" do
|
||||||
|
note = insert(:note)
|
||||||
|
|
||||||
|
result = ObjectView.render("object.json", %{object: note})
|
||||||
|
|
||||||
|
assert result["id"] == note.data["id"]
|
||||||
|
assert result["to"] == note.data["to"]
|
||||||
|
assert result["content"] == note.data["content"]
|
||||||
|
assert result["type"] == "Note"
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,18 @@
|
|||||||
|
defmodule Pleroma.Web.ActivityPub.UserViewTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Web.ActivityPub.UserView
|
||||||
|
|
||||||
|
test "Renders a user, including the public key" do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
|
||||||
|
|
||||||
|
result = UserView.render("user.json", %{user: user})
|
||||||
|
|
||||||
|
assert result["id"] == user.ap_id
|
||||||
|
assert result["preferredUsername"] == user.nickname
|
||||||
|
|
||||||
|
assert String.contains?(result["publicKey"]["publicKeyPem"], "BEGIN RSA PUBLIC KEY")
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,154 @@
|
|||||||
|
# http signatures
|
||||||
|
# Test data from https://tools.ietf.org/html/draft-cavage-http-signatures-08#appendix-C
|
||||||
|
defmodule Pleroma.Web.HTTPSignaturesTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
alias Pleroma.Web.HTTPSignatures
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
@private_key (hd(:public_key.pem_decode(File.read!("test/web/http_sigs/priv.key")))
|
||||||
|
|> :public_key.pem_entry_decode())
|
||||||
|
|
||||||
|
@public_key (hd(:public_key.pem_decode(File.read!("test/web/http_sigs/pub.key")))
|
||||||
|
|> :public_key.pem_entry_decode())
|
||||||
|
|
||||||
|
@headers %{
|
||||||
|
"(request-target)" => "post /foo?param=value&pet=dog",
|
||||||
|
"host" => "example.com",
|
||||||
|
"date" => "Thu, 05 Jan 2014 21:31:40 GMT",
|
||||||
|
"content-type" => "application/json",
|
||||||
|
"digest" => "SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=",
|
||||||
|
"content-length" => "18"
|
||||||
|
}
|
||||||
|
|
||||||
|
@body "{\"hello\": \"world\"}"
|
||||||
|
|
||||||
|
@default_signature """
|
||||||
|
keyId="Test",algorithm="rsa-sha256",signature="jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w="
|
||||||
|
"""
|
||||||
|
|
||||||
|
@basic_signature """
|
||||||
|
keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date",signature="HUxc9BS3P/kPhSmJo+0pQ4IsCo007vkv6bUm4Qehrx+B1Eo4Mq5/6KylET72ZpMUS80XvjlOPjKzxfeTQj4DiKbAzwJAb4HX3qX6obQTa00/qPDXlMepD2JtTw33yNnm/0xV7fQuvILN/ys+378Ysi082+4xBQFwvhNvSoVsGv4="
|
||||||
|
"""
|
||||||
|
|
||||||
|
@all_headers_signature """
|
||||||
|
keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date content-type digest content-length",signature="Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0="
|
||||||
|
"""
|
||||||
|
|
||||||
|
test "split up a signature" do
|
||||||
|
expected = %{
|
||||||
|
"keyId" => "Test",
|
||||||
|
"algorithm" => "rsa-sha256",
|
||||||
|
"signature" => "jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w=",
|
||||||
|
"headers" => ["date"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert HTTPSignatures.split_signature(@default_signature) == expected
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validates the default case" do
|
||||||
|
signature = HTTPSignatures.split_signature(@default_signature)
|
||||||
|
assert HTTPSignatures.validate(@headers, signature, @public_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validates the basic case" do
|
||||||
|
signature = HTTPSignatures.split_signature(@basic_signature)
|
||||||
|
assert HTTPSignatures.validate(@headers, signature, @public_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validates the all-headers case" do
|
||||||
|
signature = HTTPSignatures.split_signature(@all_headers_signature)
|
||||||
|
assert HTTPSignatures.validate(@headers, signature, @public_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it contructs a signing string" do
|
||||||
|
expected = "date: Thu, 05 Jan 2014 21:31:40 GMT\ncontent-length: 18"
|
||||||
|
assert expected == HTTPSignatures.build_signing_string(@headers, ["date", "content-length"])
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it validates a conn" do
|
||||||
|
public_key_pem = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnGb42rPZIapY4Hfhxrgn\nxKVJczBkfDviCrrYaYjfGxawSw93dWTUlenCVTymJo8meBlFgIQ70ar4rUbzl6GX\nMYvRdku072d1WpglNHXkjKPkXQgngFDrh2sGKtNB/cEtJcAPRO8OiCgPFqRtMiNM\nc8VdPfPdZuHEIZsJ/aUM38EnqHi9YnVDQik2xxDe3wPghOhqjxUM6eLC9jrjI+7i\naIaEygUdyst9qVg8e2FGQlwAeS2Eh8ygCxn+bBlT5OyV59jSzbYfbhtF2qnWHtZy\nkL7KOOwhIfGs7O9SoR2ZVpTEQ4HthNzainIe/6iCR5HGrao/T8dygweXFYRv+k5A\nPQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
[public_key] = :public_key.pem_decode(public_key_pem)
|
||||||
|
|
||||||
|
public_key = public_key
|
||||||
|
|> :public_key.pem_entry_decode()
|
||||||
|
|
||||||
|
conn = %{
|
||||||
|
req_headers: [
|
||||||
|
{"host", "localtesting.pleroma.lol"},
|
||||||
|
{"connection", "close"},
|
||||||
|
{"content-length", "2316"},
|
||||||
|
{"user-agent", "http.rb/2.2.2 (Mastodon/2.1.0.rc3; +http://mastodon.example.org/)"},
|
||||||
|
{"date", "Sun, 10 Dec 2017 14:23:49 GMT"},
|
||||||
|
{"digest", "SHA-256=x/bHADMW8qRrq2NdPb5P9fl0lYpKXXpe5h5maCIL0nM="},
|
||||||
|
{"content-type", "application/activity+json"},
|
||||||
|
{"(request-target)", "post /users/demiurge/inbox"},
|
||||||
|
{"signature", "keyId=\"http://mastodon.example.org/users/admin#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"i0FQvr51sj9BoWAKydySUAO1RDxZmNY6g7M62IA7VesbRSdFZZj9/fZapLp6YSuvxUF0h80ZcBEq9GzUDY3Chi9lx6yjpUAS2eKb+Am/hY3aswhnAfYd6FmIdEHzsMrpdKIRqO+rpQ2tR05LwiGEHJPGS0p528NvyVxrxMT5H5yZS5RnxY5X2HmTKEgKYYcvujdv7JWvsfH88xeRS7Jlq5aDZkmXvqoR4wFyfgnwJMPLel8P/BUbn8BcXglH/cunR0LUP7sflTxEz+Rv5qg+9yB8zgBsB4C0233WpcJxjeD6Dkq0EcoJObBR56F8dcb7NQtUDu7x6xxzcgSd7dHm5w==\""}]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert HTTPSignatures.validate_conn(conn, public_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it validates a conn and fetches the key" do
|
||||||
|
conn = %{
|
||||||
|
params: %{"actor" => "http://mastodon.example.org/users/admin"},
|
||||||
|
req_headers: [
|
||||||
|
{"host", "localtesting.pleroma.lol"},
|
||||||
|
{"x-forwarded-for", "127.0.0.1"},
|
||||||
|
{"connection", "close"},
|
||||||
|
{"content-length", "2307"},
|
||||||
|
{"user-agent", "http.rb/2.2.2 (Mastodon/2.1.0.rc3; +http://mastodon.example.org/)"},
|
||||||
|
{"date", "Sun, 11 Feb 2018 17:12:01 GMT"},
|
||||||
|
{"digest", "SHA-256=UXsAnMtR9c7mi1FOf6HRMtPgGI1yi2e9nqB/j4rZ99I="},
|
||||||
|
{"content-type", "application/activity+json"},
|
||||||
|
{"signature", "keyId=\"http://mastodon.example.org/users/admin#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"qXKqpQXUpC3d9bZi2ioEeAqP8nRMD021CzH1h6/w+LRk4Hj31ARJHDwQM+QwHltwaLDUepshMfz2WHSXAoLmzWtvv7xRwY+mRqe+NGk1GhxVZ/LSrO/Vp7rYfDpfdVtkn36LU7/Bzwxvvaa4ZWYltbFsRBL0oUrqsfmJFswNCQIG01BB52BAhGSCORHKtQyzo1IZHdxl8y80pzp/+FOK2SmHkqWkP9QbaU1qTZzckL01+7M5btMW48xs9zurEqC2sM5gdWMQSZyL6isTV5tmkTZrY8gUFPBJQZgihK44v3qgfWojYaOwM8ATpiv7NG8wKN/IX7clDLRMA8xqKRCOKw==\""},
|
||||||
|
{"(request-target)", "post /users/demiurge/inbox"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert HTTPSignatures.validate_conn(conn)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validate this" do
|
||||||
|
conn = %{
|
||||||
|
params: %{"actor" => "https://niu.moe/users/rye"},
|
||||||
|
req_headers: [
|
||||||
|
{"x-forwarded-for", "149.202.73.191"},
|
||||||
|
{"host", "testing.pleroma.lol"},
|
||||||
|
{"x-cluster-client-ip", "149.202.73.191"},
|
||||||
|
{"connection", "upgrade"},
|
||||||
|
{"content-length", "2396"},
|
||||||
|
{"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://niu.moe/)"},
|
||||||
|
{"date", "Sun, 18 Feb 2018 20:31:51 GMT"},
|
||||||
|
{"digest", "SHA-256=dzH+vLyhxxALoe9RJdMl4hbEV9bGAZnSfddHQzeidTU="},
|
||||||
|
{"content-type", "application/activity+json"},
|
||||||
|
{"signature", "keyId=\"https://niu.moe/users/rye#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"wtxDg4kIpW7nsnUcVJhBk6SgJeDZOocr8yjsnpDRqE52lR47SH6X7G16r7L1AUJdlnbfx7oqcvomoIJoHB3ghP6kRnZW6MyTMZ2jPoi3g0iC5RDqv6oAmDSO14iw6U+cqZbb3P/odS5LkbThF0UNXcfenVNfsKosIJycFjhNQc54IPCDXYq/7SArEKJp8XwEgzmiC2MdxlkVIUSTQYfjM4EG533cwlZocw1mw72e5mm/owTa80BUZAr0OOuhoWARJV9btMb02ZyAF6SCSoGPTA37wHyfM1Dk88NHf7Z0Aov/Fl65dpRM+XyoxdkpkrhDfH9qAx4iuV2VEWddQDiXHA==\""},
|
||||||
|
{"(request-target)", "post /inbox"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
assert HTTPSignatures.validate_conn(conn)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "validate this too" do
|
||||||
|
conn = %{
|
||||||
|
params: %{"actor" => "https://niu.moe/users/rye"},
|
||||||
|
req_headers: [
|
||||||
|
{"x-forwarded-for", "149.202.73.191"},
|
||||||
|
{"host", "testing.pleroma.lol"},
|
||||||
|
{"x-cluster-client-ip", "149.202.73.191"},
|
||||||
|
{"connection", "upgrade"},
|
||||||
|
{"content-length", "2342"},
|
||||||
|
{"user-agent", "http.rb/3.0.0 (Mastodon/2.2.0; +https://niu.moe/)"},
|
||||||
|
{"date", "Sun, 18 Feb 2018 21:44:46 GMT"},
|
||||||
|
{"digest", "SHA-256=vS8uDOJlyAu78cF3k5EzrvaU9iilHCX3chP37gs5sS8="},
|
||||||
|
{"content-type", "application/activity+json"},
|
||||||
|
{"signature", "keyId=\"https://niu.moe/users/rye#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) user-agent host date digest content-type\",signature=\"IN6fHD8pLiDEf35dOaRHzJKc1wBYh3/Yq0ItaNGxUSbJTd2xMjigZbcsVKzvgYYjglDDN+disGNeD+OBKwMqkXWaWe/lyMc9wHvCH5NMhpn/A7qGLY8yToSt4vh8ytSkZKO6B97yC+Nvy6Fz/yMbvKtFycIvSXCq417cMmY6f/aG+rtMUlTbKO5gXzC7SUgGJCtBPCh1xZzu5/w0pdqdjO46ePNeR6JyJSLLV4hfo3+p2n7SRraxM4ePVCUZqhwS9LPt3Zdhy3ut+IXCZgMVIZggQFM+zXLtcXY5HgFCsFQr5WQDu+YkhWciNWtKFnWfAsnsg5sC330lZ/0Z8Z91yA==\""},
|
||||||
|
{"(request-target)", "post /inbox"}
|
||||||
|
]}
|
||||||
|
assert HTTPSignatures.validate_conn(conn)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it generates a signature" do
|
||||||
|
user = insert(:user)
|
||||||
|
assert HTTPSignatures.sign(user, %{host: "mastodon.example.org"}) =~ "keyId=\""
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,15 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
|
||||||
|
NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F
|
||||||
|
UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB
|
||||||
|
AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA
|
||||||
|
QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK
|
||||||
|
kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg
|
||||||
|
f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u
|
||||||
|
412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc
|
||||||
|
mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7
|
||||||
|
kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA
|
||||||
|
gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW
|
||||||
|
G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI
|
||||||
|
7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
@ -0,0 +1,6 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
|
||||||
|
6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
|
||||||
|
Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
|
||||||
|
oYi+1hqp1fIekaxsyQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
Loading…
Reference in new issue