summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Side-by-side diff
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
@@ -6,7 +6,9 @@
#include "PumpKINDlg.h"
+#include "ACLTargetCombo.h"
#include "PropsServer.h"
#include "PropsNetwork.h"
#include "PropsSounds.h"
+#include "PropsACL.h"
#include "ConfirmRRQDlg.h"
#include "ConfirmWRQDlg.h"
@@ -80,4 +82,8 @@ CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPumpKINDlg::IDD, pParent)
{
+ m_Listener.m_Daddy = this;
+
+ m_bListen = TRUE;
+
m_ListenPort = 69;
m_bTFTPSubdirs = TRUE;
@@ -108,4 +114,13 @@ CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
m_Trayer = new CTrayer(this);
ASSERT(m_Trayer);
+ /* Ensure we're backwards compatible */
+ ASSERT(CPumpKINDlg::rrqGiveAll==0);
+ ASSERT(CPumpKINDlg::rrqAlwaysConfirm==1);
+ ASSERT(CPumpKINDlg::rrqDenyAll==2);
+ ASSERT(CPumpKINDlg::wrqTakeAll==0);
+ ASSERT(CPumpKINDlg::wrqConfirmIfExists==1);
+ ASSERT(CPumpKINDlg::wrqAlwaysConfirm==2);
+ ASSERT(CPumpKINDlg::wrqDenyAll==3);
+ /* -- */
LoadSettings();
}
@@ -115,4 +130,5 @@ void CPumpKINDlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPumpKINDlg)
+ DDX_Control(pDX, IDC_LISTENING, m_ListenCtl);
DDX_Control(pDX, IDC_ABORT, m_AbortCtl);
DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl);
@@ -152,4 +168,6 @@ BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog)
ON_WM_DROPFILES()
ON_BN_CLICKED(ID_HELP, OnHelp)
+ ON_BN_CLICKED(IDC_LISTENING, OnListening)
+ ON_COMMAND(ID_TRAY_LISTEN, OnTrayListen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@@ -218,4 +236,6 @@ CRect rc, drc;
ShowWindow(SW_HIDE);
+ m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
+
// CG: The following block was added by the ToolTips component.
{
@@ -325,9 +345,8 @@ int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
return -1;
- m_Listener.m_Daddy=this;
- if(!m_Listener.Create(m_ListenPort,SOCK_DGRAM)){
+ if(!m_Listener.SetListen(m_bListen)) {
+ m_bListen=FALSE;
TRACE0("Failed to create socket\n");
AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
- return -1;
}
@@ -665,10 +684,13 @@ CString lFile = localFile?localFile:m_FileName;
TurnSlashes(lFile,TRUE);
UpdateList();
- if(!localFile){ // Check only if server
+ if(!localFile){ // Check only for incoming requests
if(CheckBadRelativeness(m_FileName)){
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
return TRUE;
}
- switch(m_Daddy->m_RRQMode){
+ int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opRRQ,m_Peer.sin_addr.s_addr);
+ if(atar<0)
+ atar = m_Daddy->m_RRQMode;
+ switch(atar){
case CPumpKINDlg::rrqGiveAll:
break;
@@ -676,4 +698,6 @@ CString lFile = localFile?localFile:m_FileName;
if(ConfirmRequest())
break;
+ default:
+ TRACE1("Unexpected access target: %d\n",atar);
case CPumpKINDlg::rrqDenyAll:
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
@@ -1108,5 +1132,5 @@ int i = m_Daddy->m_List.FindItem(&lvf);
}
-void CPumpKINDlg::LogLine(LPCTSTR str)
+void CPumpKINDlg::LogLineToScreen(LPCTSTR str)
{
ASSERT(m_LogLength);
@@ -1164,4 +1188,5 @@ CPropsServer server;
CPropsNetwork network;
CPropsSounds sounds;
+CPropsACL acl;
server.m_RRQMode=m_RRQMode;
@@ -1170,4 +1195,5 @@ CPropsSounds sounds;
server.m_WRQMode=m_WRQMode;
server.m_PromptTimeOut=m_PromptTimeOut;
+ server.m_LogFile=m_LogFile;
network.m_ListenPort=m_ListenPort;
@@ -1180,7 +1206,10 @@ CPropsSounds sounds;
sounds.m_Abort = m_bnwAbort;
+ acl.m_rulist = m_aclRules;
+
cps.AddPage(&server);
cps.AddPage(&network);
cps.AddPage(&sounds);
+ cps.AddPage(&acl);
if(cps.DoModal()==IDOK){
m_RRQMode=server.m_RRQMode;
@@ -1189,4 +1218,5 @@ CPropsSounds sounds;
m_WRQMode=server.m_WRQMode;
m_PromptTimeOut=server.m_PromptTimeOut;
+ m_LogFile=server.m_LogFile;
m_ListenPort=network.m_ListenPort;
@@ -1198,4 +1228,8 @@ CPropsSounds sounds;
m_bnwSuccess = sounds.m_Success;
m_bnwAbort = sounds.m_Abort;
+
+ m_aclRules = acl.m_rulist;
+
+ m_lastlogerr.Empty();
}
}
@@ -1245,6 +1279,8 @@ CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
else
m_Rename=exists=FALSE;
- // *** m_WRQMode only if server transfer
- switch(m_Daddy->m_WRQMode){
+ int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opWRQ,m_Peer.sin_addr.s_addr);
+ if(atar<0)
+ atar=m_Daddy->m_WRQMode;
+ switch(atar){
case CPumpKINDlg::wrqTakeAll:
if(exists){
@@ -1269,4 +1305,6 @@ CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
break;
}
+ default:
+ TRACE1("Unexpected access target: %d\n",atar);
case CPumpKINDlg::wrqDenyAll:
Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
@@ -1796,4 +1834,5 @@ void CPumpKINDlg::LoadSettings()
CWinApp *app = AfxGetApp();
ASSERT(app);
+ m_bListen=app->GetProfileInt("TFTPSettings","Listen",m_bListen);
m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest);
m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess);
@@ -1806,4 +1845,5 @@ CWinApp *app = AfxGetApp();
m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
+ m_LogFile=app->GetProfileString("General","LogFile",m_LogFile);
m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()));
m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
@@ -1817,4 +1857,5 @@ CWinApp *app = AfxGetApp();
}
::SetCurrentDirectory(m_TFTPRoot);
+ m_aclRules.LoadProfile(app);
}
@@ -1823,4 +1864,5 @@ void CPumpKINDlg::SaveSettings()
CWinApp *app = AfxGetApp();
ASSERT(app);
+ app->WriteProfileInt("TFTPSettings","Listen",m_bListen);
app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest);
app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess);
@@ -1833,4 +1875,5 @@ CWinApp *app = AfxGetApp();
app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
+ app->WriteProfileString("General","LogFile",m_LogFile);
app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds());
app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
@@ -1838,4 +1881,5 @@ CWinApp *app = AfxGetApp();
app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode);
app->WriteProfileInt("UISettings","Visble",m_bShown);
+ m_aclRules.SaveProfile(app);
}
@@ -1985,2 +2029,51 @@ void CPumpKINDlg::OnHelp()
AfxGetApp()->WinHelp(0,HELP_FINDER);
}
+
+BOOL CListenSocket::SetListen(BOOL b) {
+ ASSERT(m_Daddy);
+ if(b==m_bListen)
+ return TRUE;
+ if(b) {
+ if(!Create(m_Daddy->m_ListenPort,SOCK_DGRAM))
+ return FALSE;
+ return m_bListen=TRUE;
+ }else{
+ Close(); m_bListen=FALSE;
+ return TRUE;
+ }
+}
+
+void CPumpKINDlg::OnListening()
+{
+ if(!m_Listener.SetListen(m_ListenCtl.GetCheck()==1)) {
+ TRACE0("Failed to create socket\n");
+ AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
+ }
+ m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
+ m_bListen=m_Listener.m_bListen;
+}
+
+void CPumpKINDlg::OnTrayListen()
+{
+ if(!m_Listener.SetListen(!m_Listener.m_bListen)) {
+ TRACE0("Failed to create socket\n");
+ AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
+ }
+ m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
+ m_bListen=m_Listener.m_bListen;
+}
+
+void CPumpKINDlg::LogLine(LPCTSTR str)
+{
+ LogLineToScreen(str);
+ if(!m_LogFile.IsEmpty()) {
+ if(!Klever::LogRecord((LPCTSTR)m_LogFile,str)) {
+ if(m_lastlogerr!=m_LogFile) {
+ CString tmp;
+ tmp.Format(IDS_LOG_LOGERROR,m_LogFile);
+ LogLineToScreen(tmp);
+ m_lastlogerr=m_LogFile;
+ }
+ }
+ }
+}