Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.

Commit d52f2ad

Browse files
author
the-djmaze
committed
Draft code to run SnappyMail inside Nextcloud without iframe for
1 parent dcf4983 commit d52f2ad

File tree

4 files changed

+82
-12
lines changed

4 files changed

+82
-12
lines changed

integrations/nextcloud/snappymail/lib/Controller/PageController.php

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class PageController extends Controller
1616
*/
1717
public function index()
1818
{
19+
// Uncomment to test without using an iframe
20+
// return static::index_embed();
21+
1922
\OC::$server->getNavigationManager()->setActiveEntry('snappymail');
2023

2124
\OCP\Util::addStyle('snappymail', 'style');
@@ -72,5 +75,61 @@ public function appPost()
7275
{
7376
SnappyMailHelper::startApp();
7477
}
75-
}
7678

79+
/**
80+
* Draft code to run without using an iframe
81+
*/
82+
private static function index_embed()
83+
{
84+
\OC::$server->getNavigationManager()->setActiveEntry('snappymail');
85+
86+
\OCP\Util::addStyle('snappymail', 'style');
87+
88+
SnappyMailHelper::startApp(true);
89+
$webPath = \OC::$server->getAppManager()->getAppWebPath('snappymail') . '/app';
90+
$oConfig = \RainLoop\Api::Config();
91+
$oActions = \RainLoop\Api::Actions();
92+
$oHttp = \MailSo\Base\Http::SingletonInstance();
93+
$oServiceActions = new \RainLoop\ServiceActions($oHttp, $oActions);
94+
$sAppJsMin = $oConfig->Get('labs', 'use_app_debug_js', false) ? '' : '.min';
95+
$sAppCssMin = $oConfig->Get('labs', 'use_app_debug_css', false) ? '' : '.min';
96+
$sLanguage = $oActions->GetLanguage(false);
97+
98+
$sScriptNonce = \OC::$server->getContentSecurityPolicyNonceManager()->getNonce();
99+
// $sScriptNonce = \SnappyMail\UUID::generate();
100+
// \RainLoop\Service::setCSP($sScriptNonce);
101+
102+
$params = [
103+
'LoadingDescriptionEsc' => \htmlspecialchars($oConfig->Get('webmail', 'loading_description', 'SnappyMail'), ENT_QUOTES|ENT_IGNORE, 'UTF-8'),
104+
'BaseTemplates' => \RainLoop\Utils::ClearHtmlOutput($oServiceActions->compileTemplates(false)),
105+
'BaseAppBootScript' => \str_replace(
106+
'loadScript(`./?/',
107+
'loadScript(`'.$webPath.'/?/',
108+
\file_get_contents(APP_VERSION_ROOT_PATH.'static/js'.($sAppJsMin ? '/min' : '').'/boot'.$sAppJsMin.'.js')
109+
),
110+
'BaseAppBootScriptNonce' => $sScriptNonce,
111+
'BaseLanguage' => $oActions->compileLanguage($sLanguage, false),
112+
];
113+
114+
\OCP\Util::addHeader('style', ['id'=>'app-boot-css'], \file_get_contents(APP_VERSION_ROOT_PATH.'static/css/boot'.$sAppCssMin.'.css'));
115+
\OCP\Util::addHeader('link', ['type'=>'text/css','rel'=>'stylesheet','href'=>\RainLoop\Utils::WebStaticPath('css/app'.$sAppCssMin.'.css')], '');
116+
\OCP\Util::addHeader('style', ['id'=>'app-theme-style','data-href'=>$oActions->ThemeLink(false)],
117+
\preg_replace(
118+
'/\\s*([:;{},]+)\\s*/s',
119+
'$1',
120+
$oActions->compileCss($oActions->GetTheme(false), false)
121+
));
122+
123+
$response = new TemplateResponse('snappymail', 'index_embed', $params);
124+
125+
$csp = new ContentSecurityPolicy();
126+
$csp->addAllowedScriptDomain("'self'");
127+
$csp->useStrictDynamic(true);
128+
$csp->allowEvalScript(true); // $csp->addAllowedScriptDomain("'unsafe-eval'");
129+
$csp->addAllowedStyleDomain("'self'");
130+
$response->setContentSecurityPolicy($csp);
131+
132+
return $response;
133+
}
134+
135+
}

integrations/nextcloud/snappymail/lib/Util/SnappyMailHelper.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,23 @@ public static function startApp(bool $api = false)
3636
if (!\class_exists('RainLoop\\Api')) {
3737
if ($api) {
3838
$_ENV['SNAPPYMAIL_INCLUDE_AS_API'] = true;
39-
} else {
40-
$_SERVER['SCRIPT_NAME'] = \OC::$server->getAppManager()->getAppWebPath('snappymail') . '/app/index.php';
4139
}
4240
$_ENV['SNAPPYMAIL_NEXTCLOUD'] = true;
41+
$_SERVER['SCRIPT_NAME'] = \OC::$server->getAppManager()->getAppWebPath('snappymail') . '/app/index.php';
42+
4343
$sData = \rtrim(\trim(\OC::$server->getSystemConfig()->getValue('datadirectory', '')), '\\/').'/appdata_snappymail/';
4444
if (\is_dir($sData)) {
4545
\define('APP_DATA_FOLDER_PATH', $sData);
4646
}
47+
4748
// Nextcloud the default spl_autoload_register() not working
4849
\spl_autoload_register(function($sClassName){
4950
$file = RAINLOOP_APP_LIBRARIES_PATH . \strtolower(\strtr($sClassName, '\\', DIRECTORY_SEPARATOR)) . '.php';
5051
if (is_file($file)) {
5152
include_once $file;
5253
}
5354
});
55+
5456
require_once \OC::$server->getAppManager()->getAppPath('snappymail') . '/app/index.php';
5557
}
5658
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<div id="rl-app" data-admin="0" spellcheck="false">
2+
<div id="rl-loading">
3+
<div id="rl-loading-desc"><?php echo $_['LoadingDescriptionEsc']; ?></div>
4+
<i class="icon-spinner"></i>
5+
</div>
6+
<div id="rl-loading-error" hidden="">An error occurred.<br>Please refresh the page and try again.</div>
7+
<div id="rl-content" hidden="">
8+
<div id="rl-left"></div>
9+
<div id="rl-right"></div>
10+
</div>
11+
<div id="rl-popups"></div>
12+
<?php echo $_['BaseTemplates']; ?>
13+
</div>
14+
<?php
15+
echo '
16+
<script nonce="'.$_['BaseAppBootScriptNonce'].'" type="text/javascript">'.$_['BaseAppBootScript'].$_['BaseLanguage'].'</script>
17+
';

plugins/nextcloud/index.php

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,7 @@ public function Init() : void
1717
$this->addHook('filter.app-data', 'FilterAppData');
1818
$this->addHook('json.attachments', 'SaveAttachments');
1919

20-
$sAppPath = \rtrim(\trim(\OC::$server->getAppManager()->getAppWebPath()), '\\/').'/app/';
21-
if (!$sAppPath) {
22-
$sUrl = \MailSo\Base\Http::SingletonInstance()->GetUrl();
23-
if (\str_contains($sUrl, '/index.php/apps/snappymail/')) {
24-
$sAppPath = \preg_replace('/\/index\.php\/apps\/snappymail.+$/',
25-
'/apps/snappymail/app/', $sUrl);
26-
}
27-
}
28-
$_SERVER['SCRIPT_NAME'] = $sAppPath;
20+
$this->addJs('js/attachments.js');
2921
}
3022
}
3123

0 commit comments

Comments
 (0)