diff --git a/lib/Db/ShareTokenRequest.php b/lib/Db/ShareTokenRequest.php index a80aad965..e8030747f 100644 --- a/lib/Db/ShareTokenRequest.php +++ b/lib/Db/ShareTokenRequest.php @@ -32,6 +32,7 @@ namespace OCA\Circles\Db; +use OCA\Circles\Exceptions\ShareTokenNotFoundException; use OCA\Circles\Model\ShareToken; @@ -63,5 +64,19 @@ public function save(ShareToken $token): void { $token->setDbId($id); } + + /** + * @param string $token + * + * @return ShareToken + * @throws ShareTokenNotFoundException + */ + public function getByToken(string $token): ShareToken { + $qb = $this->getTokenSelectSql(); + $qb->limitToToken($token); + + return $this->getItemFromRequest($qb); + } + } diff --git a/lib/Db/ShareTokenRequestBuilder.php b/lib/Db/ShareTokenRequestBuilder.php index 6eb4e2557..38e84b327 100644 --- a/lib/Db/ShareTokenRequestBuilder.php +++ b/lib/Db/ShareTokenRequestBuilder.php @@ -61,7 +61,7 @@ protected function getTokenInsertSql(): CoreQueryBuilder { */ protected function getTokenUpdateSql(): CoreQueryBuilder { $qb = $this->getQueryBuilder(); - $qb->update(self::TABLE_SHARE); + $qb->update(self::TABLE_TOKEN); return $qb; } @@ -74,8 +74,8 @@ protected function getTokenUpdateSql(): CoreQueryBuilder { */ protected function getTokenSelectSql(string $alias = CoreQueryBuilder::TOKEN): CoreQueryBuilder { $qb = $this->getQueryBuilder(); - $qb->generateSelect(self::TABLE_TOKEN, self::$tables[self::TABLE_SHARE], $alias) - ->generateGroupBy(self::$tables[self::TABLE_SHARE], $alias); + $qb->generateSelect(self::TABLE_TOKEN, self::$tables[self::TABLE_TOKEN], $alias) + ->generateGroupBy(self::$tables[self::TABLE_TOKEN], $alias); return $qb; } @@ -88,7 +88,7 @@ protected function getTokenSelectSql(string $alias = CoreQueryBuilder::TOKEN): C */ protected function getTokenDeleteSql(): CoreQueryBuilder { $qb = $this->getQueryBuilder(); - $qb->delete(self::TABLE_SHARE); + $qb->delete(self::TABLE_TOKEN); return $qb; } diff --git a/lib/Service/MigrationService.php b/lib/Service/MigrationService.php index cd27768a3..47e50bb7c 100644 --- a/lib/Service/MigrationService.php +++ b/lib/Service/MigrationService.php @@ -40,6 +40,7 @@ use OCA\Circles\AppInfo\Application; use OCA\Circles\Db\CircleRequest; use OCA\Circles\Db\MemberRequest; +use OCA\Circles\Db\ShareTokenRequest; use OCA\Circles\Exceptions\CircleNotFoundException; use OCA\Circles\Exceptions\ContactAddressBookNotFoundException; use OCA\Circles\Exceptions\ContactFormatException; @@ -55,16 +56,19 @@ use OCA\Circles\Exceptions\RemoteNotFoundException; use OCA\Circles\Exceptions\RemoteResourceNotFoundException; use OCA\Circles\Exceptions\RequestBuilderException; +use OCA\Circles\Exceptions\ShareTokenNotFoundException; use OCA\Circles\Exceptions\SingleCircleNotFoundException; use OCA\Circles\Exceptions\UnknownRemoteException; use OCA\Circles\Exceptions\UserTypeNotFoundException; use OCA\Circles\Model\Circle; use OCA\Circles\Model\FederatedUser; use OCA\Circles\Model\Member; +use OCA\Circles\Model\ShareToken; use OCA\DAV\CardDAV\ContactsManager; use OCP\Contacts\IManager; use OCP\IDBConnection; use OCP\IURLGenerator; +use OCP\Share\IShare; /** @@ -91,6 +95,9 @@ class MigrationService { /** @var MemberRequest */ private $memberRequest; + /** @var ShareTokenRequest */ + private $shareTokenRequest; + /** @var MembershipService */ private $membershipService; @@ -124,6 +131,7 @@ class MigrationService { * @param IURLGenerator $urlGenerator * @param CircleRequest $circleRequest * @param MemberRequest $memberRequest + * @param ShareTokenRequest $shareTokenRequest * @param MembershipService $membershipService * @param FederatedUserService $federatedUserService * @param CircleService $circleService @@ -137,6 +145,7 @@ public function __construct( IURLGenerator $urlGenerator, CircleRequest $circleRequest, MemberRequest $memberRequest, + ShareTokenRequest $shareTokenRequest, MembershipService $membershipService, FederatedUserService $federatedUserService, CircleService $circleService, @@ -149,6 +158,7 @@ public function __construct( $this->urlGenerator = $urlGenerator; $this->circleRequest = $circleRequest; $this->memberRequest = $memberRequest; + $this->shareTokenRequest = $shareTokenRequest; $this->membershipService = $membershipService; $this->federatedUserService = $federatedUserService; $this->circleService = $circleService; @@ -208,6 +218,7 @@ private function migrationTo22(): void { $this->migrationTo22_Circles(); $this->migrationTo22_Members(); + $this->migrationTo22_Tokens(); $this->membershipService->resetMemberships('', true); $this->membershipService->manageAll(); @@ -469,5 +480,73 @@ private function saveGeneratedMember(Member $member): void { } } + + /** + */ + public function migrationTo22_Tokens(): void { + $qb = $this->dbConnection->getQueryBuilder(); + $qb->select('*')->from('circle_tokens'); + + try { + $cursor = $qb->executeQuery(); + $this->outputService->startMigrationProgress($cursor->rowCount()); + + while ($row = $cursor->fetch()) { + try { + $data = new SimpleDataStore($row); + $this->outputService->output( + 'Migrating ShareToken \'' . $data->g('token') . '\' for \'' . $data->g('user_id') + . '\'', + true + ); + + $shareToken = $this->generateShareTokenFrom21($data); + $this->saveGeneratedShareToken($shareToken); + } catch (Exception $e) { + } + } + + $cursor->closeCursor(); + } catch (\OCP\DB\Exception $e) { + } + + $this->outputService->finishMigrationProgress(); + } + + + /** + * @param SimpleDataStore $data + * + * @return ShareToken + * @throws MemberNotFoundException + * @throws RequestBuilderException + */ + private function generateShareTokenFrom21(SimpleDataStore $data): ShareToken { + $shareToken = new ShareToken(); + $member = $this->memberRequest->getMemberById($data->g('member_id')); + + $shareToken->setShareId($data->gInt('share_id')) + ->setCircleId($data->g('circle_id')) + ->setSingleId($member->getSingleId()) + ->setMemberId($data->g('member_id')) + ->setToken($data->g('token')) + ->setPassword($data->g('password')) + ->setAccepted(IShare::STATUS_ACCEPTED); + + return $shareToken; + } + + /** + * @param ShareToken $shareToken + */ + private function saveGeneratedShareToken(ShareToken $shareToken): void { + try { + $this->shareTokenRequest->getByToken($shareToken->getToken()); + } catch (ShareTokenNotFoundException $e) { + $this->shareTokenRequest->save($shareToken); + } catch (RequestBuilderException $e) { + } + } + }