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

Email服务器

开发平台:

Visual C++

  1. /*
  2.  *  MkUsers by Davide Libenzi ( bulk mail users generator for XMail )
  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. #if defined(WIN32)
  23. #include <stdio.h>
  24. #include <io.h>
  25. #include <direct.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #define SYS_SLASH_CHAR              '\'
  29. #define SYS_SLASH_STR               "\"
  30. #define SYS_MAX_PATH                256
  31. int SysPathExist(char const *pszPathName)
  32. {
  33. return ((_access(pszPathName, 0) == 0) ? 1 : 0);
  34. }
  35. int SysMakeDir(char const *pszPathName)
  36. {
  37. return ((_mkdir(pszPathName) == 0) ? 1 : 0);
  38. }
  39. int SysErrNo(void)
  40. {
  41. return (errno);
  42. }
  43. char const *SysErrStr(void)
  44. {
  45. return (strerror(errno));
  46. }
  47. #else // #if defined(WIN32)
  48. #if defined(__LINUX__) || defined(__SOLARIS__) || defined(__BSD__)
  49. #include <sys/stat.h>
  50. #include <stdio.h>
  51. #include <stdlib.h>
  52. #include <string.h>
  53. #include <ctype.h>
  54. #include <time.h>
  55. #include <fcntl.h>
  56. #include <unistd.h>
  57. #include <errno.h>
  58. #include <dirent.h>
  59. #define SYS_SLASH_CHAR              '/'
  60. #define SYS_SLASH_STR               "/"
  61. #define SYS_MAX_PATH                256
  62. int SysPathExist(char const *pszPathName)
  63. {
  64. return ((access(pszPathName, 0) == 0) ? 1 : 0);
  65. }
  66. int SysMakeDir(char const *pszPathName)
  67. {
  68. return ((mkdir(pszPathName, 0700) == 0) ? 1 : 0);
  69. }
  70. int SysErrNo(void)
  71. {
  72. return (errno);
  73. }
  74. char const *SysErrStr(void)
  75. {
  76. return (strerror(errno));
  77. }
  78. #else // #if defined(__LINUX__) || defined(__SOLARIS__)
  79. #error system type not defined !
  80. #endif // #if defined(__LINUX__) || defined(__SOLARIS__)
  81. #endif // #if defined(WIN32)
  82. #define MAX_MB_SIZE             10000
  83. #define StrNCpy(t, s, n)        do { strncpy(t, s, n); (t)[(n) - 1] = ''; } while (0)
  84. #define StrSNCpy(t, s)          StrNCpy(t, s, sizeof(t))
  85. char *StrCrypt(char const *pszInput, char *pszCrypt)
  86. {
  87. strcpy(pszCrypt, "");
  88. for (int ii = 0; pszInput[ii] != ''; ii++) {
  89. unsigned int uChar = (unsigned int) pszInput[ii];
  90. char szByte[32] = "";
  91. sprintf(szByte, "%02x", (uChar ^ 101) & 0xff);
  92. strcat(pszCrypt, szByte);
  93. }
  94. return (pszCrypt);
  95. }
  96. int CreateUser(char const *pszRootDir, char const *pszDomain,
  97.        char const *pszUsername, char const *pszPassword,
  98.        unsigned int uUserId, char const *pszRealName,
  99.        char const *pszHomePage, unsigned int uMBSize, bool bMaildir, FILE * pUsrFile)
  100. {
  101. FILE *pTabFile;
  102. char szPathName[SYS_MAX_PATH] = "";
  103. char szCryptPwd[256] = "";
  104. ///////////////////////////////////////////////////////////////////////////////
  105. //  Check-create domain directory
  106. ///////////////////////////////////////////////////////////////////////////////
  107. sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s", pszRootDir, pszDomain);
  108. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  109. perror(szPathName);
  110. return (SysErrNo());
  111. }
  112. ///////////////////////////////////////////////////////////////////////////////
  113. //  Check-create domain/user directory
  114. ///////////////////////////////////////////////////////////////////////////////
  115. sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s", pszRootDir,
  116. pszDomain, pszUsername);
  117. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  118. perror(szPathName);
  119. return (SysErrNo());
  120. }
  121. if (bMaildir) {
  122. ///////////////////////////////////////////////////////////////////////////////
  123. //  Check-create domain/user/Maildir/(tmp,new,cur) directories
  124. ///////////////////////////////////////////////////////////////////////////////
  125. sprintf(szPathName,
  126. "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir",
  127. pszRootDir, pszDomain, pszUsername);
  128. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  129. perror(szPathName);
  130. return (SysErrNo());
  131. }
  132. sprintf(szPathName,
  133. "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir"
  134. SYS_SLASH_STR "tmp", pszRootDir, pszDomain, pszUsername);
  135. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  136. perror(szPathName);
  137. return (SysErrNo());
  138. }
  139. sprintf(szPathName,
  140. "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir"
  141. SYS_SLASH_STR "new", pszRootDir, pszDomain, pszUsername);
  142. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  143. perror(szPathName);
  144. return (SysErrNo());
  145. }
  146. sprintf(szPathName,
  147. "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir"
  148. SYS_SLASH_STR "cur", pszRootDir, pszDomain, pszUsername);
  149. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  150. perror(szPathName);
  151. return (SysErrNo());
  152. }
  153. } else {
  154. ///////////////////////////////////////////////////////////////////////////////
  155. //  Check-create domain/user/mailbox directory
  156. ///////////////////////////////////////////////////////////////////////////////
  157. sprintf(szPathName,
  158. "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "mailbox",
  159. pszRootDir, pszDomain, pszUsername);
  160. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  161. perror(szPathName);
  162. return (SysErrNo());
  163. }
  164. }
  165. ///////////////////////////////////////////////////////////////////////////////
  166. //  Check-create domain/user/mailbox/user.tab file
  167. ///////////////////////////////////////////////////////////////////////////////
  168. sprintf(szPathName,
  169. "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "user.tab",
  170. pszRootDir, pszDomain, pszUsername);
  171. if (!SysPathExist(szPathName)) {
  172. if ((pTabFile = fopen(szPathName, "wt")) == NULL) {
  173. perror(szPathName);
  174. return (SysErrNo());
  175. }
  176. fprintf(pTabFile,
  177. ""RealName"t"%s"n"
  178. ""HomePage"t"%s"n"
  179. ""MaxMBSize"t"%u"n", pszRealName, pszHomePage, uMBSize);
  180. fclose(pTabFile);
  181. }
  182. ///////////////////////////////////////////////////////////////////////////////
  183. //  Add user to users file
  184. ///////////////////////////////////////////////////////////////////////////////
  185. fprintf(pUsrFile,
  186. ""%s"t"
  187. ""%s"t"
  188. ""%s"t"
  189. ""%u"t"
  190. ""%s"t"
  191. ""U"n", pszDomain, pszUsername, StrCrypt(pszPassword, szCryptPwd), uUserId,
  192. pszUsername);
  193. return (0);
  194. }
  195. void ShowUsage(char const *pszProgName)
  196. {
  197. fprintf(stderr,
  198. "use : %s [-adfursih]n"
  199. "          -a numusers     = number of users to create in auto-moden"
  200. "          -d domain       = domain name in auto-moden"
  201. "          -f inputFile    = input file name {stdin}n"
  202. "          -u username     = radix user name in auto-moden"
  203. "          -r rootdir      = mail root path {.%s}n"
  204. "          -s mboxsize     = mailbox maximum size {%d}n"
  205. "          -i useridbase   = base user id {1}n"
  206. "          -m              = create Maildir boxesn"
  207. "          -h              = show this messagen",
  208. pszProgName, SYS_SLASH_STR, MAX_MB_SIZE);
  209. }
  210. int main(int argc, char *argv[])
  211. {
  212. int ii;
  213. int iNumUsers = 0;
  214. bool bMaildir = false;
  215. unsigned int uMBSize = MAX_MB_SIZE;
  216. unsigned int uUserId = 1;
  217. FILE *pUsrFile;
  218. FILE *pInFile = stdin;
  219. char szRootDir[SYS_MAX_PATH] = "." SYS_SLASH_STR;
  220. char szInputFile[SYS_MAX_PATH] = "";
  221. char szPathName[SYS_MAX_PATH] = "";
  222. char szAutoDomain[256] = "mkuser.net";
  223. char szAutoUsr[128] = "mkuser";
  224. char szUsrLine[1024] = "";
  225. for (ii = 1; ii < argc; ii++) {
  226. if (argv[ii][0] != '-')
  227. continue;
  228. switch (argv[ii][1]) {
  229. case ('a'):
  230. if (++ii < argc)
  231. iNumUsers = atoi(argv[ii]);
  232. break;
  233. case ('d'):
  234. if (++ii < argc)
  235. StrSNCpy(szAutoDomain, argv[ii]);
  236. break;
  237. case ('f'):
  238. if (++ii < argc)
  239. StrSNCpy(szInputFile, argv[ii]);
  240. break;
  241. case ('u'):
  242. if (++ii < argc)
  243. StrSNCpy(szAutoUsr, argv[ii]);
  244. break;
  245. case ('r'):
  246. if (++ii < argc)
  247. StrSNCpy(szRootDir, argv[ii]);
  248. break;
  249. case ('s'):
  250. if (++ii < argc)
  251. uMBSize = (unsigned int) atol(argv[ii]);
  252. break;
  253. case ('i'):
  254. if (++ii < argc)
  255. uUserId = (unsigned int) atol(argv[ii]);
  256. break;
  257. case ('m'):
  258. bMaildir = true;
  259. break;
  260. case ('h'):
  261. ShowUsage(argv[0]);
  262. return (0);
  263. default:
  264. ShowUsage(argv[0]);
  265. return (1);
  266. }
  267. }
  268. ///////////////////////////////////////////////////////////////////////////////
  269. //  Root directory slash termination
  270. ///////////////////////////////////////////////////////////////////////////////
  271. if (szRootDir[strlen(szRootDir) - 1] != SYS_SLASH_CHAR)
  272. strcat(szRootDir, SYS_SLASH_STR);
  273. ///////////////////////////////////////////////////////////////////////////////
  274. //  Check-create domains directory
  275. ///////////////////////////////////////////////////////////////////////////////
  276. sprintf(szPathName, "%sdomains", szRootDir);
  277. if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) {
  278. perror(szPathName);
  279. return (SysErrNo());
  280. }
  281. ///////////////////////////////////////////////////////////////////////////////
  282. //  Create mailusers.tab file
  283. ///////////////////////////////////////////////////////////////////////////////
  284. sprintf(szPathName, "%smailusers.tab", szRootDir);
  285. if (SysPathExist(szPathName)) {
  286. fprintf(stderr, "%s already existn", szPathName);
  287. return (1);
  288. }
  289. if ((pUsrFile = fopen(szPathName, "wt")) == NULL) {
  290. perror(szPathName);
  291. return (SysErrNo());
  292. }
  293. if (iNumUsers == 0) {
  294. if ((strlen(szInputFile) != 0) && ((pInFile = fopen(szInputFile, "rt")) == NULL)) {
  295. perror(szPathName);
  296. fclose(pUsrFile);
  297. return (SysErrNo());
  298. }
  299. ///////////////////////////////////////////////////////////////////////////////
  300. //  Get input from stdin
  301. ///////////////////////////////////////////////////////////////////////////////
  302. while (fgets(szUsrLine, sizeof(szUsrLine) - 1, pInFile) != NULL) {
  303. char *pszDomain;
  304. char *pszUsername;
  305. char *pszPassword;
  306. char *pszRealName;
  307. char *pszHomePage;
  308. szUsrLine[strlen(szUsrLine) - 1] = '';
  309. if ((szUsrLine[0] == '#') ||
  310.     ((pszDomain = strtok(szUsrLine, ";")) == NULL) ||
  311.     ((pszUsername = strtok(NULL, ";")) == NULL) ||
  312.     ((pszPassword = strtok(NULL, ";")) == NULL) ||
  313.     ((pszRealName = strtok(NULL, ";")) == NULL) ||
  314.     ((pszHomePage = strtok(NULL, ";")) == NULL))
  315. continue;
  316. if (CreateUser(szRootDir, pszDomain, pszUsername, pszPassword, uUserId++,
  317.        pszRealName, pszHomePage, uMBSize, bMaildir,
  318.        pUsrFile) != 0) {
  319. fprintf(stderr, "error creating <%s@%s> : %sn",
  320. pszUsername, pszDomain, SysErrStr());
  321. }
  322. }
  323. if (pInFile != stdin)
  324. fclose(pInFile);
  325. } else {
  326. ///////////////////////////////////////////////////////////////////////////////
  327. //  Automatically generate users
  328. ///////////////////////////////////////////////////////////////////////////////
  329. for (ii = 1; ii <= iNumUsers; ii++) {
  330. char szUsername[256] = "";
  331. char szHomePage[256] = "";
  332. sprintf(szUsername, "%s%d", szAutoUsr, ii);
  333. sprintf(szHomePage, "http://www.%s/~%s", szAutoDomain, szUsername);
  334. if (CreateUser(szRootDir, szAutoDomain, szUsername, szUsername, uUserId++,
  335.        szUsername, szHomePage, uMBSize, bMaildir, pUsrFile) != 0)
  336. {
  337. fprintf(stderr, "error creating <%s@%s> : %sn",
  338. szUsername, szAutoDomain, SysErrStr());
  339. }
  340. }
  341. }
  342. fclose(pUsrFile);
  343. return (0);
  344. }