mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-07 16:37:02 +03:00
Resolve #1499
This commit is contained in:
parent
ce63c36fb0
commit
0fd0d18154
4 changed files with 72 additions and 61 deletions
|
|
@ -126,7 +126,10 @@ export class AttachmentModel extends AbstractModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
get download() {
|
get download() {
|
||||||
return b64EncodeJSONSafe({
|
return b64EncodeJSONSafe(this.url ? {
|
||||||
|
fileName: this.fileName,
|
||||||
|
data: this.url.replace(/^.+,/, '')
|
||||||
|
} : {
|
||||||
folder: this.folder,
|
folder: this.folder,
|
||||||
uid: this.uid,
|
uid: this.uid,
|
||||||
mimeIndex: this.mimeIndex,
|
mimeIndex: this.mimeIndex,
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,7 @@ export class MailMessageView extends AbstractViewRight {
|
||||||
|
|
||||||
downloadAsZipAllowed: () => this.attachmentsActions.includes('zip')
|
downloadAsZipAllowed: () => this.attachmentsActions.includes('zip')
|
||||||
&& (currentMessage()?.attachments || [])
|
&& (currentMessage()?.attachments || [])
|
||||||
.filter(item => item?.download /*&& !item?.isLinked()*/ && item?.checked())
|
.filter(item => item?.checked() && item?.download /*&& !item?.isLinked()*/)
|
||||||
.length,
|
.length,
|
||||||
|
|
||||||
tagsAllowed: () => FolderUserStore.currentFolder()?.tagsAllowed(),
|
tagsAllowed: () => FolderUserStore.currentFolder()?.tagsAllowed(),
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,11 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
{
|
{
|
||||||
const
|
const
|
||||||
NAME = 'Nextcloud',
|
NAME = 'Nextcloud',
|
||||||
VERSION = '2.33',
|
VERSION = '2.34',
|
||||||
RELEASE = '2024-03-14',
|
RELEASE = '2024-03-16',
|
||||||
CATEGORY = 'Integrations',
|
CATEGORY = 'Integrations',
|
||||||
DESCRIPTION = 'Integrate with Nextcloud v20+',
|
DESCRIPTION = 'Integrate with Nextcloud v20+',
|
||||||
REQUIRED = '2.35.3';
|
REQUIRED = '2.35.4';
|
||||||
|
|
||||||
public function Init() : void
|
public function Init() : void
|
||||||
{
|
{
|
||||||
|
|
@ -170,10 +170,14 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
$oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder);
|
$oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder);
|
||||||
$data->result = true;
|
$data->result = true;
|
||||||
foreach ($data->items as $aItem) {
|
foreach ($data->items as $aItem) {
|
||||||
$sSavedFileName = isset($aItem['fileName']) ? $aItem['fileName'] : 'file.dat';
|
$sSavedFileName = empty($aItem['fileName']) ? 'file.dat' : $aItem['fileName'];
|
||||||
$sSavedFileHash = !empty($aItem['fileHash']) ? $aItem['fileHash'] : '';
|
if (!empty($aItem['data'])) {
|
||||||
if (!empty($sSavedFileHash)) {
|
$sSavedFileNameFull = static::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, $oFiles);
|
||||||
$fFile = $data->filesProvider->GetFile($data->account, $sSavedFileHash, 'rb');
|
if (!$oFiles->file_put_contents($sSavedFileNameFull, $aItem['data'])) {
|
||||||
|
$data->result = false;
|
||||||
|
}
|
||||||
|
} else if (!empty($aItem['fileHash'])) {
|
||||||
|
$fFile = $data->filesProvider->GetFile($data->account, $aItem['fileHash'], 'rb');
|
||||||
if (\is_resource($fFile)) {
|
if (\is_resource($fFile)) {
|
||||||
$sSavedFileNameFull = static::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, $oFiles);
|
$sSavedFileNameFull = static::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, $oFiles);
|
||||||
if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) {
|
if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) {
|
||||||
|
|
@ -186,13 +190,6 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($data->items as $aItem) {
|
|
||||||
$sFileHash = (string) (isset($aItem['fileHash']) ? $aItem['fileHash'] : '');
|
|
||||||
if (!empty($sFileHash)) {
|
|
||||||
$data->filesProvider->Clear($data->account, $sFileHash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ trait Attachments
|
||||||
if (\is_array($aHashes) && \count($aHashes)) {
|
if (\is_array($aHashes) && \count($aHashes)) {
|
||||||
foreach ($aHashes as $sZipHash) {
|
foreach ($aHashes as $sZipHash) {
|
||||||
$aResult = $this->getMimeFileByHash($oAccount, $sZipHash);
|
$aResult = $this->getMimeFileByHash($oAccount, $sZipHash);
|
||||||
if (empty($aResult['fileHash'])) {
|
if (empty($aResult['data']) && empty($aResult['fileHash'])) {
|
||||||
$bError = true;
|
$bError = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -60,10 +60,16 @@ trait Attachments
|
||||||
$oZip->open($sZipFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE);
|
$oZip->open($sZipFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE);
|
||||||
$oZip->setArchiveComment('SnappyMail/'.APP_VERSION);
|
$oZip->setArchiveComment('SnappyMail/'.APP_VERSION);
|
||||||
foreach ($aData as $aItem) {
|
foreach ($aData as $aItem) {
|
||||||
$sFullFileNameHash = $oFilesProvider->GetFileName($oAccount, $aItem['fileHash']);
|
|
||||||
$sFileName = ($mUIDs ? "{$aItem['uid']}/" : ($sFolder ? "{$aItem['uid']}-" : '')) . $aItem['fileName'];
|
$sFileName = ($mUIDs ? "{$aItem['uid']}/" : ($sFolder ? "{$aItem['uid']}-" : '')) . $aItem['fileName'];
|
||||||
if (!$oZip->addFile($sFullFileNameHash, $sFileName)) {
|
if ($aItem['data']) {
|
||||||
$bError = true;
|
if (!$oZip->addFromString($sFileName, $aItem['data'])) {
|
||||||
|
$bError = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$sFullFileNameHash = $oFilesProvider->GetFileName($oAccount, $aItem['fileHash']);
|
||||||
|
if (!$oZip->addFile($sFullFileNameHash, $sFileName)) {
|
||||||
|
$bError = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,20 +98,22 @@ trait Attachments
|
||||||
$oZip = new \PharData($sZipFileName . '.zip', 0, null, \Phar::ZIP);
|
$oZip = new \PharData($sZipFileName . '.zip', 0, null, \Phar::ZIP);
|
||||||
$oZip->compressFiles(\Phar::GZ);
|
$oZip->compressFiles(\Phar::GZ);
|
||||||
foreach ($aData as $aItem) {
|
foreach ($aData as $aItem) {
|
||||||
$oZip->addFile(
|
if ($aItem['data']) {
|
||||||
$oFilesProvider->GetFileName($oAccount, $aItem['fileHash']),
|
if (!$oZip->addFromString($sFileName, \MailSo\Base\Utils::UrlSafeBase64Decode($aItem['data']))) {
|
||||||
($mUIDs ? "{$aItem['uid']}/" : ($sFolder ? "{$aItem['uid']}-" : '')) . $aItem['fileName']
|
$bError = true;
|
||||||
);
|
}
|
||||||
|
} else {
|
||||||
|
$oZip->addFile(
|
||||||
|
$oFilesProvider->GetFileName($oAccount, $aItem['fileHash']),
|
||||||
|
($mUIDs ? "{$aItem['uid']}/" : ($sFolder ? "{$aItem['uid']}-" : '')) . $aItem['fileName']
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$oZip->compressFiles(\Phar::GZ);
|
$oZip->compressFiles(\Phar::GZ);
|
||||||
unset($oZip);
|
unset($oZip);
|
||||||
\rename($sZipFileName . '.zip', $sZipFileName);
|
\rename($sZipFileName . '.zip', $sZipFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($aData as $aItem) {
|
|
||||||
$oFilesProvider->Clear($oAccount, $aItem['fileHash']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$bError) {
|
if (!$bError) {
|
||||||
$mResult = array(
|
$mResult = array(
|
||||||
'fileHash' => $this->encodeRawKey(array(
|
'fileHash' => $this->encodeRawKey(array(
|
||||||
|
|
@ -129,46 +137,49 @@ trait Attachments
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($aData as $aItem) {
|
||||||
|
$aItem['fileHash'] && $oFilesProvider->Clear($oAccount, $aItem['fileHash']);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->DefaultResponse($bError ? false : $mResult);
|
return $this->DefaultResponse($bError ? false : $mResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getMimeFileByHash(\RainLoop\Model\Account $oAccount, string $sHash) : array
|
private function getMimeFileByHash(\RainLoop\Model\Account $oAccount, string $sHash) : array
|
||||||
{
|
{
|
||||||
$aValues = $this->decodeRawKey($sHash);
|
$aValues = $this->decodeRawKey($sHash);
|
||||||
|
$aValues['fileName'] = empty($aValues['fileName']) ? 'file.dat' : (string) $aValues['fileName'];
|
||||||
$sFolder = isset($aValues['folder']) ? (string) $aValues['folder'] : '';
|
$aValues['fileHash'] = null;
|
||||||
$iUid = isset($aValues['uid']) ? (int) $aValues['uid'] : 0;
|
if (isset($aValues['data'])) {
|
||||||
$sMimeIndex = isset($aValues['mimeIndex']) ? (string) $aValues['mimeIndex'] : '';
|
$aValues['data'] = \MailSo\Base\Utils::UrlSafeBase64Decode($aValues['data']);
|
||||||
|
} else {
|
||||||
$sContentTypeIn = isset($aValues['mimeType']) ? (string) $aValues['mimeType'] : '';
|
$sFolder = isset($aValues['folder']) ? (string) $aValues['folder'] : '';
|
||||||
$sFileNameIn = isset($aValues['fileName']) ? (string) $aValues['fileName'] : 'file.dat';
|
$iUid = isset($aValues['uid']) ? (int) $aValues['uid'] : 0;
|
||||||
|
$sMimeIndex = isset($aValues['mimeIndex']) ? (string) $aValues['mimeIndex'] : '';
|
||||||
$oFileProvider = $this->FilesProvider();
|
if ($sFolder && $iUid && $sMimeIndex) {
|
||||||
|
$oFileProvider = $this->FilesProvider();
|
||||||
$sResultHash = '';
|
$mResult = $this->MailClient()->MessageMimeStream(
|
||||||
|
function ($rResource, $sContentType, $sFileName, $sMimeIndex = '')
|
||||||
$mResult = $this->MailClient()->MessageMimeStream(function ($rResource, $sContentType, $sFileName, $sMimeIndex = '')
|
use ($oAccount, $oFileProvider, &$aValues) {
|
||||||
use ($oAccount, $oFileProvider, $sFileNameIn, $sContentTypeIn, &$sResultHash) {
|
unset($sContentType, $sFileName, $sMimeIndex);
|
||||||
|
if (\is_resource($rResource)) {
|
||||||
unset($sContentType, $sFileName, $sMimeIndex);
|
$sContentTypeIn = isset($aValues['mimeType']) ? (string) $aValues['mimeType'] : '';
|
||||||
|
$sHash = \MailSo\Base\Utils::Sha1Rand($aValues['fileName'].'~'.$sContentTypeIn);
|
||||||
if (\is_resource($rResource)) {
|
$rTempResource = $oFileProvider->GetFile($oAccount, $sHash, 'wb+');
|
||||||
$sHash = \MailSo\Base\Utils::Sha1Rand($sFileNameIn.'~'.$sContentTypeIn);
|
if (\is_resource($rTempResource)) {
|
||||||
$rTempResource = $oFileProvider->GetFile($oAccount, $sHash, 'wb+');
|
if (-1 < \MailSo\Base\Utils::WriteStream($rResource, $rTempResource)) {
|
||||||
|
$sResultHash = $sHash;
|
||||||
if (\is_resource($rTempResource)) {
|
$aValues['fileHash'] = $sHash;
|
||||||
if (-1 < \MailSo\Base\Utils::WriteStream($rResource, $rTempResource)) {
|
}
|
||||||
$sResultHash = $sHash;
|
\fclose($rTempResource);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
\fclose($rTempResource);
|
$sFolder,
|
||||||
}
|
$iUid,
|
||||||
}
|
$sMimeIndex
|
||||||
|
);
|
||||||
}, $sFolder, $iUid, $sMimeIndex);
|
}
|
||||||
|
}
|
||||||
$aValues['fileName'] = $sFileNameIn;
|
|
||||||
$aValues['fileHash'] = $mResult ? $sResultHash : '';
|
|
||||||
|
|
||||||
return $aValues;
|
return $aValues;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue