kopia lustrzana https://github.com/nextcloud/social
				
				
				
			new route for ostatus
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>pull/799/head
							rodzic
							
								
									e2d33c3764
								
							
						
					
					
						commit
						ee79f483d4
					
				| 
						 | 
				
			
			@ -56,7 +56,9 @@ return [
 | 
			
		|||
		['name' => 'ActivityPub#followers', 'url' => '/@{username}/followers', 'verb' => 'GET'],
 | 
			
		||||
		['name' => 'ActivityPub#following', 'url' => '/@{username}/following', 'verb' => 'GET'],
 | 
			
		||||
 | 
			
		||||
		['name' => 'OStatus#subscribe', 'url' => '/ostatus/follow/{uri}', 'verb' => 'GET'],
 | 
			
		||||
		['name' => 'OStatus#subscribeOld', 'url' => '/ostatus/follow/{uri}', 'verb' => 'GET'],
 | 
			
		||||
		['name' => 'OStatus#subscribe', 'url' => '/ostatus/interaction', 'verb' => 'GET'],
 | 
			
		||||
 | 
			
		||||
		['name' => 'OStatus#followRemote', 'url' => '/api/v1/ostatus/followRemote/{local}', 'verb' => 'GET'],
 | 
			
		||||
		['name' => 'OStatus#getLink', 'url' => '/api/v1/ostatus/link/{local}/{account}', 'verb' => 'GET'],
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,10 +36,12 @@ use daita\MySmallPhpTools\Traits\TArrayTools;
 | 
			
		|||
use Exception;
 | 
			
		||||
use OCA\Social\AppInfo\Application;
 | 
			
		||||
use OCA\Social\Exceptions\RetrieveAccountFormatException;
 | 
			
		||||
use OCA\Social\Model\ActivityPub\Actor\Person;
 | 
			
		||||
use OCA\Social\Service\AccountService;
 | 
			
		||||
use OCA\Social\Service\CacheActorService;
 | 
			
		||||
use OCA\Social\Service\CurlService;
 | 
			
		||||
use OCA\Social\Service\MiscService;
 | 
			
		||||
use OCA\Social\Service\StreamService;
 | 
			
		||||
use OCP\AppFramework\Controller;
 | 
			
		||||
use OCP\AppFramework\Http\Response;
 | 
			
		||||
use OCP\AppFramework\Http\TemplateResponse;
 | 
			
		||||
| 
						 | 
				
			
			@ -55,9 +57,15 @@ class OStatusController extends Controller {
 | 
			
		|||
	use TArrayTools;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/** @var IUserManager */
 | 
			
		||||
	private $userSession;
 | 
			
		||||
 | 
			
		||||
	/** @var CacheActorService */
 | 
			
		||||
	private $cacheActorService;
 | 
			
		||||
 | 
			
		||||
	/** @var StreamService */
 | 
			
		||||
	private $streamService;
 | 
			
		||||
 | 
			
		||||
	/** @var AccountService */
 | 
			
		||||
	private $accountService;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -67,14 +75,12 @@ class OStatusController extends Controller {
 | 
			
		|||
	/** @var MiscService */
 | 
			
		||||
	private $miscService;
 | 
			
		||||
 | 
			
		||||
	/** @var IUserManager */
 | 
			
		||||
	private $userSession;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * OStatusController constructor.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param IRequest $request
 | 
			
		||||
	 * @param StreamService $streamService
 | 
			
		||||
	 * @param CacheActorService $cacheActorService
 | 
			
		||||
	 * @param AccountService $accountService
 | 
			
		||||
	 * @param CurlService $curlService
 | 
			
		||||
| 
						 | 
				
			
			@ -82,12 +88,14 @@ class OStatusController extends Controller {
 | 
			
		|||
	 * @param IUserSession $userSession
 | 
			
		||||
	 */
 | 
			
		||||
	public function __construct(
 | 
			
		||||
		IRequest $request, CacheActorService $cacheActorService, AccountService $accountService,
 | 
			
		||||
		CurlService $curlService, MiscService $miscService, IUserSession $userSession
 | 
			
		||||
		IUserSession $userSession, IRequest $request, StreamService $streamService,
 | 
			
		||||
		CacheActorService $cacheActorService, AccountService $accountService, CurlService $curlService,
 | 
			
		||||
		MiscService $miscService
 | 
			
		||||
	) {
 | 
			
		||||
		parent::__construct(Application::APP_NAME, $request);
 | 
			
		||||
 | 
			
		||||
		$this->cacheActorService = $cacheActorService;
 | 
			
		||||
		$this->streamService = $streamService;
 | 
			
		||||
		$this->accountService = $accountService;
 | 
			
		||||
		$this->curlService = $curlService;
 | 
			
		||||
		$this->miscService = $miscService;
 | 
			
		||||
| 
						 | 
				
			
			@ -103,17 +111,53 @@ class OStatusController extends Controller {
 | 
			
		|||
	 *
 | 
			
		||||
	 * @return Response
 | 
			
		||||
	 */
 | 
			
		||||
	public function subscribe(string $uri): Response {
 | 
			
		||||
	public function subscribeOld(string $uri): Response {
 | 
			
		||||
		return $this->subscribe($uri);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @NoCSRFRequired
 | 
			
		||||
	 * @NoAdminRequired
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param string $uri
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return Response
 | 
			
		||||
	 * @throws Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public function subscribe(string $uri): Response {
 | 
			
		||||
		try {
 | 
			
		||||
			$actor = $this->cacheActorService->getFromAccount($uri);
 | 
			
		||||
 | 
			
		||||
			return $this->subscribeLocalAccount($actor);
 | 
			
		||||
		} catch (Exception $e) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			$post = $this->streamService->getStreamById($uri, true, true);
 | 
			
		||||
 | 
			
		||||
			return $this->directSuccess($post);
 | 
			
		||||
		} catch (Exception $e) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $this->fail(new Exception('unknown protocol'));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param Person $actor
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return Response
 | 
			
		||||
	 */
 | 
			
		||||
	private function subscribeLocalAccount(Person $actor): Response {
 | 
			
		||||
		try {
 | 
			
		||||
			$user = $this->userSession->getUser();
 | 
			
		||||
			if ($user === null) {
 | 
			
		||||
				throw new Exception('Failed to retrieve current user');
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return new TemplateResponse('social', 'ostatus', [
 | 
			
		||||
			return new TemplateResponse(
 | 
			
		||||
				'social', 'ostatus', [
 | 
			
		||||
				'serverData' => [
 | 
			
		||||
					'account'     => $actor->getAccount(),
 | 
			
		||||
					'currentUser' => [
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +165,8 @@ class OStatusController extends Controller {
 | 
			
		|||
						'displayName' => $user->getDisplayName(),
 | 
			
		||||
					]
 | 
			
		||||
				]
 | 
			
		||||
			], 'guest');
 | 
			
		||||
			], 'guest'
 | 
			
		||||
			);
 | 
			
		||||
		} catch (Exception $e) {
 | 
			
		||||
			return $this->fail($e);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -134,18 +179,21 @@ class OStatusController extends Controller {
 | 
			
		|||
	 * @PublicPage
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param string $local
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return Response
 | 
			
		||||
	 */
 | 
			
		||||
	public function followRemote(string $local): Response {
 | 
			
		||||
		try {
 | 
			
		||||
			$following = $this->accountService->getActor($local);
 | 
			
		||||
 | 
			
		||||
			return new TemplateResponse('social', 'ostatus', [
 | 
			
		||||
			return new TemplateResponse(
 | 
			
		||||
				'social', 'ostatus', [
 | 
			
		||||
				'serverData' => [
 | 
			
		||||
					'local'   => $local,
 | 
			
		||||
					'account' => $following->getAccount()
 | 
			
		||||
				]
 | 
			
		||||
			], 'guest');
 | 
			
		||||
			], 'guest'
 | 
			
		||||
			);
 | 
			
		||||
		} catch (Exception $e) {
 | 
			
		||||
			return $this->fail($e);
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,9 +32,11 @@ namespace OCA\Social\Service;
 | 
			
		|||
 | 
			
		||||
use daita\MySmallPhpTools\Exceptions\MalformedArrayException;
 | 
			
		||||
use Exception;
 | 
			
		||||
use OCA\Social\AP;
 | 
			
		||||
use OCA\Social\Db\StreamRequest;
 | 
			
		||||
use OCA\Social\Exceptions\InvalidOriginException;
 | 
			
		||||
use OCA\Social\Exceptions\InvalidResourceException;
 | 
			
		||||
use OCA\Social\Exceptions\ItemAlreadyExistsException;
 | 
			
		||||
use OCA\Social\Exceptions\ItemUnknownException;
 | 
			
		||||
use OCA\Social\Exceptions\RedundancyLimitException;
 | 
			
		||||
use OCA\Social\Exceptions\RequestContentException;
 | 
			
		||||
| 
						 | 
				
			
			@ -74,6 +76,9 @@ class StreamService {
 | 
			
		|||
	/** @var CacheActorService */
 | 
			
		||||
	private $cacheActorService;
 | 
			
		||||
 | 
			
		||||
	/** @var CurlService */
 | 
			
		||||
	private $curlService;
 | 
			
		||||
 | 
			
		||||
	/** @var ConfigService */
 | 
			
		||||
	private $configService;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -94,6 +99,7 @@ class StreamService {
 | 
			
		|||
	 * @param SignatureService $signatureService
 | 
			
		||||
	 * @param StreamQueueService $streamQueueService
 | 
			
		||||
	 * @param CacheActorService $cacheActorService
 | 
			
		||||
	 * @param CurlService $curlService
 | 
			
		||||
	 * @param ConfigService $configService
 | 
			
		||||
	 * @param MiscService $miscService
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +107,7 @@ class StreamService {
 | 
			
		|||
		StreamRequest $streamRequest, ActivityService $activityService,
 | 
			
		||||
		AccountService $accountService, SignatureService $signatureService,
 | 
			
		||||
		StreamQueueService $streamQueueService, CacheActorService $cacheActorService,
 | 
			
		||||
		ConfigService $configService, MiscService $miscService
 | 
			
		||||
		CurlService $curlService, ConfigService $configService, MiscService $miscService
 | 
			
		||||
	) {
 | 
			
		||||
		$this->streamRequest = $streamRequest;
 | 
			
		||||
		$this->activityService = $activityService;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,6 +115,7 @@ class StreamService {
 | 
			
		|||
		$this->signatureService = $signatureService;
 | 
			
		||||
		$this->streamQueueService = $streamQueueService;
 | 
			
		||||
		$this->cacheActorService = $cacheActorService;
 | 
			
		||||
		$this->curlService = $curlService;
 | 
			
		||||
		$this->configService = $configService;
 | 
			
		||||
		$this->miscService = $miscService;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -381,13 +388,83 @@ class StreamService {
 | 
			
		|||
	/**
 | 
			
		||||
	 * @param string $id
 | 
			
		||||
	 * @param bool $asViewer
 | 
			
		||||
	 * @param bool $retrieve
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return Stream
 | 
			
		||||
	 * @throws StreamNotFoundException
 | 
			
		||||
	 * @throws SocialAppConfigException
 | 
			
		||||
	 * @throws Exception
 | 
			
		||||
	 */
 | 
			
		||||
	public function getStreamById(string $id, bool $asViewer = false): Stream {
 | 
			
		||||
	public function getStreamById(string $id, bool $asViewer = false, bool $retrieve = false): Stream {
 | 
			
		||||
		try {
 | 
			
		||||
			return $this->streamRequest->getStreamById($id, $asViewer);
 | 
			
		||||
		} catch (StreamNotFoundException $e) {
 | 
			
		||||
			if (!$retrieve) {
 | 
			
		||||
				throw $e;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ($asViewer) {
 | 
			
		||||
				try {
 | 
			
		||||
					$this->streamRequest->getStreamById($id, false);
 | 
			
		||||
					throw $e;
 | 
			
		||||
				} catch (StreamNotFoundException $e) {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return $this->retrieveStream($id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param string $id
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return Stream
 | 
			
		||||
	 * @throws InvalidOriginException
 | 
			
		||||
	 * @throws InvalidResourceException
 | 
			
		||||
	 * @throws ItemUnknownException
 | 
			
		||||
	 * @throws MalformedArrayException
 | 
			
		||||
	 * @throws RedundancyLimitException
 | 
			
		||||
	 * @throws RequestContentException
 | 
			
		||||
	 * @throws RequestNetworkException
 | 
			
		||||
	 * @throws RequestResultNotJsonException
 | 
			
		||||
	 * @throws RequestResultSizeException
 | 
			
		||||
	 * @throws RequestServerException
 | 
			
		||||
	 * @throws SocialAppConfigException
 | 
			
		||||
	 * @throws UnauthorizedFediverseException
 | 
			
		||||
	 * @throws StreamNotFoundException
 | 
			
		||||
	 */
 | 
			
		||||
	public function retrieveStream(string $id) {
 | 
			
		||||
		$data = $this->curlService->retrieveObject($id);
 | 
			
		||||
		$object = AP::$activityPub->getItemFromData($data);
 | 
			
		||||
 | 
			
		||||
		$origin = parse_url($id, PHP_URL_HOST);
 | 
			
		||||
		$object->setOrigin($origin, SignatureService::ORIGIN_REQUEST, time());
 | 
			
		||||
 | 
			
		||||
		if ($object->getId() !== $id) {
 | 
			
		||||
			throw new InvalidOriginException(
 | 
			
		||||
				'StreamServiceStreamQueueService::getStreamById - objectId: ' . $object->getId() . ' - id: '
 | 
			
		||||
				. $id
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($object->getType() !== Note::TYPE
 | 
			
		||||
			// do we also retrieve Announce ?
 | 
			
		||||
			//|| $object->getType() !== Announce:TYPE
 | 
			
		||||
		) {
 | 
			
		||||
			throw new InvalidResourceException();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/** @var Stream $object */
 | 
			
		||||
		$this->cacheActorService->getFromId($object->getAttributedTo());
 | 
			
		||||
 | 
			
		||||
		$interface = AP::$activityPub->getInterfaceForItem($object);
 | 
			
		||||
		try {
 | 
			
		||||
			$interface->save($object);
 | 
			
		||||
		} catch (ItemAlreadyExistsException $e) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		return $this->streamRequest->getStreamById($id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -400,7 +477,8 @@ class StreamService {
 | 
			
		|||
	 * @return Stream[]
 | 
			
		||||
	 * @throws StreamNotFoundException
 | 
			
		||||
	 */
 | 
			
		||||
	public function getRepliesByParentId(string $id, int $since = 0, int $limit = 5, bool $asViewer = false): array {
 | 
			
		||||
	public function getRepliesByParentId(string $id, int $since = 0, int $limit = 5, bool $asViewer = false
 | 
			
		||||
	): array {
 | 
			
		||||
		return $this->streamRequest->getRepliesByParentId($id, $since, $limit, $asViewer);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -128,11 +128,8 @@ $finger = [
 | 
			
		|||
		],
 | 
			
		||||
		[
 | 
			
		||||
			'rel'      => 'http://ostatus.org/schema/1.0/subscribe',
 | 
			
		||||
			'template' => urldecode(
 | 
			
		||||
				$href = $urlGenerator->linkToRouteAbsolute(
 | 
			
		||||
					'social.OStatus.subscribe', ['uri' => '{uri}']
 | 
			
		||||
				)
 | 
			
		||||
			)
 | 
			
		||||
			'template' => urldecode($href = $urlGenerator->linkToRouteAbsolute('social.OStatus.subscribe'))
 | 
			
		||||
						  . '?uri={uri}'
 | 
			
		||||
		]
 | 
			
		||||
	]
 | 
			
		||||
];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue