@@ -282,6 +282,8 @@ docker: | |||
IMAGE_TAG_SLUG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG | |||
IMAGE_TAG_LATEST: $CI_REGISTRY_IMAGE:latest | |||
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 | |||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY | |||
- docker pull $IMAGE_TAG_SLUG || true | |||
@@ -289,10 +291,14 @@ docker: | |||
- export CI_VCS_REF=$CI_COMMIT_SHORT_SHA | |||
allow_failure: true | |||
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 . | |||
- docker push $IMAGE_TAG | |||
- docker push $IMAGE_TAG_SLUG | |||
- docker push $IMAGE_TAG_LATEST | |||
- mkdir -p /root/.docker/cli-plugins | |||
- 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 -t $IMAGE_TAG_LATEST . | |||
tags: | |||
- dind | |||
only: | |||
@@ -307,10 +313,14 @@ docker-stable: | |||
before_script: *before-docker | |||
allow_failure: true | |||
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 . | |||
- docker push $IMAGE_TAG | |||
- docker push $IMAGE_TAG_SLUG | |||
- docker push $IMAGE_TAG_LATEST_STABLE | |||
- mkdir -p /root/.docker/cli-plugins | |||
- 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 -t $IMAGE_TAG_LATEST_STABLE . | |||
tags: | |||
- dind | |||
only: | |||
@@ -325,9 +335,15 @@ docker-release: | |||
before_script: *before-docker | |||
allow_failure: true | |||
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 . | |||
- docker push $IMAGE_TAG | |||
- docker push $IMAGE_TAG_SLUG | |||
script: | |||
- mkdir -p /root/.docker/cli-plugins | |||
- 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: | |||
- dind | |||
only: | |||
@@ -3,3 +3,4 @@ | |||
* [ ] Compile a changelog | |||
* [ ] Create an MR with an announcement to pleroma.social | |||
* [ ] 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: 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: 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. | |||
</details> | |||
@@ -15,6 +15,7 @@ defmodule Pleroma.Notification do | |||
alias Pleroma.Repo | |||
alias Pleroma.ThreadMute | |||
alias Pleroma.User | |||
alias Pleroma.Web.CommonAPI | |||
alias Pleroma.Web.CommonAPI.Utils | |||
alias Pleroma.Web.Push | |||
alias Pleroma.Web.Streamer | |||
@@ -441,6 +442,7 @@ defmodule Pleroma.Notification do | |||
|> Multi.insert(:notification, %Notification{ | |||
user_id: user.id, | |||
activity: activity, | |||
seen: mark_as_read?(activity, user), | |||
type: type_from_activity(activity) | |||
}) | |||
|> Marker.multi_set_last_read_id(user, "notifications") | |||
@@ -634,6 +636,11 @@ defmodule Pleroma.Notification do | |||
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 | |||
from(n in __MODULE__, | |||
where: n.user_id == ^user.id, | |||
@@ -465,7 +465,7 @@ defmodule Pleroma.Web.CommonAPI do | |||
end | |||
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) | |||
end | |||
@@ -149,6 +149,18 @@ defmodule Pleroma.Web.WebFinger do | |||
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()} | |||
def finger(account) do | |||
account = String.trim_leading(account, "@") | |||
@@ -163,16 +175,8 @@ defmodule Pleroma.Web.WebFinger do | |||
encoded_account = URI.encode("acct:#{account}") | |||
address = | |||
case find_lrdd_template(domain) do | |||
{:ok, template} -> | |||
String.replace(template, "{uri}", encoded_account) | |||
_ -> | |||
"https://#{domain}/.well-known/webfinger?resource=#{encoded_account}" | |||
end | |||
with response <- | |||
with address when is_binary(address) <- get_address_from_domain(domain, encoded_account), | |||
response <- | |||
HTTP.get( | |||
address, | |||
[{"accept", "application/xrd+xml,application/jrd+json"}] | |||
@@ -217,7 +217,10 @@ defmodule Pleroma.NotificationTest do | |||
muter = Repo.get(User, muter.id) | |||
{: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 | |||
test "notification created if user is muted without notifications" do | |||
@@ -243,7 +246,10 @@ defmodule Pleroma.NotificationTest do | |||
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 | |||
test "it disables notifications from strangers" do | |||
@@ -317,6 +323,7 @@ defmodule Pleroma.NotificationTest do | |||
{:ok, [notification]} = Notification.create_notifications(status) | |||
assert notification | |||
refute notification.seen | |||
end | |||
test "it creates notifications when someone likes user's status with a filtered word" do | |||
@@ -330,6 +337,7 @@ defmodule Pleroma.NotificationTest do | |||
{:ok, [notification]} = Notification.create_notifications(activity_two) | |||
assert notification | |||
refute notification.seen | |||
end | |||
end | |||
@@ -1012,6 +1020,7 @@ defmodule Pleroma.NotificationTest do | |||
[notification] = Notification.for_user(user) | |||
assert notification.activity.object | |||
assert notification.seen | |||
end | |||
test "it doesn't return notifications for muted user with notifications", %{user: user} do | |||
@@ -219,7 +219,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do | |||
expected = %{ | |||
id: to_string(notification.id), | |||
pleroma: %{is_seen: false, is_muted: true}, | |||
pleroma: %{is_seen: true, is_muted: true}, | |||
type: "favourite", | |||
account: AccountView.render("show.json", %{user: another_user, for: user}), | |||
status: StatusView.render("show.json", %{activity: create_activity, for: user}), | |||
@@ -40,6 +40,11 @@ defmodule Pleroma.Web.WebFingerTest do | |||
end | |||
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 | |||
user = "invalid_content@social.heldscal.la" | |||
assert {:error, %Jason.DecodeError{}} = WebFinger.finger(user) | |||