return true;
}
+/*
+ * Return whether SCRAM pass-through is enabled.
+ *
+ * If use_scram_passthrough is specified in both the foreign server
+ * and the user mapping, the user mapping setting takes precedence.
+ */
static bool
UseScramPassthrough(ForeignServer *server, UserMapping *user)
{
ListCell *cell;
- foreach(cell, server->options)
+ foreach(cell, user->options)
{
DefElem *def = (DefElem *) lfirst(cell);
return defGetBoolean(def);
}
- foreach(cell, user->options)
+ foreach(cell, server->options)
{
DefElem *def = (DefElem *) lfirst(cell);
my $db2 = "db2"; # For node2
my $fdw_server = "db1_fdw";
my $fdw_server2 = "db2_fdw";
+my $fdw_server3 = "db1_fdw_override";
my $node1 = PostgreSQL::Test::Cluster->new('node1');
my $node2 = PostgreSQL::Test::Cluster->new('node2');
$node1->safe_psql($db0, 'CREATE EXTENSION IF NOT EXISTS postgres_fdw');
setup_fdw_server($node1, $db0, $fdw_server, $node1, $db1);
setup_fdw_server($node1, $db0, $fdw_server2, $node2, $db2);
+setup_fdw_server($node1, $db0, $fdw_server3, $node1, $db1);
setup_user_mapping($node1, $db0, $fdw_server);
setup_user_mapping($node1, $db0, $fdw_server2);
+setup_user_mapping($node1, $db0, $fdw_server3);
# Make the user have the same SCRAM key on both servers. Forcing to have the
# same iteration and salt.
test_auth($node2, $db2, "t2",
"SCRAM auth directly on foreign server should still succeed");
+# Test that use_scram_passthrough=false on user mapping overrides server setting
+{
+ my $connstr = $node1->connstr($db0) . qq' user=$user';
+
+ $node1->safe_psql($db0,
+ qq'ALTER USER MAPPING FOR $user SERVER $fdw_server3 OPTIONS(add use_scram_passthrough \'false\')',
+ connstr => $connstr
+ );
+
+ $node1->safe_psql(
+ $db0,
+ qq'CREATE FOREIGN TABLE override_t (g int, col2 int) SERVER $fdw_server3 OPTIONS (table_name \'t\');',
+ connstr => $connstr );
+ $node1->safe_psql($db0, qq'GRANT SELECT ON override_t TO $user;', connstr => $connstr);
+
+ my ($ret, $stdout, $stderr) = $node1->psql(
+ $db0,
+ qq'SELECT count(1) FROM override_t',
+ connstr => $connstr);
+
+ is($ret, 3, 'SCRAM passthrough disabled on user mapping should fail');
+ like(
+ $stderr,
+ qr/password/i,
+ 'expected password-related error when scram passthrough disabled on user mapping');
+}
+
SKIP:
{
skip "test requires Unix-domain sockets", 4 if !$use_unix_sockets;
<para>
This option controls whether <filename>postgres_fdw</filename> will
use the SCRAM pass-through authentication to connect to the foreign
- server. With SCRAM pass-through authentication,
+ server. It can be specified for a foreign server or a user mapping.
+ A user mapping setting overrides the foreign server setting.
+ With SCRAM pass-through authentication,
<filename>postgres_fdw</filename> uses SCRAM-hashed secrets instead of
plain-text user passwords to connect to the remote server. This
avoids storing plain-text user passwords in PostgreSQL system