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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #include "auth.h"
  6. #include "authmod.h"
  7. #include "authstaticlist.h"
  8. #include "authsasl.h"
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. #include "numlib/numlib.h"
  14. static const char rcsid[]="$Id: authdaemon.c,v 1.3 2000/04/30 02:57:51 mrsam Exp $";
  15. extern int authdaemondo(const char *authreq,
  16. int (*func)(struct authinfo *, void *), void *arg);
  17. static int callback(struct authinfo *a, void *p)
  18. {
  19. char *username;
  20.         if ((*(char **)p=username=strdup(a->address)) == 0)
  21.         {
  22.                 perror("malloc");
  23.                 return (1);
  24.         }
  25.         {
  26. static  char *prevp=0;
  27. const char *cp=a->maildir;
  28. char    *p;
  29. if (!cp)        cp="";
  30. p=malloc(sizeof("MAILDIR=")+strlen(cp));
  31. if (!p)
  32. {
  33. perror("malloc");
  34. free(username);
  35. return (1);
  36. }
  37. strcat(strcpy(p, "MAILDIR="), cp);
  38. putenv(p);
  39. if (prevp)      free(prevp);
  40. prevp=p;
  41. }
  42. if (a->sysusername && a->sysuserid)
  43. a->sysusername=0;
  44. authsuccess(a->homedir, a->sysusername, a->sysuserid, &a->sysgroupid,
  45.                 a->address, a->fullname);
  46.         return (0);
  47. }
  48. char *auth_daemon(const char *service, const char *authtype, char *authdata,
  49.         int issession,
  50. void (*callback_func)(struct authinfo *, void *), void *callback_arg)
  51. {
  52. char tbuf[NUMBUFSIZE];
  53. size_t l=strlen(service)+strlen(authtype)+strlen(authdata)+1;
  54. char *n=str_size_t(l, tbuf);
  55. char *buf=malloc(strlen(n)+l+20);
  56. int rc;
  57. char *username=0;
  58. if (!buf)
  59. {
  60. perror("malloc");
  61. errno=EACCES;
  62. return (0);
  63. }
  64. strcat(strcat(strcpy(buf, "AUTH "), n), "n");
  65. strcat(strcat(buf, service), "n");
  66. strcat(strcat(buf, authtype), "n");
  67. strcat(buf, authdata);
  68. rc=authdaemondo(buf, callback, &username);
  69. free(buf);
  70.         if (rc < 0)
  71.         {
  72.                 errno=EPERM;
  73.                 return (0);
  74.         }
  75.         if (rc > 0)
  76.         {
  77.                 errno=EACCES;
  78.                 return (0);
  79.         }
  80. return (username);
  81. }