diff options
Diffstat (limited to 'src/backend/libpq/hba.c')
-rw-r--r-- | src/backend/libpq/hba.c | 396 |
1 files changed, 206 insertions, 190 deletions
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 872601293c7..97045ff012c 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.28 1998/02/24 15:18:41 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.29 1998/02/26 04:31:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -97,8 +97,8 @@ read_through_eol(FILE *file) static void -read_hba_entry2(FILE *file, UserAuth * userauth_p, char auth_arg[], - bool *error_p) +read_hba_entry2(FILE *file, UserAuth *userauth_p, char auth_arg[], + bool *error_p) { /*-------------------------------------------------------------------------- Read from file FILE the rest of a host record, after the mask field, @@ -156,7 +156,7 @@ read_hba_entry2(FILE *file, UserAuth * userauth_p, char auth_arg[], static void process_hba_record(FILE *file, SockAddr *raddr, const char database[], bool *matches_p, bool *error_p, - UserAuth * userauth_p, char auth_arg[]) + UserAuth *userauth_p, char auth_arg[]) { /*--------------------------------------------------------------------------- Process the non-comment record in the config file that is next on the file. @@ -167,7 +167,8 @@ process_hba_record(FILE *file, SockAddr *raddr, const char database[], return *error_p true, after issuing a message to stderr. If no error, leave *error_p as it was. ---------------------------------------------------------------------------*/ - char db[MAX_TOKEN], buf[MAX_TOKEN]; + char db[MAX_TOKEN], + buf[MAX_TOKEN]; /* Read the record type field. */ @@ -196,9 +197,9 @@ process_hba_record(FILE *file, SockAddr *raddr, const char database[], */ if (!*error_p && - (*userauth_p == uaIdent || - *userauth_p == uaKrb4 || - *userauth_p == uaKrb5)) + (*userauth_p == uaIdent || + *userauth_p == uaKrb4 || + *userauth_p == uaKrb5)) *error_p = true; if (*error_p) @@ -210,12 +211,13 @@ process_hba_record(FILE *file, SockAddr *raddr, const char database[], */ if ((strcmp(db, database) != 0 && strcmp(db, "all") != 0) || - raddr->sa.sa_family != AF_UNIX) + raddr->sa.sa_family != AF_UNIX) return; } else if (strcmp(buf, "host") == 0) { - struct in_addr file_ip_addr, mask; + struct in_addr file_ip_addr, + mask; /* Get the database. */ @@ -284,7 +286,7 @@ process_hba_record(FILE *file, SockAddr *raddr, const char database[], syntax: sprintf(PQerrormsg, - "process_hba_record: invalid syntax in pg_hba.conf file\n"); + "process_hba_record: invalid syntax in pg_hba.conf file\n"); fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); @@ -296,8 +298,8 @@ syntax: static void process_open_config_file(FILE *file, SockAddr *raddr, const char database[], - bool *host_ok_p, UserAuth * userauth_p, - char auth_arg[]) + bool *host_ok_p, UserAuth *userauth_p, + char auth_arg[]) { /*--------------------------------------------------------------------------- This function does the same thing as find_hba_entry, only with @@ -332,7 +334,7 @@ process_open_config_file(FILE *file, SockAddr *raddr, const char database[], else { process_hba_record(file, raddr, database, - &found_entry, &error, userauth_p, auth_arg); + &found_entry, &error, userauth_p, auth_arg); } } } @@ -352,7 +354,7 @@ process_open_config_file(FILE *file, SockAddr *raddr, const char database[], static void find_hba_entry(SockAddr *raddr, const char database[], bool *host_ok_p, - UserAuth * userauth_p, char auth_arg[]) + UserAuth *userauth_p, char auth_arg[]) { /*-------------------------------------------------------------------------- Read the config file and find an entry that allows connection from @@ -812,7 +814,7 @@ verify_against_usermap(const char pguser[], int -authident(struct sockaddr_in *raddr, struct sockaddr_in *laddr, +authident(struct sockaddr_in * raddr, struct sockaddr_in * laddr, const char postgres_username[], const char auth_arg[]) { @@ -840,7 +842,7 @@ authident(struct sockaddr_in *raddr, struct sockaddr_in *laddr, return STATUS_ERROR; verify_against_usermap(postgres_username, ident_username, auth_arg, - &checks_out); + &checks_out); return (checks_out ? STATUS_OK : STATUS_ERROR); } @@ -849,193 +851,207 @@ authident(struct sockaddr_in *raddr, struct sockaddr_in *laddr, #ifdef CYR_RECODE #define CHARSET_FILE "charset.conf" #define MAX_CHARSETS 10 -#define KEY_HOST 1 -#define KEY_BASE 2 -#define KEY_TABLE 3 +#define KEY_HOST 1 +#define KEY_BASE 2 +#define KEY_TABLE 3 struct CharsetItem { - char Orig[MAX_TOKEN]; - char Dest[MAX_TOKEN]; - char Table[MAX_TOKEN]; + char Orig[MAX_TOKEN]; + char Dest[MAX_TOKEN]; + char Table[MAX_TOKEN]; }; -int InRange(char *buf,int host) +int +InRange(char *buf, int host) { - int valid,i,FromAddr,ToAddr,tmp; - struct in_addr file_ip_addr; - char *p; - unsigned int one=0x80000000,NetMask=0; - unsigned char mask; - p = strchr(buf,'/'); - if(p) - { - *p++ = '\0'; - valid = inet_aton(buf, &file_ip_addr); - if(valid) - { - mask = strtoul(p,0,0); - FromAddr = ntohl(file_ip_addr.s_addr); - ToAddr = ntohl(file_ip_addr.s_addr); - for(i=0;i<mask;i++) - { - NetMask |= one; - one >>= 1; - } - FromAddr &= NetMask; - ToAddr = ToAddr | ~NetMask; - tmp = ntohl(host); - return ((unsigned)tmp>=(unsigned)FromAddr && - (unsigned)tmp<=(unsigned)ToAddr); - } - } - else - { - p = strchr(buf,'-'); - if(p) - { - *p++ = '\0'; - valid = inet_aton(buf, &file_ip_addr); - if(valid) - { - FromAddr = ntohl(file_ip_addr.s_addr); - valid = inet_aton(p, &file_ip_addr); - if(valid) - { - ToAddr = ntohl(file_ip_addr.s_addr); - tmp = ntohl(host); - return ((unsigned)tmp>=(unsigned)FromAddr && - (unsigned)tmp<=(unsigned)ToAddr); - } - } - } - else - { - valid = inet_aton(buf, &file_ip_addr); - if(valid) - { - FromAddr = file_ip_addr.s_addr; - return ((unsigned)FromAddr == (unsigned)host); - } - } - } - return false; + int valid, + i, + FromAddr, + ToAddr, + tmp; + struct in_addr file_ip_addr; + char *p; + unsigned int one = 0x80000000, + NetMask = 0; + unsigned char mask; + + p = strchr(buf, '/'); + if (p) + { + *p++ = '\0'; + valid = inet_aton(buf, &file_ip_addr); + if (valid) + { + mask = strtoul(p, 0, 0); + FromAddr = ntohl(file_ip_addr.s_addr); + ToAddr = ntohl(file_ip_addr.s_addr); + for (i = 0; i < mask; i++) + { + NetMask |= one; + one >>= 1; + } + FromAddr &= NetMask; + ToAddr = ToAddr | ~NetMask; + tmp = ntohl(host); + return ((unsigned) tmp >= (unsigned) FromAddr && + (unsigned) tmp <= (unsigned) ToAddr); + } + } + else + { + p = strchr(buf, '-'); + if (p) + { + *p++ = '\0'; + valid = inet_aton(buf, &file_ip_addr); + if (valid) + { + FromAddr = ntohl(file_ip_addr.s_addr); + valid = inet_aton(p, &file_ip_addr); + if (valid) + { + ToAddr = ntohl(file_ip_addr.s_addr); + tmp = ntohl(host); + return ((unsigned) tmp >= (unsigned) FromAddr && + (unsigned) tmp <= (unsigned) ToAddr); + } + } + } + else + { + valid = inet_aton(buf, &file_ip_addr); + if (valid) + { + FromAddr = file_ip_addr.s_addr; + return ((unsigned) FromAddr == (unsigned) host); + } + } + } + return false; } -void GetCharSetByHost(char TableName[],int host, const char DataDir[]) +void +GetCharSetByHost(char TableName[], int host, const char DataDir[]) { - FILE *file; - char buf[MAX_TOKEN],BaseCharset[MAX_TOKEN], - OrigCharset[MAX_TOKEN],DestCharset[MAX_TOKEN],HostCharset[MAX_TOKEN]; - char c,eof=false; - char *map_file; - int key=0,i; - struct CharsetItem* ChArray[MAX_CHARSETS]; - int ChIndex=0; - - *TableName = '\0'; - map_file = (char *) malloc((strlen(DataDir) + - strlen(CHARSET_FILE)+2)*sizeof(char)); - sprintf(map_file, "%s/%s", DataDir, CHARSET_FILE); - file = fopen(map_file, "r"); - if (file == NULL) - return; - while (!eof) - { - c = getc(file); - ungetc(c, file); - if (c == EOF) - eof = true; - else - { - if (c == '#') - read_through_eol(file); - else - { - /* Read the key */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - if (strcasecmp(buf, "HostCharset") == 0) - key = KEY_HOST; - if (strcasecmp(buf, "BaseCharset") == 0) - key = KEY_BASE; - if (strcasecmp(buf, "RecodeTable") == 0) - key = KEY_TABLE; - switch(key) - { - case KEY_HOST: - /* Read the host */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - if (InRange(buf,host)) - { - /* Read the charset */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - strcpy(HostCharset,buf); - } - } - } - break; - case KEY_BASE: - /* Read the base charset */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - strcpy(BaseCharset,buf); - } - break; - case KEY_TABLE: - /* Read the original charset */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - strcpy(OrigCharset,buf); - /* Read the destination charset */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - strcpy(DestCharset,buf); - /* Read the table filename */ - next_token(file, buf, sizeof(buf)); - if (buf[0] != '\0') - { - ChArray[ChIndex] = (struct CharsetItem *) malloc(sizeof(struct CharsetItem)); - strcpy(ChArray[ChIndex]->Orig,OrigCharset); - strcpy(ChArray[ChIndex]->Dest,DestCharset); - strcpy(ChArray[ChIndex]->Table,buf); - ChIndex++; - } - } - } - break; - } - read_through_eol(file); - } - } - } - } - fclose(file); - free(map_file); - - for(i=0; i<ChIndex; i++) - { - if(!strcasecmp(BaseCharset,ChArray[i]->Orig) && - !strcasecmp(HostCharset,ChArray[i]->Dest)) - { - strncpy(TableName,ChArray[i]->Table,79); - } - free((struct CharsetItem *) ChArray[i]); - } + FILE *file; + char buf[MAX_TOKEN], + BaseCharset[MAX_TOKEN], + OrigCharset[MAX_TOKEN], + DestCharset[MAX_TOKEN], + HostCharset[MAX_TOKEN]; + char c, + eof = false; + char *map_file; + int key = 0, + i; + struct CharsetItem *ChArray[MAX_CHARSETS]; + int ChIndex = 0; + + *TableName = '\0'; + map_file = (char *) malloc((strlen(DataDir) + + strlen(CHARSET_FILE) + 2) * sizeof(char)); + sprintf(map_file, "%s/%s", DataDir, CHARSET_FILE); + file = fopen(map_file, "r"); + if (file == NULL) + return; + while (!eof) + { + c = getc(file); + ungetc(c, file); + if (c == EOF) + eof = true; + else + { + if (c == '#') + read_through_eol(file); + else + { + /* Read the key */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + if (strcasecmp(buf, "HostCharset") == 0) + key = KEY_HOST; + if (strcasecmp(buf, "BaseCharset") == 0) + key = KEY_BASE; + if (strcasecmp(buf, "RecodeTable") == 0) + key = KEY_TABLE; + switch (key) + { + case KEY_HOST: + /* Read the host */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + if (InRange(buf, host)) + { + /* Read the charset */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + strcpy(HostCharset, buf); + } + } + } + break; + case KEY_BASE: + /* Read the base charset */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + strcpy(BaseCharset, buf); + } + break; + case KEY_TABLE: + /* Read the original charset */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + strcpy(OrigCharset, buf); + /* Read the destination charset */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + strcpy(DestCharset, buf); + /* Read the table filename */ + next_token(file, buf, sizeof(buf)); + if (buf[0] != '\0') + { + ChArray[ChIndex] = (struct CharsetItem *) malloc(sizeof(struct CharsetItem)); + strcpy(ChArray[ChIndex]->Orig, OrigCharset); + strcpy(ChArray[ChIndex]->Dest, DestCharset); + strcpy(ChArray[ChIndex]->Table, buf); + ChIndex++; + } + } + } + break; + } + read_through_eol(file); + } + } + } + } + fclose(file); + free(map_file); + + for (i = 0; i < ChIndex; i++) + { + if (!strcasecmp(BaseCharset, ChArray[i]->Orig) && + !strcasecmp(HostCharset, ChArray[i]->Dest)) + { + strncpy(TableName, ChArray[i]->Table, 79); + } + free((struct CharsetItem *) ChArray[i]); + } } + #endif extern int hba_getauthmethod(SockAddr *raddr, char *database, char *auth_arg, - UserAuth *auth_method) + UserAuth *auth_method) { /*--------------------------------------------------------------------------- Determine what authentication method should be used when accessing database |