mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +03:00
libpq: Trace frontend authentication challenges
If tracing was enabled during connection startup, these messages would previously be listed in the trace output as something like this: F 54 Unknown message: 70 mismatched message length: consumed 4, expected 54 With this commit their type and contents are now correctly listed: F 36 StartupMessage 3 0 "user" "foo" "database" "alvherre" F 54 SASLInitialResponse "SCRAM-SHA-256" 32 'n,,n=,r=nq5zEPR/VREHEpOAZzH8Rujm' F 108 SASLResponse 'c=biws,r=nq5zEPR/VREHEpOAZzH8RujmVtWZDQ8glcrvy9OMNw7ZqFUn,p=BBwAKe0WjSvigB6RsmmArAC+hwucLeuwJrR5C/HQD5M=' Author: Jelte Fennema-Nio <postgres@jeltef.nl> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/CAGECzQSoPHtZ4xe0raJ6FYSEiPPS+YWXBhOGo+Y1YecLgknF3g@mail.gmail.com
This commit is contained in:
@@ -354,6 +354,42 @@ pqTraceOutput_CopyFail(FILE *f, const char *message, int *cursor)
|
||||
pqTraceOutputString(f, message, cursor, false);
|
||||
}
|
||||
|
||||
static void
|
||||
pqTraceOutput_GSSResponse(FILE *f, const char *message, int *cursor,
|
||||
int length, bool regress)
|
||||
{
|
||||
fprintf(f, "GSSResponse\t");
|
||||
pqTraceOutputNchar(f, length - *cursor + 1, message, cursor, regress);
|
||||
}
|
||||
|
||||
static void
|
||||
pqTraceOutput_PasswordMessage(FILE *f, const char *message, int *cursor)
|
||||
{
|
||||
fprintf(f, "PasswordMessage\t");
|
||||
pqTraceOutputString(f, message, cursor, false);
|
||||
}
|
||||
|
||||
static void
|
||||
pqTraceOutput_SASLInitialResponse(FILE *f, const char *message, int *cursor,
|
||||
bool regress)
|
||||
{
|
||||
int initialResponse;
|
||||
|
||||
fprintf(f, "SASLInitialResponse\t");
|
||||
pqTraceOutputString(f, message, cursor, false);
|
||||
initialResponse = pqTraceOutputInt32(f, message, cursor, false);
|
||||
if (initialResponse != -1)
|
||||
pqTraceOutputNchar(f, initialResponse, message, cursor, regress);
|
||||
}
|
||||
|
||||
static void
|
||||
pqTraceOutput_SASLResponse(FILE *f, const char *message, int *cursor,
|
||||
int length, bool regress)
|
||||
{
|
||||
fprintf(f, "SASLResponse\t");
|
||||
pqTraceOutputNchar(f, length - *cursor + 1, message, cursor, regress);
|
||||
}
|
||||
|
||||
static void
|
||||
pqTraceOutput_FunctionCall(FILE *f, const char *message, int *cursor, bool regress)
|
||||
{
|
||||
@@ -610,6 +646,39 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer)
|
||||
case PqMsg_CopyFail:
|
||||
pqTraceOutput_CopyFail(conn->Pfdebug, message, &logCursor);
|
||||
break;
|
||||
case PqMsg_GSSResponse:
|
||||
Assert(PqMsg_GSSResponse == PqMsg_PasswordMessage);
|
||||
Assert(PqMsg_GSSResponse == PqMsg_SASLInitialResponse);
|
||||
Assert(PqMsg_GSSResponse == PqMsg_SASLResponse);
|
||||
|
||||
/*
|
||||
* These messages share a common type byte, so we discriminate by
|
||||
* having the code store the auth type separately.
|
||||
*/
|
||||
switch (conn->current_auth_response)
|
||||
{
|
||||
case AUTH_RESPONSE_GSS:
|
||||
pqTraceOutput_GSSResponse(conn->Pfdebug, message,
|
||||
&logCursor, length, regress);
|
||||
break;
|
||||
case AUTH_RESPONSE_PASSWORD:
|
||||
pqTraceOutput_PasswordMessage(conn->Pfdebug, message,
|
||||
&logCursor);
|
||||
break;
|
||||
case AUTH_RESPONSE_SASL_INITIAL:
|
||||
pqTraceOutput_SASLInitialResponse(conn->Pfdebug, message,
|
||||
&logCursor, regress);
|
||||
break;
|
||||
case AUTH_RESPONSE_SASL:
|
||||
pqTraceOutput_SASLResponse(conn->Pfdebug, message,
|
||||
&logCursor, length, regress);
|
||||
break;
|
||||
default:
|
||||
fprintf(conn->Pfdebug, "UnknownAuthenticationResponse");
|
||||
break;
|
||||
}
|
||||
conn->current_auth_response = '\0';
|
||||
break;
|
||||
case PqMsg_FunctionCall:
|
||||
pqTraceOutput_FunctionCall(conn->Pfdebug, message, &logCursor, regress);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user