Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b3f0c78 authored by Nivesh Krishna's avatar Nivesh Krishna Committed by Akhil
Browse files

Migration of rainloop data only after joining beta

parent 36be17d6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ use OCA\EcloudAccounts\Service\LDAPConnectionService;
use OCP\User\Events\BeforeUserDeletedEvent;
use OCP\User\Events\UserChangedEvent;
use OCA\EcloudAccounts\Listeners\UserChangedListener;
use OCA\EcloudAccounts\Listeners\UserAddedToBetaGroupListener;
use OCP\Group\Events\UserAddedEvent;

class Application extends App implements IBootstrap {
	public const APP_ID = 'ecloud-accounts';
@@ -46,6 +48,7 @@ class Application extends App implements IBootstrap {
	public function register(IRegistrationContext $context): void {
		$context->registerEventListener(BeforeUserDeletedEvent::class, BeforeUserDeletedListener::class);
		$context->registerEventListener(UserChangedEvent::class, UserChangedListener::class);
		$context->registerEventListener(UserAddedEvent::class, UserAddedToBetaGroupListener::class);
	}

	public function boot(IBootContext $context): void {
+65 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace OCA\EcloudAccounts\Listeners;

use Exception;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Group\Events\UserAddedEvent;
use OCP\IUser;
use OCP\IConfig;
use OCP\ILogger;

class UserAddedToBetaGroupListener implements IEventListener {
	private $config;
	private $logger;

	public function __construct(IConfig $config, ILogger $logger) {
		$this->config = $config;
		$this->logger = $logger;
	}

	public function handle(Event $event): void {
		if (!($event instanceof UserAddedEvent)) {
			return;
		}

		$user = $event->getUser();
		$group = $event->getGroup();

		$betaGroup = $this->config->getSystemValue("beta_group_name");

		if ($group->getGID() !== $betaGroup) {
			return;
		}
		try {
			$this->migrateRainloopData($user);
		} catch (Exception $e) {
			$errorMessage = 'Error while migrating user rainloop data to snappymail';
			$this->logger->error($errorMessage . ': ' . $e->getMessage());
		}
	}

	private function migrateRainloopData(IUser $user): void {
		$username = $user->getUID();
		$userDir = substr($username, 0, 2);
		$email = $user->getEMailAddress();
		$dataDir = rtrim(trim($this->config->getSystemValue('datadirectory', '')), '\\/');
		$snappyDir = "$dataDir/appdata_snappymail/_data_/_default_/storage/cfg/$userDir/$email/";
		$rainloopDir = "$dataDir/rainloop-storage/_data_/_default_/storage/cfg/$userDir/$email";
		
		if (file_exists($snappyDir)) {
			$this->logger->debug("$snappyDir already exists");
			return;
		}
		if (!mkdir($snappyDir, 0755, true)) {
			throw new Exception("Unable to mkdir $snappyDir");
		}
		if (!shell_exec("cp -avr $rainloopDir/* $snappyDir")) {
			throw new Exception("Unable to copy files from $rainloopDir to $snappyDir");
		}
		return;
	}
}