This commit is contained in:
the-djmaze 2024-03-16 00:36:58 +01:00
parent ce63c36fb0
commit 0fd0d18154
4 changed files with 72 additions and 61 deletions

View file

@ -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,

View file

@ -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(),

View file

@ -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);
}
}
} }
} }

View file

@ -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;
} }