master
miklobit 2022-11-22 19:32:07 +01:00
commit 195d6f54f8
53 zmienionych plików z 1674 dodań i 2449 usunięć

Wyświetl plik

@ -11,9 +11,7 @@ package_name=$(app_name)
cert_dir=$(HOME)/.nextcloud/certificates
github_account=nextcloud
branch=master
version+=0.4.2
version+=0.5.0-beta3
all: dev-setup lint build-js-production composer test
@ -65,6 +63,7 @@ clean-dev:
rm -rf node_modules
composer:
<<<<<<< HEAD
composer install --prefer-dist --ignore-platform-req=ext-gd
composer update --prefer-dist --ignore-platform-req=ext-gd
@ -86,12 +85,30 @@ github-upload:
--tag v$(version) \
--name "$(app_name)-$(version).tar.gz" \
--file $(build_dir)/$(app_name)-$(version).tar.gz
=======
composer install --prefer-dist --no-dev
composer upgrade --prefer-dist --no-dev
composer-dev:
composer install --prefer-dist --dev
composer upgrade --prefer-dist --dev
release: appstore
>>>>>>> 72be81700039485ac4ef71fecd62eee969bc4a91
# creating .tar.gz + signature
appstore: dev-setup lint build-js-production
appstore: dev-setup lint build-js-production composer
mkdir -p $(sign_dir)
rsync -a \
--exclude=/build \
--exclude=/babel.config.js \
--exclude=/cypress.json \
--exclude=/.php-cs-fixer.cache \
--exclude=/.nextcloudignore \
--exclude=/.php-cs-fixer.dist.php \
--exclude=/psalm.xml \
--exclude=/cypress.json \
--exclude=/cypress \
--exclude=/docs \
--exclude=/translationfiles \
--exclude=/.tx \
@ -111,6 +128,7 @@ appstore: dev-setup lint build-js-production
--exclude=/l10n/l10n.pl \
--exclude=/CONTRIBUTING.md \
--exclude=/issue_template.md \
--exclude=/krankerl.toml \
--exclude=/README.md \
--exclude=/.gitattributes \
--exclude=/.gitignore \
@ -118,9 +136,6 @@ appstore: dev-setup lint build-js-production
--exclude=/.travis.yml \
--exclude=/Makefile \
$(project_dir)/ $(sign_dir)/$(app_name)
tar -czf $(build_dir)/$(app_name)-$(version).tar.gz \
tar -czf $(build_dir)/$(app_name).tar.gz \
-C $(sign_dir) $(app_name)
@if [ -f $(cert_dir)/$(app_name).key ]; then \
echo "Signing package…"; \
openssl dgst -sha512 -sign $(cert_dir)/$(app_name).key $(build_dir)/$(app_name)-$(version).tar.gz | openssl base64; \
fi

Wyświetl plik

@ -18,7 +18,7 @@
**🕸 Open standards:** We use the established ActivityPub standard!
]]></description>
<version>0.5.0-beta</version>
<version>0.5.0-beta3</version>
<licence>agpl</licence>
<author mail="maxence@artificial-owl.com" homepage="https://artificial-owl.com/">Maxence Lange</author>
<author mail="jus@bitgrid.net">Julius Härtl</author>

Wyświetl plik

@ -70,6 +70,7 @@ return [
['name' => 'OAuth#nodeinfo2', 'url' => '/.well-known/nodeinfo/2.0', 'verb' => 'GET'],
['name' => 'OAuth#apps', 'url' => '/api/v1/apps', 'verb' => 'POST'],
['name' => 'OAuth#authorize', 'url' => '/oauth/authorize', 'verb' => 'GET'],
['name' => 'OAuth#authorizing', 'url' => '/oauth/authorize', 'verb' => 'POST'],
['name' => 'OAuth#token', 'url' => '/oauth/token', 'verb' => 'POST'],
// Api for 3rd party

Wyświetl plik

@ -1,5 +0,0 @@
[package]
before_cmds = [
'npm ci',
'npm run build'
]

Wyświetl plik

@ -48,6 +48,7 @@ OC.L10N.register(
"Delete" : "Löschen",
"Edit" : "Bearbeiten",
"No description added" : "Keine Beschreibung hinzugefügt",
"Describe for the visually impaired" : "Für Sehbehinderte beschreiben",
"Close" : "Schließen",
"Unfollow" : "Entfolgen",
"Follow" : "Folgen",

Wyświetl plik

@ -46,6 +46,7 @@
"Delete" : "Löschen",
"Edit" : "Bearbeiten",
"No description added" : "Keine Beschreibung hinzugefügt",
"Describe for the visually impaired" : "Für Sehbehinderte beschreiben",
"Close" : "Schließen",
"Unfollow" : "Entfolgen",
"Follow" : "Folgen",

Wyświetl plik

@ -91,7 +91,7 @@ OC.L10N.register(
"User not found" : "Utilisateur introuvable",
"Sorry, we could not find the account of {userId}" : "Désolé, impossible de trouver l'utilisateur {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud fait maintenant partie des réseaux sociaux fédérés !",
"We automatically created a Social account for you. Your Social ID is the same as your Federated Cloud ID:" : "Nous avons automatiquement créé un compte social pour vous. Votre identifiant social est le même que votre identifiant de cloud fédéré :",
"We automatically created a Social account for you. Your Social ID is the same as your Federated Cloud ID:" : "Nous avons automatiquement créé un compte social pour vous. Votre identifiant social est le même que votre ID de Cloud Fédéré :",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Comme vous êtes nouveau dans Social, commencez par suivre le compte officiel de Nextcloud afin de ne manquer aucune nouvelle",
"Follow Nextcloud on mastodon.xyz" : "Suivre Nextcloud sur mastodon.xyz",
"You haven't receive any notifications yet" : "Vous n'avez pas encore reçu de notification",

Wyświetl plik

@ -89,7 +89,7 @@
"User not found" : "Utilisateur introuvable",
"Sorry, we could not find the account of {userId}" : "Désolé, impossible de trouver l'utilisateur {userId}",
"Nextcloud becomes part of the federated social networks!" : "Nextcloud fait maintenant partie des réseaux sociaux fédérés !",
"We automatically created a Social account for you. Your Social ID is the same as your Federated Cloud ID:" : "Nous avons automatiquement créé un compte social pour vous. Votre identifiant social est le même que votre identifiant de cloud fédéré :",
"We automatically created a Social account for you. Your Social ID is the same as your Federated Cloud ID:" : "Nous avons automatiquement créé un compte social pour vous. Votre identifiant social est le même que votre ID de Cloud Fédéré :",
"Since you are new to Social, start by following the official Nextcloud account so you don't miss any news" : "Comme vous êtes nouveau dans Social, commencez par suivre le compte officiel de Nextcloud afin de ne manquer aucune nouvelle",
"Follow Nextcloud on mastodon.xyz" : "Suivre Nextcloud sur mastodon.xyz",
"You haven't receive any notifications yet" : "Vous n'avez pas encore reçu de notification",

Wyświetl plik

@ -75,7 +75,7 @@ class AccountCreate extends Base {
/**
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('userId');
if (($handle = $input->getOption('handle')) === null) {
@ -87,5 +87,7 @@ class AccountCreate extends Base {
}
$this->accountService->createActor($userId, $handle);
return 0;
}
}

Wyświetl plik

@ -76,7 +76,7 @@ class AccountFollowing extends Base {
/**
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('userId');
$account = $input->getArgument('account');
@ -91,5 +91,7 @@ class AccountFollowing extends Base {
} else {
$this->followService->followAccount($actor, $account);
}
return 0;
}
}

Wyświetl plik

@ -67,7 +67,7 @@ class CacheRefresh extends Base {
/**
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$result = $this->accountService->blindKeyRotation();
$output->writeLn($result . ' key pairs refreshed');
@ -85,5 +85,7 @@ class CacheRefresh extends Base {
$result = $this->hashtagService->manageHashtags();
$output->writeLn($result . ' hashtags updated');
return 0;
}
}

Wyświetl plik

@ -31,7 +31,6 @@ declare(strict_types=1);
namespace OCA\Social\Command;
use OCA\Social\Tools\Traits\TArrayTools;
use Exception;
use OC\Core\Command\Base;
use OCA\Social\Db\StreamDestRequest;
@ -42,6 +41,7 @@ use OCA\Social\Service\CheckService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\PushService;
use OCA\Social\Tools\Traits\TArrayTools;
use OCP\IUserManager;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
@ -97,9 +97,9 @@ class CheckInstall extends Base {
/**
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
if ($this->askRegenerateIndex($input, $output)) {
return;
return 0;
}
// if ($this->checkPushApp($input, $output)) {
@ -114,6 +114,8 @@ class CheckInstall extends Base {
$output->writeln('');
$output->writeln('- Your current configuration: ');
$output->writeln(json_encode($this->configService->getConfig(), JSON_PRETTY_PRINT));
return 0;
}
/**

Wyświetl plik

@ -58,8 +58,8 @@ class Fediverse extends Base {
parent::configure();
$this->setName('social:fediverse')
->addOption(
'type', 't', InputArgument::OPTIONAL,
'Change the type of access management', ''
'type', 't', InputArgument::OPTIONAL,
'Change the type of access management', ''
)
->addArgument('action', InputArgument::OPTIONAL, 'add/remove/test address', '')
->addArgument('address', InputArgument::OPTIONAL, 'address/host', '')
@ -69,11 +69,11 @@ class Fediverse extends Base {
/**
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$this->output = $output;
if ($this->typeAccess($input->getOption('type'))) {
return;
return 0;
}
$this->output->writeln(
@ -108,6 +108,8 @@ class Fediverse extends Base {
default:
throw new Exception('specify action: add, remove, list, reset');
}
return 0;
}
/**

Wyświetl plik

@ -119,10 +119,10 @@ class MigrateAlpha3 extends Base {
$this->setName('social:migrate:alpha3')
->setDescription('Trying to migrate old data to Alpha3')
->addOption(
'remove-migrated-tables', '', InputOption::VALUE_NONE, 'Remove old table once copy is done'
'remove-migrated-tables', '', InputOption::VALUE_NONE, 'Remove old table once copy is done'
)
->addOption(
'force-remove-old-tables', '', InputOption::VALUE_NONE, 'Force remove old tables'
'force-remove-old-tables', '', InputOption::VALUE_NONE, 'Force remove old tables'
);
}
@ -130,7 +130,7 @@ class MigrateAlpha3 extends Base {
/**
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$tables = $this->checkTables();
if ($input->getOption('force-remove-old-tables')) {
@ -138,13 +138,13 @@ class MigrateAlpha3 extends Base {
$this->dropTable($table);
}
return;
return 0;
}
if (empty($tables)) {
$output->writeln('Nothing to migrate.');
return;
return 0;
}
$defTables = '';
@ -157,7 +157,7 @@ class MigrateAlpha3 extends Base {
);
if (!$this->confirmExecute($input, $output)) {
return;
return 0;
}
$this->done = [];
@ -166,6 +166,8 @@ class MigrateAlpha3 extends Base {
if ($input->getOption('remove-migrated-tables')) {
$this->dropDeprecatedTables($input, $output);
}
return 0;
}

Wyświetl plik

@ -85,7 +85,7 @@ class NoteBoost extends Base {
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('user_id');
$noteId = $input->getArgument('note_id');
@ -101,5 +101,7 @@ class NoteBoost extends Base {
echo 'object: ' . json_encode($activity, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
echo 'token: ' . $token . "\n";
return 0;
}
}

Wyświetl plik

@ -96,18 +96,18 @@ class NoteCreate extends Base {
parent::configure();
$this->setName('social:note:create')
->addOption(
'replyTo', 'r', InputOption::VALUE_OPTIONAL, 'in reply to an existing thread'
'replyTo', 'r', InputOption::VALUE_OPTIONAL, 'in reply to an existing thread'
)
->addOption(
'to', 't', InputOption::VALUE_OPTIONAL, 'mentioning people'
'to', 't', InputOption::VALUE_OPTIONAL, 'mentioning people'
)
->addOption(
'type', 'y', InputOption::VALUE_OPTIONAL,
'type: public (default), followers, unlisted, direct'
'type', 'y', InputOption::VALUE_OPTIONAL,
'type: public (default), followers, unlisted, direct'
)
->addOption(
'hashtag', 'g', InputOption::VALUE_OPTIONAL,
'hashtag, without the leading #'
'hashtag', 'g', InputOption::VALUE_OPTIONAL,
'hashtag, without the leading #'
)
->addArgument('user_id', InputArgument::REQUIRED, 'userId of the author')
->addArgument('content', InputArgument::REQUIRED, 'content of the post')
@ -121,7 +121,7 @@ class NoteCreate extends Base {
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('userid');
$content = $input->getArgument('content');
$to = $input->getOption('to');
@ -142,5 +142,7 @@ class NoteCreate extends Base {
echo 'object: ' . json_encode($activity, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
echo 'token: ' . $token . "\n";
return 0;
}
}

Wyświetl plik

@ -97,7 +97,7 @@ class NoteLike extends Base {
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$userId = $input->getArgument('user_id');
$noteId = $input->getArgument('note_id');
@ -113,5 +113,7 @@ class NoteLike extends Base {
echo 'object: ' . json_encode($activity, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
echo 'token: ' . $token . "\n";
return 0;
}
}

Wyświetl plik

@ -87,12 +87,13 @@ class QueueProcess extends Base {
* @param InputInterface $input
* @param OutputInterface $output
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$output->writeLn('processing requests queue');
$this->processRequestQueue($output);
$output->writeLn('processing stream queue');
$this->processStreamQueue($output);
return 0;
}

Wyświetl plik

@ -73,7 +73,7 @@ class QueueStatus extends Base {
parent::configure();
$this->setName('social:queue:status')
->addOption(
'token', 't', InputOption::VALUE_OPTIONAL, 'token of a request'
'token', 't', InputOption::VALUE_OPTIONAL, 'token of a request'
)
->setDescription('Return status on the request queue');
}
@ -85,7 +85,7 @@ class QueueStatus extends Base {
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$token = $input->getOption('token');
if ($token === null) {
@ -97,5 +97,7 @@ class QueueStatus extends Base {
foreach ($requests as $request) {
$output->writeLn(json_encode($request));
}
return 0;
}
}

Wyświetl plik

@ -91,7 +91,7 @@ class Reset extends Base {
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$helper = $this->getHelper('question');
$output->writeln(
'<error>Beware, this operation will delete all content from the Social App.</error>'
@ -102,7 +102,7 @@ class Reset extends Base {
);
if (!$helper->ask($input, $output, $question)) {
return;
return 0;
}
$question = new ConfirmationQuestion(
@ -110,7 +110,7 @@ class Reset extends Base {
'/^(y|Y)/i'
);
if (!$helper->ask($input, $output, $question)) {
return;
return 0;
}
@ -124,7 +124,7 @@ class Reset extends Base {
$output->writeln('<error>' . $e->getMessage() . '</error>');
}
return;
return 0;
}
@ -136,7 +136,7 @@ class Reset extends Base {
} catch (Exception $e) {
$output->writeln('<error>' . $e->getMessage() . '</error>');
return;
return 0;
}
$this->checkService->checkInstallationStatus(true);
@ -152,13 +152,15 @@ class Reset extends Base {
$newCloudAddress = $helper->ask($input, $output, $question);
if ($newCloudAddress === $cloudAddress) {
return;
return 0;
}
$this->configService->setCloudUrl($newCloudAddress);
$output->writeln('');
$output->writeln('New address: <info>' . $newCloudAddress . '</info>');
return 0;
}

Wyświetl plik

@ -92,7 +92,7 @@ class StreamDetails extends ExtendedBase {
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
protected function execute(InputInterface $input, OutputInterface $output): int {
$output = new ConsoleOutput();
$this->output = $output->section();
@ -110,7 +110,7 @@ class StreamDetails extends ExtendedBase {
if ($this->asJson) {
$this->output->writeln(json_encode($details, JSON_PRETTY_PRINT));
return;
return 0;
}
$this->outputStream($stream);
@ -133,5 +133,7 @@ class StreamDetails extends ExtendedBase {
$this->output->writeln('* <info>Direct</info>: ' . json_encode($direct, JSON_PRETTY_PRINT));
$this->output->writeln('* <info>Public</info>: ' . ($details->isPublic() ? 'true' : 'false'));
$this->output->writeln('* <info>Federated</info>: ' . ($details->isFederated() ? 'true' : 'false'));
return 0;
}
}

Wyświetl plik

@ -34,11 +34,11 @@ namespace OCA\Social\Command;
use Exception;
use OCA\Social\Db\StreamRequest;
use OCA\Social\Exceptions\UnknownTimelineException;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\Client\Options\TimelineOptions;
use OCA\Social\Service\AccountService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Tools\Exceptions\DateTimeException;
use OCP\IUserManager;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@ -145,18 +145,12 @@ class Timeline extends ExtendedBase {
/**
* @param Person $actor
* @param string $timeline
* @param TimelineOptions $options
*
* @throws Exception
* @throws DateTimeException
*/
private function displayUnsupportedStream(TimelineOptions $options) {
switch ($options->getTimeline()) {
case 'direct':
$stream = $this->streamRequest->getTimelineDirect(0, $options->getLimit());
$this->outputStreams($stream);
break;
case 'notifications':
$stream = $this->streamRequest->getTimelineNotifications(0, $options->getLimit());
$this->outputStreams($stream);

Wyświetl plik

@ -45,6 +45,8 @@ use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
@ -59,6 +61,7 @@ class OAuthController extends Controller {
private ClientService $clientService;
private ConfigService $configService;
private LoggerInterface $logger;
private IInitialState $initialState;
public function __construct(
IRequest $request,
@ -69,7 +72,8 @@ class OAuthController extends Controller {
CacheActorService $cacheActorService,
ClientService $clientService,
ConfigService $configService,
LoggerInterface $logger
LoggerInterface $logger,
IInitialState $initialState
) {
parent::__construct(Application::APP_NAME, $request);
@ -81,6 +85,7 @@ class OAuthController extends Controller {
$this->clientService = $clientService;
$this->configService = $configService;
$this->logger = $logger;
$this->initialState = $initialState;
$body = file_get_contents('php://input');
$logger->debug('[OAuthController] input: ' . $body);
@ -115,6 +120,7 @@ class OAuthController extends Controller {
"protocols" => [
"activitypub"
],
"rootUrl" => rtrim($this->urlGenerator->linkToRouteAbsolute('social.Navigation.navigate'), '/'),
"usage" => $usage,
"openRegistrations" => $openReg
];
@ -172,13 +178,47 @@ class OAuthController extends Controller {
string $redirect_uri,
string $response_type,
string $scope = 'read'
): Response {
$user = $this->userSession->getUser();
// check actor exists
$this->accountService->getActorFromUserId($user->getUID());
if ($response_type !== 'code') {
throw new ClientNotFoundException('invalid response type');
}
// check client exists in db
$client = $this->clientService->getFromClientId($client_id);
$this->initialState->provideInitialState('appName', $client->getAppName());
return new TemplateResponse(Application::APP_NAME, 'oauth2', [
'request' =>
[
'clientId' => $client_id,
'redirectUri' => $redirect_uri,
'responseType' => $response_type,
'scope' => $scope
]
]);
}
/**
* @NoAdminRequired
*/
public function authorizing(
string $client_id,
string $redirect_uri,
string $response_type,
string $scope = 'read'
): DataResponse {
try {
$user = $this->userSession->getUser();
$account = $this->accountService->getActorFromUserId($user->getUID());
if ($response_type !== 'code') {
return new DataResponse(['error' => 'invalid_type'], Http::STATUS_BAD_REQUEST);
throw new ClientNotFoundException('invalid response type');
}
$client = $this->clientService->getFromClientId($client_id);
@ -204,18 +244,12 @@ class OAuthController extends Controller {
// TODO : finalize result if no redirect_url
return new DataResponse(
[
'code' => $code,
// 'access_token' => '',
// "token_type" => "Bearer",
// "scope" => "read write follow push",
// "created_at" => 1573979017
], Http::STATUS_OK
['code' => $code], Http::STATUS_OK
);
} catch (Exception $e) {
$this->logger->notice($e->getMessage() . ' ' . get_class($e));
return new DataResponse(['error' => $e->getMessage()], Http::STATUS_UNAUTHORIZED);
return new DataResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST);
}
}

Wyświetl plik

@ -1,70 +0,0 @@
<?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\Cron;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\TimedJob;
use OCA\Social\Service\ConfigService;
use OCP\AppFramework\QueryException;
/**
* Class Queue
*
* @package OCA\Social\Cron
*/
class Chunk extends TimedJob {
private ConfigService $configService;
public function __construct(ITimeFactory $time, ConfigService $configService) {
parent::__construct($time);
$this->setInterval(12 * 3600); // 12 hours
$this->configService = $configService;
}
/**
* @param mixed $argument
*
* @throws QueryException
*/
protected function run($argument) {
$size = (int)$this->configService->getAppValue(ConfigService::DATABASE_CHUNK_SIZE);
$this->morphChunks($size);
}
/**
* @param int $size
*/
private function morphChunks(int $size): void {
}
}

Wyświetl plik

@ -53,13 +53,13 @@ class ActorsRequest extends ActorsRequestBuilder {
->setValue('summary', $qb->createNamedParameter($actor->getSummary()))
->setValue('avatar_version', $qb->createNamedParameter($actor->getAvatarVersion()))
->setValue(
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
)
->setValue('public_key', $qb->createNamedParameter($actor->getPublicKey()))
->setValue('private_key', $qb->createNamedParameter($actor->getPrivateKey()))
->setValue(
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
$qb->executeStatement();

Wyświetl plik

@ -121,7 +121,7 @@ class ActorsRequestBuilder extends CoreRequestBuilder {
->setLocal(true)
->setAvatarVersion($this->getInt('avatar_version', $data, -1))
->setAccount(
$actor->getPreferredUsername() . '@' . $this->configService->getSocialAddress()
$actor->getPreferredUsername() . '@' . $this->configService->getSocialAddress()
);
$actor->setUrlSocial($root)
->setUrl($actor->getId());

Wyświetl plik

@ -59,7 +59,7 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
->setValue('featured', $qb->createNamedParameter($actor->getFeatured()))
->setValue('url', $qb->createNamedParameter($actor->getUrl()))
->setValue(
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
)
->setValue('name', $qb->createNamedParameter($actor->getName()))
->setValue('summary', $qb->createNamedParameter($actor->getSummary()))
@ -112,7 +112,7 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
->set('featured', $qb->createNamedParameter($actor->getFeatured()))
->set('url', $qb->createNamedParameter($actor->getUrl()))
->set(
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
)
->set('name', $qb->createNamedParameter($actor->getName()))
->set('summary', $qb->createNamedParameter($actor->getSummary()))

Wyświetl plik

@ -77,7 +77,7 @@ class CacheActorsRequestBuilder extends CoreRequestBuilder {
/** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->select(
'ca.nid', 'ca.id', 'ca.account', 'ca.following', 'ca.followers', 'ca.inbox', 'ca.shared_inbox',
'ca.id', 'ca.account', 'ca.following', 'ca.followers', 'ca.inbox', 'ca.shared_inbox',
'ca.outbox', 'ca.featured', 'ca.url', 'ca.type', 'ca.preferred_username', 'ca.name', 'ca.summary',
'ca.public_key', 'ca.local', 'ca.details', 'ca.source', 'ca.creation'
)

Wyświetl plik

@ -56,7 +56,7 @@ class ClientRequest extends ClientRequestBuilder {
$qb->setValue('app_name', $qb->createNamedParameter($client->getAppName()))
->setValue('app_website', $qb->createNamedParameter($client->getAppWebsite()))
->setValue(
'app_redirect_uris', $qb->createNamedParameter(json_encode($client->getAppRedirectUris()))
'app_redirect_uris', $qb->createNamedParameter(json_encode($client->getAppRedirectUris()))
)
->setValue('app_client_id', $qb->createNamedParameter($client->getAppClientId()))
->setValue('app_client_secret', $qb->createNamedParameter($client->getAppClientSecret()))

Wyświetl plik

@ -48,6 +48,7 @@ use OCA\Social\Service\MiscService;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IURLGenerator;
use OCP\Server;
use Psr\Log\LoggerInterface;
/**
@ -56,26 +57,26 @@ use Psr\Log\LoggerInterface;
* @package OCA\Social\Db
*/
class CoreRequestBuilder {
public const TABLE_REQUEST_QUEUE = 'social_3_req_queue';
public const TABLE_INSTANCE = 'social_3_instance';
public const TABLE_REQUEST_QUEUE = 'social_req_queue';
public const TABLE_INSTANCE = 'social_instance';
public const TABLE_ACTORS = 'social_3_actor';
public const TABLE_STREAM = 'social_3_stream';
public const TABLE_STREAM_DEST = 'social_3_stream_dest';
public const TABLE_STREAM_TAGS = 'social_3_stream_tag';
public const TABLE_STREAM_QUEUE = 'social_3_stream_queue';
public const TABLE_STREAM_ACTIONS = 'social_3_stream_act';
public const TABLE_ACTORS = 'social_actor';
public const TABLE_STREAM = 'social_stream';
public const TABLE_STREAM_DEST = 'social_stream_dest';
public const TABLE_STREAM_TAGS = 'social_stream_tag';
public const TABLE_STREAM_QUEUE = 'social_stream_queue';
public const TABLE_STREAM_ACTIONS = 'social_stream_act';
public const TABLE_HASHTAGS = 'social_3_hashtag';
public const TABLE_FOLLOWS = 'social_3_follow';
public const TABLE_ACTIONS = 'social_3_action';
public const TABLE_HASHTAGS = 'social_hashtag';
public const TABLE_FOLLOWS = 'social_follow';
public const TABLE_ACTIONS = 'social_action';
public const TABLE_CACHE_ACTORS = 'social_3_cache_actor';
public const TABLE_CACHE_DOCUMENTS = 'social_3_cache_doc';
public const TABLE_CACHE_ACTORS = 'social_cache_actor';
public const TABLE_CACHE_DOCUMENTS = 'social_cache_doc';
public const TABLE_CLIENT = 'social_3_client';
public const TABLE_CLIENT_AUTH = 'social_3_client_auth';
public const TABLE_CLIENT_TOKEN = 'social_3_client_token';
public const TABLE_CLIENT = 'social_client';
public const TABLE_CLIENT_AUTH = 'social_client_auth';
public const TABLE_CLIENT_TOKEN = 'social_client_token';
private array $tables = [
@ -105,7 +106,10 @@ class CoreRequestBuilder {
protected ?string $defaultSelectAlias = null;
public function __construct(
IDBConnection $connection, LoggerInterface $logger, IURLGenerator $urlGenerator, ConfigService $configService,
IDBConnection $connection,
LoggerInterface $logger,
IURLGenerator $urlGenerator,
ConfigService $configService,
MiscService $miscService
) {
$this->dbConnection = $connection;
@ -736,8 +740,7 @@ class CoreRequestBuilder {
$pf = (($alias === '') ? $this->defaultSelectAlias : $alias);
$qb->from(self::TABLE_CACHE_ACTORS, $pf);
$qb->selectAlias($pf . '.nid', 'cacheactor_nid')
->selectAlias($pf . '.id', 'cacheactor_id')
$qb->selectAlias($pf . '.id', 'cacheactor_id')
->selectAlias($pf . '.type', 'cacheactor_type')
->selectAlias($pf . '.account', 'cacheactor_account')
->selectAlias($pf . '.following', 'cacheactor_following')
@ -777,8 +780,7 @@ class CoreRequestBuilder {
$pf = ($alias === '') ? $this->defaultSelectAlias : $alias;
$qb->selectAlias('ca.nid', 'cacheactor_nid')
->selectAlias('ca.id', 'cacheactor_id')
$qb->selectAlias('ca.id', 'cacheactor_id')
->selectAlias('ca.type', 'cacheactor_type')
->selectAlias('ca.account', 'cacheactor_account')
->selectAlias('ca.following', 'cacheactor_following')
@ -1052,8 +1054,8 @@ class CoreRequestBuilder {
->selectAlias($prefix . '_f.follow_id', $prefix . '_follow_id')
->selectAlias($prefix . '_f.creation', $prefix . '_creation')
->leftJoin(
$this->defaultSelectAlias, CoreRequestBuilder::TABLE_FOLLOWS, $prefix . '_f',
$andX
$this->defaultSelectAlias, CoreRequestBuilder::TABLE_FOLLOWS, $prefix . '_f',
$andX
);
}
@ -1129,7 +1131,7 @@ class CoreRequestBuilder {
*/
public function emptyAll() {
/** @var ISchemaWrapper|SchemaWrapper $schema */
$schema = new SchemaWrapper($this->dbConnection);
$schema = new SchemaWrapper(Server::get(OC\DB\Connection::class));
foreach ($this->tables as $table) {
if ($schema->hasTable($table)) {
$qb = $this->dbConnection->getQueryBuilder();
@ -1145,7 +1147,7 @@ class CoreRequestBuilder {
*/
public function uninstallSocialTables() {
/** @var ISchemaWrapper|SchemaWrapper $schema */
$schema = new SchemaWrapper($this->dbConnection);
$schema = new SchemaWrapper(Server::get(OC\DB\Connection::class));
foreach ($this->tables as $table) {
if ($schema->hasTable($table)) {
$schema->dropTable($table);

Wyświetl plik

@ -66,9 +66,9 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
->setValue('author', $qb->createNamedParameter($queue->getAuthor()))
->setValue('activity', $qb->createNamedParameter($queue->getActivity()))
->setValue(
'instance', $qb->createNamedParameter(
json_encode($queue->getInstance(), JSON_UNESCAPED_SLASHES)
)
'instance', $qb->createNamedParameter(
json_encode($queue->getInstance(), JSON_UNESCAPED_SLASHES)
)
)
->setValue('priority', $qb->createNamedParameter($queue->getPriority()))
->setValue('status', $qb->createNamedParameter($queue->getStatus()))
@ -133,8 +133,8 @@ class RequestQueueRequest extends RequestQueueRequestBuilder {
$qb = $this->getRequestQueueUpdateSql();
$qb->set('status', $qb->createNamedParameter(RequestQueue::STATUS_RUNNING))
->set(
'last',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
'last',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
$this->limitToId($qb, $queue->getId());
$this->limitToStatus($qb, RequestQueue::STATUS_STANDBY);

Wyświetl plik

@ -34,7 +34,6 @@ namespace OCA\Social\Db;
use OCA\Social\Tools\Db\ExtendedQueryBuilder;
use OC\SystemConfig;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCP\DB\QueryBuilder\ICompositeExpression;
use OCP\IDBConnection;
use OCP\IURLGenerator;
use Psr\Log\LoggerInterface;
@ -47,7 +46,6 @@ use Psr\Log\LoggerInterface;
class SocialCoreQueryBuilder extends ExtendedQueryBuilder {
protected IURLGenerator $urlGenerator;
private ?Person $viewer = null;
private int $chunk = 0;
public function __construct(
IDBConnection $connection, SystemConfig $systemConfig, LoggerInterface $logger, IURLGenerator $urlGenerator
@ -57,32 +55,6 @@ class SocialCoreQueryBuilder extends ExtendedQueryBuilder {
$this->urlGenerator = $urlGenerator;
}
public function setChunk(int $chunk): self {
$this->chunk = $chunk;
$this->inChunk();
return $this;
}
public function getChunk(): int {
return $this->chunk;
}
/**
* Limit the request to a chunk
*/
public function inChunk(string $alias = '', ?ICompositeExpression $expr = null): void {
if ($this->getChunk() === 0) {
return;
}
if ($expr !== null) {
$expr->add($this->exprLimitToDBFieldInt('chunk', $this->getChunk(), $alias));
return;
}
$this->limitToDBFieldInt('chunk', $this->getChunk(), $alias);
}
public function hasViewer(): bool {
return ($this->viewer !== null);

Wyświetl plik

@ -56,7 +56,6 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder {
if ($aliasDest !== '') {
$this->from(CoreRequestBuilder::TABLE_STREAM_DEST, $aliasDest);
// $this->inChunk($aliasDest);
}
if ($aliasFollowing !== '') {
$this->from(CoreRequestBuilder::TABLE_FOLLOWS, $aliasFollowing);
@ -109,8 +108,7 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder {
$this->from(CoreRequestBuilder::TABLE_CACHE_ACTORS, $pf);
}
$this->selectAlias($pf . '.nid', 'cacheactor_nid')
->selectAlias($pf . '.id', 'cacheactor_id')
$this->selectAlias($pf . '.id', 'cacheactor_id')
->selectAlias($pf . '.type', 'cacheactor_type')
->selectAlias($pf . '.account', 'cacheactor_account')
->selectAlias($pf . '.following', 'cacheactor_following')
@ -185,8 +183,8 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder {
->selectAlias('cd.error', 'cachedocument_error')
->selectAlias('cd.creation', 'cachedocument_creation')
->leftJoin(
$this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, 'cd',
$expr->eq($func->lower($pf . '.' . $fieldDocumentId), $func->lower('cd.id'))
$this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_CACHE_DOCUMENTS, 'cd',
$expr->eq($func->lower($pf . '.' . $fieldDocumentId), $func->lower('cd.id'))
);
}
@ -277,7 +275,6 @@ class SocialCrossQueryBuilder extends SocialCoreQueryBuilder {
$orX->add($expr->eq($alias . '.stream_id_prim', $pf . '.object_id_prim'));
$on = $expr->andX();
// $this->inChunk('sa', $on);
$viewer = $this->getViewer();
$idPrim = $this->prim($viewer->getId());

Wyświetl plik

@ -56,9 +56,9 @@ class StreamActionsRequest extends StreamActionsRequestBuilder {
->setValue('stream_id', $qb->createNamedParameter($action->getStreamId()))
->setValue('stream_id_prim', $qb->createNamedParameter($this->prim($action->getStreamId())))
->setValue(
'values', $qb->createNamedParameter(
json_encode($values, JSON_UNESCAPED_SLASHES)
)
'values', $qb->createNamedParameter(
json_encode($values, JSON_UNESCAPED_SLASHES)
)
)
->setValue('liked', $qb->createNamedParameter(($liked) ? 1 : 0))
->setValue('boosted', $qb->createNamedParameter(($boosted) ? 1 : 0))

Wyświetl plik

@ -110,8 +110,8 @@ class StreamQueueRequest extends StreamQueueRequestBuilder {
$qb = $this->getStreamQueueUpdateSql();
$qb->set('status', $qb->createNamedParameter(StreamQueue::STATUS_RUNNING))
->set(
'last',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
'last',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
$this->limitToId($qb, $queue->getId());
$this->limitToStatus($qb, StreamQueue::STATUS_STANDBY);

Wyświetl plik

@ -77,9 +77,9 @@ class StreamRequest extends StreamRequestBuilder {
/** @var Note $stream */
$qb->setValue('hashtags', $qb->createNamedParameter(json_encode($stream->getHashtags())))
->setValue(
'attachments', $qb->createNamedParameter(
json_encode($stream->getAttachments(), JSON_UNESCAPED_SLASHES)
)
'attachments', $qb->createNamedParameter(
json_encode($stream->getAttachments(), JSON_UNESCAPED_SLASHES)
)
);
}
@ -334,22 +334,33 @@ class StreamRequest extends StreamRequestBuilder {
public function getTimeline(TimelineOptions $options): array {
switch (strtolower($options->getTimeline())) {
case 'home':
return $this->getTimelineHome($options);
$result = $this->getTimelineHome($options);
break;
case 'direct':
$result = $this->getTimelineDirect($options);
break;
case 'public':
$options->setLocal(false);
return $this->getTimelinePublic($options);
$result = $this->getTimelinePublic($options);
break;
case 'local':
$options->setLocal(true);
$result = $this->getTimelinePublic($options);
break;
return $this->getTimelinePublic($options);
default:
return [];
}
return [];
if ($options->isInverted()) {
$result = array_reverse($result);
}
return $result;
}
/**
* Should returns:
* Should return:
* * Own posts,
* * Followed accounts
*
@ -357,9 +368,8 @@ class StreamRequest extends StreamRequestBuilder {
*
* @return Stream[]
*/
public function getTimelineHome(TimelineOptions $options): array {
private function getTimelineHome(TimelineOptions $options): array {
$qb = $this->getStreamSelectSql($options->getFormat());
$qb->setChunk(1);
$qb->filterType(SocialAppNotification::TYPE);
$qb->paginate($options);
@ -370,17 +380,37 @@ class StreamRequest extends StreamRequestBuilder {
$qb->leftJoinStreamAction('sa');
$qb->filterDuplicate();
$result = $this->getStreamsFromRequest($qb);
if ($options->isInverted()) {
$result = array_reverse($result);
}
return $result;
return $this->getStreamsFromRequest($qb);
}
/**
* Should returns:
* Should return:
* * Private message.
* - group messages. (not yet)
*
* @param TimelineOptions $options
*
* @return Stream[]
*/
private function getTimelineDirect(TimelineOptions $options): array {
$qb = $this->getStreamSelectSql();
$qb->filterType(SocialAppNotification::TYPE);
$qb->paginate($options);
$qb->linkToCacheActors('ca', 's.attributed_to_prim');
$viewer = $qb->getViewer();
$qb->selectDestFollowing('sd', '');
$qb->limitToDest($viewer->getId(), 'dm', '', 'sd');
return $this->getStreamsFromRequest($qb);
}
/**
* Should return:
* * Own posts,
* * Followed accounts
*
@ -396,7 +426,6 @@ class StreamRequest extends StreamRequestBuilder {
int $since = 0, int $limit = 5, int $format = Stream::FORMAT_ACTIVITYPUB
): array {
$qb = $this->getStreamSelectSql($format);
$qb->setChunk(1);
$qb->filterType(SocialAppNotification::TYPE);
$qb->limitPaginate($since, $limit);
@ -412,7 +441,7 @@ class StreamRequest extends StreamRequestBuilder {
/**
* Should returns:
* Should return:
* * Public/Unlisted/Followers-only post where current $actor is tagged,
* - Events: (not yet)
* - people liking or re-posting your posts (not yet)
@ -444,7 +473,7 @@ class StreamRequest extends StreamRequestBuilder {
/**
* Should returns:
* Should return:
* * public message from actorId.
* - to followers-only if follower is logged. (not yet (check ?))
*
@ -474,7 +503,7 @@ class StreamRequest extends StreamRequestBuilder {
/**
* Should returns:
* Should return:
* * Private message.
* - group messages. (not yet)
*
@ -484,7 +513,7 @@ class StreamRequest extends StreamRequestBuilder {
* @return Stream[]
* @throws DateTimeException
*/
public function getTimelineDirect(int $since = 0, int $limit = 5): array {
public function getTimelineDirect_dep(int $since = 0, int $limit = 5): array {
$qb = $this->getStreamSelectSql();
$qb->filterType(SocialAppNotification::TYPE);
@ -506,9 +535,8 @@ class StreamRequest extends StreamRequestBuilder {
* @param TimelineOptions $options
*
* @return Stream[]
* @throws DateTimeException
*/
public function getTimelinePublic(TimelineOptions $options): array {
private function getTimelinePublic(TimelineOptions $options): array {
$qb = $this->getStreamSelectSql($options->getFormat());
$qb->paginate($options);
@ -524,12 +552,7 @@ class StreamRequest extends StreamRequestBuilder {
$qb->innerJoinSteamDest('recipient', 'id_prim', 'sd', 's');
$qb->limitToDest(ACore::CONTEXT_PUBLIC, 'recipient', 'to', 'sd');
$result = $this->getStreamsFromRequest($qb);
if ($options->isInverted()) {
$result = array_reverse($result);
}
return $result;
return $this->getStreamsFromRequest($qb);
}
@ -598,7 +621,7 @@ class StreamRequest extends StreamRequestBuilder {
/**
* Should returns:
* Should return:
* - All public post related to a tag (not yet)
* - direct message related to a tag (not yet)
* - message to followers related to a tag (not yet)
@ -709,19 +732,19 @@ class StreamRequest extends StreamRequestBuilder {
->setValue('subtype', $qb->createNamedParameter($stream->getSubType()))
->setValue('to', $qb->createNamedParameter($stream->getTo()))
->setValue(
'to_array', $qb->createNamedParameter(
json_encode($stream->getToArray(), JSON_UNESCAPED_SLASHES)
)
'to_array', $qb->createNamedParameter(
json_encode($stream->getToArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue(
'cc', $qb->createNamedParameter(
json_encode($stream->getCcArray(), JSON_UNESCAPED_SLASHES)
)
'cc', $qb->createNamedParameter(
json_encode($stream->getCcArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue(
'bcc', $qb->createNamedParameter(
json_encode($stream->getBccArray(), JSON_UNESCAPED_SLASHES)
)
'bcc', $qb->createNamedParameter(
json_encode($stream->getBccArray(), JSON_UNESCAPED_SLASHES)
)
)
->setValue('content', $qb->createNamedParameter($stream->getContent()))
->setValue('summary', $qb->createNamedParameter($stream->getSummary()))
@ -737,13 +760,13 @@ class StreamRequest extends StreamRequestBuilder {
->setValue('details', $qb->createNamedParameter(json_encode($stream->getDetailsAll())))
->setValue('cache', $qb->createNamedParameter($cache))
->setValue(
'filter_duplicate',
$qb->createNamedParameter(($stream->isFilterDuplicate()) ? '1' : '0')
'filter_duplicate',
$qb->createNamedParameter(($stream->isFilterDuplicate()) ? '1' : '0')
)
->setValue(
'instances', $qb->createNamedParameter(
json_encode($stream->getInstancePaths(), JSON_UNESCAPED_SLASHES)
)
'instances', $qb->createNamedParameter(
json_encode($stream->getInstancePaths(), JSON_UNESCAPED_SLASHES)
)
)
->setValue('local', $qb->createNamedParameter(($stream->isLocal()) ? '1' : '0'));
@ -754,8 +777,8 @@ class StreamRequest extends StreamRequestBuilder {
'published_time', $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
)
->setValue(
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
} catch (Exception $e) {
}

Wyświetl plik

@ -92,10 +92,10 @@ class StreamRequestBuilder extends CoreRequestBuilder {
/** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->selectDistinct('s.id')
->addSelect(
's.nid', 's.type', 's.subtype', 's.to', 's.to_array', 's.cc', 's.bcc', 's.content',
's.summary', 's.attachments', 's.published', 's.published_time', 's.cache',
's.object_id', 's.attributed_to', 's.in_reply_to', 's.source', 's.local',
's.instances', 's.creation', 's.filter_duplicate', 's.details', 's.hashtags'
's.nid', 's.type', 's.subtype', 's.to', 's.to_array', 's.cc', 's.bcc', 's.content',
's.summary', 's.attachments', 's.published', 's.published_time', 's.cache',
's.object_id', 's.attributed_to', 's.in_reply_to', 's.source', 's.local',
's.instances', 's.creation', 's.filter_duplicate', 's.details', 's.hashtags'
)
->from(self::TABLE_STREAM, 's');

Wyświetl plik

@ -1,74 +0,0 @@
<?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\Migration;
use OCA\Social\Service\CheckService;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
/**
* Class CheckInstallation
*
* @package OCA\Social\Migration
*/
class CheckInstallation implements IRepairStep {
protected CheckService $checkService;
/**
* CheckInstallation constructor.
*
* @param CheckService $checkService
*/
public function __construct(CheckService $checkService) {
$this->checkService = $checkService;
}
/**
* Returns the step's name
*
* @return string
* @since 9.1.0
*/
public function getName() {
return 'Check the installation of the Social app.';
}
/**
* @param IOutput $output
*/
public function run(IOutput $output) {
$this->checkService->checkInstallationStatus(true);
}
}

Wyświetl plik

@ -1,96 +0,0 @@
<?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\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Exception;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0003Date20200823023910
*
* @package OCA\Social\Migration
*/
class Version0003Date20200823023900 extends SimpleMigrationStep {
private IDBConnection $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
if ($schema->hasTable('social_3_cache_actor')) {
$table = $schema->getTable('social_3_cache_actor');
if ($table->hasPrimaryKey()) {
$kc = $table->getPrimaryKeyColumns();
if (count($kc) === 1 && $kc[0] === 'id_prim') {
$table->dropPrimaryKey();
}
}
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @throws Exception
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
}
}

Wyświetl plik

@ -1,451 +0,0 @@
<?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\Migration;
use Closure;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use Exception;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0003Date20200823023911
*
* @package OCA\Social\Migration
*/
class Version0003Date20200823023911 extends SimpleMigrationStep {
private IDBConnection $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$this->fixStreamNid($schema);
$this->fixCacheActorNid($schema);
$this->createClient($schema);
$this->createInstance($schema);
$this->addChunkToTable($schema, 'social_3_stream', '');
$this->addChunkToTable($schema, 'social_3_stream_act', '_act');
$this->addChunkToTable($schema, 'social_3_stream_dest', '_dest');
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @throws Exception
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
$qb = $this->connection->getQueryBuilder();
$qb->select('*')
->from('social_3_stream')
->orderBy('creation', 'asc');
$result = $qb->execute();
$nid = 0;
while ($row = $result->fetch()) {
$nid++;
if (is_int($row['nid']) and $row['nid'] > 0) {
continue;
}
$update = $this->connection->getQueryBuilder();
$expr = $update->expr();
$update->update('social_3_stream');
$update->set('nid', $update->createNamedParameter($nid));
$update->where($expr->eq('id_prim', $update->createNamedParameter($row['id_prim'])));
$update->execute();
}
}
/**
* @param ISchemaWrapper $schema
*/
private function fixStreamNid(ISchemaWrapper $schema) {
try {
$table = $schema->getTable('social_3_stream');
} catch (SchemaException $e) {
return;
}
if ($table->hasColumn('nid')) {
return;
}
$table->addColumn(
'nid', 'bigint',
[
'length' => 11,
'unsigned' => true,
'notnull' => false,
]
);
}
/**
* @param ISchemaWrapper $schema
*/
private function fixCacheActorNid(ISchemaWrapper $schema) {
try {
$table = $schema->getTable('social_3_cache_actor');
} catch (SchemaException $e) {
return;
}
if ($table->hasColumn('nid')) {
return;
}
$table->addColumn(
'nid', 'bigint',
[
'autoincrement' => true,
'length' => 11,
'unsigned' => true,
'customSchemaOptions' => [
'unique' => true
]
]
);
$table->addUniqueIndex(['id_prim']);
}
/**
* @param ISchemaWrapper $schema
*/
private function createClient(ISchemaWrapper $schema) {
if ($schema->hasTable('social_3_client')) {
return;
}
$table = $schema->createTable('social_3_client');
$table->addColumn(
'id', 'integer',
[
'autoincrement' => true,
'notnull' => true,
'length' => 7,
'unsigned' => true,
]
);
$table->addColumn(
'app_name', 'string',
[
'notnull' => false,
'length' => 127,
'default' => ''
]
);
$table->addColumn(
'app_website', 'string',
[
'notnull' => false,
'length' => 255,
'default' => ''
]
);
$table->addColumn(
'app_redirect_uris', 'text',
[
'notnull' => false,
'default' => ''
]
);
$table->addColumn(
'app_client_id', 'string',
[
'notnull' => false,
'length' => 63,
'default' => ''
]
);
$table->addColumn(
'app_client_secret', 'string',
[
'notnull' => false,
'length' => 63,
'default' => ''
]
);
$table->addColumn(
'app_scopes', 'text',
[
'notnull' => false
]
);
$table->addColumn(
'auth_scopes', 'text',
[
'notnull' => false
]
);
$table->addColumn(
'auth_account', 'string',
[
'notnull' => false,
'length' => 127,
'default' => ''
]
);
$table->addColumn(
'auth_user_id', 'string',
[
'notnull' => false,
'length' => 127,
'default' => ''
]
);
$table->addColumn(
'auth_code', 'string',
[
'notnull' => false,
'length' => 127,
'default' => ''
]
);
$table->addColumn(
'token', 'string',
[
'notnull' => false,
'length' => 127,
'default' => ''
]
);
$table->addColumn(
'last_update', 'datetime',
[
'notnull' => false,
]
);
$table->addColumn(
'creation', 'datetime',
[
'notnull' => false,
]
);
$table->setPrimaryKey(['id']);
$table->addUniqueIndex(['auth_code', 'token', 'app_client_id', 'app_client_secret']);
}
/**
* @param ISchemaWrapper $schema
*/
private function createInstance(ISchemaWrapper $schema) {
if ($schema->hasTable('social_3_instance')) {
return;
}
$table = $schema->createTable('social_3_instance');
$table->addColumn(
'local', 'smallint',
[
'notnull' => false,
'length' => 1,
'default' => 0,
'unsigned' => true
]
);
$table->addColumn(
'uri', 'string',
[
'notnull' => false,
'length' => 255,
]
);
$table->addColumn(
'title', 'string',
[
'notnull' => false,
'length' => 255,
'default' => ''
]
);
$table->addColumn(
'version', 'string',
[
'notnull' => false,
'length' => 31,
'default' => ''
]
);
$table->addColumn(
'short_description', 'text',
[
'notnull' => false,
'default' => ''
]
);
$table->addColumn(
'description', 'text',
[
'notnull' => false,
'default' => ''
]
);
$table->addColumn(
'email', 'string',
[
'notnull' => false,
'length' => 255,
'default' => ''
]
);
$table->addColumn(
'urls', 'text',
[
'notnull' => false,
'default' => '[]'
]
);
$table->addColumn(
'stats', 'text',
[
'notnull' => false,
'default' => '[]'
]
);
$table->addColumn(
'usage', 'text',
[
'notnull' => false,
'default' => '[]'
]
);
$table->addColumn(
'image', 'string',
[
'notnull' => false,
'length' => 255,
'default' => ''
]
);
$table->addColumn(
'languages', 'text',
[
'notnull' => false,
'default' => '[]'
]
);
$table->addColumn(
'contact', 'string',
[
'notnull' => false,
'length' => 127,
'default' => ''
]
);
$table->addColumn(
'account_prim', 'string',
[
'notnull' => false,
'length' => 128,
'default' => ''
]
);
$table->addColumn(
'creation', 'datetime',
[
'notnull' => false,
]
);
$table->setPrimaryKey(['uri']);
$table->addIndex(['local', 'uri', 'account_prim']);
}
/**
* @param ISchemaWrapper $schema
* @param string $tableName
* @param string $indexName
*
* @throws SchemaException
*/
private function addChunkToTable(ISchemaWrapper $schema, string $tableName, string $indexName) {
if (!$schema->hasTable($tableName)) {
return;
}
$table = $schema->getTable($tableName);
if ($table->hasColumn('chunk')) {
return;
}
$table->addColumn(
'chunk', Type::SMALLINT,
[
'default' => 1,
'length' => 1,
'unsigned' => true
]
);
if (!$table->hasIndex('chunk' . $indexName)) {
$table->addIndex(['chunk'], 'chunk' . $indexName);
}
}
}

Wyświetl plik

@ -1,86 +0,0 @@
<?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\Migration;
use Closure;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0003Date20200921103342
*
* @package OCA\Social\Migration
*/
class Version0003Date20200921103342 extends SimpleMigrationStep {
private IDBConnection $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$table = $schema->getTable('social_3_stream');
$column = $table->getColumn('nid');
if (!$column->getAutoincrement()) {
$table->changeColumn(
'nid', [
'autoincrement' => true, 'customSchemaOptions' => [
'unique' => true
]
]
);
}
return $schema;
}
}

Wyświetl plik

@ -55,7 +55,6 @@ class ConfigService {
public const CLOUD_URL = 'cloud_url';
public const SOCIAL_URL = 'social_url';
public const SOCIAL_ADDRESS = 'social_address';
public const DATABASE_CHUNK_SIZE = 'db_chunk_size';
public const SOCIAL_SERVICE = 'service';
public const SOCIAL_MAX_SIZE = 'max_size';
@ -78,8 +77,7 @@ class ConfigService {
self::SOCIAL_MAX_SIZE => 10,
self::SOCIAL_ACCESS_TYPE => 'all_but',
self::SOCIAL_ACCESS_LIST => '[]',
self::SOCIAL_SELF_SIGNED => '0',
self::DATABASE_CHUNK_SIZE => 10000
self::SOCIAL_SELF_SIGNED => '0'
];
public array $accessTypeList = [

Wyświetl plik

@ -30,13 +30,6 @@ declare(strict_types=1);
namespace OCA\Social\Service;
use OCA\Social\Tools\Exceptions\DateTimeException;
use OCA\Social\Tools\Exceptions\MalformedArrayException;
use OCA\Social\Tools\Exceptions\RequestContentException;
use OCA\Social\Tools\Exceptions\RequestNetworkException;
use OCA\Social\Tools\Exceptions\RequestResultNotJsonException;
use OCA\Social\Tools\Exceptions\RequestResultSizeException;
use OCA\Social\Tools\Exceptions\RequestServerException;
use Exception;
use OCA\Social\Db\StreamRequest;
use OCA\Social\Exceptions\InvalidOriginException;
@ -53,6 +46,13 @@ use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\Client\Options\TimelineOptions;
use OCA\Social\Model\InstancePath;
use OCA\Social\Tools\Exceptions\DateTimeException;
use OCA\Social\Tools\Exceptions\MalformedArrayException;
use OCA\Social\Tools\Exceptions\RequestContentException;
use OCA\Social\Tools\Exceptions\RequestNetworkException;
use OCA\Social\Tools\Exceptions\RequestResultNotJsonException;
use OCA\Social\Tools\Exceptions\RequestResultSizeException;
use OCA\Social\Tools\Exceptions\RequestServerException;
class StreamService {
private StreamRequest $streamRequest;
@ -400,7 +400,10 @@ class StreamService {
* @throws DateTimeException
* @deprecated
*/
public function getStreamHome(int $since = 0, int $limit = 5, int $format = Stream::FORMAT_ACTIVITYPUB
public function getStreamHome(
int $since = 0,
int $limit = 5,
int $format = Stream::FORMAT_ACTIVITYPUB
): array {
return $this->streamRequest->getTimelineHome_dep($since, $limit, $format);
}
@ -451,7 +454,7 @@ class StreamService {
* @deprecated
*/
public function getStreamDirect(int $since = 0, int $limit = 5): array {
return $this->streamRequest->getTimelineDirect($since, $limit);
return $this->streamRequest->getTimelineDirect_dep($since, $limit);
}

Wyświetl plik

@ -71,12 +71,12 @@ trait TNCLogger {
$this->logger()
->log(
$level,
$message,
[
'app' => $this->setup('app'),
'exception' => $t
]
$level,
$message,
[
'app' => $this->setup('app'),
'exception' => $t
]
);
}
@ -111,12 +111,12 @@ trait TNCLogger {
$this->logger()
->log(
$level,
$message,
[
'app' => $this->setup('app'),
'exception' => $e
]
$level,
$message,
[
'app' => $this->setup('app'),
'exception' => $e
]
);
}

2170
package-lock.json wygenerowano

Plik diff jest za duży Load Diff

Wyświetl plik

@ -33,15 +33,15 @@
"@nextcloud/dialogs": "^3.2.0",
"@nextcloud/initial-state": "^2.0.0",
"@nextcloud/l10n": "^1.6.0",
"@nextcloud/logger": "^2.2.1",
"@nextcloud/logger": "^2.4.0",
"@nextcloud/moment": "^1.2.1",
"@nextcloud/router": "^1.2.0",
"@nextcloud/router": "^2.0.0",
"@nextcloud/stylelint-config": "^2.2.0",
"@nextcloud/vue": "^7.0.1",
"@nextcloud/vue-richtext": "^2.0.4",
"he": "^1.2.0",
"linkifyjs": "^2.1.8",
"sass": "^1.56.0",
"sass": "^1.56.1",
"tributejs": "^3.7.3",
"twemoji": "12.0.1",
"uuid": "^8.3.2",
@ -52,7 +52,7 @@
"vue-infinite-loading": "^2.4.4",
"vue-material-design-icons": "^5.0.0",
"vue-router": "^3.5.3",
"vue-tribute": "^1.0.6",
"vue-tribute": "^1.0.7",
"vue-twemoji": "^1.0.1",
"vuetrend": "^0.3.4",
"vuex": "^3.6.2",
@ -71,9 +71,9 @@
"devDependencies": {
"@nextcloud/babel-config": "^1.0.0",
"@nextcloud/browserslist-config": "^2.3.0",
"@nextcloud/eslint-config": "^8.0.0",
"@nextcloud/eslint-config": "^8.1.4",
"@nextcloud/webpack-vue-config": "^5.4.0",
"jest": "^29.2.2",
"jest": "^29.3.1",
"jest-serializer-vue": "^2.0.2",
"vue-template-compiler": "^2.7.10"
},

Wyświetl plik

@ -25,6 +25,7 @@
<UndefinedClass>
<errorLevel type="suppress">
<referencedClass name="OC" />
<referencedClass name="OC\DB\Connection" />
</errorLevel>
</UndefinedClass>
<UndefinedDocblockClass>
@ -33,6 +34,7 @@
<referencedClass name="Doctrine\DBAL\Schema\SchemaException" />
<referencedClass name="Doctrine\DBAL\Driver\Statement" />
<referencedClass name="Doctrine\DBAL\Schema\Table" />
<referencedClass name="OC\DB\Connection" />
</errorLevel>
</UndefinedDocblockClass>
</issueHandlers>

38
src/oauth.js 100644
Wyświetl plik

@ -0,0 +1,38 @@
/**
* @copyright 2022 Carl Schwan <carl@carlschwan.eu>
* @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/>.
*/
import Vue from 'vue'
import OAuth2Authorize from './views/OAuth2Authorize.vue'
// CSP config for webpack dynamic chunk loading
// eslint-disable-next-line
__webpack_nonce__ = btoa(OC.requestToken)
// Correct the root of the app for chunk loading
// OC.linkTo matches the apps folders
// eslint-disable-next-line
__webpack_public_path__ = OC.linkTo('social', 'js/')
Vue.prototype.t = t
Vue.prototype.n = n
Vue.prototype.OC = OC
Vue.prototype.OCA = OCA
new Vue({
render: h => h(OAuth2Authorize),
}).$mount('#social-oauth2')

Wyświetl plik

@ -0,0 +1,98 @@
<!--
- @copyright 2022 Carl Schwan <carl@carlschwan.eu>
- @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/>.
-->
<template>
<div class="wrapper">
<form class="guest-box" method="post">
<h1>{{ t('social', 'Authorization required') }}</h1>
<p>
{{ t('social', '{appDisplayName} would like permission to access your account. It is a third party application.', {appDisplayName: appName}) }}
<b>{{ t('social', 'If you do not trust it, then you should not authorize it.') }}</b>
</p>
<input type="hidden"
name="requesttoken"
:value="OC.requestToken">
<div class="button-row">
<NcButton type="primary" nativeType="submit">
{{ t('social', 'Authorize') }}
</NcButton>
<NcButton type="error" :href="homeUrl">
{{ t('social', 'Deny') }}
</NcButton>
</div>
</form>
</div>
</template>
<script>
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
import { loadState } from '@nextcloud/initial-state'
import { generateUrl } from '@nextcloud/router'
export default {
name: 'OAuth2Authorize',
components: {
NcButton,
},
data() {
return {
appName: loadState('social', 'appName'),
}
},
computed: {
homeUrl() {
return generateUrl('/apps/social/')
},
},
}
</script>
<style lang="scss" scopped>
.wrapper {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 100%;
}
.guest-box {
color: var(--color-main-text);
background-color: var(--color-main-background);
padding: 1rem;
border-radius: var(--border-radius-large);
box-shadow: 0 0 10px var(--color-box-shadow);
display: inline-block;
max-width: 600px;
h1 {
font-weight: bold;
text-align: center;
font-size: 20px;
margin-bottom: 12px;
line-height: 140%;
}
.button-row {
display: flex;
gap: 1rem;
flex-direction: row;
margin-top: 1rem;
justify-content: end;
}
}
</style>

Wyświetl plik

@ -0,0 +1,28 @@
<?php
/**
* @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
*
* @author Jonas Sulzer <jonas@violoncello.ch>
* @author Julius Härtl <jus@bitgrid.net>
*
* @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/>.
*
*/
\OCP\Util::addScript('social', 'social-oauth');
?>
<div id="social-oauth2"></div>

Wyświetl plik

@ -1,22 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="4.29.0@7ec5ffbd5f68ae03782d7fd33fff0c45a69f95b3">
<files psalm-version="4.26.0@6998fabb2bf528b65777bf9941920888d23c03ac">
<file src="lib/AP.php">
<InvalidScalarArgument occurrences="1">
<code>$level</code>
</InvalidScalarArgument>
</file>
<file src="lib/Migration/Version0003Date20200823023900.php">
<UndefinedDocblockClass occurrences="1">
<code>DBALException</code>
</UndefinedDocblockClass>
</file>
<file src="lib/Migration/Version0003Date20200823023911.php">
<UndefinedClass occurrences="3">
<code>SchemaException</code>
<code>SchemaException</code>
<code>Type</code>
</UndefinedClass>
</file>
<file src="lib/Model/ActivityPub/ACore.php">
<InvalidArgument occurrences="1">
<code>['a', 'p', 'span', 'br']</code>
@ -138,10 +126,4 @@
<code>HintException</code>
</UndefinedClass>
</file>
<file src="lib/Tools/Traits/TNCRequest.php">
<InvalidArgument occurrences="21">
<code>$curl</code>
</InvalidArgument>
<InvalidReturnType occurrences="1"/>
</file>
</files>

Wyświetl plik

@ -8,7 +8,8 @@ webpackConfig.entry = {
social: path.join(__dirname, 'src', 'main.js'),
ostatus: path.join(__dirname, 'src', 'ostatus.js'),
profilePage: path.join(__dirname, 'src', 'profile.js'),
dashboard: path.join(__dirname, 'src', 'dashboard.js'),
dashboard: path.join(__dirname, 'src', 'dashboard.js'),
oauth: path.join(__dirname, 'src', 'oauth.js'),
}
module.exports = webpackConfig