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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 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: authuserdb.c,v 1.12 2000/05/29 21:01:30 mrsam Exp $";
  19. extern int auth_userdb_pre_common(const char *, const char *, int,
  20.         int (*callback)(struct authinfo *, void *),
  21.                         void *arg);
  22. extern void auth_userdb_cleanup();
  23. struct callback_info {
  24.         const char *pass;
  25.         char *userret;
  26. int issession;
  27. void (*callback_func)(struct authinfo *, void *);
  28. void *callback_arg;
  29.         };
  30. static int callback_userdb(struct authinfo *a, void *p)
  31. {
  32. struct callback_info *i=(struct callback_info *)p;
  33.         if (a->passwd == 0 || authcheckpassword(i->pass, a->passwd))
  34.                 return (-1);
  35.         if ((i->userret=strdup(a->sysusername)) == 0)
  36.         {
  37.                 perror("malloc");
  38.                 return (1);
  39.         }
  40. if (i->callback_func == 0)
  41. {
  42. static char *prevp=0;
  43. const char *cp=a->maildir;
  44.         char    *p;
  45. if (!cp) cp="";
  46. p=malloc(sizeof("MAILDIR=")+strlen(cp));
  47.                 if (!p)
  48. {
  49. perror("malloc");
  50. free(i->userret);
  51. return (1);
  52. }
  53.                 strcat(strcpy(p, "MAILDIR="), cp);
  54.                 putenv(p);
  55. if (prevp) free(prevp);
  56. prevp=p;
  57. }
  58. if (i->callback_func == 0)
  59. {
  60. static char *prevp=0;
  61. const char *cp=a->quota;
  62.         char    *p;
  63. if (!cp) cp="";
  64. p=malloc(sizeof("MAILDIRQUOTA=")+strlen(cp));
  65.                 if (!p)
  66. {
  67. perror("malloc");
  68. free(i->userret);
  69. return (1);
  70. }
  71.                 strcat(strcpy(p, "MAILDIRQUOTA="), cp);
  72.                 putenv(p);
  73. if (prevp) free(prevp);
  74. prevp=p;
  75. authsuccess(a->homedir, 0, a->sysuserid,
  76. &a->sysgroupid, a->address, a->fullname);
  77.         }
  78. else
  79. {
  80. a->address=a->sysusername;
  81. (*i->callback_func)(a, i->callback_arg);
  82. }
  83.         return (0);
  84. }
  85. char *auth_userdb(const char *service, const char *authtype, char *authdata,
  86. int issession,
  87. void (*callback_func)(struct authinfo *, void *), void *callback_arg)
  88. {
  89. const char *user, *pass;
  90. int rc;
  91. struct callback_info ci;
  92. if (strcmp(authtype, AUTHTYPE_LOGIN) ||
  93. (user=strtok(authdata, "n")) == 0 ||
  94. (pass=strtok(0, "n")) == 0)
  95. {
  96. errno=EPERM;
  97. return (0);
  98. }
  99. ci.pass=pass;
  100. ci.callback_func=callback_func;
  101. ci.callback_arg=callback_arg;
  102. ci.issession=issession;
  103. rc=auth_userdb_pre_common(user, service, 1, &callback_userdb, &ci);
  104. auth_userdb_cleanup();
  105. if (rc < 0)
  106. {
  107. errno=EPERM;
  108. return (0);
  109. }
  110. if (rc > 0)
  111. {
  112. errno=EACCES;
  113. return (0);
  114. }
  115.         return (ci.userret);
  116. }