This commit is contained in:
Avinash Gusain 2023-12-08 11:14:10 +05:30
parent 1bdddbeb09
commit fa18e6d3ab

View file

@ -12,201 +12,200 @@ use OCP\IRequest;
class PageController extends Controller class PageController extends Controller
{ {
private IL10N $l; private IL10N $l;
// Nextcloud lang to locale mapping array // Nextcloud lang to locale mapping array
public const LANGUAGE_TO_LOCALE_MAP = [ public const LANGUAGE_TO_LOCALE_MAP = [
'af' => 'af-ZA', // Afrikaans (South Africa) 'af' => 'af-ZA', // Afrikaans (South Africa)
'ar' => 'ar-SA', // Arabic (Saudi Arabia) 'ar' => 'ar-SA', // Arabic (Saudi Arabia)
'az' => 'az-AZ', // Azerbaijani (Azerbaijan) 'az' => 'az-AZ', // Azerbaijani (Azerbaijan)
'be' => 'be-BY', // Belarusian (Belarus) 'be' => 'be-BY', // Belarusian (Belarus)
'bg' => 'bg-BG', // Bulgarian (Bulgaria) 'bg' => 'bg-BG', // Bulgarian (Bulgaria)
'bn' => 'bn-BD', // Bengali (Bangladesh) 'bn' => 'bn-BD', // Bengali (Bangladesh)
'bs' => 'bs-BA', // Bosnian (Bosnia and Herzegovina) 'bs' => 'bs-BA', // Bosnian (Bosnia and Herzegovina)
'ca' => 'ca-ES', // Catalan (Spain) 'ca' => 'ca-ES', // Catalan (Spain)
'cs' => 'cs-CZ', // Czech (Czech Republic) 'cs' => 'cs-CZ', // Czech (Czech Republic)
'cy' => 'cy-GB', // Welsh (United Kingdom) 'cy' => 'cy-GB', // Welsh (United Kingdom)
'da' => 'da-DK', // Danish (Denmark) 'da' => 'da-DK', // Danish (Denmark)
'de' => 'de-DE', // German (Germany) 'de' => 'de-DE', // German (Germany)
'el' => 'el-GR', // Greek (Greece) 'el' => 'el-GR', // Greek (Greece)
'en' => 'en-US', // English (United States) 'en' => 'en-US', // English (United States)
'es' => 'es-ES', // Spanish (Spain) 'es' => 'es-ES', // Spanish (Spain)
'et' => 'et-EE', // Estonian (Estonia) 'et' => 'et-EE', // Estonian (Estonia)
'eu' => 'eu-ES', // Basque (Spain) 'eu' => 'eu-ES', // Basque (Spain)
'fa' => 'fa-IR', // Persian (Iran) 'fa' => 'fa-IR', // Persian (Iran)
'fi' => 'fi-FI', // Finnish (Finland) 'fi' => 'fi-FI', // Finnish (Finland)
'fr' => 'fr-FR', // French (France) 'fr' => 'fr-FR', // French (France)
'gl' => 'gl-ES', // Galician (Spain) 'gl' => 'gl-ES', // Galician (Spain)
'he' => 'he-IL', // Hebrew (Israel) 'he' => 'he-IL', // Hebrew (Israel)
'hi' => 'hi-IN', // Hindi (India) 'hi' => 'hi-IN', // Hindi (India)
'hr' => 'hr-HR', // Croatian (Croatia) 'hr' => 'hr-HR', // Croatian (Croatia)
'hu' => 'hu-HU', // Hungarian (Hungary) 'hu' => 'hu-HU', // Hungarian (Hungary)
'id' => 'id-ID', // Indonesian (Indonesia) 'id' => 'id-ID', // Indonesian (Indonesia)
'is' => 'is-IS', // Icelandic (Iceland) 'is' => 'is-IS', // Icelandic (Iceland)
'it' => 'it-IT', // Italian (Italy) 'it' => 'it-IT', // Italian (Italy)
'ja' => 'ja-JP', // Japanese (Japan) 'ja' => 'ja-JP', // Japanese (Japan)
'ka' => 'ka-GE', // Georgian (Georgia) 'ka' => 'ka-GE', // Georgian (Georgia)
'km' => 'km-KH', // Khmer (Cambodia) 'km' => 'km-KH', // Khmer (Cambodia)
'ko' => 'ko-KR', // Korean (South Korea) 'ko' => 'ko-KR', // Korean (South Korea)
'lt' => 'lt-LT', // Lithuanian (Lithuania) 'lt' => 'lt-LT', // Lithuanian (Lithuania)
'lv' => 'lv-LV', // Latvian (Latvia) 'lv' => 'lv-LV', // Latvian (Latvia)
'mk' => 'mk-MK', // Macedonian (North Macedonia) 'mk' => 'mk-MK', // Macedonian (North Macedonia)
'mn' => 'mn-MN', // Mongolian (Mongolia) 'mn' => 'mn-MN', // Mongolian (Mongolia)
'ms' => 'ms-MY', // Malay (Malaysia) 'ms' => 'ms-MY', // Malay (Malaysia)
'nb' => 'nb-NO', // Norwegian Bokmål (Norway) 'nb' => 'nb-NO', // Norwegian Bokmål (Norway)
'nl' => 'nl-NL', // Dutch (Netherlands) 'nl' => 'nl-NL', // Dutch (Netherlands)
'nn' => 'nn-NO', // Norwegian Nynorsk (Norway) 'nn' => 'nn-NO', // Norwegian Nynorsk (Norway)
'pl' => 'pl-PL', // Polish (Poland) 'pl' => 'pl-PL', // Polish (Poland)
'pt' => 'pt-PT', // Portuguese (Portugal) 'pt' => 'pt-PT', // Portuguese (Portugal)
'pt-br' => 'pt-BR', // Portuguese (Brazil) 'pt-br' => 'pt-BR', // Portuguese (Brazil)
'ro' => 'ro-RO', // Romanian (Romania) 'ro' => 'ro-RO', // Romanian (Romania)
'ru' => 'ru-RU', // Russian (Russia) 'ru' => 'ru-RU', // Russian (Russia)
'sk' => 'sk-SK', // Slovak (Slovakia) 'sk' => 'sk-SK', // Slovak (Slovakia)
'sl' => 'sl-SI', // Slovenian (Slovenia) 'sl' => 'sl-SI', // Slovenian (Slovenia)
'sq' => 'sq-AL', // Albanian (Albania) 'sq' => 'sq-AL', // Albanian (Albania)
'sr' => 'sr-RS', // Serbian (Serbia) 'sr' => 'sr-RS', // Serbian (Serbia)
'sv' => 'sv-SE', // Swedish (Sweden) 'sv' => 'sv-SE', // Swedish (Sweden)
'th' => 'th-TH', // Thai (Thailand) 'th' => 'th-TH', // Thai (Thailand)
'tr' => 'tr-TR', // Turkish (Turkey) 'tr' => 'tr-TR', // Turkish (Turkey)
'uk' => 'uk-UA', // Ukrainian (Ukraine) 'uk' => 'uk-UA', // Ukrainian (Ukraine)
'vi' => 'vi-VN', // Vietnamese (Vietnam) 'vi' => 'vi-VN', // Vietnamese (Vietnam)
'zh-cn' => 'zh-CN', // Chinese (China) 'zh-cn' => 'zh-CN', // Chinese (China)
'zh-tw' => 'zh-TW' // Chinese (Taiwan) 'zh-tw' => 'zh-TW' // Chinese (Taiwan)
]; ];
public function __construct(string $appName, IRequest $request, IL10N $l) public function __construct(string $appName, IRequest $request, IL10N $l) {
{ parent::__construct($appName, $request);
parent::__construct($appName, $request); $this->l = $l;
$this->l = $l; $lang = \strtolower(\str_replace('_', '-', $l->getLocaleCode()));
$lang = \strtolower(\str_replace('_', '-', $l->getLocaleCode())); if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $lang;
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = $lang; } else {
} else { $_SERVER['HTTP_ACCEPT_LANGUAGE'] .= ",{$lang};q=2";
$_SERVER['HTTP_ACCEPT_LANGUAGE'] .= ",{$lang};q=2"; }
} }
}
/** /**
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
*/ */
public function index() public function index()
{ {
$config = \OC::$server->getConfig(); $config = \OC::$server->getConfig();
$bAdmin = false; $bAdmin = false;
if (!empty($_SERVER['QUERY_STRING'])) { if (!empty($_SERVER['QUERY_STRING'])) {
SnappyMailHelper::loadApp(); SnappyMailHelper::loadApp();
$bAdmin = \RainLoop\Api::Config()->Get('security', 'admin_panel_key', 'admin') == $_SERVER['QUERY_STRING']; $bAdmin = \RainLoop\Api::Config()->Get('security', 'admin_panel_key', 'admin') == $_SERVER['QUERY_STRING'];
if (!$bAdmin) { if (!$bAdmin) {
return SnappyMailHelper::startApp(true); return SnappyMailHelper::startApp(true);
} }
} }
if (!$bAdmin && $config->getAppValue('snappymail', 'snappymail-no-embed')) { if (!$bAdmin && $config->getAppValue('snappymail', 'snappymail-no-embed')) {
\OC::$server->getNavigationManager()->setActiveEntry('snappymail'); \OC::$server->getNavigationManager()->setActiveEntry('snappymail');
\OCP\Util::addScript('snappymail', 'snappymail'); \OCP\Util::addScript('snappymail', 'snappymail');
\OCP\Util::addStyle('snappymail', 'style'); \OCP\Util::addStyle('snappymail', 'style');
SnappyMailHelper::startApp(); SnappyMailHelper::startApp();
$response = new TemplateResponse('snappymail', 'index', [ $response = new TemplateResponse('snappymail', 'index', [
'snappymail-iframe-url' => SnappyMailHelper::normalizeUrl(SnappyMailHelper::getAppUrl()) 'snappymail-iframe-url' => SnappyMailHelper::normalizeUrl(SnappyMailHelper::getAppUrl())
. (empty($_GET['target']) ? '' : "#{$_GET['target']}") . (empty($_GET['target']) ? '' : "#{$_GET['target']}")
]); ]);
$csp = new ContentSecurityPolicy(); $csp = new ContentSecurityPolicy();
$csp->addAllowedFrameDomain("'self'"); $csp->addAllowedFrameDomain("'self'");
// $csp->addAllowedFrameAncestorDomain("'self'"); // $csp->addAllowedFrameAncestorDomain("'self'");
$response->setContentSecurityPolicy($csp); $response->setContentSecurityPolicy($csp);
return $response; return $response;
} }
\OC::$server->getNavigationManager()->setActiveEntry('snappymail'); \OC::$server->getNavigationManager()->setActiveEntry('snappymail');
\OCP\Util::addStyle('snappymail', 'embed'); \OCP\Util::addStyle('snappymail', 'embed');
SnappyMailHelper::startApp(); SnappyMailHelper::startApp();
$oConfig = \RainLoop\Api::Config(); $oConfig = \RainLoop\Api::Config();
$oActions = $bAdmin ? new \RainLoop\ActionsAdmin() : \RainLoop\Api::Actions(); $oActions = $bAdmin ? new \RainLoop\ActionsAdmin() : \RainLoop\Api::Actions();
$oHttp = \MailSo\Base\Http::SingletonInstance(); $oHttp = \MailSo\Base\Http::SingletonInstance();
$oServiceActions = new \RainLoop\ServiceActions($oHttp, $oActions); $oServiceActions = new \RainLoop\ServiceActions($oHttp, $oActions);
$sAppJsMin = $oConfig->Get('debug', 'javascript', false) ? '' : '.min'; $sAppJsMin = $oConfig->Get('debug', 'javascript', false) ? '' : '.min';
$sAppCssMin = $oConfig->Get('debug', 'css', false) ? '' : '.min'; $sAppCssMin = $oConfig->Get('debug', 'css', false) ? '' : '.min';
$languageSetting = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true); $languageSetting = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true);
if (!$languageSetting) { if (!$languageSetting) {
$aResultLang = \json_decode(\file_get_contents(APP_VERSION_ROOT_PATH . 'app/localization/langs.json'), true); $aResultLang = \json_decode(\file_get_contents(APP_VERSION_ROOT_PATH . 'app/localization/langs.json'), true);
if ($aResultLang === null) { if ($aResultLang === null) {
throw new \Exception('Error decoding JSON content.'); throw new \Exception('Error decoding JSON content.');
} }
$user = \OC::$server->getUserSession()->getUser(); $user = \OC::$server->getUserSession()->getUser();
$userId = $user->getUID(); $userId = $user->getUID();
$langCode = $config->getUserValue($userId, 'core', 'lang'); $langCode = $config->getUserValue($userId, 'core', 'lang');
$userLang = \OC::$server->getConfig()->getUserValue($userId, 'core', 'lang'); $userLang = \OC::$server->getConfig()->getUserValue($userId, 'core', 'lang');
$localeCode = self::LANGUAGE_TO_LOCALE_MAP[$langCode]; $localeCode = self::LANGUAGE_TO_LOCALE_MAP[$langCode];
if (!strpos($localeCode, '_') && !strpos($localeCode, '-')) { if (!strpos($localeCode, '_') && !strpos($localeCode, '-')) {
$localeCode = $localeCode . '-' . strtoupper($localeCode); $localeCode = $localeCode . '-' . strtoupper($localeCode);
} }
$sLanguage = 'en'; $sLanguage = 'en';
if(isset($aResultLang['LANGS_NAMES_EN'][$localeCode])) { if(isset($aResultLang['LANGS_NAMES_EN'][$localeCode])) {
$sLanguage = $localeCode; $sLanguage = $localeCode;
} }
} else { }else {
$sLanguage = $oActions->GetLanguage(false); $sLanguage = $oActions->GetLanguage(false);
} }
$csp = new ContentSecurityPolicy(); $csp = new ContentSecurityPolicy();
$sNonce = $csp->getSnappyMailNonce(); $sNonce = $csp->getSnappyMailNonce();
$params = [ $params = [
'Admin' => $bAdmin ? 1 : 0, 'Admin' => $bAdmin ? 1 : 0,
'LoadingDescriptionEsc' => \htmlspecialchars($oConfig->Get('webmail', 'loading_description', 'SnappyMail'), ENT_QUOTES | ENT_IGNORE, 'UTF-8'), 'LoadingDescriptionEsc' => \htmlspecialchars($oConfig->Get('webmail', 'loading_description', 'SnappyMail'), ENT_QUOTES|ENT_IGNORE, 'UTF-8'),
'BaseTemplates' => \RainLoop\Utils::ClearHtmlOutput($oServiceActions->compileTemplates($bAdmin)), 'BaseTemplates' => \RainLoop\Utils::ClearHtmlOutput($oServiceActions->compileTemplates($bAdmin)),
'BaseAppBootScript' => \file_get_contents(APP_VERSION_ROOT_PATH . 'static/js' . ($sAppJsMin ? '/min' : '') . '/boot' . $sAppJsMin . '.js'), 'BaseAppBootScript' => \file_get_contents(APP_VERSION_ROOT_PATH.'static/js'.($sAppJsMin ? '/min' : '').'/boot'.$sAppJsMin.'.js'),
'BaseAppBootScriptNonce' => $sNonce, 'BaseAppBootScriptNonce' => $sNonce,
'BaseLanguage' => $oActions->compileLanguage($sLanguage, $bAdmin), 'BaseLanguage' => $oActions->compileLanguage($sLanguage, $bAdmin),
'BaseAppBootCss' => \file_get_contents(APP_VERSION_ROOT_PATH . 'static/css/boot' . $sAppCssMin . '.css'), 'BaseAppBootCss' => \file_get_contents(APP_VERSION_ROOT_PATH.'static/css/boot'.$sAppCssMin.'.css'),
'BaseAppThemeCss' => \preg_replace( 'BaseAppThemeCss' => \preg_replace(
'/\\s*([:;{},]+)\\s*/s', '/\\s*([:;{},]+)\\s*/s',
'$1', '$1',
$oActions->compileCss($oActions->GetTheme($bAdmin), $bAdmin) $oActions->compileCss($oActions->GetTheme($bAdmin), $bAdmin)
) )
]; ];
// \OCP\Util::addScript('snappymail', '../app/snappymail/v/'.APP_VERSION.'/static/js'.($sAppJsMin ? '/min' : '').'/boot'.$sAppJsMin); // \OCP\Util::addScript('snappymail', '../app/snappymail/v/'.APP_VERSION.'/static/js'.($sAppJsMin ? '/min' : '').'/boot'.$sAppJsMin);
// Nextcloud html encodes, so addHeader('style') is not possible // Nextcloud html encodes, so addHeader('style') is not possible
// \OCP\Util::addHeader('style', ['id'=>'app-boot-css'], \file_get_contents(APP_VERSION_ROOT_PATH.'static/css/boot'.$sAppCssMin.'.css')); // \OCP\Util::addHeader('style', ['id'=>'app-boot-css'], \file_get_contents(APP_VERSION_ROOT_PATH.'static/css/boot'.$sAppCssMin.'.css'));
\OCP\Util::addHeader('link', ['type' => 'text/css','rel' => 'stylesheet','href' => \RainLoop\Utils::WebStaticPath('css/' . ($bAdmin ? 'admin' : 'app') . $sAppCssMin . '.css')], ''); \OCP\Util::addHeader('link', ['type'=>'text/css','rel'=>'stylesheet','href'=>\RainLoop\Utils::WebStaticPath('css/'.($bAdmin?'admin':'app').$sAppCssMin.'.css')], '');
// \OCP\Util::addHeader('style', ['id'=>'app-theme-style','data-href'=>$params['BaseAppThemeCssLink']], $params['BaseAppThemeCss']); // \OCP\Util::addHeader('style', ['id'=>'app-theme-style','data-href'=>$params['BaseAppThemeCssLink']], $params['BaseAppThemeCss']);
$response = new TemplateResponse('snappymail', 'index_embed', $params); $response = new TemplateResponse('snappymail', 'index_embed', $params);
$response->setContentSecurityPolicy($csp); $response->setContentSecurityPolicy($csp);
return $response; return $response;
} }
/** /**
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
*/ */
public function appGet() public function appGet()
{ {
return SnappyMailHelper::startApp(true); return SnappyMailHelper::startApp(true);
} }
/** /**
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
*/ */
public function appPost() public function appPost()
{ {
return SnappyMailHelper::startApp(true); return SnappyMailHelper::startApp(true);
} }
/** /**
* @NoAdminRequired * @NoAdminRequired
* @NoCSRFRequired * @NoCSRFRequired
*/ */
public function indexPost() public function indexPost()
{ {
return SnappyMailHelper::startApp(true); return SnappyMailHelper::startApp(true);
} }
} }