/* Miranda IM: the free IM client for Microsoft* Windows* Copyright 2000-2006 Miranda ICQ/IM project, all portions of this codebase are copyrighted to the people listed in contributors.txt. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "commonheaders.h" #include "netlib.h" extern struct NetlibUser **netlibUser; extern int netlibUserCount; extern CRITICAL_SECTION csNetlibUser; struct NetlibTempSettings { DWORD flags; char *szSettingsModule; NETLIBUSERSETTINGS settings; } static *tempSettings; static int tempSettingsCount; static const UINT outgoingConnectionsControls[]={ IDC_STATIC12, IDC_USEPROXY, IDC_STATIC21,IDC_PROXYTYPE, IDC_STATIC22,IDC_PROXYHOST,IDC_STATIC23,IDC_PROXYPORT,IDC_STOFTENPORT, IDC_PROXYAUTH, IDC_STATIC31,IDC_PROXYUSER,IDC_STATIC32,IDC_PROXYPASS, IDC_PROXYAUTHNTLM, IDC_PROXYDNS, IDC_SPECIFYPORTSO, IDC_STATIC53,IDC_PORTSRANGEO, IDC_STATIC54}; static const UINT useProxyControls[]={ IDC_STATIC21,IDC_PROXYTYPE, IDC_STATIC22,IDC_PROXYHOST,IDC_STATIC23,IDC_PROXYPORT,IDC_STOFTENPORT, IDC_PROXYAUTH, IDC_STATIC31,IDC_PROXYUSER,IDC_STATIC32,IDC_PROXYPASS, IDC_PROXYAUTHNTLM, IDC_PROXYDNS}; static const UINT specifyOPortsControls[]={ IDC_STATIC53,IDC_PORTSRANGEO, IDC_STATIC54 }; static const UINT incomingConnectionsControls[]={ IDC_STATIC43, IDC_SPECIFYPORTS, IDC_STATIC51,IDC_PORTSRANGE, IDC_STATIC52}; static const UINT specifyPortsControls[]={ IDC_STATIC51,IDC_PORTSRANGE, IDC_STATIC52}; static const TCHAR* szProxyTypes[]={_T(""),_T("SOCKS4"),_T("SOCKS5"),_T("HTTP"),_T("HTTPS")}; static const WORD oftenProxyPorts[]={1080,1080,1080,8080,8080}; #define M_REFRESHALL (WM_USER+100) #define M_REFRESHENABLING (WM_USER+101) static void ShowMultipleControls(HWND hwndDlg,const UINT *controls,int cControls,int state) { int i; for(i=0;iszIncomingPorts) dest->szIncomingPorts=mir_strdup(dest->szIncomingPorts); if(dest->szOutgoingPorts) dest->szOutgoingPorts=mir_strdup(dest->szOutgoingPorts); if(dest->szProxyAuthPassword) dest->szProxyAuthPassword=mir_strdup(dest->szProxyAuthPassword); if(dest->szProxyAuthUser) dest->szProxyAuthUser=mir_strdup(dest->szProxyAuthUser); if(dest->szProxyServer) dest->szProxyServer=mir_strdup(dest->szProxyServer); } static void CombineSettingsStrings(char **dest,char **source) { if(*dest!=NULL && (*source==NULL || lstrcmpiA(*dest,*source))) {mir_free(*dest); *dest=NULL;} } static void CombineSettingsStructs(NETLIBUSERSETTINGS *dest,DWORD *destFlags,NETLIBUSERSETTINGS *source,DWORD sourceFlags) { if(sourceFlags&NUF_OUTGOING) { if(*destFlags&NUF_OUTGOING) { if(dest->useProxy!=source->useProxy) dest->useProxy=2; if(dest->proxyType!=source->proxyType) dest->proxyType=0; CombineSettingsStrings(&dest->szProxyServer,&source->szProxyServer); if(dest->wProxyPort!=source->wProxyPort) dest->wProxyPort=0; if(dest->useProxyAuth!=source->useProxyAuth) dest->useProxyAuth=2; CombineSettingsStrings(&dest->szProxyAuthUser,&source->szProxyAuthUser); CombineSettingsStrings(&dest->szProxyAuthPassword,&source->szProxyAuthPassword); if(dest->useProxyAuthNtlm!=source->useProxyAuthNtlm) dest->useProxyAuthNtlm=2; if(dest->dnsThroughProxy!=source->dnsThroughProxy) dest->dnsThroughProxy=2; if(dest->specifyOutgoingPorts!=source->specifyOutgoingPorts) dest->specifyOutgoingPorts=2; CombineSettingsStrings(&dest->szOutgoingPorts,&source->szOutgoingPorts); } else { dest->useProxy=source->useProxy; dest->proxyType=source->proxyType; dest->szProxyServer=source->szProxyServer; if(dest->szProxyServer) dest->szProxyServer=mir_strdup(dest->szProxyServer); dest->wProxyPort=source->wProxyPort; dest->useProxyAuth=source->useProxyAuth; dest->szProxyAuthUser=source->szProxyAuthUser; if(dest->szProxyAuthUser) dest->szProxyAuthUser=mir_strdup(dest->szProxyAuthUser); dest->szProxyAuthPassword=source->szProxyAuthPassword; if(dest->szProxyAuthPassword) dest->szProxyAuthPassword=mir_strdup(dest->szProxyAuthPassword); dest->useProxyAuthNtlm=source->useProxyAuthNtlm; dest->dnsThroughProxy=source->dnsThroughProxy; dest->specifyOutgoingPorts=source->specifyOutgoingPorts; dest->szOutgoingPorts=source->szOutgoingPorts; if(dest->szOutgoingPorts) dest->szOutgoingPorts=mir_strdup(dest->szOutgoingPorts); } } if(sourceFlags&NUF_INCOMING) { if(*destFlags&NUF_INCOMING) { if(dest->specifyIncomingPorts!=source->specifyIncomingPorts) dest->specifyIncomingPorts=2; CombineSettingsStrings(&dest->szIncomingPorts,&source->szIncomingPorts); } else { dest->specifyIncomingPorts=source->specifyIncomingPorts; dest->szIncomingPorts=source->szIncomingPorts; if(dest->szIncomingPorts) dest->szIncomingPorts=mir_strdup(dest->szIncomingPorts); } } if((*destFlags&NUF_NOHTTPSOPTION)!=(sourceFlags&NUF_NOHTTPSOPTION)) *destFlags=(*destFlags|sourceFlags)&~NUF_NOHTTPSOPTION; else *destFlags|=sourceFlags; } static void ChangeSettingIntByCheckbox(HWND hwndDlg,UINT ctrlId,int iUser,int memberOffset) { int newValue,i; newValue=IsDlgButtonChecked(hwndDlg,ctrlId)!=BST_CHECKED; CheckDlgButton(hwndDlg,ctrlId,newValue?BST_CHECKED:BST_UNCHECKED); if(iUser==-1) { for(i=0;iuseProxy); DBWriteContactSettingByte(NULL,szSettingsModule,"NLProxyType",(BYTE)settings->proxyType); DBWriteContactSettingString(NULL,szSettingsModule,"NLProxyServer",settings->szProxyServer?settings->szProxyServer:""); DBWriteContactSettingWord(NULL,szSettingsModule,"NLProxyPort",(WORD)settings->wProxyPort); DBWriteContactSettingByte(NULL,szSettingsModule,"NLUseProxyAuth",(BYTE)settings->useProxyAuth); DBWriteContactSettingString(NULL,szSettingsModule,"NLProxyAuthUser",settings->szProxyAuthUser?settings->szProxyAuthUser:""); lstrcpynA(szEncodedPassword,settings->szProxyAuthPassword?settings->szProxyAuthPassword:"",SIZEOF(szEncodedPassword)); CallService(MS_DB_CRYPT_ENCODESTRING,SIZEOF(szEncodedPassword),(LPARAM)szEncodedPassword); DBWriteContactSettingString(NULL,szSettingsModule,"NLProxyAuthPassword",szEncodedPassword); DBWriteContactSettingByte(NULL,szSettingsModule,"NLUseProxyAuthNtlm",(BYTE)settings->useProxyAuthNtlm); DBWriteContactSettingByte(NULL,szSettingsModule,"NLDnsThroughProxy",(BYTE)settings->dnsThroughProxy); DBWriteContactSettingByte(NULL,szSettingsModule,"NLSpecifyOutgoingPorts",(BYTE)settings->specifyOutgoingPorts); DBWriteContactSettingString(NULL,szSettingsModule,"NLOutgoingPorts",settings->szOutgoingPorts?settings->szOutgoingPorts:""); } if(flags&NUF_INCOMING) { DBWriteContactSettingByte(NULL,szSettingsModule,"NLSpecifyIncomingPorts",(BYTE)settings->specifyIncomingPorts); DBWriteContactSettingString(NULL,szSettingsModule,"NLIncomingPorts",settings->szIncomingPorts?settings->szIncomingPorts:""); } } void NetlibSaveUserSettingsStruct(const char *szSettingsModule,NETLIBUSERSETTINGS *settings) { int iUser,i; NETLIBUSERSETTINGS combinedSettings={0}; DWORD flags; EnterCriticalSection(&csNetlibUser); for(iUser=0;iUseruser.szSettingsModule)) break; if(iUser==netlibUserCount) { LeaveCriticalSection(&csNetlibUser); return; } NetlibFreeUserSettingsStruct(&netlibUser[iUser]->settings); CopySettingsStruct(&netlibUser[iUser]->settings,settings); WriteSettingsStructToDb(netlibUser[iUser]->user.szSettingsModule,&netlibUser[iUser]->settings,netlibUser[iUser]->user.flags); combinedSettings.cbSize=sizeof(combinedSettings); for(i=0,flags=0;iuser.flags&NUF_NOOPTIONS) continue; CombineSettingsStructs(&combinedSettings,&flags,&netlibUser[iUser]->settings,netlibUser[iUser]->user.flags); } if(combinedSettings.useProxy==2) combinedSettings.useProxy=0; if(combinedSettings.proxyType==0) combinedSettings.proxyType=PROXYTYPE_SOCKS5; if(combinedSettings.useProxyAuth==2) combinedSettings.useProxyAuth=0; if(combinedSettings.useProxyAuthNtlm==2) combinedSettings.useProxyAuthNtlm=0; if(combinedSettings.dnsThroughProxy==2) combinedSettings.dnsThroughProxy=1; if(combinedSettings.specifyIncomingPorts==2) combinedSettings.specifyIncomingPorts=0; WriteSettingsStructToDb("Netlib",&combinedSettings,flags); NetlibFreeUserSettingsStruct(&combinedSettings); LeaveCriticalSection(&csNetlibUser); } static BOOL CALLBACK DlgProcNetlibOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { int iUser,iItem; TranslateDialogDefault(hwndDlg); iItem=SendDlgItemMessage(hwndDlg,IDC_NETLIBUSERS,CB_ADDSTRING,0,(LPARAM)TranslateT("")); SendDlgItemMessage(hwndDlg,IDC_NETLIBUSERS,CB_SETITEMDATA,iItem,(LPARAM)-1); SendDlgItemMessage(hwndDlg,IDC_NETLIBUSERS,CB_SETCURSEL,iItem,0); EnterCriticalSection(&csNetlibUser); tempSettingsCount=netlibUserCount; tempSettings=(struct NetlibTempSettings*)mir_alloc(sizeof(struct NetlibTempSettings)*tempSettingsCount); for(iUser=0;iUseruser.flags; tempSettings[iUser].szSettingsModule=mir_strdup(netlibUser[iUser]->user.szSettingsModule); CopySettingsStruct(&tempSettings[iUser].settings,&netlibUser[iUser]->settings); if(netlibUser[iUser]->user.flags&NUF_NOOPTIONS) continue; iItem=SendDlgItemMessageA(hwndDlg,IDC_NETLIBUSERS,CB_ADDSTRING,0,(LPARAM)netlibUser[iUser]->user.szDescriptiveName); SendDlgItemMessage(hwndDlg,IDC_NETLIBUSERS,CB_SETITEMDATA,iItem,iUser); } LeaveCriticalSection(&csNetlibUser); SendMessage(hwndDlg,M_REFRESHALL,0,0); return TRUE; } case M_REFRESHALL: { int iUser=SendDlgItemMessage(hwndDlg,IDC_NETLIBUSERS,CB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_NETLIBUSERS,CB_GETCURSEL,0,0),0); NETLIBUSERSETTINGS settings={0}; DWORD flags; if(iUser==-1) { int i; settings.cbSize=sizeof(settings); for(i=0,flags=0;iidFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { int iUser; for(iUser=0;iUseruser.flags&NUF_NOOPTIONS)) optionsCount++; LeaveCriticalSection(&csNetlibUser); if ( optionsCount == 0 ) return 0; odp.cbSize = sizeof(odp); odp.position = 900000000; odp.hInstance = GetModuleHandle(NULL); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_NETLIB); odp.pszTitle = "Network"; odp.pfnDlgProc = DlgProcNetlibOpts; odp.flags = ODPF_BOLDGROUPS; odp.expertOnlyControls = expertOnlyControls; odp.nExpertOnlyControls = SIZEOF( expertOnlyControls ); CallService( MS_OPT_ADDPAGE, wParam, ( LPARAM )&odp ); return 0; }