]> granicus.if.org Git - postgresql/commitdiff
Repair problems with omitted password and VALID UNTIL
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 2 Apr 1999 06:16:36 +0000 (06:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 2 Apr 1999 06:16:36 +0000 (06:16 +0000)
parameters in CREATE USER.

src/backend/commands/user.c

index e166a8b1c3b324fe47d7285c037a17e85adc1cae..2b99c8efa89737330334d74cd143ab972414c06d 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: user.c,v 1.26 1999/03/16 04:25:45 momjian Exp $
+ * $Id: user.c,v 1.27 1999/04/02 06:16:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -94,20 +94,24 @@ UpdatePgPwdFile(char *sql, CommandDest dest)
 void
 DefineUser(CreateUserStmt *stmt, CommandDest dest)
 {
-
-       char                                    *pg_shadow,
-                                                               sql[SQL_LENGTH];
+       char                       *pg_shadow,
+                                               sql[SQL_LENGTH];
        Relation                        pg_shadow_rel;
        TupleDesc                       pg_shadow_dsc;
-       HeapScanDesc    scan;
+       HeapScanDesc            scan;
        HeapTuple                       tuple;
-       Datum                                   datum;
-       bool                                    exists = false,
-                                                               n,
-                                                               inblock;
-       int                                             max_id = -1;
-
-       if (stmt->password)
+       Datum                           datum;
+       bool                            exists = false,
+                                               n,
+                                               inblock,
+                                               havepassword,
+                                               havevaluntil;
+       int                                     max_id = -1;
+
+       havepassword = stmt->password && stmt->password[0];
+       havevaluntil = stmt->validUntil && stmt->validUntil[0];
+
+       if (havepassword)
                CheckPgUserAclNotNull();
        if (!(inblock = IsTransactionBlock()))
                BeginTransactionBlock();
@@ -163,18 +167,31 @@ DefineUser(CreateUserStmt *stmt, CommandDest dest)
        }
 
        /*
-        * Build the insert statment to be executed.
+        * Build the insert statement to be executed.
+        *
+        * XXX Ugly as this code is, it still fails to cope with ' or \
+        * in any of the provided strings.
         */
        snprintf(sql, SQL_LENGTH, 
-                       "insert into %s(usename,usesysid,usecreatedb,usetrace,usesuper,"
-                       "usecatupd,passwd,valuntil) values('%s',%d%s%s,'%s','%s')", 
-                       ShadowRelationName, 
-                       stmt->user, max_id + 1,
-                       (stmt->createdb && *stmt->createdb) ? ",'t','t'" : ",'f','t'",
-                       (stmt->createuser && *stmt->createuser) ? ",'t','t'" : ",'f','t'",
-                       stmt->password ? stmt->password : "''",
-                       stmt->validUntil ? stmt->validUntil : "");
+                        "insert into %s (usename,usesysid,usecreatedb,usetrace,"
+                        "usesuper,usecatupd,passwd,valuntil) "
+                        "values('%s',%d,'%c','t','%c','t',%s%s%s,%s%s%s)", 
+                        ShadowRelationName,
+                        stmt->user,
+                        max_id + 1,
+                        (stmt->createdb && *stmt->createdb) ? 't' : 'f',
+                        (stmt->createuser && *stmt->createuser) ? 't' : 'f',
+                        havepassword ? "'" : "",
+                        havepassword ? stmt->password : "NULL",
+                        havepassword ? "'" : "",
+                        havevaluntil ? "'" : "",
+                        havevaluntil ? stmt->validUntil : "NULL",
+                        havevaluntil ? "'" : "");
 
+       /*
+        * XXX If insert fails, say because a bogus valuntil date is given,
+        * need to catch the resulting error and undo our transaction.
+        */
        pg_exec_query_dest(sql, dest, false);
 
        /*