diff options
author | George Hazan <george.hazan@gmail.com> | 2023-07-27 11:44:08 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2023-07-27 11:44:08 +0300 |
commit | 18249f6a5acc26c75005526c6dfebcf112b7141d (patch) | |
tree | 9f213149887e237e24cf5d85aacae861544d7c81 /src | |
parent | 73c31a3f9ac9f323d6a17a910fb6a8a32416c7bb (diff) |
fixes #3584 (Оффлайновые файлы: не открывать скачанный файл автоматически)
Diffstat (limited to 'src')
-rw-r--r-- | src/mir_app/src/file.h | 4 | ||||
-rw-r--r-- | src/mir_app/src/fileutils.cpp | 6 | ||||
-rw-r--r-- | src/mir_app/src/srmm_util.cpp | 7 | ||||
-rw-r--r-- | src/mir_core/src/Windows/fileutil.cpp | 19 | ||||
-rw-r--r-- | src/mir_core/src/mir_core.def | 2 | ||||
-rw-r--r-- | src/mir_core/src/mir_core64.def | 2 |
6 files changed, 35 insertions, 5 deletions
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
|