author | Michael Krelin <hacker@klever.net> | 2006-02-02 23:07:50 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2006-02-02 23:07:50 (UTC) |
commit | 39bb4331674cc77560a546f4f9b14b143603d4be (patch) (unidiff) | |
tree | fbbc1006c655888a5483ddd359c52b863e7a27ab /PumpKINDlg.cpp | |
parent | fedc32eb7d20e5278a2125ead3ed125dc63b5746 (diff) | |
download | pumpkin-39bb4331674cc77560a546f4f9b14b143603d4be.zip pumpkin-39bb4331674cc77560a546f4f9b14b143603d4be.tar.gz pumpkin-39bb4331674cc77560a546f4f9b14b143603d4be.tar.bz2 |
- 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
-rw-r--r-- | PumpKINDlg.cpp | 109 |
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,267 +1,287 @@ | |||
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 |
23 | static char THIS_FILE[] = __FILE__; | 25 | static char THIS_FILE[] = __FILE__; |
24 | #endif | 26 | #endif |
25 | 27 | ||
26 | IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket) | 28 | IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket) |
27 | IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket) | 29 | IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket) |
28 | IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket) | 30 | IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket) |
29 | 31 | ||
30 | ///////////////////////////////////////////////////////////////////////////// | 32 | ///////////////////////////////////////////////////////////////////////////// |
31 | // CAboutDlg dialog used for App About | 33 | // CAboutDlg dialog used for App About |
32 | 34 | ||
33 | class CAboutDlg : public CDialog | 35 | class CAboutDlg : public CDialog |
34 | { | 36 | { |
35 | public: | 37 | public: |
36 | CAboutDlg(); | 38 | CAboutDlg(); |
37 | 39 | ||
38 | // Dialog Data | 40 | // Dialog Data |
39 | //{{AFX_DATA(CAboutDlg) | 41 | //{{AFX_DATA(CAboutDlg) |
40 | enum { IDD = IDD_ABOUTBOX }; | 42 | enum { IDD = IDD_ABOUTBOX }; |
41 | //}}AFX_DATA | 43 | //}}AFX_DATA |
42 | 44 | ||
43 | // ClassWizard generated virtual function overrides | 45 | // ClassWizard generated virtual function overrides |
44 | //{{AFX_VIRTUAL(CAboutDlg) | 46 | //{{AFX_VIRTUAL(CAboutDlg) |
45 | protected: | 47 | protected: |
46 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support | 48 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support |
47 | //}}AFX_VIRTUAL | 49 | //}}AFX_VIRTUAL |
48 | 50 | ||
49 | // Implementation | 51 | // Implementation |
50 | protected: | 52 | protected: |
51 | //{{AFX_MSG(CAboutDlg) | 53 | //{{AFX_MSG(CAboutDlg) |
52 | afx_msg void OnKlevernet(); | 54 | afx_msg void OnKlevernet(); |
53 | //}}AFX_MSG | 55 | //}}AFX_MSG |
54 | DECLARE_MESSAGE_MAP() | 56 | DECLARE_MESSAGE_MAP() |
55 | }; | 57 | }; |
56 | 58 | ||
57 | CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) | 59 | CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) |
58 | { | 60 | { |
59 | //{{AFX_DATA_INIT(CAboutDlg) | 61 | //{{AFX_DATA_INIT(CAboutDlg) |
60 | //}}AFX_DATA_INIT | 62 | //}}AFX_DATA_INIT |
61 | } | 63 | } |
62 | 64 | ||
63 | void CAboutDlg::DoDataExchange(CDataExchange* pDX) | 65 | void CAboutDlg::DoDataExchange(CDataExchange* pDX) |
64 | { | 66 | { |
65 | CDialog::DoDataExchange(pDX); | 67 | CDialog::DoDataExchange(pDX); |
66 | //{{AFX_DATA_MAP(CAboutDlg) | 68 | //{{AFX_DATA_MAP(CAboutDlg) |
67 | //}}AFX_DATA_MAP | 69 | //}}AFX_DATA_MAP |
68 | } | 70 | } |
69 | 71 | ||
70 | BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) | 72 | BEGIN_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 |
74 | END_MESSAGE_MAP() | 76 | END_MESSAGE_MAP() |
75 | 77 | ||
76 | ///////////////////////////////////////////////////////////////////////////// | 78 | ///////////////////////////////////////////////////////////////////////////// |
77 | // CPumpKINDlg dialog | 79 | // CPumpKINDlg dialog |
78 | 80 | ||
79 | CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) | 81 | CPumpKINDlg::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; |
94 | m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource); | 100 | m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource); |
95 | m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource); | 101 | m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource); |
96 | m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource); | 102 | m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource); |
97 | m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone); | 103 | m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone); |
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 | ||
113 | void CPumpKINDlg::DoDataExchange(CDataExchange* pDX) | 128 | void 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 | ||
124 | BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) | 140 | BEGIN_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() |
129 | ON_WM_QUERYDRAGICON() | 145 | ON_WM_QUERYDRAGICON() |
130 | ON_WM_CREATE() | 146 | ON_WM_CREATE() |
131 | ON_BN_CLICKED(IDC_OPTIONS, OnOptions) | 147 | ON_BN_CLICKED(IDC_OPTIONS, OnOptions) |
132 | ON_WM_TIMER() | 148 | ON_WM_TIMER() |
133 | ON_BN_CLICKED(IDC_EXIT, OnExit) | 149 | ON_BN_CLICKED(IDC_EXIT, OnExit) |
134 | ON_BN_CLICKED(IDC_PUT, OnPut) | 150 | ON_BN_CLICKED(IDC_PUT, OnPut) |
135 | ON_BN_CLICKED(IDC_GET, OnGet) | 151 | ON_BN_CLICKED(IDC_GET, OnGet) |
136 | ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections) | 152 | ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections) |
137 | ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections) | 153 | ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections) |
138 | ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections) | 154 | ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections) |
139 | ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections) | 155 | ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections) |
140 | ON_BN_CLICKED(IDC_ABORT, OnAbort) | 156 | ON_BN_CLICKED(IDC_ABORT, OnAbort) |
141 | ON_WM_CLOSE() | 157 | ON_WM_CLOSE() |
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 |
155 | END_MESSAGE_MAP() | 173 | END_MESSAGE_MAP() |
156 | 174 | ||
157 | ///////////////////////////////////////////////////////////////////////////// | 175 | ///////////////////////////////////////////////////////////////////////////// |
158 | // CPumpKINDlg message handlers | 176 | // CPumpKINDlg message handlers |
159 | 177 | ||
160 | BOOL CPumpKINDlg::OnInitDialog() | 178 | BOOL 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 | ||
166 | // IDM_ABOUTBOX must be in the system command range. | 184 | // IDM_ABOUTBOX must be in the system command range. |
167 | ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); | 185 | ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); |
168 | ASSERT(IDM_ABOUTBOX < 0xF000); | 186 | ASSERT(IDM_ABOUTBOX < 0xF000); |
169 | 187 | ||
170 | CMenu* pSysMenu = GetSystemMenu(FALSE); | 188 | CMenu* pSysMenu = GetSystemMenu(FALSE); |
171 | CString strAboutMenu; | 189 | CString strAboutMenu; |
172 | strAboutMenu.LoadString(IDS_ABOUTBOX); | 190 | strAboutMenu.LoadString(IDS_ABOUTBOX); |
173 | if (!strAboutMenu.IsEmpty()) | 191 | if (!strAboutMenu.IsEmpty()) |
174 | { | 192 | { |
175 | pSysMenu->AppendMenu(MF_SEPARATOR); | 193 | pSysMenu->AppendMenu(MF_SEPARATOR); |
176 | pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); | 194 | pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); |
177 | } | 195 | } |
178 | 196 | ||
179 | // Set the icon for this dialog. The framework does this automatically | 197 | // Set the icon for this dialog. The framework does this automatically |
180 | // when the application's main window is not a dialog | 198 | // when the application's main window is not a dialog |
181 | SetIcon(m_hIcon, TRUE); // Set big icon | 199 | SetIcon(m_hIcon, TRUE); // Set big icon |
182 | SetIcon(m_hIcon, FALSE); // Set small icon | 200 | SetIcon(m_hIcon, FALSE); // Set small icon |
183 | 201 | ||
184 | VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0)); | 202 | VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0)); |
185 | 203 | ||
186 | 204 | ||
187 | m_Images.Create(16,16,TRUE,2,1); | 205 | m_Images.Create(16,16,TRUE,2,1); |
188 | m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ)); | 206 | m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ)); |
189 | m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ)); | 207 | m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ)); |
190 | ASSERT(m_iRRQ>=0); | 208 | ASSERT(m_iRRQ>=0); |
191 | ASSERT(m_iWRQ>=0); | 209 | ASSERT(m_iWRQ>=0); |
192 | m_List.SetImageList(&m_Images,LVSIL_NORMAL); | 210 | m_List.SetImageList(&m_Images,LVSIL_NORMAL); |
193 | m_List.SetImageList(&m_Images,LVSIL_SMALL); | 211 | m_List.SetImageList(&m_Images,LVSIL_SMALL); |
194 | m_List.SetImageList(&m_Images,LVSIL_STATE); | 212 | m_List.SetImageList(&m_Images,LVSIL_STATE); |
195 | m_List.SetTextColor(RGB(255,255,0));// Yellow | 213 | m_List.SetTextColor(RGB(255,255,0));// Yellow |
196 | m_List.SetTextBkColor(RGB(12,167,0));// Green | 214 | m_List.SetTextBkColor(RGB(12,167,0));// Green |
197 | m_List.SetBkColor(RGB(12,167,0));// Green | 215 | m_List.SetBkColor(RGB(12,167,0));// Green |
198 | CRect listrc; | 216 | CRect listrc; |
199 | m_List.GetClientRect(&listrc); | 217 | m_List.GetClientRect(&listrc); |
200 | m_List.InsertColumn(0,"File",LVCFMT_LEFT,listrc.Width()-((listrc.Width()/7)*3+listrc.Width()*2/7),subitemFile); | 218 | m_List.InsertColumn(0,"File",LVCFMT_LEFT,listrc.Width()-((listrc.Width()/7)*3+listrc.Width()*2/7),subitemFile); |
201 | m_List.InsertColumn(1,"type",LVCFMT_CENTER,listrc.Width()/7,subitemType); | 219 | m_List.InsertColumn(1,"type",LVCFMT_CENTER,listrc.Width()/7,subitemType); |
202 | m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer); | 220 | m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer); |
203 | m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes); | 221 | m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes); |
204 | m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize); | 222 | m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize); |
205 | 223 | ||
206 | LogLine(IDS_LOG_START); | 224 | LogLine(IDS_LOG_START); |
207 | 225 | ||
208 | SetupButtons(); | 226 | SetupButtons(); |
209 | 227 | ||
210 | CRect rc, drc; | 228 | CRect 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); |
232 | m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP); | 252 | m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP); |
233 | m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG); | 253 | m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG); |
234 | } | 254 | } |
235 | return TRUE; // return TRUE unless you set the focus to a control | 255 | return TRUE; // return TRUE unless you set the focus to a control |
236 | } | 256 | } |
237 | 257 | ||
238 | void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam) | 258 | void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam) |
239 | { | 259 | { |
240 | if ((nID & 0xFFF0) == IDM_ABOUTBOX) | 260 | if ((nID & 0xFFF0) == IDM_ABOUTBOX) |
241 | { | 261 | { |
242 | CAboutDlg dlgAbout; | 262 | CAboutDlg dlgAbout; |
243 | dlgAbout.DoModal(); | 263 | dlgAbout.DoModal(); |
244 | } | 264 | } |
245 | else | 265 | else |
246 | { | 266 | { |
247 | CDialog::OnSysCommand(nID, lParam); | 267 | CDialog::OnSysCommand(nID, lParam); |
248 | } | 268 | } |
249 | } | 269 | } |
250 | 270 | ||
251 | void CPumpKINDlg::OnDestroy() | 271 | void CPumpKINDlg::OnDestroy() |
252 | { | 272 | { |
253 | SaveSettings(); | 273 | SaveSettings(); |
254 | 274 | ||
255 | NOTIFYICONDATA nid; | 275 | NOTIFYICONDATA nid; |
256 | memset(&nid,0,sizeof(nid)); | 276 | memset(&nid,0,sizeof(nid)); |
257 | nid.cbSize=sizeof(nid); | 277 | nid.cbSize=sizeof(nid); |
258 | nid.hWnd=m_Trayer->m_hWnd; | 278 | nid.hWnd=m_Trayer->m_hWnd; |
259 | nid.uID=IDC_TRAYICON; | 279 | nid.uID=IDC_TRAYICON; |
260 | nid.uFlags=0; | 280 | nid.uFlags=0; |
261 | VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid)); | 281 | VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid)); |
262 | 282 | ||
263 | WinHelp(0L, HELP_QUIT); | 283 | WinHelp(0L, HELP_QUIT); |
264 | CDialog::OnDestroy(); | 284 | CDialog::OnDestroy(); |
265 | POSITION p = m_LogTimes.GetStartPosition(); | 285 | POSITION p = m_LogTimes.GetStartPosition(); |
266 | while(p){ | 286 | while(p){ |
267 | CTime *t,*tt; | 287 | CTime *t,*tt; |
@@ -279,101 +299,100 @@ POSITION p = m_LogTimes.GetStartPosition(); | |||
279 | 299 | ||
280 | void CPumpKINDlg::OnPaint() | 300 | void CPumpKINDlg::OnPaint() |
281 | { | 301 | { |
282 | if (IsIconic()) | 302 | if (IsIconic()) |
283 | { | 303 | { |
284 | CPaintDC dc(this); // device context for painting | 304 | CPaintDC dc(this); // device context for painting |
285 | 305 | ||
286 | SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); | 306 | SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); |
287 | 307 | ||
288 | // Center icon in client rectangle | 308 | // Center icon in client rectangle |
289 | int cxIcon = GetSystemMetrics(SM_CXICON); | 309 | int cxIcon = GetSystemMetrics(SM_CXICON); |
290 | int cyIcon = GetSystemMetrics(SM_CYICON); | 310 | int cyIcon = GetSystemMetrics(SM_CYICON); |
291 | CRect rect; | 311 | CRect rect; |
292 | GetClientRect(&rect); | 312 | GetClientRect(&rect); |
293 | int x = (rect.Width() - cxIcon + 1) / 2; | 313 | int x = (rect.Width() - cxIcon + 1) / 2; |
294 | int y = (rect.Height() - cyIcon + 1) / 2; | 314 | int y = (rect.Height() - cyIcon + 1) / 2; |
295 | 315 | ||
296 | // Draw the icon | 316 | // Draw the icon |
297 | dc.DrawIcon(x, y, m_hIcon); | 317 | dc.DrawIcon(x, y, m_hIcon); |
298 | } | 318 | } |
299 | else | 319 | else |
300 | { | 320 | { |
301 | CPaintDC pDC(this); | 321 | CPaintDC pDC(this); |
302 | CDC bmpDC; | 322 | CDC bmpDC; |
303 | bmpDC.CreateCompatibleDC(&pDC); | 323 | bmpDC.CreateCompatibleDC(&pDC); |
304 | bmpDC.SelectObject(&m_bmpBack); | 324 | bmpDC.SelectObject(&m_bmpBack); |
305 | CRect rc; | 325 | CRect rc; |
306 | GetClientRect(&rc); | 326 | GetClientRect(&rc); |
307 | for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth) | 327 | for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth) |
308 | for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight) | 328 | for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight) |
309 | pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY); | 329 | pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY); |
310 | bmpDC.DeleteDC(); | 330 | bmpDC.DeleteDC(); |
311 | CDialog::OnPaint(); | 331 | CDialog::OnPaint(); |
312 | } | 332 | } |
313 | } | 333 | } |
314 | 334 | ||
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. |
317 | HCURSOR CPumpKINDlg::OnQueryDragIcon() | 337 | HCURSOR CPumpKINDlg::OnQueryDragIcon() |
318 | { | 338 | { |
319 | return (HCURSOR) m_hIcon; | 339 | return (HCURSOR) m_hIcon; |
320 | } | 340 | } |
321 | 341 | ||
322 | int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) | 342 | int 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 | ||
339 | NOTIFYICONDATA nid; | 358 | NOTIFYICONDATA 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; |
344 | nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; | 363 | nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; |
345 | nid.uCallbackMessage=WM_TRAYICON; | 364 | nid.uCallbackMessage=WM_TRAYICON; |
346 | nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); | 365 | nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); |
347 | // *** Load from resource | 366 | // *** Load from resource |
348 | strcpy(nid.szTip,"PumpKIN"); | 367 | strcpy(nid.szTip,"PumpKIN"); |
349 | VERIFY(Shell_NotifyIcon(NIM_ADD,&nid)); | 368 | VERIFY(Shell_NotifyIcon(NIM_ADD,&nid)); |
350 | 369 | ||
351 | return 0; | 370 | return 0; |
352 | } | 371 | } |
353 | 372 | ||
354 | void CListenSocket::OnReceive(int nErrorCode) | 373 | void CListenSocket::OnReceive(int nErrorCode) |
355 | { | 374 | { |
356 | ASSERT(m_Daddy); | 375 | ASSERT(m_Daddy); |
357 | if(nErrorCode){ | 376 | if(nErrorCode){ |
358 | m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR); | 377 | m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR); |
359 | return; | 378 | return; |
360 | } | 379 | } |
361 | DWORD fionread = 0; | 380 | DWORD fionread = 0; |
362 | VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired | 381 | VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired |
363 | tftp *tftpRQ = tftp::Allocate(fionread); | 382 | tftp *tftpRQ = tftp::Allocate(fionread); |
364 | ASSERT(tftpRQ); | 383 | ASSERT(tftpRQ); |
365 | SOCKADDR_IN sin; | 384 | SOCKADDR_IN sin; |
366 | if(!tftpRQ->Receive(this,fionread,&sin)){ | 385 | if(!tftpRQ->Receive(this,fionread,&sin)){ |
367 | m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR); | 386 | m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR); |
368 | delete tftpRQ; | 387 | delete tftpRQ; |
369 | return; | 388 | return; |
370 | } | 389 | } |
371 | #ifndefNDEBUG | 390 | #ifndefNDEBUG |
372 | CString tmp; | 391 | CString tmp; |
373 | tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port); | 392 | tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port); |
374 | TRACE0(tmp); | 393 | TRACE0(tmp); |
375 | #endif | 394 | #endif |
376 | POSITION p = m_Daddy->m_Xfers.GetStartPosition(); | 395 | POSITION p = m_Daddy->m_Xfers.GetStartPosition(); |
377 | while(p){ | 396 | while(p){ |
378 | SOCKET key; | 397 | SOCKET key; |
379 | CXferSocket *sock; | 398 | CXferSocket *sock; |
@@ -619,107 +638,112 @@ CString tmp; | |||
619 | } | 638 | } |
620 | } | 639 | } |
621 | 640 | ||
622 | CXferSocket::CXferSocket() | 641 | CXferSocket::CXferSocket() |
623 | : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), | 642 | : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), |
624 | m_blkSize(512), m_timeOut(30), m_xferSize(-1), | 643 | m_blkSize(512), m_timeOut(30), m_xferSize(-1), |
625 | m__blkSize(512), m__timeOut(30) | 644 | m__blkSize(512), m__timeOut(30) |
626 | { | 645 | { |
627 | m_Daddy=NULL; | 646 | m_Daddy=NULL; |
628 | m_Peer.sin_addr.s_addr=INADDR_NONE; | 647 | m_Peer.sin_addr.s_addr=INADDR_NONE; |
629 | m_Peer.sin_family=AF_INET; | 648 | m_Peer.sin_family=AF_INET; |
630 | state=stateNone; | 649 | state=stateNone; |
631 | } | 650 | } |
632 | 651 | ||
633 | ULONG CXferSocket::GetACK() | 652 | ULONG CXferSocket::GetACK() |
634 | { | 653 | { |
635 | return 0; | 654 | return 0; |
636 | } | 655 | } |
637 | 656 | ||
638 | CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin) | 657 | CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin) |
639 | : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), | 658 | : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), |
640 | m_blkSize(512), m_timeOut(30), m_xferSize(-1), | 659 | m_blkSize(512), m_timeOut(30), m_xferSize(-1), |
641 | m__blkSize(512), m__timeOut(30) | 660 | m__blkSize(512), m__timeOut(30) |
642 | { | 661 | { |
643 | m_Peer.sin_family=AF_INET; | 662 | m_Peer.sin_family=AF_INET; |
644 | state=stateNone; | 663 | state=stateNone; |
645 | ASSERT(daddy); | 664 | ASSERT(daddy); |
646 | m_Daddy=daddy; | 665 | m_Daddy=daddy; |
647 | m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds(); | 666 | m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds(); |
648 | if(sin){ | 667 | if(sin){ |
649 | m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr; | 668 | m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr; |
650 | m_Peer.sin_port=sin->sin_port; | 669 | m_Peer.sin_port=sin->sin_port; |
651 | }else | 670 | }else |
652 | m_Peer.sin_addr.s_addr=INADDR_NONE; | 671 | m_Peer.sin_addr.s_addr=INADDR_NONE; |
653 | m_FileName=fileName; | 672 | m_FileName=fileName; |
654 | m_Type=type; | 673 | m_Type=type; |
655 | } | 674 | } |
656 | 675 | ||
657 | BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) | 676 | BOOL 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; |
664 | CString lFile = localFile?localFile:m_FileName; | 683 | CString 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 | } |
683 | CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); | 707 | CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); |
684 | CFileException e; | 708 | CFileException 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); |
690 | return FALSE; | 714 | return FALSE; |
691 | } | 715 | } |
692 | Deny(&e); | 716 | Deny(&e); |
693 | return TRUE; | 717 | return TRUE; |
694 | } | 718 | } |
695 | m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION | 719 | m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION |
696 | if(hostName){ | 720 | if(hostName){ |
697 | m_HostName=hostName; | 721 | m_HostName=hostName; |
698 | 722 | ||
699 | CString tmp; | 723 | CString tmp; |
700 | tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName); | 724 | tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName); |
701 | m_Daddy->LogLine(tmp); | 725 | m_Daddy->LogLine(tmp); |
702 | 726 | ||
703 | CString inAddr = hostName; | 727 | CString inAddr = hostName; |
704 | int at = inAddr.Find('@'); | 728 | int at = inAddr.Find('@'); |
705 | if(at>=0) | 729 | if(at>=0) |
706 | inAddr=inAddr.Mid(at+1); | 730 | inAddr=inAddr.Mid(at+1); |
707 | if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ | 731 | if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ |
708 | ASSERT(!m_wndResolver); | 732 | ASSERT(!m_wndResolver); |
709 | m_wndResolver = new CResolver(this); | 733 | m_wndResolver = new CResolver(this); |
710 | ASSERT(m_wndResolver); | 734 | ASSERT(m_wndResolver); |
711 | return m_wndResolver->Resolve(); | 735 | return m_wndResolver->Resolve(); |
712 | } | 736 | } |
713 | else | 737 | else |
714 | OnHostKnown(); | 738 | OnHostKnown(); |
715 | }else{ | 739 | }else{ |
716 | tftp::tftpOptions o; | 740 | tftp::tftpOptions o; |
717 | CString v; | 741 | CString v; |
718 | if(m_Options.Lookup(tftpoBSize,v)){ | 742 | if(m_Options.Lookup(tftpoBSize,v)){ |
719 | m__blkSize=atoi(v); | 743 | m__blkSize=atoi(v); |
720 | if(m__blkSize){ | 744 | if(m__blkSize){ |
721 | m_blkSize=m__blkSize; | 745 | m_blkSize=m__blkSize; |
722 | v.Format("%u",m_blkSize); | 746 | v.Format("%u",m_blkSize); |
723 | o[tftpoBSize]=v; | 747 | o[tftpoBSize]=v; |
724 | } | 748 | } |
725 | } | 749 | } |
@@ -1062,257 +1086,271 @@ WORD tftp::tftpERROR::Code() | |||
1062 | return REVERSEBYTES(code); | 1086 | return REVERSEBYTES(code); |
1063 | } | 1087 | } |
1064 | void tftp::tftpERROR::SetCode(WORD c) | 1088 | void tftp::tftpERROR::SetCode(WORD c) |
1065 | { | 1089 | { |
1066 | code = REVERSEBYTES(c); | 1090 | code = REVERSEBYTES(c); |
1067 | } | 1091 | } |
1068 | 1092 | ||
1069 | 1093 | ||
1070 | CString tftp::errMessage() | 1094 | CString tftp::errMessage() |
1071 | { | 1095 | { |
1072 | CString rv; | 1096 | CString rv; |
1073 | if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code))) | 1097 | if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code))) |
1074 | rv = (LPCTSTR)data.m_ERROR.data; | 1098 | rv = (LPCTSTR)data.m_ERROR.data; |
1075 | return rv; | 1099 | return rv; |
1076 | } | 1100 | } |
1077 | 1101 | ||
1078 | void CXferSocket::Destroy(BOOL success) | 1102 | void CXferSocket::Destroy(BOOL success) |
1079 | { | 1103 | { |
1080 | if(m_wndResolver){ | 1104 | if(m_wndResolver){ |
1081 | delete m_wndResolver; | 1105 | delete m_wndResolver; |
1082 | m_wndResolver=NULL; | 1106 | m_wndResolver=NULL; |
1083 | } | 1107 | } |
1084 | SetTry(); | 1108 | SetTry(); |
1085 | m_Daddy->m_bnw.StartSound( | 1109 | m_Daddy->m_bnw.StartSound( |
1086 | success | 1110 | success |
1087 | ? m_Daddy->m_bnwSuccess | 1111 | ? m_Daddy->m_bnwSuccess |
1088 | : m_Daddy->m_bnwAbort | 1112 | : m_Daddy->m_bnwAbort |
1089 | ); | 1113 | ); |
1090 | if(m_File.m_hFile!=CFile::hFileNull){ | 1114 | if(m_File.m_hFile!=CFile::hFileNull){ |
1091 | TRY{ | 1115 | TRY{ |
1092 | m_File.Close(); | 1116 | m_File.Close(); |
1093 | }CATCH(CFileException,e){ | 1117 | }CATCH(CFileException,e){ |
1094 | TRACE0("Error closing file\n"); | 1118 | TRACE0("Error closing file\n"); |
1095 | }END_CATCH | 1119 | }END_CATCH |
1096 | } | 1120 | } |
1097 | ASSERT(m_Daddy); | 1121 | ASSERT(m_Daddy); |
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); |
1100 | LV_FINDINFO lvf; | 1124 | LV_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; |
1104 | int i = m_Daddy->m_List.FindItem(&lvf); | 1128 | int 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 | ||
1110 | void CPumpKINDlg::LogLine(LPCTSTR str) | 1134 | void 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 | } |
1122 | int i = m_Log.AddString(str); | 1146 | int i = m_Log.AddString(str); |
1123 | ASSERT(i!=LB_ERR); | 1147 | ASSERT(i!=LB_ERR); |
1124 | CTime *t = new CTime(CTime::GetCurrentTime()); | 1148 | CTime *t = new CTime(CTime::GetCurrentTime()); |
1125 | m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t)); | 1149 | m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t)); |
1126 | m_Log.SetCurSel(i); | 1150 | m_Log.SetCurSel(i); |
1127 | } | 1151 | } |
1128 | 1152 | ||
1129 | void CPumpKINDlg::LogLine(UINT msgID) | 1153 | void CPumpKINDlg::LogLine(UINT msgID) |
1130 | { | 1154 | { |
1131 | CString tmp; | 1155 | CString tmp; |
1132 | tmp.Format(msgID); | 1156 | tmp.Format(msgID); |
1133 | LogLine(tmp); | 1157 | LogLine(tmp); |
1134 | } | 1158 | } |
1135 | 1159 | ||
1136 | void CXferSocket::TurnSlashes(CString& fn,BOOL bBack) | 1160 | void CXferSocket::TurnSlashes(CString& fn,BOOL bBack) |
1137 | { | 1161 | { |
1138 | ints = fn.Find(bBack?'/':'\\'); | 1162 | ints = fn.Find(bBack?'/':'\\'); |
1139 | while(s>=0){ | 1163 | while(s>=0){ |
1140 | fn.SetAt(s,bBack?'\\':'/'); | 1164 | fn.SetAt(s,bBack?'\\':'/'); |
1141 | s = fn.Find(bBack?'/':'\\'); | 1165 | s = fn.Find(bBack?'/':'\\'); |
1142 | } | 1166 | } |
1143 | } | 1167 | } |
1144 | 1168 | ||
1145 | CString CXferSocket::ApplyRoot(LPCTSTR fileName) | 1169 | CString CXferSocket::ApplyRoot(LPCTSTR fileName) |
1146 | { | 1170 | { |
1147 | ASSERT(m_Daddy); | 1171 | ASSERT(m_Daddy); |
1148 | CString fn = fileName; | 1172 | CString fn = fileName; |
1149 | CString rv = m_Daddy->m_TFTPRoot; | 1173 | CString rv = m_Daddy->m_TFTPRoot; |
1150 | if(rv.IsEmpty()) | 1174 | if(rv.IsEmpty()) |
1151 | rv = "."; | 1175 | rv = "."; |
1152 | if(rv[rv.GetLength()-1]!='\\') | 1176 | if(rv[rv.GetLength()-1]!='\\') |
1153 | rv+="\\"; | 1177 | rv+="\\"; |
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 | ||
1160 | void CPumpKINDlg::OnOptions() | 1184 | void CPumpKINDlg::OnOptions() |
1161 | { | 1185 | { |
1162 | CPropertySheet cps(IDS_TITLE_OPTIONS,this); | 1186 | CPropertySheet cps(IDS_TITLE_OPTIONS,this); |
1163 | CPropsServer server; | 1187 | CPropsServer server; |
1164 | CPropsNetwork network; | 1188 | CPropsNetwork network; |
1165 | CPropsSounds sounds; | 1189 | CPropsSounds sounds; |
1190 | CPropsACL 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 | ||
1203 | BOOL CRRQSocket::ConfirmRequest() | 1237 | BOOL CRRQSocket::ConfirmRequest() |
1204 | { | 1238 | { |
1205 | CConfirmRRQDlg cd(NULL); | 1239 | CConfirmRRQDlg 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; |
1212 | } | 1246 | } |
1213 | 1247 | ||
1214 | CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) | 1248 | CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) |
1215 | : CXferSocket(daddy,fileName,type,sin) | 1249 | : CXferSocket(daddy,fileName,type,sin) |
1216 | { | 1250 | { |
1217 | state=stateNone; | 1251 | state=stateNone; |
1218 | m_ACK=0; | 1252 | m_ACK=0; |
1219 | m_LastSlack=0; | 1253 | m_LastSlack=0; |
1220 | m_bResume=FALSE; | 1254 | m_bResume=FALSE; |
1221 | } | 1255 | } |
1222 | 1256 | ||
1223 | BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) | 1257 | BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) |
1224 | { | 1258 | { |
1225 | if(!CAsyncSocket::Create(0,SOCK_DGRAM)) | 1259 | if(!CAsyncSocket::Create(0,SOCK_DGRAM)) |
1226 | return FALSE; | 1260 | return FALSE; |
1227 | ASSERT(m_Daddy); | 1261 | ASSERT(m_Daddy); |
1228 | ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); | 1262 | ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); |
1229 | m_Daddy->m_Xfers[m_hSocket]=this; | 1263 | m_Daddy->m_Xfers[m_hSocket]=this; |
1230 | UpdateList(); | 1264 | UpdateList(); |
1231 | CString lf; | 1265 | CString lf; |
1232 | if(!localFile) { | 1266 | if(!localFile) { |
1233 | lf = m_FileName; | 1267 | lf = m_FileName; |
1234 | TurnSlashes(lf,TRUE); | 1268 | TurnSlashes(lf,TRUE); |
1235 | } | 1269 | } |
1236 | CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); | 1270 | CString 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 | } |
1276 | CFileException e; | 1314 | CFileException 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 |
1283 | )){ | 1321 | )){ |
1284 | if(localFile){// Outgoing request | 1322 | if(localFile){// Outgoing request |
1285 | CString tmp; | 1323 | CString tmp; |
1286 | tmp.Format(IDS_LOG_FAILEDTOOPEN,fn); | 1324 | tmp.Format(IDS_LOG_FAILEDTOOPEN,fn); |
1287 | m_Daddy->LogLine(tmp); | 1325 | m_Daddy->LogLine(tmp); |
1288 | return FALSE; | 1326 | return FALSE; |
1289 | }else{ | 1327 | }else{ |
1290 | Deny(&e); | 1328 | Deny(&e); |
1291 | return TRUE; | 1329 | return TRUE; |
1292 | } | 1330 | } |
1293 | } | 1331 | } |
1294 | if(hostName){ | 1332 | if(hostName){ |
1295 | m_HostName=hostName; | 1333 | m_HostName=hostName; |
1296 | 1334 | ||
1297 | CString tmp; | 1335 | CString tmp; |
1298 | tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName); | 1336 | tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName); |
1299 | m_Daddy->LogLine(tmp); | 1337 | m_Daddy->LogLine(tmp); |
1300 | 1338 | ||
1301 | CString inAddr = hostName; | 1339 | CString inAddr = hostName; |
1302 | int at = inAddr.Find('@'); | 1340 | int at = inAddr.Find('@'); |
1303 | if(at>=0) | 1341 | if(at>=0) |
1304 | inAddr=inAddr.Mid(at+1); | 1342 | inAddr=inAddr.Mid(at+1); |
1305 | if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ | 1343 | if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ |
1306 | ASSERT(!m_wndResolver); | 1344 | ASSERT(!m_wndResolver); |
1307 | m_wndResolver = new CResolver(this); | 1345 | m_wndResolver = new CResolver(this); |
1308 | ASSERT(m_wndResolver); | 1346 | ASSERT(m_wndResolver); |
1309 | return m_wndResolver->Resolve(); | 1347 | return m_wndResolver->Resolve(); |
1310 | }else{ | 1348 | }else{ |
1311 | OnHostKnown(); | 1349 | OnHostKnown(); |
1312 | return TRUE; | 1350 | return TRUE; |
1313 | } | 1351 | } |
1314 | } | 1352 | } |
1315 | CString v; | 1353 | CString v; |
1316 | tftp::tftpOptions oack; | 1354 | tftp::tftpOptions oack; |
1317 | if(m_Options.Lookup(tftpoTSize,v)){ | 1355 | if(m_Options.Lookup(tftpoTSize,v)){ |
1318 | m_xferSize=atol(v); | 1356 | m_xferSize=atol(v); |
@@ -1750,138 +1788,144 @@ void CPumpKINDlg::OnClose() | |||
1750 | void CPumpKINDlg::OnTrayShowpumpkinwindow() | 1788 | void CPumpKINDlg::OnTrayShowpumpkinwindow() |
1751 | { | 1789 | { |
1752 | if(IsWindowVisible()){ | 1790 | if(IsWindowVisible()){ |
1753 | m_bShown=FALSE; | 1791 | m_bShown=FALSE; |
1754 | ShowWindow(SW_HIDE); | 1792 | ShowWindow(SW_HIDE); |
1755 | }else{ | 1793 | }else{ |
1756 | m_bShown=TRUE; | 1794 | m_bShown=TRUE; |
1757 | ShowWindow(SW_SHOW); | 1795 | ShowWindow(SW_SHOW); |
1758 | SetForegroundWindow(); | 1796 | SetForegroundWindow(); |
1759 | SetFocus(); | 1797 | SetFocus(); |
1760 | } | 1798 | } |
1761 | } | 1799 | } |
1762 | 1800 | ||
1763 | void CPumpKINDlg::OnTrayExit() | 1801 | void CPumpKINDlg::OnTrayExit() |
1764 | { | 1802 | { |
1765 | OnExit(); | 1803 | OnExit(); |
1766 | } | 1804 | } |
1767 | 1805 | ||
1768 | void CPumpKINDlg::OnTrayAboutpumpkin() | 1806 | void CPumpKINDlg::OnTrayAboutpumpkin() |
1769 | { | 1807 | { |
1770 | CAboutDlg dlgAbout; | 1808 | CAboutDlg dlgAbout; |
1771 | dlgAbout.DoModal(); | 1809 | dlgAbout.DoModal(); |
1772 | } | 1810 | } |
1773 | 1811 | ||
1774 | void CPumpKINDlg::OnTrayFetchfile() | 1812 | void CPumpKINDlg::OnTrayFetchfile() |
1775 | { | 1813 | { |
1776 | OnGet(); | 1814 | OnGet(); |
1777 | } | 1815 | } |
1778 | 1816 | ||
1779 | void CPumpKINDlg::OnTrayHelp() | 1817 | void CPumpKINDlg::OnTrayHelp() |
1780 | { | 1818 | { |
1781 | OnHelp(); | 1819 | OnHelp(); |
1782 | } | 1820 | } |
1783 | 1821 | ||
1784 | void CPumpKINDlg::OnTrayOptions() | 1822 | void CPumpKINDlg::OnTrayOptions() |
1785 | { | 1823 | { |
1786 | OnOptions(); | 1824 | OnOptions(); |
1787 | } | 1825 | } |
1788 | 1826 | ||
1789 | void CPumpKINDlg::OnTraySendfile() | 1827 | void CPumpKINDlg::OnTraySendfile() |
1790 | { | 1828 | { |
1791 | OnPut(); | 1829 | OnPut(); |
1792 | } | 1830 | } |
1793 | 1831 | ||
1794 | void CPumpKINDlg::LoadSettings() | 1832 | void CPumpKINDlg::LoadSettings() |
1795 | { | 1833 | { |
1796 | CWinApp *app = AfxGetApp(); | 1834 | CWinApp *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 | ||
1821 | void CPumpKINDlg::SaveSettings() | 1862 | void CPumpKINDlg::SaveSettings() |
1822 | { | 1863 | { |
1823 | CWinApp *app = AfxGetApp(); | 1864 | CWinApp *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 | ||
1842 | void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) | 1886 | void 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; |
1852 | if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu)) | 1896 | if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu)) |
1853 | GetDesktopWindow()->SetForegroundWindow(); | 1897 | GetDesktopWindow()->SetForegroundWindow(); |
1854 | } | 1898 | } |
1855 | } | 1899 | } |
1856 | } | 1900 | } |
1857 | 1901 | ||
1858 | CString CXferSocket::ApplyRootGently(LPCTSTR fn) | 1902 | CString CXferSocket::ApplyRootGently(LPCTSTR fn) |
1859 | { | 1903 | { |
1860 | CString f = fn; | 1904 | CString f = fn; |
1861 | CString rv = f; | 1905 | CString rv = f; |
1862 | if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0) | 1906 | if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0) |
1863 | rv = ApplyRoot(f); | 1907 | rv = ApplyRoot(f); |
1864 | return rv; | 1908 | return rv; |
1865 | } | 1909 | } |
1866 | 1910 | ||
1867 | BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file) | 1911 | BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file) |
1868 | { | 1912 | { |
1869 | CString tmp = file; | 1913 | CString tmp = file; |
1870 | if(tmp.IsEmpty()) | 1914 | if(tmp.IsEmpty()) |
1871 | return FALSE; | 1915 | return FALSE; |
1872 | if(tmp.Find("..")>=0) | 1916 | if(tmp.Find("..")>=0) |
1873 | return TRUE; | 1917 | return TRUE; |
1874 | if(tmp.Find(":")>=0) | 1918 | if(tmp.Find(":")>=0) |
1875 | return TRUE; | 1919 | return TRUE; |
1876 | if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0) | 1920 | if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0) |
1877 | return TRUE; | 1921 | return TRUE; |
1878 | return FALSE; | 1922 | return FALSE; |
1879 | } | 1923 | } |
1880 | 1924 | ||
1881 | void CAboutDlg::OnKlevernet() | 1925 | void CAboutDlg::OnKlevernet() |
1882 | { | 1926 | { |
1883 | CString url; | 1927 | CString url; |
1884 | url.LoadString(IDS_KLEVERNET_URL); | 1928 | url.LoadString(IDS_KLEVERNET_URL); |
1885 | ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED); | 1929 | ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED); |
1886 | } | 1930 | } |
1887 | 1931 | ||
@@ -1939,48 +1983,97 @@ UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0); | |||
1939 | } | 1983 | } |
1940 | ::DragFinish(hDropInfo); | 1984 | ::DragFinish(hDropInfo); |
1941 | } | 1985 | } |
1942 | 1986 | ||
1943 | void CPumpKINDlg::OnCancel() | 1987 | void CPumpKINDlg::OnCancel() |
1944 | { | 1988 | { |
1945 | OnClose(); | 1989 | OnClose(); |
1946 | } | 1990 | } |
1947 | 1991 | ||
1948 | CPumpKINDlg::~CPumpKINDlg() | 1992 | CPumpKINDlg::~CPumpKINDlg() |
1949 | { | 1993 | { |
1950 | delete m_Trayer; | 1994 | delete m_Trayer; |
1951 | delete m_Retrier; | 1995 | delete m_Retrier; |
1952 | } | 1996 | } |
1953 | 1997 | ||
1954 | void CXferSocket::OnRetry() | 1998 | void CXferSocket::OnRetry() |
1955 | { | 1999 | { |
1956 | if(!m_Retry){ | 2000 | if(!m_Retry){ |
1957 | TRACE("Retrying unretriable..\n"); | 2001 | TRACE("Retrying unretriable..\n"); |
1958 | return; | 2002 | return; |
1959 | } | 2003 | } |
1960 | TRACE0("Retrying..\n"); | 2004 | TRACE0("Retrying..\n"); |
1961 | m_bRetry=TRUE; | 2005 | m_bRetry=TRUE; |
1962 | PostTFTP(tftp::Copy(m_Retry)); | 2006 | PostTFTP(tftp::Copy(m_Retry)); |
1963 | m_bRetry=FALSE; | 2007 | m_bRetry=FALSE; |
1964 | } | 2008 | } |
1965 | 2009 | ||
1966 | tftp* tftp::Copy(tftp *src) | 2010 | tftp* tftp::Copy(tftp *src) |
1967 | { | 2011 | { |
1968 | ASSERT(src); | 2012 | ASSERT(src); |
1969 | ASSERT(src->length); | 2013 | ASSERT(src->length); |
1970 | tftp* rv = Allocate(src->length); | 2014 | tftp* rv = Allocate(src->length); |
1971 | ASSERT(rv); | 2015 | ASSERT(rv); |
1972 | memmove(rv,src,tftpSlackSize+src->length); | 2016 | memmove(rv,src,tftpSlackSize+src->length); |
1973 | return rv; | 2017 | return rv; |
1974 | } | 2018 | } |
1975 | 2019 | ||
1976 | void CXferSocket::SetTry(tftp *p) | 2020 | void 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 | ||
1983 | void CPumpKINDlg::OnHelp() | 2027 | void CPumpKINDlg::OnHelp() |
1984 | { | 2028 | { |
1985 | AfxGetApp()->WinHelp(0,HELP_FINDER); | 2029 | AfxGetApp()->WinHelp(0,HELP_FINDER); |
1986 | } | 2030 | } |
2031 | |||
2032 | BOOL 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 | |||
2046 | void 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 | |||
2056 | void 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 | |||
2066 | void 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 | } | ||