diff options
Diffstat (limited to 'src/backend/libpq/password.c')
-rw-r--r-- | src/backend/libpq/password.c | 69 |
1 files changed, 21 insertions, 48 deletions
diff --git a/src/backend/libpq/password.c b/src/backend/libpq/password.c index 8f26597f6a4..c77b065e336 100644 --- a/src/backend/libpq/password.c +++ b/src/backend/libpq/password.c @@ -1,6 +1,6 @@ #include <postgres.h> +#include <miscadmin.h> #include <libpq/password.h> -#include <libpq/hba.h> #include <libpq/libpq.h> #include <storage/fd.h> #include <string.h> @@ -10,56 +10,15 @@ #endif int -verify_password(char *user, char *password, Port *port, - char *database, char *DataDir) +verify_password(char *auth_arg, char *user, char *password) { - bool host_ok; - enum Userauth userauth; - char pw_file_name[PWFILE_NAME_SIZE + 1]; + char *pw_file_fullname; + FILE *pw_file; - char *pw_file_fullname; - FILE *pw_file; - - char pw_file_line[255]; - char *p, - *test_user, - *test_pw; - - find_hba_entry(DataDir, port->raddr.in.sin_addr, database, - &host_ok, &userauth, pw_file_name, true); - - if (!host_ok) - { - sprintf(PQerrormsg, - "verify_password: couldn't find entry for connecting host\n"); - fputs(PQerrormsg, stderr); - pqdebug("%s", PQerrormsg); - return STATUS_ERROR; - } - - if (userauth != Password) - { - sprintf(PQerrormsg, - "verify_password: couldn't find entry of type 'password' " - "for this host\n"); - fputs(PQerrormsg, stderr); - pqdebug("%s", PQerrormsg); - return STATUS_ERROR; - } - - if (!pw_file_name || pw_file_name[0] == '\0') - { - sprintf(PQerrormsg, - "verify_password: no password file specified\n"); - fputs(PQerrormsg, stderr); - pqdebug("%s", PQerrormsg); - return STATUS_ERROR; - } - - pw_file_fullname = (char *) palloc(strlen(DataDir) + strlen(pw_file_name) + 2); + pw_file_fullname = (char *) palloc(strlen(DataDir) + strlen(auth_arg) + 2); strcpy(pw_file_fullname, DataDir); strcat(pw_file_fullname, "/"); - strcat(pw_file_fullname, pw_file_name); + strcat(pw_file_fullname, auth_arg); pw_file = AllocateFile(pw_file_fullname, "r"); if (!pw_file) @@ -69,12 +28,17 @@ verify_password(char *user, char *password, Port *port, pw_file_fullname); fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); + + pfree(pw_file_fullname); + return STATUS_ERROR; } while (!feof(pw_file)) { - fgets(pw_file_line, 255, pw_file); + char pw_file_line[255], *p, *test_user, *test_pw; + + fgets(pw_file_line, sizeof (pw_file_line), pw_file); p = pw_file_line; test_user = strtok(p, ":"); @@ -97,6 +61,9 @@ verify_password(char *user, char *password, Port *port, if (strcmp(crypt(password, test_pw), test_pw) == 0) { /* it matched. */ + + pfree(pw_file_fullname); + return STATUS_OK; } @@ -105,6 +72,9 @@ verify_password(char *user, char *password, Port *port, user); fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); + + pfree(pw_file_fullname); + return STATUS_ERROR; } } @@ -114,5 +84,8 @@ verify_password(char *user, char *password, Port *port, user); fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); + + pfree(pw_file_fullname); + return STATUS_ERROR; } |