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

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 "SvrUtils.h"
  32. #include "UsrUtils.h"
  33. #include "MessQueue.h"
  34. #include "SMAILUtils.h"
  35. #include "QueueUtils.h"
  36. #include "MailSvr.h"
  37. #include "MiscUtils.h"
  38. #include "UsrAuth.h"
  39. #define USER_AUTH_DIR               "userauth"
  40. #define AUTH_LINE_MAX               1024
  41. #define AUTH_AUTHENTICATE_CONFIG    "userauth"
  42. #define AUTH_ADD_CONFIG             "useradd"
  43. #define AUTH_MODIFY_CONFIG          "useredit"
  44. #define AUTH_DEL_CONFIG             "userdel"
  45. #define AUTH_DROPDOMAIN_CONFIG      "domaindrop"
  46. #define USER_AUTH_TIMEOUT           60
  47. #define USER_AUTH_PRIORITY          SYS_PRIORITY_NORMAL
  48. #define AUTH_SUCCESS_CODE           0
  49. static int UAthGetConfigPath(char const *pszService, char const *pszDomain, char *pszConfigPath);
  50. static int UAthExecAuthOp(char const *pszService, char const *pszAuthOp,
  51.   char const *pszDomain, char const *pszUsername, UserInfo * pUI);
  52. static int UAthMacroSubstitutes(char **ppszCmdTokens, char const *pszDomain,
  53. char const *pszUsername, char const *pszPassword, UserInfo * pUI);
  54. char *UAthGetRootPath(char const *pszService, char *pszAuthPath, int iMaxPath)
  55. {
  56. CfgGetRootPath(pszAuthPath, iMaxPath);
  57. StrNCat(pszAuthPath, USER_AUTH_DIR, iMaxPath);
  58. AppendSlash(pszAuthPath);
  59. StrNCat(pszAuthPath, pszService, iMaxPath);
  60. AppendSlash(pszAuthPath);
  61. return (pszAuthPath);
  62. }
  63. static int UAthGetConfigPath(char const *pszService, char const *pszDomain, char *pszConfigPath)
  64. {
  65. char szAuthPath[SYS_MAX_PATH] = "";
  66. UAthGetRootPath(pszService, szAuthPath, sizeof(szAuthPath));
  67. ///////////////////////////////////////////////////////////////////////////////
  68. //  Check domain specific config
  69. ///////////////////////////////////////////////////////////////////////////////
  70. sprintf(pszConfigPath, "%s%s.tab", szAuthPath, pszDomain);
  71. if (SysExistFile(pszConfigPath))
  72. return (0);
  73. ///////////////////////////////////////////////////////////////////////////////
  74. //  Check default config
  75. ///////////////////////////////////////////////////////////////////////////////
  76. sprintf(pszConfigPath, "%s.tab", szAuthPath);
  77. if (SysExistFile(pszConfigPath))
  78. return (0);
  79. ErrSetErrorCode(ERR_NO_EXTERNAL_AUTH_DEFINED);
  80. return (ERR_NO_EXTERNAL_AUTH_DEFINED);
  81. }
  82. static int UAthExecAuthOp(char const *pszService, char const *pszAuthOp,
  83.   char const *pszDomain, char const *pszUsername,
  84.   char const *pszPassword, UserInfo * pUI)
  85. {
  86. char szAuthConfigPath[SYS_MAX_PATH] = "";
  87. if (UAthGetConfigPath(pszService, pszDomain, szAuthConfigPath) < 0)
  88. return (ErrGetErrorCode());
  89. FILE *pAuthFile = fopen(szAuthConfigPath, "rt");
  90. if (pAuthFile == NULL) {
  91. ErrSetErrorCode(ERR_FILE_OPEN, szAuthConfigPath);
  92. return (ERR_FILE_OPEN);
  93. }
  94. char szAuthLine[AUTH_LINE_MAX] = "";
  95. while (MscGetConfigLine(szAuthLine, sizeof(szAuthLine) - 1, pAuthFile) != NULL) {
  96. char **ppszCmdTokens = StrGetTabLineStrings(szAuthLine);
  97. if (ppszCmdTokens == NULL)
  98. continue;
  99. int iFieldsCount = StrStringsCount(ppszCmdTokens);
  100. if ((iFieldsCount > 1) && (stricmp(ppszCmdTokens[0], pszAuthOp) == 0)) {
  101. ///////////////////////////////////////////////////////////////////////////////
  102. //  Do auth line macro substitution
  103. ///////////////////////////////////////////////////////////////////////////////
  104. UAthMacroSubstitutes(ppszCmdTokens, pszDomain, pszUsername, pszPassword,
  105.      pUI);
  106. int iExitCode = 0;
  107. if (SysExec(ppszCmdTokens[1], &ppszCmdTokens[1], USER_AUTH_TIMEOUT,
  108.     USER_AUTH_PRIORITY, &iExitCode) == 0) {
  109. if (iExitCode != AUTH_SUCCESS_CODE) {
  110. StrFreeStrings(ppszCmdTokens);
  111. fclose(pAuthFile);
  112. ErrSetErrorCode(ERR_EXTERNAL_AUTH_FAILURE);
  113. return (ERR_EXTERNAL_AUTH_FAILURE);
  114. }
  115. StrFreeStrings(ppszCmdTokens);
  116. fclose(pAuthFile);
  117. return (0);
  118. } else {
  119. StrFreeStrings(ppszCmdTokens);
  120. fclose(pAuthFile);
  121. SysLogMessage(LOG_LEV_MESSAGE,
  122.       "Execution error in authentication file "%s"n",
  123.       szAuthConfigPath);
  124. ErrSetErrorCode(ERR_EXTERNAL_AUTH_FAILURE);
  125. return (ERR_EXTERNAL_AUTH_FAILURE);
  126. }
  127. }
  128. StrFreeStrings(ppszCmdTokens);
  129. }
  130. fclose(pAuthFile);
  131. ErrSetErrorCode(ERR_NO_EXTERNAL_AUTH_DEFINED);
  132. return (ERR_NO_EXTERNAL_AUTH_DEFINED);
  133. }
  134. int UAthAuthenticateUser(char const *pszService, char const *pszDomain,
  135.  char const *pszUsername, char const *pszPassword)
  136. {
  137. return (UAthExecAuthOp(pszService, AUTH_AUTHENTICATE_CONFIG, pszDomain, pszUsername,
  138.        pszPassword, NULL));
  139. }
  140. int UAthAddUser(char const *pszService, UserInfo * pUI)
  141. {
  142. return (UAthExecAuthOp(pszService, AUTH_ADD_CONFIG, pUI->pszDomain, pUI->pszName,
  143.        pUI->pszPassword, pUI));
  144. }
  145. int UAthModifyUser(char const *pszService, UserInfo * pUI)
  146. {
  147. return (UAthExecAuthOp(pszService, AUTH_MODIFY_CONFIG, pUI->pszDomain, pUI->pszName,
  148.        pUI->pszPassword, pUI));
  149. }
  150. int UAthDelUser(char const *pszService, UserInfo * pUI)
  151. {
  152. return (UAthExecAuthOp(pszService, AUTH_DEL_CONFIG, pUI->pszDomain, pUI->pszName,
  153.        pUI->pszPassword, pUI));
  154. }
  155. int UAthDropDomain(char const *pszService, char const *pszDomain)
  156. {
  157. return (UAthExecAuthOp(pszService, AUTH_DROPDOMAIN_CONFIG, pszDomain, NULL, NULL, NULL));
  158. }
  159. static int UAthMacroSubstitutes(char **ppszCmdTokens, char const *pszDomain,
  160. char const *pszUsername, char const *pszPassword, UserInfo * pUI)
  161. {
  162. for (int ii = 0; ppszCmdTokens[ii] != NULL; ii++) {
  163. if ((pszDomain != NULL) && (strcmp(ppszCmdTokens[ii], "@@DOMAIN") == 0)) {
  164. char *pszNewValue = SysStrDup(pszDomain);
  165. if (pszNewValue == NULL)
  166. return (ErrGetErrorCode());
  167. SysFree(ppszCmdTokens[ii]);
  168. ppszCmdTokens[ii] = pszNewValue;
  169. } else if ((pszUsername != NULL) && (strcmp(ppszCmdTokens[ii], "@@USER") == 0)) {
  170. char *pszNewValue = SysStrDup(pszUsername);
  171. if (pszNewValue == NULL)
  172. return (ErrGetErrorCode());
  173. SysFree(ppszCmdTokens[ii]);
  174. ppszCmdTokens[ii] = pszNewValue;
  175. } else if ((pszPassword != NULL) && (strcmp(ppszCmdTokens[ii], "@@PASSWD") == 0)) {
  176. char *pszNewValue = SysStrDup(pszPassword);
  177. if (pszNewValue == NULL)
  178. return (ErrGetErrorCode());
  179. SysFree(ppszCmdTokens[ii]);
  180. ppszCmdTokens[ii] = pszNewValue;
  181. } else if ((pUI != NULL) && (strcmp(ppszCmdTokens[ii], "@@PATH") == 0)) {
  182. char szUserPath[SYS_MAX_PATH] = "";
  183. UsrGetUserPath(pUI, szUserPath, sizeof(szUserPath), 0);
  184. char *pszNewValue = SysStrDup(szUserPath);
  185. if (pszNewValue == NULL)
  186. return (ErrGetErrorCode());
  187. SysFree(ppszCmdTokens[ii]);
  188. ppszCmdTokens[ii] = pszNewValue;
  189. }
  190. }
  191. return (0);
  192. }