password.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1994, Regents of the University of California
  3.  *
  4.  * $Id: password.c,v 1.21 1999/05/25 16:09:00 momjian Exp $
  5.  *
  6.  */
  7. #include <postgres.h>
  8. #include <miscadmin.h>
  9. #include <libpq/password.h>
  10. #include <libpq/libpq.h>
  11. #include <storage/fd.h>
  12. #include <string.h>
  13. #include <unistd.h>
  14. #ifdef HAVE_CRYPT_H
  15. #include <crypt.h>
  16. #endif
  17. int
  18. verify_password(char *auth_arg, char *user, char *password)
  19. {
  20. char    *pw_file_fullname;
  21. FILE    *pw_file;
  22. pw_file_fullname = (char *) palloc(strlen(DataDir) + strlen(auth_arg) + 2);
  23. strcpy(pw_file_fullname, DataDir);
  24. strcat(pw_file_fullname, "/");
  25. strcat(pw_file_fullname, auth_arg);
  26. #ifndef __CYGWIN32__
  27. pw_file = AllocateFile(pw_file_fullname, "r");
  28. #else
  29. pw_file = AllocateFile(pw_file_fullname, "rb");
  30. #endif
  31. if (!pw_file)
  32. {
  33. snprintf(PQerrormsg, ERROR_MSG_LENGTH,
  34.  "verify_password: couldn't open password file '%s'n",
  35.  pw_file_fullname);
  36. fputs(PQerrormsg, stderr);
  37. pqdebug("%s", PQerrormsg);
  38. pfree(pw_file_fullname);
  39. return STATUS_ERROR;
  40. }
  41. while (!feof(pw_file))
  42. {
  43. char pw_file_line[255],
  44.    *p,
  45.    *test_user,
  46.    *test_pw;
  47. fgets(pw_file_line, sizeof(pw_file_line), pw_file);
  48. p = pw_file_line;
  49. test_user = strtok(p, ":");
  50. test_pw = strtok(NULL, ":");
  51. if (!test_user || !test_pw ||
  52. test_user[0] == '' || test_pw[0] == '')
  53. continue;
  54. /* kill the newline */
  55. if (test_pw[strlen(test_pw) - 1] == 'n')
  56. test_pw[strlen(test_pw) - 1] = '';
  57. if (strcmp(user, test_user) == 0)
  58. {
  59. /* we're outta here one way or the other. */
  60. FreeFile(pw_file);
  61. if (strcmp(crypt(password, test_pw), test_pw) == 0)
  62. {
  63. /* it matched. */
  64. pfree(pw_file_fullname);
  65. return STATUS_OK;
  66. }
  67. snprintf(PQerrormsg, ERROR_MSG_LENGTH,
  68.  "verify_password: password mismatch for '%s'.n",
  69.  user);
  70. fputs(PQerrormsg, stderr);
  71. pqdebug("%s", PQerrormsg);
  72. pfree(pw_file_fullname);
  73. return STATUS_ERROR;
  74. }
  75. }
  76. snprintf(PQerrormsg, ERROR_MSG_LENGTH,
  77.  "verify_password: user '%s' not found in password file.n",
  78.  user);
  79. fputs(PQerrormsg, stderr);
  80. pqdebug("%s", PQerrormsg);
  81. pfree(pw_file_fullname);
  82. return STATUS_ERROR;
  83. }