UsrMailList.cpp
上传用户:woshihumen
上传日期:2013-07-18
资源大小:484k
文件大小:11k
源码类别:

Email服务器

开发平台:

Visual C++

  1. /*
  2.  *  XMail by Davide Libenzi ( Intranet and Internet mail server )
  3.  *  Copyright (C) 1999,..,2004  Davide Libenzi
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  *  Davide Libenzi <davidel@xmailserver.org>
  20.  *
  21.  */
  22. #include "SysInclude.h"
  23. #include "SysDep.h"
  24. #include "SvrDefines.h"
  25. #include "ShBlocks.h"
  26. #include "ResLocks.h"
  27. #include "StrUtils.h"
  28. #include "SList.h"
  29. #include "BuffSock.h"
  30. #include "MailConfig.h"
  31. #include "UsrUtils.h"
  32. #include "SvrUtils.h"
  33. #include "MessQueue.h"
  34. #include "SMAILUtils.h"
  35. #include "QueueUtils.h"
  36. #include "MailSvr.h"
  37. #include "MiscUtils.h"
  38. #include "POP3GwLink.h"
  39. #include "UsrMailList.h"
  40. #define MLU_TABLE_LINE_MAX          512
  41. enum MLUsrFileds {
  42. mlusrAddress = 0,
  43. mlusrPerms,
  44. mlusrMax
  45. };
  46. struct MLUsersScanData {
  47. char szTmpDBFile[SYS_MAX_PATH];
  48. FILE *pDBFile;
  49. };
  50. static MLUserInfo *UsrMLGetUserFromStrings(char **ppszStrings);
  51. static int UsrMLWriteUser(FILE * pMLUFile, MLUserInfo const *pMLUI);
  52. static MLUserInfo *UsrMLGetUserFromStrings(char **ppszStrings)
  53. {
  54. int iFieldsCount = StrStringsCount(ppszStrings);
  55. if (iFieldsCount <= mlusrAddress)
  56. return (NULL);
  57. MLUserInfo *pMLUI = (MLUserInfo *) SysAlloc(sizeof(MLUserInfo));
  58. if (pMLUI == NULL)
  59. return (NULL);
  60. pMLUI->pszAddress = SysStrDup(ppszStrings[mlusrAddress]);
  61. if (iFieldsCount > mlusrPerms)
  62. pMLUI->pszPerms = SysStrDup(ppszStrings[mlusrPerms]);
  63. else
  64. pMLUI->pszPerms = SysStrDup(DEFAULT_MLUSER_PERMS);
  65. return (pMLUI);
  66. }
  67. MLUserInfo *UsrMLAllocDefault(char const *pszAddress, char const *pszPerms)
  68. {
  69. MLUserInfo *pMLUI = (MLUserInfo *) SysAlloc(sizeof(MLUserInfo));
  70. if (pMLUI == NULL)
  71. return (NULL);
  72. pMLUI->pszAddress = SysStrDup(pszAddress);
  73. if (pszPerms != NULL)
  74. pMLUI->pszPerms = SysStrDup(pszPerms);
  75. else
  76. pMLUI->pszPerms = SysStrDup(DEFAULT_MLUSER_PERMS);
  77. return (pMLUI);
  78. }
  79. int UsrMLFreeUser(MLUserInfo * pMLUI)
  80. {
  81. if (pMLUI->pszPerms != NULL)
  82. SysFree(pMLUI->pszPerms);
  83. if (pMLUI->pszAddress != NULL)
  84. SysFree(pMLUI->pszAddress);
  85. SysFree(pMLUI);
  86. return (0);
  87. }
  88. int UsrMLCheckUserPost(UserInfo * pUI, char const *pszUser, char const *pszLogonUser)
  89. {
  90. char *pszClosed = UsrGetUserInfoVar(pUI, "ClosedML");
  91. if (pszClosed != NULL) {
  92. int iClosedML = atoi(pszClosed);
  93. SysFree(pszClosed);
  94. if (iClosedML) {
  95. USRML_HANDLE hUsersDB = UsrMLOpenDB(pUI);
  96. if (hUsersDB == INVALID_USRML_HANDLE)
  97. return (ErrGetErrorCode());
  98. ///////////////////////////////////////////////////////////////////////////////
  99. //  Mailing list scan
  100. ///////////////////////////////////////////////////////////////////////////////
  101. MLUserInfo *pMLUI = UsrMLGetFirstUser(hUsersDB);
  102. for (; pMLUI != NULL; pMLUI = UsrMLGetNextUser(hUsersDB)) {
  103. if (((stricmp(pszUser, pMLUI->pszAddress) == 0) &&
  104.      (strchr(pMLUI->pszPerms, 'W') != NULL)) ||
  105.     ((pszLogonUser != NULL) &&
  106.      (stricmp(pszLogonUser, pMLUI->pszAddress) == 0) &&
  107.      (strchr(pMLUI->pszPerms, 'A') != NULL))) {
  108. UsrMLFreeUser(pMLUI);
  109. UsrMLCloseDB(hUsersDB);
  110. return (0);
  111. }
  112. UsrMLFreeUser(pMLUI);
  113. }
  114. UsrMLCloseDB(hUsersDB);
  115. ErrSetErrorCode(ERR_MLUSER_NOT_FOUND, pszUser);
  116. return (ERR_MLUSER_NOT_FOUND);
  117. }
  118. }
  119. return (0);
  120. }
  121. static int UsrMLWriteUser(FILE * pMLUFile, MLUserInfo const *pMLUI)
  122. {
  123. ///////////////////////////////////////////////////////////////////////////////
  124. //  User email address
  125. ///////////////////////////////////////////////////////////////////////////////
  126. char *pszQuoted = StrQuote(pMLUI->pszAddress, '"');
  127. if (pszQuoted == NULL)
  128. return (ErrGetErrorCode());
  129. fprintf(pMLUFile, "%st", pszQuoted);
  130. ///////////////////////////////////////////////////////////////////////////////
  131. //  User permissions
  132. ///////////////////////////////////////////////////////////////////////////////
  133. if ((pszQuoted = StrQuote(pMLUI->pszPerms, '"')) == NULL)
  134. return (ErrGetErrorCode());
  135. fprintf(pMLUFile, "%sn", pszQuoted);
  136. SysFree(pszQuoted);
  137. return (0);
  138. }
  139. int UsrMLAddUser(UserInfo * pUI, MLUserInfo const *pMLUI)
  140. {
  141. if (UsrGetUserType(pUI) != usrTypeML) {
  142. ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST);
  143. return (ERR_USER_NOT_MAILINGLIST);
  144. }
  145. char szMLTablePath[SYS_MAX_PATH] = "";
  146. UsrGetMLTableFilePath(pUI, szMLTablePath, sizeof(szMLTablePath));
  147. char szResLock[SYS_MAX_PATH] = "";
  148. RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMLTablePath, szResLock,
  149.   sizeof(szResLock)));
  150. if (hResLock == INVALID_RLCK_HANDLE)
  151. return (ErrGetErrorCode());
  152. FILE *pMLUFile = fopen(szMLTablePath, "r+t");
  153. if (pMLUFile == NULL) {
  154. RLckUnlockEX(hResLock);
  155. ErrSetErrorCode(ERR_NO_USER_MLTABLE_FILE);
  156. return (ERR_NO_USER_MLTABLE_FILE);
  157. }
  158. char szMLULine[MLU_TABLE_LINE_MAX] = "";
  159. while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUFile) != NULL) {
  160. char **ppszStrings = StrGetTabLineStrings(szMLULine);
  161. if (ppszStrings == NULL)
  162. continue;
  163. int iFieldsCount = StrStringsCount(ppszStrings);
  164. if ((iFieldsCount >= mlusrAddress) &&
  165.     (stricmp(ppszStrings[mlusrAddress], pMLUI->pszAddress) == 0)) {
  166. StrFreeStrings(ppszStrings);
  167. fclose(pMLUFile);
  168. RLckUnlockEX(hResLock);
  169. ErrSetErrorCode(ERR_MLUSER_ALREADY_EXIST);
  170. return (ERR_MLUSER_ALREADY_EXIST);
  171. }
  172. StrFreeStrings(ppszStrings);
  173. }
  174. fseek(pMLUFile, 0, SEEK_END);
  175. if (UsrMLWriteUser(pMLUFile, pMLUI) < 0) {
  176. fclose(pMLUFile);
  177. RLckUnlockEX(hResLock);
  178. return (ErrGetErrorCode());
  179. }
  180. fclose(pMLUFile);
  181. RLckUnlockEX(hResLock);
  182. return (0);
  183. }
  184. int UsrMLRemoveUser(UserInfo * pUI, const char *pszMLUser)
  185. {
  186. if (UsrGetUserType(pUI) != usrTypeML) {
  187. ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST);
  188. return (ERR_USER_NOT_MAILINGLIST);
  189. }
  190. char szMLTablePath[SYS_MAX_PATH] = "";
  191. UsrGetMLTableFilePath(pUI, szMLTablePath, sizeof(szMLTablePath));
  192. char szTmpFile[SYS_MAX_PATH] = "";
  193. SysGetTmpFile(szTmpFile);
  194. char szResLock[SYS_MAX_PATH] = "";
  195. RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMLTablePath, szResLock,
  196.   sizeof(szResLock)));
  197. if (hResLock == INVALID_RLCK_HANDLE)
  198. return (ErrGetErrorCode());
  199. FILE *pMLUFile = fopen(szMLTablePath, "rt");
  200. if (pMLUFile == NULL) {
  201. RLckUnlockEX(hResLock);
  202. ErrSetErrorCode(ERR_NO_USER_MLTABLE_FILE);
  203. return (ERR_NO_USER_MLTABLE_FILE);
  204. }
  205. FILE *pTmpFile = fopen(szTmpFile, "wt");
  206. if (pTmpFile == NULL) {
  207. fclose(pMLUFile);
  208. RLckUnlockEX(hResLock);
  209. ErrSetErrorCode(ERR_FILE_CREATE);
  210. return (ERR_FILE_CREATE);
  211. }
  212. int iMLUserFound = 0;
  213. char szMLULine[MLU_TABLE_LINE_MAX] = "";
  214. while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUFile) != NULL) {
  215. char **ppszStrings = StrGetTabLineStrings(szMLULine);
  216. if (ppszStrings == NULL)
  217. continue;
  218. int iFieldsCount = StrStringsCount(ppszStrings);
  219. if ((iFieldsCount >= mlusrAddress) &&
  220.     (stricmp(ppszStrings[mlusrAddress], pszMLUser) == 0)) {
  221. ++iMLUserFound;
  222. } else
  223. fprintf(pTmpFile, "%sn", szMLULine);
  224. StrFreeStrings(ppszStrings);
  225. }
  226. fclose(pMLUFile);
  227. fclose(pTmpFile);
  228. if (iMLUserFound == 0) {
  229. SysRemove(szTmpFile);
  230. RLckUnlockEX(hResLock);
  231. ErrSetErrorCode(ERR_MLUSER_NOT_FOUND);
  232. return (ERR_MLUSER_NOT_FOUND);
  233. }
  234. char szTmpMLFilePath[SYS_MAX_PATH] = "";
  235. sprintf(szTmpMLFilePath, "%s.tmp", szMLTablePath);
  236. if (MscMoveFile(szMLTablePath, szTmpMLFilePath) < 0) {
  237. RLckUnlockEX(hResLock);
  238. return (ErrGetErrorCode());
  239. }
  240. if (MscMoveFile(szTmpFile, szMLTablePath) < 0) {
  241. MscMoveFile(szTmpMLFilePath, szMLTablePath);
  242. RLckUnlockEX(hResLock);
  243. return (ErrGetErrorCode());
  244. }
  245. SysRemove(szTmpMLFilePath);
  246. RLckUnlockEX(hResLock);
  247. return (0);
  248. }
  249. int UsrMLGetUsersFileSnapShot(UserInfo * pUI, const char *pszFileName)
  250. {
  251. char szMLTablePath[SYS_MAX_PATH] = "";
  252. UsrGetMLTableFilePath(pUI, szMLTablePath, sizeof(szMLTablePath));
  253. char szResLock[SYS_MAX_PATH] = "";
  254. RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szMLTablePath, szResLock,
  255.   sizeof(szResLock)));
  256. if (hResLock == INVALID_RLCK_HANDLE)
  257. return (ErrGetErrorCode());
  258. if (MscCopyFile(pszFileName, szMLTablePath) < 0) {
  259. RLckUnlockSH(hResLock);
  260. return (ErrGetErrorCode());
  261. }
  262. RLckUnlockSH(hResLock);
  263. return (0);
  264. }
  265. USRML_HANDLE UsrMLOpenDB(UserInfo * pUI)
  266. {
  267. MLUsersScanData *pMLUSD = (MLUsersScanData *) SysAlloc(sizeof(MLUsersScanData));
  268. if (pMLUSD == NULL)
  269. return (INVALID_USRML_HANDLE);
  270. SysGetTmpFile(pMLUSD->szTmpDBFile);
  271. if (UsrMLGetUsersFileSnapShot(pUI, pMLUSD->szTmpDBFile) < 0) {
  272. SysFree(pMLUSD);
  273. return (INVALID_USRML_HANDLE);
  274. }
  275. if ((pMLUSD->pDBFile = fopen(pMLUSD->szTmpDBFile, "rt")) == NULL) {
  276. SysRemove(pMLUSD->szTmpDBFile);
  277. SysFree(pMLUSD);
  278. return (INVALID_USRML_HANDLE);
  279. }
  280. return ((USRML_HANDLE) pMLUSD);
  281. }
  282. void UsrMLCloseDB(USRML_HANDLE hUsersDB)
  283. {
  284. MLUsersScanData *pMLUSD = (MLUsersScanData *) hUsersDB;
  285. fclose(pMLUSD->pDBFile);
  286. SysRemove(pMLUSD->szTmpDBFile);
  287. SysFree(pMLUSD);
  288. }
  289. MLUserInfo *UsrMLGetFirstUser(USRML_HANDLE hUsersDB)
  290. {
  291. MLUsersScanData *pMLUSD = (MLUsersScanData *) hUsersDB;
  292. rewind(pMLUSD->pDBFile);
  293. char szMLULine[MLU_TABLE_LINE_MAX] = "";
  294. while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUSD->pDBFile) != NULL) {
  295. char **ppszStrings = StrGetTabLineStrings(szMLULine);
  296. if (ppszStrings == NULL)
  297. continue;
  298. MLUserInfo *pMLUI = UsrMLGetUserFromStrings(ppszStrings);
  299. if (pMLUI != NULL) {
  300. StrFreeStrings(ppszStrings);
  301. return (pMLUI);
  302. }
  303. StrFreeStrings(ppszStrings);
  304. }
  305. return (NULL);
  306. }
  307. MLUserInfo *UsrMLGetNextUser(USRML_HANDLE hUsersDB)
  308. {
  309. MLUsersScanData *pMLUSD = (MLUsersScanData *) hUsersDB;
  310. char szMLULine[MLU_TABLE_LINE_MAX] = "";
  311. while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUSD->pDBFile) != NULL) {
  312. char **ppszStrings = StrGetTabLineStrings(szMLULine);
  313. if (ppszStrings == NULL)
  314. continue;
  315. MLUserInfo *pMLUI = UsrMLGetUserFromStrings(ppszStrings);
  316. if (pMLUI != NULL) {
  317. StrFreeStrings(ppszStrings);
  318. return (pMLUI);
  319. }
  320. StrFreeStrings(ppszStrings);
  321. }
  322. return (NULL);
  323. }