Skip to content
GitLab
Menu
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
6d6f48d0
Commit
6d6f48d0
authored
Mar 16, 2019
by
kaniini
Browse files
Merge branch 'feature/federated-flags' into 'develop'
Federated reports See merge request
!935
parents
28df3974
423fd079
Pipeline
#9068
passed with stages
in 4 minutes and 19 seconds
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/web/activity_pub/activity_pub.ex
View file @
6d6f48d0
...
...
@@ -370,20 +370,38 @@ def flag(
content:
content
}
=
params
)
do
additional
=
params
[
:additional
]
||
%{}
# only accept false as false value
local
=
!
(
params
[
:local
]
==
false
)
forward
=
!
(
params
[
:forward
]
==
false
)
additional
=
params
[
:additional
]
||
%{}
%{
params
=
%{
actor:
actor
,
context:
context
,
account:
account
,
statuses:
statuses
,
content:
content
}
|>
make_flag_data
(
additional
)
|>
insert
(
local
)
additional
=
if
forward
do
Map
.
merge
(
additional
,
%{
"to"
=>
[],
"cc"
=>
[
account
.
ap_id
]})
else
Map
.
merge
(
additional
,
%{
"to"
=>
[],
"cc"
=>
[]})
end
with
flag_data
<-
make_flag_data
(
params
,
additional
),
{
:ok
,
activity
}
<-
insert
(
flag_data
,
local
),
:ok
<-
maybe_federate
(
activity
)
do
Enum
.
each
(
User
.
all_superusers
(),
fn
superuser
->
superuser
|>
Pleroma
.
AdminEmail
.
report
(
actor
,
account
,
statuses
,
content
)
|>
Pleroma
.
Mailer
.
deliver_async
()
end
)
{
:ok
,
activity
}
end
end
def
fetch_activities_for_context
(
context
,
opts
\\
%{})
do
...
...
lib/pleroma/web/activity_pub/transmogrifier.ex
View file @
6d6f48d0
...
...
@@ -355,6 +355,40 @@ defp get_follow_activity(follow_object, followed) do
end
end
# Flag objects are placed ahead of the ID check because Mastodon 2.8 and earlier send them
# with nil ID.
def
handle_incoming
(%{
"type"
=>
"Flag"
,
"object"
=>
objects
,
"actor"
=>
actor
}
=
data
)
do
with
context
<-
data
[
"context"
]
||
Utils
.
generate_context_id
(),
content
<-
data
[
"content"
]
||
""
,
%
User
{}
=
actor
<-
User
.
get_cached_by_ap_id
(
actor
),
# Reduce the object list to find the reported user.
%
User
{}
=
account
<-
Enum
.
reduce_while
(
objects
,
nil
,
fn
ap_id
,
_
->
with
%
User
{}
=
user
<-
User
.
get_cached_by_ap_id
(
ap_id
)
do
{
:halt
,
user
}
else
_
->
{
:cont
,
nil
}
end
end
),
# Remove the reported user from the object list.
statuses
<-
Enum
.
filter
(
objects
,
fn
ap_id
->
ap_id
!=
account
.
ap_id
end
)
do
params
=
%{
actor:
actor
,
context:
context
,
account:
account
,
statuses:
statuses
,
content:
content
,
additional:
%{
"cc"
=>
[
account
.
ap_id
]
}
}
ActivityPub
.
flag
(
params
)
end
end
# disallow objects with bogus IDs
def
handle_incoming
(%{
"id"
=>
nil
}),
do
:
:error
def
handle_incoming
(%{
"id"
=>
""
}),
do
:
:error
...
...
lib/pleroma/web/activity_pub/utils.ex
View file @
6d6f48d0
...
...
@@ -621,7 +621,13 @@ def make_create_data(params, additional) do
#### Flag-related helpers
def
make_flag_data
(
params
,
additional
)
do
status_ap_ids
=
Enum
.
map
(
params
.
statuses
||
[],
&
&1
.
data
[
"id"
])
status_ap_ids
=
Enum
.
map
(
params
.
statuses
||
[],
fn
%
Activity
{}
=
act
->
act
.
data
[
"id"
]
act
when
is_map
(
act
)
->
act
[
"id"
]
act
when
is_binary
(
act
)
->
act
end
)
object
=
[
params
.
account
.
ap_id
]
++
status_ap_ids
%{
...
...
lib/pleroma/web/common_api/common_api.ex
View file @
6d6f48d0
...
...
@@ -284,14 +284,9 @@ def report(user, data) do
actor:
user
,
account:
account
,
statuses:
statuses
,
content:
content_html
content:
content_html
,
forward:
data
[
"forward"
]
||
false
})
do
Enum
.
each
(
User
.
all_superusers
(),
fn
superuser
->
superuser
|>
Pleroma
.
AdminEmail
.
report
(
user
,
account
,
statuses
,
content_html
)
|>
Pleroma
.
Mailer
.
deliver_async
()
end
)
{
:ok
,
activity
}
else
{
:error
,
err
}
->
{
:error
,
err
}
...
...
test/web/activity_pub/transmogrifier_test.exs
View file @
6d6f48d0
...
...
@@ -5,6 +5,7 @@
defmodule
Pleroma
.
Web
.
ActivityPub
.
TransmogrifierTest
do
use
Pleroma
.
DataCase
alias
Pleroma
.
Activity
alias
Pleroma
.
Object
alias
Pleroma
.
Repo
alias
Pleroma
.
User
alias
Pleroma
.
Web
.
ActivityPub
.
ActivityPub
...
...
@@ -764,6 +765,30 @@ test "it remaps video URLs as attachments if necessary" do
assert
object
.
data
[
"attachment"
]
==
[
attachment
]
end
test
"it accepts Flag activities"
do
user
=
insert
(
:user
)
other_user
=
insert
(
:user
)
{
:ok
,
activity
}
=
CommonAPI
.
post
(
user
,
%{
"status"
=>
"test post"
})
object
=
Object
.
normalize
(
activity
.
data
[
"object"
])
message
=
%{
"@context"
=>
"https://www.w3.org/ns/activitystreams"
,
"cc"
=>
[
user
.
ap_id
],
"object"
=>
[
user
.
ap_id
,
object
.
data
[
"id"
]],
"type"
=>
"Flag"
,
"content"
=>
"blocked AND reported!!!"
,
"actor"
=>
other_user
.
ap_id
}
assert
{
:ok
,
activity
}
=
Transmogrifier
.
handle_incoming
(
message
)
assert
activity
.
data
[
"object"
]
==
[
user
.
ap_id
,
object
.
data
[
"id"
]]
assert
activity
.
data
[
"content"
]
==
"blocked AND reported!!!"
assert
activity
.
data
[
"actor"
]
==
other_user
.
ap_id
assert
activity
.
data
[
"cc"
]
==
[
user
.
ap_id
]
end
end
describe
"prepare outgoing"
do
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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