From 22fb10cc778884cd1b80ba6231c2ade7cb9ec03c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 1 Dec 2023 18:31:36 +0300 Subject: =?UTF-8?q?fixes=20#4005=20(ICQ=20+=20Newstory:=20=D0=A1=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D1=8B=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D1=8F=20=D1=81=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D1=84=D1=84=D0=BB=D0=B0=D0=B9=D0=BD=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocols/ICQ-WIM/src/menus.cpp | 2 +- protocols/ICQ-WIM/src/proto.cpp | 32 ++++++++++++++++++-------------- protocols/ICQ-WIM/src/server.cpp | 5 ++--- protocols/ICQ-WIM/src/stdafx.h | 2 +- protocols/ICQ-WIM/src/utils.cpp | 16 ++++++++++++++-- 5 files changed, 36 insertions(+), 21 deletions(-) (limited to 'protocols') diff --git a/protocols/ICQ-WIM/src/menus.cpp b/protocols/ICQ-WIM/src/menus.cpp index 58a118bf36..ddfa5f0745 100644 --- a/protocols/ICQ-WIM/src/menus.cpp +++ b/protocols/ICQ-WIM/src/menus.cpp @@ -75,6 +75,6 @@ int CIcqProto::OnPrebuildMenu(WPARAM, LPARAM lParam) { auto *dbei = (DB::EventInfo *)lParam; ptrW wszText(DbEvent_GetTextW(dbei, CP_UTF8)); - Menu_ShowItem(hmiConvert, 0 == mir_wstrncmp(wszText, L"https://files.icq.net/get/", 26)); + Menu_ShowItem(hmiConvert, fileText2url(wszText.get())); return 0; } diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp index cf5c5763e0..915dbd0832 100644 --- a/protocols/ICQ-WIM/src/proto.cpp +++ b/protocols/ICQ-WIM/src/proto.cpp @@ -237,21 +237,25 @@ void __cdecl CIcqProto::OfflineFileThread(void *pParam) DB::EventInfo dbei(ofd->hDbEvent); if (m_bOnline && dbei && !strcmp(dbei.szModule, m_szModuleName) && dbei.eventType == EVENTTYPE_FILE) { DB::FILE_BLOB blob(dbei); - MCONTACT hContact = db_event_getContact(ofd->hDbEvent); - if (auto *pFileInfo = RetrieveFileInfo(hContact, fileText2url(blob.getUrl()))) { - if (!ofd->bCopy) { - auto *pReq = new AsyncHttpRequest(CONN_NONE, REQUEST_GET, pFileInfo->szUrl, &CIcqProto::OnFileRecv); - pReq->pUserInfo = ofd; - pReq->AddHeader("Sec-Fetch-User", "?1"); - pReq->AddHeader("Sec-Fetch-Site", "cross-site"); - pReq->AddHeader("Sec-Fetch-Mode", "navigate"); - Push(pReq); - return; // ofd is used inside CIcqProto::OnFileRecv, don't remove it - } - ofd->wszPath.Empty(); - ofd->wszPath.Append(_A2T(pFileInfo->szUrl)); - ofd->pCallback->Invoke(*ofd); + CMStringW wszUrl; + if (fileText2url(blob.getUrl(), &wszUrl)) { + MCONTACT hContact = db_event_getContact(ofd->hDbEvent); + if (auto *pFileInfo = RetrieveFileInfo(hContact, wszUrl)) { + if (!ofd->bCopy) { + auto *pReq = new AsyncHttpRequest(CONN_NONE, REQUEST_GET, pFileInfo->szUrl, &CIcqProto::OnFileRecv); + pReq->pUserInfo = ofd; + pReq->AddHeader("Sec-Fetch-User", "?1"); + pReq->AddHeader("Sec-Fetch-Site", "cross-site"); + pReq->AddHeader("Sec-Fetch-Mode", "navigate"); + Push(pReq); + return; // ofd is used inside CIcqProto::OnFileRecv, don't remove it + } + + ofd->wszPath.Empty(); + ofd->wszPath.Append(_A2T(pFileInfo->szUrl)); + ofd->pCallback->Invoke(*ofd); + } } } diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp index a03dfaddf0..aa5f696004 100644 --- a/protocols/ICQ-WIM/src/server.cpp +++ b/protocols/ICQ-WIM/src/server.cpp @@ -183,7 +183,8 @@ IcqFileInfo *CIcqProto::RetrieveFileInfo(MCONTACT hContact, const CMStringW &wsz bool CIcqProto::CheckFile(MCONTACT hContact, CMStringW &wszText, IcqFileInfo *&pFileInfo) { - if (wszText.Left(26) != L"https://files.icq.net/get/") + CMStringW wszUrl; + if (!fileText2url(wszText, &wszUrl)) return false; pFileInfo = nullptr; @@ -192,8 +193,6 @@ bool CIcqProto::CheckFile(MCONTACT hContact, CMStringW &wszText, IcqFileInfo *&p if (idx != -1) wszText.Truncate(idx); - CMStringW wszUrl(fileText2url(wszText)); - // is it already downloaded sticker? CMStringW wszLoadedPath(FORMAT, L"%s\\%S\\Stickers\\STK{%s}.png", VARSW(L"%miranda_avatarcache%").get(), m_szModuleName, wszUrl.c_str()); if (!_waccess(wszLoadedPath, 0)) { diff --git a/protocols/ICQ-WIM/src/stdafx.h b/protocols/ICQ-WIM/src/stdafx.h index b27b08bece..e7cc7ff3e9 100644 --- a/protocols/ICQ-WIM/src/stdafx.h +++ b/protocols/ICQ-WIM/src/stdafx.h @@ -108,6 +108,6 @@ void RefreshGroups(void); wchar_t* time2text(time_t time); wchar_t* time2text(DBVARIANT *dbv); -CMStringW fileText2url(const CMStringW &wszText); +bool fileText2url(const CMStringW &wszText, CMStringW *res = nullptr); extern bool g_bSecureIM, g_bMessageState; diff --git a/protocols/ICQ-WIM/src/utils.cpp b/protocols/ICQ-WIM/src/utils.cpp index b6712ce8c9..e0c39c27a6 100644 --- a/protocols/ICQ-WIM/src/utils.cpp +++ b/protocols/ICQ-WIM/src/utils.cpp @@ -261,9 +261,21 @@ void CIcqProto::setId(MCONTACT hContact, const char *szSetting, __int64 iValue) ///////////////////////////////////////////////////////////////////////////////////////// -CMStringW fileText2url(const CMStringW &wszText) +bool fileText2url(const CMStringW &wszText, CMStringW *res) { - return wszText.Mid(26); + if (!mir_wstrncmp(wszText, L"https://files.icq.net/get/", 26)) { + if (res) + *res = wszText.Mid(26); + return true; + } + + if (!mir_wstrncmp(wszText, L"http://files.icq.net/get/", 25)) { + if (res) + *res = wszText.Mid(25); + return true; + } + + return false; } ///////////////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3