mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-12-11 13:45:57 +08:00
Merge master into new-contacts-api
This commit is contained in:
commit
103c6efb85
6 changed files with 234 additions and 211 deletions
|
|
@ -1,173 +1,175 @@
|
||||||
.editorToolbar {
|
.editorToolbar {
|
||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
line-height: 19px;
|
line-height: 19px;
|
||||||
|
|
||||||
&.editorHideToolbar .editorToolbarButtom {
|
&.editorHideToolbar .editorToolbarButtom {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editorSwitcher {
|
.editorSwitcher {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editorToolbarButtom {
|
.editorToolbarButtom {
|
||||||
|
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
border: 0px;
|
border: 0px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
|
|
||||||
cursor: default;
|
cursor: default;
|
||||||
background: url('@{editor-sprite}');
|
background: url('@{editor-sprite}');
|
||||||
|
|
||||||
&.bold { background-position: 0 0; }
|
&.bold { background-position: 0 0; }
|
||||||
&.italic { background-position: -16px 0; }
|
&.italic { background-position: -16px 0; }
|
||||||
&.underline { background-position: -32px 0; }
|
&.underline { background-position: -32px 0; }
|
||||||
&.strikethrough { background-position: -48px 0; }
|
&.strikethrough { background-position: -48px 0; }
|
||||||
&.link { background-position: -64px 0; }
|
&.link { background-position: -64px 0; }
|
||||||
&.unlink { background-position: -80px 0; }
|
&.unlink { background-position: -80px 0; }
|
||||||
&.orderedlist { background-position: -96px 0; }
|
&.orderedlist { background-position: -96px 0; }
|
||||||
&.unorderedlist { background-position: -112px 0; }
|
&.unorderedlist { background-position: -112px 0; }
|
||||||
&.image { background-position: -128px 0; }
|
&.image { background-position: -128px 0; }
|
||||||
|
|
||||||
&.h1 { background-position: 0 -16px;}
|
&.h1 { background-position: 0 -16px;}
|
||||||
&.h2 { background-position: -16px -16px;}
|
&.h2 { background-position: -16px -16px;}
|
||||||
&.h3 { background-position: -32px -16px;}
|
&.h3 { background-position: -32px -16px;}
|
||||||
&.h4 { background-position: -48px -16px;}
|
&.h4 { background-position: -48px -16px;}
|
||||||
&.h5 { background-position: -64px -16px;}
|
&.h5 { background-position: -64px -16px;}
|
||||||
&.h6 { background-position: -80px -16px;}
|
&.h6 { background-position: -80px -16px;}
|
||||||
|
|
||||||
&.subscript { background-position: -96px -16px;}
|
&.subscript { background-position: -96px -16px;}
|
||||||
&.superscript { background-position: -112px -16px;}
|
&.superscript { background-position: -112px -16px;}
|
||||||
&.indent { background-position: -128px -16px;}
|
&.indent { background-position: -128px -16px;}
|
||||||
&.outdent { background-position: -144px -16px;}
|
&.outdent { background-position: -144px -16px;}
|
||||||
&.horizontalrule { background-position: -160px -16px;}
|
&.horizontalrule { background-position: -160px -16px;}
|
||||||
&.p { background-position: -176px -16px;}
|
&.p { background-position: -176px -16px;}
|
||||||
|
|
||||||
&.justifyleft { background-position: 0 -32px;}
|
&.justifyleft { background-position: 0 -32px;}
|
||||||
&.justifycenter { background-position: -16px -32px;}
|
&.justifycenter { background-position: -16px -32px;}
|
||||||
&.justifyright { background-position: -32px -32px;}
|
&.justifyright { background-position: -32px -32px;}
|
||||||
&.increasefontsize { background-position: -48px -32px;}
|
&.increasefontsize { background-position: -48px -32px;}
|
||||||
&.decreasefontsize { background-position: -64px -32px;}
|
&.decreasefontsize { background-position: -64px -32px;}
|
||||||
&.forecolor { background-position: -80px -32px;}
|
&.forecolor { background-position: -80px -32px;}
|
||||||
&.backcolor { background-position: -80px -32px;}
|
&.backcolor { background-position: -80px -32px;}
|
||||||
&.removeformat { background-position: -144px 0;}
|
&.removeformat { background-position: -144px 0;}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.textAreaParent {
|
.textAreaParent {
|
||||||
|
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
|
|
||||||
.editorHtmlArea {
|
.editorHtmlArea {
|
||||||
|
|
||||||
.box-sizing(border-box);
|
.box-sizing(border-box);
|
||||||
|
|
||||||
border: 0px !important;
|
border: 0px !important;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
font-family: arial, sans-serif;
|
font-family: arial, sans-serif;
|
||||||
font-size: 13px;
|
font-size: 14px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
|
|
||||||
padding-left: 40px;
|
padding-left: 40px;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
list-style-type: disc !important;
|
list-style-type: disc !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ol {
|
ol {
|
||||||
padding-left: 40px;
|
padding-left: 40px;
|
||||||
li {
|
li {
|
||||||
list-style-type: decimal !important;
|
list-style-type: decimal !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
blockquote {
|
blockquote {
|
||||||
border-left: solid 2px #444;
|
border-left: solid 2px #444;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
padding-left: 5px
|
padding-left: 5px
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.editorDragOver {
|
&.editorDragOver {
|
||||||
background: #ffffef;
|
background: #ffffef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.editorTextArea {
|
.editorTextArea {
|
||||||
.box-sizing(border-box);
|
.box-sizing(border-box);
|
||||||
|
|
||||||
display: block;
|
display: block;
|
||||||
border: 0px !important;
|
border: 0px !important;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
font-family: arial, sans-serif;
|
||||||
overflow: auto;
|
font-size: 14px;
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
overflow: auto;
|
||||||
}
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
.editorColorPicker {
|
}
|
||||||
|
|
||||||
.editorCpColors {
|
.editorColorPicker {
|
||||||
|
|
||||||
float: left;
|
.editorCpColors {
|
||||||
margin: 0;
|
|
||||||
clear: both;
|
float: left;
|
||||||
width: 128px;
|
margin: 0;
|
||||||
border: 1px solid #000;
|
clear: both;
|
||||||
backgroud: #000;
|
width: 128px;
|
||||||
|
border: 1px solid #000;
|
||||||
.editorCpColor {
|
backgroud: #000;
|
||||||
border: 1px solid #fff;
|
|
||||||
float: left;
|
.editorCpColor {
|
||||||
width: 14px;
|
border: 1px solid #fff;
|
||||||
height: 14px;
|
float: left;
|
||||||
}
|
width: 14px;
|
||||||
}
|
height: 14px;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
.editorSwitcher {
|
}
|
||||||
.g-ui-link;
|
|
||||||
.pull-right;
|
.editorSwitcher {
|
||||||
|
.g-ui-link;
|
||||||
padding-bottom: 6px;
|
.pull-right;
|
||||||
}
|
|
||||||
|
padding-bottom: 6px;
|
||||||
.editorFontStylePicker {
|
}
|
||||||
|
|
||||||
.editorFpFonts {
|
.editorFontStylePicker {
|
||||||
|
|
||||||
padding: 5px;
|
.editorFpFonts {
|
||||||
border: 1px solid #000;
|
|
||||||
background-color: #fff;
|
padding: 5px;
|
||||||
|
border: 1px solid #000;
|
||||||
.editorFpFont {
|
background-color: #fff;
|
||||||
padding: 5px;
|
|
||||||
}
|
.editorFpFont {
|
||||||
}
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"name": "RainLoop",
|
"name": "RainLoop",
|
||||||
"title": "RainLoop Webmail",
|
"title": "RainLoop Webmail",
|
||||||
"version": "1.4.2",
|
"version": "1.4.2",
|
||||||
"release": "524",
|
"release": "525",
|
||||||
"description": "Simple, modern & fast web-based email client",
|
"description": "Simple, modern & fast web-based email client",
|
||||||
"homepage": "http://rainloop.net",
|
"homepage": "http://rainloop.net",
|
||||||
"main": "Gruntfile.js",
|
"main": "Gruntfile.js",
|
||||||
|
|
|
||||||
|
|
@ -2224,26 +2224,35 @@ class Actions
|
||||||
return '' === $sCoreAccess || APP_SITE === $sCoreAccess;
|
return '' === $sCoreAccess || APP_SITE === $sCoreAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getRepositoryDataByUrl($sRepo, &$bReal = false)
|
/**
|
||||||
|
* @param string $sRepo
|
||||||
|
* @param bool $bReal = false
|
||||||
|
* @param bool $bMain = true
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getRepositoryDataByUrl($sRepo, &$bReal = false, $bMain = true)
|
||||||
{
|
{
|
||||||
$bReal = false;
|
$bReal = false;
|
||||||
$aRep = null;
|
$aRep = null;
|
||||||
|
|
||||||
$sRep = '';
|
$sRep = '';
|
||||||
$sRepoType = \strtolower(\trim($this->Config()->Get('labs', 'repo_type', 'stable')));
|
|
||||||
$sRepoFile = 'repository.json';
|
$sRepoFile = 'repository.json';
|
||||||
$iRepTime = 0;
|
$iRepTime = 0;
|
||||||
|
|
||||||
switch ($sRepoType) {
|
if ($bMain)
|
||||||
case 'dev':
|
{
|
||||||
case 'nightly':
|
switch (\strtolower(\trim($this->Config()->Get('labs', 'repo_type', 'stable'))))
|
||||||
case 'beta':
|
{
|
||||||
$sRepoFile = 'beta.repository.json';
|
case 'dev':
|
||||||
break;
|
case 'nightly':
|
||||||
case 'stable':
|
case 'beta':
|
||||||
default:
|
$sRepoFile = 'beta.repository.json';
|
||||||
$sRepoFile = 'repository.json';
|
break;
|
||||||
break;
|
case 'stable':
|
||||||
|
default:
|
||||||
|
$sRepoFile = 'repository.json';
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$oHttp = \MailSo\Base\Http::SingletonInstance();
|
$oHttp = \MailSo\Base\Http::SingletonInstance();
|
||||||
|
|
@ -2352,8 +2361,9 @@ class Actions
|
||||||
$sAddRepo = $this->rainloopRepo(true);
|
$sAddRepo = $this->rainloopRepo(true);
|
||||||
if (0 < \strlen($sAddRepo))
|
if (0 < \strlen($sAddRepo))
|
||||||
{
|
{
|
||||||
$aAddData = $this->getRepositoryDataByUrl($sAddRepo);
|
$bFakeReal = false;
|
||||||
if (\is_array($aAddData) && 0 < \count($aAddData))
|
$aAddData = $this->getRepositoryDataByUrl($sAddRepo, $bFakeReal, false);
|
||||||
|
if ($bFakeReal && \is_array($aAddData) && 0 < \count($aAddData))
|
||||||
{
|
{
|
||||||
$aResult = \array_merge($aResult, $aAddData);
|
$aResult = \array_merge($aResult, $aAddData);
|
||||||
}
|
}
|
||||||
|
|
@ -2553,7 +2563,7 @@ class Actions
|
||||||
$this->Logger()->Write($sUrl.' -> '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
$this->Logger()->Write($sUrl.' -> '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
||||||
}
|
}
|
||||||
|
|
||||||
@fclose($pDest);
|
@\fclose($pDest);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -2572,8 +2582,8 @@ class Actions
|
||||||
|
|
||||||
$sTmpFolder = APP_PRIVATE_DATA.\md5($sTmp);
|
$sTmpFolder = APP_PRIVATE_DATA.\md5($sTmp);
|
||||||
|
|
||||||
mkdir($sTmpFolder);
|
\mkdir($sTmpFolder);
|
||||||
if (is_dir($sTmpFolder))
|
if (\is_dir($sTmpFolder))
|
||||||
{
|
{
|
||||||
$bResult = 0 !== $oArchive->extract(PCLZIP_OPT_PATH, $sTmpFolder);
|
$bResult = 0 !== $oArchive->extract(PCLZIP_OPT_PATH, $sTmpFolder);
|
||||||
if (!$bResult)
|
if (!$bResult)
|
||||||
|
|
@ -2581,27 +2591,35 @@ class Actions
|
||||||
$this->Logger()->Write('Cannot extract package files: '.$oArchive->errorInfo(), \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
$this->Logger()->Write('Cannot extract package files: '.$oArchive->errorInfo(), \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($bResult && file_exists($sTmpFolder.'/index.php') &&
|
if ($bResult && \file_exists($sTmpFolder.'/index.php') &&
|
||||||
is_writable(APP_INDEX_ROOT_PATH.'rainloop/') &&
|
\is_writable(APP_INDEX_ROOT_PATH.'rainloop/') &&
|
||||||
file_exists($sTmpFolder.'/data/VERSION') &&
|
\file_exists($sTmpFolder.'/data/VERSION') &&
|
||||||
is_dir($sTmpFolder.'/rainloop/'))
|
\is_dir($sTmpFolder.'/rainloop/'))
|
||||||
{
|
{
|
||||||
$sNewVersion = file_get_contents($sTmpFolder.'/data/VERSION');
|
$sNewVersion = \file_get_contents($sTmpFolder.'/data/VERSION');
|
||||||
if ($sNewVersion && !is_dir(APP_INDEX_ROOT_PATH.'rainloop/v/'.$sNewVersion))
|
if ($sNewVersion && !\is_dir(APP_INDEX_ROOT_PATH.'rainloop/v/'.$sNewVersion))
|
||||||
{
|
{
|
||||||
\MailSo\Base\Utils::CopyDir($sTmpFolder.'/rainloop/', APP_INDEX_ROOT_PATH.'rainloop/');
|
\MailSo\Base\Utils::CopyDir($sTmpFolder.'/rainloop/', APP_INDEX_ROOT_PATH.'rainloop/');
|
||||||
|
|
||||||
copy($sTmpFolder.'/data/VERSION', APP_DATA_FOLDER_PATH.'VERSION');
|
if (!\is_dir(APP_INDEX_ROOT_PATH.'rainloop/v/'.$sNewVersion) &&
|
||||||
if (md5_file($sTmpFolder.'/index.php') !== md5_file(APP_INDEX_ROOT_PATH.'index.php'))
|
\copy($sTmpFolder.'/data/VERSION', APP_DATA_FOLDER_PATH.'VERSION'))
|
||||||
{
|
{
|
||||||
copy($sTmpFolder.'/index.php', APP_INDEX_ROOT_PATH.'index.php');
|
if (\md5_file($sTmpFolder.'/index.php') !== \md5_file(APP_INDEX_ROOT_PATH.'index.php'))
|
||||||
}
|
{
|
||||||
|
\copy($sTmpFolder.'/index.php', APP_INDEX_ROOT_PATH.'index.php');
|
||||||
|
}
|
||||||
|
|
||||||
$bResult = true;
|
$bResult = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->Logger()->Write('Cannot copy new package files', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
||||||
|
$this->Logger()->Write($sTmpFolder.'/rainloop/ -> '.APP_INDEX_ROOT_PATH.'rainloop/', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->Logger()->WriteDump($sNewVersion.' version already installed', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
$this->Logger()->Write($sNewVersion.' version already installed', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ($bResult)
|
else if ($bResult)
|
||||||
|
|
@ -2619,7 +2637,7 @@ class Actions
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$bResult = true;
|
$bResult = true;
|
||||||
if (is_dir(APP_PLUGINS_PATH.$sId))
|
if (\is_dir(APP_PLUGINS_PATH.$sId))
|
||||||
{
|
{
|
||||||
$bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sId);
|
$bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sId);
|
||||||
if (!$bResult)
|
if (!$bResult)
|
||||||
|
|
@ -2638,12 +2656,11 @@ class Actions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@unlink($sTmp);
|
@\unlink($sTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->DefaultResponse(__FUNCTION__, $bResult ? (
|
return $this->DefaultResponse(__FUNCTION__, $bResult ?
|
||||||
'plugin' !== $sType ? array('Reload' => true) : true
|
('plugin' !== $sType ? array('Reload' => true) : true) : false);
|
||||||
) : false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -8326,7 +8326,7 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
font-family: arial, sans-serif;
|
font-family: arial, sans-serif;
|
||||||
font-size: 13px;
|
font-size: 14px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
|
@ -8364,6 +8364,8 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
font-family: arial, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
rainloop/v/0.0.0/static/css/app.min.css
vendored
2
rainloop/v/0.0.0/static/css/app.min.css
vendored
File diff suppressed because one or more lines are too long
|
|
@ -6173,7 +6173,7 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
font-family: arial, sans-serif;
|
font-family: arial, sans-serif;
|
||||||
font-size: 13px;
|
font-size: 14px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
|
@ -6211,6 +6211,8 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
font-family: arial, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue