summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Unidiff
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--PumpKINDlg.cpp109
1 files changed, 101 insertions, 8 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index b6b8a36..4cb1633 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -1,22 +1,24 @@
1// PumpKINDlg.cpp : implementation file 1// PumpKINDlg.cpp : implementation file
2// 2//
3 3
4#include "stdafx.h" 4#include "stdafx.h"
5#include "PumpKIN.h" 5#include "PumpKIN.h"
6#include "PumpKINDlg.h" 6#include "PumpKINDlg.h"
7 7
8#include "ACLTargetCombo.h"
8#include "PropsServer.h" 9#include "PropsServer.h"
9#include "PropsNetwork.h" 10#include "PropsNetwork.h"
10#include "PropsSounds.h" 11#include "PropsSounds.h"
12#include "PropsACL.h"
11#include "ConfirmRRQDlg.h" 13#include "ConfirmRRQDlg.h"
12#include "ConfirmWRQDlg.h" 14#include "ConfirmWRQDlg.h"
13#include "RequestDlg.h" 15#include "RequestDlg.h"
14#include "Resolver.h" 16#include "Resolver.h"
15#include "Retrier.h" 17#include "Retrier.h"
16#include "Trayer.h" 18#include "Trayer.h"
17 19
18#include <io.h> 20#include <io.h>
19 21
20#ifdef _DEBUG 22#ifdef _DEBUG
21#define new DEBUG_NEW 23#define new DEBUG_NEW
22#undef THIS_FILE 24#undef THIS_FILE
@@ -70,24 +72,28 @@ void CAboutDlg::DoDataExchange(CDataExchange* pDX)
70BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 72BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
71 //{{AFX_MSG_MAP(CAboutDlg) 73 //{{AFX_MSG_MAP(CAboutDlg)
72 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet) 74 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet)
73 //}}AFX_MSG_MAP 75 //}}AFX_MSG_MAP
74END_MESSAGE_MAP() 76END_MESSAGE_MAP()
75 77
76///////////////////////////////////////////////////////////////////////////// 78/////////////////////////////////////////////////////////////////////////////
77// CPumpKINDlg dialog 79// CPumpKINDlg dialog
78 80
79CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) 81CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
80 : CDialog(CPumpKINDlg::IDD, pParent) 82 : CDialog(CPumpKINDlg::IDD, pParent)
81{ 83{
84 m_Listener.m_Daddy = this;
85
86 m_bListen = TRUE;
87
82 m_ListenPort = 69; 88 m_ListenPort = 69;
83 m_bTFTPSubdirs = TRUE; 89 m_bTFTPSubdirs = TRUE;
84 m_RRQMode = rrqAlwaysConfirm; 90 m_RRQMode = rrqAlwaysConfirm;
85 m_WRQMode = wrqAlwaysConfirm; 91 m_WRQMode = wrqAlwaysConfirm;
86 m_TFTPTimeOut = CTimeSpan(0,0,0,30); 92 m_TFTPTimeOut = CTimeSpan(0,0,0,30);
87 m_RetryTimeOut = CTimeSpan(0,0,0,10); 93 m_RetryTimeOut = CTimeSpan(0,0,0,10);
88 m_LogLength = 100; 94 m_LogLength = 100;
89 m_SpeakPort = 69; 95 m_SpeakPort = 69;
90 m_PromptTimeOut=30; 96 m_PromptTimeOut=30;
91 m_bShown=TRUE; 97 m_bShown=TRUE;
92 m_bExiting=FALSE; 98 m_bExiting=FALSE;
93 m_BlockSize=1024; 99 m_BlockSize=1024;
@@ -98,31 +104,41 @@ CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
98 m_bnwRequest="(bang)"; m_bnwSuccess="(done)"; 104 m_bnwRequest="(bang)"; m_bnwSuccess="(done)";
99 m_bnwAbort="(oops)"; 105 m_bnwAbort="(oops)";
100 //{{AFX_DATA_INIT(CPumpKINDlg) 106 //{{AFX_DATA_INIT(CPumpKINDlg)
101 //}}AFX_DATA_INIT 107 //}}AFX_DATA_INIT
102 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 108 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
103 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 109 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
104 m_bmpBack.LoadBitmap(IDB_BACKGROUND); 110 m_bmpBack.LoadBitmap(IDB_BACKGROUND);
105 m_bmpBack.GetBitmap(&m_bitmapBack); 111 m_bmpBack.GetBitmap(&m_bitmapBack);
106 m_Retrier = new CRetrier(this); 112 m_Retrier = new CRetrier(this);
107 ASSERT(m_Retrier); 113 ASSERT(m_Retrier);
108 m_Trayer = new CTrayer(this); 114 m_Trayer = new CTrayer(this);
109 ASSERT(m_Trayer); 115 ASSERT(m_Trayer);
116 /* Ensure we're backwards compatible */
117 ASSERT(CPumpKINDlg::rrqGiveAll==0);
118 ASSERT(CPumpKINDlg::rrqAlwaysConfirm==1);
119 ASSERT(CPumpKINDlg::rrqDenyAll==2);
120 ASSERT(CPumpKINDlg::wrqTakeAll==0);
121 ASSERT(CPumpKINDlg::wrqConfirmIfExists==1);
122 ASSERT(CPumpKINDlg::wrqAlwaysConfirm==2);
123 ASSERT(CPumpKINDlg::wrqDenyAll==3);
124 /* -- */
110 LoadSettings(); 125 LoadSettings();
111} 126}
112 127
113void CPumpKINDlg::DoDataExchange(CDataExchange* pDX) 128void CPumpKINDlg::DoDataExchange(CDataExchange* pDX)
114{ 129{
115 CDialog::DoDataExchange(pDX); 130 CDialog::DoDataExchange(pDX);
116 //{{AFX_DATA_MAP(CPumpKINDlg) 131 //{{AFX_DATA_MAP(CPumpKINDlg)
132 DDX_Control(pDX, IDC_LISTENING, m_ListenCtl);
117 DDX_Control(pDX, IDC_ABORT, m_AbortCtl); 133 DDX_Control(pDX, IDC_ABORT, m_AbortCtl);
118 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl); 134 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl);
119 DDX_Control(pDX, IDC_LOG, m_Log); 135 DDX_Control(pDX, IDC_LOG, m_Log);
120 DDX_Control(pDX, IDC_CONNECTIONS, m_List); 136 DDX_Control(pDX, IDC_CONNECTIONS, m_List);
121 //}}AFX_DATA_MAP 137 //}}AFX_DATA_MAP
122} 138}
123 139
124BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) 140BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog)
125 //{{AFX_MSG_MAP(CPumpKINDlg) 141 //{{AFX_MSG_MAP(CPumpKINDlg)
126 ON_WM_SYSCOMMAND() 142 ON_WM_SYSCOMMAND()
127 ON_WM_DESTROY() 143 ON_WM_DESTROY()
128 ON_WM_PAINT() 144 ON_WM_PAINT()
@@ -142,24 +158,26 @@ BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog)
142 ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow) 158 ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow)
143 ON_COMMAND(ID_TRAY_EXIT, OnTrayExit) 159 ON_COMMAND(ID_TRAY_EXIT, OnTrayExit)
144 ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin) 160 ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin)
145 ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile) 161 ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile)
146 ON_COMMAND(ID_TRAY_HELP, OnTrayHelp) 162 ON_COMMAND(ID_TRAY_HELP, OnTrayHelp)
147 ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions) 163 ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions)
148 ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile) 164 ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile)
149 ON_WM_WINDOWPOSCHANGING() 165 ON_WM_WINDOWPOSCHANGING()
150 ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog) 166 ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog)
151 ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder) 167 ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder)
152 ON_WM_DROPFILES() 168 ON_WM_DROPFILES()
153 ON_BN_CLICKED(ID_HELP, OnHelp) 169 ON_BN_CLICKED(ID_HELP, OnHelp)
170 ON_BN_CLICKED(IDC_LISTENING, OnListening)
171 ON_COMMAND(ID_TRAY_LISTEN, OnTrayListen)
154 //}}AFX_MSG_MAP 172 //}}AFX_MSG_MAP
155END_MESSAGE_MAP() 173END_MESSAGE_MAP()
156 174
157///////////////////////////////////////////////////////////////////////////// 175/////////////////////////////////////////////////////////////////////////////
158// CPumpKINDlg message handlers 176// CPumpKINDlg message handlers
159 177
160BOOL CPumpKINDlg::OnInitDialog() 178BOOL CPumpKINDlg::OnInitDialog()
161{ 179{
162 CDialog::OnInitDialog(); 180 CDialog::OnInitDialog();
163 181
164 // Add "About..." menu item to system menu. 182 // Add "About..." menu item to system menu.
165 183
@@ -208,24 +226,26 @@ CRect listrc;
208 SetupButtons(); 226 SetupButtons();
209 227
210CRect rc, drc; 228CRect rc, drc;
211 GetWindowRect(rc); 229 GetWindowRect(rc);
212 GetDesktopWindow()->GetWindowRect(drc); 230 GetDesktopWindow()->GetWindowRect(drc);
213 SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); 231 SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
214 232
215 if(m_bShown) 233 if(m_bShown)
216 ShowWindow(SW_SHOW); 234 ShowWindow(SW_SHOW);
217 else 235 else
218 ShowWindow(SW_HIDE); 236 ShowWindow(SW_HIDE);
219 237
238 m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
239
220 // CG: The following block was added by the ToolTips component. 240 // CG: The following block was added by the ToolTips component.
221 { 241 {
222 // Create the ToolTip control. 242 // Create the ToolTip control.
223 m_tooltip.Create(this); 243 m_tooltip.Create(this);
224 m_tooltip.Activate(TRUE); 244 m_tooltip.Activate(TRUE);
225 245
226 m_tooltip.AddTool(&m_List,IDC_CONNECTIONS); 246 m_tooltip.AddTool(&m_List,IDC_CONNECTIONS);
227 m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT); 247 m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT);
228 m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET); 248 m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET);
229 m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT); 249 m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT);
230 m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS); 250 m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS);
231 m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT); 251 m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT);
@@ -315,29 +335,28 @@ void CPumpKINDlg::OnPaint()
315// The system calls this to obtain the cursor to display while the user drags 335// The system calls this to obtain the cursor to display while the user drags
316// the minimized window. 336// the minimized window.
317HCURSOR CPumpKINDlg::OnQueryDragIcon() 337HCURSOR CPumpKINDlg::OnQueryDragIcon()
318{ 338{
319 return (HCURSOR) m_hIcon; 339 return (HCURSOR) m_hIcon;
320} 340}
321 341
322int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 342int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
323{ 343{
324 if (CDialog::OnCreate(lpCreateStruct) == -1) 344 if (CDialog::OnCreate(lpCreateStruct) == -1)
325 return -1; 345 return -1;
326 346
327 m_Listener.m_Daddy=this; 347 if(!m_Listener.SetListen(m_bListen)) {
328 if(!m_Listener.Create(m_ListenPort,SOCK_DGRAM)){ 348 m_bListen=FALSE;
329 TRACE0("Failed to create socket\n"); 349 TRACE0("Failed to create socket\n");
330 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION); 350 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
331 return -1;
332 } 351 }
333 352
334 if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){ 353 if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){
335 TRACE0("Failed to create trayer\n"); 354 TRACE0("Failed to create trayer\n");
336 return -1; 355 return -1;
337 } 356 }
338 357
339NOTIFYICONDATA nid; 358NOTIFYICONDATA nid;
340 memset(&nid,0,sizeof(nid)); 359 memset(&nid,0,sizeof(nid));
341 nid.cbSize=sizeof(nid); 360 nid.cbSize=sizeof(nid);
342 nid.hWnd=m_Trayer->m_hWnd; 361 nid.hWnd=m_Trayer->m_hWnd;
343 nid.uID=IDC_TRAYICON; 362 nid.uID=IDC_TRAYICON;
@@ -655,35 +674,40 @@ CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKAD
655} 674}
656 675
657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 676BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
658{ 677{
659 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 678 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
660 return FALSE; 679 return FALSE;
661 ASSERT(m_Daddy); 680 ASSERT(m_Daddy);
662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 681 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
663 m_Daddy->m_Xfers[m_hSocket]=this; 682 m_Daddy->m_Xfers[m_hSocket]=this;
664CString lFile = localFile?localFile:m_FileName; 683CString lFile = localFile?localFile:m_FileName;
665 TurnSlashes(lFile,TRUE); 684 TurnSlashes(lFile,TRUE);
666 UpdateList(); 685 UpdateList();
667 if(!localFile){// Check only if server 686 if(!localFile){// Check only for incoming requests
668 if(CheckBadRelativeness(m_FileName)){ 687 if(CheckBadRelativeness(m_FileName)){
669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 688 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
670 return TRUE; 689 return TRUE;
671 } 690 }
672 switch(m_Daddy->m_RRQMode){ 691 int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opRRQ,m_Peer.sin_addr.s_addr);
692 if(atar<0)
693 atar = m_Daddy->m_RRQMode;
694 switch(atar){
673 case CPumpKINDlg::rrqGiveAll: 695 case CPumpKINDlg::rrqGiveAll:
674 break; 696 break;
675 case CPumpKINDlg::rrqAlwaysConfirm: 697 case CPumpKINDlg::rrqAlwaysConfirm:
676 if(ConfirmRequest()) 698 if(ConfirmRequest())
677 break; 699 break;
700 default:
701 TRACE1("Unexpected access target: %d\n",atar);
678 case CPumpKINDlg::rrqDenyAll: 702 case CPumpKINDlg::rrqDenyAll:
679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 703 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
680 return TRUE; 704 return TRUE;
681 } 705 }
682 } 706 }
683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); 707CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile);
684CFileException e; 708CFileException e;
685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){ 709 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){
686 if(localFile){ 710 if(localFile){
687 CString tmp; 711 CString tmp;
688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn); 712 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn);
689 m_Daddy->LogLine(tmp); 713 m_Daddy->LogLine(tmp);
@@ -1098,25 +1122,25 @@ void CXferSocket::Destroy(BOOL success)
1098 m_Daddy->KillTimer(m_hSocket); 1122 m_Daddy->KillTimer(m_hSocket);
1099 m_Daddy->m_Xfers.RemoveKey(m_hSocket); 1123 m_Daddy->m_Xfers.RemoveKey(m_hSocket);
1100LV_FINDINFO lvf; 1124LV_FINDINFO lvf;
1101 memset(&lvf,0,sizeof(lvf)); 1125 memset(&lvf,0,sizeof(lvf));
1102 lvf.flags=LVFI_PARAM; 1126 lvf.flags=LVFI_PARAM;
1103 lvf.lParam=(LPARAM)this; 1127 lvf.lParam=(LPARAM)this;
1104int i = m_Daddy->m_List.FindItem(&lvf); 1128int i = m_Daddy->m_List.FindItem(&lvf);
1105 if(i>=0) 1129 if(i>=0)
1106 m_Daddy->m_List.DeleteItem(i); 1130 m_Daddy->m_List.DeleteItem(i);
1107 delete this; 1131 delete this;
1108} 1132}
1109 1133
1110void CPumpKINDlg::LogLine(LPCTSTR str) 1134void CPumpKINDlg::LogLineToScreen(LPCTSTR str)
1111{ 1135{
1112 ASSERT(m_LogLength); 1136 ASSERT(m_LogLength);
1113 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){ 1137 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){
1114 CTime *t = (CTime*)m_Log.GetItemData(0); 1138 CTime *t = (CTime*)m_Log.GetItemData(0);
1115 if(((DWORD)t)!=LB_ERR){ 1139 if(((DWORD)t)!=LB_ERR){
1116 ASSERT(t); 1140 ASSERT(t);
1117 m_LogTimes.RemoveKey(t); 1141 m_LogTimes.RemoveKey(t);
1118 delete t; 1142 delete t;
1119 } 1143 }
1120 m_Log.DeleteString(0); 1144 m_Log.DeleteString(0);
1121 } 1145 }
1122int i = m_Log.AddString(str); 1146int i = m_Log.AddString(str);
@@ -1154,58 +1178,68 @@ CString rv = m_Daddy->m_TFTPRoot;
1154 while((!fn.IsEmpty()) && fn[0]=='\\') 1178 while((!fn.IsEmpty()) && fn[0]=='\\')
1155 fn=fn.Mid(1); 1179 fn=fn.Mid(1);
1156 rv+=fn; 1180 rv+=fn;
1157 return rv; 1181 return rv;
1158} 1182}
1159 1183
1160void CPumpKINDlg::OnOptions() 1184void CPumpKINDlg::OnOptions()
1161{ 1185{
1162CPropertySheet cps(IDS_TITLE_OPTIONS,this); 1186CPropertySheet cps(IDS_TITLE_OPTIONS,this);
1163CPropsServer server; 1187CPropsServer server;
1164CPropsNetwork network; 1188CPropsNetwork network;
1165CPropsSounds sounds; 1189CPropsSounds sounds;
1190CPropsACL acl;
1166 1191
1167 server.m_RRQMode=m_RRQMode; 1192 server.m_RRQMode=m_RRQMode;
1168 server.m_TFTPRoot=m_TFTPRoot; 1193 server.m_TFTPRoot=m_TFTPRoot;
1169 server.m_TFTPSubdirs=m_bTFTPSubdirs; 1194 server.m_TFTPSubdirs=m_bTFTPSubdirs;
1170 server.m_WRQMode=m_WRQMode; 1195 server.m_WRQMode=m_WRQMode;
1171 server.m_PromptTimeOut=m_PromptTimeOut; 1196 server.m_PromptTimeOut=m_PromptTimeOut;
1197 server.m_LogFile=m_LogFile;
1172 1198
1173 network.m_ListenPort=m_ListenPort; 1199 network.m_ListenPort=m_ListenPort;
1174 network.m_SpeakPort=m_SpeakPort; 1200 network.m_SpeakPort=m_SpeakPort;
1175 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds(); 1201 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds();
1176 network.m_BlockSize=m_BlockSize; 1202 network.m_BlockSize=m_BlockSize;
1177 1203
1178 sounds.m_Request = m_bnwRequest; 1204 sounds.m_Request = m_bnwRequest;
1179 sounds.m_Success = m_bnwSuccess; 1205 sounds.m_Success = m_bnwSuccess;
1180 sounds.m_Abort = m_bnwAbort; 1206 sounds.m_Abort = m_bnwAbort;
1181 1207
1208 acl.m_rulist = m_aclRules;
1209
1182 cps.AddPage(&server); 1210 cps.AddPage(&server);
1183 cps.AddPage(&network); 1211 cps.AddPage(&network);
1184 cps.AddPage(&sounds); 1212 cps.AddPage(&sounds);
1213 cps.AddPage(&acl);
1185 if(cps.DoModal()==IDOK){ 1214 if(cps.DoModal()==IDOK){
1186 m_RRQMode=server.m_RRQMode; 1215 m_RRQMode=server.m_RRQMode;
1187 m_TFTPRoot=server.m_TFTPRoot; 1216 m_TFTPRoot=server.m_TFTPRoot;
1188 m_bTFTPSubdirs=server.m_TFTPSubdirs; 1217 m_bTFTPSubdirs=server.m_TFTPSubdirs;
1189 m_WRQMode=server.m_WRQMode; 1218 m_WRQMode=server.m_WRQMode;
1190 m_PromptTimeOut=server.m_PromptTimeOut; 1219 m_PromptTimeOut=server.m_PromptTimeOut;
1220 m_LogFile=server.m_LogFile;
1191 1221
1192 m_ListenPort=network.m_ListenPort; 1222 m_ListenPort=network.m_ListenPort;
1193 m_SpeakPort=network.m_SpeakPort; 1223 m_SpeakPort=network.m_SpeakPort;
1194 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut); 1224 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut);
1195 m_BlockSize=network.m_BlockSize; 1225 m_BlockSize=network.m_BlockSize;
1196 1226
1197 m_bnwRequest = sounds.m_Request; 1227 m_bnwRequest = sounds.m_Request;
1198 m_bnwSuccess = sounds.m_Success; 1228 m_bnwSuccess = sounds.m_Success;
1199 m_bnwAbort = sounds.m_Abort; 1229 m_bnwAbort = sounds.m_Abort;
1230
1231 m_aclRules = acl.m_rulist;
1232
1233 m_lastlogerr.Empty();
1200 } 1234 }
1201} 1235}
1202 1236
1203BOOL CRRQSocket::ConfirmRequest() 1237BOOL CRRQSocket::ConfirmRequest()
1204{ 1238{
1205CConfirmRRQDlg cd(NULL); 1239CConfirmRRQDlg cd(NULL);
1206 cd.m_Daddy=this; 1240 cd.m_Daddy=this;
1207 cd.m_File=m_FileName; 1241 cd.m_File=m_FileName;
1208 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1242 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1209 if(cd.DoModal()==IDOK) 1243 if(cd.DoModal()==IDOK)
1210 return TRUE; 1244 return TRUE;
1211 return FALSE; 1245 return FALSE;
@@ -1235,48 +1269,52 @@ CString lf;
1235 } 1269 }
1236CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); 1270CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
1237 if(!localFile){// This is an incoming request.. 1271 if(!localFile){// This is an incoming request..
1238 if(CheckBadRelativeness(m_FileName)){ 1272 if(CheckBadRelativeness(m_FileName)){
1239 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1273 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1240 return TRUE; 1274 return TRUE;
1241 } 1275 }
1242 BOOL exists; 1276 BOOL exists;
1243 if(!_access((LPCTSTR)fn,0)) 1277 if(!_access((LPCTSTR)fn,0))
1244 m_Rename=exists=TRUE; 1278 m_Rename=exists=TRUE;
1245 else 1279 else
1246 m_Rename=exists=FALSE; 1280 m_Rename=exists=FALSE;
1247 // *** m_WRQMode only if server transfer 1281 int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opWRQ,m_Peer.sin_addr.s_addr);
1248 switch(m_Daddy->m_WRQMode){ 1282 if(atar<0)
1283 atar=m_Daddy->m_WRQMode;
1284 switch(atar){
1249 case CPumpKINDlg::wrqTakeAll: 1285 case CPumpKINDlg::wrqTakeAll:
1250 if(exists){ 1286 if(exists){
1251 if(!RenameFile(fn)){ 1287 if(!RenameFile(fn)){
1252 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME); 1288 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME);
1253 return TRUE; 1289 return TRUE;
1254 } 1290 }
1255 } 1291 }
1256 break; 1292 break;
1257 case CPumpKINDlg::wrqConfirmIfExists: 1293 case CPumpKINDlg::wrqConfirmIfExists:
1258 if(!exists) 1294 if(!exists)
1259 break; 1295 break;
1260 case CPumpKINDlg::wrqAlwaysConfirm: 1296 case CPumpKINDlg::wrqAlwaysConfirm:
1261 if(exists) 1297 if(exists)
1262 m_bResume=TRUE; 1298 m_bResume=TRUE;
1263 if(ConfirmRequest()){ 1299 if(ConfirmRequest()){
1264 if(m_Rename){ 1300 if(m_Rename){
1265 RenameFile(fn); 1301 RenameFile(fn);
1266 if(SaveAs(fn)) 1302 if(SaveAs(fn))
1267 break; 1303 break;
1268 }else 1304 }else
1269 break; 1305 break;
1270 } 1306 }
1307 default:
1308 TRACE1("Unexpected access target: %d\n",atar);
1271 case CPumpKINDlg::wrqDenyAll: 1309 case CPumpKINDlg::wrqDenyAll:
1272 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1310 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1273 return TRUE; 1311 return TRUE;
1274 } 1312 }
1275 } 1313 }
1276CFileException e; 1314CFileException e;
1277 if(!m_File.Open( 1315 if(!m_File.Open(
1278 fn, 1316 fn,
1279 m_bResume 1317 m_bResume
1280 ?(CFile::modeWrite|CFile::shareDenyWrite) 1318 ?(CFile::modeWrite|CFile::shareDenyWrite)
1281 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite), 1319 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite),
1282 &e 1320 &e
@@ -1786,66 +1824,72 @@ void CPumpKINDlg::OnTrayOptions()
1786 OnOptions(); 1824 OnOptions();
1787} 1825}
1788 1826
1789void CPumpKINDlg::OnTraySendfile() 1827void CPumpKINDlg::OnTraySendfile()
1790{ 1828{
1791 OnPut(); 1829 OnPut();
1792} 1830}
1793 1831
1794void CPumpKINDlg::LoadSettings() 1832void CPumpKINDlg::LoadSettings()
1795{ 1833{
1796CWinApp *app = AfxGetApp(); 1834CWinApp *app = AfxGetApp();
1797 ASSERT(app); 1835 ASSERT(app);
1836 m_bListen=app->GetProfileInt("TFTPSettings","Listen",m_bListen);
1798 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest); 1837 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest);
1799 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess); 1838 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess);
1800 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort); 1839 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort);
1801 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1840 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1802 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1841 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1803 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength); 1842 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength);
1804 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1843 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1805 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1844 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1806 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1845 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1807 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1846 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1847 m_LogFile=app->GetProfileString("General","LogFile",m_LogFile);
1808 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds())); 1848 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()));
1809 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1849 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1810 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds())); 1850 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()));
1811 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1851 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1812 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown); 1852 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown);
1813 if(m_TFTPRoot.IsEmpty()){ 1853 if(m_TFTPRoot.IsEmpty()){
1814 DWORD dL = ::GetCurrentDirectory(0,NULL); 1854 DWORD dL = ::GetCurrentDirectory(0,NULL);
1815 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL))); 1855 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL)));
1816 m_TFTPRoot.ReleaseBuffer(); 1856 m_TFTPRoot.ReleaseBuffer();
1817 } 1857 }
1818 ::SetCurrentDirectory(m_TFTPRoot); 1858 ::SetCurrentDirectory(m_TFTPRoot);
1859 m_aclRules.LoadProfile(app);
1819} 1860}
1820 1861
1821void CPumpKINDlg::SaveSettings() 1862void CPumpKINDlg::SaveSettings()
1822{ 1863{
1823CWinApp *app = AfxGetApp(); 1864CWinApp *app = AfxGetApp();
1824 ASSERT(app); 1865 ASSERT(app);
1866 app->WriteProfileInt("TFTPSettings","Listen",m_bListen);
1825 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest); 1867 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest);
1826 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess); 1868 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess);
1827 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort); 1869 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort);
1828 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1870 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1829 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1871 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1830 app->WriteProfileInt("UISettings","LogLength",m_LogLength); 1872 app->WriteProfileInt("UISettings","LogLength",m_LogLength);
1831 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1873 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1832 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1874 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1833 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1875 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1834 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1876 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1877 app->WriteProfileString("General","LogFile",m_LogFile);
1835 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()); 1878 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds());
1836 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1879 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1837 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()); 1880 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds());
1838 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1881 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1839 app->WriteProfileInt("UISettings","Visble",m_bShown); 1882 app->WriteProfileInt("UISettings","Visble",m_bShown);
1883 m_aclRules.SaveProfile(app);
1840} 1884}
1841 1885
1842void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 1886void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
1843{ 1887{
1844 CDialog::OnWindowPosChanging(lpwndpos); 1888 CDialog::OnWindowPosChanging(lpwndpos);
1845 if(!m_bExiting){ 1889 if(!m_bExiting){
1846 if(m_bShown){ 1890 if(m_bShown){
1847 lpwndpos->flags&=~SWP_HIDEWINDOW; 1891 lpwndpos->flags&=~SWP_HIDEWINDOW;
1848 lpwndpos->flags|=SWP_SHOWWINDOW; 1892 lpwndpos->flags|=SWP_SHOWWINDOW;
1849 }else{ 1893 }else{
1850 lpwndpos->flags&=~SWP_SHOWWINDOW; 1894 lpwndpos->flags&=~SWP_SHOWWINDOW;
1851 lpwndpos->flags|=SWP_HIDEWINDOW; 1895 lpwndpos->flags|=SWP_HIDEWINDOW;
@@ -1975,12 +2019,61 @@ tftp* rv = Allocate(src->length);
1975 2019
1976void CXferSocket::SetTry(tftp *p) 2020void CXferSocket::SetTry(tftp *p)
1977{ 2021{
1978 if(m_Retry) 2022 if(m_Retry)
1979 delete m_Retry; 2023 delete m_Retry;
1980 m_Retry=p?tftp::Copy(p):NULL; 2024 m_Retry=p?tftp::Copy(p):NULL;
1981} 2025}
1982 2026
1983void CPumpKINDlg::OnHelp() 2027void CPumpKINDlg::OnHelp()
1984{ 2028{
1985 AfxGetApp()->WinHelp(0,HELP_FINDER); 2029 AfxGetApp()->WinHelp(0,HELP_FINDER);
1986} 2030}
2031
2032BOOL CListenSocket::SetListen(BOOL b) {
2033 ASSERT(m_Daddy);
2034 if(b==m_bListen)
2035 return TRUE;
2036 if(b) {
2037 if(!Create(m_Daddy->m_ListenPort,SOCK_DGRAM))
2038 return FALSE;
2039 return m_bListen=TRUE;
2040 }else{
2041 Close(); m_bListen=FALSE;
2042 return TRUE;
2043 }
2044}
2045
2046void CPumpKINDlg::OnListening()
2047{
2048 if(!m_Listener.SetListen(m_ListenCtl.GetCheck()==1)) {
2049 TRACE0("Failed to create socket\n");
2050 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
2051 }
2052 m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
2053 m_bListen=m_Listener.m_bListen;
2054}
2055
2056void CPumpKINDlg::OnTrayListen()
2057{
2058 if(!m_Listener.SetListen(!m_Listener.m_bListen)) {
2059 TRACE0("Failed to create socket\n");
2060 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
2061 }
2062 m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
2063 m_bListen=m_Listener.m_bListen;
2064}
2065
2066void CPumpKINDlg::LogLine(LPCTSTR str)
2067{
2068 LogLineToScreen(str);
2069 if(!m_LogFile.IsEmpty()) {
2070 if(!Klever::LogRecord((LPCTSTR)m_LogFile,str)) {
2071 if(m_lastlogerr!=m_LogFile) {
2072 CString tmp;
2073 tmp.Format(IDS_LOG_LOGERROR,m_LogFile);
2074 LogLineToScreen(tmp);
2075 m_lastlogerr=m_LogFile;
2076 }
2077 }
2078 }
2079}