From 39bb4331674cc77560a546f4f9b14b143603d4be Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Thu, 02 Feb 2006 23:07:50 +0000 Subject: - version bump to 2.7 - year bump to 2006 - ip-based access control - server switchable off - logging to file git-svn-id: http://svn.klever.net/kin/pumpkin/trunk@144 fe716a7a-6dde-0310-88d9-d003556173a8 --- diff --git a/ACLTargetCombo.cpp b/ACLTargetCombo.cpp new file mode 100644 index 0000000..cdbd075 --- a/dev/null +++ b/ACLTargetCombo.cpp @@ -0,0 +1,85 @@ +// ACLTargetCombo.cpp : implementation file +// + +#include "stdafx.h" +#include "PumpKIN.h" +#include "PumpKINDlg.h" +#include "ACLTargetCombo.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CACLTargetCombo + +CACLTargetCombo::CACLTargetCombo() +: m_op(-1) +{ +} + +CACLTargetCombo::~CACLTargetCombo() +{ +} + + +BEGIN_MESSAGE_MAP(CACLTargetCombo, CComboBox) + //{{AFX_MSG_MAP(CACLTargetCombo) + // NOTE - the ClassWizard will add and remove mapping macros here. + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CACLTargetCombo message handlers + +void CACLTargetCombo::SetOp(int op) +{ + m_op=op; + ResetContent(); + switch(op) { + case tftp::opRRQ: + m_tmap.RemoveAll(); + SetItemData(m_tmap[acl_rule::rrqNone]=AddString("fallback to global"),acl_rule::rrqNone); + SetItemData(m_tmap[acl_rule::rrqDeny]=AddString("deny access"),acl_rule::rrqDeny); + SetItemData(m_tmap[acl_rule::rrqPrompt]=AddString("prompt"),acl_rule::rrqPrompt); + SetItemData(m_tmap[acl_rule::rrqGrant]=AddString("grant access"),CPumpKINDlg::rrqGrant); + SetCurSel(0); + EnableWindow(TRUE); + break; + case tftp::opWRQ: + m_tmap.RemoveAll(); + SetItemData(m_tmap[acl_rule::wrqNone]=AddString("fallback to global"),acl_rule::wrqNone); + SetItemData(m_tmap[acl_rule::wrqDeny]=AddString("deny access"),acl_rule::wrqDeny); + SetItemData(m_tmap[acl_rule::wrqPrompt]=AddString("prompt"),acl_rule::wrqPrompt); + SetItemData(m_tmap[acl_rule::wrqPromptIfExists]=AddString("prompt if file exists"),acl_rule::wrqPromptIfExists); + SetItemData(m_tmap[acl_rule::wrqGrant]=AddString("grant access"),acl_rule::wrqGrant); + SetCurSel(0); + EnableWindow(TRUE); + break; + default: + EnableWindow(FALSE); + break; + } +} + +int CACLTargetCombo::GetTarget() +{ + int cs=GetCurSel(); + if(cs==CB_ERR) + return -1; + return GetItemData(cs); +} + +void CACLTargetCombo::SetTarget(int t,int op) +{ + if(op>=0) + SetOp(op); + ASSERT(m_op>=0); + int i; + if(m_tmap.Lookup(t,i)) + SetCurSel(i); + else + SetCurSel(0); +} diff --git a/ACLTargetCombo.h b/ACLTargetCombo.h new file mode 100644 index 0000000..ef7baef --- a/dev/null +++ b/ACLTargetCombo.h @@ -0,0 +1,42 @@ +// ACLTargetCombo.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CACLTargetCombo window + +class CACLTargetCombo : public CComboBox +{ +// Construction +public: + void SetTarget(int t,int op=-1); + int GetTarget(); + void SetOp(int op); + int m_op; + CACLTargetCombo(); + +// Attributes +public: + CMap m_tmap; + +// Operations +public: + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CACLTargetCombo) + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~CACLTargetCombo(); + + // Generated message map functions +protected: + //{{AFX_MSG(CACLTargetCombo) + // NOTE - the ClassWizard will add and remove member functions here. + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// diff --git a/COPYING b/COPYING index b830fe7..72571d7 100644 --- a/COPYING +++ b/COPYING @@ -1,4 +1,4 @@ -Copyright (c) 1997-2005 Klever Group (http://www.klever.net/) +Copyright (c) 1997-2006 Klever Group (http://www.klever.net/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/PropsACL.cpp b/PropsACL.cpp new file mode 100644 index 0000000..6d918ad --- a/dev/null +++ b/PropsACL.cpp @@ -0,0 +1,290 @@ +// PropsACL.cpp : implementation file +// + +#include "stdafx.h" +#include "PumpKIN.h" +#include "PumpKINDlg.h" +#include "ACLTargetCombo.h" +#include "PropsACL.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CPropsACL property page + +IMPLEMENT_DYNCREATE(CPropsACL, CPropertyPage) + +CPropsACL::CPropsACL() : CPropertyPage(CPropsACL::IDD) +{ + //{{AFX_DATA_INIT(CPropsACL) + //}}AFX_DATA_INIT +} + +CPropsACL::~CPropsACL() +{ +} + +void CPropsACL::DoDataExchange(CDataExchange* pDX) +{ + CPropertyPage::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CPropsACL) + DDX_Control(pDX, IDC_ACL_REPLACE, m_ReplaceCtl); + DDX_Control(pDX, IDC_ACL_NETMASK, m_NetmaskCtl); + DDX_Control(pDX, IDC_ACL_XFER, m_XferCtl); + DDX_Control(pDX, IDC_ACL_UP, m_UpCtl); + DDX_Control(pDX, IDC_ACL_RULE, m_RuleCtl); + DDX_Control(pDX, IDC_ACL_REMOVE, m_RemoveCtl); + DDX_Control(pDX, IDC_ACL_LIST, m_ListCtl); + DDX_Control(pDX, IDC_ACL_DOWN, m_DownCtl); + DDX_Control(pDX, IDC_ACL_ADDR, m_AddrCtl); + DDX_Control(pDX, IDC_ACL_ADD, m_AddCtl); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CPropsACL, CPropertyPage) + //{{AFX_MSG_MAP(CPropsACL) + ON_CBN_SELCHANGE(IDC_ACL_XFER, OnSelchangeAclXfer) + ON_NOTIFY(LVN_ITEMCHANGED, IDC_ACL_LIST, OnItemchangedAclList) + ON_BN_CLICKED(IDC_ACL_ADD, OnAclAdd) + ON_BN_CLICKED(IDC_ACL_REPLACE, OnAclReplace) + ON_BN_CLICKED(IDC_ACL_REMOVE, OnAclRemove) + ON_BN_CLICKED(IDC_ACL_UP, OnAclUp) + ON_BN_CLICKED(IDC_ACL_DOWN, OnAclDown) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CPropsACL message handlers + +BOOL CPropsACL::OnInitDialog() +{ + CPropertyPage::OnInitDialog(); + + m_FocusedRule=-1; + + m_Images.Create(16,16,TRUE,2,1); + m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ)); + m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ)); + ASSERT(m_iRRQ>=0); ASSERT(m_iWRQ>=0); + m_ListCtl.SetImageList(&m_Images,LVSIL_NORMAL); + m_ListCtl.SetImageList(&m_Images,LVSIL_SMALL); + m_ListCtl.SetImageList(&m_Images,LVSIL_STATE); + + CRect lrc; m_ListCtl.GetClientRect(&lrc); + long lrcw3 = lrc.Width()/3; + m_ListCtl.InsertColumn(0,"IP",LVCFMT_LEFT,lrcw3,subitemIP); + m_ListCtl.InsertColumn(1,"netmask",LVCFMT_LEFT,lrcw3,subitemNM); + m_ListCtl.InsertColumn(2,"action",LVCFMT_LEFT,lrc.Width()-lrcw3*2,subitemAction); + + m_UpCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_UP)); + m_DownCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_DOWN)); + m_RemoveCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_REMOVE)); + + m_XferCtl.SetItemData(0,tftp::opRRQ); + m_XferCtl.SetItemData(1,tftp::opWRQ); + + m_AddrCtl.SetWindowText("192.168.0.0"); + m_NetmaskCtl.SetWindowText("255.255.255.0"); + + for(int i=0;iuChanged&LVIF_STATE) + && + (pNMListView->uNewState&LVIS_FOCUSED)!=(pNMListView->uOldState&LVIS_FOCUSED) + && + pNMListView->iItem>=0 && pNMListView->iItemuNewState&LVIS_FOCUSED) + m_FocusedRule=pNMListView->iItem; + else if(pNMListView->iItem==m_FocusedRule) + m_FocusedRule=-1; + UpdateControls(); + } + + *pResult = 0; +} + +void CPropsACL::UpdateControls() { + if(m_FocusedRule>=m_rulist.GetSize()) + m_FocusedRule=-1; + if(m_FocusedRule>=0) { + m_UpCtl.EnableWindow(m_FocusedRule>0); + m_DownCtl.EnableWindow(m_FocusedRule<(m_ListCtl.GetItemCount()-1)); + acl_rule r; + GetListRule(m_FocusedRule,r); + SetRule(r); + m_AddCtl.EnableWindow(TRUE); + m_ReplaceCtl.EnableWindow(TRUE); + }else{ + OnSelchangeAclXfer(); + m_AddCtl.EnableWindow(TRUE); + m_ReplaceCtl.EnableWindow(FALSE); + } + m_RemoveCtl.EnableWindow(m_ListCtl.GetSelectedCount()!=0 || m_FocusedRule>=0); +} + +void CPropsACL::OnAclAdd() { + acl_rule r; + UINT err=GetRule(r); + if(err) { + AfxMessageBox(err,MB_OK); + }else{ + int i=m_rulist.AppendRule(r); + ASSERT(r.op==acl_rule::opRRQ || r.op==acl_rule::opWRQ); + m_ListCtl.InsertItem(i,0); + SetListRule(i,r); + } +} + +void CPropsACL::OnAclReplace() { + acl_rule r; + UINT err=GetRule(r); + if(err) { + AfxMessageBox(err,MB_OK); + }else{ + ASSERT(m_FocusedRule>=0); + m_rulist[m_FocusedRule]=r; + SetListRule(m_FocusedRule,r); + } +} + +int CPropsACL::GetOp() { + int cs=m_XferCtl.GetCurSel(); + if(cs==CB_ERR) + return -1; + else + return m_XferCtl.GetItemData(cs); +} + +void CPropsACL::SetOp(int op) { + int os=m_XferCtl.GetCount(); + for(int i=0;i=0); + int fr=m_FocusedRule; + if(fr<0 || fr>=m_rulist.GetSize()) return; + m_rulist.DeleteRule(fr); + m_ListCtl.DeleteItem(fr); + ASSERT(m_rulist.GetSize()==m_ListCtl.GetItemCount()); + if(fr>=m_rulist.GetSize()) { + if(fr>0) { + fr=m_rulist.GetSize()-1; + } + }else + fr=-1; + if(fr>0) + SetListFocusSelection(fr); + m_ListCtl.SetFocus(); +} + +void CPropsACL::OnAclUp() { + int s=m_FocusedRule; + if(s<=0) return; + int d=s-1; + acl_rule r=m_rulist[s]; + m_rulist[s]=m_rulist[d]; + m_rulist[d]=r; + SetListRule(d,m_rulist[d]); + SetListRule(s,m_rulist[s]); + SetListFocusSelection(d); + m_ListCtl.SetFocus(); +} + +void CPropsACL::OnAclDown() { + int s=m_FocusedRule; + int d=s+1; + if(s<0 || d>=m_rulist.GetSize()) return; + acl_rule r=m_rulist[s]; + m_rulist[s]=m_rulist[d]; + m_rulist[d]=r; + SetListRule(d,m_rulist[d]); + SetListRule(s,m_rulist[s]); + SetListFocusSelection(d); + m_ListCtl.SetFocus(); +} + +void CPropsACL::SetListFocusSelection(int i) { + int s=m_ListCtl.GetItemCount(); + for(int t=0;tm_bSaveAndValidate) m_PromptTimeOut=m_PromptTimeoutCtl.GetPos(); @@ -51,6 +54,7 @@ void CPropsServer::DoDataExchange(CDataExchange* pDX) BEGIN_MESSAGE_MAP(CPropsServer, CPropertyPage) //{{AFX_MSG_MAP(CPropsServer) ON_BN_CLICKED(IDC_BROWSE, OnBrowse) + ON_BN_CLICKED(IDC_LOGFILE_BROWSE, OnLogfileBrowse) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -63,6 +67,7 @@ BOOL CPropsServer::OnInitDialog() m_PromptTimeoutCtl.SetRange(5,60); m_BrowseCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_BROWSE)); + m_LogBrowseCtl.SetIcon(AfxGetApp()->LoadIcon(IDI_BROWSE)); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE @@ -77,3 +82,17 @@ CString nr = m_TFTPRoot; UpdateData(FALSE); } } + +void CPropsServer::OnLogfileBrowse() +{ + UpdateData(TRUE); + CFileDialog cfd( + FALSE, ".log", (LPCSTR)m_LogFile, + OFN_EXPLORER|OFN_HIDEREADONLY|OFN_LONGNAMES|OFN_NOCHANGEDIR|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST, + "Log files (*.log)|*.log|All Files (*.*)|*.*||", + this); + if(cfd.DoModal()==IDOK) { + m_LogFile = cfd.GetPathName(); + UpdateData(FALSE); + } +} diff --git a/PropsServer.h b/PropsServer.h index 29d85bd..1563479 100644 --- a/PropsServer.h +++ b/PropsServer.h @@ -17,12 +17,14 @@ public: // Dialog Data //{{AFX_DATA(CPropsServer) enum { IDD = IDD_PROPS_SERVER }; + CButton m_LogBrowseCtl; CButton m_BrowseCtl; CSliderCtrl m_PromptTimeoutCtl; int m_RRQMode; CString m_TFTPRoot; BOOL m_TFTPSubdirs; int m_WRQMode; + CString m_LogFile; //}}AFX_DATA @@ -39,6 +41,7 @@ protected: //{{AFX_MSG(CPropsServer) virtual BOOL OnInitDialog(); afx_msg void OnBrowse(); + afx_msg void OnLogfileBrowse(); //}}AFX_MSG DECLARE_MESSAGE_MAP() diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp index b6b8a36..4cb1633 100644 --- a/PumpKINDlg.cpp +++ b/PumpKINDlg.cpp @@ -5,9 +5,11 @@ #include "PumpKIN.h" #include "PumpKINDlg.h" +#include "ACLTargetCombo.h" #include "PropsServer.h" #include "PropsNetwork.h" #include "PropsSounds.h" +#include "PropsACL.h" #include "ConfirmRRQDlg.h" #include "ConfirmWRQDlg.h" #include "RequestDlg.h" @@ -79,6 +81,10 @@ END_MESSAGE_MAP() CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) : CDialog(CPumpKINDlg::IDD, pParent) { + m_Listener.m_Daddy = this; + + m_bListen = TRUE; + m_ListenPort = 69; m_bTFTPSubdirs = TRUE; m_RRQMode = rrqAlwaysConfirm; @@ -107,6 +113,15 @@ CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) ASSERT(m_Retrier); 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(); } @@ -114,6 +129,7 @@ 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); DDX_Control(pDX, IDC_LOG, m_Log); @@ -151,6 +167,8 @@ BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder) 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() @@ -217,6 +235,8 @@ CRect rc, drc; else ShowWindow(SW_HIDE); + m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0); + // CG: The following block was added by the ToolTips component. { // Create the ToolTip control. @@ -324,11 +344,10 @@ int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) if (CDialog::OnCreate(lpCreateStruct) == -1) 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; } if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){ @@ -664,17 +683,22 @@ BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 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; case CPumpKINDlg::rrqAlwaysConfirm: if(ConfirmRequest()) break; + default: + TRACE1("Unexpected access target: %d\n",atar); case CPumpKINDlg::rrqDenyAll: Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); return TRUE; @@ -1107,7 +1131,7 @@ int i = m_Daddy->m_List.FindItem(&lvf); delete this; } -void CPumpKINDlg::LogLine(LPCTSTR str) +void CPumpKINDlg::LogLineToScreen(LPCTSTR str) { ASSERT(m_LogLength); while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){ @@ -1163,12 +1187,14 @@ CPropertySheet cps(IDS_TITLE_OPTIONS,this); CPropsServer server; CPropsNetwork network; CPropsSounds sounds; +CPropsACL acl; server.m_RRQMode=m_RRQMode; server.m_TFTPRoot=m_TFTPRoot; server.m_TFTPSubdirs=m_bTFTPSubdirs; server.m_WRQMode=m_WRQMode; server.m_PromptTimeOut=m_PromptTimeOut; + server.m_LogFile=m_LogFile; network.m_ListenPort=m_ListenPort; network.m_SpeakPort=m_SpeakPort; @@ -1179,15 +1205,19 @@ CPropsSounds sounds; sounds.m_Success = m_bnwSuccess; 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; m_TFTPRoot=server.m_TFTPRoot; m_bTFTPSubdirs=server.m_TFTPSubdirs; m_WRQMode=server.m_WRQMode; m_PromptTimeOut=server.m_PromptTimeOut; + m_LogFile=server.m_LogFile; m_ListenPort=network.m_ListenPort; m_SpeakPort=network.m_SpeakPort; @@ -1197,6 +1227,10 @@ CPropsSounds sounds; m_bnwRequest = sounds.m_Request; m_bnwSuccess = sounds.m_Success; m_bnwAbort = sounds.m_Abort; + + m_aclRules = acl.m_rulist; + + m_lastlogerr.Empty(); } } @@ -1244,8 +1278,10 @@ CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); m_Rename=exists=TRUE; 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){ if(!RenameFile(fn)){ @@ -1268,6 +1304,8 @@ CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); }else break; } + default: + TRACE1("Unexpected access target: %d\n",atar); case CPumpKINDlg::wrqDenyAll: Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); return TRUE; @@ -1795,6 +1833,7 @@ 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); m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort); @@ -1805,6 +1844,7 @@ CWinApp *app = AfxGetApp(); m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode); 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); m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds())); @@ -1816,12 +1856,14 @@ CWinApp *app = AfxGetApp(); m_TFTPRoot.ReleaseBuffer(); } ::SetCurrentDirectory(m_TFTPRoot); + m_aclRules.LoadProfile(app); } 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); app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort); @@ -1832,11 +1874,13 @@ CWinApp *app = AfxGetApp(); app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode); 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); app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()); app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode); app->WriteProfileInt("UISettings","Visble",m_bShown); + m_aclRules.SaveProfile(app); } void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) @@ -1984,3 +2028,52 @@ 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; + } + } + } +} diff --git a/PumpKINDlg.h b/PumpKINDlg.h index 42ae62d..b247c56 100644 --- a/PumpKINDlg.h +++ b/PumpKINDlg.h @@ -113,11 +113,158 @@ public: #define tftpHdrSize (sizeof(tftp)-sizeof(tftp::tftpPacket)) #define tftpSlackSize sizeof(tftp::tftpLength) +struct acl_rule { + enum { + opRRQ=tftp::opRRQ, opWRQ=tftp::opWRQ + }; + int op; + DWORD addr, mask; + enum { + rrqGrant=0, rrqPrompt, rrqDeny, + rrqRules, + rrqNone=-1 + }; + enum { + wrqGrant=0, wrqPromptIfExists, wrqPrompt, wrqDeny, + wrqRules, + wrqNone=-1 + }; + int target; + + acl_rule() + : op(-1), addr(0), mask(0), target(-1) { } + acl_rule(int o,DWORD a,DWORD m,int t) + : op(o), addr(a), mask(m), target(t) { } + acl_rule(const acl_rule& s) + : op(s.op), addr(s.addr), mask(s.mask), target(s.target) { } + + BOOL IsValid() { + if(op==opRRQ) { + if(target=rrqRules) + return FALSE; + }else if(op==opWRQ) { + if(target=wrqRules) + return FALSE; + }else + return FALSE; + return TRUE; + } + + BOOL IsMatch(int o,DWORD a) { + if(o!=op) return FALSE; + if( (a&mask) != (addr&mask)) return FALSE; + return TRUE; + } + + CString str_addr() { + return inet_ntoa(*(struct in_addr*)&addr); + } + CString str_mask() { + return inet_ntoa(*(struct in_addr*)&mask); + } + CString str_target() { + if(op==opRRQ) { + switch(target) { + case rrqNone: return "fallback"; + case rrqGrant: return "grant"; + case rrqPrompt: return "prompt"; + case rrqDeny: return "deny"; + default: return "?"; + } + }else if(op==opWRQ) { + switch(target) { + case wrqNone: return "fallback"; + case wrqGrant: return "grant"; + case wrqPromptIfExists: return "prompt if exists"; + case wrqPrompt: return "prompt"; + case wrqDeny: return "deny"; + default: return "?"; + } + }else + return "?"; + } + + void SaveProfile(CWinApp* app,int i) { + CString n; n.Format("%d",i); + app->WriteProfileInt("ACL","op_"+n,op); + app->WriteProfileString("ACL","addr_"+n,str_addr()); + app->WriteProfileString("ACL","mask_"+n,str_mask()); + app->WriteProfileInt("ACL","target_"+n,target); + } + + void LoadProfile(CWinApp* app,int i) { + CString n; n.Format("%d",i); + op=app->GetProfileInt("ACL","op_"+n,-1); + addr=inet_addr(app->GetProfileString("ACL","addr_"+n)); + mask=inet_addr(app->GetProfileString("ACL","mask_"+n)); + target=app->GetProfileInt("ACL","target_"+n,-1); + } + +}; + +class acl_rules_t : public CArray { +public: + + acl_rules_t& operator=(const acl_rules_t& s) { + // Copy(s); XXX: unsuprisingly, there's a bug in MFC Copy, *pDst++=*pSrc (no ++ for Src) + RemoveAll(); + int ns = s.GetSize(); + SetSize(ns); + for(int i=0;iWriteProfileInt("ACL","rules",s); + } + void LoadProfile(CWinApp* app) { + RemoveAll(); + int s=app->GetProfileInt("ACL","rules",0); + for(int i=0;i CTFTPList; @@ -220,6 +367,11 @@ class CPumpKINDlg : public CDialog { // Construction public: + CString m_lastlogerr; + void LogLine(LPCTSTR str); + CString m_LogFile; + BOOL m_bListen; + acl_rules_t m_aclRules; CString m_bnwRequest; CString m_bnwSuccess; CString m_bnwAbort; @@ -240,7 +392,8 @@ public: UINT m_SpeakPort; void LogLine(UINT msgID); CTimeMap m_LogTimes; - void LogLine(LPCTSTR str); + void LogLineToFile(LPCTSTR str); + void LogLineToScreen(LPCTSTR str); int m_LogLength; enum { subitemFile=0, subitemType, subitemPeer, subitemBytes, subitemTSize @@ -251,15 +404,19 @@ public: CTIDMap m_Xfers; CTimeSpan m_TFTPTimeOut; enum { - rrqGiveAll=0, - rrqAlwaysConfirm, - rrqDenyAll + rrqGiveAll=acl_rule::rrqGrant, + rrqAlwaysConfirm=acl_rule::rrqPrompt, + rrqDenyAll=acl_rule::rrqDeny, + rrqFallback=acl_rule::rrqNone, + rrqGrant=rrqGiveAll, rrqDeny=rrqDenyAll, rrqPrompt=rrqAlwaysConfirm }; enum { - wrqTakeAll=0, - wrqConfirmIfExists, - wrqAlwaysConfirm, - wrqDenyAll + wrqTakeAll=acl_rule::wrqGrant, + wrqConfirmIfExists=acl_rule::wrqPromptIfExists, + wrqAlwaysConfirm=acl_rule::wrqPrompt, + wrqDenyAll=acl_rule::wrqDeny, + wrqFallback=acl_rule::wrqNone, + wrqGrant=wrqTakeAll,wrqDeny=wrqDenyAll, wrqPrompt=wrqAlwaysConfirm }; UINT m_RRQMode; UINT m_WRQMode; @@ -273,6 +430,7 @@ public: // Dialog Data //{{AFX_DATA(CPumpKINDlg) enum { IDD = IDD_PUMPKIN_DIALOG }; + CButton m_ListenCtl; CButton m_AbortCtl; CButton m_OptionsCtl; CListBox m_Log; @@ -310,6 +468,7 @@ protected: afx_msg void OnAbort(); afx_msg void OnClose(); afx_msg void OnTrayShowpumpkinwindow(); + afx_msg void OnTrayListen(); afx_msg void OnTrayExit(); afx_msg void OnTrayAboutpumpkin(); afx_msg void OnTrayFetchfile(); @@ -322,6 +481,7 @@ protected: afx_msg void OnDropFiles(HDROP hDropInfo); virtual void OnCancel(); afx_msg void OnHelp(); + afx_msg void OnListening(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/Trayer.cpp b/Trayer.cpp index 6e8c100..1e1ab3c 100644 --- a/Trayer.cpp +++ b/Trayer.cpp @@ -37,6 +37,7 @@ BEGIN_MESSAGE_MAP(CTrayer, CWnd) ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions) ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile) ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow) + ON_COMMAND(ID_TRAY_LISTEN, OnTrayListen) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -65,6 +66,7 @@ LRESULT CTrayer::OnTray(WPARAM wP,LPARAM lP) m_inMenu++; SetForegroundWindow(); popUp->CheckMenuItem(ID_TRAY_SHOWPUMPKINWINDOW,MF_BYCOMMAND|(IsWindowVisible()?MF_CHECKED:MF_UNCHECKED)); + popUp->CheckMenuItem(ID_TRAY_LISTEN,MF_BYCOMMAND|(m_Daddy->m_Listener.m_bListen?MF_CHECKED:MF_UNCHECKED)); popUp->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this); m_inMenu--; SendMessage(WM_NULL); @@ -116,3 +118,8 @@ void CTrayer::OnTrayShowpumpkinwindow() { m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_SHOWPUMPKINWINDOW); } + +void CTrayer::OnTrayListen() +{ + m_Daddy->SendMessage(WM_COMMAND,ID_TRAY_LISTEN); +} diff --git a/Trayer.h b/Trayer.h index 061a53a..c5a9465 100644 --- a/Trayer.h +++ b/Trayer.h @@ -41,6 +41,7 @@ protected: afx_msg void OnTrayOptions(); afx_msg void OnTraySendfile(); afx_msg void OnTrayShowpumpkinwindow(); + afx_msg void OnTrayListen(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/help/pumpkin.cnt b/help/pumpkin.cnt index 0e09da3..dfe42e5 100644 --- a/help/pumpkin.cnt +++ b/help/pumpkin.cnt @@ -12,3 +12,4 @@ 2 Server Options=ServerOptions 2 Network Options=NetworkOptions 2 Sounds Options=SoundsOptions +2 Access Lists=ACL diff --git a/help/pumpkin.rtf b/help/pumpkin.rtf index b39ca9c..9c02ca9 100644 --- a/help/pumpkin.rtf +++ b/help/pumpkin.rtf @@ -18,7 +18,7 @@ K{\footnote about} \par\sa120\sb120\qj\pard \f1\fs18\sb120 \par\sa120\sb120\qj\pard \f1\fs18\sb120 {\b {\i Enjoy!}} { -\par\pard\plain\sb360\sa120 \f1\fs16 Copyright (c) 1997-2005 {\uldb\cf0 Klever Group (http://www.klever.net/)}{\v %!ExecFile("http://www.klever.net/")} +\par\pard\plain\sb360\sa120 \f1\fs16 Copyright (c) 1997-2006 {\uldb\cf0 Klever Group (http://www.klever.net/)}{\v %!ExecFile("http://www.klever.net/")} \par\qj\sb120\sa120Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \par \sa360 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -28,6 +28,9 @@ K{\footnote about} \pard\plain #{\footnote News} ${\footnote What's New} +\par\pard\plain\f1\fs24\qc\cf2\b 2.7 - February 1st, 2006 +\par\pard\plain\fi0\li0\f1\fs18 \bullet Added acess lists based on request IP address and TFTP opcode for automating access policy +\par\pard\plain\fi0\li0\f1\fs18 \bullet Added possibility to start/stop TFTP server, while keeping client functionality intact \par\pard\plain\f1\fs24\qc\cf2\b 2.6 - August 6th, 2005 \par\pard\plain\fi0\li0\f1\fs18 \bullet more robust solution to the backslash/slash dilemma \par\pard\plain\fi0\li0\f1\fs18 \bullet A bit more elaborate error reporting @@ -112,10 +115,18 @@ ${\footnote Server Options} \page \pard\plain\keepn -#{\footnote SoundsOptoins} +#{\footnote SoundsOptions} ${\footnote Sounds Options} { \f1\fs18\b\sb120 Sounds} \par\sa120\sb120\qj\pard \f1\fs18\sb120 You can customize {\b PumpKIN} sounds notifications here. There are three customizable sounds defined - {\b Incoming request}, which notifies you about incoming request prompt if you're set to be prompted whenever incoming request occurs. {\b xfer Aborted} - which happens to sound every time transfer is interrupted for whatever reason - time out, explicit kill, denied access, etc. {\b xfer Finished} means that your file was successfully transmitted. \par\sa120\sb120\qj\pard \f1\fs18\sb120 You can select any {\b .wav} file or one of the predefined sounds from the dropdown list. \page + +\pard\plain\keepn +#{\footnote ACL} +${\footnote Access Lists} +{ \f1\fs18\b\sb120 Access Lists} +\par\sa120\sb120\qj\pard \f1\fs18\sb120 You can slightly automate your access policies by setting up read/write request behavior for different incoming requests. +\par\sa120\sb120\qj\pard \f1\fs18\sb120 The rule consists of {\b request type}, source networke ({\b ip} and {\b netmask}) and {\b action} to take (see also {\uldb Server Options}{\v ServerOptions}). +\page } \ No newline at end of file diff --git a/help/pumpkin.xml b/help/pumpkin.xml index 38c54ca..944bb54 100644 --- a/help/pumpkin.xml +++ b/help/pumpkin.xml @@ -5,10 +5,14 @@

PumpKIN is a program designed to send and receive files over the net while having T42 or Wintalk session running using TFTP () protocol. It includes full-functional TFTP server/client so it may be useful for maintaining CISCO routers and other network equipment.

Enjoy!

- + + + Added acess lists based on request IP address and TFTP opcode for automating access policy + Added possibility to start/stop TFTP server, while keeping client functionality intact + more robust solution to the backslash/slash dilemma A bit more elaborate error reporting @@ -36,6 +40,7 @@

To Abort transfer(s) currently in progress - select transfer(s) you want to terminate in the list and click Abort xfer button.

You may want to hide PumpKIN window and leave it as a tray icon only. Just click the icon in the tray or simply close the window.

Use Options button to set PumpKIN options.

+

You can start and stop PumpKIN's TFTP server by checking and unchecking the Server is running checkbox in the lower right corner of main PumpKIN window.

Confirm Read Request Dialog @@ -83,9 +88,17 @@
  • Confirmation timeout - this is the time PumpKIN will wait for you to accept or deny request before it will give up and take default action which is always deny.
  • - + Sounds

    You can customize PumpKIN sounds notifications here. There are three customizable sounds defined - Incoming request, which notifies you about incoming request prompt if you're set to be prompted whenever incoming request occurs. xfer Aborted - which happens to sound every time transfer is interrupted for whatever reason - time out, explicit kill, denied access, etc. xfer Finished means that your file was successfully transmitted.

    You can select any .wav file or one of the predefined sounds from the dropdown list.

    + + Access Lists +

    You can slightly automate your access policies by setting up read/write request behavior for different incoming requests.

    +

    The rule consists of request type, source network (ip and netmask) and action to take (see also Server Options).

    +

    When PumpKIN receives request it goes through the list of rules and bases its decision on the first matching rule. To rearrange order of rules, select the rule you wish to move and use up and down arrows buttons on the right. To remove rule, use the cross button.

    +

    To add a new rule fill in the information about request type, source address and netmask and desired action. Then click on the 'Add new rule' button.

    +

    If you wish to amend the rule, select it in the rules list, change parameters below and click the 'Replace rule' button.

    + diff --git a/install/Install.clw b/install/Install.clw new file mode 100644 index 0000000..6775b4c --- a/dev/null +++ b/install/Install.clw @@ -0,0 +1,35 @@ +; CLW file contains information for the MFC ClassWizard + +[General Info] +Version=1 +LastClass= +LastTemplate=CDialog +NewFileInclude1=#include "stdafx.h" +NewFileInclude2=#include "install.h" +LastPage=0 + +ClassCount=0 + +ResourceCount=2 +Resource1=IDD_INSTALLING (FALSE) +Resource2=IDD_PATH + +[DLG:IDD_INSTALLING (FALSE)] +Type=1 +Class=? +ControlCount=4 +Control1=IDCANCEL,button,1342295808 +Control2=IDC_DISKS,SysAnimate32,1342242822 +Control3=IDC_STATE,static,1342308736 +Control4=IDC_PROGRESS,msctls_progress32,1342177280 + +[DLG:IDD_PATH] +Type=1 +Class=? +ControlCount=5 +Control1=IDC_PROMPT,static,1342308352 +Control2=IDC_PATH,edit,1350631552 +Control3=IDC_BROWSE,button,1342242816 +Control4=IDOK,button,1342242817 +Control5=IDCANCEL,button,1342242816 + diff --git a/install/install.cpp b/install/install.cpp index d11de03..cfe4d27 100644 --- a/install/install.cpp +++ b/install/install.cpp @@ -1,7 +1,7 @@ #include "resource.h" #include "../shared-code/install.h" -#define VERSION "2.6" +#define VERSION "2.7" #define KINAME "PumpKIN " VERSION #define SKINAME "PumpKIN" diff --git a/install/install.rc b/install/install.rc index cc621ad..9a03edb 100644 --- a/install/install.rc +++ b/install/install.rc @@ -131,8 +131,8 @@ IDI_ICON ICON DISCARDABLE "../shared-data/install-icon.ico // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,6,0,0 - PRODUCTVERSION 2,6,0,0 + FILEVERSION 2,7,0,0 + PRODUCTVERSION 2,7,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -149,13 +149,13 @@ BEGIN BEGIN VALUE "CompanyName", "Klever Group (http://www.klever.net/)\0" VALUE "FileDescription", "INSTALL: PumpKIN, tftp client/daemon\0" - VALUE "FileVersion", "2, 6, 0, 0\0" + VALUE "FileVersion", "2, 7, 0, 0\0" VALUE "InternalName", "INSTALL\0" - VALUE "LegalCopyright", "Copyright © 1997-2005 Klever Group (http://www.klever.net/)\0" + VALUE "LegalCopyright", "Copyright © 1997-2006 Klever Group (http://www.klever.net/)\0" VALUE "LegalTrademarks", "Klever Group (http://www.klever.net/)\0" VALUE "OriginalFilename", "INSTALL.EXE\0" VALUE "ProductName", "PumpKIN\0" - VALUE "ProductVersion", "2, 6, 0, 0\0" + VALUE "ProductVersion", "2, 7, 0, 0\0" END END BLOCK "VarFileInfo" diff --git a/pumpkin.clw b/pumpkin.clw index 4ae747b..5344bfd 100644 --- a/pumpkin.clw +++ b/pumpkin.clw @@ -2,25 +2,25 @@ [General Info] Version=1 -LastClass=CPropsSounds -LastTemplate=CPropertyPage +LastClass=CPropsServer +LastTemplate=CComboBox NewFileInclude1=#include "stdafx.h" NewFileInclude2=#include "PumpKIN.h" -ClassCount=12 +ClassCount=14 Class1=CPumpKINApp Class2=CPumpKINDlg Class3=CAboutDlg -ResourceCount=9 +ResourceCount=10 Resource1=IDD_REQUEST -Resource2=IDD_PROPS_SERVER +Resource2=IDD_PROPS_NETWORK Resource3=IDD_CONFIRM_RRQ Resource4=IDD_ABOUTBOX Class4=CPropsServer Class5=CPropsNetwork Resource5=IDD_CONFIRM_WRQ -Resource6=IDD_PROPS_NETWORK +Resource6=IDD_PROPS_ACL Class6=CConfirmRRQDlg Class7=CConfirmWRQDlg Resource7=IDD_PUMPKIN_DIALOG @@ -31,6 +31,9 @@ Class11=CTrayer Resource8=IDD_PROPS_SOUNDS Class12=CPropsSounds Resource9=IDM_POPUPS +Class13=CPropsACL +Class14=CACLTargetCombo +Resource10=IDD_PROPS_SERVER [CLS:CPumpKINApp] Type=0 @@ -45,7 +48,7 @@ ImplementationFile=PumpKINDlg.cpp Filter=W BaseClass=CDialog VirtualFilter=dWC -LastObject=ID_HELP +LastObject=CPumpKINDlg [CLS:CAboutDlg] Type=0 @@ -69,7 +72,7 @@ Control5=IDC_KLEVERNET,button,1342242816 [DLG:IDD_PUMPKIN_DIALOG] Type=1 Class=CPumpKINDlg -ControlCount=9 +ControlCount=10 Control1=IDC_CONNECTIONS,SysListView32,1350631681 Control2=IDC_GET,button,1342259200 Control3=IDC_PUT,button,1342259200 @@ -79,11 +82,12 @@ Control6=IDC_EXIT,button,1342259200 Control7=ID_HELP,button,1342259200 Control8=IDC_LOG,listbox,1353728129 Control9=IDCANCEL,button,1073741824 +Control10=IDC_LISTENING,button,1342275619 [DLG:IDD_PROPS_SERVER] Type=1 Class=CPropsServer -ControlCount=15 +ControlCount=18 Control1=IDC_STATIC,button,1342177287 Control2=IDC_TFTPROOT,edit,1350631552 Control3=IDC_BROWSE,button,1342242880 @@ -99,6 +103,9 @@ Control12=IDC_WRQ_ALWAYSCONFIRM,button,1342177289 Control13=IDC_WRQ_DENYALL,button,1342177289 Control14=IDC_STATIC,static,1342308609 Control15=IDC_PROMPTTIMEOUT,msctls_trackbar32,1342242823 +Control16=IDC_STATIC,button,1342177287 +Control17=IDC_LOGFILE,edit,1350631552 +Control18=IDC_LOGFILE_BROWSE,button,1342242880 [DLG:IDD_PROPS_NETWORK] Type=1 @@ -127,7 +134,7 @@ ImplementationFile=PropsServer.cpp BaseClass=CPropertyPage Filter=D VirtualFilter=idWC -LastObject=CPropsServer +LastObject=IDC_LOGFILE_BROWSE [CLS:CPropsNetwork] Type=0 @@ -136,7 +143,7 @@ ImplementationFile=PropsNetwork.cpp BaseClass=CPropertyPage Filter=D VirtualFilter=idWC -LastObject=CPropsNetwork +LastObject=IDC_BLOCKSIZE [DLG:IDD_CONFIRM_RRQ] Type=1 @@ -230,12 +237,13 @@ Class=CPumpKINDlg Command1=ID_TRAY_SENDFILE Command2=ID_TRAY_FETCHFILE Command3=ID_TRAY_OPTIONS -Command4=ID_TRAY_SHOWPUMPKINWINDOW -Command5=ID_TRAY_OPENFILESFOLDER -Command6=ID_TRAY_HELP -Command7=ID_TRAY_ABOUTPUMPKIN -Command8=ID_TRAY_EXIT -CommandCount=8 +Command4=ID_TRAY_LISTEN +Command5=ID_TRAY_SHOWPUMPKINWINDOW +Command6=ID_TRAY_OPENFILESFOLDER +Command7=ID_TRAY_HELP +Command8=ID_TRAY_ABOUTPUMPKIN +Command9=ID_TRAY_EXIT +CommandCount=9 [CLS:CRetrier] Type=0 @@ -281,3 +289,39 @@ Filter=D LastObject=CPropsSounds VirtualFilter=idWC +[DLG:IDD_PROPS_ACL] +Type=1 +Class=CPropsACL +ControlCount=14 +Control1=IDC_ACL_LIST,SysListView32,1350631425 +Control2=IDC_ACL_UP,button,1342246720 +Control3=IDC_ACL_DOWN,button,1342246720 +Control4=IDC_ACL_REMOVE,button,1342246720 +Control5=IDC_STATIC,static,1342308352 +Control6=IDC_ACL_XFER,combobox,1344339971 +Control7=IDC_STATIC,static,1342308352 +Control8=IDC_ACL_ADDR,edit,1350631552 +Control9=IDC_STATIC,static,1342308352 +Control10=IDC_ACL_NETMASK,edit,1350631552 +Control11=IDC_STATIC,static,1342308352 +Control12=IDC_ACL_RULE,combobox,1344339971 +Control13=IDC_ACL_ADD,button,1342242816 +Control14=IDC_ACL_REPLACE,button,1342242816 + +[CLS:CPropsACL] +Type=0 +HeaderFile=PropsACL.h +ImplementationFile=PropsACL.cpp +BaseClass=CPropertyPage +Filter=D +LastObject=CPropsACL +VirtualFilter=idWC + +[CLS:CACLTargetCombo] +Type=0 +HeaderFile=ACLTargetCombo.h +ImplementationFile=ACLTargetCombo.cpp +BaseClass=CComboBox +Filter=W +LastObject=CACLTargetCombo + diff --git a/pumpkin.mak b/pumpkin.mak index bd466fe..7d2ec22 100644 --- a/pumpkin.mak +++ b/pumpkin.mak @@ -66,8 +66,10 @@ ALL : "$(OUTDIR)\pumpkin.exe" "$(OUTDIR)\pumpkin.ex_" "$(OUTDIR)\pumpkin.hlp"\ "$(OUTDIR)\pumpkin.cnt" "$(OUTDIR)\pumpkin.hl_" "$(OUTDIR)\pumpkin.cn_" CLEAN : + -@erase "$(INTDIR)\ACLTargetCombo.obj" -@erase "$(INTDIR)\ConfirmRRQDlg.obj" -@erase "$(INTDIR)\ConfirmWRQDlg.obj" + -@erase "$(INTDIR)\PropsACL.obj" -@erase "$(INTDIR)\PropsNetwork.obj" -@erase "$(INTDIR)\PropsServer.obj" -@erase "$(INTDIR)\PropsSounds.obj" @@ -115,8 +117,10 @@ LINK32=link.exe LINK32_FLAGS=/nologo /subsystem:windows /incremental:no\ /pdb:"$(OUTDIR)/pumpkin.pdb" /machine:I386 /out:"$(OUTDIR)/pumpkin.exe" LINK32_OBJS= \ + "$(INTDIR)\ACLTargetCombo.obj" \ "$(INTDIR)\ConfirmRRQDlg.obj" \ "$(INTDIR)\ConfirmWRQDlg.obj" \ + "$(INTDIR)\PropsACL.obj" \ "$(INTDIR)\PropsNetwork.obj" \ "$(INTDIR)\PropsServer.obj" \ "$(INTDIR)\PropsSounds.obj" \ @@ -169,10 +173,14 @@ ALL : "$(OUTDIR)\pumpkin.exe" "$(OUTDIR)\pumpkin.bsc" "$(OUTDIR)\pumpkin.ex_"\ "$(OUTDIR)\pumpkin.cn_" CLEAN : + -@erase "$(INTDIR)\ACLTargetCombo.obj" + -@erase "$(INTDIR)\ACLTargetCombo.sbr" -@erase "$(INTDIR)\ConfirmRRQDlg.obj" -@erase "$(INTDIR)\ConfirmRRQDlg.sbr" -@erase "$(INTDIR)\ConfirmWRQDlg.obj" -@erase "$(INTDIR)\ConfirmWRQDlg.sbr" + -@erase "$(INTDIR)\PropsACL.obj" + -@erase "$(INTDIR)\PropsACL.sbr" -@erase "$(INTDIR)\PropsNetwork.obj" -@erase "$(INTDIR)\PropsNetwork.sbr" -@erase "$(INTDIR)\PropsServer.obj" @@ -228,8 +236,10 @@ BSC32=bscmake.exe # ADD BSC32 /nologo BSC32_FLAGS=/nologo /o"$(OUTDIR)/pumpkin.bsc" BSC32_SBRS= \ + "$(INTDIR)\ACLTargetCombo.sbr" \ "$(INTDIR)\ConfirmRRQDlg.sbr" \ "$(INTDIR)\ConfirmWRQDlg.sbr" \ + "$(INTDIR)\PropsACL.sbr" \ "$(INTDIR)\PropsNetwork.sbr" \ "$(INTDIR)\PropsServer.sbr" \ "$(INTDIR)\PropsSounds.sbr" \ @@ -252,8 +262,10 @@ LINK32=link.exe LINK32_FLAGS=/nologo /subsystem:windows /incremental:yes\ /pdb:"$(OUTDIR)/pumpkin.pdb" /debug /machine:I386 /out:"$(OUTDIR)/pumpkin.exe" LINK32_OBJS= \ + "$(INTDIR)\ACLTargetCombo.obj" \ "$(INTDIR)\ConfirmRRQDlg.obj" \ "$(INTDIR)\ConfirmWRQDlg.obj" \ + "$(INTDIR)\PropsACL.obj" \ "$(INTDIR)\PropsNetwork.obj" \ "$(INTDIR)\PropsServer.obj" \ "$(INTDIR)\PropsSounds.obj" \ @@ -305,8 +317,10 @@ ALL : "$(OUTDIR)\pumpkin.exe" "$(OUTDIR)\pumpkin.ex_" "$(OUTDIR)\pumpkin.hlp"\ "$(OUTDIR)\pumpkin.cnt" "$(OUTDIR)\pumpkin.hl_" "$(OUTDIR)\pumpkin.cn_" CLEAN : + -@erase "$(INTDIR)\ACLTargetCombo.obj" -@erase "$(INTDIR)\ConfirmRRQDlg.obj" -@erase "$(INTDIR)\ConfirmWRQDlg.obj" + -@erase "$(INTDIR)\PropsACL.obj" -@erase "$(INTDIR)\PropsNetwork.obj" -@erase "$(INTDIR)\PropsServer.obj" -@erase "$(INTDIR)\PropsSounds.obj" @@ -353,8 +367,10 @@ LINK32=link.exe LINK32_FLAGS=/nologo /subsystem:windows /incremental:no\ /pdb:"$(OUTDIR)/pumpkin.pdb" /machine:I386 /out:"$(OUTDIR)/pumpkin.exe" LINK32_OBJS= \ + "$(INTDIR)\ACLTargetCombo.obj" \ "$(INTDIR)\ConfirmRRQDlg.obj" \ "$(INTDIR)\ConfirmWRQDlg.obj" \ + "$(INTDIR)\PropsACL.obj" \ "$(INTDIR)\PropsNetwork.obj" \ "$(INTDIR)\PropsServer.obj" \ "$(INTDIR)\PropsSounds.obj" \ @@ -670,23 +686,29 @@ LINK32_OBJS= \ # Begin Source File SOURCE=.\PumpKIN.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_PUMPK=\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\PumpKIN.obj" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_PUMPK=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\PumpKIN.obj" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -697,6 +719,13 @@ DEP_CPP_PUMPK=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_PUMPK=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\PumpKIN.obj" : $(SOURCE) $(DEP_CPP_PUMPK) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -709,13 +738,18 @@ DEP_CPP_PUMPK=\ # Begin Source File SOURCE=.\PumpKINDlg.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_PUMPKI=\ + ".\ACLTargetCombo.h"\ ".\ConfirmRRQDlg.h"\ ".\ConfirmWRQDlg.h"\ + ".\PropsACL.h"\ ".\PropsNetwork.h"\ ".\PropsServer.h"\ ".\PropsSounds.h"\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\RequestDlg.h"\ ".\Resolver.h"\ @@ -726,15 +760,30 @@ DEP_CPP_PUMPKI=\ ".\Trayer.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\PumpKINDlg.obj" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_PUMPKI=\ + ".\ACLTargetCombo.h"\ + ".\ConfirmRRQDlg.h"\ + ".\ConfirmWRQDlg.h"\ + ".\PropsACL.h"\ + ".\PropsNetwork.h"\ + ".\PropsServer.h"\ + ".\PropsSounds.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\RequestDlg.h"\ + ".\Resolver.h"\ + ".\Retrier.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + ".\Trayer.h"\ + "$(INTDIR)\PumpKINDlg.obj" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -745,6 +794,24 @@ DEP_CPP_PUMPKI=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_PUMPKI=\ + ".\ACLTargetCombo.h"\ + ".\ConfirmRRQDlg.h"\ + ".\ConfirmWRQDlg.h"\ + ".\PropsACL.h"\ + ".\PropsNetwork.h"\ + ".\PropsServer.h"\ + ".\PropsSounds.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\RequestDlg.h"\ + ".\Resolver.h"\ + ".\Retrier.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + ".\Trayer.h"\ + "$(INTDIR)\PumpKINDlg.obj" : $(SOURCE) $(DEP_CPP_PUMPKI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -822,12 +889,15 @@ BuildCmds= \ SOURCE=.\pumpkin.rc DEP_RSC_PUMPKIN=\ + ".\res\down.ico"\ ".\res\failed.wav"\ ".\res\finished.wav"\ ".\res\PumpKIN.ico"\ ".\res\pumpkin.rc2"\ + ".\res\remove.ico"\ ".\res\ring.wav"\ ".\res\rrq.ico"\ + ".\res\up.ico"\ ".\res\wrq.ico"\ ".\shared-data\browse-icon.ico"\ ".\shared-data\klever-background.bmp"\ @@ -951,23 +1021,29 @@ BuildCmds= \ # Begin Source File SOURCE=.\PropsServer.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_PROPS=\ ".\PropsServer.h"\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\PropsServer.obj" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_PROPS=\ + ".\PropsServer.h"\ + ".\pumpkin.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\PropsServer.obj" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -978,6 +1054,13 @@ DEP_CPP_PROPS=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_PROPS=\ + ".\PropsServer.h"\ + ".\pumpkin.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\PropsServer.obj" : $(SOURCE) $(DEP_CPP_PROPS) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -992,7 +1075,7 @@ DEP_CPP_PROPS=\ SOURCE=.\PropsNetwork.cpp DEP_CPP_PROPSN=\ ".\PropsNetwork.h"\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ ".\stdafx.h"\ @@ -1029,24 +1112,31 @@ DEP_CPP_PROPSN=\ # Begin Source File SOURCE=.\ConfirmRRQDlg.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_CONFI=\ ".\ConfirmRRQDlg.h"\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\ConfirmRRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_CONFI=\ + ".\ConfirmRRQDlg.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\ConfirmRRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1057,6 +1147,14 @@ DEP_CPP_CONFI=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_CONFI=\ + ".\ConfirmRRQDlg.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\ConfirmRRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1069,24 +1167,31 @@ DEP_CPP_CONFI=\ # Begin Source File SOURCE=.\ConfirmWRQDlg.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_CONFIR=\ ".\ConfirmWRQDlg.h"\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\ConfirmWRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_CONFIR=\ + ".\ConfirmWRQDlg.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\ConfirmWRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1097,6 +1202,14 @@ DEP_CPP_CONFIR=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_CONFIR=\ + ".\ConfirmWRQDlg.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\ConfirmWRQDlg.obj" : $(SOURCE) $(DEP_CPP_CONFIR) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1110,7 +1223,7 @@ DEP_CPP_CONFIR=\ SOURCE=.\RequestDlg.cpp DEP_CPP_REQUE=\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\RequestDlg.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ @@ -1148,8 +1261,11 @@ DEP_CPP_REQUE=\ # Begin Source File SOURCE=.\Resolver.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_RESOL=\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\Resolver.h"\ ".\shared-code\BellsNWhistles.h"\ @@ -1157,15 +1273,19 @@ DEP_CPP_RESOL=\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\Resolver.obj" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_RESOL=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\Resolver.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\Resolver.obj" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1176,6 +1296,14 @@ DEP_CPP_RESOL=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_RESOL=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\Resolver.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\Resolver.obj" : $(SOURCE) $(DEP_CPP_RESOL) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1188,8 +1316,11 @@ DEP_CPP_RESOL=\ # Begin Source File SOURCE=.\Retrier.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_RETRI=\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\Retrier.h"\ ".\shared-code\BellsNWhistles.h"\ @@ -1197,15 +1328,19 @@ DEP_CPP_RETRI=\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\Retrier.obj" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_RETRI=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\Retrier.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\Retrier.obj" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1216,6 +1351,14 @@ DEP_CPP_RETRI=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_RETRI=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\Retrier.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\Retrier.obj" : $(SOURCE) $(DEP_CPP_RETRI) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1228,8 +1371,11 @@ DEP_CPP_RETRI=\ # Begin Source File SOURCE=.\Trayer.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_TRAYE=\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ @@ -1237,15 +1383,19 @@ DEP_CPP_TRAYE=\ ".\Trayer.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\Trayer.obj" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_TRAYE=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + ".\Trayer.h"\ + "$(INTDIR)\Trayer.obj" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1256,6 +1406,14 @@ DEP_CPP_TRAYE=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_TRAYE=\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + ".\Trayer.h"\ + "$(INTDIR)\Trayer.obj" : $(SOURCE) $(DEP_CPP_TRAYE) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1288,24 +1446,31 @@ SOURCE=.\help\pumpkin.cnt # Begin Source File SOURCE=.\PropsSounds.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + DEP_CPP_PROPSS=\ ".\PropsSounds.h"\ - ".\PumpKIN.h"\ + ".\pumpkin.h"\ ".\PumpKINDlg.h"\ ".\shared-code\BellsNWhistles.h"\ ".\shared-code\kHelpers.h"\ ".\stdafx.h"\ -!IF "$(CFG)" == "PumpKIN - Win32 Release" - - "$(INTDIR)\PropsSounds.obj" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" !ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" +DEP_CPP_PROPSS=\ + ".\PropsSounds.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\PropsSounds.obj" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1316,6 +1481,14 @@ DEP_CPP_PROPSS=\ !ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" +DEP_CPP_PROPSS=\ + ".\PropsSounds.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + "$(INTDIR)\PropsSounds.obj" : $(SOURCE) $(DEP_CPP_PROPSS) "$(INTDIR)"\ "$(INTDIR)\pumpkin.pch" @@ -1324,6 +1497,119 @@ DEP_CPP_PROPSS=\ !ENDIF # End Source File +################################################################################ +# Begin Source File + +SOURCE=.\PropsACL.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + +DEP_CPP_PROPSA=\ + ".\ACLTargetCombo.h"\ + ".\PropsACL.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + + +"$(INTDIR)\PropsACL.obj" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + + +!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" + +DEP_CPP_PROPSA=\ + ".\ACLTargetCombo.h"\ + ".\PropsACL.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + + +"$(INTDIR)\PropsACL.obj" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + +"$(INTDIR)\PropsACL.sbr" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + + +!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" + +DEP_CPP_PROPSA=\ + ".\ACLTargetCombo.h"\ + ".\PropsACL.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + + +"$(INTDIR)\PropsACL.obj" : $(SOURCE) $(DEP_CPP_PROPSA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + + +!ENDIF + +# End Source File +################################################################################ +# Begin Source File + +SOURCE=.\ACLTargetCombo.cpp + +!IF "$(CFG)" == "PumpKIN - Win32 Release" + +DEP_CPP_ACLTA=\ + ".\ACLTargetCombo.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + + +"$(INTDIR)\ACLTargetCombo.obj" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + + +!ELSEIF "$(CFG)" == "PumpKIN - Win32 Debug" + +DEP_CPP_ACLTA=\ + ".\ACLTargetCombo.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + + +"$(INTDIR)\ACLTargetCombo.obj" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + +"$(INTDIR)\ACLTargetCombo.sbr" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + + +!ELSEIF "$(CFG)" == "PumpKIN - Win32 Static" + +DEP_CPP_ACLTA=\ + ".\ACLTargetCombo.h"\ + ".\pumpkin.h"\ + ".\PumpKINDlg.h"\ + ".\shared-code\BellsNWhistles.h"\ + ".\shared-code\kHelpers.h"\ + ".\stdafx.h"\ + + +"$(INTDIR)\ACLTargetCombo.obj" : $(SOURCE) $(DEP_CPP_ACLTA) "$(INTDIR)"\ + "$(INTDIR)\pumpkin.pch" + + +!ENDIF + +# End Source File # End Target ################################################################################ # Begin Target diff --git a/pumpkin.rc b/pumpkin.rc index 7dafe04..87745db 100644 --- a/pumpkin.rc +++ b/pumpkin.rc @@ -70,6 +70,9 @@ IDI_WRQ ICON DISCARDABLE "res\\rrq.ico" IDI_BROWSE ICON DISCARDABLE "shared-data/browse-icon.ico" IDR_MAINFRAME ICON DISCARDABLE "res\\pumpkin.ico" IDI_PLAY ICON DISCARDABLE "shared-data/play-icon.ico" +IDI_UP ICON DISCARDABLE "res\\up.ico" +IDI_DOWN ICON DISCARDABLE "res\\down.ico" +IDI_REMOVE ICON DISCARDABLE "res\\remove.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -82,20 +85,20 @@ CAPTION "About PumpKIN" FONT 8, "MS Sans Serif" BEGIN ICON IDR_MAINFRAME,IDC_STATIC,7,17,18,20 - LTEXT "PumpKIN, Version 2.6",IDC_STATIC,40,15,119,8, + LTEXT "PumpKIN, Version 2.7",IDC_STATIC,40,15,119,8, SS_NOPREFIX - LTEXT "Copyright © 1997-2005 Klever Group",IDC_STATIC,40,30, + LTEXT "Copyright © 1997-2006 Klever Group",IDC_STATIC,40,30, 170,8 DEFPUSHBUTTON "OK",IDOK,178,7,32,14,WS_GROUP PUSHBUTTON "http://www.klever.net/",IDC_KLEVERNET,124,53,86,14 END -IDD_PUMPKIN_DIALOG DIALOGEX 0, 0, 362, 191 +IDD_PUMPKIN_DIALOG DIALOGEX 0, 0, 362, 193 STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_ACCEPTFILES | WS_EX_APPWINDOW CAPTION " PumpKIN" -FONT 8, "MS Sans Serif", 0, 0, 0x1 +FONT 8, "MS Sans Serif" BEGIN CONTROL "List1",IDC_CONNECTIONS,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,7,7,295,108, @@ -110,52 +113,60 @@ BEGIN WS_EX_CLIENTEDGE PUSHBUTTON "E&xit",IDC_EXIT,305,79,50,17,BS_NOTIFY,WS_EX_CLIENTEDGE PUSHBUTTON "&Help",ID_HELP,305,97,50,17,BS_NOTIFY,WS_EX_CLIENTEDGE - LISTBOX IDC_LOG,7,115,348,69,LBS_USETABSTOPS | LBS_NOSEL | + LISTBOX IDC_LOG,7,115,348,65,LBS_USETABSTOPS | LBS_NOSEL | WS_VSCROLL | WS_HSCROLL,WS_EX_DLGMODALFRAME PUSHBUTTON "..",IDCANCEL,0,183,6,7,NOT WS_VISIBLE | NOT WS_TABSTOP + CONTROL "&Server is running",IDC_LISTENING,"Button", + BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | WS_TABSTOP,286, + 180,69,11,WS_EX_TRANSPARENT | WS_EX_STATICEDGE END -IDD_PROPS_SERVER DIALOG DISCARDABLE 0, 0, 210, 154 +IDD_PROPS_SERVER DIALOG DISCARDABLE 0, 0, 300, 201 STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Server" FONT 8, "MS Sans Serif" BEGIN GROUPBOX "TFTP filesystem &root (download path)",IDC_STATIC,7,7, - 196,38 - EDITTEXT IDC_TFTPROOT,13,16,170,13,ES_AUTOHSCROLL - PUSHBUTTON "&B",IDC_BROWSE,186,16,13,13,BS_ICON + 286,38 + EDITTEXT IDC_TFTPROOT,13,16,256,13,ES_AUTOHSCROLL + PUSHBUTTON "&B",IDC_BROWSE,274,16,13,13,BS_ICON CONTROL "Allow access to &subdirectories",IDC_TFTPSUBDIRS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,31,111,10 - GROUPBOX "Read Request Behavior",IDC_STATIC,7,48,153,42 + GROUPBOX "Read Request Behavior",IDC_STATIC,7,48,243,56 CONTROL "Give &all files",IDC_RRQ_GIVEALL,"Button", - BS_AUTORADIOBUTTON | BS_NOTIFY | WS_GROUP,13,57,53,10 + BS_AUTORADIOBUTTON | BS_NOTIFY | WS_GROUP,13,63,53,10 CONTROL "&Prompt before giving file",IDC_RRQ_ALWAYSCONFIRM, - "Button",BS_AUTORADIOBUTTON | BS_NOTIFY,23,67,91,10 + "Button",BS_AUTORADIOBUTTON | BS_NOTIFY,43,75,91,10 CONTROL "&Deny all requests",IDC_RRQ_DENYALL,"Button", - BS_AUTORADIOBUTTON | BS_NOTIFY,33,77,70,10 - GROUPBOX "Write Request Behavior",IDC_STATIC,7,93,172,54,WS_GROUP + BS_AUTORADIOBUTTON | BS_NOTIFY,73,87,70,10 + GROUPBOX "Write Request Behavior",IDC_STATIC,7,106,243,56, + WS_GROUP CONTROL "Take a&ll files",IDC_WRQ_TAKEALL,"Button", - BS_AUTORADIOBUTTON | WS_GROUP,13,103,55,10 + BS_AUTORADIOBUTTON | WS_GROUP,13,116,55,10 CONTROL "Prompt if file &exists",IDC_WRQ_PROMPTEXISTING,"Button", - BS_AUTORADIOBUTTON,23,113,73,10 + BS_AUTORADIOBUTTON,43,126,73,10 CONTROL "Always pro&mpt before accepting file", - IDC_WRQ_ALWAYSCONFIRM,"Button",BS_AUTORADIOBUTTON,33,123, + IDC_WRQ_ALWAYSCONFIRM,"Button",BS_AUTORADIOBUTTON,73,136, 139,10 CONTROL "D&eny all requests",IDC_WRQ_DENYALL,"Button", - BS_AUTORADIOBUTTON,43,133,70,10 - CTEXT "Confirmation &timeout",IDC_STATIC,163,52,40,19, + BS_AUTORADIOBUTTON,103,146,70,10 + CTEXT "Confirmation &timeout",IDC_STATIC,253,52,40,19, SS_NOTIFY CONTROL "Slider1",IDC_PROMPTTIMEOUT,"msctls_trackbar32", - TBS_AUTOTICKS | TBS_VERT | TBS_TOP | WS_TABSTOP,182,73, - 21,74 + TBS_AUTOTICKS | TBS_VERT | TBS_TOP | WS_TABSTOP,272,72, + 21,90 + GROUPBOX "Log file (leave empty to disable logging to file)", + IDC_STATIC,7,165,286,29 + EDITTEXT IDC_LOGFILE,13,175,256,13,ES_AUTOHSCROLL + PUSHBUTTON "",IDC_LOGFILE_BROWSE,274,175,13,13,BS_ICON END -IDD_PROPS_NETWORK DIALOG DISCARDABLE 0, 0, 210, 154 +IDD_PROPS_NETWORK DIALOG DISCARDABLE 0, 0, 300, 201 STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Network" FONT 8, "MS Sans Serif" BEGIN - GROUPBOX "UDP Ports",IDC_STATIC,7,7,196,40 + GROUPBOX "UDP Ports",IDC_STATIC,7,7,286,40 RTEXT "Listen for &incoming requests on port:",IDC_STATIC,13, 18,135,8 EDITTEXT IDC_LISTENPORT,154,16,40,13,ES_AUTOHSCROLL @@ -257,26 +268,54 @@ BEGIN CONTROL "",IDC_STATIC,"Static",SS_ETCHEDVERT,52,32,1,11 END -IDD_PROPS_SOUNDS DIALOG DISCARDABLE 0, 0, 210, 154 +IDD_PROPS_SOUNDS DIALOG DISCARDABLE 0, 0, 300, 201 STYLE WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Sounds" FONT 8, "MS Sans Serif" BEGIN LTEXT "&Incoming request:",IDC_STATIC,7,9,57,8 - COMBOBOX IDC_RING,70,7,103,100,CBS_DROPDOWN | CBS_AUTOHSCROLL | + COMBOBOX IDC_RING,70,7,188,100,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "browse",IDC_RING_BROWSE,175,7,13,13,BS_ICON - PUSHBUTTON "play",IDC_RING_PLAY,190,7,13,13,BS_ICON + PUSHBUTTON "browse",IDC_RING_BROWSE,263,7,13,13,BS_ICON + PUSHBUTTON "play",IDC_RING_PLAY,280,7,13,13,BS_ICON LTEXT "xfer &finished:",IDC_STATIC,7,25,57,8 - COMBOBOX IDC_FINISHED,70,22,103,100,CBS_DROPDOWN | + COMBOBOX IDC_FINISHED,70,22,188,100,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "browse",IDC_FINISHED_BROWSE,175,22,13,13,BS_ICON - PUSHBUTTON "play",IDC_FINISHED_PLAY,190,22,13,13,BS_ICON + PUSHBUTTON "browse",IDC_FINISHED_BROWSE,263,22,13,13,BS_ICON + PUSHBUTTON "play",IDC_FINISHED_PLAY,280,22,13,13,BS_ICON LTEXT "xfer &aborted:",IDC_STATIC,7,40,57,8 - COMBOBOX IDC_ABORTED,70,37,103,100,CBS_DROPDOWN | CBS_AUTOHSCROLL | + COMBOBOX IDC_ABORTED,70,37,188,100,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "browse",IDC_ABORTED_BROWSE,175,37,13,13,BS_ICON - PUSHBUTTON "play",IDC_ABORTED_PLAY,190,37,13,13,BS_ICON + PUSHBUTTON "browse",IDC_ABORTED_BROWSE,263,37,13,13,BS_ICON + PUSHBUTTON "play",IDC_ABORTED_PLAY,280,37,13,13,BS_ICON +END + +IDD_PROPS_ACL DIALOG DISCARDABLE 0, 0, 300, 201 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Access Lists" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "List1",IDC_ACL_LIST,"SysListView32",LVS_REPORT | + WS_BORDER | WS_TABSTOP,7,7,258,110 + PUSHBUTTON "&Up",IDC_ACL_UP,273,7,20,30,BS_ICON | BS_CENTER | + BS_VCENTER + PUSHBUTTON "&Down",IDC_ACL_DOWN,273,87,20,30,BS_ICON | BS_CENTER | + BS_VCENTER + PUSHBUTTON "&Remove",IDC_ACL_REMOVE,273,47,20,30,BS_ICON | + BS_CENTER | BS_VCENTER + LTEXT "If",IDC_STATIC,13,128,8,8 + COMBOBOX IDC_ACL_XFER,21,125,48,67,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + LTEXT "request comes from the address in the network", + IDC_STATIC,71,128,122,8 + EDITTEXT IDC_ACL_ADDR,47,143,80,12,ES_AUTOHSCROLL + LTEXT "with netmask",IDC_STATIC,129,145,41,8 + EDITTEXT IDC_ACL_NETMASK,173,143,80,12,ES_AUTOHSCROLL + LTEXT "then",IDC_STATIC,124,160,15,8 + COMBOBOX IDC_ACL_RULE,143,158,123,117,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&Add new rule",IDC_ACL_ADD,7,178,130,16 + PUSHBUTTON "&Replace rule",IDC_ACL_REPLACE,152,178,130,16 END @@ -287,8 +326,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,6,0,0 - PRODUCTVERSION 2,6,0,0 + FILEVERSION 2,7,0,0 + PRODUCTVERSION 2,7,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -305,13 +344,13 @@ BEGIN BEGIN VALUE "CompanyName", "Klever Group (http://www.klever.net/)\0" VALUE "FileDescription", "PumpKIN, tftp client/daemon\0" - VALUE "FileVersion", "2, 6, 0, 0\0" + VALUE "FileVersion", "2, 7, 0, 0\0" VALUE "InternalName", "PUMPKIN\0" - VALUE "LegalCopyright", "Copyright © 1997-2005 Klever Group (http://www.klever.net)\0" + VALUE "LegalCopyright", "Copyright © 1997-2006 Klever Group (http://www.klever.net)\0" VALUE "LegalTrademarks", "Klever Group (http://www.klever.net/)\0" VALUE "OriginalFilename", "PUMPKIN.EXE\0" VALUE "ProductName", "PumpKIN\0" - VALUE "ProductVersion", "2, 6, 0, 0\0" + VALUE "ProductVersion", "2, 7, 0, 0\0" END END BLOCK "VarFileInfo" @@ -344,24 +383,24 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 355 TOPMARGIN, 7 - BOTTOMMARGIN, 184 + BOTTOMMARGIN, 186 HORZGUIDE, 115 END IDD_PROPS_SERVER, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 203 + RIGHTMARGIN, 293 TOPMARGIN, 7 - BOTTOMMARGIN, 147 + BOTTOMMARGIN, 194 END IDD_PROPS_NETWORK, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 203 + RIGHTMARGIN, 293 TOPMARGIN, 7 - BOTTOMMARGIN, 147 + BOTTOMMARGIN, 194 END IDD_CONFIRM_RRQ, DIALOG @@ -391,9 +430,19 @@ BEGIN IDD_PROPS_SOUNDS, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 203 + RIGHTMARGIN, 293 TOPMARGIN, 7 - BOTTOMMARGIN, 147 + BOTTOMMARGIN, 194 + END + + IDD_PROPS_ACL, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 293 + TOPMARGIN, 7 + BOTTOMMARGIN, 194 + HORZGUIDE, 117 + HORZGUIDE, 125 END END #endif // APSTUDIO_INVOKED @@ -439,6 +488,25 @@ BEGIN 0 END +IDD_PROPS_ACL DLGINIT +BEGIN + IDC_ACL_XFER, 0x403, 5, 0 +0x6572, 0x6461, "\000" + IDC_ACL_XFER, 0x403, 6, 0 +0x7277, 0x7469, 0x0065, + IDC_ACL_RULE, 0x403, 12, 0 +0x6361, 0x6563, 0x7470, 0x6620, 0x6c69, 0x0065, + IDC_ACL_RULE, 0x403, 33, 0 +0x6361, 0x6563, 0x7470, 0x6120, 0x646e, 0x7220, 0x6e65, 0x6d61, 0x2065, +0x6669, 0x6620, 0x6c69, 0x2065, 0x7865, 0x7369, 0x7374, "\000" + IDC_ACL_RULE, 0x403, 12, 0 +0x6572, 0x656a, 0x7463, 0x6620, 0x6c69, 0x0065, + IDC_ACL_RULE, 0x403, 31, 0 +0x6166, 0x6c6c, 0x6162, 0x6b63, 0x7420, 0x206f, 0x6874, 0x2065, 0x6c67, +0x626f, 0x6c61, 0x7320, 0x7465, 0x6974, 0x676e, "\000" + 0 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -452,6 +520,7 @@ BEGIN MENUITEM "&Send File", ID_TRAY_SENDFILE MENUITEM "F&etch file", ID_TRAY_FETCHFILE MENUITEM "&Options", ID_TRAY_OPTIONS + MENUITEM "&Listen to requests", ID_TRAY_LISTEN MENUITEM "Show &PumpKIN Window", ID_TRAY_SHOWPUMPKINWINDOW MENUITEM "Open &Files Folder", ID_TRAY_OPENFILESFOLDER MENUITEM SEPARATOR @@ -533,6 +602,7 @@ BEGIN ID_TRAY_OPTIONS "Set PumpKIN options" ID_TRAY_SHOWPUMPKINWINDOW "Show main window" ID_TRAY_OPENFILESFOLDER "Explore TFTP root folder" + ID_TRAY_LISTEN "Listen for incoming requests" END STRINGTABLE DISCARDABLE @@ -572,6 +642,9 @@ BEGIN IDS_FILTER_WAV "Sound Files (*.wav)|*.wav||" IDS_TITLE_WAV "Select sound.." IDS_BOX_CANTBIND "Failed to create listening socket. The port may be in use by another application." + IDS_NO_XFER_OP "No request type specified." + IDS_INVALID_IP "Invalid IP address." + IDS_INVALID_NETMASK "Invalid netmask." END STRINGTABLE DISCARDABLE @@ -579,6 +652,12 @@ BEGIN AFX_IDS_APP_TITLE "PUMPKIN" END +STRINGTABLE DISCARDABLE +BEGIN + IDS_INVALID_RULE "Invalid access rule." + IDS_LOG_LOGERROR "Error logging to '%s'" +END + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/res/down.ico b/res/down.ico new file mode 100644 index 0000000..433e718 --- a/dev/null +++ b/res/down.ico Binary files differ diff --git a/res/remove.ico b/res/remove.ico new file mode 100644 index 0000000..8e4473d --- a/dev/null +++ b/res/remove.ico Binary files differ diff --git a/res/up.ico b/res/up.ico new file mode 100644 index 0000000..32f684b --- a/dev/null +++ b/res/up.ico Binary files differ diff --git a/resource.h b/resource.h index 8755a55..1bdce59 100644 --- a/resource.h +++ b/resource.h @@ -73,12 +73,21 @@ #define IDS_OTALXAT 149 #define IDI_PLAY 149 #define IDS_TFTP_ERROR_TSIZE 150 +#define IDD_PROPS_ACL 150 #define IDS_TFTP_ERROR_BSIZE 151 #define IDS_TFTP_ERROR_TOUT 152 +#define IDI_UP 152 #define IDS_SELECT_TFTPROOT 153 +#define IDI_DOWN 153 #define IDS_FILTER_WAV 154 +#define IDI_REMOVE 154 #define IDS_TITLE_WAV 155 #define IDS_BOX_CANTBIND 156 +#define IDS_NO_XFER_OP 157 +#define IDS_INVALID_IP 158 +#define IDS_INVALID_NETMASK 159 +#define IDS_INVALID_RULE 160 +#define IDS_LOG_LOGERROR 161 #define IDC_KLEVERNET 1000 #define IDC_CONNECTIONS 1001 #define IDC_LOG 1003 @@ -121,12 +130,25 @@ #define IDC_RING 1041 #define IDC_RING_BROWSE 1042 #define IDC_RING_PLAY 1043 +#define IDC_ACL_LIST 1043 #define IDC_FINISHED 1044 +#define IDC_ACL_UP 1044 #define IDC_FINISHED_BROWSE 1045 +#define IDC_ACL_DOWN 1045 #define IDC_FINISHED_PLAY 1046 +#define IDC_ACL_REMOVE 1046 #define IDC_ABORTED 1047 +#define IDC_ACL_ADDR 1047 #define IDC_ABORTED_BROWSE 1048 +#define IDC_ACL_RULE 1048 #define IDC_ABORTED_PLAY 1049 +#define IDC_ACL_NETMASK 1049 +#define IDC_ACL_ADD 1050 +#define IDC_ACL_XFER 1051 +#define IDC_ACL_REPLACE 1052 +#define IDC_LISTENING 1052 +#define IDC_LOGFILE 1053 +#define IDC_LOGFILE_BROWSE 1054 #define ID_TRAY_HELP 32771 #define ID_TRAY_ABOUTPUMPKIN 32772 #define ID_TRAY_EXIT 32773 @@ -135,14 +157,15 @@ #define ID_TRAY_OPTIONS 32776 #define ID_TRAY_SHOWPUMPKINWINDOW 32777 #define ID_TRAY_OPENFILESFOLDER 32778 +#define ID_TRAY_LISTEN 32780 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 150 -#define _APS_NEXT_COMMAND_VALUE 32780 -#define _APS_NEXT_CONTROL_VALUE 1043 +#define _APS_NEXT_RESOURCE_VALUE 155 +#define _APS_NEXT_COMMAND_VALUE 32781 +#define _APS_NEXT_CONTROL_VALUE 1055 #define _APS_NEXT_SYMED_VALUE 102 #endif #endif -- cgit v0.9.0.2