From 18249f6a5acc26c75005526c6dfebcf112b7141d Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 27 Jul 2023 11:44:08 +0300 Subject: =?UTF-8?q?fixes=20#3584=20(=D0=9E=D1=84=D1=84=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= =?UTF-8?q?:=20=D0=BD=D0=B5=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=BA=D0=B0=D1=87=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/m_protosvc.h | 3 ++- include/m_utils.h | 4 ++++ libs/win32/mir_core.lib | Bin 492938 -> 493690 bytes libs/win64/mir_core.lib | Bin 498166 -> 498930 bytes src/mir_app/src/file.h | 4 ++-- src/mir_app/src/fileutils.cpp | 6 +++--- src/mir_app/src/srmm_util.cpp | 7 +++++++ src/mir_core/src/Windows/fileutil.cpp | 19 +++++++++++++++++++ src/mir_core/src/mir_core.def | 2 ++ src/mir_core/src/mir_core64.def | 2 ++ 10 files changed, 41 insertions(+), 6 deletions(-) diff --git a/include/m_protosvc.h b/include/m_protosvc.h index 5941bbe213..80cc51026d 100644 --- a/include/m_protosvc.h +++ b/include/m_protosvc.h @@ -32,6 +32,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define M_PROTOSVC_H__ 1 #include "m_protocols.h" +#include "m_utils.h" ///////////////////////////////////////////////////////////////////////////////////////// // WARNING: @@ -811,7 +812,7 @@ struct MIR_APP_EXPORT OFDTHREAD : public MNonCopyable void ResetFileName(const wchar_t *pwszNewName); MEVENT hDbEvent; - CMStringW wszPath; + MFilePath wszPath; bool bOpen; }; diff --git a/include/m_utils.h b/include/m_utils.h index 2ea38f07b4..1050964d93 100644 --- a/include/m_utils.h +++ b/include/m_utils.h @@ -305,7 +305,11 @@ public: MFilePath(): CMStringW() {} MFilePath(const wchar_t *init) : CMStringW(init) {} + CMStringW getExtension() const; + + bool isExecutable() const; bool isExist() const; + bool move(const wchar_t *pwszDest); MFileIterator search(); diff --git a/libs/win32/mir_core.lib b/libs/win32/mir_core.lib index 1f4814a4a4..71763dc161 100644 Binary files a/libs/win32/mir_core.lib and b/libs/win32/mir_core.lib differ diff --git a/libs/win64/mir_core.lib b/libs/win64/mir_core.lib index 610b93d615..13533c8cde 100644 Binary files a/libs/win64/mir_core.lib and b/libs/win64/mir_core.lib differ diff --git a/src/mir_app/src/file.h b/src/mir_app/src/file.h index 6689b3ceac..0a29ec5d85 100644 --- a/src/mir_app/src/file.h +++ b/src/mir_app/src/file.h @@ -136,8 +136,8 @@ void UpdateProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANS wchar_t *PFTS_StringToTchar(int flags, const MAllStrings s); int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS *ft, const MAllStrings s, wchar_t *r); -CMStringW CreateUniqueFileName(const wchar_t *pszOriginalFile); -CMStringW FindUniqueFileName(const wchar_t *pszOriginalFile); +MFilePath CreateUniqueFileName(const wchar_t *pszOriginalFile); +MFilePath FindUniqueFileName(const wchar_t *pszOriginalFile); int GetRegValue(HKEY hKeyBase, const wchar_t *szSubKey, const wchar_t *szValue, wchar_t *szOutput, int cbOutput); void GetSensiblyFormattedSize(__int64 size, wchar_t *szOut, int cchOut, int unitsOverride, int appendUnits, int *unitsUsed); diff --git a/src/mir_app/src/fileutils.cpp b/src/mir_app/src/fileutils.cpp index c395710270..642571009b 100644 --- a/src/mir_app/src/fileutils.cpp +++ b/src/mir_app/src/fileutils.cpp @@ -150,7 +150,7 @@ void FreeProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *fts) ///////////////////////////////////////////////////////////////////////////////////////// -CMStringW CreateUniqueFileName(const wchar_t *pszOriginalFile) +MFilePath CreateUniqueFileName(const wchar_t *pszOriginalFile) { const wchar_t *pszExtension, *pszFilename; if ((pszFilename = wcsrchr(pszOriginalFile, '\\')) == nullptr) @@ -158,7 +158,7 @@ CMStringW CreateUniqueFileName(const wchar_t *pszOriginalFile) if ((pszExtension = wcsrchr(pszFilename + 1, '.')) == nullptr) pszExtension = pszFilename + mir_wstrlen(pszFilename); - CMStringW buf; + MFilePath buf; for (int i = 1;; i++) { buf.Format(L"%.*s (%d)%s", unsigned(pszExtension - pszOriginalFile), pszOriginalFile, i, pszExtension); if (_waccess(buf, 0) != 0) @@ -167,7 +167,7 @@ CMStringW CreateUniqueFileName(const wchar_t *pszOriginalFile) return buf; } -CMStringW FindUniqueFileName(const wchar_t *pszOriginalFile) +MFilePath FindUniqueFileName(const wchar_t *pszOriginalFile) { if (_waccess(pszOriginalFile, 0)) return pszOriginalFile; diff --git a/src/mir_app/src/srmm_util.cpp b/src/mir_app/src/srmm_util.cpp index ccb562226e..33ca91f902 100644 --- a/src/mir_app/src/srmm_util.cpp +++ b/src/mir_app/src/srmm_util.cpp @@ -120,6 +120,13 @@ void OFDTHREAD::Finish() dbv.pwszVal = wszPath.GetBuffer(); db_event_setJson(hDbEvent, "lf", &dbv); + // if the file is executable, protect it from automatic opening + if (wszPath.isExecutable()) + if (FILE *out = _wfopen(wszPath + L":Zone.Identifier", L"wt")) { + fputs("[ZoneTransfer]\r\nZoneId = 3\r\n", out); + fclose(out); + } + NotifyEventHooks(g_hevEventEdited, db_event_getContact(hDbEvent), hDbEvent); if (bOpen) diff --git a/src/mir_core/src/Windows/fileutil.cpp b/src/mir_core/src/Windows/fileutil.cpp index a7494bc8b7..9bf0baced6 100644 --- a/src/mir_core/src/Windows/fileutil.cpp +++ b/src/mir_core/src/Windows/fileutil.cpp @@ -62,6 +62,25 @@ bool MFilePath::MFileIterator::isDir() const ///////////////////////////////////////////////////////////////////////////////////////// +CMStringW MFilePath::getExtension() const +{ + int idx = ReverseFind('.'); + return (idx == -1) ? L"" : Right(GetLength() - idx - 1); +} + +bool MFilePath::isExecutable() const +{ + CMStringW wszExt = getExtension(), wszEnv; + wszExt.MakeUpper(); + wszEnv.GetEnvironmentVariableW(L"PATHEXT"); + + for (auto *p = wcstok(wszEnv.GetBuffer(), L";"); p; p = wcstok(0, L";")) + if (wszExt == p + 1) + return true; + + return false; +} + bool MFilePath::isExist() const { return _waccess(c_str(), 0) == 0; diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def index af4fbd0c30..ca83dabb82 100644 --- a/src/mir_core/src/mir_core.def +++ b/src/mir_core/src/mir_core.def @@ -1558,3 +1558,5 @@ db_event_updateId @1772 ??_7MShareable@@6B@ @1779 NONAME ?Acquire@MShareable@@QAEXXZ @1780 NONAME ?Release@MShareable@@QAEXXZ @1781 NONAME +?getExtension@MFilePath@@QBE?AV?$CMStringT@_WV?$ChTraitsCRT@_W@@@@XZ @1782 NONAME +?isExecutable@MFilePath@@QBE_NXZ @1783 NONAME diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def index c071152ab3..da3b919a84 100644 --- a/src/mir_core/src/mir_core64.def +++ b/src/mir_core/src/mir_core64.def @@ -1558,3 +1558,5 @@ db_event_updateId @1772 ??_7MShareable@@6B@ @1779 NONAME ?Acquire@MShareable@@QEAAXXZ @1780 NONAME ?Release@MShareable@@QEAAXXZ @1781 NONAME +?getExtension@MFilePath@@QEBA?AV?$CMStringT@_WV?$ChTraitsCRT@_W@@@@XZ @1782 NONAME +?isExecutable@MFilePath@@QEBA_NXZ @1783 NONAME -- cgit v1.2.3