repo->findLink($username); if ($link !== null && $link['provider'] === $provider && $link['external_id'] !== null) { return hash_equals((string)$link['external_id'], $externalId); } if (!$this->mayCreate($provider, $username, $externalId)) { return false; } $this->repo->link($username, $provider, $externalId); return true; } /** The IdP user owns no other mailbox (checked before a mailbox is created on login) */ public function mayCreate(string $provider, string $username, string $externalId): bool { $owner = ($externalId === '') ? null : $this->repo->usernameOf($provider, $externalId); return $externalId !== '' && ($owner === null || $owner === $username); } /** Links a mailbox created on login */ public function link(string $provider, string $username, string $externalId): void { if ($externalId !== '') { $this->repo->link($username, $provider, $externalId); } } }