libpq: Handle asynchronous actions during SASL This adds the ability for a SASL mechanism to signal PQconnectPoll() that some arbitrary work, external to the Postgres connection, is required for authentication to continue. There is no consumer for this capability as part of this commit, it is infrastructure which is required for future work on supporting the OAUTHBEARER mechanism.
To ensure that threads are not blocked waiting for the SASL mechanism to make long-running calls, the mechanism communicates with the top- level client via the "altsock": a file or socket descriptor, opaque to this layer of libpq, which is signaled when work is ready to be done again. The altsock temporarily replaces the regular connection descriptor, so existing PQsocket() clients should continue to operate correctly using their existing polling implementations. For a mechanism to use this it should set an authentication callback, conn->async_auth(), and a cleanup callback, conn->cleanup_async_auth(), and return SASL_ASYNC during the exchange. It should then assign conn->altsock during the first call to async_auth(). When the cleanup callback is called, either because authentication has succeeded or because the connection is being dropped, the altsock must be released and disconnected from the PGconn object. This was extracted from the larger OAUTHBEARER patchset which has been developed, and reviewed by many, over several years and it is thus likely that some reviewer credit of much earlier versions has been accidentally omitted. Author: Jacob Champion <jacob.champ...@enterprisedb.com> Reviewed-by: Daniel Gustafsson <dan...@yesql.se> Reviewed-by: Peter Eisentraut <pe...@eisentraut.org> Reviewed-by: Antonin Houska <a...@cybertec.at> Discussion: https://postgr.es/m/CAOYmi+kJqzo6XsR9TEhvVfeVNQ-TyFM5LATypm9yoQVYk=4...@mail.gmail.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/a99a32e43ed72bd4fdb0950d2359fa4aa50fab76 Modified Files -------------- src/interfaces/libpq/fe-auth-sasl.h | 11 +++- src/interfaces/libpq/fe-auth-scram.c | 6 +- src/interfaces/libpq/fe-auth.c | 120 ++++++++++++++++++++++++++--------- src/interfaces/libpq/fe-auth.h | 3 +- src/interfaces/libpq/fe-connect.c | 93 ++++++++++++++++++++++++++- src/interfaces/libpq/fe-misc.c | 35 ++++++---- src/interfaces/libpq/libpq-fe.h | 2 + src/interfaces/libpq/libpq-int.h | 6 ++ 8 files changed, 227 insertions(+), 49 deletions(-)