If a role has a password expiration date, show that in psql's \du output.
authorTom Lane
Thu, 22 Mar 2012 06:08:25 +0000 (02:08 -0400)
committerTom Lane
Thu, 22 Mar 2012 06:08:25 +0000 (02:08 -0400)
Per a suggestion from Euler Taveira, it seems like a good idea to include
this information in \du (and \dg) output.  This costs nothing for people
who are not using the VALID UNTIL feature, while for those who are, it's
rather critical information.

Fabrízio de Royes Mello

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/describe.c

index fdeaea604047c4053663ec529e03a8f195b79c39..9710e32dfbe44652beb6fea80cc9d7ceeaf54476 100644 (file)
@@ -1267,12 +1267,15 @@ testdb=>
         \dg[+] [ pattern ]
         
         
-        Lists database roles. If 
-        class="parameter">pattern is specified, only
-        those roles whose names match the pattern are listed.
-        (This command is now effectively the same as \du).
+        Lists database roles.
+        (Since the concepts of users and groups have been
+        unified into roles, this command is now equivalent to
+        \du.)
+        If pattern is specified,
+        only those roles whose names match the pattern are listed.
         If the form \dg+ is used, additional information
-        is shown about each role, including the comment for each role.
+        is shown about each role; currently this adds the comment for each
+        role.
         
         
       
@@ -1421,11 +1424,15 @@ testdb=>
         \du[+] [ pattern ]
         
         
-        Lists database roles. If 
-        class="parameter">pattern is specified, only
-        those roles whose names match the pattern are listed.
+        Lists database roles.
+        (Since the concepts of users and groups have been
+        unified into roles, this command is now equivalent to
+        \dg.)
+        If pattern is specified,
+        only those roles whose names match the pattern are listed.
         If the form \du+ is used, additional information
-        is shown about each role, including the comment for each role.
+        is shown about each role; currently this adds the comment for each
+        role.
         
         
       
index 75709afedece9d6857c4ad0314138b704947c5dd..dc2248bc242b9954e0e3c6f6b0bbb8cad6d21aaa 100644 (file)
@@ -2378,7 +2378,7 @@ describeRoles(const char *pattern, bool verbose)
        printfPQExpBuffer(&buf,
                          "SELECT r.rolname, r.rolsuper, r.rolinherit,\n"
                          "  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,\n"
-                         "  r.rolconnlimit,\n"
+                         "  r.rolconnlimit, r.rolvaliduntil,\n"
                          "  ARRAY(SELECT b.rolname\n"
                          "        FROM pg_catalog.pg_auth_members m\n"
                 "        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)\n"
@@ -2406,7 +2406,8 @@ describeRoles(const char *pattern, bool verbose)
                          "  u.usesuper AS rolsuper,\n"
                          "  true AS rolinherit, false AS rolcreaterole,\n"
                     "  u.usecreatedb AS rolcreatedb, true AS rolcanlogin,\n"
-                         "  -1 AS rolconnlimit,\n"
+                         "  -1 AS rolconnlimit,"
+                         "  u.valuntil as rolvaliduntil,\n"
                          "  ARRAY(SELECT g.groname FROM pg_catalog.pg_group g WHERE u.usesysid = ANY(g.grolist)) as memberof"
                          "\nFROM pg_catalog.pg_user u\n");
 
@@ -2453,7 +2454,7 @@ describeRoles(const char *pattern, bool verbose)
            add_role_attribute(&buf, _("Cannot login"));
 
        if (pset.sversion >= 90100)
-           if (strcmp(PQgetvalue(res, i, (verbose ? 9 : 8)), "t") == 0)
+           if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0)
                add_role_attribute(&buf, _("Replication"));
 
        conns = atoi(PQgetvalue(res, i, 6));
@@ -2471,14 +2472,22 @@ describeRoles(const char *pattern, bool verbose)
                                  conns);
        }
 
+       if (strcmp(PQgetvalue(res, i, 7), "") != 0)
+       {
+           if (buf.len > 0)
+               appendPQExpBufferStr(&buf, "\n");
+           appendPQExpBufferStr(&buf, _("Password valid until "));
+           appendPQExpBufferStr(&buf, PQgetvalue(res, i, 7));
+       }
+
        attr[i] = pg_strdup(buf.data);
 
        printTableAddCell(&cont, attr[i], false, false);
 
-       printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false);
+       printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false);
 
        if (verbose && pset.sversion >= 80200)
-           printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false);
+           printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false);
    }
    termPQExpBuffer(&buf);