mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-02 17:10:37 +08:00
SPE-2567: Deleting cookies with counter
Timer to prevent fail in asynchronous deletion
This commit is contained in:
parent
bd19f11919
commit
3c377a435e
@ -693,19 +693,28 @@ LoginWebViewDialog::LoginWebViewDialog(wxWindow *parent, std::string &ret_val, c
|
|||||||
, m_ret_val(ret_val)
|
, m_ret_val(ret_val)
|
||||||
, p_evt_handler(evt_handler)
|
, p_evt_handler(evt_handler)
|
||||||
{
|
{
|
||||||
|
m_force_quit_timer.SetOwner(this, 0);
|
||||||
|
Bind(wxEVT_TIMER, [this](wxTimerEvent &evt)
|
||||||
|
{
|
||||||
|
m_force_quit = true;
|
||||||
|
});
|
||||||
Centre();
|
Centre();
|
||||||
}
|
}
|
||||||
void LoginWebViewDialog::on_navigation_request(wxWebViewEvent &evt)
|
void LoginWebViewDialog::on_navigation_request(wxWebViewEvent &evt)
|
||||||
{
|
{
|
||||||
wxString url = evt.GetURL();
|
wxString url = evt.GetURL();
|
||||||
if (url.starts_with(L"prusaslicer")) {
|
if (url.starts_with(L"prusaslicer")) {
|
||||||
delete_cookies(m_browser, Utils::ServiceConfig::instance().account_url());
|
m_waiting_for_counters = true;
|
||||||
delete_cookies(m_browser, "https://accounts.google.com");
|
m_atomic_counter = 0;
|
||||||
delete_cookies(m_browser, "https://appleid.apple.com");
|
m_counter_to_match = 4;
|
||||||
delete_cookies(m_browser, "https://facebook.com");
|
delete_cookies_with_counter(m_browser, Utils::ServiceConfig::instance().account_url(), m_atomic_counter);
|
||||||
|
delete_cookies_with_counter(m_browser, "https://accounts.google.com", m_atomic_counter);
|
||||||
|
delete_cookies_with_counter(m_browser, "https://appleid.apple.com", m_atomic_counter);
|
||||||
|
delete_cookies_with_counter(m_browser, "https://facebook.com", m_atomic_counter);
|
||||||
evt.Veto();
|
evt.Veto();
|
||||||
m_ret_val = into_u8(url);
|
m_ret_val = into_u8(url);
|
||||||
EndModal(wxID_OK);
|
m_force_quit_timer.Start(2000, wxTIMER_ONE_SHOT);
|
||||||
|
// End modal is moved to on_idle
|
||||||
} else if (url.Find(L"accounts.google.com") != wxNOT_FOUND
|
} else if (url.Find(L"accounts.google.com") != wxNOT_FOUND
|
||||||
|| url.Find(L"appleid.apple.com") != wxNOT_FOUND
|
|| url.Find(L"appleid.apple.com") != wxNOT_FOUND
|
||||||
|| url.Find(L"facebook.com") != wxNOT_FOUND) {
|
|| url.Find(L"facebook.com") != wxNOT_FOUND) {
|
||||||
@ -726,5 +735,36 @@ void LoginWebViewDialog::on_dpi_changed(const wxRect &suggested_rect)
|
|||||||
Fit();
|
Fit();
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoginWebViewDialog::on_idle(wxIdleEvent& WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
if (!m_browser)
|
||||||
|
return;
|
||||||
|
if (m_browser->IsBusy()) {
|
||||||
|
if constexpr (!is_linux) {
|
||||||
|
wxSetCursor(wxCURSOR_ARROWWAIT);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if constexpr (!is_linux) {
|
||||||
|
wxSetCursor(wxNullCursor);
|
||||||
|
}
|
||||||
|
if (m_load_error_page) {
|
||||||
|
m_load_error_page = false;
|
||||||
|
m_browser->LoadURL(GUI::format_wxstr("file://%1%/web/error_no_reload.html", boost::filesystem::path(resources_dir()).generic_string()));
|
||||||
|
}
|
||||||
|
if (m_waiting_for_counters && m_atomic_counter == m_counter_to_match)
|
||||||
|
{
|
||||||
|
EndModal(wxID_OK);
|
||||||
|
}
|
||||||
|
if (m_force_quit)
|
||||||
|
{
|
||||||
|
EndModal(wxID_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_URL_PANEL
|
||||||
|
m_button_stop->Enable(m_browser->IsBusy());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // GUI
|
} // GUI
|
||||||
} // Slic3r
|
} // Slic3r
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
#include <wx/infobar.h>
|
#include <wx/infobar.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
class wxWebView;
|
class wxWebView;
|
||||||
class wxWebViewEvent;
|
class wxWebViewEvent;
|
||||||
|
|
||||||
@ -30,7 +32,7 @@ public:
|
|||||||
virtual void on_show(wxShowEvent& evt) {};
|
virtual void on_show(wxShowEvent& evt) {};
|
||||||
virtual void on_script_message(wxWebViewEvent& evt);
|
virtual void on_script_message(wxWebViewEvent& evt);
|
||||||
|
|
||||||
void on_idle(wxIdleEvent& evt);
|
virtual void on_idle(wxIdleEvent& evt);
|
||||||
void on_url(wxCommandEvent& evt);
|
void on_url(wxCommandEvent& evt);
|
||||||
void on_back_button(wxCommandEvent& evt);
|
void on_back_button(wxCommandEvent& evt);
|
||||||
void on_forward_button(wxCommandEvent& evt);
|
void on_forward_button(wxCommandEvent& evt);
|
||||||
@ -124,7 +126,7 @@ protected:
|
|||||||
void on_reload_event(const std::string& message_data) override;
|
void on_reload_event(const std::string& message_data) override;
|
||||||
void run_script_bridge(const wxString &script) override { run_script(script); }
|
void run_script_bridge(const wxString &script) override { run_script(script); }
|
||||||
void on_connect_action_close_dialog(const std::string& message_data) override;
|
void on_connect_action_close_dialog(const std::string& message_data) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class LoginWebViewDialog : public WebViewDialog
|
class LoginWebViewDialog : public WebViewDialog
|
||||||
{
|
{
|
||||||
@ -132,10 +134,17 @@ public:
|
|||||||
LoginWebViewDialog(wxWindow *parent, std::string &ret_val, const wxString& url, wxEvtHandler* evt_handler);
|
LoginWebViewDialog(wxWindow *parent, std::string &ret_val, const wxString& url, wxEvtHandler* evt_handler);
|
||||||
void on_navigation_request(wxWebViewEvent &evt) override;
|
void on_navigation_request(wxWebViewEvent &evt) override;
|
||||||
void on_dpi_changed(const wxRect &suggested_rect) override;
|
void on_dpi_changed(const wxRect &suggested_rect) override;
|
||||||
|
void on_idle(wxIdleEvent& evt) override;
|
||||||
private:
|
private:
|
||||||
std::string& m_ret_val;
|
std::string& m_ret_val;
|
||||||
wxEvtHandler* p_evt_handler;
|
wxEvtHandler* p_evt_handler;
|
||||||
bool m_evt_sent{ false };
|
bool m_evt_sent{ false };
|
||||||
|
|
||||||
|
bool m_waiting_for_counters {false};
|
||||||
|
std::atomic<size_t> m_atomic_counter;
|
||||||
|
size_t m_counter_to_match;
|
||||||
|
wxTimer m_force_quit_timer;
|
||||||
|
bool m_force_quit{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // GUI
|
} // GUI
|
||||||
|
@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
#include <wx/webview.h>
|
#include <wx/webview.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <atomic>
|
||||||
namespace Slic3r::GUI {
|
namespace Slic3r::GUI {
|
||||||
void setup_webview_with_credentials(wxWebView* web_view, const std::string& username, const std::string& password);
|
void setup_webview_with_credentials(wxWebView* web_view, const std::string& username, const std::string& password);
|
||||||
void remove_webview_credentials(wxWebView* web_view);
|
void remove_webview_credentials(wxWebView* web_view);
|
||||||
void delete_cookies(wxWebView* web_view, const std::string& url);
|
void delete_cookies(wxWebView* web_view, const std::string& url);
|
||||||
|
void delete_cookies_with_counter(wxWebView* web_view, const std::string& url, std::atomic<size_t>& counter);
|
||||||
void add_request_authorization(wxWebView* web_view, const wxString& address, const std::string& token);
|
void add_request_authorization(wxWebView* web_view, const wxString& address, const std::string& token);
|
||||||
void remove_request_authorization(wxWebView* web_view);
|
void remove_request_authorization(wxWebView* web_view);
|
||||||
void load_request(wxWebView* web_view, const std::string& address, const std::string& token);
|
void load_request(wxWebView* web_view, const std::string& address, const std::string& token);
|
||||||
|
@ -109,6 +109,12 @@ void delete_cookies(wxWebView* web_view, const std::string& url)
|
|||||||
webkit_cookie_manager_get_cookies(cookieManager, uri, nullptr, (GAsyncReadyCallback)Slic3r::GUI::get_cookie_callback, nullptr);
|
webkit_cookie_manager_get_cookies(cookieManager, uri, nullptr, (GAsyncReadyCallback)Slic3r::GUI::get_cookie_callback, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void delete_cookies_with_counter(wxWebView* web_view, const std::string& url, std::atomic<size_t>& counter)
|
||||||
|
{
|
||||||
|
delete_cookies(web_view, url);
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
void add_request_authorization(wxWebView* web_view, const wxString& address, const std::string& token)
|
void add_request_authorization(wxWebView* web_view, const wxString& address, const std::string& token)
|
||||||
{
|
{
|
||||||
// unused on Linux
|
// unused on Linux
|
||||||
|
@ -156,6 +156,13 @@ void delete_cookies(wxWebView* web_view, const std::string& url)
|
|||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void delete_cookies_with_counter(wxWebView* web_view, const std::string& url, std::atomic<size_t>& counter)
|
||||||
|
{
|
||||||
|
delete_cookies(web_view, url);
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
void add_request_authorization(wxWebView* web_view, const wxString& address, const std::string& token)
|
void add_request_authorization(wxWebView* web_view, const wxString& address, const std::string& token)
|
||||||
{
|
{
|
||||||
// unused on MacOS
|
// unused on MacOS
|
||||||
|
@ -150,7 +150,78 @@ void delete_cookies(wxWebView* webview, const std::string& url)
|
|||||||
).Get());
|
).Get());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
void delete_cookies_with_counter(wxWebView* webview, const std::string& url, std::atomic<size_t>& counter)
|
||||||
|
{
|
||||||
|
ICoreWebView2 *webView2 = static_cast<ICoreWebView2 *>(webview->GetNativeBackend());
|
||||||
|
if (!webView2) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "delete_cookies Failed: webView2 is null.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
"cookies": [{
|
||||||
|
"domain": ".google.com",
|
||||||
|
"expires": 1756464458.304917,
|
||||||
|
"httpOnly": true,
|
||||||
|
"name": "__Secure-1PSIDCC",
|
||||||
|
"path": "/",
|
||||||
|
"priority": "High",
|
||||||
|
"sameParty": false,
|
||||||
|
"secure": true,
|
||||||
|
"session": false,
|
||||||
|
"size": 90,
|
||||||
|
"sourcePort": 443,
|
||||||
|
"sourceScheme": "Secure",
|
||||||
|
"value": "AKEyXzUvV_KBqM4aOlsudROI_VZ-ToIH41LRbYJFtFjmKq_rOmx1owoyUGvQHbwr5be380fKuQ"
|
||||||
|
},...]}
|
||||||
|
*/
|
||||||
|
wxString parameters = GUI::format_wxstr(L"{\"urls\": [\"%1%\"]}", url);
|
||||||
|
webView2->CallDevToolsProtocolMethod(L"Network.getCookies", parameters.c_str(),
|
||||||
|
Microsoft::WRL::Callback<ICoreWebView2CallDevToolsProtocolMethodCompletedHandler>(
|
||||||
|
[webView2, url, &counter](HRESULT errorCode, LPCWSTR resultJson) -> HRESULT {
|
||||||
|
if (FAILED(errorCode)) {
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
// Handle successful call (resultJson contains the list of cookies)
|
||||||
|
pt::ptree ptree;
|
||||||
|
try {
|
||||||
|
std::stringstream ss(GUI::into_u8(resultJson));
|
||||||
|
pt::read_json(ss, ptree);
|
||||||
|
}
|
||||||
|
catch (const std::exception& e) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "Failed to parse cookies json: " << e.what();
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
auto& cookies = ptree.get_child("cookies");
|
||||||
|
if (cookies.size() == 0) {
|
||||||
|
counter++;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
for (auto it = cookies.begin(); it != cookies.end(); ++it) {
|
||||||
|
const auto& cookie = *it;
|
||||||
|
std::string name = cookie.second.get<std::string>("name");
|
||||||
|
std::string domain = cookie.second.get<std::string>("domain");
|
||||||
|
// Delete cookie by name and domain
|
||||||
|
wxString name_and_domain = GUI::format_wxstr(L"{\"name\": \"%1%\", \"domain\": \"%2%\"}", name, domain);
|
||||||
|
BOOST_LOG_TRIVIAL(debug) << "Deleting cookie: " << name_and_domain;
|
||||||
|
bool last = false;
|
||||||
|
if (std::next(it) == cookies.end()) {
|
||||||
|
last = true;
|
||||||
|
}
|
||||||
|
webView2->CallDevToolsProtocolMethod(L"Network.deleteCookies", name_and_domain.c_str(),
|
||||||
|
Microsoft::WRL::Callback<ICoreWebView2CallDevToolsProtocolMethodCompletedHandler>(
|
||||||
|
[last, &counter](HRESULT errorCode, LPCWSTR resultJson) -> HRESULT {
|
||||||
|
if (last) {
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}).Get());
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
).Get());
|
||||||
|
|
||||||
|
}
|
||||||
static EventRegistrationToken m_webResourceRequestedTokenForImageBlocking = {};
|
static EventRegistrationToken m_webResourceRequestedTokenForImageBlocking = {};
|
||||||
static wxString filter_patern;
|
static wxString filter_patern;
|
||||||
namespace {
|
namespace {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user