think I got all the URLs

This commit is contained in:
Moon Man 2023-08-11 19:49:46 -04:00
parent 0120951776
commit c7b3e34c22
16 changed files with 128 additions and 128 deletions

View File

@ -76,7 +76,7 @@ defp user_urls(%{local: true} = user) do
defp user_urls(%{local: false} = user) do defp user_urls(%{local: false} = user) do
base_domain = Enum.random(["domain1.com", "domain2.com", "domain3.com"]) base_domain = Enum.random(["domain1.com", "domain2.com", "domain3.com"])
ap_id = "https://#{base_domain}/users/#{user.nickname}" ap_id = "https://#{base_domain}/u/#{user.nickname}"
urls = %{ urls = %{
ap_id: ap_id, ap_id: ap_id,

View File

@ -122,14 +122,14 @@ def response("/notices/" <> id) do
user = User.get_cached_by_ap_id(activity.data["actor"]) user = User.get_cached_by_ap_id(activity.data["actor"])
info("Post #{activity.id} by #{user.nickname}") <> info("Post #{activity.id} by #{user.nickname}") <>
link("More posts by #{user.nickname}", "/users/#{user.nickname}") <> activities <> ".\r\n" link("More posts by #{user.nickname}", "/u/#{user.nickname}") <> activities <> ".\r\n"
else else
_e -> _e ->
info("Not public") <> ".\r\n" info("Not public") <> ".\r\n"
end end
end end
def response("/users/" <> nickname) do def response("/u/" <> nickname) do
with %User{} = user <- User.get_cached_by_nickname(nickname) do with %User{} = user <- User.get_cached_by_nickname(nickname) do
params = %{ params = %{
type: ["Create"], type: ["Create"],

View File

@ -417,7 +417,7 @@ def banner_url(user, options \\ []) do
# Should probably be renamed or removed # Should probably be renamed or removed
@spec ap_id(User.t()) :: String.t() @spec ap_id(User.t()) :: String.t()
def ap_id(%User{nickname: nickname}), do: "#{Endpoint.url()}/users/#{nickname}" def ap_id(%User{nickname: nickname}), do: "#{Endpoint.url()}/u/#{nickname}"
@spec ap_followers(User.t()) :: String.t() @spec ap_followers(User.t()) :: String.t()
def ap_followers(%User{follower_address: fa}) when is_binary(fa), do: fa def ap_followers(%User{follower_address: fa}) when is_binary(fa), do: fa

View File

@ -318,7 +318,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
"sensitive" => false "sensitive" => false
}, },
"statuses_count" => 1, "statuses_count" => 1,
"url" => "http://localhost:4001/users/nick6", "url" => "http://localhost:4001/u/nick6",
"username" => "nick6" "username" => "nick6"
}, },
"application" => nil, "application" => nil,

View File

@ -233,31 +233,31 @@ defmodule Pleroma.Web.Router do
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
pipe_through([:admin_api, :require_admin]) pipe_through([:admin_api, :require_admin])
get("/users/:nickname/permission_group", AdminAPIController, :right_get) get("/u/:nickname/permission_group", AdminAPIController, :right_get)
get("/users/:nickname/permission_group/:permission_group", AdminAPIController, :right_get) get("/u/:nickname/permission_group/:permission_group", AdminAPIController, :right_get)
post("/users/:nickname/permission_group/:permission_group", AdminAPIController, :right_add) post("/u/:nickname/permission_group/:permission_group", AdminAPIController, :right_add)
delete( delete(
"/users/:nickname/permission_group/:permission_group", "/u/:nickname/permission_group/:permission_group",
AdminAPIController, AdminAPIController,
:right_delete :right_delete
) )
post("/users/permission_group/:permission_group", AdminAPIController, :right_add_multiple) post("/u/permission_group/:permission_group", AdminAPIController, :right_add_multiple)
delete( delete(
"/users/permission_group/:permission_group", "/u/permission_group/:permission_group",
AdminAPIController, AdminAPIController,
:right_delete_multiple :right_delete_multiple
) )
post("/users/follow", UserController, :follow) post("/u/follow", UserController, :follow)
post("/users/unfollow", UserController, :unfollow) post("/u/unfollow", UserController, :unfollow)
post("/users", UserController, :create) post("/users", UserController, :create)
patch("/users/suggest", UserController, :suggest) patch("/u/suggest", UserController, :suggest)
patch("/users/unsuggest", UserController, :unsuggest) patch("/u/unsuggest", UserController, :unsuggest)
get("/relay", RelayController, :index) get("/relay", RelayController, :index)
post("/relay", RelayController, :follow) post("/relay", RelayController, :follow)
@ -310,21 +310,21 @@ defmodule Pleroma.Web.Router do
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
pipe_through(:require_privileged_role_users_manage_credentials) pipe_through(:require_privileged_role_users_manage_credentials)
get("/users/:nickname/password_reset", AdminAPIController, :get_password_reset) get("/u/:nickname/password_reset", AdminAPIController, :get_password_reset)
get("/users/:nickname/credentials", AdminAPIController, :show_user_credentials) get("/u/:nickname/credentials", AdminAPIController, :show_user_credentials)
patch("/users/:nickname/credentials", AdminAPIController, :update_user_credentials) patch("/u/:nickname/credentials", AdminAPIController, :update_user_credentials)
put("/users/disable_mfa", AdminAPIController, :disable_mfa) put("/u/disable_mfa", AdminAPIController, :disable_mfa)
patch("/users/force_password_reset", AdminAPIController, :force_password_reset) patch("/u/force_password_reset", AdminAPIController, :force_password_reset)
patch("/users/confirm_email", AdminAPIController, :confirm_email) patch("/u/confirm_email", AdminAPIController, :confirm_email)
patch("/users/resend_confirmation_email", AdminAPIController, :resend_confirmation_email) patch("/u/resend_confirmation_email", AdminAPIController, :resend_confirmation_email)
end end
# AdminAPI: admins and mods (staff) can perform these actions (if privileged by role) # AdminAPI: admins and mods (staff) can perform these actions (if privileged by role)
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
pipe_through(:require_privileged_role_messages_read) pipe_through(:require_privileged_role_messages_read)
get("/users/:nickname/statuses", AdminAPIController, :list_user_statuses) get("/u/:nickname/statuses", AdminAPIController, :list_user_statuses)
get("/users/:nickname/chats", AdminAPIController, :list_user_chats) get("/u/:nickname/chats", AdminAPIController, :list_user_chats)
get("/statuses", StatusController, :index) get("/statuses", StatusController, :index)
@ -340,28 +340,28 @@ defmodule Pleroma.Web.Router do
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
pipe_through(:require_privileged_role_users_manage_tags) pipe_through(:require_privileged_role_users_manage_tags)
put("/users/tag", AdminAPIController, :tag_users) put("/u/tag", AdminAPIController, :tag_users)
delete("/users/tag", AdminAPIController, :untag_users) delete("/u/tag", AdminAPIController, :untag_users)
end end
# AdminAPI: admins and mods (staff) can perform these actions (if privileged by role) # AdminAPI: admins and mods (staff) can perform these actions (if privileged by role)
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
pipe_through(:require_privileged_role_users_manage_activation_state) pipe_through(:require_privileged_role_users_manage_activation_state)
patch("/users/:nickname/toggle_activation", UserController, :toggle_activation) patch("/u/:nickname/toggle_activation", UserController, :toggle_activation)
patch("/users/activate", UserController, :activate) patch("/u/activate", UserController, :activate)
patch("/users/deactivate", UserController, :deactivate) patch("/u/deactivate", UserController, :deactivate)
end end
# AdminAPI: admins and mods (staff) can perform these actions (if privileged by role) # AdminAPI: admins and mods (staff) can perform these actions (if privileged by role)
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
pipe_through(:require_privileged_role_users_manage_invites) pipe_through(:require_privileged_role_users_manage_invites)
patch("/users/approve", UserController, :approve) patch("/u/approve", UserController, :approve)
post("/users/invite_token", InviteController, :create) post("/u/invite_token", InviteController, :create)
get("/users/invites", InviteController, :index) get("/u/invites", InviteController, :index)
post("/users/revoke_invite", InviteController, :revoke) post("/u/revoke_invite", InviteController, :revoke)
post("/users/email_invite", InviteController, :email) post("/u/email_invite", InviteController, :email)
end end
# AdminAPI: admins and mods (staff) can perform these actions (if privileged by role) # AdminAPI: admins and mods (staff) can perform these actions (if privileged by role)
@ -380,7 +380,7 @@ defmodule Pleroma.Web.Router do
pipe_through(:require_privileged_role_users_read) pipe_through(:require_privileged_role_users_read)
get("/users", UserController, :index) get("/users", UserController, :index)
get("/users/:nickname", UserController, :show) get("/u/:nickname", UserController, :show)
end end
# AdminAPI: admins and mods (staff) can perform these actions (if privileged by role) # AdminAPI: admins and mods (staff) can perform these actions (if privileged by role)
@ -821,8 +821,8 @@ defmodule Pleroma.Web.Router do
get("/notice/:id", OStatus.OStatusController, :notice) get("/notice/:id", OStatus.OStatusController, :notice)
# Mastodon compatibility routes # Mastodon compatibility routes
get("/users/:nickname/statuses/:id", OStatus.OStatusController, :object) get("/u/:nickname/statuses/:id", OStatus.OStatusController, :object)
get("/users/:nickname/statuses/:id/activity", OStatus.OStatusController, :activity) get("/u/:nickname/statuses/:id/activity", OStatus.OStatusController, :activity)
end end
scope "/", Pleroma.Web do scope "/", Pleroma.Web do
@ -831,13 +831,13 @@ defmodule Pleroma.Web.Router do
pipe_through([:accepts_html_xml_json, :http_signature, :static_fe]) pipe_through([:accepts_html_xml_json, :http_signature, :static_fe])
# Note: returns user _profile_ for json requests, redirects to user _feed_ for non-json ones # Note: returns user _profile_ for json requests, redirects to user _feed_ for non-json ones
get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed) get("/u/:nickname", Feed.UserController, :feed_redirect, as: :user_feed)
end end
scope "/", Pleroma.Web do scope "/", Pleroma.Web do
pipe_through([:accepts_html_xml]) pipe_through([:accepts_html_xml])
get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed) get("/u/:nickname/feed", Feed.UserController, :feed, as: :user_feed)
end end
scope "/", Pleroma.Web do scope "/", Pleroma.Web do
@ -877,22 +877,22 @@ defmodule Pleroma.Web.Router do
pipe_through([:activitypub_client]) pipe_through([:activitypub_client])
get("/api/ap/whoami", ActivityPubController, :whoami) get("/api/ap/whoami", ActivityPubController, :whoami)
get("/users/:nickname/inbox", ActivityPubController, :read_inbox) get("/u/:nickname/inbox", ActivityPubController, :read_inbox)
get("/users/:nickname/outbox", ActivityPubController, :outbox) get("/u/:nickname/outbox", ActivityPubController, :outbox)
post("/users/:nickname/outbox", ActivityPubController, :update_outbox) post("/u/:nickname/outbox", ActivityPubController, :update_outbox)
post("/api/ap/upload_media", ActivityPubController, :upload_media) post("/api/ap/upload_media", ActivityPubController, :upload_media)
# The following two are S2S as well, see `ActivityPub.fetch_follow_information_for_user/1`: # The following two are S2S as well, see `ActivityPub.fetch_follow_information_for_user/1`:
get("/users/:nickname/followers", ActivityPubController, :followers) get("/u/:nickname/followers", ActivityPubController, :followers)
get("/users/:nickname/following", ActivityPubController, :following) get("/u/:nickname/following", ActivityPubController, :following)
get("/users/:nickname/collections/featured", ActivityPubController, :pinned) get("/u/:nickname/collections/featured", ActivityPubController, :pinned)
end end
scope "/", Pleroma.Web.ActivityPub do scope "/", Pleroma.Web.ActivityPub do
pipe_through(:activitypub) pipe_through(:activitypub)
post("/inbox", ActivityPubController, :inbox) post("/inbox", ActivityPubController, :inbox)
post("/users/:nickname/inbox", ActivityPubController, :inbox) post("/u/:nickname/inbox", ActivityPubController, :inbox)
end end
scope "/relay", Pleroma.Web.ActivityPub do scope "/relay", Pleroma.Web.ActivityPub do

View File

@ -74,7 +74,7 @@ defp is_status?(acct) do
def do_follow(%{assigns: %{user: %User{} = user}} = conn, %{"user" => %{"id" => id}}) do def do_follow(%{assigns: %{user: %User{} = user}} = conn, %{"user" => %{"id" => id}}) do
with {:fetch_user, %User{} = followee} <- {:fetch_user, User.get_cached_by_id(id)}, with {:fetch_user, %User{} = followee} <- {:fetch_user, User.get_cached_by_id(id)},
{:ok, _, _, _} <- CommonAPI.follow(user, followee) do {:ok, _, _, _} <- CommonAPI.follow(user, followee) do
redirect(conn, to: "/users/#{followee.id}") redirect(conn, to: "/u/#{followee.id}")
else else
error -> error ->
handle_follow_error(conn, error) handle_follow_error(conn, error)
@ -91,7 +91,7 @@ def do_follow(conn, %{"authorization" => %{"name" => _, "password" => _, "id" =>
{_, {:ok, user}, _} <- {:auth, WrapperAuthenticator.get_user(conn), followee}, {_, {:ok, user}, _} <- {:auth, WrapperAuthenticator.get_user(conn), followee},
{_, _, _, false} <- {:mfa_required, followee, user, MFA.require?(user)}, {_, _, _, false} <- {:mfa_required, followee, user, MFA.require?(user)},
{:ok, _, _, _} <- CommonAPI.follow(user, followee) do {:ok, _, _, _} <- CommonAPI.follow(user, followee) do
redirect(conn, to: "/users/#{followee.id}") redirect(conn, to: "/u/#{followee.id}")
else else
error -> error ->
handle_follow_error(conn, error) handle_follow_error(conn, error)
@ -109,7 +109,7 @@ def do_follow(conn, %{"mfa" => %{"code" => code, "token" => token, "id" => id}})
{_, _, _, {:ok, _}} <- {_, _, _, {:ok, _}} <-
{:verify_mfa_code, followee, token, TOTPAuthenticator.verify(code, user)}, {:verify_mfa_code, followee, token, TOTPAuthenticator.verify(code, user)},
{:ok, _, _, _} <- CommonAPI.follow(user, followee) do {:ok, _, _, _} <- CommonAPI.follow(user, followee) do
redirect(conn, to: "/users/#{followee.id}") redirect(conn, to: "/u/#{followee.id}")
else else
error -> error ->
handle_follow_error(conn, error) handle_follow_error(conn, error)

View File

@ -19,6 +19,6 @@ def format_date(date) when is_binary(date) do
end end
def admin_user_url(%{id: id}) do def admin_user_url(%{id: id}) do
Pleroma.Web.Endpoint.url() <> "/pleroma/admin/#/users/" <> id Pleroma.Web.Endpoint.url() <> "/pleroma/admin/#/u/" <> id
end end
end end

View File

@ -32,7 +32,7 @@ def change do
{:ok, %{rows: ap_ids}} = {:ok, %{rows: ap_ids}} =
Ecto.Adapters.SQL.query( Ecto.Adapters.SQL.query(
Repo, Repo,
"select distinct unnest(nonexistent_locals.recipients) from activities, lateral (select array_agg(recipient) as recipients from unnest(activities.recipients) as recipient where recipient similar to '#{instance_uri}/users/[A-Za-z0-9]*' and not(recipient in (select ap_id from users))) nonexistent_locals;", "select distinct unnest(nonexistent_locals.recipients) from activities, lateral (select array_agg(recipient) as recipients from unnest(activities.recipients) as recipient where recipient similar to '#{instance_uri}/u/[A-Za-z0-9]*' and not(recipient in (select ap_id from users))) nonexistent_locals;",
[], [],
timeout: :infinity timeout: :infinity
) )

View File

@ -19,25 +19,25 @@
"sharedInbox": "https://{{domain}}/inbox", "sharedInbox": "https://{{domain}}/inbox",
"uploadMedia": "https://{{domain}}/api/ap/upload_media" "uploadMedia": "https://{{domain}}/api/ap/upload_media"
}, },
"followers": "https://{{domain}}/users/{{nickname}}/followers", "followers": "https://{{domain}}/u/{{nickname}}/followers",
"following": "https://{{domain}}/users/{{nickname}}/following", "following": "https://{{domain}}/u/{{nickname}}/following",
"icon": { "icon": {
"type": "Image", "type": "Image",
"url": "https://{{domain}}/media/a932a27f158b63c3a97e3a57d5384f714a82249274c6fc66c9eca581b4fd8af2.jpg" "url": "https://{{domain}}/media/a932a27f158b63c3a97e3a57d5384f714a82249274c6fc66c9eca581b4fd8af2.jpg"
}, },
"id": "https://{{domain}}/users/{{nickname}}", "id": "https://{{domain}}/u/{{nickname}}",
"image": { "image": {
"type": "Image", "type": "Image",
"url": "https://{{domain}}/media/db15f476d0ad14488db4762b7800479e6ef67b1824f8b9ea5c1fa05b7525c5b7.jpg" "url": "https://{{domain}}/media/db15f476d0ad14488db4762b7800479e6ef67b1824f8b9ea5c1fa05b7525c5b7.jpg"
}, },
"inbox": "https://{{domain}}/users/{{nickname}}/inbox", "inbox": "https://{{domain}}/u/{{nickname}}/inbox",
"manuallyApprovesFollowers": false, "manuallyApprovesFollowers": false,
"name": "{{nickname}} :verified:", "name": "{{nickname}} :verified:",
"outbox": "https://{{domain}}/users/{{nickname}}/outbox", "outbox": "https://{{domain}}/u/{{nickname}}/outbox",
"preferredUsername": "{{nickname}}", "preferredUsername": "{{nickname}}",
"publicKey": { "publicKey": {
"id": "https://{{domain}}/users/{{nickname}}#main-key", "id": "https://{{domain}}/u/{{nickname}}#main-key",
"owner": "https://{{domain}}/users/{{nickname}}", "owner": "https://{{domain}}/u/{{nickname}}",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu4XOAopC4nRIxNlHlt60\n//nCicuedu5wvLGIoQ+KUM2u7/PhLrrTDEqr1A7yQL95S0X8ryYtALgFLI5A54ww\nqjMIbIGAs44lEmDLMEd+XI+XxREE8wdsFpb4QQzWug0DTyqlMouTU25k0tfKh1rF\n4PMJ3uBSjDTAGgFvLNyFWTiVVgChbTNgGOmrEBucRl4NmKzQ69/FIUwENV88oQSU\n3bWvQTEH9rWH1rCLpkmQwdRiWfnhFX/4EUqXukfgoskvenKR8ff3nYhElDqFoE0e\nqUnIW1OZceyl8JewVLcL6m0/wdKeosTsfrcWc8DKfnRYQcBGNoBEq9GrOHDU0q2v\nyQIDAQAB\n-----END PUBLIC KEY-----\n\n" "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu4XOAopC4nRIxNlHlt60\n//nCicuedu5wvLGIoQ+KUM2u7/PhLrrTDEqr1A7yQL95S0X8ryYtALgFLI5A54ww\nqjMIbIGAs44lEmDLMEd+XI+XxREE8wdsFpb4QQzWug0DTyqlMouTU25k0tfKh1rF\n4PMJ3uBSjDTAGgFvLNyFWTiVVgChbTNgGOmrEBucRl4NmKzQ69/FIUwENV88oQSU\n3bWvQTEH9rWH1rCLpkmQwdRiWfnhFX/4EUqXukfgoskvenKR8ff3nYhElDqFoE0e\nqUnIW1OZceyl8JewVLcL6m0/wdKeosTsfrcWc8DKfnRYQcBGNoBEq9GrOHDU0q2v\nyQIDAQAB\n-----END PUBLIC KEY-----\n\n"
}, },
"summary": "Pleroma BE dev", "summary": "Pleroma BE dev",
@ -54,5 +54,5 @@
} }
], ],
"type": "Person", "type": "Person",
"url": "https://{{domain}}/users/{{nickname}}" "url": "https://{{domain}}/u/{{nickname}}"
} }

View File

@ -1,20 +1,20 @@
{ {
"aliases": [ "aliases": [
"https://{{subdomain}}/users/{{nickname}}" "https://{{subdomain}}/u/{{nickname}}"
], ],
"links": [ "links": [
{ {
"href": "https://{{subdomain}}/users/{{nickname}}", "href": "https://{{subdomain}}/u/{{nickname}}",
"rel": "http://webfinger.net/rel/profile-page", "rel": "http://webfinger.net/rel/profile-page",
"type": "text/html" "type": "text/html"
}, },
{ {
"href": "https://{{subdomain}}/users/{{nickname}}", "href": "https://{{subdomain}}/u/{{nickname}}",
"rel": "self", "rel": "self",
"type": "application/activity+json" "type": "application/activity+json"
}, },
{ {
"href": "https://{{subdomain}}/users/{{nickname}}", "href": "https://{{subdomain}}/u/{{nickname}}",
"rel": "self", "rel": "self",
"type": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" "type": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""
}, },

View File

@ -151,7 +151,7 @@ test "untagging a user" do
test "ap_id returns the activity pub id for the user" do test "ap_id returns the activity pub id for the user" do
user = UserBuilder.build() user = UserBuilder.build()
expected_ap_id = "#{Pleroma.Web.Endpoint.url()}/users/#{user.nickname}" expected_ap_id = "#{Pleroma.Web.Endpoint.url()}/u/#{user.nickname}"
assert expected_ap_id == User.ap_id(user) assert expected_ap_id == User.ap_id(user)
end end
@ -316,18 +316,18 @@ test "unfollow with synchronizes external user" do
followed = followed =
insert(:user, insert(:user,
nickname: "fuser1", nickname: "fuser1",
follower_address: "http://localhost:4001/users/fuser1/followers", follower_address: "http://localhost:4001/u/fuser1/followers",
following_address: "http://localhost:4001/users/fuser1/following", following_address: "http://localhost:4001/u/fuser1/following",
ap_id: "http://localhost:4001/users/fuser1" ap_id: "http://localhost:4001/u/fuser1"
) )
user = user =
insert(:user, %{ insert(:user, %{
local: false, local: false,
nickname: "fuser2", nickname: "fuser2",
ap_id: "http://localhost:4001/users/fuser2", ap_id: "http://localhost:4001/u/fuser2",
follower_address: "http://localhost:4001/users/fuser2/followers", follower_address: "http://localhost:4001/u/fuser2/followers",
following_address: "http://localhost:4001/users/fuser2/following" following_address: "http://localhost:4001/u/fuser2/following"
}) })
{:ok, user, followed} = User.follow(user, followed, :follow_accept) {:ok, user, followed} = User.follow(user, followed, :follow_accept)
@ -845,7 +845,7 @@ test "gets an existing user by nickname" do
end end
test "gets an existing user by ap_id" do test "gets an existing user by ap_id" do
ap_id = "http://mastodon.example.org/users/admin" ap_id = "http://mastodon.example.org/u/admin"
user = user =
insert( insert(
@ -900,7 +900,7 @@ test "for mastodon" do
headers: [{"content-type", "application/jrd+json"}] headers: [{"content-type", "application/jrd+json"}]
} }
%{url: "https://sub.example.com/users/a"} -> %{url: "https://sub.example.com/u/a"} ->
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
body: body:
@ -911,7 +911,7 @@ test "for mastodon" do
headers: [{"content-type", "application/activity+json"}] headers: [{"content-type", "application/activity+json"}]
} }
%{url: "https://sub.example.com/users/a/collections/featured"} -> %{url: "https://sub.example.com/u/a/collections/featured"} ->
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
body: body:
@ -925,7 +925,7 @@ test "for mastodon" do
ap_id = "a@example.com" ap_id = "a@example.com"
{:ok, fetched_user} = User.get_or_fetch(ap_id) {:ok, fetched_user} = User.get_or_fetch(ap_id)
assert fetched_user.ap_id == "https://sub.example.com/users/a" assert fetched_user.ap_id == "https://sub.example.com/u/a"
assert fetched_user.nickname == "a@example.com" assert fetched_user.nickname == "a@example.com"
end end
@ -958,7 +958,7 @@ test "for pleroma" do
headers: [{"content-type", "application/jrd+json"}] headers: [{"content-type", "application/jrd+json"}]
} }
%{url: "https://sub.example.com/users/a"} -> %{url: "https://sub.example.com/u/a"} ->
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
body: body:
@ -973,7 +973,7 @@ test "for pleroma" do
ap_id = "a@example.com" ap_id = "a@example.com"
{:ok, fetched_user} = User.get_or_fetch(ap_id) {:ok, fetched_user} = User.get_or_fetch(ap_id)
assert fetched_user.ap_id == "https://sub.example.com/users/a" assert fetched_user.ap_id == "https://sub.example.com/u/a"
assert fetched_user.nickname == "a@example.com" assert fetched_user.nickname == "a@example.com"
end end
end end
@ -1030,13 +1030,13 @@ test "updates an existing user, if stale" do
:user, :user,
local: false, local: false,
nickname: "admin@mastodon.example.org", nickname: "admin@mastodon.example.org",
ap_id: "http://mastodon.example.org/users/admin", ap_id: "http://mastodon.example.org/u/admin",
last_refreshed_at: a_week_ago last_refreshed_at: a_week_ago
) )
assert orig_user.last_refreshed_at == a_week_ago assert orig_user.last_refreshed_at == a_week_ago
{:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/u/admin")
assert user.inbox assert user.inbox
@ -1051,13 +1051,13 @@ test "if nicknames clash, the old user gets a prefix with the old id to the nick
:user, :user,
local: false, local: false,
nickname: "admin@mastodon.example.org", nickname: "admin@mastodon.example.org",
ap_id: "http://mastodon.example.org/users/harinezumigari", ap_id: "http://mastodon.example.org/u/harinezumigari",
last_refreshed_at: a_week_ago last_refreshed_at: a_week_ago
) )
assert orig_user.last_refreshed_at == a_week_ago assert orig_user.last_refreshed_at == a_week_ago
{:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin") {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/u/admin")
assert user.inbox assert user.inbox
@ -1077,13 +1077,13 @@ test "it returns the old user if stale, but unfetchable" do
:user, :user,
local: false, local: false,
nickname: "admin@mastodon.example.org", nickname: "admin@mastodon.example.org",
ap_id: "http://mastodon.example.org/users/raymoo", ap_id: "http://mastodon.example.org/u/raymoo",
last_refreshed_at: a_week_ago last_refreshed_at: a_week_ago
) )
assert orig_user.last_refreshed_at == a_week_ago assert orig_user.last_refreshed_at == a_week_ago
{:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/raymoo") {:ok, user} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/u/raymoo")
assert user.last_refreshed_at == orig_user.last_refreshed_at assert user.last_refreshed_at == orig_user.last_refreshed_at
end end
@ -1852,7 +1852,7 @@ test "delete/1 purges a user when they wouldn't be fully deleted" do
fields: [%{"gg" => "qq"}], fields: [%{"gg" => "qq"}],
raw_fields: [%{"gg" => "qq"}], raw_fields: [%{"gg" => "qq"}],
is_discoverable: true, is_discoverable: true,
also_known_as: ["https://lol.olo/users/loll"] also_known_as: ["https://lol.olo/u/loll"]
}) })
{:ok, job} = User.delete(user) {:ok, job} = User.delete(user)
@ -1947,7 +1947,7 @@ test "unsuggests a user" do
end end
test "get_public_key_for_ap_id fetches a user that's not in the db" do test "get_public_key_for_ap_id fetches a user that's not in the db" do
assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin") assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/u/admin")
end end
describe "per-user rich-text filtering" do describe "per-user rich-text filtering" do
@ -2235,7 +2235,7 @@ test "preserves hosts in user links text" do
end end
test "Adds rel=me on linkbacked urls" do test "Adds rel=me on linkbacked urls" do
user = insert(:user, ap_id: "https://social.example.org/users/lain") user = insert(:user, ap_id: "https://social.example.org/u/lain")
bio = "http://example.com/rel_me/null" bio = "http://example.com/rel_me/null"
expected_text = "<a href=\"#{bio}\">#{bio}</a>" expected_text = "<a href=\"#{bio}\">#{bio}</a>"
@ -2395,8 +2395,8 @@ test "it returns a list of AP ids in the same order" do
describe "sync followers count" do describe "sync followers count" do
setup do setup do
user1 = insert(:user, local: false, ap_id: "http://localhost:4001/users/masto_closed") user1 = insert(:user, local: false, ap_id: "http://localhost:4001/u/masto_closed")
user2 = insert(:user, local: false, ap_id: "http://localhost:4001/users/fuser2") user2 = insert(:user, local: false, ap_id: "http://localhost:4001/u/fuser2")
insert(:user, local: true) insert(:user, local: true)
insert(:user, local: false, is_active: false) insert(:user, local: false, is_active: false)
{:ok, user1: user1, user2: user2} {:ok, user1: user1, user2: user2}
@ -2470,8 +2470,8 @@ test "updates the counters normally on following/getting a follow when disabled"
other_user = other_user =
insert(:user, insert(:user,
local: false, local: false,
follower_address: "http://localhost:4001/users/masto_closed/followers", follower_address: "http://localhost:4001/u/masto_closed/followers",
following_address: "http://localhost:4001/users/masto_closed/following" following_address: "http://localhost:4001/u/masto_closed/following"
) )
assert other_user.following_count == 0 assert other_user.following_count == 0
@ -2491,8 +2491,8 @@ test "synchronizes the counters with the remote instance for the followed when e
other_user = other_user =
insert(:user, insert(:user,
local: false, local: false,
follower_address: "http://localhost:4001/users/masto_closed/followers", follower_address: "http://localhost:4001/u/masto_closed/followers",
following_address: "http://localhost:4001/users/masto_closed/following" following_address: "http://localhost:4001/u/masto_closed/following"
) )
assert other_user.following_count == 0 assert other_user.following_count == 0
@ -2512,8 +2512,8 @@ test "synchronizes the counters with the remote instance for the follower when e
other_user = other_user =
insert(:user, insert(:user,
local: false, local: false,
follower_address: "http://localhost:4001/users/masto_closed/followers", follower_address: "http://localhost:4001/u/masto_closed/followers",
following_address: "http://localhost:4001/users/masto_closed/following" following_address: "http://localhost:4001/u/masto_closed/following"
) )
assert other_user.following_count == 0 assert other_user.following_count == 0
@ -2680,7 +2680,7 @@ test "returns nickname without host" do
describe "full_nickname/1" do describe "full_nickname/1" do
test "returns fully qualified nickname for local and remote users" do test "returns fully qualified nickname for local and remote users" do
local_user = local_user =
insert(:user, nickname: "local_user", ap_id: "https://somehost.com/users/local_user") insert(:user, nickname: "local_user", ap_id: "https://somehost.com/u/local_user")
remote_user = insert(:user, nickname: "remote@host.com", local: false) remote_user = insert(:user, nickname: "remote@host.com", local: false)
@ -2712,7 +2712,7 @@ test "avatar fallback" do
end end
test "get_host/1" do test "get_host/1" do
user = insert(:user, ap_id: "https://lain.com/users/lain", nickname: "lain") user = insert(:user, ap_id: "https://lain.com/u/lain", nickname: "lain")
assert User.get_host(user) == "lain.com" assert User.get_host(user) == "lain.com"
end end

View File

@ -112,7 +112,7 @@ test "works with Updates" do
defp build_media_message(opts \\ []) do defp build_media_message(opts \\ []) do
%{ %{
"actor" => "https://remote.instance/users/bob", "actor" => "https://remote.instance/u/bob",
"type" => opts[:type] || "Create", "type" => opts[:type] || "Create",
"object" => %{ "object" => %{
"attachment" => [%{}], "attachment" => [%{}],
@ -153,7 +153,7 @@ test "match with wildcard domain" do
defp build_report_message do defp build_report_message do
%{ %{
"actor" => "https://remote.instance/users/bob", "actor" => "https://remote.instance/u/bob",
"type" => "Flag" "type" => "Flag"
} }
end end
@ -283,8 +283,8 @@ test "reject Announce when object would be rejected" do
announce = %{ announce = %{
"type" => "Announce", "type" => "Announce",
"actor" => "https://okay.tld/users/alice", "actor" => "https://okay.tld/u/alice",
"object" => %{"type" => "Note", "actor" => "https://blocked.tld/users/bob"} "object" => %{"type" => "Note", "actor" => "https://blocked.tld/u/bob"}
} }
assert {:reject, _} = SimplePolicy.filter(announce) assert {:reject, _} = SimplePolicy.filter(announce)
@ -295,7 +295,7 @@ test "reject by URI object" do
announce = %{ announce = %{
"type" => "Announce", "type" => "Announce",
"actor" => "https://okay.tld/users/alice", "actor" => "https://okay.tld/u/alice",
"object" => "https://blocked.tld/activities/1" "object" => "https://blocked.tld/activities/1"
} }
@ -545,19 +545,19 @@ test "it rejects the deletion" do
defp build_local_message do defp build_local_message do
%{ %{
"actor" => "#{Pleroma.Web.Endpoint.url()}/users/alice", "actor" => "#{Pleroma.Web.Endpoint.url()}/u/alice",
"to" => [], "to" => [],
"cc" => [] "cc" => []
} }
end end
defp build_remote_message do defp build_remote_message do
%{"actor" => "https://remote.instance/users/bob"} %{"actor" => "https://remote.instance/u/bob"}
end end
defp build_remote_user do defp build_remote_user do
%{ %{
"id" => "https://remote.instance/users/bob", "id" => "https://remote.instance/u/bob",
"icon" => %{ "icon" => %{
"url" => "http://example.com/image.jpg", "url" => "http://example.com/image.jpg",
"type" => "Image" "type" => "Image"
@ -573,7 +573,7 @@ defp build_remote_user do
defp build_remote_deletion_message do defp build_remote_deletion_message do
%{ %{
"type" => "Delete", "type" => "Delete",
"actor" => "https://remote.instance/users/bob" "actor" => "https://remote.instance/u/bob"
} }
end end
end end

View File

@ -29,7 +29,7 @@ test "it accepts Add/Remove activities" do
object_url = "https://example.com/objects/#{object_id}" object_url = "https://example.com/objects/#{object_id}"
actor = "https://example.com/users/lain" actor = "https://example.com/u/lain"
Tesla.Mock.mock(fn Tesla.Mock.mock(fn
%{ %{
@ -52,7 +52,7 @@ test "it accepts Add/Remove activities" do
headers: [{"content-type", "application/activity+json"}] headers: [{"content-type", "application/activity+json"}]
} }
%{method: :get, url: "https://example.com/users/lain/collections/featured"} -> %{method: :get, url: "https://example.com/u/lain/collections/featured"} ->
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
body: body:
@ -68,10 +68,10 @@ test "it accepts Add/Remove activities" do
"id" => "https://example.com/objects/d61d6733-e256-4fe1-ab13-1e369789423f", "id" => "https://example.com/objects/d61d6733-e256-4fe1-ab13-1e369789423f",
"actor" => actor, "actor" => actor,
"object" => object_url, "object" => object_url,
"target" => "https://example.com/users/lain/collections/featured", "target" => "https://example.com/u/lain/collections/featured",
"type" => "Add", "type" => "Add",
"to" => [Pleroma.Constants.as_public()], "to" => [Pleroma.Constants.as_public()],
"cc" => ["https://example.com/users/lain/followers"], "cc" => ["https://example.com/u/lain/followers"],
"bcc" => [], "bcc" => [],
"bto" => [] "bto" => []
} }
@ -85,10 +85,10 @@ test "it accepts Add/Remove activities" do
"id" => "http://localhost:400/objects/d61d6733-e256-4fe1-ab13-1e369789423d", "id" => "http://localhost:400/objects/d61d6733-e256-4fe1-ab13-1e369789423d",
"actor" => actor, "actor" => actor,
"object" => object_url, "object" => object_url,
"target" => "https://example.com/users/lain/collections/featured", "target" => "https://example.com/u/lain/collections/featured",
"type" => "Remove", "type" => "Remove",
"to" => [Pleroma.Constants.as_public()], "to" => [Pleroma.Constants.as_public()],
"cc" => ["https://example.com/users/lain/followers"], "cc" => ["https://example.com/u/lain/followers"],
"bcc" => [], "bcc" => [],
"bto" => [] "bto" => []
} }
@ -125,9 +125,9 @@ test "Add/Remove activities for remote users without featured address" do
object_url = "https://#{host}/objects/#{object_id}" object_url = "https://#{host}/objects/#{object_id}"
actor = "https://#{host}/users/#{user.nickname}" actor = "https://#{host}/u/#{user.nickname}"
featured = "https://#{host}/users/#{user.nickname}/collections/featured" featured = "https://#{host}/u/#{user.nickname}/collections/featured"
Tesla.Mock.mock(fn Tesla.Mock.mock(fn
%{ %{
@ -166,10 +166,10 @@ test "Add/Remove activities for remote users without featured address" do
"id" => "https://#{host}/objects/d61d6733-e256-4fe1-ab13-1e369789423f", "id" => "https://#{host}/objects/d61d6733-e256-4fe1-ab13-1e369789423f",
"actor" => actor, "actor" => actor,
"object" => object_url, "object" => object_url,
"target" => "https://#{host}/users/#{user.nickname}/collections/featured", "target" => "https://#{host}/u/#{user.nickname}/collections/featured",
"type" => "Add", "type" => "Add",
"to" => [Pleroma.Constants.as_public()], "to" => [Pleroma.Constants.as_public()],
"cc" => ["https://#{host}/users/#{user.nickname}/followers"], "cc" => ["https://#{host}/u/#{user.nickname}/followers"],
"bcc" => [], "bcc" => [],
"bto" => [] "bto" => []
} }

View File

@ -96,7 +96,7 @@ test "gets an atom feed", %{conn: conn, user: user, object: object, max_id: max_
resp = resp =
conn conn
|> put_req_header("accept", "application/atom+xml") |> put_req_header("accept", "application/atom+xml")
|> get("/users/#{user.nickname}/feed", %{"max_id" => max_id}) |> get("/u/#{user.nickname}/feed", %{"max_id" => max_id})
|> response(200) |> response(200)
activity_titles = activity_titles =
@ -111,7 +111,7 @@ test "gets a rss feed", %{conn: conn, user: user, object: object, max_id: max_id
resp = resp =
conn conn
|> put_req_header("accept", "application/rss+xml") |> put_req_header("accept", "application/rss+xml")
|> get("/users/#{user.nickname}/feed.rss") |> get("/u/#{user.nickname}/feed.rss")
|> response(200) |> response(200)
activity_titles = activity_titles =
@ -127,7 +127,7 @@ test "gets a rss feed", %{conn: conn, user: user, object: object, max_id: max_id
resp = resp =
conn conn
|> put_req_header("accept", "application/rss+xml") |> put_req_header("accept", "application/rss+xml")
|> get("/users/#{user.nickname}/feed.rss", %{"max_id" => max_id}) |> get("/u/#{user.nickname}/feed.rss", %{"max_id" => max_id})
|> response(200) |> response(200)
activity_titles = activity_titles =
@ -187,7 +187,7 @@ test "does not require authentication on non-federating instances", %{conn: conn
conn conn
|> put_req_header("accept", "application/rss+xml") |> put_req_header("accept", "application/rss+xml")
|> get("/users/#{user.nickname}/feed.rss") |> get("/u/#{user.nickname}/feed.rss")
|> response(200) |> response(200)
end end
@ -224,7 +224,7 @@ test "with html format, it redirects to user feed", %{conn: conn} do
response = response =
conn conn
|> get("/users/#{user.nickname}") |> get("/u/#{user.nickname}")
|> response(200) |> response(200)
assert response == assert response ==
@ -241,7 +241,7 @@ test "with html format, it falls back to frontend when user is remote", %{conn:
response = response =
conn conn
|> get("/users/#{user.nickname}") |> get("/u/#{user.nickname}")
|> response(200) |> response(200)
assert response =~ "</html>" assert response =~ "</html>"
@ -250,7 +250,7 @@ test "with html format, it falls back to frontend when user is remote", %{conn:
test "with html format, it falls back to frontend when user is not found", %{conn: conn} do test "with html format, it falls back to frontend when user is not found", %{conn: conn} do
response = response =
conn conn
|> get("/users/jimm") |> get("/u/jimm")
|> response(200) |> response(200)
assert response =~ "</html>" assert response =~ "</html>"
@ -265,12 +265,12 @@ test "with non-html / non-json format, it redirects to user feed in atom format"
conn = conn =
conn conn
|> put_req_header("accept", "application/xml") |> put_req_header("accept", "application/xml")
|> get("/users/#{user.nickname}") |> get("/u/#{user.nickname}")
assert conn.status == 302 assert conn.status == 302
assert redirected_to(conn) == assert redirected_to(conn) ==
"#{Pleroma.Web.Endpoint.url()}/users/#{user.nickname}/feed.atom" "#{Pleroma.Web.Endpoint.url()}/u/#{user.nickname}/feed.atom"
end end
test "with non-html / non-json format, it returns error when user is not found", %{conn: conn} do test "with non-html / non-json format, it returns error when user is not found", %{conn: conn} do

View File

@ -57,7 +57,7 @@ def user_factory(attrs \\ %{}) do
if attrs[:local] == false do if attrs[:local] == false do
base_domain = attrs[:domain] || Enum.random(["domain1.com", "domain2.com", "domain3.com"]) base_domain = attrs[:domain] || Enum.random(["domain1.com", "domain2.com", "domain3.com"])
ap_id = "https://#{base_domain}/users/#{user.nickname}" ap_id = "https://#{base_domain}/u/#{user.nickname}"
%{ %{
ap_id: ap_id, ap_id: ap_id,

View File

@ -1009,7 +1009,7 @@ def get("http://localhost:8080/following/fuser3", _, _, _) do
}} }}
end end
def get("http://localhost:4001/users/fuser2/followers", _, _, _) do def get("http://localhost:4001/u/fuser2/followers", _, _, _) do
{:ok, {:ok,
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
@ -1018,7 +1018,7 @@ def get("http://localhost:4001/users/fuser2/followers", _, _, _) do
}} }}
end end
def get("http://localhost:4001/users/fuser2/following", _, _, _) do def get("http://localhost:4001/u/fuser2/following", _, _, _) do
{:ok, {:ok,
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
@ -1027,7 +1027,7 @@ def get("http://localhost:4001/users/fuser2/following", _, _, _) do
}} }}
end end
def get("http://domain-with-errors:4001/users/fuser1/followers", _, _, _) do def get("http://domain-with-errors:4001/u/fuser1/followers", _, _, _) do
{:ok, {:ok,
%Tesla.Env{ %Tesla.Env{
status: 504, status: 504,
@ -1035,7 +1035,7 @@ def get("http://domain-with-errors:4001/users/fuser1/followers", _, _, _) do
}} }}
end end
def get("http://domain-with-errors:4001/users/fuser1/following", _, _, _) do def get("http://domain-with-errors:4001/u/fuser1/following", _, _, _) do
{:ok, {:ok,
%Tesla.Env{ %Tesla.Env{
status: 504, status: 504,