diff options
Diffstat (limited to 'lib')
35 files changed, 4250 insertions, 55 deletions
diff --git a/lib/Command/NoteCreate.php b/lib/Command/NoteCreate.php new file mode 100644 index 00000000..48c1193f --- /dev/null +++ b/lib/Command/NoteCreate.php @@ -0,0 +1,150 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCA\Social\Command; + +use Exception; +use OC\Core\Command\Base; +use OCA\Social\Service\ActivityPub\NoteService; +use OCA\Social\Service\ActivityPubService; +use OCA\Social\Service\ActorService; +use OCA\Social\Service\ConfigService; +use OCA\Social\Service\CurlService; +use OCA\Social\Service\MiscService; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + + +class NoteCreate extends Base { + + /** @var ConfigService */ + private $configService; + + /** @var ActivityPubService */ + private $activityPubService; + + /** @var ActorService */ + private $actorService; + + /** @var NoteService */ + private $noteService; + + /** @var CurlService */ + private $curlService; + + /** @var MiscService */ + private $miscService; + + + /** + * Index constructor. + * + * @param ActivityPubService $activityPubService + * @param ActorService $actorService + * @param NoteService $noteService + * @param CurlService $curlService + * @param ConfigService $configService + * @param MiscService $miscService + */ + public function __construct( + ActivityPubService $activityPubService, ActorService $actorService, + NoteService $noteService, CurlService $curlService, + ConfigService $configService, MiscService $miscService + ) { + parent::__construct(); + + $this->activityPubService = $activityPubService; + $this->actorService = $actorService; + $this->noteService = $noteService; + $this->curlService = $curlService; + $this->configService = $configService; + $this->miscService = $miscService; + } + + + /** + * + */ + protected function configure() { + parent::configure(); + $this->setName('social:note:create') + ->addOption( + 'replyTo', 'r', InputOption::VALUE_OPTIONAL, 'in reply to an existing thread' + ) + ->addOption( + 'to', 't', InputOption::VALUE_OPTIONAL, 'to (default Public)' + ) + ->addArgument('userid', InputArgument::REQUIRED, 'userId of the author') + ->addArgument('content', InputArgument::REQUIRED, 'content of the post') + ->setDescription('Create a new note'); + } + + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @throws Exception + */ + protected function execute(InputInterface $input, OutputInterface $output) { + + $userId = $input->getArgument('userid'); + $content = $input->getArgument('content'); + $to = $input->getOption('to'); + $replyTo = $input->getOption('replyTo'); + + $note = $this->noteService->generateNote($userId, $content, ActivityPubService::TO_PUBLIC); + + if ($to !== null) { + $note->setTo($to); + $note->addTag( + [ + 'type' => 'Mention', + 'href' => $to + ] + ); + } + + + if ($replyTo !== null) { + $note->setInReplyTo($replyTo); + } + + $result = $this->activityPubService->createActivity($userId, $note, $activity); + + echo 'object: ' . json_encode($activity, JSON_PRETTY_PRINT) . "\n"; + echo 'result: ' . json_encode($result, JSON_PRETTY_PRINT) . "\n"; + + } + +} + diff --git a/lib/Controller/AccountController.php b/lib/Controller/AccountController.php new file mode 100644 index 00000000..d68c0cca --- /dev/null +++ b/lib/Controller/AccountController.php @@ -0,0 +1,106 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Social\Controller; + +use daita\Traits\TArrayTools; +use daita\Traits\TNCDataResponse; +use Exception; +use OCA\Social\AppInfo\Application; +use OCA\Social\Service\ActivityPubService; +use OCA\Social\Service\ActivityStreamsService; +use OCA\Social\Service\ActorService; +use OCA\Social\Service\ConfigService; +use OCA\Social\Service\MiscService; +use OCA\Social\Service\ServiceAccountsService; +use OCA\Social\Service\ServicesService; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\DataResponse; +use OCP\IRequest; + + +class AccountController extends Controller { + + use TNCDataResponse; + + /** @var string */ + private $userId; + + /** @var ConfigService */ + private $configService; + + /** @var ActorService */ + private $actorService; + + /** @var MiscService */ + private $miscService; + + + /** + * AccountController constructor. + * + * @param IRequest $request + * @param string $userId + * @param ConfigService $configService + * @param ActorService $actorService + * @param MiscService $miscService + */ + public function __construct( + IRequest $request, string $userId, ConfigService $configService, + ActorService $actorService, MiscService $miscService + ) { + parent::__construct(Application::APP_NAME, $request); + + $this->userId = $userId; + $this->configService = $configService; + $this->actorService = $actorService; + $this->miscService = $miscService; + } + + + /** + * @NoAdminRequired + * + * @param array $data + * + * @return DataResponse + */ + public function create(string $username): DataResponse { + try { + $this->actorService->createActor($this->userId, $username); + + return $this->success([]); + } catch (Exception $e) { + return $this->fail($e->getMessage()); + } + } + + +} + diff --git a/lib/Controller/ActivityPubController.php b/lib/Controller/ActivityPubController.php new file mode 100644 index 00000000..083ddecb --- /dev/null +++ b/lib/Controller/ActivityPubController.php @@ -0,0 +1,250 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Social\Controller; + + +use daita\Traits\TNCDataResponse; +use Exception; +use OCA\Social\AppInfo\Application; +use OCA\Social\Service\ActivityPubService; +use OCA\Social\Service\ActorService; +use OCA\Social\Service\MiscService; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\Response; +use OCP\IRequest; + + +class ActivityPubController extends Controller { + + + use TNCDataResponse; + + + /** @var SocialPubController */ + private $socialPubController; + + /** @var ActivityPubService */ + private $activityPubService; + + /** @var ActorService */ + private $actorService; + + /** @var MiscService */ + private $miscService; + + + /** + * ActivityPubController constructor. + * + * @param SocialPubController $socialPubController + * @param ActivityPubService $activityPubService + * @param ActorService $actorService + * @param IRequest $request + * @param MiscService $miscService + */ + public function __construct( + SocialPubController $socialPubController, ActivityPubService $activityPubService, + ActorService $actorService, IRequest $request, + MiscService $miscService + ) { + parent::__construct(Application::APP_NAME, $request); + + $this->socialPubController = $socialPubController; + $this->activityPubService = $activityPubService; + $this->actorService = $actorService; + $this->miscService = $miscService; + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function actor(string $username) { + if (!$this->checkSourceActivityStreams()) { + return $this->socialPubController->actor($username); + } + + try { +// $this->activityPubService->generateActor($userId); + + $actor = $this->actorService->getActor($username); + + return $this->directSuccess($actor); + } catch (Exception $e) { + return $this->fail($e->getMessage()); + } + } + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function aliasactor(string $username) { + return $this->actor($username); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @return Response + */ + public function sharedInbox() { + return $this->success([]); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @return Response + */ + public function inbox($username) { + + try { + $this->activityPubService->checkRequest($this->request); +// $this->noteService->receiving(file_get_contents('php://input')); + $body = file_get_contents('php://input'); +$this->miscService->log('### ' . $body); + return $this->success([]); + } catch (Exception $e) { + return $this->fail($e->getMessage()); + } + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function test($username, $body) { + + return $this->success([$username]); +// $this->miscService->log('#### ' . $toto . ' ' . json_encode($_SERVER) . ' ' . json_encode($_POST)); +// try { +// return $this->success(['author' => $author]); +// } catch (Exception $e) { +// return $this->fail('ddsaads'); +// } + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function outbox($username) { + return $this->success([$username]); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function followers($username) { + if (!$this->checkSourceActivityStreams()) { + return $this->socialPubController->followers($username); + } + + return $this->success([$username]); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function following($username) { + if (!$this->checkSourceActivityStreams()) { + return $this->socialPubController->following($username); + } + + return $this->success([$username]); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * @param $postId + * + * @return Response + */ + public function displayPost($username, $postId) { + return $this->success([$username, $postId]); + } + + + /** + * + */ + private function checkSourceActivityStreams() { + + return true; + if ($this->request->getHeader('Accept') + === 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"') { + return true; + } + + return false; + } +} + + diff --git a/lib/Controller/SocialPubController.php b/lib/Controller/SocialPubController.php new file mode 100644 index 00000000..d51b3754 --- /dev/null +++ b/lib/Controller/SocialPubController.php @@ -0,0 +1,132 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Social\Controller; + + +use daita\Traits\TNCDataResponse; +use OCA\Social\AppInfo\Application; +use OCA\Social\Service\ActivityPubService; +use OCA\Social\Service\ActorService; +use OCA\Social\Service\MiscService; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\Response; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\IRequest; + +class SocialPubController extends Controller { + + + use TNCDataResponse; + + /** @var ActivityPubService */ + private $activityPubService; + + /** @var ActorService */ + private $actorService; + + /** @var MiscService */ + private $miscService; + + + /** + * ActivityPubController constructor. + * + * @param ActivityPubService $activityPubService + * @param ActorService $actorService + * @param IRequest $request + * @param MiscService $miscService + */ + public function __construct( + ActivityPubService $activityPubService, ActorService $actorService, IRequest $request, + MiscService $miscService + ) { + parent::__construct(Application::APP_NAME, $request); + + $this->activityPubService = $activityPubService; + $this->actorService = $actorService; + $this->miscService = $miscService; + } + + + /** + * @NoCSRFRequired + * @PublicPage + e* + * @param string $username + * + * @return Response + */ + public function actor(string $username) { + return new TemplateResponse(Application::APP_NAME, 'actor', [], 'blank'); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function followers($username) { + return new TemplateResponse(Application::APP_NAME, 'followers', [], 'blank'); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * + * @return Response + */ + public function following($username) { + return new TemplateResponse(Application::APP_NAME, 'following', [], 'blank'); + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * @param string $username + * @param $postId + * + * @return Response + */ + public function displayPost($username, $postId) { + return $this->success([$username, $postId]); + } + +} + + diff --git a/lib/Db/ActorsRequest.php b/lib/Db/ActorsRequest.php new file mode 100644 index 00000000..0b80f610 --- /dev/null +++ b/lib/Db/ActorsRequest.php @@ -0,0 +1,173 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program 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. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Social\Db; + + +use OCA\Social\Exceptions\ActorDoesNotExistException; +use OCA\Social\Model\ActivityPub\Actor; +use OCA\Social\Service\ConfigService; +use OCA\Social\Service\MiscService; +use OCP\IDBConnection; + +class ActorsRequest extends ActorsRequestBuilder { + + + /** + * ServicesRequest constructor. + * + * @param IDBConnection $connection + * @param ConfigService $configService + * @param MiscService $miscService + */ + public function __construct( + IDBConnection $connection, ConfigService $configService, MiscService $miscService + ) { + parent::__construct($connection, $configService, $miscService); + } + + + /** + * @param Actor $actor + * + * @return int + * @throws \Exception + */ + public function create(Actor $actor): int { + + try { + $qb = $this->getActorsInsertSql(); + $qb->setValue('type', $qb->createNamedParameter($actor->getType())) + ->setValue('user_id', $qb->createNamedParameter($actor->getUserId())) + ->setValue( + 'preferred_username', $qb->createNamedParameter($actor->getP |