authcram.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 "authsasl.h"
  18. #include "authmod.h"
  19. #include "userdb/userdb.h"
  20. #include "../libhmac/hmac.h"
  21. #include "cramlib.h"
  22. static const char rcsid[]="$Id: authcram.c,v 1.13 2000/05/30 02:00:23 mrsam Exp $";
  23. char *auth_cram(const char *service, const char *authtype, char *authdata,
  24. int issession,
  25. void (*callback_func)(struct authinfo *, void *), void *callback_arg)
  26. {
  27. char *u;
  28. char *udbs;
  29. char *passwords;
  30. char *services;
  31. struct userdbs *udb;
  32. char *challenge, *response;
  33. char *user;
  34. struct hmac_hashinfo *hmacptr;
  35. if (auth_get_cram(authtype, authdata, &hmacptr,
  36. &user, &challenge, &response))
  37. return (0);
  38. userdb_init(USERDB ".dat");
  39.         if ( (u=userdb(user)) == 0)
  40. {
  41. userdb_close();
  42. errno=EPERM;
  43. return (0);
  44. }
  45. if ( (udbs=userdbshadow(USERDB "shadow.dat", user)) == 0)
  46. {
  47. free(u);
  48. userdb_close();
  49. errno=EPERM;
  50. return (0);
  51. }
  52. if ((services=malloc(strlen(service)+strlen(hmacptr->hh_name)
  53. +sizeof("-hmac-pw"))) == 0)
  54. {
  55. free(udbs);
  56. free(u);
  57. userdb_close();
  58. errno=ENOSPC;
  59. return (0);
  60. }
  61. strcat(strcat(strcat(strcpy(services, service), "-hmac-"),
  62. hmacptr->hh_name), "pw");
  63. passwords=userdb_gets(udbs, services);
  64. if (passwords == 0)
  65. {
  66. strcat(strcat(strcpy(services, "hmac-"),
  67. hmacptr->hh_name), "pw");
  68. passwords=userdb_gets(udbs, services);
  69. }
  70. free(services);
  71. if (passwords == 0)
  72. {
  73. errno=EPERM;
  74. free(udbs);
  75. free(u);
  76. userdb_close();
  77. return (0);
  78. }
  79. if (auth_verify_cram(hmacptr, challenge, response, passwords))
  80. {
  81. free(passwords);
  82. errno=EACCES;
  83. free(udbs);
  84. free(u);
  85. userdb_close();
  86. return (0);
  87. }
  88. free(passwords);
  89. free(udbs);
  90.         if ((udb=userdb_creates(u)) == 0)
  91.         {
  92. free(u);
  93. userdb_close();
  94. errno=EACCES;
  95.                 return (0);
  96.         }
  97. if (callback_func == 0)
  98. authsuccess(udb->udb_dir, 0, &udb->udb_uid, &udb->udb_gid,
  99. user, udb->udb_gecos);
  100. else
  101. {
  102. struct authinfo aa;
  103. memset(&aa, 0, sizeof(aa));
  104. /*aa.sysusername=user;*/
  105. aa.sysuserid= &udb->udb_uid;
  106. aa.sysgroupid= udb->udb_gid;
  107. aa.homedir=udb->udb_dir;
  108. aa.address=user;
  109. aa.maildir=udb->udb_mailbox;
  110. (*callback_func)(&aa, callback_arg);
  111. }
  112.         free(u);
  113. userdb_close();
  114.         if (callback_func == 0)
  115. putenv("MAILDIR=");
  116.         if (callback_func == 0 && udb->udb_mailbox && *udb->udb_mailbox)
  117.         {
  118.         char    *p=malloc(sizeof("MAILDIR=")+strlen(udb->udb_mailbox));
  119. static char *prevp=0;
  120.                 if (!p)
  121. {
  122. userdb_frees(udb);
  123. perror("malloc");
  124. authexit(1);
  125. }
  126.                 strcat(strcpy(p, "MAILDIR="), udb->udb_mailbox);
  127.                 putenv(p);
  128. if (prevp) free(prevp);
  129. prevp=p;
  130.         }
  131. userdb_frees(udb);
  132. if  ((u=strdup(user)) == 0)
  133. {
  134. perror("malloc");
  135. authexit(1);
  136. }
  137. return (u);
  138. }