authmysqllib.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:5k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <ctype.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <mysql/mysql.h>
  9. #include "authmysql.h"
  10. #include "authmysqlrc.h"
  11. static const char *read_env(const char *env)
  12. {
  13. static char *mysqlauth=0;
  14. static size_t mysqlauth_size;
  15. size_t i;
  16. char *p;
  17. int l=strlen(env);
  18. if (!mysqlauth)
  19. {
  20. FILE *f=fopen(AUTHMYSQLRC, "r");
  21. struct stat buf;
  22. if (!f) return (0);
  23. if (fstat(fileno(f), &buf) ||
  24. (mysqlauth=malloc(buf.st_size+2)) == 0)
  25. {
  26. fclose(f);
  27. return (0);
  28. }
  29. if (fread(mysqlauth, buf.st_size, 1, f) != 1)
  30. {
  31. free(mysqlauth);
  32. mysqlauth=0;
  33. fclose(f);
  34. return (0);
  35. }
  36. mysqlauth[mysqlauth_size=buf.st_size]=0;
  37. for (i=0; i<mysqlauth_size; i++)
  38. if (mysqlauth[i] == 'n')
  39. mysqlauth[i]=0;
  40. fclose(f);
  41. }
  42. for (i=0; i<mysqlauth_size; )
  43. {
  44. p=mysqlauth+i;
  45. if (memcmp(p, env, l) == 0 &&
  46. isspace((int)(unsigned char)p[l]))
  47. {
  48. p += l;
  49. while (*p && *p != 'n' &&
  50. isspace((int)(unsigned char)*p))
  51. ++p;
  52. break;
  53. }
  54. while (i < mysqlauth_size)
  55. if (mysqlauth[i++] == 0) break;
  56. }
  57. if (i < mysqlauth_size)
  58. return (p);
  59. return (0);
  60. }
  61. static MYSQL mysql_buf;
  62. static MYSQL *mysql=0;
  63. static int do_connect()
  64. {
  65. const char *server;
  66. const char *userid;
  67. const char *password;
  68. const char *database;
  69. if (mysql) return (0);
  70. server=read_env("MYSQL_SERVER");
  71. userid=read_env("MYSQL_USERNAME");
  72. password=read_env("MYSQL_PASSWORD");
  73. database=read_env("MYSQL_DATABASE");
  74. if (!server)
  75. {
  76. fprintf(stderr, "authmysql: MYSQL_SERVER not set in "
  77. AUTHMYSQLRC ".n");
  78. return (-1);
  79. }
  80. if (!userid)
  81. {
  82. fprintf(stderr, "authmysql: MYSQL_USERNAME not set in "
  83. AUTHMYSQLRC ".n");
  84. return (-1);
  85. }
  86. if (!database)
  87. {
  88. fprintf(stderr, "authmysql: MYSQL_DATABASE not set in "
  89. AUTHMYSQLRC ".n");
  90. return (-1);
  91. }
  92. mysql=mysql_connect(&mysql_buf, server, userid, password);
  93. if (!mysql) return (-1);
  94. mysql_select_db(mysql, database);
  95. if (mysql_errno(mysql))
  96. {
  97. fprintf(stderr, "authmysql: mysql_select_db(%s) error: %sn",
  98. database, mysql_error(mysql));
  99. mysql_close(mysql);
  100. mysql=0;
  101. return (-1);
  102. }
  103. return (0);
  104. }
  105. void auth_mysql_cleanup()
  106. {
  107. if (mysql)
  108. {
  109. mysql_close(mysql);
  110. mysql=0;
  111. }
  112. }
  113. static struct authmysqluserinfo ui={0, 0, 0, 0, 0};
  114. struct authmysqluserinfo *auth_mysql_getuserinfo(const char *username)
  115. {
  116. const char *user_table;
  117. const char *defdomain;
  118. char *querybuf, *p;
  119. MYSQL_ROW row;
  120. MYSQL_RES *result;
  121. const char *crypt_field, *clear_field, *maildir_field;
  122. static const char query[]=
  123. "SELECT id, %s, %s, uid, gid, home, %s FROM %s WHERE id="";
  124. if (do_connect()) return (0);
  125. if (ui.username)
  126. free(ui.username);
  127. if (ui.cryptpw)
  128. free(ui.cryptpw);
  129. if (ui.clearpw)
  130. free(ui.clearpw);
  131. if (ui.home)
  132. free(ui.home);
  133. if (ui.maildir)
  134. free(ui.maildir);
  135. memset(&ui, 0, sizeof(ui));
  136. user_table=read_env("MYSQL_USER_TABLE");
  137. defdomain=read_env("DEFAULT_DOMAIN");
  138. if (!user_table)
  139. {
  140. fprintf(stderr, "authmysql: MYSQL_USER_TABLE not set in "
  141. AUTHMYSQLRC ".n");
  142. return (0);
  143. }
  144. crypt_field=read_env("MYSQL_CRYPT_PWFIELD");
  145. clear_field=read_env("MYSQL_CLEAR_PWFIELD");
  146. if (!crypt_field && !clear_field)
  147. {
  148. fprintf(stderr,
  149. "authmysql: MYSQL_CRYPT_PWFIELD and "
  150. "MYSQL_CLEAR_PWFIELD not set in " AUTHMYSQLRC ".n");
  151. return (0);
  152. }
  153. maildir_field=read_env("MYSQL_MAILDIR_FIELD");
  154. if (!crypt_field) crypt_field="""";
  155. if (!clear_field) clear_field="""";
  156. if (!maildir_field) maildir_field="""";
  157. if (!defdomain) defdomain="";
  158. querybuf=malloc(sizeof(query)+100+strlen(user_table)+strlen(defdomain)
  159. +strlen(crypt_field)
  160. +strlen(clear_field)
  161. +strlen(maildir_field));
  162. if (!querybuf)
  163. {
  164. perror("malloc");
  165. return (0);
  166. }
  167. sprintf(querybuf, query, crypt_field, clear_field, maildir_field,
  168. user_table);
  169. p=querybuf+strlen(querybuf);
  170. for (strcpy(p, username); *p; p++)
  171. if (*p == '"') *p=' '; /* No funny business */
  172. if (strchr(username, '@') == 0 && *defdomain)
  173. strcat(strcpy(p, "@"), defdomain);
  174. strcat(p, """);
  175. mysql_query (mysql, querybuf);
  176. free(querybuf);
  177. if (mysql_errno(mysql) != 0)
  178. {
  179. auth_mysql_cleanup(); /* Server went down, that's OK,
  180. ** try again next time.
  181. */
  182. return (0);
  183. }
  184. result = mysql_store_result (mysql);       
  185. if (result)
  186. {
  187. if (mysql_num_rows(result))
  188. {
  189. row = mysql_fetch_row (result);
  190. ui.username=strdup(row[0]);
  191. ui.cryptpw=strdup(row[1]);
  192. ui.clearpw=strdup(row[2]);
  193. ui.uid=atol(row[3]);
  194. ui.gid=atol(row[4]);
  195. ui.home=strdup(row[5]);
  196. ui.maildir=strdup(row[6]);
  197. if (!ui.username || !ui.cryptpw ||
  198. !ui.home || !ui.maildir)
  199. {
  200. mysql_free_result(result);
  201. return (0);
  202. }
  203. if (!ui.cryptpw[0])
  204. {
  205. free(ui.cryptpw);
  206. ui.cryptpw=0;
  207. }
  208. if (!ui.clearpw[0])
  209. {
  210. free(ui.clearpw);
  211. ui.clearpw=0;
  212. }
  213. }
  214. mysql_free_result(result);
  215. }
  216. return (&ui);
  217. }