%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/UserMigration/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/UserMigration/PasswordsMigrator.php |
<?php
/*
* @copyright 2023 Passwords App
*
* @author Marius David Wieschollek
* @license AGPL-3.0
*
* This file is part of the Passwords App
* created by Marius David Wieschollek.
*/
namespace OCA\Passwords\UserMigration;
use OCA\Passwords\Services\EnvironmentService;
use OCA\Passwords\Services\NotificationService;
use OCA\Passwords\Services\Object\KeychainService;
use OCA\Passwords\Services\Object\PasswordRevisionService;
use OCA\Passwords\UserMigration\Export\RevisionedItemsExporter;
use OCA\Passwords\UserMigration\Export\SettingsExporter;
use OCA\Passwords\UserMigration\Export\SimpleItemExporter;
use OCA\Passwords\UserMigration\Import\RevisionedItemsImporter;
use OCA\Passwords\UserMigration\Import\SettingsImporter;
use OCA\Passwords\UserMigration\Import\SimpleItemImporter;
use OCP\IL10N;
use OCP\IUser;
use OCP\UserMigration\IExportDestination;
use OCP\UserMigration\IImportSource;
use OCP\UserMigration\IMigrator;
use OCP\UserMigration\ISizeEstimationMigrator;
use OCP\UserMigration\TMigratorBasicVersionHandling;
use OCP\UserMigration\UserMigrationException;
use Symfony\Component\Console\Output\OutputInterface;
use Throwable;
class PasswordsMigrator implements IMigrator, ISizeEstimationMigrator {
use TMigratorBasicVersionHandling;
const DATA_FILE = 'passwords.json';
/**
* @param KeychainService $keychainService
* @param SettingsExporter $settingsExporter
* @param SettingsImporter $settingsImporter
* @param EnvironmentService $environmentService
* @param SimpleItemExporter $simpleItemExporter
* @param SimpleItemImporter $simpleItemImporter
* @param NotificationService $notificationService
* @param RevisionedItemsExporter $revisionedItemsExporter
* @param RevisionedItemsImporter $revisionedItemsImporter
* @param PasswordRevisionService $passwordRevisionService
* @param IL10N $l10n
*/
public function __construct(
protected KeychainService $keychainService,
protected SettingsExporter $settingsExporter,
protected SettingsImporter $settingsImporter,
protected EnvironmentService $environmentService,
protected SimpleItemExporter $simpleItemExporter,
protected SimpleItemImporter $simpleItemImporter,
protected NotificationService $notificationService,
protected RevisionedItemsExporter $revisionedItemsExporter,
protected RevisionedItemsImporter $revisionedItemsImporter,
protected PasswordRevisionService $passwordRevisionService,
protected IL10N $l10n
) {
$this->mandatory = true;
}
public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void {
try {
if(!empty($this->keychainService->findAll())) {
if($this->environmentService->getRunType() !== EnvironmentService::TYPE_CLI) {
$this->notificationService->sendUserExportNotPossibleNotification($user->getUID(), 'cse');
}
$output->writeln('Passwords app export not possible due to E2EE');
return;
}
$output->writeln('Exporting passwords app data to '.self::DATA_FILE.'…');
$data = array_merge(is_array($this->revisionedItemsExporter->exportData($user->getUID())) ? $this->revisionedItemsExporter->exportData($user->getUID()) : iterator_to_array($this->revisionedItemsExporter->exportData($user->getUID())), is_array($this->simpleItemExporter->exportData($user->getUID())) ? $this->simpleItemExporter->exportData($user->getUID()) : iterator_to_array($this->simpleItemExporter->exportData($user->getUID())), is_array($this->settingsExporter->exportData($user->getUID())) ? $this->settingsExporter->exportData($user->getUID()) : iterator_to_array($this->settingsExporter->exportData($user->getUID())));
$exportDestination->addFileContents(self::DATA_FILE, json_encode($data));
} catch(Throwable $e) {
echo $e->getMessage();
throw new UserMigrationException('Could not export passwords data: '.$e->getMessage(), 0, $e);
}
}
public function import(IUser $user, IImportSource $importSource, OutputInterface $output): void {
try {
if($importSource->getMigratorVersion($this->getId()) === null || !$importSource->pathExists(self::DATA_FILE)) {
$output->writeln('No version for passwords, skipping import…');
return;
}
$output->writeln('Importing passwords app data from '.self::DATA_FILE.'…');
$data = json_decode($importSource->getFileContents(self::DATA_FILE), true);
$this->settingsImporter->importData($user->getUID(), $data);
$this->simpleItemImporter->importData($user->getUID(), $data);
$this->revisionedItemsImporter->importData($user->getUID(), $data);
} catch(Throwable $e) {
echo $e->getMessage();
throw new UserMigrationException('Could not import passwords data: '.$e->getMessage(), 0, $e);
}
}
public function getId(): string {
return 'passwords';
}
public function getDisplayName(): string {
return $this->l10n->t('Passwords');
}
public function getDescription(): string {
return $this->l10n->t('Decrypted passwords database with passwords, folders, tags and settings. (Does not include passwords shared with you. Does not work with E2E enabled)');
}
public function getEstimatedExportSize(IUser $user): int {
return $this->passwordRevisionService->count() * 4;
}
}