Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/AppInfo/Capabilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ private function getCapabilitiesCircleConstants(): array {
Member::TYPE_APP => $this->l10n->t('Nextcloud App')
],
'extra' => [
Member::APP_CIRCLES => 'Circles App'
Member::APP_CIRCLES => 'Circles App',
Member::APP_OCC => 'occ Command Line'
]
]
];
Expand Down
8 changes: 6 additions & 2 deletions lib/Command/MembersList.php
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$table = new Table($output);
$table->setHeaders(
[
'Circle Id', 'Circle Name', 'Member Id', 'Single Id', 'Type', 'Source', 'Username',
'Instance', 'Level'
'Circle Id', 'Circle Name', 'Member Id', 'Single Id', 'Type', 'Source', 'Invited By',
'Username', 'Instance', 'Level'
]
);
$table->render();
Expand All @@ -251,6 +251,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$member->getSingleId(),
Member::$TYPE[$member->getUserType()],
$member->hasBasedOn() ? Circle::$DEF_SOURCE[$member->getBasedOn()->getSource()] : '',
($member->hasInvitedBy()) ? $member->getInvitedBy()->getUserId()
. $this->configService->displayInstance(
$member->getInvitedBy()->getInstance(), true
) : 'Unknown',
($this->input->getOption('display-name')) ?
$member->getBasedOn()->getDisplayName() : $member->getUserId(),
$this->configService->displayInstance($member->getInstance()),
Expand Down
47 changes: 43 additions & 4 deletions lib/Db/CoreQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
const UPSTREAM_MEMBERSHIPS = 'upstreammemberships';
const INHERITANCE_FROM = 'inheritancefrom';
const INHERITED_BY = 'inheritedby';
const INVITED_BY = 'invitedby';
const MOUNT = 'mount';
const MOUNTPOINT = 'mountpoint';
const SHARE = 'share';
Expand Down Expand Up @@ -109,7 +110,7 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
self::MEMBER => [
self::MEMBERSHIPS,
self::INHERITANCE_FROM,
self::CIRCLE => [
self::CIRCLE => [
self::OPTIONS => [
'getData' => true
],
Expand All @@ -123,10 +124,14 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
self::BASED_ON,
self::INHERITED_BY => [
self::MEMBERSHIPS
],
self::INVITED_BY => [
self::OWNER,
self::BASED_ON
]
]
],
self::BASED_ON => [
self::BASED_ON => [
self::OWNER,
self::MEMBERSHIPS,
self::INITIATOR => [
Expand All @@ -136,11 +141,15 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
]
]
],
self::REMOTE => [
self::REMOTE => [
self::MEMBER,
self::CIRCLE => [
self::OWNER
]
],
self::INVITED_BY => [
self::OWNER,
self::BASED_ON
]
],
self::SHARE => [
Expand Down Expand Up @@ -690,6 +699,33 @@ public function leftJoinCircle(
}


/**
* @param string $aliasMember
*
* @throws RequestBuilderException
*/
public function leftJoinInvitedBy(string $aliasMember): void {
if ($this->getType() !== QueryBuilder::SELECT) {
return;
}

try {
$aliasInvitedBy = $this->generateAlias($aliasMember, self::INVITED_BY);
} catch (RequestBuilderException $e) {
return;
}

$expr = $this->expr();
$this->generateCircleSelectAlias($aliasInvitedBy)
->leftJoin(
$aliasMember, CoreRequestBuilder::TABLE_CIRCLE, $aliasInvitedBy,
$expr->eq($aliasMember . '.invited_by', $aliasInvitedBy . '.unique_id')
);

$this->leftJoinOwner($aliasInvitedBy);
}


/**
* @param string $aliasMember
* @param IFederatedUser|null $initiator
Expand Down Expand Up @@ -811,7 +847,10 @@ public function leftJoinMember(
*
* @throws RequestBuilderException
*/
public function leftJoinInheritedMembers(string $alias, string $field = '', string $aliasInheritedBy = ''
public function leftJoinInheritedMembers(
string $alias,
string $field = '',
string $aliasInheritedBy = ''
): void {
$expr = $this->expr();

Expand Down
11 changes: 8 additions & 3 deletions lib/Db/MemberRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,11 @@ public function save(Member $member): void {
->setValue('level', $qb->createNamedParameter($member->getLevel()))
->setValue('status', $qb->createNamedParameter($member->getStatus()))
->setValue('contact_id', $qb->createNamedParameter($member->getContactId()))
->setValue('note', $qb->createNamedParameter($member->getNote()));
->setValue('note', $qb->createNamedParameter(json_encode($member->getNotes())));

if ($member->hasInvitedBy()) {
$qb->setValue('invited_by', $qb->createNamedParameter($member->getInvitedBy()->getSingleId()));
}

$qb->execute();
}
Expand All @@ -91,7 +95,7 @@ public function update(Member $member): void {
->set('level', $qb->createNamedParameter($member->getLevel()))
->set('status', $qb->createNamedParameter($member->getStatus()))
->set('contact_id', $qb->createNamedParameter($member->getContactId()))
->set('note', $qb->createNamedParameter($member->getNote()));
->set('note', $qb->createNamedParameter(json_encode($member->getNotes())));

$qb->limitToCircleId($member->getCircleId());
$qb->limitToUserId($member->getUserId());
Expand Down Expand Up @@ -212,6 +216,7 @@ public function getMembers(

$qb->setOptions([CoreQueryBuilder::MEMBER], ['canBeVisitorOnOpen' => true]);
$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
$qb->leftJoinInvitedBy(CoreQueryBuilder::MEMBER);

if (!is_null($remoteInstance)) {
$aliasCircle = $qb->generateAlias(CoreQueryBuilder::MEMBER, CoreQueryBuilder::CIRCLE);
Expand Down Expand Up @@ -351,7 +356,7 @@ public function searchFederatedUsers(string $needle): array {
* @return FederatedUser[]|Member
* @throws RequestBuilderException
*/
public function getAlternateSingleId(IFederatedUser $federatedUser) {
public function getAlternateSingleId(IFederatedUser $federatedUser): array {
$qb = $this->getMemberSelectSql();
$qb->limitToSingleId($federatedUser->getSingleId());

Expand Down
4 changes: 4 additions & 0 deletions lib/FederatedItems/CircleCreate.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ public function manage(FederatedEvent $event): void {
} catch (MemberNotFoundException $e) {
}

if ($owner->hasInvitedBy()) {
$owner->setNoteObj('invitedBy', $owner->getInvitedBy());
}

$this->circleRequest->save($circle);
$this->memberRequest->save($owner);
$this->membershipService->onUpdate($owner->getSingleId());
Expand Down
2 changes: 1 addition & 1 deletion lib/FederatedItems/MassiveMemberAdd.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public function verify(FederatedEvent $event): void {

foreach ($members as $member) {
try {
$filtered[] = $this->generateMember($circle, $member);
$filtered[] = $this->generateMember($event, $circle, $member);
} catch (Exception $e) {
}
}
Expand Down
31 changes: 29 additions & 2 deletions lib/FederatedItems/SingleMemberAdd.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ public function verify(FederatedEvent $event): void {
$initiatorHelper = new MemberHelper($initiator);
$initiatorHelper->mustBeModerator();

$member = $this->generateMember($circle, $member);
$member = $this->generateMember($event, $circle, $member);

$event->setMembers([$member]);
$event->setOutcome($member->jsonSerialize());
Expand Down Expand Up @@ -328,7 +328,7 @@ public function result(FederatedEvent $event, array $results): void {
* @throws UserTypeNotFoundException
* @throws RequestBuilderException
*/
protected function generateMember(Circle $circle, Member $member): Member {
protected function generateMember(FederatedEvent $event, Circle $circle, Member $member): Member {
try {
if ($member->getSingleId() !== '') {
$userId = $member->getSingleId() . '@' . $member->getInstance();
Expand Down Expand Up @@ -366,6 +366,10 @@ protected function generateMember(Circle $circle, Member $member): Member {
$member->importFromIFederatedUser($federatedUser);
$member->setCircleId($circle->getSingleId());
$member->setCircle($circle);

$this->confirmPatron($event, $member);
$member->setNoteObj('invitedBy', $member->getInvitedBy());

$this->manageMemberStatus($circle, $member);

$this->circleService->confirmCircleNotFull($circle);
Expand All @@ -387,6 +391,7 @@ protected function generateMember(Circle $circle, Member $member): Member {
* @param Member $member
*
* @throws FederatedItemBadRequestException
* @throws RequestBuilderException
*/
private function manageMemberStatus(Circle $circle, Member $member) {
try {
Expand Down Expand Up @@ -428,6 +433,28 @@ private function manageMemberStatus(Circle $circle, Member $member) {
}


/**
* @param FederatedEvent $event
* @param Member $member
*
* @throws FederatedItemBadRequestException
* @throws FederatedUserException
* @throws RequestBuilderException
*/
private function confirmPatron(FederatedEvent $event, Member $member): void {
if (!$member->hasInvitedBy()) {
throw new FederatedItemBadRequestException(StatusCode::$MEMBER_ADD[129], 129);
}

$patron = $member->getInvitedBy();
if ($patron->getInstance() !== $event->getOrigin()) {
throw new FederatedItemBadRequestException(StatusCode::$MEMBER_ADD[130], 130);
}

$this->federatedUserService->confirmLocalSingleId($patron);
}


/**
* @param Member $member
*
Expand Down
11 changes: 11 additions & 0 deletions lib/Migration/Version0022Date20220526113601.php
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,12 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
'length' => 255
]
);
$table->addColumn(
'invited_by', 'string', [
'notnull' => false,
'length' => 31,
]
);
$table->addColumn(
'level', 'smallint', [
'notnull' => true,
Expand Down Expand Up @@ -375,6 +381,11 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
'notnull' => false
]
);
$table->addColumn(
'updated', 'datetime', [
'notnull' => false,
]
);
$table->addColumn(
'creation', 'bigint', [
'length' => 14,
Expand Down
96 changes: 96 additions & 0 deletions lib/Migration/Version0022Date20220601121545.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

declare(strict_types=1);


/**
* Circles - Bring cloud-users closer together.
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <[email protected]>
* @copyright 2021
* @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\Circles\Migration;

use Closure;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;


/**
* Class Version0022Date20220526113601
*
* @package OCA\Circles\Migration
*/
class Version0022Date20220601121545 extends SimpleMigrationStep {


/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
}


/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return null|ISchemaWrapper
* @throws SchemaException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();

if ($schema->hasTable('circles_event')) {
$table = $schema->getTable('circles_event');
if (!$table->hasColumn('updated')) {
$table->addColumn(
'updated', 'datetime', [
'notnull' => false,
]
);
}
}

if ($schema->hasTable('circles_member')) {
$table = $schema->getTable('circles_member');
if (!$table->hasColumn('invited_by')) {
$table->addColumn(
'invited_by', 'string', [
'notnull' => false,
'length' => 31,
]
);
}
}

return $schema;
}

}

Loading