Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1iQKHD-0005Lr-Os for pgsql-hackers@arkaria.postgresql.org; Thu, 31 Oct 2019 23:54:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1iQKHC-0000AO-2J for pgsql-hackers@arkaria.postgresql.org; Thu, 31 Oct 2019 23:54:50 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1iQKHB-0000AH-JB for pgsql-hackers@lists.postgresql.org; Thu, 31 Oct 2019 23:54:49 +0000 Received: from mail-yw1-xc2f.google.com ([2607:f8b0:4864:20::c2f]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1iQKH7-00018C-Uo for pgsql-hackers@lists.postgresql.org; Thu, 31 Oct 2019 23:54:49 +0000 Received: by mail-yw1-xc2f.google.com with SMTP id a83so1438264ywe.11 for ; Thu, 31 Oct 2019 16:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:openpgp:autocrypt:message-id:date:user-agent :mime-version:content-language; bh=iYu193R8XpR0dHg4ry0gt4UN6uJhvav7t6qaq3AWnoQ=; b=z+34KNJG+UB0u1xzKEmYAXdgzpIABDiOGlZ3Rh10Z0NPWPxkJ8SjgU8BiPBiK9+CqI tZdKY0mBoy+6XlEhzLBj2/OQOlkxDho0c340z361Pe65mPOXxiIqMfcqQ4FmHMqcSxDd ItzUAq2wXii8+U+hyIui5GPX8agKgV3Z0wx9pjgITHSLUZmRGCJE1qiSJYsU2FABe1N9 zzOromS+JRjXYhU/2IVz25BICmP+OGYO3fv3BGLEE8rXuYVdPfOHGAAega9EcXI6mUyL bJjm+p1ZSCIQhsbFkJtTq4Cp+DZkoZSIAFV3ELDWFng0PnL9eqZL+hDUcvtsxoun3IJ4 Ov4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:openpgp:autocrypt:message-id :date:user-agent:mime-version:content-language; bh=iYu193R8XpR0dHg4ry0gt4UN6uJhvav7t6qaq3AWnoQ=; b=Ba14bkbc9W+TPKEw77mhze7k4kekJy36m4TXIMf7hKozcPyj7MDWDvTGdJhuHiolLN r5+KCK8Lf+uvvQCmQKpzyhS8eIcZdADvB3xh+xLuh9mLUbHW4cw9i0M1d3L721O6kTrx AoFWP+046bGIVRTqU+MPsUFi6ZXTPeVFfTjUoJhvnI+naaZ5CWjKZQRBZz8VkfweXkFQ hw73o57bNmL7+1vBUD9ufSQ1yhFKwL6pLn3mL/gix3m5b38N61QlZQ5G1RMQzSOO1Sbc 4GaBkamoaTBs7Su6FK510pdC5ob3WNE95WCYZB81N8+9LOA0VkCo0bObiLTMoFzSdPmJ 9j0A== X-Gm-Message-State: APjAAAU8yrVZTAOMqhhX4qVnoCXrCdOBKEqyfWzJJKT6kadzhp2KJ4JH tTQXoya0tV4UGbSTUWWTrfR/q0B1ExsvH14TOgHhBTSvGt6L5wH+XofqZ84VK4nw7YH1ZkQJ6Tj O5wosCqb2Z4EsVlFYN6gANBJ3TvzitDBQ4zekQiEg81aGm6vLOjqyG+2Rusi4ttwaMuaptHucd/ WoRiWQdfR+kO1HFJQ7zw7L6y4= X-Google-Smtp-Source: APXvYqzUN/bm+Xl3ZpGcnax4ugO0vcRZWAdIX4hQf7vrmOiA6dY1AOXUm27LLdFUqK+w6s9L4zhJ1w== X-Received: by 2002:a81:51c4:: with SMTP id f187mr6383817ywb.409.1572566083051; Thu, 31 Oct 2019 16:54:43 -0700 (PDT) Received: from [192.168.10.146] (99-10-92-30.lightspeed.rlghnc.sbcglobal.net. [99.10.92.30]) by smtp.gmail.com with ESMTPSA id i62sm2678118ywi.102.2019.10.31.16.54.41 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 31 Oct 2019 16:54:42 -0700 (PDT) From: Andrew Dunstan X-Google-Original-From: Andrew Dunstan To: PostgreSQL Hackers Subject: Allow 'sslkey' and 'sslcert' in postgres_fdw user mappings Openpgp: preference=signencrypt Autocrypt: addr=andrew.dunstan@2ndQuadrant.com; prefer-encrypt=mutual; keydata= xsBNBE7KWFkBCAClridxur2AIc7eW2AR7izbfp3EnNefie2HbLF0izW5Ik5UjX2HBXBx4syI gY6b0ugohXrr274+baoAlvSbq6cAoQuEVrk5IZFzt20b1Xkx65FwGSEj526yiKLocqkJceSq Xr9xcA5SGY+FZv441chh5SU92v4q6z+6LPpoHOh97ptAVXZYNTtU0LevyvD5lja0TzbvJm6C eFXitJfnm1pLEr0DGJCR/iUOl/N62Kh4855zZC7NHIjQHPOvV5Stz/l5ilDhvGVk+xkXFPys SjZoUr1rXhYLpiyi5sR0X9FHXT0KnGuz1F5ERO7ZTLSSQ6fJwPj6gOk9K+vvoKvoeql5ABEB AAHNL0FuZHJldyBEdW5zdGFuIDxhbmRyZXcuZHVuc3RhbkAybmRRdWFkcmFudC5jb20+wsCY BBMBAgBCAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUJDyV6hBYhBOQ+WEYd/Hy/RGkV pZn6f8tZ/DuBBQJcH/EVAhkBAAoJEJn6f8tZ/DuB7BEH/iDWZEbVft2m2MT6SPjARzTupt/l xLLZ/Cl6n2US2hov5+fBbnR5xvECk/YCOfG9ICvKNlpFjceqNLRKStd8cmndnI+kDw91uNM2 hpL4aJMeW65XCHvqXlOLSwv5chBpXz9NG7FMaJ+q+59sWEWjcTNmjXgkEHn53y+1pc7nSLDe cr5ZI1aB3nGXRm1SoDY5PYZkUKMykW+YBZwgcs/Q5tRaE+siN7DKbz8E628+PerwAkmHPVXN MdJFD6gs4S0gDFA8IxcyIwZU2v4By+brzcJ9Se3FK5BYxBDHtaYZxgSrJAvOUOrLIZPQTQfL TtnVs3C3JTfrxCH1ceHtnA6dRuTOwE0ETspYWQEIANGc4zQULOxhbqO2dyD51YhqCNRmm9oK Waqf+wmW4tpDe/VVcxAnNizd4LWCHfzpb5cHAtGkOPePMfzWVf6nvdF7d3eglbtf59+zG7O7 llV0xSSoFiieQBsrGvqDInXYX/4mRRXMtyhM353/tixC9RWLs1oofyYmCPPXXY7h9R7en3B8 BoVrRFcdzlIY/NFNhFGW/9dkEiGjgna2Rk6e15kln4ZvFBWUg23p93w/pqXcxY6+k/8TEk+C 4R+M6w7o2PLGOjdZ+kPiUcw5H85zf/yZJwQXzisXaNduwWB6Vads9YC9dj6kPR1c4VGRqAaY L++LAEOqrlvm2TvqQqZRtnEAEQEAAcLAZQQYAQIADwIbDAUCXA6fpAUJDyV6xAAKCRCZ+n/L Wfw7geU4B/9vFFsVmWxerDWgNjyiK80zIPmlw/iwdUlU6FIu0JWLMg4093kvxBs7RMZV9hBq n3ekBvD4IvFsVLJrw9qzSI2FH3UeYy5WXpEs01Ppia60NOlvRDqXbryzuvfe+iYo6bVP3Ikr TPTNYL/BePUTD2DPvSI82SbGTyzuA7SJv6NRqqQDMIy1fU6KyQFLmQJp/QJyhKWzm9jWh8ee w8jVaoMY0Kbq5N7RqisEx1Lu/Iw646UphdYzQNymf+kbiU5Kf4I6DhzV8w9sie1Bo1juNj3I c5/fFJsmxljbnaDbXPcnFsur1Oo9mIHFakgWgOBMuxoWfjONiLjjLh/9+ZIqSSLX Message-ID: Date: Thu, 31 Oct 2019 19:54:41 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------CF3C1E00C66900D4CA836AE9" Content-Language: en-MW List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------CF3C1E00C66900D4CA836AE9 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit This patch achieves  $SUBJECT and also provides some testing of the sslpassword setting. cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------CF3C1E00C66900D4CA836AE9 Content-Type: text/x-patch; name="postgres_fdw_sslparms-1.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="postgres_fdw_sslparms-1.patch" diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 298f652afc..c2661320bc 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -174,6 +174,18 @@ WARNING: extension "bar" is not installed ALTER SERVER testserver1 OPTIONS (DROP extensions); ALTER USER MAPPING FOR public SERVER testserver1 OPTIONS (DROP user, DROP password); +-- Attempt to add a valid option that's not allowed in a user mapping +ALTER USER MAPPING FOR public SERVER testserver1 + OPTIONS (ADD sslmode 'require'); +ERROR: invalid option "sslmode" +HINT: Valid options in this context are: user, password, sslpassword, password_required, sslcert, sslkey +-- But we can add valid ones fine +ALTER USER MAPPING FOR public SERVER testserver1 + OPTIONS (ADD sslpassword 'dummy'); +-- Ensure valid options we haven't used in a user mapping yet are +-- permitted to check validation. +ALTER USER MAPPING FOR public SERVER testserver1 + OPTIONS (ADD sslkey 'value', ADD sslcert 'value'); ALTER FOREIGN TABLE ft1 OPTIONS (schema_name 'S 1', table_name 'T 1'); ALTER FOREIGN TABLE ft2 OPTIONS (schema_name 'S 1', table_name 'T 1'); ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1'); diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c index 07fc7fa00a..0f35dfe54f 100644 --- a/contrib/postgres_fdw/option.c +++ b/contrib/postgres_fdw/option.c @@ -196,6 +196,16 @@ InitPgFdwOptions(void) {"fetch_size", ForeignServerRelationId, false}, {"fetch_size", ForeignTableRelationId, false}, {"password_required", UserMappingRelationId, false}, + /* + * Extra room for the user mapping copies of sslcert and sslkey. These + * are really libpq options but we repeat them here to allow them to + * appear in both foreign server context (when we generate libpq + * options) and user mapping context (from here). Bit of a hack + * putting this in "non_libpq_options". + */ + {"sslcert", UserMappingRelationId, true}, + {"sslkey", UserMappingRelationId, true}, + {NULL, InvalidOid, false} }; diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 5f50c65566..bfdd5dd4d2 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -188,6 +188,19 @@ ALTER SERVER testserver1 OPTIONS (DROP extensions); ALTER USER MAPPING FOR public SERVER testserver1 OPTIONS (DROP user, DROP password); +-- Attempt to add a valid option that's not allowed in a user mapping +ALTER USER MAPPING FOR public SERVER testserver1 + OPTIONS (ADD sslmode 'require'); + +-- But we can add valid ones fine +ALTER USER MAPPING FOR public SERVER testserver1 + OPTIONS (ADD sslpassword 'dummy'); + +-- Ensure valid options we haven't used in a user mapping yet are +-- permitted to check validation. +ALTER USER MAPPING FOR public SERVER testserver1 + OPTIONS (ADD sslkey 'value', ADD sslcert 'value'); + ALTER FOREIGN TABLE ft1 OPTIONS (schema_name 'S 1', table_name 'T 1'); ALTER FOREIGN TABLE ft2 OPTIONS (schema_name 'S 1', table_name 'T 1'); ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1'); diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index bdd6ff8ae4..ef203d225c 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -107,13 +107,13 @@ A foreign server using the postgres_fdw foreign data wrapper can have the same options that libpq accepts in connection strings, as described in , - except that these options are not allowed: + except that these options are not allowed or have special handling: user, password and sslpassword (specify these - in a user mapping, instead) + in a user mapping, instead, or use a service file) @@ -128,6 +128,14 @@ postgres_fdw) + + + sslkey and sslpassword - these may + appear in either or both a connection and a user + mapping. If both are present, the user mapping setting overrides the + connection setting. + + --------------CF3C1E00C66900D4CA836AE9--