Small fixes

This commit is contained in:
RainLoop Team 2015-07-23 21:57:46 +04:00
parent fc10f20770
commit 3849fd02b4
9 changed files with 113 additions and 29 deletions

View file

@ -1521,7 +1521,7 @@
self.initVerticalLayoutResizer(Enums.ClientSideKeyName.FolderListSize); self.initVerticalLayoutResizer(Enums.ClientSideKeyName.FolderListSize);
}); });
if (Tinycon && !Settings.settingsGet('Filtered')) if (Tinycon && Settings.settingsGet('FaviconStatus') && !Settings.settingsGet('Filtered') )
{ {
Tinycon.setOptions({ Tinycon.setOptions({
fallback: false fallback: false

View file

@ -43,14 +43,16 @@ class TempFile
/** /**
* @param string $sHash * @param string $sHash
* @param string $sFileName
* *
* @return resource|bool * @return resource|bool
*/ */
public static function CreateStream($sHash) public static function CreateStream($sHash, &$sFileName = '')
{ {
self::Reg(); self::Reg();
return fopen(self::STREAM_NAME.'://'.$sHash, 'r+b'); $sFileName = self::STREAM_NAME.'://'.$sHash;
return fopen($sFileName, 'r+b');
} }
/** /**
@ -72,6 +74,7 @@ class TempFile
is_resource(self::$aStreams[$sHashName])) is_resource(self::$aStreams[$sHashName]))
{ {
$this->rSream = self::$aStreams[$sHashName]; $this->rSream = self::$aStreams[$sHashName];
\fseek($this->rSream, 0);
$bResult = true; $bResult = true;
} }
else else
@ -93,7 +96,7 @@ class TempFile
*/ */
public function stream_close() public function stream_close()
{ {
return -1 !== fseek($this->rSream, 0); return true;
} }
/** /**

View file

@ -2448,6 +2448,38 @@ END;
return ('' === $sUser ? '' : $sUser.'@').$sDomain; return ('' === $sUser ? '' : $sUser.'@').$sDomain;
} }
/**
* @param string $sHash
* @param string $sSalt
*
* @return int
*/
public static function HashToId($sHash, $sSalt = '')
{
$sData = $sHash ? @\MailSo\Base\Crypt::XxteaDecrypt(\hex2bin($sHash), \md5($sSalt)) : null;
$aMatch = array();
if ($sData && preg_match('/^id:(\d+)$/', $sData, $aMatch) && isset($aMatch[1]))
{
return is_numeric($aMatch[1]) ? (int) $aMatch[1] : null;
}
return null;
}
/**
* @param int $iID
* @param string $sSalt
*
* @return string
*/
public static function IdToHash($iID, $sSalt = '')
{
return is_int($iID) ?
\bin2hex(\MailSo\Base\Crypt::XxteaEncrypt('id:'.$iID, \md5($sSalt))) : null
;
}
/** /**
* @param string $sPassword * @param string $sPassword
* *

View file

@ -371,6 +371,33 @@ class Logger extends \MailSo\Base\Collection
return false; return false;
} }
/**
* @param \Exception $oException
* @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE
* @param string $sName = ''
* @param bool $bSearchSecretWords = true
* @param bool $bDiplayCrLf = false
*
* @return bool
*/
public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '',
$bSearchSecretWords = true, $bDiplayCrLf = false)
{
if ($oException instanceof \Exception)
{
if (isset($oException->__LOGINNED__))
{
return true;
}
$oException->__LOGINNED__ = true;
return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf);
}
return false;
}
/** /**
* @param mixed $mData * @param mixed $mData
* @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE

View file

@ -1353,13 +1353,13 @@ class GD extends PHPThumb
switch ($this->format) { switch ($this->format) {
case 'GIF': case 'GIF':
$isCompatible = $gdInfo['GIF Create Support']; $isCompatible = isset($gdInfo['GIF Create Support']);
break; break;
case 'JPG': case 'JPG':
$isCompatible = (isset($gdInfo['JPG Support']) || isset($gdInfo['JPEG Support'])) ? true : false; $isCompatible = (isset($gdInfo['JPG Support']) || isset($gdInfo['JPEG Support'])) ? true : false;
break; break;
case 'PNG': case 'PNG':
$isCompatible = $gdInfo[$this->format . ' Support']; $isCompatible = isset($gdInfo[$this->format . ' Support']);
break; break;
default: default:
$isCompatible = false; $isCompatible = false;
@ -1367,7 +1367,7 @@ class GD extends PHPThumb
if (!$isCompatible) { if (!$isCompatible) {
// one last check for "JPEG" instead // one last check for "JPEG" instead
$isCompatible = $gdInfo['JPEG Support']; $isCompatible = isset($gdInfo['JPEG Support']);
if (!$isCompatible) { if (!$isCompatible) {
throw new \Exception("Your GD installation does not support {$this->format} image types"); throw new \Exception("Your GD installation does not support {$this->format} image types");

View file

@ -560,7 +560,7 @@ class Actions
public function SetAuthLogoutToken() public function SetAuthLogoutToken()
{ {
@\header('X-RainLoop-Action: Logout'); @\header('X-RainLoop-Action: Logout');
\RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0, '/', null, null, true); \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0);
} }
/** /**
@ -575,7 +575,7 @@ class Actions
$sSpecAuthToken = '_'.$oAccount->GetAuthTokenQ(); $sSpecAuthToken = '_'.$oAccount->GetAuthTokenQ();
$this->SetSpecAuthToken($sSpecAuthToken); $this->SetSpecAuthToken($sSpecAuthToken);
\RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0, '/', null, null, true); \RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0);
if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken())) if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken()))
{ {
@ -584,7 +584,7 @@ class Actions
'e' => $oAccount->Email(), 'e' => $oAccount->Email(),
't' => $oAccount->SignMeToken() 't' => $oAccount->SignMeToken()
)), )),
\time() + 60 * 60 * 24 * 30, '/', null, null, true); \time() + 60 * 60 * 24 * 30);
$this->StorageProvider()->Put($oAccount, $this->StorageProvider()->Put($oAccount,
\RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG,
@ -632,7 +632,7 @@ class Actions
*/ */
private function setAdminAuthToken($sToken) private function setAdminAuthToken($sToken)
{ {
\RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0, '/', null, null, true); \RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0);
} }
/** /**
@ -1171,7 +1171,7 @@ class Actions
'Time' => \microtime(true), 'Time' => \microtime(true),
'MailTo' => 'MailTo', 'MailTo' => 'MailTo',
'To' => $sTo 'To' => $sTo
)), 0, '/', null, null, true); )), 0);
} }
} }
@ -1400,6 +1400,7 @@ class Actions
'MaterialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), 'MaterialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true),
'FolderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50), 'FolderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50),
'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')), 'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')),
'FaviconStatus' => (bool) $oConfig->Get('labs', 'favicon_status', true),
'Filtered' => '' !== \trim(\RainLoop\Api::Config()->Get('labs', 'imap_message_list_permanent_filter', '')), 'Filtered' => '' !== \trim(\RainLoop\Api::Config()->Get('labs', 'imap_message_list_permanent_filter', '')),
'Community' => true, 'Community' => true,
'PremType' => false, 'PremType' => false,
@ -2151,7 +2152,7 @@ class Actions
if ($bAdditionalCodeSignMe) if ($bAdditionalCodeSignMe)
{ {
\RainLoop\Utils::SetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, $sSecretHash, \RainLoop\Utils::SetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, $sSecretHash,
\time() + 60 * 60 * 24 * 14, '/', null, null, true); \time() + 60 * 60 * 24 * 14);
} }
if (!$bGood && !$this->TwoFactorAuthProvider()->VerifyCode($aData['Secret'], $sAdditionalCode)) if (!$bGood && !$this->TwoFactorAuthProvider()->VerifyCode($aData['Secret'], $sAdditionalCode))
@ -8324,21 +8325,28 @@ class Actions
$bDone = false; $bDone = false;
if ($bThumbnail && !$bDownload) if ($bThumbnail && !$bDownload)
{ {
\MailSo\Base\StreamWrappers\TempFile::Reg(); $sFileName = '';
$rTempResource = \MailSo\Base\StreamWrappers\TempFile::CreateStream(
\MailSo\Base\Utils::Md5Rand($sFileNameOut), $sFileName);
$sFileName = 'mailsotempfile://'.\MailSo\Base\Utils::Md5Rand($sFileNameOut);
$rTempResource = @\fopen($sFileName, 'r+b');
if (@\is_resource($rTempResource)) if (@\is_resource($rTempResource))
{ {
$bDone = true;
\MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource)); \MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource));
@\fclose($rTempResource); @\fclose($rTempResource);
$oThumb =@ new \PHPThumb\GD($sFileName); try
{
$oThumb = new \PHPThumb\GD($sFileName);
if ($oThumb) if ($oThumb)
{ {
$oThumb->adaptiveResize(60, 60)->show(); $oThumb->adaptiveResize(60, 60)->show();
$bDone = true; }
}
catch (\Exception $oException)
{
$self->Logger()->WriteExceptionShort($oException);
} }
} }
} }

View file

@ -108,6 +108,8 @@ class Api
$sSslCafile = \RainLoop\Api::Config()->Get('ssl', 'cafile', ''); $sSslCafile = \RainLoop\Api::Config()->Get('ssl', 'cafile', '');
$sSslCapath = \RainLoop\Api::Config()->Get('ssl', 'capath', ''); $sSslCapath = \RainLoop\Api::Config()->Get('ssl', 'capath', '');
\RainLoop\Utils::$CookieDefaultPath = \RainLoop\Api::Config()->Get('labs', 'cookie_path', '/');
if (!empty($sSslCafile) || !empty($sSslCapath)) if (!empty($sSslCafile) || !empty($sSslCapath))
{ {
\MailSo\Hooks::Add('Net.NetClient.StreamContextSettings/Filter', function (&$aStreamContextSettings) use ($sSslCafile, $sSslCapath) { \MailSo\Hooks::Add('Net.NetClient.StreamContextSettings/Filter', function (&$aStreamContextSettings) use ($sSslCafile, $sSslCapath) {

View file

@ -329,8 +329,9 @@ Enables caching in the system'),
'smtp_show_server_errors' => array(false), 'smtp_show_server_errors' => array(false),
'sieve_allow_raw_script' => array(false), 'sieve_allow_raw_script' => array(false),
'sieve_utf8_folder_name' => array(true), 'sieve_utf8_folder_name' => array(true),
'mail_func_clear_headers ' => array(true), 'mail_func_clear_headers' => array(true),
'mail_func_additional_parameters ' => array(false), 'mail_func_additional_parameters' => array(false),
'favicon_status' => array(true),
'folders_spec_limit' => array(50), 'folders_spec_limit' => array(50),
'owncloud_save_folder' => array('Attachments'), 'owncloud_save_folder' => array('Attachments'),
'curl_proxy' => array(''), 'curl_proxy' => array(''),
@ -347,6 +348,7 @@ Enables caching in the system'),
'fast_cache_memcache_port' => array(11211), 'fast_cache_memcache_port' => array(11211),
'fast_cache_memcache_expire' => array(43200), 'fast_cache_memcache_expire' => array(43200),
'use_local_proxy_for_external_images' => array(false), 'use_local_proxy_for_external_images' => array(false),
'cookie_path' => array('/'),
'startup_url' => array(''), 'startup_url' => array(''),
'emogrifier' => array(true), 'emogrifier' => array(true),
'dev_email' => array(''), 'dev_email' => array(''),

View file

@ -4,6 +4,11 @@ namespace RainLoop;
class Utils class Utils
{ {
/**
* @var string
*/
static $CookieDefaultPath = '/';
static $Cookies = null; static $Cookies = null;
static $RSA = null; static $RSA = null;
@ -299,7 +304,7 @@ class Utils
if (null === $sToken) if (null === $sToken)
{ {
$sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT);
\RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30, '/', null, null, true); \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30);
} }
return \md5('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); return \md5('Connection'.APP_SALT.$sToken.'Token'.APP_SALT);
@ -324,7 +329,7 @@ class Utils
if (null === $sToken) if (null === $sToken)
{ {
$sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT);
\RainLoop\Utils::SetCookie($sKey, $sToken, 0, '/', null, null, true); \RainLoop\Utils::SetCookie($sKey, $sToken, 0);
} }
return \md5('Session'.APP_SALT.$sToken.'Token'.APP_SALT); return \md5('Session'.APP_SALT.$sToken.'Token'.APP_SALT);
@ -340,7 +345,7 @@ class Utils
$sToken = \RainLoop\Utils::GetCookie($sKey, ''); $sToken = \RainLoop\Utils::GetCookie($sKey, '');
if (!empty($sToken)) if (!empty($sToken))
{ {
\RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30, '/', null, null, true); \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30);
} }
} }
@ -503,13 +508,18 @@ class Utils
return isset(\RainLoop\Utils::$Cookies[$sName]) ? \RainLoop\Utils::$Cookies[$sName] : $mDefault; return isset(\RainLoop\Utils::$Cookies[$sName]) ? \RainLoop\Utils::$Cookies[$sName] : $mDefault;
} }
public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = '/', $sDomain = '', $sSecure = false, $bHttpOnly = false) public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = null, $sDomain = null, $sSecure = null, $bHttpOnly = true)
{ {
if (null === \RainLoop\Utils::$Cookies) if (null === \RainLoop\Utils::$Cookies)
{ {
\RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array();
} }
if (null === $sPath)
{
$sPath = \RainLoop\Utils::$CookieDefaultPath;
}
\RainLoop\Utils::$Cookies[$sName] = $sValue; \RainLoop\Utils::$Cookies[$sName] = $sValue;
@\setcookie($sName, $sValue, $iExpire, $sPath, $sDomain, $sSecure, $bHttpOnly); @\setcookie($sName, $sValue, $iExpire, $sPath, $sDomain, $sSecure, $bHttpOnly);
} }
@ -522,7 +532,7 @@ class Utils
} }
unset(\RainLoop\Utils::$Cookies[$sName]); unset(\RainLoop\Utils::$Cookies[$sName]);
@\setcookie($sName, '', \time() - 3600 * 24 * 30, '/'); @\setcookie($sName, '', \time() - 3600 * 24 * 30);
} }
/** /**