diff options
author | Robert Haas | 2010-11-27 12:22:25 +0000 |
---|---|---|
committer | Robert Haas | 2010-11-27 12:22:25 +0000 |
commit | fe7a32fc87e68edf014ee7e575f92cb027437ff4 (patch) | |
tree | d34e99fbe418f48072b2f2668148c4dddcecff6e /contrib/auth_delay/auth_delay.c | |
parent | d53c1255d9730b07d56166ace1191250ca76f496 (diff) |
New contrib module, auth_delay.
KaiGai Kohei, with a few changes by me.
Diffstat (limited to 'contrib/auth_delay/auth_delay.c')
-rw-r--r-- | contrib/auth_delay/auth_delay.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/contrib/auth_delay/auth_delay.c b/contrib/auth_delay/auth_delay.c new file mode 100644 index 00000000000..09191bd250e --- /dev/null +++ b/contrib/auth_delay/auth_delay.c @@ -0,0 +1,70 @@ +/* ------------------------------------------------------------------------- + * + * auth_delay.c + * + * Copyright (C) 2010, PostgreSQL Global Development Group + * + * IDENTIFICATION + * contrib/auth_delay/auth_delay.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "libpq/auth.h" +#include "port.h" +#include "utils/guc.h" +#include "utils/timestamp.h" + +PG_MODULE_MAGIC; + +void _PG_init(void); + +/* GUC Variables */ +static int auth_delay_milliseconds; + +/* Original Hook */ +static ClientAuthentication_hook_type original_client_auth_hook = NULL; + +/* + * Check authentication + */ +static void +auth_delay_checks(Port *port, int status) +{ + /* + * Any other plugins which use ClientAuthentication_hook. + */ + if (original_client_auth_hook) + original_client_auth_hook(port, status); + + /* + * Inject a short delay if authentication failed. + */ + if (status != STATUS_OK) + { + pg_usleep(1000L * auth_delay_milliseconds); + } +} + +/* + * Module Load Callback + */ +void +_PG_init(void) +{ + /* Define custome GUC variables */ + DefineCustomIntVariable("auth_delay.milliseconds", + "Milliseconds to delay before reporting authentication failure", + NULL, + &auth_delay_milliseconds, + 0, + 0, INT_MAX, + PGC_SIGHUP, + GUC_UNIT_MS, + NULL, + NULL); + /* Install Hooks */ + original_client_auth_hook = ClientAuthentication_hook; + ClientAuthentication_hook = auth_delay_checks; +} |