2018-12-23 20:11:29 +00:00
# Pleroma: A lightweight social networking server
2021-01-13 06:49:20 +00:00
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
2018-12-23 20:11:29 +00:00
# SPDX-License-Identifier: AGPL-3.0-only
2017-04-18 16:41:51 +00:00
defmodule Pleroma.Web.OStatus.OStatusControllerTest do
2023-08-01 10:43:50 +00:00
use Pleroma.Web.ConnCase , async : false
2019-07-20 13:07:51 +00:00
2017-04-18 16:41:51 +00:00
import Pleroma.Factory
2019-07-20 13:07:51 +00:00
2019-02-10 21:57:38 +00:00
alias Pleroma.Object
2019-03-05 02:52:23 +00:00
alias Pleroma.User
2020-05-22 14:47:22 +00:00
alias Pleroma.Web.ActivityPub.ActivityPub
2018-11-17 22:10:15 +00:00
alias Pleroma.Web.CommonAPI
2020-05-22 14:47:22 +00:00
alias Pleroma.Web.Endpoint
require Pleroma.Constants
2018-12-03 18:37:55 +00:00
2018-12-04 11:01:39 +00:00
setup_all do
Tesla.Mock . mock_global ( fn env -> apply ( HttpRequestMock , :request , [ env ] ) end )
2018-12-03 18:37:55 +00:00
:ok
end
2017-04-18 16:41:51 +00:00
2020-10-02 19:18:02 +00:00
setup do : clear_config ( [ :static_fe , :enabled ] , false )
2019-08-19 15:34:29 +00:00
2020-05-22 14:47:22 +00:00
describe " Mastodon compatibility routes " do
setup %{ conn : conn } do
conn = put_req_header ( conn , " accept " , " text/html " )
{ :ok , object } =
%{
" type " = > " Note " ,
" content " = > " hey " ,
" id " = > Endpoint . url ( ) <> " /users/raymoo/statuses/999999999 " ,
" actor " = > Endpoint . url ( ) <> " /users/raymoo " ,
" to " = > [ Pleroma.Constants . as_public ( ) ]
}
|> Object . create ( )
{ :ok , activity , _ } =
%{
2020-05-22 15:06:12 +00:00
" id " = > object . data [ " id " ] <> " /activity " ,
2020-05-22 14:47:22 +00:00
" type " = > " Create " ,
" object " = > object . data [ " id " ] ,
" actor " = > object . data [ " actor " ] ,
" to " = > object . data [ " to " ]
}
|> ActivityPub . persist ( local : true )
2020-05-22 15:11:59 +00:00
%{ conn : conn , activity : activity }
end
test " redirects to /notice/:id for html format " , %{ conn : conn , activity : activity } do
2020-05-22 14:47:22 +00:00
conn = get ( conn , " /users/raymoo/statuses/999999999 " )
assert redirected_to ( conn ) == " /notice/ #{ activity . id } "
end
2020-05-22 15:11:59 +00:00
test " redirects to /notice/:id for html format for activity " , %{
conn : conn ,
activity : activity
} do
conn = get ( conn , " /users/raymoo/statuses/999999999/activity " )
assert redirected_to ( conn ) == " /notice/ #{ activity . id } "
end
2020-05-22 14:47:22 +00:00
end
2020-03-09 17:51:44 +00:00
# Note: see ActivityPubControllerTest for JSON format tests
describe " GET /objects/:uuid (text/html) " do
setup %{ conn : conn } do
conn = put_req_header ( conn , " accept " , " text/html " )
%{ conn : conn }
end
2019-07-29 05:02:20 +00:00
test " redirects to /notice/id for html format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
2021-01-04 12:38:31 +00:00
object = Object . normalize ( note_activity , fetch : false )
2019-07-29 05:02:20 +00:00
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
url = " /objects/ #{ uuid } "
2020-03-09 17:51:44 +00:00
conn = get ( conn , url )
2019-07-29 05:02:20 +00:00
assert redirected_to ( conn ) == " /notice/ #{ note_activity . id } "
end
test " 404s on private objects " , %{ conn : conn } do
note_activity = insert ( :direct_note_activity )
2021-01-04 12:38:31 +00:00
object = Object . normalize ( note_activity , fetch : false )
2019-07-29 05:02:20 +00:00
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
conn
|> get ( " /objects/ #{ uuid } " )
|> response ( 404 )
end
2020-03-09 17:51:44 +00:00
test " 404s on non-existing objects " , %{ conn : conn } do
2019-07-29 05:02:20 +00:00
conn
|> get ( " /objects/123 " )
|> response ( 404 )
end
end
2020-03-09 17:51:44 +00:00
# Note: see ActivityPubControllerTest for JSON format tests
describe " GET /activities/:uuid (text/html) " do
setup %{ conn : conn } do
conn = put_req_header ( conn , " accept " , " text/html " )
%{ conn : conn }
end
2019-07-29 05:02:20 +00:00
test " redirects to /notice/id for html format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , note_activity . data [ " id " ] ) )
2017-05-19 13:53:02 +00:00
2020-03-09 17:51:44 +00:00
conn = get ( conn , " /activities/ #{ uuid } " )
2019-07-29 05:02:20 +00:00
assert redirected_to ( conn ) == " /notice/ #{ note_activity . id } "
end
2018-05-30 18:00:27 +00:00
2019-07-29 05:02:20 +00:00
test " 404s on private activities " , %{ conn : conn } do
note_activity = insert ( :direct_note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , note_activity . data [ " id " ] ) )
2018-12-25 20:40:57 +00:00
2019-07-29 05:02:20 +00:00
conn
|> get ( " /activities/ #{ uuid } " )
|> response ( 404 )
end
2018-05-30 18:00:27 +00:00
2019-07-29 05:02:20 +00:00
test " 404s on nonexistent activities " , %{ conn : conn } do
conn
|> get ( " /activities/123 " )
|> response ( 404 )
end
2017-11-27 16:24:52 +00:00
end
2018-05-30 18:00:27 +00:00
2019-07-29 05:02:20 +00:00
describe " GET notice/2 " do
2019-11-25 14:55:17 +00:00
test " redirects to a proper object URL when json requested and the object is local " , %{
conn : conn
} do
2019-07-29 05:02:20 +00:00
note_activity = insert ( :note_activity )
2021-01-04 12:38:31 +00:00
expected_redirect_url = Object . normalize ( note_activity , fetch : false ) . data [ " id " ]
2018-07-12 20:32:05 +00:00
2019-11-25 14:55:17 +00:00
redirect_url =
conn
|> put_req_header ( " accept " , " application/activity+json " )
|> get ( " /notice/ #{ note_activity . id } " )
|> redirected_to ( )
assert redirect_url == expected_redirect_url
2019-07-29 05:02:20 +00:00
end
2018-07-12 20:32:05 +00:00
2021-02-03 16:53:09 +00:00
test " redirects to a proper object URL when json requested and the object is remote " , %{
conn : conn
} do
2019-11-25 14:55:17 +00:00
note_activity = insert ( :note_activity , local : false )
2021-02-03 16:53:09 +00:00
expected_redirect_url = Object . normalize ( note_activity , fetch : false ) . data [ " id " ]
2018-11-17 22:10:15 +00:00
2021-02-03 16:53:09 +00:00
redirect_url =
conn
|> put_req_header ( " accept " , " application/activity+json " )
|> get ( " /notice/ #{ note_activity . id } " )
|> redirected_to ( )
assert redirect_url == expected_redirect_url
2019-07-29 05:02:20 +00:00
end
2018-11-17 22:10:15 +00:00
2019-07-29 05:02:20 +00:00
test " 500s when actor not found " , %{ conn : conn } do
note_activity = insert ( :note_activity )
user = User . get_cached_by_ap_id ( note_activity . data [ " actor " ] )
User . invalidate_cache ( user )
Pleroma.Repo . delete ( user )
2018-11-17 22:10:15 +00:00
2019-07-29 05:02:20 +00:00
conn =
conn
|> get ( " /notice/ #{ note_activity . id } " )
2018-11-17 22:10:15 +00:00
2019-07-29 05:02:20 +00:00
assert response ( conn , 500 ) == ~S( {"error":"Something went wrong"} )
end
2018-11-17 22:10:15 +00:00
2019-07-29 05:02:20 +00:00
test " render html for redirect for html format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
resp =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /notice/ #{ note_activity . id } " )
|> response ( 200 )
assert resp =~
2021-05-31 20:09:11 +00:00
" <meta content= \" #{ Pleroma.Web.Endpoint . url ( ) } /notice/ #{ note_activity . id } \" property= \" og:url \" > "
2019-07-29 05:02:20 +00:00
user = insert ( :user )
2019-10-16 14:16:39 +00:00
{ :ok , like_activity } = CommonAPI . favorite ( user , note_activity . id )
2019-07-29 05:02:20 +00:00
assert like_activity . data [ " type " ] == " Like "
resp =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /notice/ #{ like_activity . id } " )
|> response ( 200 )
assert resp =~ " <!--server-generated-meta--> "
end
test " 404s a private notice " , %{ conn : conn } do
note_activity = insert ( :direct_note_activity )
url = " /notice/ #{ note_activity . id } "
conn =
conn
|> get ( url )
assert response ( conn , 404 )
end
2020-03-09 17:51:44 +00:00
test " 404s a non-existing notice " , %{ conn : conn } do
2019-07-29 05:02:20 +00:00
url = " /notice/123 "
2018-07-12 20:32:05 +00:00
2019-07-29 05:02:20 +00:00
conn =
conn
|> get ( url )
assert response ( conn , 404 )
end
2020-03-09 17:51:44 +00:00
2020-10-02 19:18:02 +00:00
test " does not require authentication on non-federating instances " , %{
2020-03-09 17:51:44 +00:00
conn : conn
} do
2020-10-02 19:18:02 +00:00
clear_config ( [ :instance , :federating ] , false )
2020-03-09 17:51:44 +00:00
note_activity = insert ( :note_activity )
2020-10-02 19:18:02 +00:00
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /notice/ #{ note_activity . id } " )
|> response ( 200 )
2020-03-09 17:51:44 +00:00
end
2018-07-12 20:32:05 +00:00
end
2019-07-29 05:02:20 +00:00
describe " GET /notice/:id/embed_player " do
2020-03-09 17:51:44 +00:00
setup do
2019-07-29 05:02:20 +00:00
note_activity = insert ( :note_activity )
2021-01-04 12:38:31 +00:00
object = Pleroma.Object . normalize ( note_activity , fetch : false )
2019-07-29 05:02:20 +00:00
object_data =
Map . put ( object . data , " attachment " , [
%{
" url " = > [
%{
" href " = >
" https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4 " ,
" mediaType " = > " video/mp4 " ,
" type " = > " Link "
}
]
}
] )
object
|> Ecto.Changeset . change ( data : object_data )
|> Pleroma.Repo . update ( )
2020-03-09 17:51:44 +00:00
%{ note_activity : note_activity }
end
test " renders embed player " , %{ conn : conn , note_activity : note_activity } do
conn = get ( conn , " /notice/ #{ note_activity . id } /embed_player " )
2019-07-29 05:02:20 +00:00
assert Plug.Conn . get_resp_header ( conn , " x-frame-options " ) == [ " ALLOW " ]
assert Plug.Conn . get_resp_header (
conn ,
" content-security-policy "
) == [
" default-src 'none';style-src 'self' 'unsafe-inline';img-src 'self' data: https:; media-src 'self' https:; "
]
assert response ( conn , 200 ) =~
" <video controls loop><source src= \" https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4 \" type= \" video/mp4 \" >Your browser does not support video/mp4 playback.</video> "
end
2018-06-03 19:04:44 +00:00
2019-07-29 05:02:20 +00:00
test " 404s when activity isn't create " , %{ conn : conn } do
note_activity = insert ( :note_activity , data_attrs : %{ " type " = > " Like " } )
2018-06-03 19:04:44 +00:00
2019-07-29 05:02:20 +00:00
assert conn
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
|> response ( 404 )
end
test " 404s when activity is direct message " , %{ conn : conn } do
note_activity = insert ( :note_activity , data_attrs : %{ " directMessage " = > true } )
assert conn
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
|> response ( 404 )
end
test " 404s when attachment is empty " , %{ conn : conn } do
note_activity = insert ( :note_activity )
2021-01-04 12:38:31 +00:00
object = Pleroma.Object . normalize ( note_activity , fetch : false )
2019-07-29 05:02:20 +00:00
object_data = Map . put ( object . data , " attachment " , [ ] )
object
|> Ecto.Changeset . change ( data : object_data )
|> Pleroma.Repo . update ( )
assert conn
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
|> response ( 404 )
end
test " 404s when attachment isn't audio or video " , %{ conn : conn } do
note_activity = insert ( :note_activity )
2021-01-04 12:38:31 +00:00
object = Pleroma.Object . normalize ( note_activity , fetch : false )
2019-07-29 05:02:20 +00:00
object_data =
Map . put ( object . data , " attachment " , [
%{
" url " = > [
%{
" href " = > " https://peertube.moe/static/webseed/480.jpg " ,
" mediaType " = > " image/jpg " ,
" type " = > " Link "
}
]
}
] )
object
|> Ecto.Changeset . change ( data : object_data )
|> Pleroma.Repo . update ( )
2020-03-09 17:51:44 +00:00
conn
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
|> response ( 404 )
2020-03-02 19:02:21 +00:00
end
2020-10-02 19:18:02 +00:00
test " does not require authentication on non-federating instances " , %{
2020-03-09 17:51:44 +00:00
conn : conn ,
note_activity : note_activity
} do
2020-10-02 19:18:02 +00:00
clear_config ( [ :instance , :federating ] , false )
2020-03-02 19:02:21 +00:00
2020-10-02 19:18:02 +00:00
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
|> response ( 200 )
2020-03-02 19:02:21 +00:00
end
end
2021-05-05 18:58:50 +00:00
describe " notice compatibility routes " do
test " Soapbox FE " , %{ conn : conn } do
user = insert ( :user )
note_activity = insert ( :note_activity , user : user )
resp =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /@ #{ user . nickname } /posts/ #{ note_activity . id } " )
|> response ( 200 )
expected =
2021-12-26 02:11:14 +00:00
" <meta content= \" #{ Endpoint . url ( ) } /notice/ #{ note_activity . id } \" property= \" og:url \" > "
2021-05-05 18:58:50 +00:00
assert resp =~ expected
end
test " Mastodon " , %{ conn : conn } do
user = insert ( :user )
note_activity = insert ( :note_activity , user : user )
resp =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /@ #{ user . nickname } / #{ note_activity . id } " )
|> response ( 200 )
expected =
2021-12-26 02:11:14 +00:00
" <meta content= \" #{ Endpoint . url ( ) } /notice/ #{ note_activity . id } \" property= \" og:url \" > "
2021-05-05 18:58:50 +00:00
assert resp =~ expected
end
test " Twitter " , %{ conn : conn } do
user = insert ( :user )
note_activity = insert ( :note_activity , user : user )
resp =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " / #{ user . nickname } /status/ #{ note_activity . id } " )
|> response ( 200 )
expected =
2021-12-26 02:11:14 +00:00
" <meta content= \" #{ Endpoint . url ( ) } /notice/ #{ note_activity . id } \" property= \" og:url \" > "
2021-05-05 18:58:50 +00:00
assert resp =~ expected
end
end
2017-04-18 16:41:51 +00:00
end