authtest.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. #include "auth.h"
  6. #include "authmod.h"
  7. #include "authstaticlist.h"
  8. #include "authsasl.h"
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #if HAVE_UNISTD_H
  13. #include <unistd.h>
  14. #endif
  15. static const char rcsid[]="$Id: authtest.c,v 1.6 2000/05/29 21:01:30 mrsam Exp $";
  16. static void usage()
  17. {
  18. fprintf(stderr, "Usage: authtest [-s service] [ -m module ] userid passwordn");
  19. exit(1);
  20. }
  21. static int callback_pre(struct authinfo *a, void *dummy)
  22. {
  23.         authsuccess(a->homedir, a->sysuserid ? 0:a->sysusername,
  24. a->sysuserid, &a->sysgroupid,
  25.                 a->address, a->fullname);
  26. if (a->maildir)
  27. {
  28. char *p=malloc(sizeof("MAILDIR=")+strlen(a->maildir));
  29. strcat(strcpy(p, "MAILDIR="), a->maildir);
  30. putenv(p);
  31. }
  32. else putenv("MAILDIR=");
  33. return (0);
  34. }
  35. int main(int argc, char **argv)
  36. {
  37. int argn;
  38. const char *service="login";
  39. const char *module="";
  40. int i;
  41. char *p;
  42. if (getuid())
  43. {
  44. printf("I must be run as root!n");
  45. exit(0);
  46. }
  47. for (argn=1; argn<argc; argn++)
  48. {
  49. const char *argp;
  50. if (argv[argn][0] != '-') break;
  51. if (argv[argn][1] == 0)
  52. {
  53. ++argn;
  54. break;
  55. }
  56. argp=argv[argn]+2;
  57. switch (argv[argn][1]) {
  58. case 's':
  59. if (!*argp && argn+1 < argc)
  60. argp=argv[++argn];
  61. service=argp;
  62. break;
  63. case 'm':
  64. if (!*argp && argn+1 < argc)
  65. argp=argv[++argn];
  66. module=argp;
  67. break;
  68. default:
  69. usage();
  70. }
  71. }
  72. if (argc - argn <= 0)
  73. usage();
  74. for (i=0; authstaticlist[i].auth_name; i++)
  75. {
  76. char *authdata;
  77. char buf[1024];
  78. if (*module && strcmp(module, authstaticlist[i].auth_name))
  79. continue;
  80. if (argc - argn > 1)
  81. {
  82. authdata=malloc(strlen(argv[argn])+strlen(argv[argn+1])+3);
  83. if (!authdata)
  84. {
  85. perror("malloc");
  86. exit(1);
  87. }
  88. sprintf(authdata, "%sn%sn",
  89. argv[argn], argv[argn+1]);
  90. p= (*authstaticlist[i].auth_func)(service,
  91. AUTHTYPE_LOGIN, authdata, 0, 0, 0);
  92. free(authdata);
  93. if (p == 0) continue;
  94. }
  95. else
  96. {
  97. int rc;
  98. if ((rc=(*authstaticlist[i].auth_prefunc)(argv[argn],
  99. service ? service:"",
  100. &callback_pre, 0)) != 0)
  101. {
  102. (*authstaticlist[i].auth_cleanupfunc)();
  103. if (rc < 0)
  104. continue;
  105. fprintf(stderr,
  106. "Temporary authentication failure from "
  107. "module %sn",
  108. authstaticlist[i].auth_name);
  109. break;
  110. }
  111. (*authstaticlist[i].auth_cleanupfunc)();
  112. }
  113. printf("Authenticated: module %sn", authstaticlist[i].auth_name);
  114. if ( getcwd(buf, sizeof(buf)))
  115. printf("Home directory: %sn", buf);
  116. else
  117. printf("Unable to determine home directory!!n");
  118. printf("UID/GID: %lu/%lun",
  119. (unsigned long)getuid(), (unsigned long)getgid());
  120. p=getenv("MAILDIR");
  121. if (p && *p)
  122. printf("Maildir: %sn", p);
  123. p=getenv("MAILDIRQUOTA");
  124. if (p && *p)
  125. printf("Maildir quota: %sn", p);
  126. p=getenv("AUTHADDR");
  127. printf("AUTHADDR=%sn", p && *p ? p:"<none>");
  128. p=getenv("AUTHFULLNAME");
  129. printf("AUTHFULLNAME=%sn", p && *p ? p:"<none>");
  130. exit(0);
  131. }
  132. fprintf(stderr, "Authentication FAILED!n");
  133. exit(1);
  134. return (0);
  135. }