void CUpdateWizard::DisplayUpdateAvailability(bool showDialog) { COptions* pOptions = COptions::Get(); if (CBuildInfo::GetVersion() == _T("custom build")) return; const wxString& newVersion = pOptions->GetOption(OPTION_UPDATECHECK_NEWVERSION); if (newVersion == _T("")) return; wxLongLong v = CBuildInfo::ConvertToVersionNumber(newVersion); if (v <= CBuildInfo::ConvertToVersionNumber(CBuildInfo::GetVersion())) { pOptions->SetOption(OPTION_UPDATECHECK_NEWVERSION, _T("")); return; } if (!m_menuUpdated) { m_menuUpdated = true; #ifdef __WXMSW__ // All open menus need to be closed or app will become unresponsive. ::EndMenu(); #endif CMainFrame* pFrame = (CMainFrame*)m_parent; wxMenu* pMenu = new wxMenu(); const wxString& name = wxString::Format(_("&Version %s"), pOptions->GetOption(OPTION_UPDATECHECK_NEWVERSION).c_str()); pMenu->Append(XRCID("ID_CHECKFORUPDATES"), name); wxMenuBar* pMenuBar = pFrame->GetMenuBar(); if (pMenuBar) pMenuBar->Append(pMenu, _("&New version available!")); } if (showDialog && !m_updateShown) { if (wxDialogEx::ShownDialogs()) { m_busy_timer.Start(1000, true); return; } m_updateShown = true; #ifdef __WXMSW__ // All open menus need to be closed or app will become unresponsive. ::EndMenu(); #endif CUpdateWizard dlg(m_parent); if (dlg.Load()) dlg.Run(); } }
bool COptionsPageEdit::LoadPage() { bool failure = false; COptions* pOptions = COptions::Get(); wxString editor = pOptions->GetOption(OPTION_EDIT_DEFAULTEDITOR); if (editor.empty() || editor[0] == '0') SetRCheck(XRCID("ID_DEFAULT_NONE"), true, failure); else if (editor[0] == '1') SetRCheck(XRCID("ID_DEFAULT_TEXT"), true, failure); else { if (editor[0] == '2') editor = editor.Mid(1); SetRCheck(XRCID("ID_DEFAULT_CUSTOM"), true, failure); SetText(XRCID("ID_EDITOR"), editor, failure); } if (pOptions->GetOptionVal(OPTION_EDIT_ALWAYSDEFAULT)) SetRCheck(XRCID("ID_USEDEFAULT"), true, failure); else SetRCheck(XRCID("ID_USEASSOCIATIONS"), true, failure); SetCheckFromOption(XRCID("ID_EDIT_TRACK_LOCAL"), OPTION_EDIT_TRACK_LOCAL, failure); if (!failure) SetCtrlState(); return !failure; }
BOOL CAdminSocket::Init() { char *buffer = new char[100]; char *p = buffer; strcpy(buffer, "FZS"); p += 3; *p++ = 0; *p++ = 4; memcpy(p, &SERVER_VERSION, 4); p += 4; *p++ = 0; *p++ = 4; memcpy(p, &PROTOCOL_VERSION, 4); p += 4; COptions options; CStdString pass = options.GetOption(OPTION_ADMINPASS); CStdString peerAddress; UINT port = 0; if (GetPeerName(peerAddress, port) && IsLocalhost(peerAddress) && pass == _T("")) { BOOL res = Send(buffer, p-buffer) == p - buffer; delete [] buffer; if (!res) { Close(); return FALSE; } return FinishLogon(); } else { *p++ = 0; DWORD len = 20; memcpy(p, &len, 4); p += 4; *p++ = 0; *p++ = 8; int i; for (i = 0; i < 8; ++i) { m_Nonce1[i] = std::uniform_int_distribution<unsigned int>(0, 255)(std::random_device()); *p++ = m_Nonce1[i]; } *p++ = 0; *p++ = 8; for (i = 0; i < 8; ++i) { m_Nonce2[i] = std::uniform_int_distribution<unsigned int>(0, 255)(std::random_device()); *p++ = m_Nonce2[i]; } } int res = Send(buffer, p-buffer) == p-buffer; delete [] buffer; return res; }
bool CUpdateWizard::Run() { COptions* pOptions = COptions::Get(); if (CBuildInfo::GetVersion() == _T("custom build")) return false; const wxString& newVersion = pOptions->GetOption(OPTION_UPDATECHECK_NEWVERSION); if (newVersion == _T("")) return RunWizard(m_pages.front()); if (CBuildInfo::ConvertToVersionNumber(newVersion) <= CBuildInfo::ConvertToVersionNumber(CBuildInfo::GetVersion())) { pOptions->SetOption(OPTION_UPDATECHECK_NEWVERSION, _T("")); return RunWizard(m_pages.front()); } // Force another check PrepareUpdateCheckPage(); m_start_check = true; m_currentPage = 0; return RunWizard(m_pages[0]); }
void CUpdateWizard::ParseData() { const wxLongLong ownVersionNumber = CBuildInfo::ConvertToVersionNumber(CBuildInfo::GetVersion()); wxString newVersion; wxLongLong newVersionNumber = -1; wxString newUrl; wxString newChecksum; while (m_data != _T("")) { wxString line; int pos = m_data.Find('\n'); if (pos != -1) { line = m_data.Left(pos); m_data = m_data.Mid(pos + 1); } else { line = m_data; m_data = _T(""); } line.Trim(true); line.Trim(false); if (line == _T("")) { // After empty line, changelog follows m_news = m_data; m_news.Trim(true); m_news.Trim(false); break; } // Extract type of update pos = line.Find(' '); if (pos < 1) continue; wxString type = line.Left(pos); line = line.Mid(pos + 1); // Extract version/date pos = line.Find(' '); if (pos < 1) continue; wxString versionOrDate = line.Left(pos); line = line.Mid(pos + 1); // Extract URL wxString url = line; if (url == _T("none")) url = _T(""); pos = url.Find(' '); if (pos < 1) newChecksum.clear(); else { newChecksum = url.Mid(pos + 1); url = url.Left(pos); } if (type == _T("nightly")) { if (!m_loaded) continue; if (!XRCCTRL(*this, "ID_CHECKNIGHTLY", wxCheckBox)->GetValue()) continue; wxDateTime nightlyDate; if (!nightlyDate.ParseDate(versionOrDate)) continue; wxDateTime buildDate = CBuildInfo::GetBuildDate(); if (!buildDate.IsValid() || !nightlyDate.IsValid() || nightlyDate <= buildDate) continue; if (url == _T("")) continue; newVersion = versionOrDate + _T(" Nightly"); newUrl = url; break; } else { wxLongLong v = CBuildInfo::ConvertToVersionNumber(versionOrDate); if (v <= ownVersionNumber) continue; } newVersion = versionOrDate; newVersionNumber = CBuildInfo::ConvertToVersionNumber(versionOrDate); newUrl = url; } if (!m_loaded) { if (newVersion == _T("")) return; COptions* pOptions = COptions::Get(); pOptions->SetOption(OPTION_UPDATECHECK_NEWVERSION, newVersion); DisplayUpdateAvailability(true); return; } else { // Since the auto check and the manual check, a newer version might have been published COptions* pOptions = COptions::Get(); if (!pOptions->GetOption(OPTION_UPDATECHECK_NEWVERSION).empty()) pOptions->SetOption(OPTION_UPDATECHECK_NEWVERSION, newVersion); } if (newVersion == _T("")) { m_skipPageChanging = true; ShowPage(m_pages[4]); m_currentPage = 4; m_skipPageChanging = false; } else { PrepareUpdateAvailablePage(newVersion, newUrl, newChecksum); m_skipPageChanging = true; ShowPage(m_pages[1]); m_currentPage = 1; m_skipPageChanging = false; } wxButton* pNext = wxDynamicCast(FindWindow(wxID_FORWARD), wxButton); pNext->Enable(); wxButton* pPrev = wxDynamicCast(FindWindow(wxID_BACKWARD), wxButton); pPrev->Disable(); }
BOOL CAdminSocket::ParseRecvBuffer() { if (m_nRecvBufferPos<5) return FALSE; if ((m_pRecvBuffer[0]&0x03) != 0) { SendCommand(_T("Protocol error: Unknown command type, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } else { DWORD len; memcpy(&len, m_pRecvBuffer+1, 4); if (len > 0xFFFFFF) { SendCommand(_T("Protocol error: Invalid data length, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } if (m_nRecvBufferPos < len+5) return FALSE; else { int nID = (m_pRecvBuffer[0]&0x7C)>>2; if (m_bStillNeedAuth) { if (nID) { SendCommand(_T("Protocol error: Not authenticated, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } if (len != 16) { SendCommand(_T("Protocol error: Auth data len invalid, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } MD5 md5; md5.update(m_Nonce1, 8); COptions options; CStdString pass = options.GetOption(OPTION_ADMINPASS); if (pass.GetLength() < 6) { SendCommand(_T("Protocol error: Server misconfigured, admin password not set correctly"), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } md5.update((unsigned char *)pass.c_str(), pass.GetLength()); md5.update(m_Nonce2, 8); md5.finalize(); unsigned char *digest = md5.raw_digest(); if (memcmp(m_pRecvBuffer + 5, digest, 16)) { SendCommand(_T("Protocol error: Auth failed, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } delete [] digest; FinishLogon(); } else m_pAdminInterface->ProcessCommand(this, nID, m_pRecvBuffer+5, len); memmove(m_pRecvBuffer, m_pRecvBuffer+len+5, m_nRecvBufferPos-len-5); m_nRecvBufferPos-=len+5; } } return TRUE; }