From b39305c8d8423bab42a82f475f23b177bf7077b4 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 21 Oct 2022 09:08:48 +0200 Subject: [PATCH] Import Nextcloud RainLoop settings https://github.com/pierre-alain-b/rainloop-nextcloud/issues/288 --- .../snappymail/lib/AppInfo/Application.php | 4 + .../snappymail/lib/Settings/AdminSettings.php | 11 +- .../snappymail/lib/Util/SnappyMailHelper.php | 110 +++++++++--------- 3 files changed, 63 insertions(+), 62 deletions(-) diff --git a/integrations/nextcloud/snappymail/lib/AppInfo/Application.php b/integrations/nextcloud/snappymail/lib/AppInfo/Application.php index 7eb440124..ba7674101 100644 --- a/integrations/nextcloud/snappymail/lib/AppInfo/Application.php +++ b/integrations/nextcloud/snappymail/lib/AppInfo/Application.php @@ -63,6 +63,10 @@ class Application extends App implements IBootstrap public function boot(IBootContext $context): void { + if (!\is_dir(\rtrim(\trim(\OC::$server->getSystemConfig()->getValue('datadirectory', '')), '\\/') . '/appdata_snappymail')) { + return; + } + $container = $this->getContainer(); $container->query('OCP\INavigationManager')->add(function () use ($container) { $urlGenerator = $container->query('OCP\IURLGenerator'); diff --git a/integrations/nextcloud/snappymail/lib/Settings/AdminSettings.php b/integrations/nextcloud/snappymail/lib/Settings/AdminSettings.php index 647b2bc95..ce95b3513 100644 --- a/integrations/nextcloud/snappymail/lib/Settings/AdminSettings.php +++ b/integrations/nextcloud/snappymail/lib/Settings/AdminSettings.php @@ -36,17 +36,8 @@ class AdminSettings implements ISettings $oConfig = \RainLoop\Api::Config(); $passfile = APP_PRIVATE_DATA . 'admin_password.txt'; $sPassword = $oConfig->Get('security', 'admin_password', ''); - if (!$sPassword) { - $sPassword = \substr(\base64_encode(\random_bytes(16)), 0, 12); - \RainLoop\Utils::saveFile($passfile, $sPassword . "\n"); - $oConfig->SetPassword($sPassword); - $oConfig->Save(); - } else if (\is_file($passfile)) { + if (\is_file($passfile)) { $sPassword = \file_get_contents($passfile); - } else { - $sPassword = ''; - } - if ($sPassword) { $parameters['snappymail-admin-panel-link'] .= SnappyMailHelper::getAppUrl().'?admin#/security'; } $parameters['snappymail-admin-password'] = $sPassword; diff --git a/integrations/nextcloud/snappymail/lib/Util/SnappyMailHelper.php b/integrations/nextcloud/snappymail/lib/Util/SnappyMailHelper.php index dcaab1df2..b252a2a20 100644 --- a/integrations/nextcloud/snappymail/lib/Util/SnappyMailHelper.php +++ b/integrations/nextcloud/snappymail/lib/Util/SnappyMailHelper.php @@ -7,21 +7,48 @@ class SnappyMailHelper public static function loadApp() : void { - if (!\class_exists('RainLoop\\Api')) { - // Nextcloud the default spl_autoload_register() not working - \spl_autoload_register(function($sClassName){ - $file = RAINLOOP_APP_LIBRARIES_PATH . \strtolower(\strtr($sClassName, '\\', DIRECTORY_SEPARATOR)) . '.php'; - if (is_file($file)) { - include_once $file; - } - }); - - $_ENV['SNAPPYMAIL_NEXTCLOUD'] = true; - $_ENV['SNAPPYMAIL_INCLUDE_AS_API'] = true; - - require_once \dirname(\dirname(__DIR__)) . '/app/index.php'; + if (\class_exists('RainLoop\\Api')) { + return; } + // Nextcloud the default spl_autoload_register() not working + \spl_autoload_register(function($sClassName){ + $file = RAINLOOP_APP_LIBRARIES_PATH . \strtolower(\strtr($sClassName, '\\', DIRECTORY_SEPARATOR)) . '.php'; + if (is_file($file)) { + include_once $file; + } + }); + + $_ENV['SNAPPYMAIL_NEXTCLOUD'] = true; + $_ENV['SNAPPYMAIL_INCLUDE_AS_API'] = true; + + // Import data from RainLoop + $dir = \rtrim(\trim(\OC::$server->getSystemConfig()->getValue('datadirectory', '')), '\\/'); + $dir_snappy = $dir . '/appdata_snappymail/'; + $dir_rainloop = $dir . '/rainloop-storage'; + $rainloop_plugins = []; + if (!\is_dir($dir_snappy) && \is_dir($dir_rainloop)) { + \mkdir($dir_snappy, 0755, true); + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($dir_rainloop, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::SELF_FIRST + ); + foreach ($iterator as $item) { + $target = $dir_snappy . $iterator->getSubPathname(); + if (\preg_match('@/plugins/([^/])@', $target, $match)) { + $rainloop_plugins[$match[1]] = $match[1]; + } else if (!\strpos($target, '/cache/')) { + if ($item->isDir()) { + \mkdir($target, 0755, true); + } else { + \copy($item, $target); + } + } + } + } + + require_once \dirname(\dirname(__DIR__)) . '/app/index.php'; + $oConfig = \RainLoop\Api::Config(); $bSave = false; if (!$oConfig->Get('webmail', 'app_path')) { @@ -37,6 +64,24 @@ class SnappyMailHelper $oConfig->Set('webmail', 'theme', 'Nextcloud@custom'); $bSave = true; } + + $sPassword = $oConfig->Get('security', 'admin_password'); + if ('12345' == $sPassword || !$sPassword) { + $sPassword = \substr(\base64_encode(\random_bytes(16)), 0, 12); + \RainLoop\Utils::saveFile(APP_PRIVATE_DATA . 'admin_password.txt', $sPassword . "\n"); + $oConfig->SetPassword($sPassword); + $bSave = true; + } + + // Attempt to install same plugins as RainLoop + if ($rainloop_plugins) { + foreach (\SnappyMail\Repository::getPackagesList()['List'] as $plugin) { + if (\in_array($plugin['id'], $rainloop_plugins)) { + \SnappyMail\Repository::installPackage('plugin', $plugin['id']); + } + } + } + $bSave && $oConfig->Save(); } @@ -119,43 +164,4 @@ class SnappyMailHelper static::loadApp(); return \SnappyMail\Crypt::DecryptUrlSafe($sPassword, $sSalt); } - - public static function importRainloop() : bool - { - $dir = \rtrim(\trim(\OC::$server->getSystemConfig()->getValue('datadirectory', '')), '\\/'); - - $dir_snappy = $dir . '/appdata_snappymail/'; - \is_dir($dir_snappy) || \mkdir($dir); - - $dir_rainloop = $dir . '/rainloop-storage'; - if (\is_dir($dir_rainloop)) { - $plugins = []; - $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($dir_rainloop, \RecursiveDirectoryIterator::SKIP_DOTS), - \RecursiveIteratorIterator::SELF_FIRST - ); - foreach ($iterator as $item) { - $target = $dir_snappy . DIRECTORY_SEPARATOR . $iterator->getSubPathname(); - if (\preg_match('@/plugins/([^/])@', $target, $match)) { - $plugins[$match[1]] = $match[1]; - } else if (!\strpos($target, '/cache/')) { - if ($item->isDir()) { - \mkdir($target); - } else { - \copy($item, $target); - } - } - } - - static::loadApp(); - foreach (\SnappyMail\Repository::getPackagesList()['List'] as $plugin) { - if (\in_array($plugin['id'], $plugins)) { - \SnappyMail\Repository::installPackage('plugin', $plugin['id']); - } - } - - return true; - } - return false; - } }