Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into pleroma-2.1-rc0
This commit is contained in:
commit
fc42446755
|
@ -282,6 +282,8 @@ docker:
|
||||||
IMAGE_TAG_SLUG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
|
IMAGE_TAG_SLUG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
|
||||||
IMAGE_TAG_LATEST: $CI_REGISTRY_IMAGE:latest
|
IMAGE_TAG_LATEST: $CI_REGISTRY_IMAGE:latest
|
||||||
IMAGE_TAG_LATEST_STABLE: $CI_REGISTRY_IMAGE:latest-stable
|
IMAGE_TAG_LATEST_STABLE: $CI_REGISTRY_IMAGE:latest-stable
|
||||||
|
DOCKER_BUILDX_URL: https://github.com/docker/buildx/releases/download/v0.4.1/buildx-v0.4.1.linux-amd64
|
||||||
|
DOCKER_BUILDX_HASH: 71a7d01439aa8c165a25b59c44d3f016fddbd98b
|
||||||
before_script: &before-docker
|
before_script: &before-docker
|
||||||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
||||||
- docker pull $IMAGE_TAG_SLUG || true
|
- docker pull $IMAGE_TAG_SLUG || true
|
||||||
|
@ -289,10 +291,14 @@ docker:
|
||||||
- export CI_VCS_REF=$CI_COMMIT_SHORT_SHA
|
- export CI_VCS_REF=$CI_COMMIT_SHORT_SHA
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- docker build --cache-from $IMAGE_TAG_SLUG --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP -t $IMAGE_TAG -t $IMAGE_TAG_SLUG -t $IMAGE_TAG_LATEST .
|
- mkdir -p /root/.docker/cli-plugins
|
||||||
- docker push $IMAGE_TAG
|
- wget "${DOCKER_BUILDX_URL}" -O ~/.docker/cli-plugins/docker-buildx
|
||||||
- docker push $IMAGE_TAG_SLUG
|
- echo "${DOCKER_BUILDX_HASH} /root/.docker/cli-plugins/docker-buildx" | sha1sum -c
|
||||||
- docker push $IMAGE_TAG_LATEST
|
- chmod +x ~/.docker/cli-plugins/docker-buildx
|
||||||
|
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||||
|
- docker buildx create --name mbuilder --driver docker-container --use
|
||||||
|
- docker buildx inspect --bootstrap
|
||||||
|
- docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64/v8 --push --cache-from $IMAGE_TAG_SLUG --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP -t $IMAGE_TAG -t $IMAGE_TAG_SLUG -t $IMAGE_TAG_LATEST .
|
||||||
tags:
|
tags:
|
||||||
- dind
|
- dind
|
||||||
only:
|
only:
|
||||||
|
@ -307,10 +313,14 @@ docker-stable:
|
||||||
before_script: *before-docker
|
before_script: *before-docker
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- docker build --cache-from $IMAGE_TAG_SLUG --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP -t $IMAGE_TAG -t $IMAGE_TAG_SLUG -t $IMAGE_TAG_LATEST_STABLE .
|
- mkdir -p /root/.docker/cli-plugins
|
||||||
- docker push $IMAGE_TAG
|
- wget "${DOCKER_BUILDX_URL}" -O ~/.docker/cli-plugins/docker-buildx
|
||||||
- docker push $IMAGE_TAG_SLUG
|
- echo "${DOCKER_BUILDX_HASH} /root/.docker/cli-plugins/docker-buildx" | sha1sum -c
|
||||||
- docker push $IMAGE_TAG_LATEST_STABLE
|
- chmod +x ~/.docker/cli-plugins/docker-buildx
|
||||||
|
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||||
|
- docker buildx create --name mbuilder --driver docker-container --use
|
||||||
|
- docker buildx inspect --bootstrap
|
||||||
|
- docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64/v8 --push --cache-from $IMAGE_TAG_SLUG --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP -t $IMAGE_TAG -t $IMAGE_TAG_SLUG -t $IMAGE_TAG_LATEST_STABLE .
|
||||||
tags:
|
tags:
|
||||||
- dind
|
- dind
|
||||||
only:
|
only:
|
||||||
|
@ -325,9 +335,15 @@ docker-release:
|
||||||
before_script: *before-docker
|
before_script: *before-docker
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- docker build --cache-from $IMAGE_TAG_SLUG --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP -t $IMAGE_TAG -t $IMAGE_TAG_SLUG .
|
script:
|
||||||
- docker push $IMAGE_TAG
|
- mkdir -p /root/.docker/cli-plugins
|
||||||
- docker push $IMAGE_TAG_SLUG
|
- wget "${DOCKER_BUILDX_URL}" -O ~/.docker/cli-plugins/docker-buildx
|
||||||
|
- echo "${DOCKER_BUILDX_HASH} /root/.docker/cli-plugins/docker-buildx" | sha1sum -c
|
||||||
|
- chmod +x ~/.docker/cli-plugins/docker-buildx
|
||||||
|
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||||
|
- docker buildx create --name mbuilder --driver docker-container --use
|
||||||
|
- docker buildx inspect --bootstrap
|
||||||
|
- docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64/v8 --push --cache-from $IMAGE_TAG_SLUG --build-arg VCS_REF=$CI_VCS_REF --build-arg BUILD_DATE=$CI_JOB_TIMESTAMP -t $IMAGE_TAG -t $IMAGE_TAG_SLUG .
|
||||||
tags:
|
tags:
|
||||||
- dind
|
- dind
|
||||||
only:
|
only:
|
||||||
|
|
|
@ -3,3 +3,4 @@
|
||||||
* [ ] Compile a changelog
|
* [ ] Compile a changelog
|
||||||
* [ ] Create an MR with an announcement to pleroma.social
|
* [ ] Create an MR with an announcement to pleroma.social
|
||||||
* [ ] Tag the release
|
* [ ] Tag the release
|
||||||
|
* [ ] Merge `stable` into `develop` (in case the fixes are already in develop, use `git merge -s ours --no-commit` and manually merge the changelogs)
|
||||||
|
|
|
@ -36,6 +36,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Mastodon API: Add `pleroma.unread_count` to the Marker entity.
|
- Mastodon API: Add `pleroma.unread_count` to the Marker entity.
|
||||||
- Mastodon API: Added `pleroma.metadata.post_formats` to /api/v1/instance
|
- Mastodon API: Added `pleroma.metadata.post_formats` to /api/v1/instance
|
||||||
- Mastodon API (legacy): Allow query parameters for `/api/v1/domain_blocks`, e.g. `/api/v1/domain_blocks?domain=badposters.zone`
|
- Mastodon API (legacy): Allow query parameters for `/api/v1/domain_blocks`, e.g. `/api/v1/domain_blocks?domain=badposters.zone`
|
||||||
|
- Mastodon API: Make notifications about statuses from muted users and threads read automatically
|
||||||
- Pleroma API: `/api/pleroma/captcha` responses now include `seconds_valid` with an integer value.
|
- Pleroma API: `/api/pleroma/captcha` responses now include `seconds_valid` with an integer value.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -15,6 +15,7 @@ defmodule Pleroma.Notification do
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.ThreadMute
|
alias Pleroma.ThreadMute
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Web.Push
|
alias Pleroma.Web.Push
|
||||||
alias Pleroma.Web.Streamer
|
alias Pleroma.Web.Streamer
|
||||||
|
@ -441,6 +442,7 @@ def create_notification(%Activity{} = activity, %User{} = user, do_send \\ true)
|
||||||
|> Multi.insert(:notification, %Notification{
|
|> Multi.insert(:notification, %Notification{
|
||||||
user_id: user.id,
|
user_id: user.id,
|
||||||
activity: activity,
|
activity: activity,
|
||||||
|
seen: mark_as_read?(activity, user),
|
||||||
type: type_from_activity(activity)
|
type: type_from_activity(activity)
|
||||||
})
|
})
|
||||||
|> Marker.multi_set_last_read_id(user, "notifications")
|
|> Marker.multi_set_last_read_id(user, "notifications")
|
||||||
|
@ -634,6 +636,11 @@ def skip?(:filtered, activity, user) do
|
||||||
|
|
||||||
def skip?(_, _, _), do: false
|
def skip?(_, _, _), do: false
|
||||||
|
|
||||||
|
def mark_as_read?(activity, target_user) do
|
||||||
|
user = Activity.user_actor(activity)
|
||||||
|
User.mutes_user?(target_user, user) || CommonAPI.thread_muted?(target_user, activity)
|
||||||
|
end
|
||||||
|
|
||||||
def for_user_and_activity(user, activity) do
|
def for_user_and_activity(user, activity) do
|
||||||
from(n in __MODULE__,
|
from(n in __MODULE__,
|
||||||
where: n.user_id == ^user.id,
|
where: n.user_id == ^user.id,
|
||||||
|
|
|
@ -465,7 +465,7 @@ def remove_mute(user, activity) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def thread_muted?(%User{id: user_id}, %{data: %{"context" => context}})
|
def thread_muted?(%User{id: user_id}, %{data: %{"context" => context}})
|
||||||
when is_binary("context") do
|
when is_binary(context) do
|
||||||
ThreadMute.exists?(user_id, context)
|
ThreadMute.exists?(user_id, context)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,18 @@ def find_lrdd_template(domain) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp get_address_from_domain(domain, encoded_account) when is_binary(domain) do
|
||||||
|
case find_lrdd_template(domain) do
|
||||||
|
{:ok, template} ->
|
||||||
|
String.replace(template, "{uri}", encoded_account)
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
"https://#{domain}/.well-known/webfinger?resource=#{encoded_account}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_address_from_domain(_, _), do: nil
|
||||||
|
|
||||||
@spec finger(String.t()) :: {:ok, map()} | {:error, any()}
|
@spec finger(String.t()) :: {:ok, map()} | {:error, any()}
|
||||||
def finger(account) do
|
def finger(account) do
|
||||||
account = String.trim_leading(account, "@")
|
account = String.trim_leading(account, "@")
|
||||||
|
@ -163,16 +175,8 @@ def finger(account) do
|
||||||
|
|
||||||
encoded_account = URI.encode("acct:#{account}")
|
encoded_account = URI.encode("acct:#{account}")
|
||||||
|
|
||||||
address =
|
with address when is_binary(address) <- get_address_from_domain(domain, encoded_account),
|
||||||
case find_lrdd_template(domain) do
|
response <-
|
||||||
{:ok, template} ->
|
|
||||||
String.replace(template, "{uri}", encoded_account)
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
"https://#{domain}/.well-known/webfinger?resource=#{encoded_account}"
|
|
||||||
end
|
|
||||||
|
|
||||||
with response <-
|
|
||||||
HTTP.get(
|
HTTP.get(
|
||||||
address,
|
address,
|
||||||
[{"accept", "application/xrd+xml,application/jrd+json"}]
|
[{"accept", "application/xrd+xml,application/jrd+json"}]
|
||||||
|
|
|
@ -217,7 +217,10 @@ test "it creates a notification for the user if the user mutes the activity auth
|
||||||
muter = Repo.get(User, muter.id)
|
muter = Repo.get(User, muter.id)
|
||||||
{:ok, activity} = CommonAPI.post(muted, %{status: "Hi @#{muter.nickname}"})
|
{:ok, activity} = CommonAPI.post(muted, %{status: "Hi @#{muter.nickname}"})
|
||||||
|
|
||||||
assert Notification.create_notification(activity, muter)
|
notification = Notification.create_notification(activity, muter)
|
||||||
|
|
||||||
|
assert notification.id
|
||||||
|
assert notification.seen
|
||||||
end
|
end
|
||||||
|
|
||||||
test "notification created if user is muted without notifications" do
|
test "notification created if user is muted without notifications" do
|
||||||
|
@ -243,7 +246,10 @@ test "it creates a notification for an activity from a muted thread" do
|
||||||
in_reply_to_status_id: activity.id
|
in_reply_to_status_id: activity.id
|
||||||
})
|
})
|
||||||
|
|
||||||
assert Notification.create_notification(activity, muter)
|
notification = Notification.create_notification(activity, muter)
|
||||||
|
|
||||||
|
assert notification.id
|
||||||
|
assert notification.seen
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it disables notifications from strangers" do
|
test "it disables notifications from strangers" do
|
||||||
|
@ -317,6 +323,7 @@ test "it creates notifications if content matches with a not irreversible filter
|
||||||
{:ok, [notification]} = Notification.create_notifications(status)
|
{:ok, [notification]} = Notification.create_notifications(status)
|
||||||
|
|
||||||
assert notification
|
assert notification
|
||||||
|
refute notification.seen
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it creates notifications when someone likes user's status with a filtered word" do
|
test "it creates notifications when someone likes user's status with a filtered word" do
|
||||||
|
@ -330,6 +337,7 @@ test "it creates notifications when someone likes user's status with a filtered
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity_two)
|
{:ok, [notification]} = Notification.create_notifications(activity_two)
|
||||||
|
|
||||||
assert notification
|
assert notification
|
||||||
|
refute notification.seen
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1012,6 +1020,7 @@ test "it returns notifications for muted user without notifications", %{user: us
|
||||||
[notification] = Notification.for_user(user)
|
[notification] = Notification.for_user(user)
|
||||||
|
|
||||||
assert notification.activity.object
|
assert notification.activity.object
|
||||||
|
assert notification.seen
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it doesn't return notifications for muted user with notifications", %{user: user} do
|
test "it doesn't return notifications for muted user with notifications", %{user: user} do
|
||||||
|
|
|
@ -219,7 +219,7 @@ test "muted notification" do
|
||||||
|
|
||||||
expected = %{
|
expected = %{
|
||||||
id: to_string(notification.id),
|
id: to_string(notification.id),
|
||||||
pleroma: %{is_seen: false, is_muted: true},
|
pleroma: %{is_seen: true, is_muted: true},
|
||||||
type: "favourite",
|
type: "favourite",
|
||||||
account: AccountView.render("show.json", %{user: another_user, for: user}),
|
account: AccountView.render("show.json", %{user: another_user, for: user}),
|
||||||
status: StatusView.render("show.json", %{activity: create_activity, for: user}),
|
status: StatusView.render("show.json", %{activity: create_activity, for: user}),
|
||||||
|
|
|
@ -40,6 +40,11 @@ test "works for ap_ids" do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "fingering" do
|
describe "fingering" do
|
||||||
|
test "returns error for nonsensical input" do
|
||||||
|
assert {:error, _} = WebFinger.finger("bliblablu")
|
||||||
|
assert {:error, _} = WebFinger.finger("pleroma.social")
|
||||||
|
end
|
||||||
|
|
||||||
test "returns error when fails parse xml or json" do
|
test "returns error when fails parse xml or json" do
|
||||||
user = "invalid_content@social.heldscal.la"
|
user = "invalid_content@social.heldscal.la"
|
||||||
assert {:error, %Jason.DecodeError{}} = WebFinger.finger(user)
|
assert {:error, %Jason.DecodeError{}} = WebFinger.finger(user)
|
||||||
|
|
Loading…
Reference in a new issue