10
10
*
11
11
*
12
12
* IDENTIFICATION
13
- * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.119 2003/12/25 03:44:04 momjian Exp $
13
+ * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.120 2004/02/02 16:58:30 neilc Exp $
14
14
*
15
15
*-------------------------------------------------------------------------
16
16
*/
37
37
#include "storage/fd.h"
38
38
39
39
40
- #define IDENT_USERNAME_MAX 512
41
40
/* Max size of username ident server can return */
41
+ #define IDENT_USERNAME_MAX 512
42
+
43
+ /* Standard TCP port number for Ident service. Assigned by IANA */
44
+ #define IDENT_PORT 113
45
+
46
+ /* Name of the config file */
47
+ #define CONF_FILE "pg_hba.conf"
48
+
49
+ /* Name of the usermap file */
50
+ #define USERMAP_FILE "pg_ident.conf"
42
51
43
52
/* This is used to separate values in multi-valued column strings */
44
53
#define MULTI_VALUE_SEP "\001"
45
54
55
+ #define MAX_TOKEN 256
56
+
46
57
/*
47
58
* These variables hold the pre-parsed contents of the hba and ident
48
59
* configuration files. Each is a list of sublists, one sublist for
@@ -80,19 +91,19 @@ pg_isblank(const char c)
80
91
81
92
82
93
/*
83
- * Grab one token out of fp. Tokens are strings of non-blank
84
- * characters bounded by blank characters, beginning of line, and
85
- * end of line. Blank means space or tab. Return the token as
86
- * *buf. Leave file positioned to character immediately after the
87
- * token or EOF, whichever comes first. If no more tokens on line,
88
- * return null string as *buf and position file to beginning of
89
- * next line or EOF, whichever comes first. Allow spaces in quoted
90
- * strings. Terminate on unquoted commas. Handle comments. Treat
91
- * unquoted keywords that might be user names or database names
92
- * specially, by appending a newline to them.
94
+ * Grab one token out of fp. Tokens are strings of non-blank
95
+ * characters bounded by blank characters, beginning of line, and
96
+ * end of line. Blank means space or tab. Return the token as
97
+ * *buf. Leave file positioned at the character immediately after the
98
+ * token or EOF, whichever comes first. If no more tokens on line,
99
+ * return empty string as *buf and position the file to the beginning
100
+ * of the next line or EOF, whichever comes first. Allow spaces in
101
+ * quoted strings. Terminate on unquoted commas. Handle
102
+ * comments. Treat unquoted keywords that might be user names or
103
+ * database names specially, by appending a newline to them.
93
104
*/
94
- void
95
- next_token (FILE * fp , char * buf , const int bufsz )
105
+ static void
106
+ next_token (FILE * fp , char * buf , int bufsz )
96
107
{
97
108
int c ;
98
109
char * start_buf = buf ;
@@ -101,88 +112,89 @@ next_token(FILE *fp, char *buf, const int bufsz)
101
112
bool was_quote = false;
102
113
bool saw_quote = false;
103
114
115
+ Assert (end_buf > start_buf );
116
+
104
117
/* Move over initial whitespace and commas */
105
118
while ((c = getc (fp )) != EOF && (pg_isblank (c ) || c == ',' ))
106
119
;
107
120
108
- if (c != EOF && c ! = '\n' )
121
+ if (c == EOF || c = = '\n' )
109
122
{
110
- /*
111
- * Build a token in buf of next characters up to EOF, EOL,
112
- * unquoted comma, or unquoted whitespace.
113
- */
114
- while (c != EOF && c != '\n' &&
115
- (!pg_isblank (c ) || in_quote == true))
116
- {
117
- /* skip comments to EOL */
118
- if (c == '#' && !in_quote )
119
- {
120
- while ((c = getc (fp )) != EOF && c != '\n' )
121
- ;
122
- /* If only comment, consume EOL too; return EOL */
123
- if (c != EOF && buf == start_buf )
124
- c = getc (fp );
125
- break ;
126
- }
123
+ * buf = '\0' ;
124
+ return ;
125
+ }
127
126
128
- if (buf >= end_buf )
129
- {
130
- ereport (LOG ,
131
- (errcode (ERRCODE_CONFIG_FILE_ERROR ),
132
- errmsg ("authentication file token too long, skipping: \"%s\"" ,
133
- buf )));
134
- /* Discard remainder of line */
135
- while ((c = getc (fp )) != EOF && c != '\n' )
136
- ;
137
- buf [0 ] = '\0' ;
138
- break ;
139
- }
127
+ /*
128
+ * Build a token in buf of next characters up to EOF, EOL,
129
+ * unquoted comma, or unquoted whitespace.
130
+ */
131
+ while (c != EOF && c != '\n' &&
132
+ (!pg_isblank (c ) || in_quote == true))
133
+ {
134
+ /* skip comments to EOL */
135
+ if (c == '#' && !in_quote )
136
+ {
137
+ while ((c = getc (fp )) != EOF && c != '\n' )
138
+ ;
139
+ /* If only comment, consume EOL too; return EOL */
140
+ if (c != EOF && buf == start_buf )
141
+ c = getc (fp );
142
+ break ;
143
+ }
140
144
141
- if (c != '"' || (c == '"' && was_quote ))
142
- * buf ++ = c ;
145
+ if (buf >= end_buf )
146
+ {
147
+ ereport (LOG ,
148
+ (errcode (ERRCODE_CONFIG_FILE_ERROR ),
149
+ errmsg ("authentication file token too long, skipping: \"%s\"" ,
150
+ buf )));
151
+ /* Discard remainder of line */
152
+ while ((c = getc (fp )) != EOF && c != '\n' )
153
+ ;
154
+ buf [0 ] = '\0' ;
155
+ break ;
156
+ }
143
157
144
- /* We pass back the comma so the caller knows there is more */
145
- if ((pg_isblank (c ) || c == ',' ) && !in_quote )
146
- break ;
158
+ if (c != '"' || (c == '"' && was_quote ))
159
+ * buf ++ = c ;
147
160
148
- /* Literal double-quote is two double-quotes */
149
- if (in_quote && c == '"' )
150
- was_quote = !was_quote ;
151
- else
152
- was_quote = false;
161
+ /* We pass back the comma so the caller knows there is more */
162
+ if ((pg_isblank (c ) || c == ',' ) && !in_quote )
163
+ break ;
153
164
154
- if ( c == '"' )
155
- {
156
- in_quote = !in_quote ;
157
- saw_quote = true;
158
- }
165
+ /* Literal double-quote is two double-quotes */
166
+ if ( in_quote && c == '"' )
167
+ was_quote = !was_quote ;
168
+ else
169
+ was_quote = false;
159
170
160
- c = getc (fp );
171
+ if (c == '"' )
172
+ {
173
+ in_quote = !in_quote ;
174
+ saw_quote = true;
161
175
}
162
176
163
- /*
164
- * Put back the char right after the token (critical in case it is
165
- * EOL, since we need to detect end-of-line at next call).
166
- */
167
- if (c != EOF )
168
- ungetc (c , fp );
177
+ c = getc (fp );
169
178
}
170
179
180
+ /*
181
+ * Put back the char right after the token (critical in case it is
182
+ * EOL, since we need to detect end-of-line at next call).
183
+ */
184
+ if (c != EOF )
185
+ ungetc (c , fp );
186
+
187
+ * buf = '\0' ;
171
188
172
- if ( !saw_quote &&
173
- (
174
- strncmp (start_buf ,"all" ,3 ) == 0 ||
175
- strncmp (start_buf ,"sameuser" ,8 ) == 0 ||
176
- strncmp (start_buf ,"samegroup" ,9 ) == 0
177
- )
178
- )
189
+ if (!saw_quote &&
190
+ (strcmp (start_buf , "all" ) == 0 ||
191
+ strcmp (start_buf , "sameuser" ) == 0 ||
192
+ strcmp (start_buf , "samegroup" ) == 0 ))
179
193
{
180
194
/* append newline to a magical keyword */
181
195
* buf ++ = '\n' ;
196
+ * buf = '\0' ;
182
197
}
183
-
184
- * buf = '\0' ;
185
-
186
198
}
187
199
188
200
/*
0 commit comments