PostgreSQL Source Code git master
|
#include "postgres_fe.h"
#include <curl/curl.h>
#include <math.h>
#include <unistd.h>
#include "common/jsonapi.h"
#include "fe-auth.h"
#include "fe-auth-oauth.h"
#include "libpq-int.h"
#include "mb/pg_wchar.h"
Go to the source code of this file.
Data Structures | |
struct | provider |
struct | device_authz |
struct | token_error |
struct | token |
struct | async_ctx |
struct | json_field |
struct | oauth_parse |
Macros | |
#define | MAX_OAUTH_RESPONSE_SIZE (256 * 1024) |
#define | actx_error(ACTX, FMT, ...) appendPQExpBuffer(&(ACTX)->errbuf, libpq_gettext(FMT), ##__VA_ARGS__) |
#define | actx_error_str(ACTX, S) appendPQExpBufferStr(&(ACTX)->errbuf, S) |
#define | CHECK_MSETOPT(ACTX, OPT, VAL, FAILACTION) |
#define | CHECK_SETOPT(ACTX, OPT, VAL, FAILACTION) |
#define | CHECK_GETINFO(ACTX, INFO, OUT, FAILACTION) |
#define | PG_OAUTH_REQUIRED true |
#define | PG_OAUTH_OPTIONAL false |
#define | oauth_parse_set_error(ctx, fmt, ...) appendPQExpBuffer((ctx)->errbuf, libpq_gettext(fmt), ##__VA_ARGS__) |
#define | CURL_IGNORE_DEPRECATION(x) x |
#define | HTTPS_SCHEME "https://" |
#define | OAUTH_GRANT_TYPE_DEVICE_CODE "urn:ietf:params:oauth:grant-type:device_code" |
Enumerations | |
enum | OAuthStep { OAUTH_STEP_INIT = 0 , OAUTH_STEP_DISCOVERY , OAUTH_STEP_DEVICE_AUTHORIZATION , OAUTH_STEP_TOKEN_REQUEST , OAUTH_STEP_WAIT_INTERVAL } |
Functions | |
static void | free_provider (struct provider *provider) |
static void | free_device_authz (struct device_authz *authz) |
static void | free_token_error (struct token_error *err) |
static void | free_token (struct token *tok) |
static void | free_async_ctx (PGconn *conn, struct async_ctx *actx) |
void | pg_fe_cleanup_oauth_flow (PGconn *conn) |
static void | report_type_mismatch (struct oauth_parse *ctx) |
static JsonParseErrorType | oauth_json_object_start (void *state) |
static JsonParseErrorType | oauth_json_object_field_start (void *state, char *name, bool isnull) |
static JsonParseErrorType | oauth_json_object_end (void *state) |
static JsonParseErrorType | oauth_json_array_start (void *state) |
static JsonParseErrorType | oauth_json_array_end (void *state) |
static JsonParseErrorType | oauth_json_scalar (void *state, char *token, JsonTokenType type) |
static bool | check_content_type (struct async_ctx *actx, const char *type) |
static bool | parse_oauth_json (struct async_ctx *actx, const struct json_field *fields) |
static bool | parse_provider (struct async_ctx *actx, struct provider *provider) |
static double | parse_json_number (const char *s) |
static int | parse_interval (struct async_ctx *actx, const char *interval_str) |
static int | parse_expires_in (struct async_ctx *actx, const char *expires_in_str) |
static bool | parse_device_authz (struct async_ctx *actx, struct device_authz *authz) |
static bool | parse_token_error (struct async_ctx *actx, struct token_error *err) |
static void | record_token_error (struct async_ctx *actx, const struct token_error *err) |
static bool | parse_access_token (struct async_ctx *actx, struct token *tok) |
static bool | setup_multiplexer (struct async_ctx *actx) |
static int | register_socket (CURL *curl, curl_socket_t socket, int what, void *ctx, void *socketp) |
static bool | set_timer (struct async_ctx *actx, long timeout) |
static int | timer_expired (struct async_ctx *actx) |
static int | register_timer (CURLM *curlm, long timeout, void *ctx) |
static int | debug_callback (CURL *handle, curl_infotype type, char *data, size_t size, void *clientp) |
static bool | setup_curl_handles (struct async_ctx *actx) |
static size_t | append_data (char *buf, size_t size, size_t nmemb, void *userdata) |
static bool | start_request (struct async_ctx *actx) |
static PostgresPollingStatusType | drive_request (struct async_ctx *actx) |
static void | append_urlencoded (PQExpBuffer buf, const char *s) |
static char * | urlencode (const char *s) |
static void | build_urlencoded (PQExpBuffer buf, const char *key, const char *value) |
static bool | start_discovery (struct async_ctx *actx, const char *discovery_uri) |
static bool | finish_discovery (struct async_ctx *actx) |
static bool | check_issuer (struct async_ctx *actx, PGconn *conn) |
static bool | check_for_device_flow (struct async_ctx *actx) |
static bool | add_client_identification (struct async_ctx *actx, PQExpBuffer reqbody, PGconn *conn) |
static bool | start_device_authz (struct async_ctx *actx, PGconn *conn) |
static bool | finish_device_authz (struct async_ctx *actx) |
static bool | start_token_request (struct async_ctx *actx, PGconn *conn) |
static bool | finish_token_request (struct async_ctx *actx, struct token *tok) |
static bool | handle_token_response (struct async_ctx *actx, char **token) |
static bool | prompt_user (struct async_ctx *actx, PGconn *conn) |
static bool | initialize_curl (PGconn *conn) |
static PostgresPollingStatusType | pg_fe_run_oauth_flow_impl (PGconn *conn) |
PostgresPollingStatusType | pg_fe_run_oauth_flow (PGconn *conn) |
#define actx_error | ( | ACTX, | |
FMT, | |||
... | |||
) | appendPQExpBuffer(&(ACTX)->errbuf, libpq_gettext(FMT), ##__VA_ARGS__) |
Definition at line 323 of file fe-auth-oauth-curl.c.
#define actx_error_str | ( | ACTX, | |
S | |||
) | appendPQExpBufferStr(&(ACTX)->errbuf, S) |
Definition at line 326 of file fe-auth-oauth-curl.c.
#define CHECK_GETINFO | ( | ACTX, | |
INFO, | |||
OUT, | |||
FAILACTION | |||
) |
Definition at line 356 of file fe-auth-oauth-curl.c.
#define CHECK_MSETOPT | ( | ACTX, | |
OPT, | |||
VAL, | |||
FAILACTION | |||
) |
Definition at line 334 of file fe-auth-oauth-curl.c.
#define CHECK_SETOPT | ( | ACTX, | |
OPT, | |||
VAL, | |||
FAILACTION | |||
) |
Definition at line 345 of file fe-auth-oauth-curl.c.
Definition at line 1779 of file fe-auth-oauth-curl.c.
#define HTTPS_SCHEME "https://" |
Definition at line 2083 of file fe-auth-oauth-curl.c.
#define MAX_OAUTH_RESPONSE_SIZE (256 * 1024) |
Definition at line 47 of file fe-auth-oauth-curl.c.
#define OAUTH_GRANT_TYPE_DEVICE_CODE "urn:ietf:params:oauth:grant-type:device_code" |
Definition at line 2084 of file fe-auth-oauth-curl.c.
#define oauth_parse_set_error | ( | ctx, | |
fmt, | |||
... | |||
) | appendPQExpBuffer((ctx)->errbuf, libpq_gettext(fmt), ##__VA_ARGS__) |
Definition at line 410 of file fe-auth-oauth-curl.c.
#define PG_OAUTH_OPTIONAL false |
Definition at line 398 of file fe-auth-oauth-curl.c.
#define PG_OAUTH_REQUIRED true |
Definition at line 397 of file fe-auth-oauth-curl.c.
enum OAuthStep |
Enumerator | |
---|---|
OAUTH_STEP_INIT | |
OAUTH_STEP_DISCOVERY | |
OAUTH_STEP_DEVICE_AUTHORIZATION | |
OAUTH_STEP_TOKEN_REQUEST | |
OAUTH_STEP_WAIT_INTERVAL |
Definition at line 164 of file fe-auth-oauth-curl.c.
|
static |
Definition at line 2151 of file fe-auth-oauth-curl.c.
References actx_error, build_urlencoded(), CHECK_SETOPT, cleanup(), conn, free, pg_conn::oauth_client_id, pg_conn::oauth_client_secret, password, success, urlencode(), async_ctx::used_basic_auth, and username.
Referenced by start_device_authz(), and start_token_request().
|
static |
Definition at line 1698 of file fe-auth-oauth-curl.c.
References actx_error, appendBinaryPQExpBuffer(), buf, PQExpBufferData::len, len, MAX_OAUTH_RESPONSE_SIZE, PQExpBufferBroken, and async_ctx::work_data.
Referenced by start_request().
|
static |
Definition at line 1887 of file fe-auth-oauth-curl.c.
References appendBinaryPQExpBuffer(), appendPQExpBufferChar(), appendPQExpBufferStr(), buf, and termPQExpBuffer().
Referenced by build_urlencoded(), and urlencode().
|
static |
Definition at line 1945 of file fe-auth-oauth-curl.c.
References append_urlencoded(), appendPQExpBufferChar(), buf, sort-test::key, and value.
Referenced by add_client_identification(), start_device_authz(), and start_token_request().
|
static |
Definition at line 698 of file fe-auth-oauth-curl.c.
References actx_error, Assert(), CHECK_GETINFO, i, pg_strncasecmp(), and type.
Referenced by parse_oauth_json().
|
static |
Definition at line 2092 of file fe-auth-oauth-curl.c.
References actx_error, Assert(), async_ctx::debugging, provider::device_authorization_endpoint, HTTPS_SCHEME, provider::issuer, pg_strncasecmp(), async_ctx::provider, and provider::token_endpoint.
Referenced by pg_fe_run_oauth_flow_impl().
Definition at line 2048 of file fe-auth-oauth-curl.c.
References actx_error, Assert(), conn, provider::issuer, pg_conn::oauth_issuer_id, and async_ctx::provider.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1482 of file fe-auth-oauth-curl.c.
References appendPQExpBuffer(), appendPQExpBufferChar(), buf, data, fprintf, i, initPQExpBuffer(), termPQExpBuffer(), and type.
Referenced by setup_curl_handles().
|
static |
Definition at line 1787 of file fe-auth-oauth-curl.c.
References actx_error, actx_error_str, CURL_IGNORE_DEPRECATION, async_ctx::curlm, err(), async_ctx::errbuf, PQExpBufferData::len, PGRES_POLLING_FAILED, PGRES_POLLING_OK, PGRES_POLLING_READING, and async_ctx::running.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 2262 of file fe-auth-oauth-curl.c.
References actx_error, async_ctx::authz, CHECK_GETINFO, err(), async_ctx::errctx, free_token_error(), parse_device_authz(), parse_token_error(), and record_token_error().
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1983 of file fe-auth-oauth-curl.c.
References actx_error, CHECK_GETINFO, async_ctx::errctx, provider::grant_types_supported, parse_provider(), and async_ctx::provider.
Referenced by pg_fe_run_oauth_flow_impl().
Definition at line 2351 of file fe-auth-oauth-curl.c.
References actx_error, CHECK_GETINFO, token::err, async_ctx::errctx, parse_access_token(), and parse_token_error().
Referenced by handle_token_response().
Definition at line 237 of file fe-auth-oauth-curl.c.
References async_ctx::authz, close, conn, async_ctx::curl, async_ctx::curlm, err(), async_ctx::errbuf, free, free_device_authz(), free_provider(), async_ctx::headers, libpq_append_conn_error(), async_ctx::mux, PGINVALID_SOCKET, async_ctx::provider, termPQExpBuffer(), async_ctx::timerfd, and async_ctx::work_data.
Referenced by pg_fe_cleanup_oauth_flow().
|
static |
Definition at line 101 of file fe-auth-oauth-curl.c.
References device_authz::device_code, device_authz::expires_in_str, free, device_authz::interval_str, device_authz::user_code, device_authz::verification_uri, and device_authz::verification_uri_complete.
Referenced by free_async_ctx().
|
static |
Definition at line 73 of file fe-auth-oauth-curl.c.
References provider::device_authorization_endpoint, free, provider::grant_types_supported, provider::issuer, and provider::token_endpoint.
Referenced by free_async_ctx().
|
static |
Definition at line 152 of file fe-auth-oauth-curl.c.
References token::access_token, token::err, free, free_token_error(), and token::token_type.
Referenced by handle_token_response().
|
static |
Definition at line 126 of file fe-auth-oauth-curl.c.
Referenced by finish_device_authz(), and free_token().
|
static |
Definition at line 2398 of file fe-auth-oauth-curl.c.
References token::access_token, actx_error, Assert(), async_ctx::authz, token::err, err(), token_error::error, finish_token_request(), free_token(), device_authz::interval, record_token_error(), and success.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 2503 of file fe-auth-oauth-curl.c.
References conn, libpq_append_conn_error(), PG_BOOL_NO, PG_BOOL_UNKNOWN, PG_BOOL_YES, pglock_thread, and pgunlock_thread.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 570 of file fe-auth-oauth-curl.c.
References oauth_parse::active, Assert(), JSON_SEM_ACTION_FAILED, JSON_SUCCESS, JSON_TOKEN_ARRAY_START, json_field::name, oauth_parse::nested, oauth_parse_set_error, and json_field::type.
Referenced by parse_oauth_json().
|
static |
Definition at line 544 of file fe-auth-oauth-curl.c.
References oauth_parse::active, JSON_SEM_ACTION_FAILED, JSON_SUCCESS, JSON_TOKEN_ARRAY_START, oauth_parse::nested, oauth_parse_set_error, report_type_mismatch(), and json_field::type.
Referenced by parse_oauth_json().
|
static |
Definition at line 521 of file fe-auth-oauth-curl.c.
References oauth_parse::active, Assert(), JSON_SEM_ACTION_FAILED, JSON_SUCCESS, json_field::name, oauth_parse::nested, and oauth_parse_set_error.
Referenced by parse_oauth_json().
|
static |
Definition at line 466 of file fe-auth-oauth-curl.c.
References oauth_parse::active, json_field::array, Assert(), oauth_parse::fields, JSON_SEM_ACTION_FAILED, JSON_SUCCESS, JSON_TOKEN_ARRAY_START, name, json_field::name, oauth_parse::nested, oauth_parse_set_error, json_field::scalar, json_field::target, and json_field::type.
Referenced by parse_oauth_json().
|
static |
Definition at line 447 of file fe-auth-oauth-curl.c.
References oauth_parse::active, JSON_SEM_ACTION_FAILED, JSON_SUCCESS, oauth_parse::nested, and report_type_mismatch().
Referenced by parse_oauth_json().
|
static |
Definition at line 598 of file fe-auth-oauth-curl.c.
References oauth_parse::active, json_field::array, Assert(), JSON_OUT_OF_MEMORY, JSON_SEM_ACTION_FAILED, JSON_SUCCESS, JSON_TOKEN_ARRAY_START, JSON_TOKEN_STRING, json_field::name, oauth_parse::nested, oauth_parse_set_error, report_type_mismatch(), json_field::scalar, json_field::target, type, and json_field::type.
Referenced by parse_oauth_json().
Definition at line 1069 of file fe-auth-oauth-curl.c.
References token::access_token, JSON_TOKEN_STRING, parse_oauth_json(), PG_OAUTH_REQUIRED, and token::token_type.
Referenced by finish_token_request().
|
static |
Definition at line 955 of file fe-auth-oauth-curl.c.
References Assert(), device_authz::device_code, device_authz::expires_in, device_authz::expires_in_str, device_authz::interval, device_authz::interval_str, JSON_TOKEN_NUMBER, JSON_TOKEN_STRING, parse_expires_in(), parse_interval(), parse_oauth_json(), PG_OAUTH_OPTIONAL, PG_OAUTH_REQUIRED, device_authz::user_code, device_authz::verification_uri, and device_authz::verification_uri_complete.
Referenced by finish_device_authz().
|
static |
Definition at line 936 of file fe-auth-oauth-curl.c.
References parse_json_number().
Referenced by parse_device_authz().
|
static |
Definition at line 910 of file fe-auth-oauth-curl.c.
References async_ctx::debugging, and parse_json_number().
Referenced by parse_device_authz().
|
static |
Definition at line 875 of file fe-auth-oauth-curl.c.
References Assert().
Referenced by parse_expires_in(), and parse_interval().
|
static |
Definition at line 757 of file fe-auth-oauth-curl.c.
References actx_error, actx_error_str, json_field::array, JsonSemAction::array_end, JsonSemAction::array_start, check_content_type(), cleanup(), PQExpBufferData::data, err(), async_ctx::errbuf, oauth_parse::errbuf, oauth_parse::fields, freeJsonLexContext(), json_errdetail(), JSON_SEM_ACTION_FAILED, JSON_SUCCESS, PQExpBufferData::len, makeJsonLexContextCstringLen(), json_field::name, oauth_json_array_end(), oauth_json_array_start(), oauth_json_object_end(), oauth_json_object_field_start(), oauth_json_object_start(), oauth_json_scalar(), JsonSemAction::object_end, JsonSemAction::object_field_start, JsonSemAction::object_start, pg_encoding_verifymbstr(), pg_parse_json(), PG_UTF8, json_field::required, JsonSemAction::scalar, json_field::scalar, sem, JsonSemAction::semstate, setJsonLexContextOwnsTokens(), success, json_field::target, and async_ctx::work_data.
Referenced by parse_access_token(), parse_device_authz(), parse_provider(), and parse_token_error().
Definition at line 844 of file fe-auth-oauth-curl.c.
References provider::device_authorization_endpoint, provider::grant_types_supported, provider::issuer, JSON_TOKEN_ARRAY_START, JSON_TOKEN_STRING, parse_oauth_json(), PG_OAUTH_OPTIONAL, PG_OAUTH_REQUIRED, and provider::token_endpoint.
Referenced by finish_discovery().
|
static |
Definition at line 1009 of file fe-auth-oauth-curl.c.
References err(), async_ctx::errctx, JSON_TOKEN_STRING, parse_oauth_json(), PG_OAUTH_OPTIONAL, and PG_OAUTH_REQUIRED.
Referenced by finish_device_authz(), and finish_token_request().
void pg_fe_cleanup_oauth_flow | ( | PGconn * | conn | ) |
Definition at line 304 of file fe-auth-oauth-curl.c.
References pg_conn::altsock, conn, free_async_ctx(), PGINVALID_SOCKET, and pg_conn::sasl_state.
Referenced by setup_token_request().
PostgresPollingStatusType pg_fe_run_oauth_flow | ( | PGconn * | conn | ) |
Definition at line 2850 of file fe-auth-oauth-curl.c.
References conn, pg_fe_run_oauth_flow_impl(), pq_block_sigpipe(), and pq_reset_sigpipe().
Referenced by setup_token_request().
|
static |
Definition at line 2612 of file fe-auth-oauth-curl.c.
References pg_conn::altsock, appendPQExpBuffer(), appendPQExpBufferStr(), async_ctx::authz, calloc, check_for_device_flow(), check_issuer(), conn, async_ctx::curl_err, PQExpBufferData::data, async_ctx::debugging, drive_request(), async_ctx::errbuf, async_ctx::errctx, pg_conn::errorMessage, finish_device_authz(), finish_discovery(), handle_token_response(), initialize_curl(), initPQExpBuffer(), device_authz::interval, PQExpBufferData::len, len, libpq_append_conn_error(), libpq_gettext, async_ctx::mux, pg_conn::oauth_discovery_uri, OAUTH_STEP_DEVICE_AUTHORIZATION, OAUTH_STEP_DISCOVERY, OAUTH_STEP_INIT, OAUTH_STEP_TOKEN_REQUEST, OAUTH_STEP_WAIT_INTERVAL, pg_conn::oauth_token, oauth_unsafe_debugging_enabled(), PGINVALID_SOCKET, PGRES_POLLING_FAILED, PGRES_POLLING_OK, PGRES_POLLING_READING, PQExpBufferDataBroken, prompt_user(), async_ctx::running, pg_conn::sasl_state, set_timer(), setup_curl_handles(), setup_multiplexer(), start_device_authz(), start_discovery(), start_token_request(), async_ctx::step, timer_expired(), async_ctx::timerfd, async_ctx::user_prompted, and async_ctx::work_data.
Referenced by pg_fe_run_oauth_flow().
Definition at line 2459 of file fe-auth-oauth-curl.c.
References actx_error, async_ctx::authz, conn, device_authz::expires_in, fprintf, libpq_gettext, PQAUTHDATA_PROMPT_OAUTH_DEVICE, PQauthDataHook, device_authz::user_code, _PGpromptOAuthDevice::user_code, device_authz::verification_uri, _PGpromptOAuthDevice::verification_uri, and device_authz::verification_uri_complete.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1037 of file fe-auth-oauth-curl.c.
References actx_error, actx_error_str, appendPQExpBuffer(), CHECK_GETINFO, err(), async_ctx::errbuf, and async_ctx::used_basic_auth.
Referenced by finish_device_authz(), and handle_token_response().
|
static |
Definition at line 1172 of file fe-auth-oauth-curl.c.
References actx_error, Assert(), i, lengthof, async_ctx::mux, and socket.
Referenced by setup_curl_handles().
|
static |
Definition at line 1458 of file fe-auth-oauth-curl.c.
References set_timer().
Referenced by setup_curl_handles().
|
static |
Definition at line 414 of file fe-auth-oauth-curl.c.
References oauth_parse::active, Assert(), JSON_TOKEN_ARRAY_START, JSON_TOKEN_NUMBER, JSON_TOKEN_STRING, json_field::name, oauth_parse_set_error, and json_field::type.
Referenced by oauth_json_array_start(), oauth_json_object_start(), and oauth_json_scalar().
|
static |
Definition at line 1331 of file fe-auth-oauth-curl.c.
References actx_error, async_ctx::mux, and async_ctx::timerfd.
Referenced by pg_fe_run_oauth_flow_impl(), and register_timer().
|
static |
Definition at line 1565 of file fe-auth-oauth-curl.c.
References actx_error, CHECK_MSETOPT, CHECK_SETOPT, async_ctx::curl, async_ctx::curl_err, async_ctx::curlm, debug_callback(), async_ctx::debugging, async_ctx::headers, register_socket(), and register_timer().
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1111 of file fe-auth-oauth-curl.c.
References actx_error, async_ctx::mux, and async_ctx::timerfd.
Referenced by pg_fe_run_oauth_flow_impl().
Definition at line 2232 of file fe-auth-oauth-curl.c.
References actx_error, add_client_identification(), Assert(), build_urlencoded(), CHECK_SETOPT, conn, PQExpBufferData::data, provider::device_authorization_endpoint, pg_conn::oauth_client_id, pg_conn::oauth_scope, PQExpBufferBroken, async_ctx::provider, resetPQExpBuffer(), start_request(), and async_ctx::work_data.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1974 of file fe-auth-oauth-curl.c.
References CHECK_SETOPT, and start_request().
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1738 of file fe-auth-oauth-curl.c.
References actx_error, append_data(), CHECK_SETOPT, async_ctx::curl, async_ctx::curlm, err(), resetPQExpBuffer(), async_ctx::running, and async_ctx::work_data.
Referenced by start_device_authz(), start_discovery(), and start_token_request().
Definition at line 2319 of file fe-auth-oauth-curl.c.
References actx_error, add_client_identification(), Assert(), async_ctx::authz, build_urlencoded(), CHECK_SETOPT, conn, PQExpBufferData::data, device_authz::device_code, pg_conn::oauth_client_id, OAUTH_GRANT_TYPE_DEVICE_CODE, PQExpBufferBroken, async_ctx::provider, resetPQExpBuffer(), start_request(), provider::token_endpoint, and async_ctx::work_data.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1412 of file fe-auth-oauth-curl.c.
References actx_error, Assert(), PQsocketPoll(), and async_ctx::timerfd.
Referenced by pg_fe_run_oauth_flow_impl().
|
static |
Definition at line 1930 of file fe-auth-oauth-curl.c.
References append_urlencoded(), buf, initPQExpBuffer(), and PQExpBufferDataBroken.
Referenced by add_client_identification().