From 04dfc8774966c60e4031ab5d8eeb3263d9568ad3 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Thu, 22 Mar 2012 02:08:25 -0400 Subject: [PATCH] If a role has a password expiration date, show that in psql's \du output. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 | 25 ++++++++++++++++--------- src/bin/psql/describe.c | 19 ++++++++++++++----- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index fdeaea60404..9710e32dfbe 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1267,12 +1267,15 @@ testdb=> <term><literal>\dg[+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term> <listitem> <para> - Lists database roles. If <replaceable - class="parameter">pattern</replaceable> is specified, only - those roles whose names match the pattern are listed. - (This command is now effectively the same as <literal>\du</literal>). + Lists database roles. + (Since the concepts of <quote>users</> and <quote>groups</> have been + unified into <quote>roles</>, this command is now equivalent to + <literal>\du</literal>.) + If <replaceable class="parameter">pattern</replaceable> is specified, + only those roles whose names match the pattern are listed. If the form <literal>\dg+</literal> 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. </para> </listitem> </varlistentry> @@ -1421,11 +1424,15 @@ testdb=> <term><literal>\du[+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term> <listitem> <para> - Lists database roles. If <replaceable - class="parameter">pattern</replaceable> is specified, only - those roles whose names match the pattern are listed. + Lists database roles. + (Since the concepts of <quote>users</> and <quote>groups</> have been + unified into <quote>roles</>, this command is now equivalent to + <literal>\dg</literal>.) + If <replaceable class="parameter">pattern</replaceable> is specified, + only those roles whose names match the pattern are listed. If the form <literal>\du+</literal> 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. </para> </listitem> </varlistentry> diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 75709afedec..dc2248bc242 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -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); -- GitLab