Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Pleroma
pleroma
Commits
92caae59
Commit
92caae59
authored
May 05, 2020
by
lain
Browse files
Undoing: Move undoing blocks to the pipeline everywhere.
parent
a3bb2e54
Pipeline
#25314
failed with stages
in 8 minutes and 27 seconds
Changes
10
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/web/activity_pub/activity_pub.ex
View file @
92caae59
...
...
@@ -532,27 +532,6 @@ defp do_block(blocker, blocked, activity_id, local) do
end
end
@spec
unblock
(
User
.
t
(),
User
.
t
(),
String
.
t
()
|
nil
,
boolean
())
::
{
:ok
,
Activity
.
t
()}
|
{
:error
,
any
()}
|
nil
def
unblock
(
blocker
,
blocked
,
activity_id
\\
nil
,
local
\\
true
)
do
with
{
:ok
,
result
}
<-
Repo
.
transaction
(
fn
->
do_unblock
(
blocker
,
blocked
,
activity_id
,
local
)
end
)
do
result
end
end
defp
do_unblock
(
blocker
,
blocked
,
activity_id
,
local
)
do
with
%
Activity
{}
=
block_activity
<-
fetch_latest_block
(
blocker
,
blocked
),
unblock_data
<-
make_unblock_data
(
blocker
,
blocked
,
block_activity
,
activity_id
),
{
:ok
,
activity
}
<-
insert
(
unblock_data
,
local
),
:ok
<-
maybe_federate
(
activity
)
do
{
:ok
,
activity
}
else
nil
->
nil
{
:error
,
error
}
->
Repo
.
rollback
(
error
)
end
end
@spec
flag
(
map
())
::
{
:ok
,
Activity
.
t
()}
|
{
:error
,
any
()}
def
flag
(
%{
...
...
lib/pleroma/web/activity_pub/side_effects.ex
View file @
92caae59
...
...
@@ -9,6 +9,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
alias
Pleroma
.
Notification
alias
Pleroma
.
Object
alias
Pleroma
.
Repo
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
ActivityPub
.
Utils
def
handle
(
object
,
meta
\\
[])
...
...
@@ -61,5 +62,16 @@ def handle_undoing(%{data: %{"type" => "Announce"}} = object) do
end
end
def
handle_undoing
(
%{
data:
%{
"type"
=>
"Block"
,
"actor"
=>
blocker
,
"object"
=>
blocked
}}
=
object
)
do
with
%
User
{}
=
blocker
<-
User
.
get_cached_by_ap_id
(
blocker
),
%
User
{}
=
blocked
<-
User
.
get_cached_by_ap_id
(
blocked
),
{
:ok
,
_
}
<-
User
.
unblock
(
blocker
,
blocked
),
{
:ok
,
_
}
<-
Repo
.
delete
(
object
)
do
:ok
end
end
def
handle_undoing
(
object
),
do
:
{
:error
,
[
"don't know how to handle"
,
object
]}
end
lib/pleroma/web/activity_pub/transmogrifier.ex
View file @
92caae59
...
...
@@ -787,40 +787,6 @@ def handle_incoming(
end
end
def
handle_incoming
(
%{
"type"
=>
"Undo"
,
"object"
=>
%{
"type"
=>
"Block"
,
"object"
=>
blocked
},
"actor"
=>
blocker
,
"id"
=>
id
}
=
_data
,
_options
)
do
with
%
User
{
local:
true
}
=
blocked
<-
User
.
get_cached_by_ap_id
(
blocked
),
{
:ok
,
%
User
{}
=
blocker
}
<-
User
.
get_or_fetch_by_ap_id
(
blocker
),
{
:ok
,
activity
}
<-
ActivityPub
.
unblock
(
blocker
,
blocked
,
id
,
false
)
do
User
.
unblock
(
blocker
,
blocked
)
{
:ok
,
activity
}
else
_e
->
:error
end
end
def
handle_incoming
(
%{
"type"
=>
"Block"
,
"object"
=>
blocked
,
"actor"
=>
blocker
,
"id"
=>
id
}
=
_data
,
_options
)
do
with
%
User
{
local:
true
}
=
blocked
=
User
.
get_cached_by_ap_id
(
blocked
),
{
:ok
,
%
User
{}
=
blocker
}
=
User
.
get_or_fetch_by_ap_id
(
blocker
),
{
:ok
,
activity
}
<-
ActivityPub
.
block
(
blocker
,
blocked
,
id
,
false
)
do
User
.
unfollow
(
blocker
,
blocked
)
User
.
block
(
blocker
,
blocked
)
{
:ok
,
activity
}
else
_e
->
:error
end
end
def
handle_incoming
(
%{
"type"
=>
"Undo"
,
...
...
@@ -828,7 +794,7 @@ def handle_incoming(
}
=
data
,
_options
)
when
type
in
[
"Like"
,
"EmojiReact"
,
"Announce"
]
do
when
type
in
[
"Like"
,
"EmojiReact"
,
"Announce"
,
"Block"
]
do
with
{
:ok
,
activity
,
_
}
<-
Pipeline
.
common_pipeline
(
data
,
local:
false
)
do
{
:ok
,
activity
}
end
...
...
@@ -852,6 +818,21 @@ def handle_incoming(
end
end
def
handle_incoming
(
%{
"type"
=>
"Block"
,
"object"
=>
blocked
,
"actor"
=>
blocker
,
"id"
=>
id
}
=
_data
,
_options
)
do
with
%
User
{
local:
true
}
=
blocked
=
User
.
get_cached_by_ap_id
(
blocked
),
{
:ok
,
%
User
{}
=
blocker
}
=
User
.
get_or_fetch_by_ap_id
(
blocker
),
{
:ok
,
activity
}
<-
ActivityPub
.
block
(
blocker
,
blocked
,
id
,
false
)
do
User
.
unfollow
(
blocker
,
blocked
)
User
.
block
(
blocker
,
blocked
)
{
:ok
,
activity
}
else
_e
->
:error
end
end
def
handle_incoming
(
%{
"type"
=>
"Move"
,
...
...
lib/pleroma/web/activity_pub/utils.ex
View file @
92caae59
...
...
@@ -562,45 +562,6 @@ def make_announce_data(
|>
maybe_put
(
"id"
,
activity_id
)
end
@doc
"""
Make unannounce activity data for the given actor and object
"""
def
make_unannounce_data
(
%
User
{
ap_id:
ap_id
}
=
user
,
%
Activity
{
data:
%{
"context"
=>
context
,
"object"
=>
object
}}
=
activity
,
activity_id
)
do
object
=
Object
.
normalize
(
object
)
%{
"type"
=>
"Undo"
,
"actor"
=>
ap_id
,
"object"
=>
activity
.
data
,
"to"
=>
[
user
.
follower_address
,
object
.
data
[
"actor"
]],
"cc"
=>
[
Pleroma
.
Constants
.
as_public
()],
"context"
=>
context
}
|>
maybe_put
(
"id"
,
activity_id
)
end
def
make_unlike_data
(
%
User
{
ap_id:
ap_id
}
=
user
,
%
Activity
{
data:
%{
"context"
=>
context
,
"object"
=>
object
}}
=
activity
,
activity_id
)
do
object
=
Object
.
normalize
(
object
)
%{
"type"
=>
"Undo"
,
"actor"
=>
ap_id
,
"object"
=>
activity
.
data
,
"to"
=>
[
user
.
follower_address
,
object
.
data
[
"actor"
]],
"cc"
=>
[
Pleroma
.
Constants
.
as_public
()],
"context"
=>
context
}
|>
maybe_put
(
"id"
,
activity_id
)
end
def
make_undo_data
(
%
User
{
ap_id:
actor
,
follower_address:
follower_address
},
%
Activity
{
...
...
@@ -688,16 +649,6 @@ def make_block_data(blocker, blocked, activity_id) do
|>
maybe_put
(
"id"
,
activity_id
)
end
def
make_unblock_data
(
blocker
,
blocked
,
block_activity
,
activity_id
)
do
%{
"type"
=>
"Undo"
,
"actor"
=>
blocker
.
ap_id
,
"to"
=>
[
blocked
.
ap_id
],
"object"
=>
block_activity
.
data
}
|>
maybe_put
(
"id"
,
activity_id
)
end
#### Create-related helpers
def
make_create_data
(
params
,
additional
)
do
...
...
lib/pleroma/web/common_api/common_api.ex
View file @
92caae59
...
...
@@ -24,6 +24,14 @@ defmodule Pleroma.Web.CommonAPI do
require
Pleroma
.
Constants
require
Logger
def
unblock
(
blocker
,
blocked
)
do
with
%
Activity
{}
=
block
<-
Utils
.
fetch_latest_block
(
blocker
,
blocked
),
{
:ok
,
unblock_data
,
_
}
<-
Builder
.
undo
(
blocker
,
block
),
{
:ok
,
unblock
,
_
}
<-
Pipeline
.
common_pipeline
(
unblock_data
,
local:
true
)
do
{
:ok
,
unblock
}
end
end
def
follow
(
follower
,
followed
)
do
timeout
=
Pleroma
.
Config
.
get
([
:activitypub
,
:follow_handshake_timeout
])
...
...
lib/pleroma/web/mastodon_api/controllers/account_controller.ex
View file @
92caae59
...
...
@@ -356,8 +356,7 @@ def block(%{assigns: %{user: blocker, account: blocked}} = conn, _params) do
@doc
"POST /api/v1/accounts/:id/unblock"
def
unblock
(%{
assigns:
%{
user:
blocker
,
account:
blocked
}}
=
conn
,
_params
)
do
with
{
:ok
,
_user_block
}
<-
User
.
unblock
(
blocker
,
blocked
),
{
:ok
,
_activity
}
<-
ActivityPub
.
unblock
(
blocker
,
blocked
)
do
with
{
:ok
,
_activity
}
<-
CommonAPI
.
unblock
(
blocker
,
blocked
)
do
render
(
conn
,
"relationship.json"
,
user:
blocker
,
target:
blocked
)
else
{
:error
,
message
}
->
json_response
(
conn
,
:forbidden
,
%{
error:
message
})
...
...
test/web/activity_pub/activity_pub_test.exs
View file @
92caae59
...
...
@@ -1114,7 +1114,7 @@ test "creates an undo activity for a pending follow request" do
end
end
describe
"blocking
/ unblocking
"
do
describe
"blocking"
do
test
"reverts block activity on error"
do
[
blocker
,
blocked
]
=
insert_list
(
2
,
:user
)
...
...
@@ -1136,38 +1136,6 @@ test "creates a block activity" do
assert
activity
.
data
[
"actor"
]
==
blocker
.
ap_id
assert
activity
.
data
[
"object"
]
==
blocked
.
ap_id
end
test
"reverts unblock activity on error"
do
[
blocker
,
blocked
]
=
insert_list
(
2
,
:user
)
{
:ok
,
block_activity
}
=
ActivityPub
.
block
(
blocker
,
blocked
)
with_mock
(
Utils
,
[
:passthrough
],
maybe_federate:
fn
_
->
{
:error
,
:reverted
}
end
)
do
assert
{
:error
,
:reverted
}
=
ActivityPub
.
unblock
(
blocker
,
blocked
)
end
assert
block_activity
.
data
[
"type"
]
==
"Block"
assert
block_activity
.
data
[
"actor"
]
==
blocker
.
ap_id
assert
Repo
.
aggregate
(
Activity
,
:count
,
:id
)
==
1
assert
Repo
.
aggregate
(
Object
,
:count
,
:id
)
==
1
end
test
"creates an undo activity for the last block"
do
blocker
=
insert
(
:user
)
blocked
=
insert
(
:user
)
{
:ok
,
block_activity
}
=
ActivityPub
.
block
(
blocker
,
blocked
)
{
:ok
,
activity
}
=
ActivityPub
.
unblock
(
blocker
,
blocked
)
assert
activity
.
data
[
"type"
]
==
"Undo"
assert
activity
.
data
[
"actor"
]
==
blocker
.
ap_id
embedded_object
=
activity
.
data
[
"object"
]
assert
is_map
(
embedded_object
)
assert
embedded_object
[
"type"
]
==
"Block"
assert
embedded_object
[
"object"
]
==
blocked
.
ap_id
assert
embedded_object
[
"id"
]
==
block_activity
.
data
[
"id"
]
end
end
describe
"deletion"
do
...
...
test/web/activity_pub/side_effects_test.exs
View file @
92caae59
...
...
@@ -9,6 +9,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
alias
Pleroma
.
Notification
alias
Pleroma
.
Object
alias
Pleroma
.
Repo
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
alias
Pleroma
.
Web
.
ActivityPub
.
Builder
alias
Pleroma
.
Web
.
ActivityPub
.
SideEffects
...
...
@@ -24,6 +25,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
{
:ok
,
like
}
=
CommonAPI
.
favorite
(
user
,
post
.
id
)
{
:ok
,
reaction
,
_
}
=
CommonAPI
.
react_with_emoji
(
post
.
id
,
user
,
"👍"
)
{
:ok
,
announce
,
_
}
=
CommonAPI
.
repeat
(
post
.
id
,
user
)
{
:ok
,
block
}
=
ActivityPub
.
block
(
user
,
poster
)
User
.
block
(
user
,
poster
)
{
:ok
,
undo_data
,
_meta
}
=
Builder
.
undo
(
user
,
like
)
{
:ok
,
like_undo
,
_meta
}
=
ActivityPub
.
persist
(
undo_data
,
local:
true
)
...
...
@@ -34,6 +37,9 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
{
:ok
,
undo_data
,
_meta
}
=
Builder
.
undo
(
user
,
announce
)
{
:ok
,
announce_undo
,
_meta
}
=
ActivityPub
.
persist
(
undo_data
,
local:
true
)
{
:ok
,
undo_data
,
_meta
}
=
Builder
.
undo
(
user
,
block
)
{
:ok
,
block_undo
,
_meta
}
=
ActivityPub
.
persist
(
undo_data
,
local:
true
)
%{
like_undo:
like_undo
,
post:
post
,
...
...
@@ -41,10 +47,27 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
reaction_undo:
reaction_undo
,
reaction:
reaction
,
announce_undo:
announce_undo
,
announce:
announce
announce:
announce
,
block_undo:
block_undo
,
block:
block
,
poster:
poster
,
user:
user
}
end
test
"deletes the original block"
,
%{
block_undo:
block_undo
,
block:
block
}
do
{
:ok
,
_block_undo
,
_
}
=
SideEffects
.
handle
(
block_undo
)
refute
Activity
.
get_by_id
(
block
.
id
)
end
test
"unblocks the blocked user"
,
%{
block_undo:
block_undo
,
block:
block
}
do
blocker
=
User
.
get_by_ap_id
(
block
.
data
[
"actor"
])
blocked
=
User
.
get_by_ap_id
(
block
.
data
[
"object"
])
{
:ok
,
_block_undo
,
_
}
=
SideEffects
.
handle
(
block_undo
)
refute
User
.
blocks?
(
blocker
,
blocked
)
end
test
"an announce undo removes the announce from the object"
,
%{
announce_undo:
announce_undo
,
post:
post
...
...
test/web/activity_pub/transmogrifier/undo_handling_test.exs
View file @
92caae59
...
...
@@ -176,9 +176,7 @@ test "it works for incoming unblocks with an existing block" do
{
:ok
,
%
Activity
{
data:
data
,
local:
false
}}
=
Transmogrifier
.
handle_incoming
(
data
)
assert
data
[
"type"
]
==
"Undo"
assert
data
[
"object"
][
"type"
]
==
"Block"
assert
data
[
"object"
][
"object"
]
==
user
.
ap_id
assert
data
[
"actor"
]
==
"http://mastodon.example.org/users/admin"
assert
data
[
"object"
]
==
block_data
[
"id"
]
blocker
=
User
.
get_cached_by_ap_id
(
data
[
"actor"
])
...
...
test/web/activity_pub/utils_test.exs
View file @
92caae59
...
...
@@ -102,34 +102,6 @@ test "works with an object has tags as map" do
end
end
describe
"make_unlike_data/3"
do
test
"returns data for unlike activity"
do
user
=
insert
(
:user
)
like_activity
=
insert
(
:like_activity
,
data_attrs:
%{
"context"
=>
"test context"
})
object
=
Object
.
normalize
(
like_activity
.
data
[
"object"
])
assert
Utils
.
make_unlike_data
(
user
,
like_activity
,
nil
)
==
%{
"type"
=>
"Undo"
,
"actor"
=>
user
.
ap_id
,
"object"
=>
like_activity
.
data
,
"to"
=>
[
user
.
follower_address
,
object
.
data
[
"actor"
]],
"cc"
=>
[
Pleroma
.
Constants
.
as_public
()],
"context"
=>
like_activity
.
data
[
"context"
]
}
assert
Utils
.
make_unlike_data
(
user
,
like_activity
,
"9mJEZK0tky1w2xD2vY"
)
==
%{
"type"
=>
"Undo"
,
"actor"
=>
user
.
ap_id
,
"object"
=>
like_activity
.
data
,
"to"
=>
[
user
.
follower_address
,
object
.
data
[
"actor"
]],
"cc"
=>
[
Pleroma
.
Constants
.
as_public
()],
"context"
=>
like_activity
.
data
[
"context"
],
"id"
=>
"9mJEZK0tky1w2xD2vY"
}
end
end
describe
"make_like_data"
do
setup
do
user
=
insert
(
:user
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment