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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include <pwd.h>
  13. #if HAVE_UNISTD_H
  14. #include <unistd.h>
  15. #endif
  16. #include "auth.h"
  17. #include "authmod.h"
  18. #include <vpopmail.h>
  19. #include <vauth.h>
  20. #include "vpopmail_config.h"
  21. extern char *authvchkpw_isvirtual(char *);
  22. extern FILE *authvchkpw_file(const char *, const char *);
  23. extern struct passwd *authvchkpw_search(FILE *, const char *);
  24. static const char rcsid[]="$Id: preauthvchkpw.c,v 1.9 2000/03/14 02:28:11 mrsam Exp $";
  25. int auth_vchkpw_pre(const char *userid, const char *service,
  26.         int (*callback)(struct authinfo *, void *),
  27.                         void *arg)
  28. {
  29. struct passwd *pw;
  30. char *s;
  31. uid_t uid;
  32. gid_t gid;
  33. char *usercopy;
  34. int notfound;
  35. struct authinfo auth;
  36. memset(&auth, 0, sizeof(auth));
  37. pw=getpwnam("vpopmail");
  38. if (!pw)
  39. return (-1);
  40. uid=pw->pw_uid;
  41. gid=pw->pw_gid;
  42. usercopy=strdup(userid);
  43. if (!usercopy)
  44. {
  45. perror("strdup");
  46. return (1);
  47. }
  48. notfound=EACCES;
  49. if ((s=authvchkpw_isvirtual(usercopy)) != 0)
  50. {
  51. char *t;
  52. *s++=0;
  53. while ((t=strchr(s, '/')) != 0)
  54. *t='.'; /* Fuck you */
  55. }
  56. else
  57. {
  58. s = DEFAULT_DOMAIN;
  59. notfound=EPERM;
  60. }
  61. pw=vauth_getpw(usercopy, s);
  62. free(usercopy);
  63. if (!pw)
  64. {
  65. errno=notfound;
  66. return (-1);
  67. }
  68. pw->pw_uid=uid;
  69. pw->pw_gid=gid;
  70. auth.sysuserid= &pw->pw_uid;
  71. auth.sysgroupid=pw->pw_gid;
  72. auth.homedir=pw->pw_dir;
  73. auth.address=userid;
  74. auth.fullname=pw->pw_gecos;
  75. auth.passwd=pw->pw_passwd;
  76. return ((*callback)(&auth, arg));
  77. }