RemoteAdmin.cpp
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:25k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : RemoteAdmin.cpp
  16. // PURPOSE : Remote administration daemon interface
  17. // PROGRAM : 
  18. // DATE : Nov. 4 1996
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. // REVISION HISTORY
  22. //
  23. #include "stdafx.h"
  24. #include "WarDaemon.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. ////////////////////////////////////////////////////////////////////
  31. // Admin Command parser
  32. enum // Token ID's
  33. {
  34. TOK_QUIT = TOK_START_TAB, TOK_LIST, TOK_OPTS, TOK_OPT, TOK_SET, TOK_USER, TOK_USRS,
  35. TOK_CREA, TOK_DELE, TOK_SHOW, TOK_ON, TOK_OFF, TOK_EVNT, TOK_STAT, TOK_VER, TOK_GET,
  36. TOK_FIND, TOK_SHDN, TOK_GROUP, TOK_CLASS, TOK_VSERVER, TOK_RENAME, TOK_DIR, TOK_CHMOD,
  37. TOK_GOONL, TOK_GOOFFLN, TOK_RESTART, TOK_EXTENSIONS, TOK_DLL,
  38. };
  39. static STokenTab BaseTokens[] =
  40. {
  41. {TOK_QUIT, "QUIT" },
  42. {TOK_LIST, "LIST" },
  43. {TOK_SHOW, "SHOW" },
  44. {TOK_SET, "SET" },
  45. {TOK_GET, "GET" },
  46. {TOK_OPTS, "OPTIONS"},
  47. {TOK_OPT, "OPTION" },
  48. {TOK_USER, "USER" },
  49. {TOK_USRS, "USERS" },
  50. {TOK_CREA, "CREATE" },
  51. {TOK_DELE, "DELETE" },
  52. {TOK_EVNT, "EVENTS" },
  53. {TOK_ON, "ON", },
  54. {TOK_OFF, "OFF" },
  55. {TOK_STAT,  "STATUS"},
  56. {TOK_VER,   "VERSION"},
  57. {TOK_FIND, "FIND"},
  58. {TOK_SHDN, "SHUTDOWN"},
  59. {TOK_GROUP, "GROUP"},
  60. {TOK_CLASS, "CLASS"},
  61. {TOK_VSERVER,"VSERVER"},
  62. {TOK_RENAME, "RENAME"},
  63. {TOK_DIR,  "DIR"},
  64. {TOK_CHMOD,  "CHMOD"},
  65. {TOK_GOONL,  "GOONLINE"},
  66. {TOK_GOOFFLN,"GOOFFLINE"},
  67. {TOK_RESTART,"RESTART"},
  68. {TOK_EXTENSIONS,"EXTENSIONS"},
  69. {TOK_DLL, "DLL"},
  70. {TOK_INVALID, "" }
  71. };
  72. enum // Commands recognized on this level
  73. {
  74. CMD_QUIT = CMD_START_TREE, CMD_LOPT, CMD_SOPT, CMD_LUSR, CMD_CRUS, CMD_SHUS, CMD_STUS,
  75. CMD_EVON, CMD_EVOF, CMD_STAT, CMD_VER, CMD_GOPT, CMD_FUNA, CMD_FUNO, CMD_GUOP, CMD_SHDN,
  76. CMD_LUST, CMD_CRGR, CMD_CRCL, CMD_CRVS, CMD_DELUS, CMD_RENUS, CMD_LDIR, CMD_CHMOD,
  77. CMD_GONL, CMD_GOOF, CMD_RSTR, CMD_LIEX, CMD_GETEXT, CMD_GETDLL, CMD_SETDLL,
  78. };
  79. static SCommandTree ListUserCmds[] =
  80. {
  81. {TOK_INT, CMD_LUST, PROCESS, 0,  NULL, 0, LEX_WANT_STRING, "LIST USERS <type> <pattern>" },
  82. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  83. };
  84. static SCommandTree ListCmds[] =
  85. {
  86. {TOK_OPTS, CMD_LOPT, PROCESS, 0,  NULL, 0, LEX_WANT_STRING, "LIST OPTIONS (list option groups)" },
  87. {TOK_USRS, CMD_INVALID, PROCESS, CMDF_PARAMETER,  ListUserCmds, ' ', LEX_WANT_INT, "" },
  88. {TOK_USRS, CMD_LUSR, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "LIST USERS <pattern>" },
  89. {TOK_DIR,  CMD_LDIR, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "LIST DIR <path>" },
  90. {TOK_EXTENSIONS, CMD_LIEX, PROCESS, 0, NULL, 0, 0, "LIST EXTENSIONS"},
  91. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  92. };
  93. static SCommandTree EventCmds[] =
  94. {
  95. {TOK_ON, CMD_EVON, PROCESS, 0,  NULL, 0, 0, "SET EVENTS n ON (Torn on events)" },
  96. {TOK_OFF, CMD_EVOF, PROCESS, 0,  NULL, 0, 0, "SET EVENTS n OFF (Turns off events)" },
  97. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  98. };
  99. static SCommandTree EventNum[] =
  100. {
  101. {TOK_INT, CMD_INVALID, PROCESS, 0, EventCmds, 0, LEX_WANT_CMD, "" },
  102. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  103. };
  104. static SCommandTree SetCmds[] =
  105. {
  106. {TOK_OPT,  CMD_SOPT, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "SET OPTION <optgrp/option=value>" },
  107. {TOK_USER, CMD_STUS, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "SET USER <user/option=value>" },
  108. {TOK_EVNT, CMD_INVALID, PROCESS, 0, EventNum, ' ', LEX_WANT_INT, "SET EVENTS n <ON or OFF>" },
  109. {TOK_DLL,  CMD_SETDLL, PROCESS, CMDF_PARAMETER, NULL, 0, LEX_WANT_STRING, "SET DLL <name> = 1 | 0" },
  110. {TOK_INVALID, CMD_INVALID, 0, 0,   NULL, 0,   0,             NULL}
  111. };
  112. static SCommandTree GetUserCmds[] =
  113. {
  114. {TOK_OPT,  CMD_GUOP, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "GET USER OPTION <User/option>" },
  115. {TOK_INVALID, CMD_INVALID, 0, 0,   NULL, 0,   0,             NULL}
  116. };
  117. static SCommandTree GetCmds[] =
  118. {
  119. {TOK_OPT,  CMD_GOPT, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "GET OPTION <optgrp/option>" },
  120. {TOK_USER, CMD_INVALID, PROCESS, CMDF_PARAMETER, GetUserCmds, ' ', LEX_WANT_CMD, "GET USER <what>" },
  121. {TOK_EXTENSIONS, CMD_LIEX, PROCESS, CMDF_PARAMETER, NULL, 0, LEX_WANT_STRING, "GET EXTENSION <name>" },
  122. {TOK_DLL, CMD_GETDLL, PROCESS, CMDF_PARAMETER, NULL, 0, LEX_WANT_STRING, "GET DLL <name>"},
  123. {TOK_INVALID, CMD_INVALID, 0, 0,   NULL, 0,   0,             NULL}
  124. };
  125. static SCommandTree CreaCmds[] =
  126. {
  127. {TOK_USER, CMD_CRUS, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "CREATE USER name" },
  128. {TOK_GROUP, CMD_CRGR, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "CREATE GROUP name" },
  129. {TOK_CLASS, CMD_CRCL, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "CREATE CLASS name" },
  130. {TOK_VSERVER, CMD_CRVS, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "CREATE VSERVER name" },
  131. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  132. };
  133. static SCommandTree FunaCmds[] =
  134. {
  135. {TOK_USER, CMD_FUNA, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_INT, "FIND USER <ID> <type>" },
  136. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  137. };
  138. static SCommandTree FindCmds[] =
  139. {
  140. {TOK_USER, CMD_FUNO, PROCESS, CMDF_PARAMETER,  NULL, ' ', LEX_WANT_INT, "FIND USER <number>" },
  141. {TOK_USER, CMD_INVALID, PROCESS, CMDF_PARAMETER,  FunaCmds, ' ', LEX_WANT_STRING, "FIND USER <ID> <type>" },
  142. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  143. };
  144. static SCommandTree ShowCmds[] =
  145. {
  146. {TOK_USER, CMD_SHUS, PROCESS,  CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "SHOW USER name" },
  147. {TOK_VER,  CMD_VER , PRELOGIN, 0,  NULL, 0, LEX_WANT_STRING, "SHOW VERSION (show server version)" },
  148. {TOK_STAT, CMD_STAT, PROCESS,  0,  NULL, 0, LEX_WANT_STRING, "SHOW STATUS (show server status)" },
  149. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  150. };
  151. static SCommandTree DeleCmds[] =
  152. {
  153. {TOK_USER, CMD_DELUS, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "DELTE USER <num>" },
  154. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  155. };
  156. static SCommandTree RenameUserCmds[] =
  157. {
  158. {TOK_USER, CMD_RENUS, PROCESS, CMDF_PARAMETER,  NULL, 0, LEX_WANT_STRING, "RENAME USER <num> <new name>" },
  159. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  160. };
  161. static SCommandTree RenameCmds[] =
  162. {
  163. {TOK_USER, CMD_INVALID, PROCESS, CMDF_PARAMETER,  RenameUserCmds, ' ', LEX_WANT_STRING, "RENAME USER <num> <new name>" },
  164. {TOK_INVALID, CMD_INVALID, 0,  0,  NULL, 0,   0,             NULL}
  165. };
  166. // Command tree
  167. static SCommandTree BaseCmds[] =
  168. {
  169. {TOK_QUIT, CMD_QUIT, PRELOGIN,  0, NULL, ' ', 0, "QUIT (end session)" },
  170. {TOK_LIST, CMD_INVALID, PROCESS, CMDF_PARAMETER, ListCmds, ' ', LEX_WANT_CMD, "LIST <what>" },
  171. {TOK_SET,  CMD_INVALID, PROCESS, CMDF_PARAMETER, SetCmds, ' ', LEX_WANT_CMD, "SET <what>" },
  172. {TOK_GET,  CMD_INVALID, PROCESS, CMDF_PARAMETER, GetCmds, ' ', LEX_WANT_CMD, "GET <what>" },
  173. {TOK_CREA, CMD_INVALID, PROCESS, CMDF_PARAMETER, CreaCmds, ' ', LEX_WANT_CMD, "CREATE <what>" },
  174. {TOK_DELE, CMD_INVALID, PROCESS, CMDF_PARAMETER, DeleCmds,   ' ', LEX_WANT_CMD, "DELETE <what>" },
  175. {TOK_RENAME, CMD_INVALID, PROCESS, CMDF_PARAMETER, RenameCmds,   ' ', LEX_WANT_CMD, "DELETE <what>" },
  176. {TOK_SHOW, CMD_INVALID, PROCESS, CMDF_PARAMETER, ShowCmds,   ' ', LEX_WANT_CMD, "SHOW <what>" },
  177. {TOK_FIND, CMD_INVALID, PROCESS, CMDF_PARAMETER, FindCmds,   ' ', LEX_WANT_CMD, "FIND <what>" },
  178. {TOK_SHDN, CMD_SHDN, PROCESS, 0, NULL, ' ', LEX_WANT_BOOL, "SHUTDOWN (terminate the server)" },
  179. {TOK_CHMOD, CMD_CHMOD, PROCESS, CMDF_PARAMETER, NULL,     0, LEX_WANT_STRING, "CHMOD" },
  180. {TOK_GOONL, CMD_GONL,   PROCESS, 0,               NULL,       ' ', LEX_WANT_CMD, "GOONLINE (go online)"},
  181. {TOK_GOOFFLN, CMD_GOOF, PROCESS, 0,               NULL,       ' ', LEX_WANT_CMD, "GOOFFLINE (go offline)"},
  182. {TOK_RESTART, CMD_RSTR, PROCESS, 0,               NULL,       ' ', LEX_WANT_CMD, "RESTART (Restart server)"},
  183. {TOK_INVALID, CMD_INVALID, 0,    0, NULL, 0,  0,             NULL}
  184. };
  185. CAdminParser::CAdminParser()
  186. {
  187. m_Commands = (SCommandTree *) BaseCmds;
  188. m_Tokens = (STokenTab *) BaseTokens;
  189. }
  190. ///////////////////////////////////////////////////////////////////////////////////////
  191. // CDaemonMaintananceSocket
  192. IMPLEMENT_DYNAMIC(CDaemonMaintananceSocket, CTextSock);
  193. CDaemonMaintananceSocket::CDaemonMaintananceSocket()
  194. {
  195. // Increase login counter
  196. m_pFsys = NULL;
  197. CDaemonStatusSvr::IncOperatorCnt(TRUE);
  198. }
  199. CDaemonMaintananceSocket::~CDaemonMaintananceSocket()
  200. {
  201. if (m_pFsys)
  202. {
  203. m_pFsys->Logout();
  204. }
  205. CDaemonStatusSvr::IncOperatorCnt(FALSE);
  206. }
  207. BOOL CDaemonMaintananceSocket::OnCommand(LPCSTR Text)
  208. {
  209. if (!CTextSock::OnCommand(Text))
  210. return FALSE;
  211. BOOL Rval = TRUE;
  212. CCmdArgs Args;
  213. int CmdID;
  214. CString cBuf;
  215. int ival;
  216. USER MyUser;
  217. // EXT module
  218. if (PrcSockExt(CSock::iOnCommand,0,(WPARAM)0,(LPARAM)&Text))
  219. return TRUE;
  220. // Login
  221. switch(m_State)
  222. {
  223. case PRELOGIN: // We want username
  224. SendCtrlMsg(331,"Password: ", FALSE, FALSE);
  225. if (m_LocalEcho)
  226. m_LocalEcho = '*';
  227. m_State = GOTNAME;
  228. m_ArgSave = Text;
  229. break;
  230. case GOTNAME: // We want password
  231. if (((m_User = CUsr::Login(LT_REMOTE, m_ArgSave, Text, this)) == 0)
  232. || !CUsr::IsAdmin(m_User))
  233. {
  234. SendCtrlMsg(521,"Goodbye. Connection closed.");
  235. delete this;
  236. return FALSE;
  237. }
  238. m_State = PROCESS;
  239. SendMsg(230,"Logged in.");
  240. NotifyLogin(ENL_UPDATE, "");
  241. // Password is OK. Move on to Process..
  242. goto prompt;
  243. case PROCESS:
  244. // Parse command
  245. CmdID = m_Parser.ParseCmd(Text,Args, m_State);
  246. switch(CmdID)
  247. {
  248. case CMD_LIEX: // LIST EXTENSIONS
  249. SendMsg(200,"%s", CAPIHandler::ListAll());
  250. break;
  251. case CMD_GETDLL: // Get a dll from the server
  252. {
  253. LPCSTR p = Args.Arg(2);
  254. if (p && (p = strrchr(p, '.')))
  255. {
  256. if (!stricmp(p,".dll"))
  257. {
  258. if (SendFile(NULL, Args.Arg(2)))
  259. break; // SendFile will reply
  260. }
  261. }
  262. }
  263. LogMsg(LOGF_FILEACC,"CMD_GETDLL - File send '%s' failed.", Args.Arg(2));
  264. SendMsg(550, "File send failed");
  265. break;
  266. case CMD_SETDLL: // Enable/disable dll
  267. if (CAPIHandler::GetPtr() && CAPIHandler::GetPtr()->EnableDll(Args.Arg(2)))
  268. SendMsg(200, "DLL command OK.");
  269. else
  270. SendMsg(550, "DLL command failed.");
  271. break;
  272. case CMD_QUIT:
  273. SendMsg(221,"Goodbye. Connection closed.");
  274. LogMsg(LOGF_INOUT,"User from %s has logged off.", m_PeerName);
  275. delete this;
  276. return FALSE;
  277. break;
  278. case CMD_LOPT: // list options
  279. if (COptions::ListOptions(Args.m_argc > 2 ? Args.Arg(2) : "",cBuf))
  280. SendMsg(200, cBuf);
  281. else
  282. SendMsg(550,"Unknown option group.");
  283. break;
  284. case CMD_SOPT: // Set option
  285. if (Args.m_argc != 3)
  286. SendMsg(501,"Missing required parameter.");
  287. else if (COptions::SetOption(Args[2], TRUE))
  288. SendMsg(200, "OK");
  289. else
  290. SendMsg(550,"Failed to set option. (syntax: Group/Option=new value)");
  291. break;
  292. case CMD_GOPT: // Get option
  293. if (Args.m_argc != 3)
  294. SendMsg(501,"Missing required parameter.");
  295. else if (COptions::GetOption(Args[2], cBuf, TRUE))
  296. SendMsg(200, "%s", cBuf);
  297. else
  298. SendMsg(550,"Failed to get option. (syntax: Group/Option)");
  299. break;
  300. case CMD_LUSR: // List users
  301. if (CUsr::ListUsers(UT_USER, Args.m_argc > 2 ? Args.Arg(2) : "",cBuf, m_LocalEcho))
  302. SendCtrlMsg(200, cBuf);
  303. else
  304. SendCtrlMsg(550,"No match.");
  305. break;
  306. case CMD_LUST: // List users (with type)
  307. if (CUsr::ListUsers(
  308. atoi(Args.Arg(2)), Args.m_argc > 3 ? Args.Arg(3) : "",cBuf, m_LocalEcho))
  309. SendCtrlMsg(200, cBuf);
  310. else
  311. SendCtrlMsg(550,"No match.");
  312. break;
  313. case CMD_CRUS: // Create user name
  314. if ((ival = CUsr::AddUser(UT_USER,Args.Arg(2))) == 0)
  315. SendMsg(550,"Failed to create user <%s>.", Args.Arg(2));
  316. else
  317. SendMsg(200,"User %d <%s> created. Account is not activated.", ival, Args.Arg(2));
  318. break;
  319. case CMD_CRGR: // Create group name
  320. if ((ival = CUsr::AddUser(UT_GROUP,Args.Arg(2))) == 0)
  321. SendMsg(550,"Failed to create user <%s>.", Args.Arg(2));
  322. else
  323. SendMsg(200,"User %d <%s> created. Account is not activated.", ival, Args.Arg(2));
  324. break;
  325. case CMD_CRCL: // Create class name
  326. if ((ival = CUsr::AddUser(UT_CLASS,Args.Arg(2))) == 0)
  327. SendMsg(550,"Failed to create user <%s>.", Args.Arg(2));
  328. else
  329. SendMsg(200,"User %d <%s> created. Account is not activated.", ival, Args.Arg(2));
  330. break;
  331. case CMD_CRVS: // Create virtual server name
  332. if ((ival = CUsr::AddUser(UT_SYSTEM,Args.Arg(2))) == 0)
  333. SendMsg(550,"Failed to create user <%s>.", Args.Arg(2));
  334. else
  335. SendMsg(200,"User %d <%s> created. Account is not activated.", ival, Args.Arg(2));
  336. break;
  337. case CMD_DELUS: // Delete user
  338. if (!CUsr::DeleteUser(Args.Arg(2)))
  339. SendMsg(550,"Failed to delete user <%s>.", Args.Arg(2));
  340. else
  341. SendMsg(200,"User <%s> deleted.", Args.Arg(2));
  342. break;
  343. case CMD_RENUS: // Rename user
  344. if (!CUsr::RenameUser(Args.Arg(2), Args.Arg(3)))
  345. SendMsg(550,"Failed to Rename user <%s>.", Args.Arg(2));
  346. else
  347. SendMsg(200,"User <%s>.", Args.Arg(2));
  348. break;
  349. case CMD_SHUS: // Show user
  350. if (Args.m_argc != 3)
  351. SendMsg(501,"Missing required parameter.");
  352. else if (CUsr::ListUserParams(UT_USER,Args.Arg(2), cBuf))
  353. SendMsg(200, cBuf);
  354. else
  355. SendMsg(550,"User <%s> not found.", Args.Arg(2));
  356. break;
  357. case CMD_FUNO: // Find user number
  358. ASSERT(Args.m_argc == 3);
  359. if (!CUsr::FindUser(atoi(Args.Arg(2)), cBuf))
  360. SendMsg(550,"User #%s not found.", Args.Arg(2));
  361. else
  362. SendMsg(200,"%s", cBuf);
  363. break;
  364. case CMD_FUNA: // Find user name
  365. ASSERT(Args.m_argc == 4);
  366. if ((MyUser = CUsr::FindUser(atoi(Args.Arg(3)), Args.Arg(2))) == INVALID_USER_VALUE)
  367. SendMsg(550,"User %s not found.", Args.Arg(2));
  368. else
  369. SendMsg(200,"%d", MyUser);
  370. break;
  371. case CMD_STUS: // Set user
  372. if (Args.m_argc != 3)
  373. SendMsg(501,"Missing required parameter.");
  374. else if (CUsr::SetUserOption(UT_USER, Args.Arg(2)))
  375. SendMsg(200, "OK");
  376. else
  377. SendMsg(550,"Failed to set User option. (syntax: User/Option=new value)");
  378. break;
  379. case CMD_GUOP:
  380. ASSERT(Args.m_argc == 4);
  381. if (CUsr::GetUserOption(UT_USER, Args.Arg(3), cBuf))
  382. SendMsg(200, "%s", cBuf);
  383. else
  384. SendMsg(550,"Failed to get User option. (syntax: User/Option=default value)");
  385. break;
  386. case CMD_EVON: //
  387. if (m_Events->Register(atoi(Args.Arg(2))))
  388. SendMsg(200, "Events %d (0x%x) is enabled.", 
  389. m_Events->m_EventTypes, m_Events->m_EventTypes);
  390. else
  391. SendMsg(550,"Failed to register one or more events");
  392. break;
  393. case CMD_EVOF:
  394. m_Events->Close(atoi(Args.Arg(2)));
  395. SendMsg(200, "Event(s) %d is closed", atoi(Args.Arg(2)));
  396. break;
  397. case CMD_STAT:
  398. CDaemonStatusSvr::GetStats(cBuf);
  399. SendMsg(200, cBuf);
  400. break;
  401. case CMD_VER:
  402. SendMsg(200, "%s %s%s %s",
  403. CProgramInfo::m_PROGRAM,
  404. CProgramInfo::m_VERSION,
  405. #ifdef _DEBUG
  406. "-DEBUG",
  407. #else
  408. "",
  409. #endif // DEBUG
  410. CProgramInfo::m_COPYRIGHT);
  411. break;
  412. case CMD_SHDN: // Shutdown
  413. SendMsg(200, "System is shutting down.");
  414. CDaemonNotificationWnd::GetWin()->PostMessage(WM_COMMAND, ID_MENU_STOPANDQUIT);
  415. break;
  416. case CMD_GONL: // Go online
  417. SendMsg(200, "OK");
  418. CDaemonNotificationWnd::GetWin()->PostMessage(WM_COMMAND, ID_MENU_GOONLINE);
  419. break;
  420. case CMD_GOOF: // Go offline
  421. SendMsg(200, "OK");
  422. CDaemonNotificationWnd::GetWin()->PostMessage(WM_COMMAND, ID_MENU_GOOFFLINE);
  423. break;
  424. case CMD_RSTR: // Restart
  425. SendMsg(200, "System is restarting down.");
  426. CDaemonNotificationWnd::GetWin()->PostMessage(WM_COMMAND, ID_MENU_RESTART);
  427. break;
  428. case CMD_LDIR: // List directory
  429. {
  430. /*
  431. CFileInfoList List;
  432. if (CFsys::GetFsys()->BldFileInfoList(m_User, "", List, "", Args.Arg(2), TRUE))
  433. {
  434. List.ListRaw(cBuf);
  435. SendMsg(200, "%s", cBuf);
  436. }
  437. else*/
  438. if (m_pFsys)
  439. m_pFsys->Logout();
  440. m_pFsys = new CRAFsys((LPVOID *)&m_pFsys);
  441. if (!m_pFsys->List(Args.Arg(2), this))
  442. {
  443. SendMsg(550, "Failed to list directory '%s'", Args.Arg(2));
  444. }
  445. }
  446. break;
  447. case CMD_CHMOD: 
  448. {
  449. if (m_pFsys)
  450. m_pFsys->Logout();
  451. m_pFsys = new CRAFsys((LPVOID *)&m_pFsys);
  452. CCmdArgs MyArgs("chmod", Args[1], m_Parser);
  453. if (!m_pFsys->ChMod(MyArgs, this))
  454. {
  455. SendMsg(451, "chmod failed.");
  456. LogMsg(LOGF_WARNINGS,"chmod failed before callback");
  457. }
  458. }
  459. break;
  460. // Command errors
  461. case CMD_MISSING_PARAMETER:
  462. SendMsg(501,"Missing parameter in command %s", Text);
  463. break;
  464. case CMD_UNKNOWN_COMMAND:
  465. SendMsg(500, "%s: unrecognized command.", Text);
  466. break;
  467. case CMD_NOT_IMPLEMENTED:
  468. SendMsg(502, "%s: command not implemented.", Text);
  469. break;
  470. case CMD_BAD_LEVEL:
  471. SendMsg(530, "Please login with USER and PASS.");
  472. break;
  473. case CMD_PARSE_ERROR:
  474. case CMD_UNKNOWN_PARAMETER:
  475. SendMsg(500,"'%s': command not understood.", Text);
  476. break;
  477. default:
  478. SendMsg(502,"%s: Command not implemented.", Args.Arg(0));
  479. break;
  480. }
  481. prompt:
  482. if (!m_LocalEcho)
  483. break;
  484. SendCtrlMsg(230,"Command: ", FALSE, FALSE);
  485. break;
  486. default:
  487. SendCtrlMsg(451,"Server error. Unhandled value in m_State.nCommand: ", FALSE, FALSE);
  488. }
  489. if ((m_LocalEcho == '*') && (m_State != GOTNAME))
  490. m_LocalEcho = 1;
  491. return Rval;;
  492. }
  493. void CDaemonMaintananceSocket::Virgin()
  494. {
  495. CTextSock::Virgin();
  496. }
  497. BOOL CDaemonMaintananceSocket::ProcessTelnetNegotiation(int ch1, int ch2)
  498. {
  499. return CTextSock::ProcessTelnetNegotiation(ch1, ch2);
  500. }
  501. void CDaemonMaintananceSocket::InsertPendingText()
  502. {
  503. CTextSock::InsertPendingText();
  504. }
  505. BOOL CDaemonMaintananceSocket::ExpandMacro(LPSTR *To, LPCSTR MacroName, int AvailBytes)
  506. {
  507.  if (CTextSock::ExpandMacro(To, MacroName, AvailBytes))
  508. return TRUE;
  509. // TODO: Add expansion here and return TRUE if the macro was expanded
  510. return FALSE;
  511. }
  512. void CDaemonMaintananceSocket::OnConnect( int nErrorCode )
  513. {
  514. try
  515. {
  516. _OnConnect(nErrorCode);
  517. }
  518. catch(CSocketException *pExc)
  519. {
  520. LogMsg(LOGF_DEBUG,"CDaemonMaintananceSocket::OnConnect(%d) - Caught exception '%s' from module %s",
  521. nErrorCode, pExc->m_ErrorText, pExc->m_ErrorText);
  522. if (!OnHandleWinsockErr(pExc->m_ErrorNum))
  523. delete this;
  524. delete pExc;
  525. }
  526. catch(...)
  527. {
  528. CLog::GetLog()->LogMsg(LOGF_ERROR,"CDaemonMaintananceSocket::OnConnect(%d) - Caught unknown exception", nErrorCode);
  529. }
  530. }
  531. void CDaemonMaintananceSocket::_OnConnect( int nErrorCode )
  532. {
  533. CTextSock::OnConnect(nErrorCode);
  534. }
  535. void CDaemonMaintananceSocket::OnClose( int nErrorCode )
  536. {
  537. try
  538. {
  539. CTextSock::OnClose(nErrorCode);
  540. }
  541. catch(CSocketException *pExc)
  542. {
  543. LogMsg(LOGF_DEBUG,"CDaemonMaintananceSocket::OnClose(%d) - Caught exception '%s' from module %s",
  544. nErrorCode, pExc->m_ErrorText, pExc->m_ErrorText);
  545. if (!OnHandleWinsockErr(pExc->m_ErrorNum))
  546. delete this;
  547. delete pExc;
  548. }
  549. catch(...)
  550. {
  551. CLog::GetLog()->LogMsg(LOGF_ERROR,"CDaemonMaintananceSocket::OnClose(%d) - Caught unknown exception", nErrorCode);
  552. }
  553. }
  554. void CDaemonMaintananceSocket::OnSend( int nErrorCode )
  555. {
  556. try
  557. {
  558. CTextSock::OnSend(nErrorCode);
  559. }
  560. catch(CSocketException *pExc)
  561. {
  562. LogMsg(LOGF_DEBUG,"CDaemonMaintananceSocket::OnSend(%d) - Caught exception '%s' from module %s",
  563. nErrorCode, pExc->m_ErrorText, pExc->m_ErrorText);
  564. if (!OnHandleWinsockErr(pExc->m_ErrorNum))
  565. delete this;
  566. delete pExc;
  567. }
  568. catch(...)
  569. {
  570. CLog::GetLog()->LogMsg(LOGF_ERROR,"CDaemonMaintananceSocket::OnSend(%d) - Caught unknown exception", nErrorCode);
  571. }
  572. }
  573. void CDaemonMaintananceSocket::OnOutOfBandData( int nErrorCode )
  574. {
  575. try
  576. {
  577. CTextSock::OnOutOfBandData(nErrorCode);
  578. }
  579. catch(CSocketException *pExc)
  580. {
  581. LogMsg(LOGF_DEBUG,"CDaemonMaintananceSocket::OnOutOfBandData(%d) - Caught exception '%s' from module %s",
  582. nErrorCode, pExc->m_ErrorText, pExc->m_ErrorText);
  583. if (!OnHandleWinsockErr(pExc->m_ErrorNum))
  584. delete this;
  585. delete pExc;
  586. }
  587. catch(...)
  588. {
  589. CLog::GetLog()->LogMsg(LOGF_ERROR,"CDaemonMaintananceSocket::OnOutOfBandData(%d) - Caught unknown exception", nErrorCode);
  590. }
  591. }
  592. void CDaemonMaintananceSocket::OnReceive( int nErrorCode )
  593. {
  594. try
  595. {
  596. CTextSock::OnReceive(nErrorCode);
  597. }
  598. catch(CSocketException *pExc)
  599. {
  600. LogMsg(LOGF_DEBUG,"CDaemonMaintananceSocket::OnReceive(%d) - Caught exception '%s' from module %s",
  601. nErrorCode, pExc->m_ErrorText, pExc->m_ErrorText);
  602. if (!OnHandleWinsockErr(pExc->m_ErrorNum))
  603. delete this;
  604. delete pExc;
  605. }
  606. catch(...)
  607. {
  608. CLog::GetLog()->LogMsg(LOGF_ERROR,"CDaemonMaintananceSocket::OnReceive(%d) - Caught unknown exception", nErrorCode);
  609. }
  610. }
  611. //////////////////////////////////////////////////////////////////////////////////////////
  612. // CRAFsys
  613. CRAFsys::CRAFsys(LPVOID *pRef)
  614. :CUserFsys(pRef)
  615. {
  616. m_NextStep = 0;
  617. m_AsyncSelectMaskSaved = 0;
  618. m_StateSaved = 0;
  619. m_pSock = NULL;
  620. }
  621. BOOL CRAFsys::SetOnHold()
  622. {
  623. m_AsyncSelectMaskSaved = m_pSock->m_AsyncSelectMask;
  624. m_StateSaved = m_pSock->m_State;
  625. // Prevent socket read/write events
  626. m_pSock->m_AsyncSelectMask &= ~(FD_READ);
  627. m_pSock->AsyncSelect(m_pSock->m_AsyncSelectMask);
  628. // Set block state
  629. m_pSock->m_State = HOLD;
  630. return TRUE;
  631. }
  632. void CRAFsys::ReleaseHold()
  633. {
  634. m_pSock->m_State = m_StateSaved;
  635. m_pSock->m_AsyncSelectMask = m_AsyncSelectMaskSaved;
  636. m_pSock->AsyncSelect(m_pSock->m_AsyncSelectMask);
  637. }
  638. void CRAFsys::CheckForZombie()
  639. {
  640. CUserFsys::CheckForZombie();
  641. }
  642. BOOL CRAFsys::Create(CDaemonMaintananceSocket *pSock)
  643. {
  644. m_pSock = pSock;
  645. m_IsAdmin = CUsr::IsAdmin(m_pSock->m_User);
  646. USER Class = CUsr::GetUserClass(m_pSock->m_User);
  647. return CUserFsys::Create("/", "/", m_pSock->m_User, Class, pSock->m_SocketName);
  648. }
  649. // Called after the file system is initialized
  650. // for the user
  651. BOOL CRAFsys::OnCreate(int nErrorCode)
  652. {
  653. CUserFsys::OnCreate(nErrorCode);
  654. if (nErrorCode)
  655. {
  656. m_pSock->SendMsg(421, "Internal error - unable to initialize your file system");
  657. m_pSock->LogMsg(LOGF_ERROR,"Unable to initialize the users file system.");
  658. delete this;
  659. return FALSE;
  660. }
  661. return NextStep();
  662. }
  663. BOOL CRAFsys::NextStep()
  664. {
  665. switch(m_NextStep)
  666. {
  667. case DOLIST:
  668. if (!DoList())
  669. {
  670. m_pSock->SendMsg(421, "Internal error - unable to proceed with list");
  671. m_pSock->LogMsg(LOGF_ERROR,"Unable to initialize the users file system.");
  672. delete this;
  673. return FALSE;
  674. }
  675. break;
  676. case DOCHMOD:
  677. if (!DoChmod())
  678. {
  679. m_pSock->SendMsg(421, "Internal error - unable to proceed with list");
  680. m_pSock->LogMsg(LOGF_ERROR,"Unable to initialize the users file system.");
  681. delete this;
  682. return FALSE;
  683. }
  684. break;
  685. default:
  686. m_pSock->SendMsg(421, "Internal error - Invalid next step %d", m_NextStep);
  687. m_pSock->LogMsg(LOGF_ERROR,"Internal error - Invalid next step %d", m_NextStep);
  688. delete this;
  689. return FALSE;
  690. }
  691. return TRUE;
  692. }
  693. BOOL CRAFsys::List(LPCSTR Path, CDaemonMaintananceSocket *pSock)
  694. {
  695. m_Path = Path;
  696. // Create the file system
  697. m_NextStep = DOLIST;
  698. return Create(pSock);
  699. }
  700. BOOL CRAFsys::DoList()
  701. {
  702. m_NextStep = 0;
  703. m_FsysPath1 = m_Path;
  704. return ProcessRequest(FSM_WLST, (WPARAM)this, 0);
  705. }
  706. BOOL CRAFsys::OnWlist(int nErrorCode)
  707. {
  708. // List raw.
  709. if (nErrorCode)
  710. m_pSock->SendMsg(550, "WLIST failed with error code %d", nErrorCode);
  711. else
  712. m_pSock->SendMsg(200, "%s", m_FsysPath2);
  713. Logout();
  714. return TRUE;
  715. }
  716. BOOL CRAFsys::ChMod(CCmdArgs& Args, CDaemonMaintananceSocket *pSock)
  717. {
  718. m_CmdArgStore = Args;
  719. // Create the file system
  720. m_NextStep = DOCHMOD;
  721. return Create(pSock);
  722. }
  723. BOOL CRAFsys::DoChmod()
  724. {
  725. m_NextStep = 0;
  726. m_FsysPath1 = m_Path;
  727. return CUserFsys::ChMod(m_CmdArgStore);
  728. }
  729. BOOL CRAFsys::OnChmod(int nErrorCode)
  730. {
  731. if (nErrorCode && m_Output.IsEmpty())
  732. {
  733. m_pSock->SendMsg(551, "chmod failed.");
  734. m_pSock->LogMsg(LOGF_WARNINGS,"chmod failed after callback, error %d", nErrorCode);
  735. }
  736. else
  737. {
  738. m_pSock->SuspendMacros();
  739. m_pSock->SendMsg(200, "chmod: %s", m_Output);
  740. m_pSock->EnableMacros();
  741. }
  742. Logout();
  743. return TRUE;
  744. }