|
39 | 39 | * Portions Copyright (c) 1994, Regents of the University of California
|
40 | 40 | * Portions taken from FreeBSD.
|
41 | 41 | *
|
42 |
| - * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.44 2004/07/19 02:47:12 tgl Exp $ |
| 42 | + * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.45 2004/08/01 05:59:13 momjian Exp $ |
43 | 43 | *
|
44 | 44 | *-------------------------------------------------------------------------
|
45 | 45 | */
|
@@ -88,6 +88,7 @@ char *lc_messages = "";
|
88 | 88 | char*username="";
|
89 | 89 | boolpwprompt= false;
|
90 | 90 | char*pwfilename=NULL;
|
| 91 | +char*authmethod=""; |
91 | 92 | booldebug= false;
|
92 | 93 | boolnoclean= false;
|
93 | 94 | boolshow_setting= false;
|
@@ -118,6 +119,16 @@ booloutput_failed = false;
|
118 | 119 | intn_connections=10;
|
119 | 120 | intn_buffers=50;
|
120 | 121 |
|
| 122 | +/* |
| 123 | + * Warning messages for authentication methods |
| 124 | + */ |
| 125 | +char*authtrust_warning=\ |
| 126 | +"# CAUTION: Configuring the system for local \"trust\" authentication allows\n" |
| 127 | +"# any local user to connect as any PostgreSQL user, including the database\n" |
| 128 | +"# superuser. If you do not trust all your local users, use another\n" |
| 129 | +"# authenication method.\n"; |
| 130 | +char*authwarning=NULL; |
| 131 | + |
121 | 132 | /*
|
122 | 133 | * Centralized knowledge of switches to pass to backend
|
123 | 134 | *
|
@@ -1114,7 +1125,16 @@ setup_config(void)
|
1114 | 1125 | "host all all ::1",
|
1115 | 1126 | "#host all all ::1");
|
1116 | 1127 | #endif
|
1117 |
| - |
| 1128 | + |
| 1129 | +/* Replace default authentication methods */ |
| 1130 | +conflines=replace_token(conflines, |
| 1131 | +"@authmethod@", |
| 1132 | +authmethod); |
| 1133 | + |
| 1134 | +conflines=replace_token(conflines, |
| 1135 | +"@authcomment@", |
| 1136 | +strcmp(authmethod,"trust") ?"" :authtrust_warning); |
| 1137 | + |
1118 | 1138 | snprintf(path,sizeof(path),"%s/pg_hba.conf",pg_data);
|
1119 | 1139 |
|
1120 | 1140 | writefile(path,conflines);
|
@@ -1971,6 +1991,7 @@ usage(const char *progname)
|
1971 | 1991 | " in the respective category (default taken from\n"
|
1972 | 1992 | " environment)\n"));
|
1973 | 1993 | printf(_(" --no-locale equivalent to --locale=C\n"));
|
| 1994 | +printf(_(" -A, --auth=method default authentication method for local connections\n")); |
1974 | 1995 | printf(_(" -U, --username=NAME database superuser name\n"));
|
1975 | 1996 | printf(_(" -W, --pwprompt prompt for a password for the new superuser\n"));
|
1976 | 1997 | printf(_(" --pwfile=filename read password for the new superuser from file\n"));
|
@@ -2004,6 +2025,7 @@ main(int argc, char *argv[])
|
2004 | 2025 | {"lc-time",required_argument,NULL,6},
|
2005 | 2026 | {"lc-messages",required_argument,NULL,7},
|
2006 | 2027 | {"no-locale",no_argument,NULL,8},
|
| 2028 | +{"auth",required_argument,NULL,'A'}, |
2007 | 2029 | {"pwprompt",no_argument,NULL,'W'},
|
2008 | 2030 | {"pwfile",required_argument,NULL,9},
|
2009 | 2031 | {"username",required_argument,NULL,'U'},
|
@@ -2052,10 +2074,13 @@ main(int argc, char *argv[])
|
2052 | 2074 |
|
2053 | 2075 | /* process command-line options */
|
2054 | 2076 |
|
2055 |
| -while ((c=getopt_long(argc,argv,"dD:E:L:nU:W",long_options,&option_index))!=-1) |
| 2077 | +while ((c=getopt_long(argc,argv,"dD:E:L:nU:WA:",long_options,&option_index))!=-1) |
2056 | 2078 | {
|
2057 | 2079 | switch (c)
|
2058 | 2080 | {
|
| 2081 | +case'A': |
| 2082 | +authmethod=xstrdup(optarg); |
| 2083 | +break; |
2059 | 2084 | case'D':
|
2060 | 2085 | pg_data=xstrdup(optarg);
|
2061 | 2086 | break;
|
@@ -2136,6 +2161,43 @@ main(int argc, char *argv[])
|
2136 | 2161 | fprintf(stderr,_("%s: you cannot specify both password prompt and password file\n"),progname);
|
2137 | 2162 | exit(1);
|
2138 | 2163 | }
|
| 2164 | + |
| 2165 | +if (authmethod==NULL|| !strlen(authmethod)) |
| 2166 | +{ |
| 2167 | +authwarning=_("\nWARNING: enabling \"trust\" authentication for local connections.\n" |
| 2168 | +"You can change this by editing pg_hba.conf or using the -A flag the\n" |
| 2169 | +"next time you run initdb.\n"); |
| 2170 | +authmethod="trust"; |
| 2171 | +} |
| 2172 | + |
| 2173 | +if (strcmp(authmethod,"md5")&& |
| 2174 | +strcmp(authmethod,"ident")&& |
| 2175 | +strncmp(authmethod,"ident ",6)&&/* ident with space = param */ |
| 2176 | +strcmp(authmethod,"trust")&& |
| 2177 | +#ifdefUSE_PAM |
| 2178 | +strcmp(authmethod,"pam")&& |
| 2179 | +strncmp(authmethod,"pam ",4)&&/* pam with space = param */ |
| 2180 | +#endif |
| 2181 | +strcmp(authmethod,"crypt")&& |
| 2182 | +strcmp(authmethod,"password") |
| 2183 | +) |
| 2184 | +/* |
| 2185 | + *Kerberos methods not listed because they are not supported |
| 2186 | + * over local connections and are rejected in hba.c |
| 2187 | + */ |
| 2188 | +{ |
| 2189 | +fprintf(stderr,_("%s: unknown authentication method \"%s\".\n"),progname,authmethod); |
| 2190 | +exit(1); |
| 2191 | +} |
| 2192 | + |
| 2193 | +if ((!strcmp(authmethod,"md5")|| |
| 2194 | + !strcmp(authmethod,"crypt")|| |
| 2195 | + !strcmp(authmethod,"password"))&& |
| 2196 | + !(pwprompt||pwfilename)) |
| 2197 | +{ |
| 2198 | +fprintf(stderr,_("%s: you need to specify a password for the superuser to enable %s authentication.\n"),progname,authmethod); |
| 2199 | +exit(1); |
| 2200 | +} |
2139 | 2201 |
|
2140 | 2202 | if (strlen(pg_data)==0)
|
2141 | 2203 | {
|
@@ -2449,6 +2511,9 @@ main(int argc, char *argv[])
|
2449 | 2511 |
|
2450 | 2512 | make_template0();
|
2451 | 2513 |
|
| 2514 | +if (authwarning!=NULL) |
| 2515 | +fprintf(stderr,authwarning); |
| 2516 | + |
2452 | 2517 | printf(_("\nSuccess. You can now start the database server using:\n\n"
|
2453 | 2518 | " %s%s%s/postmaster -D %s%s%s\n"
|
2454 | 2519 | "or\n"
|
|