2019-05-11 12:27:21 +01:00
< ? php
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU social is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
/**
* ActivityPub implementation for GNU social
*
* @ package GNUsocial
2020-10-16 01:07:01 +01:00
*
2019-05-11 12:27:21 +01:00
* @ author Diogo Cordeiro < diogo @ fc . up . pt >
* @ copyright 2018 - 2019 Free Software Foundation , Inc http :// www . fsf . org
* @ license https :// www . gnu . org / licenses / agpl . html GNU AGPL v3 or later
2020-10-16 01:07:01 +01:00
*
* @ see http :// www . gnu . org / software / social /
2019-05-11 12:27:21 +01:00
*/
defined ( 'GNUSOCIAL' ) || die ();
/**
* ActivityPub error representation
*
* @ category Plugin
* @ package GNUsocial
2020-10-16 01:07:01 +01:00
*
2019-05-11 12:27:21 +01:00
* @ author Diogo Cordeiro < diogo @ fc . up . pt >
* @ license https :// www . gnu . org / licenses / agpl . html GNU AGPL v3 or later
*/
2019-08-13 02:54:38 +01:00
class Activitypub_follow
2019-05-11 12:27:21 +01:00
{
/**
* Generates an ActivityPub representation of a subscription
*
* @ author Diogo Cordeiro < diogo @ fc . up . pt >
2020-10-16 01:07:01 +01:00
*
* @ param string $actor
* @ param string $object
* @ param null | string $id Activity id , to be used when generating for an Accept Activity
*
2019-05-11 12:27:21 +01:00
* @ return array pretty array to be used in a response
*/
2019-08-05 23:22:32 +01:00
public static function follow_to_array ( string $actor , string $object , ? string $id = null ) : array
2019-05-11 12:27:21 +01:00
{
2019-08-05 23:22:32 +01:00
if ( $id === null ) {
2020-10-16 01:07:01 +01:00
$id = common_root_url () . 'follow_from_' . urlencode ( $actor ) . '_to_' . urlencode ( $object );
2019-08-05 23:22:32 +01:00
}
2019-05-11 12:27:21 +01:00
$res = [
'@context' => 'https://www.w3.org/ns/activitystreams' ,
2020-10-16 01:07:01 +01:00
'id' => $id ,
'type' => 'Follow' ,
'actor' => $actor ,
'object' => $object ,
];
2019-05-11 12:27:21 +01:00
return $res ;
}
/**
* Handles a Follow Activity received by our inbox .
*
* @ param Profile $actor_profile Remote Actor
2020-10-16 01:07:01 +01:00
* @ param string $object Local Actor
* @ param string $id Activity id
*
2019-05-11 12:27:21 +01:00
* @ throws AlreadyFulfilledException
* @ throws HTTP_Request2_Exception
* @ throws NoProfileException
* @ throws ServerException
2020-10-16 01:07:01 +01:00
*
2019-05-11 12:27:21 +01:00
* @ author Diogo Cordeiro < diogo @ fc . up . pt >
*/
2019-08-05 23:22:32 +01:00
public static function follow ( Profile $actor_profile , string $object , string $id )
2019-05-11 12:27:21 +01:00
{
// Get Actor's Aprofile
$actor_aprofile = Activitypub_profile :: from_profile ( $actor_profile );
// Get Object profile
$object_profile = new Activitypub_explorer ;
$object_profile = $object_profile -> lookup ( $object )[ 0 ];
if ( ! Subscription :: exists ( $actor_profile , $object_profile )) {
Subscription :: start ( $actor_profile , $object_profile );
2019-07-08 19:23:48 +01:00
Activitypub_profile :: subscribeCacheUpdate ( $actor_profile , $object_profile );
2020-10-16 01:07:01 +01:00
common_debug ( 'ActivityPubPlugin: Accepted Follow request from ' . $actor_profile -> getUri () . ' to ' . $object );
2019-05-11 12:27:21 +01:00
} else {
2020-10-16 01:07:01 +01:00
common_debug ( 'ActivityPubPlugin: Received a repeated Follow request from ' . $actor_profile -> getUri () . ' to ' . $object );
2019-05-11 12:27:21 +01:00
}
// Notify remote instance that we have accepted their request
2020-10-16 01:07:01 +01:00
common_debug ( 'ActivityPubPlugin: Notifying remote instance that we have accepted their Follow request request from ' . $actor_profile -> getUri () . ' to ' . $object );
2019-07-08 19:23:48 +01:00
$postman = new Activitypub_postman ( $object_profile , [ $actor_aprofile ]);
2019-08-05 23:22:32 +01:00
$postman -> accept_follow ( $id );
2019-05-11 12:27:21 +01:00
}
}