2018-12-23 12:11:29 -08:00
# Pleroma: A lightweight social networking server
2019-09-18 14:20:54 -07:00
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
2018-12-23 12:11:29 -08:00
# SPDX-License-Identifier: AGPL-3.0-only
2017-04-18 09:41:51 -07:00
defmodule Pleroma.Web.OStatus.OStatusControllerTest do
use Pleroma.Web.ConnCase
2019-07-20 06:07:51 -07:00
import ExUnit.CaptureLog
2017-04-18 09:41:51 -07:00
import Pleroma.Factory
2019-07-20 06:07:51 -07:00
2019-02-10 13:57:38 -08:00
alias Pleroma.Object
2019-03-04 18:52:23 -08:00
alias Pleroma.User
2018-11-17 14:10:15 -08:00
alias Pleroma.Web.CommonAPI
2017-05-19 06:53:02 -07:00
alias Pleroma.Web.OStatus.ActivityRepresenter
2018-12-03 10:37:55 -08:00
2018-12-04 03:01:39 -08:00
setup_all do
Tesla.Mock . mock_global ( fn env -> apply ( HttpRequestMock , :request , [ env ] ) end )
2018-12-03 10:37:55 -08:00
:ok
end
2017-04-18 09:41:51 -07:00
2019-08-19 08:34:29 -07:00
clear_config_all ( [ :instance , :federating ] ) do
Pleroma.Config . put ( [ :instance , :federating ] , true )
end
2019-01-25 09:38:54 -08:00
describe " salmon_incoming " do
test " decodes a salmon " , %{ conn : conn } do
user = insert ( :user )
salmon = File . read! ( " test/fixtures/salmon.xml " )
2018-03-30 06:01:53 -07:00
2019-07-20 06:07:51 -07:00
assert capture_log ( fn ->
conn =
conn
|> put_req_header ( " content-type " , " application/atom+xml " )
|> post ( " /users/ #{ user . nickname } /salmon " , salmon )
2017-11-08 23:32:54 -08:00
2019-07-20 06:07:51 -07:00
assert response ( conn , 200 )
end ) =~ " [error] "
2019-01-25 09:38:54 -08:00
end
2017-11-08 23:32:54 -08:00
2019-01-25 09:38:54 -08:00
test " decodes a salmon with a changed magic key " , %{ conn : conn } do
user = insert ( :user )
salmon = File . read! ( " test/fixtures/salmon.xml " )
2018-03-30 06:01:53 -07:00
2019-07-20 06:07:51 -07:00
assert capture_log ( fn ->
conn =
conn
|> put_req_header ( " content-type " , " application/atom+xml " )
|> post ( " /users/ #{ user . nickname } /salmon " , salmon )
2017-11-08 23:32:54 -08:00
2019-07-20 06:07:51 -07:00
assert response ( conn , 200 )
end ) =~ " [error] "
2017-11-08 23:32:54 -08:00
2019-01-25 09:38:54 -08:00
# Wrong key
2019-10-16 11:59:21 -07:00
update_params = %{
2019-09-24 05:50:07 -07:00
magic_key :
" RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwrong1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB "
}
2018-11-27 09:21:05 -08:00
2019-09-24 05:50:07 -07:00
# Set a wrong magic-key for a user so it has to refetch
" http://gs.example.org:4040/index.php/user/1 "
|> User . get_cached_by_ap_id ( )
2019-10-16 11:59:21 -07:00
|> User . update_changeset ( update_params )
|> User . update_and_set_cache ( )
2017-11-08 23:32:54 -08:00
2019-07-20 06:07:51 -07:00
assert capture_log ( fn ->
conn =
build_conn ( )
|> put_req_header ( " content-type " , " application/atom+xml " )
|> post ( " /users/ #{ user . nickname } /salmon " , salmon )
2019-01-25 09:38:54 -08:00
2019-07-20 06:07:51 -07:00
assert response ( conn , 200 )
end ) =~ " [error] "
2019-01-25 09:38:54 -08:00
end
2017-11-08 23:32:54 -08:00
end
2019-07-28 22:02:20 -07:00
describe " GET object/2 " do
test " gets an object " , %{ conn : conn } do
note_activity = insert ( :note_activity )
object = Object . normalize ( note_activity )
user = User . get_cached_by_ap_id ( note_activity . data [ " actor " ] )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
url = " /objects/ #{ uuid } "
conn =
conn
|> put_req_header ( " accept " , " application/xml " )
|> get ( url )
expected =
ActivityRepresenter . to_simple_form ( note_activity , user , true )
|> ActivityRepresenter . wrap_with_entry ( )
|> :xmerl . export_simple ( :xmerl_xml )
|> to_string
assert response ( conn , 200 ) == expected
end
test " redirects to /notice/id for html format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
object = Object . normalize ( note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
url = " /objects/ #{ uuid } "
conn =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( url )
assert redirected_to ( conn ) == " /notice/ #{ note_activity . id } "
end
test " 500s when user not found " , %{ conn : conn } do
note_activity = insert ( :note_activity )
object = Object . normalize ( note_activity )
user = User . get_cached_by_ap_id ( note_activity . data [ " actor " ] )
User . invalidate_cache ( user )
Pleroma.Repo . delete ( user )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
url = " /objects/ #{ uuid } "
conn =
conn
|> put_req_header ( " accept " , " application/xml " )
|> get ( url )
assert response ( conn , 500 ) == ~S( {"error":"Something went wrong"} )
end
test " 404s on private objects " , %{ conn : conn } do
note_activity = insert ( :direct_note_activity )
object = Object . normalize ( note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
conn
|> get ( " /objects/ #{ uuid } " )
|> response ( 404 )
end
test " 404s on nonexisting objects " , %{ conn : conn } do
conn
|> get ( " /objects/123 " )
|> response ( 404 )
end
end
describe " GET activity/2 " do
test " gets an activity in xml format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , note_activity . data [ " id " ] ) )
2017-05-03 00:54:17 -07:00
2018-03-30 06:01:53 -07:00
conn
2018-12-13 17:59:33 -08:00
|> put_req_header ( " accept " , " application/xml " )
2019-07-28 22:02:20 -07:00
|> get ( " /activities/ #{ uuid } " )
|> response ( 200 )
end
2017-05-03 00:54:17 -07:00
2019-07-28 22:02:20 -07: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 06:53:02 -07:00
2019-07-28 22:02:20 -07:00
conn =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /activities/ #{ uuid } " )
2017-05-19 06:53:02 -07:00
2019-07-28 22:02:20 -07:00
assert redirected_to ( conn ) == " /notice/ #{ note_activity . id } "
end
2018-05-30 11:00:27 -07:00
2019-07-28 22:02:20 -07:00
test " 505s when user not found " , %{ conn : conn } do
note_activity = insert ( :note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , note_activity . data [ " id " ] ) )
user = User . get_cached_by_ap_id ( note_activity . data [ " actor " ] )
User . invalidate_cache ( user )
Pleroma.Repo . delete ( user )
2018-05-30 11:00:27 -07:00
2019-07-28 22:02:20 -07:00
conn =
conn
|> put_req_header ( " accept " , " text/html " )
|> get ( " /activities/ #{ uuid } " )
2018-06-03 12:04:44 -07:00
2019-07-28 22:02:20 -07:00
assert response ( conn , 500 ) == ~S( {"error":"Something went wrong"} )
end
2017-05-19 06:53:02 -07:00
2019-07-28 22:02:20 -07:00
test " 404s on deleted objects " , %{ conn : conn } do
note_activity = insert ( :note_activity )
object = Object . normalize ( note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , object . data [ " id " ] ) )
2017-11-27 08:24:52 -08:00
2019-07-28 22:02:20 -07:00
conn
|> put_req_header ( " accept " , " application/xml " )
|> get ( " /objects/ #{ uuid } " )
|> response ( 200 )
2018-12-25 12:40:57 -08:00
2019-07-28 22:02:20 -07:00
Object . delete ( object )
2018-12-25 12:40:57 -08:00
2019-07-28 22:02:20 -07:00
conn
|> put_req_header ( " accept " , " application/xml " )
|> get ( " /objects/ #{ uuid } " )
|> response ( 404 )
end
2018-12-25 12:40:57 -08:00
2019-07-28 22:02:20 -07: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 12:40:57 -08:00
2019-07-28 22:02:20 -07:00
conn
|> get ( " /activities/ #{ uuid } " )
|> response ( 404 )
end
2018-05-30 11:00:27 -07:00
2019-07-28 22:02:20 -07:00
test " 404s on nonexistent activities " , %{ conn : conn } do
conn
|> get ( " /activities/123 " )
|> response ( 404 )
end
2018-05-30 11:00:27 -07:00
2019-07-28 22:02:20 -07:00
test " gets an activity in AS2 format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
[ _ , uuid ] = hd ( Regex . scan ( ~r/ .+ \/ ([ \w -]+)$ / , note_activity . data [ " id " ] ) )
url = " /activities/ #{ uuid } "
2018-06-03 12:04:44 -07:00
2019-07-28 22:02:20 -07:00
conn =
conn
|> put_req_header ( " accept " , " application/activity+json " )
|> get ( url )
2017-11-27 08:24:52 -08:00
2019-07-28 22:02:20 -07:00
assert json_response ( conn , 200 )
end
2017-11-27 08:24:52 -08:00
end
2018-05-30 11:00:27 -07:00
2019-07-28 22:02:20 -07:00
describe " GET notice/2 " do
test " gets a notice in xml format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
2018-07-12 13:32:05 -07:00
2019-07-28 22:02:20 -07:00
conn
|> get ( " /notice/ #{ note_activity . id } " )
|> response ( 200 )
end
2018-07-12 13:32:05 -07:00
2019-07-28 22:02:20 -07:00
test " gets a notice in AS2 format " , %{ conn : conn } do
note_activity = insert ( :note_activity )
2018-11-17 14:10:15 -08:00
conn
|> put_req_header ( " accept " , " application/activity+json " )
2019-07-28 22:02:20 -07:00
|> get ( " /notice/ #{ note_activity . id } " )
|> json_response ( 200 )
end
2018-11-17 14:10:15 -08:00
2019-07-28 22:02:20 -07: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 14:10:15 -08:00
2019-07-28 22:02:20 -07:00
conn =
conn
|> get ( " /notice/ #{ note_activity . id } " )
2018-11-17 14:10:15 -08:00
2019-07-28 22:02:20 -07:00
assert response ( conn , 500 ) == ~S( {"error":"Something went wrong"} )
end
2018-11-17 14:10:15 -08:00
2019-07-28 22:02:20 -07:00
test " only gets a notice in AS2 format for Create messages " , %{ conn : conn } do
note_activity = insert ( :note_activity )
url = " /notice/ #{ note_activity . id } "
2018-11-17 14:10:15 -08:00
2019-07-28 22:02:20 -07:00
conn =
conn
|> put_req_header ( " accept " , " application/activity+json " )
|> get ( url )
2018-11-17 14:10:15 -08:00
2019-07-28 22:02:20 -07:00
assert json_response ( conn , 200 )
2018-11-17 14:10:15 -08:00
2019-07-28 22:02:20 -07:00
user = insert ( :user )
2018-07-12 13:32:05 -07:00
2019-07-28 22:02:20 -07:00
{ :ok , like_activity , _ } = CommonAPI . favorite ( note_activity . id , user )
url = " /notice/ #{ like_activity . id } "
assert like_activity . data [ " type " ] == " Like "
conn =
build_conn ( )
|> put_req_header ( " accept " , " application/activity+json " )
|> get ( url )
assert response ( conn , 404 )
end
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 =~
" <meta content= \" #{ Pleroma.Web . base_url ( ) } /notice/ #{ note_activity . id } \" property= \" og:url \" > "
user = insert ( :user )
{ :ok , like_activity , _ } = CommonAPI . favorite ( note_activity . id , user )
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
test " 404s a nonexisting notice " , %{ conn : conn } do
url = " /notice/123 "
2018-07-12 13:32:05 -07:00
2019-07-28 22:02:20 -07:00
conn =
conn
|> get ( url )
assert response ( conn , 404 )
end
2018-07-12 13:32:05 -07:00
end
2019-07-28 22:02:20 -07:00
describe " GET /notice/:id/embed_player " do
test " render embed player " , %{ conn : conn } do
note_activity = insert ( :note_activity )
object = Pleroma.Object . normalize ( note_activity )
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 ( )
conn =
conn
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
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 12:04:44 -07:00
2019-07-28 22:02:20 -07:00
test " 404s when activity isn't create " , %{ conn : conn } do
note_activity = insert ( :note_activity , data_attrs : %{ " type " = > " Like " } )
2018-06-03 12:04:44 -07:00
2019-07-28 22:02:20 -07: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 )
object = Pleroma.Object . normalize ( note_activity )
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 )
object = Pleroma.Object . normalize ( note_activity )
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 ( )
assert conn
|> get ( " /notice/ #{ note_activity . id } /embed_player " )
|> response ( 404 )
end
2018-06-03 12:04:44 -07:00
end
2017-04-18 09:41:51 -07:00
end