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

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