authvchkpw.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. static const char rcsid[]="$Id: authvchkpw.c,v 1.11 2000/04/30 01:04:09 mrsam Exp $";
  19. extern int auth_vchkpw_pre(const char *userid, const char *service,
  20.         int (*callback)(struct authinfo *, void *),
  21.                         void *arg);
  22. extern char *authvchkpw_isvirtual(char *);
  23. extern FILE *authvchkpw_file(const char *, const char *);
  24. extern struct passwd *authvchkpw_search(FILE *, const char *);
  25. struct callback_info {
  26. const char *pass;
  27. char *userret;
  28. int issession;
  29. void (*callback_func)(struct authinfo *, void *);
  30. void *callback_arg;
  31. };
  32. static int callback_vchkpw(struct authinfo *a, void *p)
  33. {
  34. struct callback_info *i=(struct callback_info *)p;
  35. if (a->passwd == 0 || authcheckpassword(i->pass, a->passwd))
  36. return (-1);
  37. if ((i->userret=strdup(a->address)) == 0)
  38. {
  39. perror("malloc");
  40. return (1);
  41. }
  42. if (i->callback_func == 0)
  43. {
  44. authsuccess(a->homedir, 0, a->sysuserid, &a->sysgroupid,
  45. a->address, a->fullname);
  46. putenv("MAILDIR=");
  47. }
  48. else
  49. (*i->callback_func)(a, i->callback_arg);
  50.         return (0);
  51. }
  52. char *auth_vchkpw(const char *service, const char *authtype, char *authdata,
  53. int issession,
  54. void (*callback_func)(struct authinfo *, void *), void *callback_arg)
  55. {
  56. char *user, *pass;
  57. int rc;
  58. struct callback_info ci;
  59. if (strcmp(authtype, AUTHTYPE_LOGIN) ||
  60. (user=strtok(authdata, "n")) == 0 ||
  61. (pass=strtok(0, "n")) == 0)
  62. {
  63. errno=EPERM;
  64. return (0);
  65. }
  66. ci.pass=pass;
  67. ci.issession=issession;
  68. ci.callback_func=callback_func;
  69. ci.callback_arg=callback_arg;
  70. rc=auth_vchkpw_pre(user, service, &callback_vchkpw, &ci);
  71. if (rc < 0)
  72. {
  73. errno=EPERM;
  74. return (0);
  75. }
  76. if (rc > 0)
  77. {
  78. errno=EACCES;
  79. return (0);
  80. }
  81. putenv("MAILDIR=");
  82. return (ci.userret);
  83. }