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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * ncsa_auth.c
  3.  *
  4.  * AUTHOR: Arjan de Vet <Arjan.deVet@adv.iae.nl>
  5.  *
  6.  * Example authentication program for Squid, based on the original
  7.  * proxy_auth code from client_side.c, written by
  8.  * Jon Thackray <jrmt@uk.gdscorp.com>.
  9.  *
  10.  * Uses a NCSA httpd style password file for authentication with the
  11.  * following improvements suggested by various people:
  12.  *
  13.  * - comment lines are possible and should start with a '#';
  14.  * - empty or blank lines are possible;
  15.  * - extra fields in the password file are ignored; this makes it
  16.  *   possible to use a Unix password file but I do not recommend that.
  17.  *
  18.  */
  19. #include "config.h"
  20. #if HAVE_STDIO_H
  21. #include <stdio.h>
  22. #endif
  23. #if HAVE_STDLIB_H
  24. #include <stdlib.h>
  25. #endif
  26. #if HAVE_UNISTD_H
  27. #include <unistd.h>
  28. #endif
  29. #if HAVE_STRING_H
  30. #include <string.h>
  31. #endif
  32. #if HAVE_SYS_TYPES_H
  33. #include <sys/types.h>
  34. #endif
  35. #if HAVE_SYS_STAT_H
  36. #include <sys/stat.h>
  37. #endif
  38. #if HAVE_CRYPT_H
  39. #include <crypt.h>
  40. #endif
  41. #include "util.h"
  42. #include "hash.h"
  43. static hash_table *hash = NULL;
  44. static HASHFREE my_free;
  45. typedef struct _user_data {
  46.     /* first two items must be same as hash_link */
  47.     char *user;
  48.     struct _user_data *next;
  49.     char *passwd;
  50. } user_data;
  51. static void
  52. my_free(void *p)
  53. {
  54.     user_data *u = p;
  55.     xfree(u->user);
  56.     xfree(u->passwd);
  57.     xfree(u);
  58. }
  59. static void
  60. read_passwd_file(const char *passwdfile)
  61. {
  62.     FILE *f;
  63.     char buf[8192];
  64.     user_data *u;
  65.     char *user;
  66.     char *passwd;
  67.     if (hash != NULL) {
  68. hashFreeItems(hash, my_free);
  69.     }
  70.     /* initial setup */
  71.     hash = hash_create((HASHCMP *) strcmp, 7921, hash_string);
  72.     if (NULL == hash) {
  73. fprintf(stderr, "ncsa_auth: cannot create hash tablen");
  74. exit(1);
  75.     }
  76.     f = fopen(passwdfile, "r");
  77.     while (fgets(buf, 8192, f) != NULL) {
  78. if ((buf[0] == '#') || (buf[0] == ' ') || (buf[0] == 't') ||
  79.     (buf[0] == 'n'))
  80.     continue;
  81. user = strtok(buf, ":n");
  82. passwd = strtok(NULL, ":n");
  83. if ((strlen(user) > 0) && passwd) {
  84.     u = xmalloc(sizeof(*u));
  85.     u->user = xstrdup(user);
  86.     u->passwd = xstrdup(passwd);
  87.     hash_join(hash, (hash_link *) u);
  88. }
  89.     }
  90.     fclose(f);
  91. }
  92. int
  93. main(int argc, char **argv)
  94. {
  95.     struct stat sb;
  96.     time_t change_time = 0;
  97.     char buf[256];
  98.     char *user, *passwd, *p;
  99.     user_data *u;
  100.     setbuf(stdout, NULL);
  101.     if (argc != 2) {
  102. fprintf(stderr, "Usage: ncsa_auth <passwordfile>n");
  103. exit(1);
  104.     }
  105.     if (stat(argv[1], &sb) != 0) {
  106. fprintf(stderr, "cannot stat %sn", argv[1]);
  107. exit(1);
  108.     }
  109.     while (fgets(buf, 256, stdin) != NULL) {
  110. if ((p = strchr(buf, 'n')) != NULL)
  111.     *p = ''; /* strip n */
  112. if (stat(argv[1], &sb) == 0) {
  113.     if (sb.st_mtime != change_time) {
  114. read_passwd_file(argv[1]);
  115. change_time = sb.st_mtime;
  116.     }
  117. }
  118. if ((user = strtok(buf, " ")) == NULL) {
  119. printf("ERRn");
  120. continue;
  121. }
  122. if ((passwd = strtok(NULL, "")) == NULL) {
  123. printf("ERRn");
  124. continue;
  125. }
  126. u = hash_lookup(hash, user);
  127. if (u == NULL) {
  128.     printf("ERRn");
  129. } else if (strcmp(u->passwd, (char *) crypt(passwd, u->passwd))) {
  130.     printf("ERRn");
  131. } else {
  132.     printf("OKn");
  133. }
  134.     }
  135.     exit(0);
  136. }