void NetlibSaveUserSettingsStruct(const char *szSettingsModule, NETLIBUSERSETTINGS *settings) { mir_cslock lck(csNetlibUser); NetlibUser tUser; tUser.user.szSettingsModule = (char*)szSettingsModule; NetlibUser *thisUser = netlibUser.find(&tUser); if (thisUser == NULL) return; NetlibFreeUserSettingsStruct(&thisUser->settings); CopySettingsStruct(&thisUser->settings, settings); WriteSettingsStructToDb(thisUser->user.szSettingsModule, &thisUser->settings, thisUser->user.flags); NETLIBUSERSETTINGS combinedSettings = { 0 }; combinedSettings.cbSize = sizeof(combinedSettings); DWORD flags = 0; for (int i = 0; i < netlibUser.getCount(); i++) { if (thisUser->user.flags & NUF_NOOPTIONS) continue; CombineSettingsStructs(&combinedSettings, &flags, &thisUser->settings, thisUser->user.flags); } if (combinedSettings.validateSSL == 2) combinedSettings.validateSSL = 0; if (combinedSettings.useProxy == 2) combinedSettings.useProxy = 0; if (combinedSettings.proxyType == 0) combinedSettings.proxyType = PROXYTYPE_SOCKS5; if (combinedSettings.useProxyAuth == 2) combinedSettings.useProxyAuth = 0; if (combinedSettings.dnsThroughProxy == 2) combinedSettings.dnsThroughProxy = 1; if (combinedSettings.enableUPnP == 2) combinedSettings.enableUPnP = 1; if (combinedSettings.specifyIncomingPorts == 2) combinedSettings.specifyIncomingPorts = 0; WriteSettingsStructToDb("Netlib", &combinedSettings, flags); NetlibFreeUserSettingsStruct(&combinedSettings); }
INT_PTR NetlibCloseHandle(WPARAM wParam, LPARAM) { switch(GetNetlibHandleType(wParam)) { case NLH_USER: { struct NetlibUser *nlu=(struct NetlibUser*)wParam; int i; EnterCriticalSection(&csNetlibUser); i = netlibUser.getIndex(nlu); if (i >= 0) netlibUser.remove(i); LeaveCriticalSection(&csNetlibUser); NetlibFreeUserSettingsStruct(&nlu->settings); mir_free(nlu->user.szSettingsModule); mir_free(nlu->user.szDescriptiveName); mir_free(nlu->user.szHttpGatewayHello); mir_free(nlu->user.szHttpGatewayUserAgent); mir_free(nlu->szStickyHeaders); break; } case NLH_CONNECTION: { struct NetlibConnection *nlc=(struct NetlibConnection*)wParam; HANDLE waitHandles[4]; DWORD waitResult; WaitForSingleObject(hConnectionHeaderMutex,INFINITE); if (nlc->usingHttpGateway) { HttpGatewayRemovePacket(nlc, -1); } else { if(nlc->s != INVALID_SOCKET) { NetlibDoClose(nlc); } if (nlc->s2 != INVALID_SOCKET) closesocket(nlc->s2); nlc->s2 = INVALID_SOCKET; } ReleaseMutex(hConnectionHeaderMutex); waitHandles[0]=hConnectionHeaderMutex; waitHandles[1]=nlc->hOkToCloseEvent; waitHandles[2]=nlc->ncsRecv.hMutex; waitHandles[3]=nlc->ncsSend.hMutex; waitResult=WaitForMultipleObjects( SIZEOF(waitHandles),waitHandles,TRUE,INFINITE); if(waitResult<WAIT_OBJECT_0 || waitResult >= WAIT_OBJECT_0 + SIZEOF(waitHandles)) { ReleaseMutex(hConnectionHeaderMutex); SetLastError(ERROR_INVALID_PARAMETER); //already been closed return 0; } nlc->handleType=0; mir_free(nlc->nlhpi.szHttpPostUrl); mir_free(nlc->nlhpi.szHttpGetUrl); mir_free(nlc->dataBuffer); mir_free((char*)nlc->nloc.szHost); mir_free(nlc->szNewUrl); mir_free(nlc->szProxyServer); NetlibDeleteNestedCS(&nlc->ncsRecv); NetlibDeleteNestedCS(&nlc->ncsSend); CloseHandle(nlc->hOkToCloseEvent); DeleteCriticalSection(&nlc->csHttpSequenceNums); ReleaseMutex(hConnectionHeaderMutex); NetlibLogf(nlc->nlu,"(%p:%u) Connection closed",nlc,nlc->s); break; } case NLH_BOUNDPORT: return NetlibFreeBoundPort((struct NetlibBoundPort*)wParam); case NLH_PACKETRECVER: { struct NetlibPacketRecver *nlpr=(struct NetlibPacketRecver*)wParam; mir_free(nlpr->packetRecver.buffer); break; } default: SetLastError(ERROR_INVALID_PARAMETER); return 0; } mir_free((void*)wParam); return 1; }
static INT_PTR CALLBACK DlgProcNetlibOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int iUser; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { int iItem = SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_ADDSTRING, 0, (LPARAM)TranslateT("<All connections>")); SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_SETITEMDATA, iItem, (LPARAM)-1); SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_SETCURSEL, iItem, 0); { mir_cslock lck(csNetlibUser); for (int i = 0; i < netlibUser.getCount(); ++i) { NetlibTempSettings *thisSettings = (NetlibTempSettings*)mir_calloc(sizeof(NetlibTempSettings)); thisSettings->flags = netlibUser[i]->user.flags; thisSettings->szSettingsModule = mir_strdup(netlibUser[i]->user.szSettingsModule); CopySettingsStruct(&thisSettings->settings, &netlibUser[i]->settings); tempSettings.insert(thisSettings); if (netlibUser[i]->user.flags & NUF_NOOPTIONS) continue; iItem = SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_ADDSTRING, 0, (LPARAM)netlibUser[i]->user.ptszDescriptiveName); SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_SETITEMDATA, iItem, i); } } } SendMessage(hwndDlg, M_REFRESHALL, 0, 0); return TRUE; case M_REFRESHALL: iUser = SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_GETCURSEL, 0, 0), 0); { NETLIBUSERSETTINGS settings = { 0 }; DWORD flags = 0; if (iUser == -1) { settings.cbSize = sizeof(settings); for (int i = 0; i < tempSettings.getCount(); i++) { NetlibTempSettings *p = tempSettings[i]; if (!(p->flags & NUF_NOOPTIONS)) CombineSettingsStructs(&settings, &flags, &p->settings, p->flags); } } else { NetlibFreeUserSettingsStruct(&settings); CopySettingsStruct(&settings, &tempSettings[iUser]->settings); flags = tempSettings[iUser]->flags; } ShowMultipleControls(hwndDlg, outgoingConnectionsControls, _countof(outgoingConnectionsControls), flags&NUF_OUTGOING ? SW_SHOW : SW_HIDE); CheckDlgButton(hwndDlg, IDC_USEPROXY, settings.useProxy ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_PROXYTYPE, CB_RESETCONTENT, 0, 0); if (settings.proxyType == 0) AddProxyTypeItem(hwndDlg, 0, settings.proxyType); AddProxyTypeItem(hwndDlg, PROXYTYPE_SOCKS4, settings.proxyType); AddProxyTypeItem(hwndDlg, PROXYTYPE_SOCKS5, settings.proxyType); if (flags & (NUF_HTTPCONNS | NUF_HTTPGATEWAY)) AddProxyTypeItem(hwndDlg, PROXYTYPE_HTTP, settings.proxyType); if (!(flags & NUF_NOHTTPSOPTION)) AddProxyTypeItem(hwndDlg, PROXYTYPE_HTTPS, settings.proxyType); if (flags & (NUF_HTTPCONNS | NUF_HTTPGATEWAY) || !(flags & NUF_NOHTTPSOPTION)) AddProxyTypeItem(hwndDlg, PROXYTYPE_IE, settings.proxyType); SetDlgItemTextA(hwndDlg, IDC_PROXYHOST, settings.szProxyServer ? settings.szProxyServer : ""); if (settings.wProxyPort) SetDlgItemInt(hwndDlg, IDC_PROXYPORT, settings.wProxyPort, FALSE); else SetDlgItemTextA(hwndDlg, IDC_PROXYPORT, ""); CheckDlgButton(hwndDlg, IDC_PROXYAUTH, settings.useProxyAuth ? BST_CHECKED : BST_UNCHECKED); SetDlgItemTextA(hwndDlg, IDC_PROXYUSER, settings.szProxyAuthUser ? settings.szProxyAuthUser : ""); SetDlgItemTextA(hwndDlg, IDC_PROXYPASS, settings.szProxyAuthPassword ? settings.szProxyAuthPassword : ""); CheckDlgButton(hwndDlg, IDC_PROXYDNS, settings.dnsThroughProxy ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_VALIDATESSL, settings.validateSSL ? BST_CHECKED : BST_UNCHECKED); ShowMultipleControls(hwndDlg, incomingConnectionsControls, _countof(incomingConnectionsControls), flags&NUF_INCOMING ? SW_SHOW : SW_HIDE); CheckDlgButton(hwndDlg, IDC_SPECIFYPORTS, settings.specifyIncomingPorts ? BST_CHECKED : BST_UNCHECKED); SetDlgItemTextA(hwndDlg, IDC_PORTSRANGE, settings.szIncomingPorts ? settings.szIncomingPorts : ""); CheckDlgButton(hwndDlg, IDC_SPECIFYPORTSO, settings.specifyOutgoingPorts ? BST_CHECKED : BST_UNCHECKED); SetDlgItemTextA(hwndDlg, IDC_PORTSRANGEO, settings.szOutgoingPorts ? settings.szOutgoingPorts : ""); CheckDlgButton(hwndDlg, IDC_ENABLEUPNP, settings.enableUPnP ? BST_CHECKED : BST_UNCHECKED); NetlibFreeUserSettingsStruct(&settings); SendMessage(hwndDlg, M_REFRESHENABLING, 0, 0); } break; case M_REFRESHENABLING: TCHAR str[80]; { int selectedProxyType = SendDlgItemMessage(hwndDlg, IDC_PROXYTYPE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_PROXYTYPE, CB_GETCURSEL, 0, 0), 0); mir_sntprintf(str, TranslateT("(often %d)"), oftenProxyPorts[selectedProxyType]); SetDlgItemText(hwndDlg, IDC_STOFTENPORT, str); if (IsDlgButtonChecked(hwndDlg, IDC_USEPROXY) != BST_UNCHECKED) { int enableAuth = 0, enableUser = 0, enablePass = 0, enableServer = 1; EnableMultipleControls(hwndDlg, useProxyControls, _countof(useProxyControls), TRUE); if (selectedProxyType == 0) { for (int i = 0; i < tempSettings.getCount(); i++) { NetlibTempSettings *p = tempSettings[i]; if (!p->settings.useProxy || p->flags & NUF_NOOPTIONS || !(p->flags & NUF_OUTGOING)) continue; if (p->settings.proxyType == PROXYTYPE_SOCKS4) enableUser = 1; else { enableAuth = 1; if (p->settings.useProxyAuth) enableUser = enablePass = 1; } } } else { if (selectedProxyType == PROXYTYPE_SOCKS4) enableUser = 1; else { if (selectedProxyType == PROXYTYPE_IE) enableServer = 0; enableAuth = 1; if (IsDlgButtonChecked(hwndDlg, IDC_PROXYAUTH) != BST_UNCHECKED) enableUser = enablePass = 1; } } EnableWindow(GetDlgItem(hwndDlg, IDC_PROXYAUTH), enableAuth); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC31), enableUser); EnableWindow(GetDlgItem(hwndDlg, IDC_PROXYUSER), enableUser); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC32), enablePass); EnableWindow(GetDlgItem(hwndDlg, IDC_PROXYPASS), enablePass); EnableWindow(GetDlgItem(hwndDlg, IDC_PROXYHOST), enableServer); EnableWindow(GetDlgItem(hwndDlg, IDC_PROXYPORT), enableServer); } else EnableMultipleControls(hwndDlg, useProxyControls, _countof(useProxyControls), FALSE); EnableMultipleControls(hwndDlg, specifyPortsControls, _countof(specifyPortsControls), IsDlgButtonChecked(hwndDlg, IDC_SPECIFYPORTS) != BST_UNCHECKED); EnableMultipleControls(hwndDlg, specifyOPortsControls, _countof(specifyOPortsControls), IsDlgButtonChecked(hwndDlg, IDC_SPECIFYPORTSO) != BST_UNCHECKED); } break; case WM_COMMAND: iUser = SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_NETLIBUSERS, CB_GETCURSEL, 0, 0), 0); switch (LOWORD(wParam)) { case IDC_NETLIBUSERS: if (HIWORD(wParam) == CBN_SELCHANGE) SendMessage(hwndDlg, M_REFRESHALL, 0, 0); return 0; case IDC_LOGOPTIONS: NetlibLogShowOptions(); return 0; case IDC_PROXYTYPE: if (HIWORD(wParam) != CBN_SELCHANGE) return 0; { int newValue = SendDlgItemMessage(hwndDlg, IDC_PROXYTYPE, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_PROXYTYPE, CB_GETCURSEL, 0, 0), 0); if (iUser == -1) { if (newValue == 0) return 0; for (int i=0; i < tempSettings.getCount(); i++) { NetlibTempSettings *p = tempSettings[i]; if (p->flags & NUF_NOOPTIONS) continue; if (newValue == PROXYTYPE_HTTP && !(p->flags & (NUF_HTTPCONNS | NUF_HTTPGATEWAY))) p->settings.proxyType = PROXYTYPE_HTTPS; else if (newValue == PROXYTYPE_HTTPS && p->flags & NUF_NOHTTPSOPTION) p->settings.proxyType = PROXYTYPE_HTTP; else p->settings.proxyType = newValue; } SendMessage(hwndDlg, M_REFRESHALL, 0, 0); } else { tempSettings[iUser]->settings.proxyType = newValue; SendMessage(hwndDlg, M_REFRESHENABLING, 0, 0); } } break; case IDC_USEPROXY: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, useProxy)); break; case IDC_PROXYAUTH: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, useProxyAuth)); break; case IDC_PROXYDNS: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, dnsThroughProxy)); break; case IDC_SPECIFYPORTS: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, specifyIncomingPorts)); break; case IDC_SPECIFYPORTSO: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, specifyOutgoingPorts)); break; case IDC_ENABLEUPNP: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, enableUPnP)); break; case IDC_VALIDATESSL: ChangeSettingIntByCheckbox(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, validateSSL)); break; case IDC_PROXYHOST: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; ChangeSettingStringByEdit(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, szProxyServer)); break; case IDC_PROXYPORT: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; { int newValue = GetDlgItemInt(hwndDlg, LOWORD(wParam), NULL, FALSE); if (iUser == -1) { for (int i = 0; i < tempSettings.getCount(); i++) { NetlibTempSettings *p = tempSettings[i]; if (!(p->flags & NUF_NOOPTIONS)) p->settings.wProxyPort = newValue; } } else tempSettings[iUser]->settings.wProxyPort = newValue; } break; case IDC_PROXYUSER: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; ChangeSettingStringByEdit(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, szProxyAuthUser)); break; case IDC_PROXYPASS: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; ChangeSettingStringByEdit(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, szProxyAuthPassword)); break; case IDC_PORTSRANGE: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; ChangeSettingStringByEdit(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, szIncomingPorts)); break; case IDC_PORTSRANGEO: if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) return 0; ChangeSettingStringByEdit(hwndDlg, LOWORD(wParam), iUser, offsetof(NETLIBUSERSETTINGS, szOutgoingPorts)); break; } ShowWindow(GetDlgItem(hwndDlg, IDC_RECONNECTREQD), SW_SHOW); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: for (iUser = 0; iUser < tempSettings.getCount(); iUser++) NetlibSaveUserSettingsStruct(tempSettings[iUser]->szSettingsModule, &tempSettings[iUser]->settings); return TRUE; } break; } break; case WM_DESTROY: for (int i = 0; i < tempSettings.getCount(); ++i) { NetlibTempSettings *p = tempSettings[i]; mir_free(p->szSettingsModule); NetlibFreeUserSettingsStruct(&p->settings); mir_free(tempSettings[i]); } tempSettings.destroy(); break; } return FALSE; }