From 1e1e7e101bb7ece3651e3eff1059da4de39cd286 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Mon, 21 Jan 2019 11:59:29 +0000 Subject: [PATCH 1/3] Require specifying federation API version when making requests --- lib/SyTest/Federation/Client.pm | 8 ++++---- tests/50federation/00prepare.pl | 2 +- tests/50federation/10query-profile.pl | 2 +- tests/50federation/11query-directory.pl | 2 +- tests/50federation/30room-join.pl | 12 ++++++------ tests/50federation/32room-getevent.pl | 6 +++--- tests/50federation/33room-get-missing-events.pl | 2 +- tests/50federation/34room-backfill.pl | 4 ++-- tests/50federation/35room-invite.pl | 4 ++-- tests/50federation/36-state.pl | 8 ++++---- tests/50federation/37public-rooms.pl | 2 +- tests/50federation/42query-auth.pl | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lib/SyTest/Federation/Client.pm b/lib/SyTest/Federation/Client.pm index 7a4b51bf5..2c97d81cb 100644 --- a/lib/SyTest/Federation/Client.pm +++ b/lib/SyTest/Federation/Client.pm @@ -119,7 +119,7 @@ sub send_transaction $self->do_request_json( method => "PUT", hostname => $params{destination}, - uri => "/send/$ts/", + uri => "/v1/send/$ts/", content => \%transaction, ); @@ -176,7 +176,7 @@ sub join_room $self->do_request_json( method => "GET", hostname => $server_name, - uri => "/make_join/$room_id/$user_id" + uri => "/v1/make_join/$room_id/$user_id" )->then( sub { my ( $body ) = @_; @@ -197,7 +197,7 @@ sub join_room $self->do_request_json( method => "PUT", hostname => $server_name, - uri => "/send_join/$room_id/$member_event{event_id}", + uri => "/v1/send_join/$room_id/$member_event{event_id}", content => \%member_event, )->then( sub { @@ -253,7 +253,7 @@ sub get_remote_forward_extremities $self->do_request_json( method => "GET", hostname => $server_name, - uri => "/make_join/$room_id/$user_id", + uri => "/v1/make_join/$room_id/$user_id", )->then( sub { my ( $resp ) = @_; diff --git a/tests/50federation/00prepare.pl b/tests/50federation/00prepare.pl index b7426262c..2531ef07c 100644 --- a/tests/50federation/00prepare.pl +++ b/tests/50federation/00prepare.pl @@ -48,7 +48,7 @@ sub create_federation_server my $outbound_client = SyTest::Federation::Client->new( datastore => $datastore, - uri_base => "/_matrix/federation/v1", + uri_base => "/_matrix/federation", ); $loop->add( $outbound_client ); diff --git a/tests/50federation/10query-profile.pl b/tests/50federation/10query-profile.pl index 635b75051..9fe3ad4d2 100644 --- a/tests/50federation/10query-profile.pl +++ b/tests/50federation/10query-profile.pl @@ -57,7 +57,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $info->server_name, - uri => "/query/profile", + uri => "/v1/query/profile", params => { user_id => $user->user_id, diff --git a/tests/50federation/11query-directory.pl b/tests/50federation/11query-directory.pl index f41be1969..fbafc95c7 100644 --- a/tests/50federation/11query-directory.pl +++ b/tests/50federation/11query-directory.pl @@ -71,7 +71,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/query/directory", + uri => "/v1/query/directory", params => { room_alias => $room_alias, diff --git a/tests/50federation/30room-join.pl b/tests/50federation/30room-join.pl index f2515c23d..8f5ede1b2 100644 --- a/tests/50federation/30room-join.pl +++ b/tests/50federation/30room-join.pl @@ -219,7 +219,7 @@ sub assert_is_valid_pdu { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/make_join/$room_id/$user_id", + uri => "/v1/make_join/$room_id/$user_id", )->then( sub { my ( $body ) = @_; log_if_fail "make_join body", $body; @@ -278,7 +278,7 @@ sub assert_is_valid_pdu { $outbound_client->do_request_json( method => "PUT", hostname => $first_home_server, - uri => "/send_join/$room_id/$event{event_id}", + uri => "/v1/send_join/$room_id/$event{event_id}", content => \%event, ) @@ -356,7 +356,7 @@ sub assert_is_valid_pdu { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/make_join/$room_id/$user_id", + uri => "/v1/make_join/$room_id/$user_id", params => { ver => [qw/2 abc def/], }, @@ -393,7 +393,7 @@ sub assert_is_valid_pdu { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/make_join/$room_id/$user_id", + uri => "/v1/make_join/$room_id/$user_id", ); })->main::expect_http_400() ->then( sub { @@ -427,7 +427,7 @@ sub assert_is_valid_pdu { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/make_join/$room_id/$user_id", + uri => "/v1/make_join/$room_id/$user_id", params => { ver => ["1"], }, @@ -464,7 +464,7 @@ sub assert_is_valid_pdu { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/make_join/$room_id/$user_id", + uri => "/v1/make_join/$room_id/$user_id", params => { ver => [qw/abc vdh-test-version def/], }, diff --git a/tests/50federation/32room-getevent.pl b/tests/50federation/32room-getevent.pl index 1549624cb..e56080a69 100644 --- a/tests/50federation/32room-getevent.pl +++ b/tests/50federation/32room-getevent.pl @@ -24,7 +24,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/event/$member_event->{event_id}/", + uri => "/v1/event/$member_event->{event_id}/", ); })->then( sub { my ( $body ) = @_; @@ -73,7 +73,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/event/$message_id/", + uri => "/v1/event/$message_id/", ); })->then( sub { my ( $body ) = @_; @@ -96,7 +96,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/event/$message_id/", + uri => "/v1/event/$message_id/", ); })->then( sub { my ( $body ) = @_; diff --git a/tests/50federation/33room-get-missing-events.pl b/tests/50federation/33room-get-missing-events.pl index b3863b79e..4b3b66ea6 100644 --- a/tests/50federation/33room-get-missing-events.pl +++ b/tests/50federation/33room-get-missing-events.pl @@ -136,7 +136,7 @@ $outbound_client->do_request_json( method => "POST", hostname => $first_home_server, - uri => "/get_missing_events/" . $room->room_id, + uri => "/v1/get_missing_events/" . $room->room_id, content => { earliest_events => [ $creation_event->{event_id} ], diff --git a/tests/50federation/34room-backfill.pl b/tests/50federation/34room-backfill.pl index 2b0a402a8..415bffce0 100644 --- a/tests/50federation/34room-backfill.pl +++ b/tests/50federation/34room-backfill.pl @@ -157,7 +157,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/backfill/$room_id/", + uri => "/v1/backfill/$room_id/", params => { v => $join_event->{prev_events}[0][0], @@ -219,7 +219,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/backfill/$pub_room_id/", + uri => "/v1/backfill/$pub_room_id/", params => { v => $priv_event_id, diff --git a/tests/50federation/35room-invite.pl b/tests/50federation/35room-invite.pl index c7725fd47..ac8b7428b 100644 --- a/tests/50federation/35room-invite.pl +++ b/tests/50federation/35room-invite.pl @@ -71,7 +71,7 @@ sub invite_server { - my ( $room, $creator_id, $user, $inbound_server) = @_; + my ( $room, $creator_id, $user, $inbound_server ) = @_; my $outbound_client = $inbound_server->client; my $first_home_server = $user->http->server_name; @@ -110,7 +110,7 @@ sub invite_server $outbound_client->do_request_json( method => "PUT", hostname => $first_home_server, - uri => "/invite/$room_id/$invitation->{event_id}", + uri => "/v1/invite/$room_id/$invitation->{event_id}", content => $invitation, )->then( sub { diff --git a/tests/50federation/36-state.pl b/tests/50federation/36-state.pl index 28c477813..7c2f0ab0c 100644 --- a/tests/50federation/36-state.pl +++ b/tests/50federation/36-state.pl @@ -4,7 +4,7 @@ sub get_state_ids_from_server { return $outbound_client->do_request_json( method => "GET", hostname => $server, - uri => "/state_ids/$room_id/", + uri => "/v1/state_ids/$room_id/", params => { event_id => $event_id }, ); } @@ -32,7 +32,7 @@ sub get_state_ids_from_server { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/state/$room_id/", + uri => "/v1/state/$room_id/", params => { event_id => $room->{prev_events}[-1]->{event_id}, } @@ -635,7 +635,7 @@ sub get_state_ids_from_server { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/state/$pub_room_id/", + uri => "/v1/state/$pub_room_id/", params => { event_id => $priv_event_id, @@ -677,7 +677,7 @@ sub get_state_ids_from_server { $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/state_ids/$pub_room_id/", + uri => "/v1/state_ids/$pub_room_id/", params => { event_id => $priv_event_id, diff --git a/tests/50federation/37public-rooms.pl b/tests/50federation/37public-rooms.pl index a20a21503..690a4a0ce 100644 --- a/tests/50federation/37public-rooms.pl +++ b/tests/50federation/37public-rooms.pl @@ -30,7 +30,7 @@ $outbound_client->do_request_json( method => "GET", hostname => $first_home_server, - uri => "/publicRooms", + uri => "/v1/publicRooms", )->then( sub { my ( $body ) = @_; diff --git a/tests/50federation/42query-auth.pl b/tests/50federation/42query-auth.pl index edde4d637..7e53f84dc 100644 --- a/tests/50federation/42query-auth.pl +++ b/tests/50federation/42query-auth.pl @@ -32,7 +32,7 @@ $outbound_client->do_request_json( method => "POST", hostname => $first_home_server, - uri => "/query_auth/$pub_room_id/$priv_event_id", + uri => "/v1/query_auth/$pub_room_id/$priv_event_id", content => { auth_chain => [], # This is part of the exploit From 8f6c0ed0d20e43cbdf0b1564505fc0a5f0cdafbc Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Mon, 21 Jan 2019 13:53:04 +0000 Subject: [PATCH 2/3] Test sending v2 invites to server --- tests/50federation/35room-invite.pl | 153 ++++++++++++++++++++++++---- 1 file changed, 134 insertions(+), 19 deletions(-) diff --git a/tests/50federation/35room-invite.pl b/tests/50federation/35room-invite.pl index ac8b7428b..729114961 100644 --- a/tests/50federation/35room-invite.pl +++ b/tests/50federation/35room-invite.pl @@ -47,7 +47,7 @@ ); }; -test "Inbound federation can receive invites", +test "Inbound federation can receive invites via v1 API", requires => [ local_user_fixture( with_events => 1 ), $main::INBOUND_SERVER, federation_user_id_fixture() ], @@ -65,13 +65,71 @@ creator => $creator_id, ); - invite_server( $room, $creator_id, $user, $inbound_server ); + invite_server_v1( $room, $creator_id, $user, $inbound_server ); }; +test "Inbound federation can receive invites via v2 API", + requires => [ local_user_fixture( with_events => 1 ), $main::INBOUND_SERVER, + federation_user_id_fixture() ], + + do => sub { + my ( $user, $inbound_server, $creator_id ) = @_; + + my $datastore = $inbound_server->datastore; + + my $room = SyTest::Federation::Room->new( + datastore => $datastore, + ); + + $room->create_initial_events( + server => $inbound_server, + creator => $creator_id, + ); + + invite_server_v2( $room, $creator_id, $user, $inbound_server ); + }; + + +=head2 invite_server_v1 + + invite_server_v1( $room, $creator_id, $user, $inbound_server ) + +Invite a server using the V1 API. See invite_server + +=cut + +sub invite_server_v1 +{ + invite_server( @_, \&do_v1_invite_request ) +} + + +=head2 invite_server_v2 + + invite_server_v1( $room, $creator_id, $user, $inbound_server ) + +Invite a server using the V2 API. See invite_server + +=cut + +sub invite_server_v2 +{ + invite_server( @_, \&do_v2_invite_request ) +} + +=head2 invite_server + + invite_server( $room, $creator_id, $user, $inbound_server, $do_invite_request ) + +Invite a server into the room using the given `do_invite_request` parameter to +actually send the invite request + +=cut + sub invite_server { - my ( $room, $creator_id, $user, $inbound_server ) = @_; + my ( $room, $creator_id, $user, $inbound_server, $do_invite_request ) = @_; my $outbound_client = $inbound_server->client; my $first_home_server = $user->http->server_name; @@ -107,24 +165,11 @@ sub invite_server Future->done(1); }), - $outbound_client->do_request_json( - method => "PUT", - hostname => $first_home_server, - uri => "/v1/invite/$room_id/$invitation->{event_id}", - - content => $invitation, + $do_invite_request->( + $room, $user, $inbound_server, $invitation, )->then( sub { my ( $response ) = @_; - # $response seems to arrive with an extraneous layer of wrapping as - # the result of a synapse implementation bug (SYN-490). - if( ref $response eq "ARRAY" ) { - $response->[0] == 200 or - die "Expected first response element to be 200"; - - $response = $response->[1]; - } - log_if_fail "send invite response", $response; my $event = $response->{event}; @@ -142,6 +187,76 @@ sub invite_server ); } +=head2 do_v1_invite_request + + do_v1_invite_request( $room, $user, $inbound_server, $invitation ) + +Send an invite event via the V1 API + +=cut + +sub do_v1_invite_request +{ + my ( $room, $user, $inbound_server, $invitation ) = @_; + + my $outbound_client = $inbound_server->client; + my $first_home_server = $user->http->server_name; + my $room_id = $room->room_id; + + $outbound_client->do_request_json( + method => "PUT", + hostname => $first_home_server, + uri => "/v1/invite/$room_id/$invitation->{event_id}", + + content => $invitation, + )->then( sub { + my ( $response ) = @_; + + # $response seems to arrive with an extraneous layer of wrapping as + # the result of a synapse implementation bug (SYN-490). + (ref $response eq "ARRAY") or die "V1 invite response must be an array"; + + $response->[0] == 200 or + die "Expected first response element to be 200"; + + $response = $response->[1]; + + Future->done( $response ) + }) +} + +=head2 do_v2_invite_request + + do_v2_invite_request( $room, $user, $inbound_server, $invitation ) + +Send an invite event via the V2 API + +=cut + +sub do_v2_invite_request +{ + my ( $room, $user, $inbound_server, $invitation ) = @_; + + my $outbound_client = $inbound_server->client; + my $first_home_server = $user->http->server_name; + my $room_id = $room->room_id; + + my $create_event = $room->get_current_state_event( "m.room.create" ); + my $room_version = $create_event->{content}{room_version} // "1"; + + $outbound_client->do_request_json( + method => "PUT", + hostname => $first_home_server, + uri => "/v2/invite/$room_id/$invitation->{event_id}", + + content => { + event => $invitation, + room_version => $room_version, + invite_room_state => [], + }, + ) +} + foreach my $error_code ( 403, 500, -1 ) { # a temporary federation server which is shut down at the end of the test. @@ -180,7 +295,7 @@ sub invite_server my $room_id = $room->room_id; - invite_server( $room, $creator_id, $user, $federation_server ) + invite_server_v1( $room, $creator_id, $user, $federation_server ) ->then( sub { if( $error_code < 0 ) { # now shut down the remote server, so that we get an 'unreachable' From 9fb07b422e7399832cbc003f7c3991908e050059 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Mon, 21 Jan 2019 15:06:43 +0000 Subject: [PATCH 3/3] fixup comments --- tests/50federation/35room-invite.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/50federation/35room-invite.pl b/tests/50federation/35room-invite.pl index 729114961..4074c329b 100644 --- a/tests/50federation/35room-invite.pl +++ b/tests/50federation/35room-invite.pl @@ -212,8 +212,8 @@ sub do_v1_invite_request )->then( sub { my ( $response ) = @_; - # $response seems to arrive with an extraneous layer of wrapping as - # the result of a synapse implementation bug (SYN-490). + # $response arrives with an extraneous layer of wrapping as the result of + # a synapse implementation bug (matrix-org/synapse#1383). (ref $response eq "ARRAY") or die "V1 invite response must be an array"; $response->[0] == 200 or