Merge branch 'release/1.1.4' into 'stable'

Release/1.1.4 - user.info fix plus NOT NULL for user.info

See merge request pleroma/pleroma!1927
This commit is contained in:
lain 2019-11-05 12:02:45 +00:00
commit 21716aa594
9 changed files with 56 additions and 7 deletions

View file

@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [1.1.4] - 2019-11-01
### Fixed
- Added a migration that fills up empty user.info fields to prevent breakage after previous unsafe migrations.
- Failure to migrate from pre-1.0.0 versions
- Mastodon API: Notification stream not including follow notifications
## [1.1.3] - 2019-10-25 ## [1.1.3] - 2019-10-25
### Fixed ### Fixed
- Blocked users showing up in notifications collapsed as if they were muted - Blocked users showing up in notifications collapsed as if they were muted

View file

@ -136,7 +136,7 @@ defp should_send?(%User{} = user, %Activity{} = item) do
recipients = MapSet.new(item.recipients) recipients = MapSet.new(item.recipients)
domain_blocks = Pleroma.Web.ActivityPub.MRF.subdomains_regex(user.info.domain_blocks) domain_blocks = Pleroma.Web.ActivityPub.MRF.subdomains_regex(user.info.domain_blocks)
with parent when not is_nil(parent) <- Object.normalize(item), with parent <- Object.normalize(item) || item,
true <- Enum.all?([blocks, mutes, reblog_mutes], &(item.actor not in &1)), true <- Enum.all?([blocks, mutes, reblog_mutes], &(item.actor not in &1)),
true <- Enum.all?([blocks, mutes], &(parent.data["actor"] not in &1)), true <- Enum.all?([blocks, mutes], &(parent.data["actor"] not in &1)),
true <- MapSet.disjoint?(recipients, recipient_blocks), true <- MapSet.disjoint?(recipients, recipient_blocks),

View file

@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do def project do
[ [
app: :pleroma, app: :pleroma,
version: version("1.1.3"), version: version("1.1.4"),
elixir: "~> 1.7", elixir: "~> 1.7",
elixirc_paths: elixirc_paths(Mix.env()), elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(), compilers: [:phoenix, :gettext] ++ Mix.compilers(),

View file

@ -8,10 +8,10 @@ defmodule Pleroma.Repo.Migrations.MigrateOldBookmarks do
def up do def up do
query = query =
from(u in User, from(u in "users",
where: u.local == true, where: u.local == true,
where: fragment("array_length(bookmarks, 1)") > 0, where: fragment("array_length(?, 1)", u.bookmarks) > 0,
select: %{id: u.id, bookmarks: fragment("bookmarks")} select: %{id: u.id, bookmarks: u.bookmarks}
) )
Repo.stream(query) Repo.stream(query)

View file

@ -0,0 +1,17 @@
defmodule Pleroma.Repo.Migrations.FixAndSecureUserInfoField do
use Ecto.Migration
def up do
execute("UPDATE users SET info = '{}'::jsonb WHERE info IS NULL")
execute("ALTER TABLE users
ALTER COLUMN info SET NOT NULL
")
end
def down do
execute("ALTER TABLE users
ALTER COLUMN info DROP NOT NULL
")
end
end

View file

@ -3,6 +3,6 @@ defmodule Pleroma.Repo.Migrations.CopyMutedToMutedNotifications do
alias Pleroma.User alias Pleroma.User
def change do def change do
execute("update users set info = safe_jsonb_set(info, '{muted_notifications}', info->'mutes', true) where local = true") execute("update users set info = safe_jsonb_set(info, '{muted_notifications}', info->'mutes', true) where local = true and info->'mutes' is not null")
end end
end end

View file

@ -0,0 +1,7 @@
defmodule Pleroma.Repo.Migrations.FixNullMutedNotificationFields do
use Ecto.Migration
def change do
execute("update users set info = safe_jsonb_set(info, '{muted_notifications}', '[]'::jsonb, true) where local = true and info->'muted_notifications' = 'null'::jsonb")
end
end

View file

@ -10,7 +10,8 @@ def build(data \\ %{}) do
password_hash: Comeonin.Pbkdf2.hashpwsalt("test"), password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
bio: "A tester.", bio: "A tester.",
ap_id: "some id", ap_id: "some id",
last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second) last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second),
info: %{}
} }
Map.merge(user, data) Map.merge(user, data)

View file

@ -110,6 +110,24 @@ test "it doesn't send notify to the 'user:notification' stream' when a domain is
Streamer.stream("user:notification", notif) Streamer.stream("user:notification", notif)
Task.await(task) Task.await(task)
end end
test "it sends follow activities to the 'user:notification' stream", %{
user: user
} do
user2 = insert(:user)
task = Task.async(fn -> assert_receive {:text, _}, 4_000 end)
Streamer.add_socket(
"user:notification",
%{transport_pid: task.pid, assigns: %{user: user}}
)
{:ok, _follower, _followed, _activity} = CommonAPI.follow(user2, user)
# We don't directly pipe the notification to the streamer as it's already
# generated as a side effect of CommonAPI.follow().
Task.await(task)
end
end end
test "it sends to public" do test "it sends to public" do