@@ -8012,7 +8012,7 @@ void moduleUnregisterAuthCBs(ValkeyModule *module) {
80128012
80138013/* Search for & attempt next module auth callback after skipping the ones already attempted.
80148014 * Returns the result of the module auth callback. */
8015- int attemptNextAuthCb(client *c, robj *username, robj *password, robj **err) {
8015+ static int attemptNextAuthCb(client *c, robj *username, robj *password, robj **err) {
80168016 int handle_next_callback = (!c->module_data || c->module_data->module_auth_ctx == NULL);
80178017 ValkeyModuleAuthCtx *cur_auth_ctx = NULL;
80188018 listNode *ln;
@@ -8047,7 +8047,7 @@ int attemptNextAuthCb(client *c, robj *username, robj *password, robj **err) {
80478047 * auth operation.
80488048 * Otherwise, we attempt the auth reply callback & the free priv data callback, update fields and
80498049 * return the result of the reply callback. */
8050- int attemptBlockedAuthReplyCallback(client *c, robj *username, robj *password, robj **err) {
8050+ static int attemptBlockedAuthReplyCallback(client *c, robj *username, robj *password, robj **err) {
80518051 int result = VALKEYMODULE_AUTH_NOT_HANDLED;
80528052 if (!c->module_data || !c->module_data->module_blocked_client) return result;
80538053 ValkeyModuleBlockedClient *bc = (ValkeyModuleBlockedClient *)c->module_data->module_blocked_client;
@@ -8091,17 +8091,44 @@ int checkModuleAuthentication(client *c, robj *username, robj *password, robj **
80918091 serverAssert(result == VALKEYMODULE_AUTH_HANDLED);
80928092 return AUTH_BLOCKED;
80938093 }
8094+
8095+ ValkeyModuleAuthCtx *auth_ctx = c->module_data ? c->module_data->module_auth_ctx : NULL;
8096+
80948097 if (c->module_data) c->module_data->module_auth_ctx = NULL;
80958098 if (result == VALKEYMODULE_AUTH_NOT_HANDLED) {
80968099 c->flag.module_auth_has_result = 0;
80978100 return AUTH_NOT_HANDLED;
80988101 }
80998102
8103+ int auth_result = AUTH_ERR;
8104+
81008105 if (c->flag.module_auth_has_result) {
81018106 c->flag.module_auth_has_result = 0;
8102- if (c->flag.authenticated) return AUTH_OK;
8107+ if (c->flag.authenticated) {
8108+ auth_result = AUTH_OK;
8109+ }
81038110 }
8104- return AUTH_ERR;
8111+
8112+ const char *module_name = auth_ctx ? auth_ctx->module->name : NULL;
8113+ moduleFireAuthenticationEvent(c->id,
8114+ username->ptr,
8115+ module_name,
8116+ auth_result == AUTH_OK);
8117+
8118+ return auth_result;
8119+ }
8120+
8121+ void moduleFireAuthenticationEvent(uint64_t client_id,
8122+ const char *username,
8123+ const char *module_name,
8124+ int is_granted) {
8125+ ValkeyModuleAuthenticationInfo info = VALKEYMODULE_AUTHENTICATIONINFO_INITIALIZER_V1;
8126+ info.client_id = client_id;
8127+ info.username = username;
8128+ info.module_name = module_name;
8129+ info.result = is_granted ? VALKEYMODULE_AUTH_RESULT_GRANTED
8130+ : VALKEYMODULE_AUTH_RESULT_DENIED;
8131+ moduleFireServerEvent(VALKEYMODULE_EVENT_AUTHENTICATION_ATTEMPT, 0, &info);
81058132}
81068133
81078134/* This function is called from module.c in order to check if a module
@@ -11480,24 +11507,25 @@ void ModuleForkDoneHandler(int exitcode, int bysignal) {
1148011507 * a data structure associated with it. We use MAX_UINT64 on purpose,
1148111508 * in order to pass the check in ValkeyModule_SubscribeToServerEvent. */
1148211509static uint64_t moduleEventVersions[] = {
11483- VALKEYMODULE_REPLICATIONINFO_VERSION, /* VALKEYMODULE_EVENT_REPLICATION_ROLE_CHANGED */
11484- -1, /* VALKEYMODULE_EVENT_PERSISTENCE */
11485- VALKEYMODULE_FLUSHINFO_VERSION, /* VALKEYMODULE_EVENT_FLUSHDB */
11486- -1, /* VALKEYMODULE_EVENT_LOADING */
11487- VALKEYMODULE_CLIENTINFO_VERSION, /* VALKEYMODULE_EVENT_CLIENT_CHANGE */
11488- -1, /* VALKEYMODULE_EVENT_SHUTDOWN */
11489- -1, /* VALKEYMODULE_EVENT_REPLICA_CHANGE */
11490- -1, /* VALKEYMODULE_EVENT_PRIMARY_LINK_CHANGE */
11491- VALKEYMODULE_CRON_LOOP_VERSION, /* VALKEYMODULE_EVENT_CRON_LOOP */
11492- VALKEYMODULE_MODULE_CHANGE_VERSION, /* VALKEYMODULE_EVENT_MODULE_CHANGE */
11493- VALKEYMODULE_LOADING_PROGRESS_VERSION, /* VALKEYMODULE_EVENT_LOADING_PROGRESS */
11494- VALKEYMODULE_SWAPDBINFO_VERSION, /* VALKEYMODULE_EVENT_SWAPDB */
11495- -1, /* VALKEYMODULE_EVENT_REPL_BACKUP */
11496- -1, /* VALKEYMODULE_EVENT_FORK_CHILD */
11497- -1, /* VALKEYMODULE_EVENT_REPL_ASYNC_LOAD */
11498- -1, /* VALKEYMODULE_EVENT_EVENTLOOP */
11499- -1, /* VALKEYMODULE_EVENT_CONFIG */
11500- VALKEYMODULE_KEYINFO_VERSION, /* VALKEYMODULE_EVENT_KEY */
11510+ VALKEYMODULE_REPLICATIONINFO_VERSION, /* VALKEYMODULE_EVENT_REPLICATION_ROLE_CHANGED */
11511+ -1, /* VALKEYMODULE_EVENT_PERSISTENCE */
11512+ VALKEYMODULE_FLUSHINFO_VERSION, /* VALKEYMODULE_EVENT_FLUSHDB */
11513+ -1, /* VALKEYMODULE_EVENT_LOADING */
11514+ VALKEYMODULE_CLIENTINFO_VERSION, /* VALKEYMODULE_EVENT_CLIENT_CHANGE */
11515+ -1, /* VALKEYMODULE_EVENT_SHUTDOWN */
11516+ -1, /* VALKEYMODULE_EVENT_REPLICA_CHANGE */
11517+ -1, /* VALKEYMODULE_EVENT_PRIMARY_LINK_CHANGE */
11518+ VALKEYMODULE_CRON_LOOP_VERSION, /* VALKEYMODULE_EVENT_CRON_LOOP */
11519+ VALKEYMODULE_MODULE_CHANGE_VERSION, /* VALKEYMODULE_EVENT_MODULE_CHANGE */
11520+ VALKEYMODULE_LOADING_PROGRESS_VERSION, /* VALKEYMODULE_EVENT_LOADING_PROGRESS */
11521+ VALKEYMODULE_SWAPDBINFO_VERSION, /* VALKEYMODULE_EVENT_SWAPDB */
11522+ -1, /* VALKEYMODULE_EVENT_REPL_BACKUP */
11523+ -1, /* VALKEYMODULE_EVENT_FORK_CHILD */
11524+ -1, /* VALKEYMODULE_EVENT_REPL_ASYNC_LOAD */
11525+ -1, /* VALKEYMODULE_EVENT_EVENTLOOP */
11526+ -1, /* VALKEYMODULE_EVENT_CONFIG */
11527+ VALKEYMODULE_KEYINFO_VERSION, /* VALKEYMODULE_EVENT_KEY */
11528+ VALKEYMODULE_AUTHENTICATION_INFO_VERSION, /* VALKEYMODULE_EVENT_AUTHENTICATION_ATTEMPT */
1150111529};
1150211530
1150311531/* Register to be notified, via a callback, when the specified server event
@@ -11758,7 +11786,7 @@ static uint64_t moduleEventVersions[] = {
1175811786 * * `VALKEYMODULE_SUBEVENT_EVENTLOOP_BEFORE_SLEEP`
1175911787 * * `VALKEYMODULE_SUBEVENT_EVENTLOOP_AFTER_SLEEP`
1176011788 *
11761- * * ValkeyModule_Event_Config
11789+ * * ValkeyModuleEvent_Config
1176211790 *
1176311791 * Called when a configuration event happens
1176411792 * The following sub events are available:
@@ -11772,7 +11800,7 @@ static uint64_t moduleEventVersions[] = {
1177211800 * // name of each modified configuration item
1177311801 * uint32_t num_changes; // The number of elements in the config_names array
1177411802 *
11775- * * ValkeyModule_Event_Key
11803+ * * ValkeyModuleEvent_Key
1177611804 *
1177711805 * Called when a key is removed from the keyspace. We can't modify any key in
1177811806 * the event.
@@ -11788,6 +11816,22 @@ static uint64_t moduleEventVersions[] = {
1178811816 *
1178911817 * ValkeyModuleKey *key; // Key name
1179011818 *
11819+ * * ValkeyModuleEvent_AuthenticationAttempt
11820+ *
11821+ * Called when an authentication attempt is made, either successful or not.
11822+ *
11823+ * The data pointer can be casted to a ValkeyModuleAuthenticationInfo
11824+ * structure with the following fields:
11825+ *
11826+ * uint64_t client_id; // Client ID.
11827+ * const char *username; // Username used for authentication.
11828+ * const char *module_name; // Name of the module that is handling the
11829+ * // authentication. It is NULL if the
11830+ * // authentication is handled by the core.
11831+ * ValkeyModuleAuthenticationResult result; // Result of the authentication:
11832+ * // VALKEYMODULE_AUTH_RESULT_GRANTED or
11833+ * // VALKEYMODULE_AUTH_RESULT_DENIED
11834+ *
1179111835 * The function returns VALKEYMODULE_OK if the module was successfully subscribed
1179211836 * for the specified event. If the API is called from a wrong context or unsupported event
1179311837 * is given then VALKEYMODULE_ERR is returned. */
@@ -11937,6 +11981,8 @@ void moduleFireServerEvent(uint64_t eid, int subid, void *data) {
1193711981 selectDb(ctx.client, info->dbnum);
1193811982 moduleInitKey(&key, &ctx, info->key, info->value, info->mode);
1193911983 moduledata = &ki;
11984+ } else if (eid == VALKEYMODULE_EVENT_AUTHENTICATION_ATTEMPT) {
11985+ moduledata = data;
1194011986 }
1194111987
1194211988 el->module->in_hook++;
0 commit comments