Re: pg_hba_file_settings view patch

From: Haribabu Kommi <kommi(dot)haribabu(at)gmail(dot)com>
To: Michael Paquier <michael(dot)paquier(at)gmail(dot)com>
Cc: Simon Riggs <simon(at)2ndquadrant(dot)com>, Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: pg_hba_file_settings view patch
Date: 2017-01-17 01:19:40
Message-ID: CAJrrPGfCcgbNTE1uWj1__KrK8bX_N2y4ObaGEgYe_UcdvjOseA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Jan 10, 2017 at 6:35 PM, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>
wrote:

> On Thu, Jan 5, 2017 at 1:58 PM, Michael Paquier
> <michael(dot)paquier(at)gmail(dot)com> wrote:
> > Could you hold on a bit to commit that? I'd like to look at it in more
> > details. At quick glance, there is for example no need to use
> > CreateTemplateTupleDesc and list the columns both in pg_proc.h and the
> > C routine itself. And memset() can be used in fill_hba_line for the
> > error code path.
>
> And here we go.
>

Thanks for the review.

> +<programlisting>
> +postgres=# select * from pg_hba_rules;
> [... large example ...]
> +
> +</programlisting>
> It would be nice to reduce the width of this example. That's not going
> to be friendly with the generated html.
>

Added a small example.

+ switch (hba->conntype)
> + {
> + case ctLocal:
> + values[index] = CStringGetTextDatum("local");
> + break;
> + case ctHost:
> + values[index] = CStringGetTextDatum("host");
> + break;
> + case ctHostSSL:
> + values[index] = CStringGetTextDatum("hostssl");
> + break;
> + case ctHostNoSSL:
> + values[index] = CStringGetTextDatum("hostnossl");
> + break;
> + default:
> + elog(ERROR, "unexpected connection type in parsed HBA
> entry");
> + break;
> + }
> Here let's remove the break clause and let compilers catch problem
> when they show up.
>

Removed.

> + if (hba->pamservice)
> + {
> + initStringInfo(&str);
> + appendStringInfoString(&str, "pamservice=");
> + appendStringInfoString(&str, hba->pamservice);
> + options[noptions++] = CStringGetTextDatum(str.data);
> + }
> There is a bunch of code duplication here. I think that it would make
> more sense to encapsulate that into a routine, at least let's use
> appendStringInfo and let's group the two calls together.
>

Use a new function to reduce the repeated lines of code.

> +/* LDAP supports 10 currently, keep this well above the most any
> method needs */
> +#define MAX_OPTIONS 12
> Er, why? There is an assert already, that should be enough.
>

Which Assert? This macro is used to verify that the maximum number
of authentication options that are possible for a single hba line.

> =# \d pg_hba_rules
> View "pg_catalog.pg_hba_rules"
> Column | Type | Collation | Nullable | Default
> ------------------+---------+-----------+----------+---------
> line_number | integer | | |
> type | text | | |
> keyword_database | text[] | | |
> database | text[] | | |
> keyword_user | text[] | | |
> user_name | text[] | | |
> keyword_address | text | | |
> address | inet | | |
> netmask | inet | | |
> hostname | text | | |
> method | text | | |
> options | text[] | | |
> error | text | | |
> keyword_database and database map actually to the same thing if you
> refer to a raw pg_hba.conf file because they have the same meaning for
> user. You could simplify the view and just remove keyword_database,
> keyword_user and keyword_address. This would simplify your patch as
> well with all hte mumbo-jumbo to see if a string is a dedicated
> keyword or not. In its most simple shape pg_hba_rules should show to
> the user as an exact map of the entries of the raw file.
>

I removed keyword_database and keyword_user columns where the data
in those columns can easily represent with the database and user columns.
But for address filed can contains keywords such as "same host" and etc and
also a hostname also. Because of this reason, this filed is converted into
3 columns in the view.

I have copied the example file of pg_hba.conf, reloaded it:
> https://www.postgresql.org/docs/devel/static/auth-pg-hba-conf.html
> And then the output result gets corrupted by showing up free()'d results:
> null | null | \x7F\x7F\x7F\x7F\x7F
>

There was a problem in resetting the error string, working with attached
patch.

> + if (err_msg)
> + {
> + /* type */
> + index++;
> + nulls[index] = true;
> [... long sequence ...]
> Please let's use MemSet here and remove this large chunk of code..
>

Done.

> + if (!superuser())
> + ereport(ERROR,
> + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
> + (errmsg("must be superuser to view pg_hba.conf
> settings"))));
> Access to the function is already revoked, so what's the point of this
> superuser check?
>

Removed.

>
> + tupdesc = CreateTemplateTupleDesc(NUM_PG_HBA_LOOKUP_ATTS, false);
> + TupleDescInitEntry(tupdesc, (AttrNumber) 1, "line_number",
> + INT4OID, -1, 0);
> There is no need to list all the columns here. You can just use
> get_call_result_type() and be done with it as the types and columns
> names are already listed in the pg_proc entry of the new function.]

Done.

Updated patch attached.

Regards,
Hari Babu
Fujitsu Australia

Attachment Content-Type Size
pg_hba_rules_7.patch application/octet-stream 43.5 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Geoghegan 2017-01-17 01:56:10 Re: Polyphase merge is obsolete
Previous Message Andres Freund 2017-01-17 01:00:39 Re: Implement targetlist SRFs using ROWS FROM() (was Changed SRF in targetlist handling)