Tom Lane wrote:
> Bruce Momjian <[EMAIL PROTECTED]> writes:
> > The attached patch clears the password field on rename:
> 
> I think you should clear the password field *only* if it's
> MD5-encrypted.

Patch attached and applied.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/ref/alter_user.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/alter_user.sgml,v
retrieving revision 1.32
diff -c -c -r1.32 alter_user.sgml
*** doc/src/sgml/ref/alter_user.sgml    29 Nov 2003 19:51:38 -0000      1.32
--- doc/src/sgml/ref/alter_user.sgml    5 May 2004 03:06:44 -0000
***************
*** 57,62 ****
--- 57,65 ----
     The second variant changes the name of the user.  Only a database
     superuser can rename user accounts.  The session user cannot be
     renamed.  (Connect as a different user if you need to do that.)
+    Because <literal>MD5</>-encrypted passwords use the username as
+    cryptographic salt, renaming a user clears their <literal>MD5</>
+    password.
    </para>
  
    <para>
Index: src/backend/commands/user.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/commands/user.c,v
retrieving revision 1.139
diff -c -c -r1.139 user.c
*** src/backend/commands/user.c 16 Mar 2004 05:05:57 -0000      1.139
--- src/backend/commands/user.c 5 May 2004 03:06:46 -0000
***************
*** 959,966 ****
                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                 errmsg("user \"%s\" does not exist", stmt->user)));
  
!       if (!(superuser()
!        || ((Form_pg_shadow) GETSTRUCT(oldtuple))->usesysid == GetUserId()))
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("permission denied")));
--- 959,966 ----
                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                 errmsg("user \"%s\" does not exist", stmt->user)));
  
!       if (!(superuser() ||
!           ((Form_pg_shadow) GETSTRUCT(oldtuple))->usesysid == GetUserId()))
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("permission denied")));
***************
*** 1157,1172 ****
  void
  RenameUser(const char *oldname, const char *newname)
  {
!       HeapTuple       tup;
        Relation        rel;
! 
        /* ExclusiveLock because we need to update the password file */
        rel = heap_openr(ShadowRelationName, ExclusiveLock);
  
!       tup = SearchSysCacheCopy(SHADOWNAME,
                                                         CStringGetDatum(oldname),
                                                         0, 0, 0);
!       if (!HeapTupleIsValid(tup))
                ereport(ERROR,
                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                 errmsg("user \"%s\" does not exist", oldname)));
--- 1157,1181 ----
  void
  RenameUser(const char *oldname, const char *newname)
  {
!       HeapTuple       oldtuple,
!                               newtuple;
!       TupleDesc       dsc;
        Relation        rel;
!       Datum           datum;
!       bool            isnull;
!       Datum           repl_val[Natts_pg_shadow];
!       char            repl_null[Natts_pg_shadow];
!       char            repl_repl[Natts_pg_shadow];
!       int                     i;
!       
        /* ExclusiveLock because we need to update the password file */
        rel = heap_openr(ShadowRelationName, ExclusiveLock);
+       dsc = RelationGetDescr(rel);
  
!       oldtuple = SearchSysCache(SHADOWNAME,
                                                         CStringGetDatum(oldname),
                                                         0, 0, 0);
!       if (!HeapTupleIsValid(oldtuple))
                ereport(ERROR,
                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                 errmsg("user \"%s\" does not exist", oldname)));
***************
*** 1177,1183 ****
         * not be an actual problem besides a little confusion, so think about
         * this and decide.
         */
!       if (((Form_pg_shadow) GETSTRUCT(tup))->usesysid == GetSessionUserId())
                ereport(ERROR,
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("session user may not be renamed")));
--- 1186,1192 ----
         * not be an actual problem besides a little confusion, so think about
         * this and decide.
         */
!       if (((Form_pg_shadow) GETSTRUCT(oldtuple))->usesysid == GetSessionUserId())
                ereport(ERROR,
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("session user may not be renamed")));
***************
*** 1196,1208 ****
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("must be superuser to rename users")));
  
!       /* rename */
!       namestrcpy(&(((Form_pg_shadow) GETSTRUCT(tup))->usename), newname);
!       simple_heap_update(rel, &tup->t_self, tup);
!       CatalogUpdateIndexes(rel, tup);
  
        heap_close(rel, NoLock);
-       heap_freetuple(tup);
  
        user_file_update_needed = true;
  }
--- 1205,1237 ----
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("must be superuser to rename users")));
  
!       for (i = 0; i < Natts_pg_shadow; i++)
!               repl_repl[i] = ' ';
! 
!       repl_repl[Anum_pg_shadow_usename - 1] = 'r';
!       repl_val[Anum_pg_shadow_usename - 1] = DirectFunctionCall1(namein,
!                                                                                      
 CStringGetDatum(newname));
!       repl_null[Anum_pg_shadow_usename - 1] = ' ';
! 
!       datum = heap_getattr(oldtuple, Anum_pg_shadow_passwd, dsc, &isnull);
! 
!       if (!isnull && isMD5(DatumGetCString(DirectFunctionCall1(textout, datum))))
!       {
!               /* MD5 uses the username as salt, so just clear it on a rename */
!               repl_repl[Anum_pg_shadow_passwd - 1] = 'r';
!               repl_null[Anum_pg_shadow_passwd - 1] = 'n';
!       
!               ereport(NOTICE,
!                       (errmsg("MD5 password cleared because of user rename")));
!       }
!                        
!       newtuple = heap_modifytuple(oldtuple, rel, repl_val, repl_null, repl_repl);
!       simple_heap_update(rel, &oldtuple->t_self, newtuple);
!       
!       CatalogUpdateIndexes(rel, newtuple);
  
+       ReleaseSysCache(oldtuple);
        heap_close(rel, NoLock);
  
        user_file_update_needed = true;
  }
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to