diff --git a/pkgs/by-name/mcaptcha/1001-libmcaptcha-Allow-redis-module-to-not-be-first-in-list.patch b/pkgs/by-name/mcaptcha/1001-libmcaptcha-Allow-redis-module-to-not-be-first-in-list.patch new file mode 100644 index 000000000..59df2f26d --- /dev/null +++ b/pkgs/by-name/mcaptcha/1001-libmcaptcha-Allow-redis-module-to-not-be-first-in-list.patch @@ -0,0 +1,34 @@ +From d3d782d7ffa0dfd15e7c872b46d3e1ead7e8dda1 Mon Sep 17 00:00:00 2001 +From: OPNA2608 +Date: Mon, 28 Jul 2025 21:38:28 +0200 +Subject: [PATCH] src/redis/mcaptcha_redis: Allow redis module to not be first + in list + +--- + src/redis/mcaptcha_redis.rs | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/src/redis/mcaptcha_redis.rs b/src/redis/mcaptcha_redis.rs +index 63eacd3..9d2adac 100644 +--- a/src/redis/mcaptcha_redis.rs ++++ b/src/redis/mcaptcha_redis.rs +@@ -70,13 +70,9 @@ impl MCaptchaRedis { + impl MCaptchaRedisConnection { + async fn is_module_loaded(&self) -> CaptchaResult<()> { + if let Value::Bulk(s) = self.0.exec(redis::cmd("MODULE").arg("LIST")).await.unwrap() { +- if let Some(Value::Bulk(s)) = s.first() { +- match s.iter().find(|i| format!("{:?}", i).contains(MODULE_NAME)) { +- Some(_) => (), +- None => return Err(CaptchaError::MCaptchaRedisModuleIsNotLoaded), +- } +- } else { +- return Err(CaptchaError::MCaptchaRedisModuleIsNotLoaded); ++ match s.iter().find(|i| format!("{:?}", i).contains(MODULE_NAME)) { ++ Some(_) => (), ++ None => return Err(CaptchaError::MCaptchaRedisModuleIsNotLoaded), + } + } + +-- +2.50.0 + diff --git a/pkgs/by-name/mcaptcha/package.nix b/pkgs/by-name/mcaptcha/package.nix index 745211235..d2332f74b 100644 --- a/pkgs/by-name/mcaptcha/package.nix +++ b/pkgs/by-name/mcaptcha/package.nix @@ -192,4 +192,19 @@ let }; }; in -mcaptcha +# Temporary fix: libmcaptcha crashes when redis doesn't reply to a module listing request with the mcaptcha module as +# the first entry +# Until this is addressed upstream and has found its way into the version of libmcaptcha used in mcaptcha, add our patch +mcaptcha.overrideAttrs (oa: { + cargoDeps = oa.cargoDeps.overrideAttrs (oa2: { + buildCommand = oa2.buildCommand + '' + realdir="$(realpath $out/libmcaptcha-0.2.4)" + rm "$out/libmcaptcha-0.2.4" + cp -r --no-preserve=mode "$realdir" "$out/libmcaptcha-0.2.4" + + pushd "$out/libmcaptcha-0.2.4" + patch -p1 < ${./1001-libmcaptcha-Allow-redis-module-to-not-be-first-in-list.patch} + popd + ''; + }); +}) diff --git a/projects/mCaptcha/services/mcaptcha/module.nix b/projects/mCaptcha/services/mcaptcha/module.nix index f45492dc9..85d65ab33 100644 --- a/projects/mCaptcha/services/mcaptcha/module.nix +++ b/projects/mCaptcha/services/mcaptcha/module.nix @@ -242,9 +242,11 @@ in systemd.services.mcaptcha.environment.MCAPTCHA_CONFIG = builtins.toString configFile; systemd.services.mcaptcha.after = [ + "network-online.target" "syslog.target" ] - ++ lib.optionals cfg.database.createLocally [ "postgresql.service" ]; + ++ lib.optionals cfg.database.createLocally [ "postgresql.target" ] + ++ lib.optionals cfg.redis.createLocally [ "redis-mcaptcha.service" ]; systemd.services.mcaptcha.bindsTo = lib.optionals cfg.database.createLocally [ "postgresql.service" ]; diff --git a/projects/mCaptcha/services/mcaptcha/tests/bring-your-own-services.nix b/projects/mCaptcha/services/mcaptcha/tests/bring-your-own-services.nix index cc135b7e9..e8ae64bc2 100644 --- a/projects/mCaptcha/services/mcaptcha/tests/bring-your-own-services.nix +++ b/projects/mCaptcha/services/mcaptcha/tests/bring-your-own-services.nix @@ -60,8 +60,8 @@ in psql my_mcaptcha -c "ALTER USER my_mcaptcha WITH PASSWORD 'mcaptcha-db-secret'" ''; services.postgresql.authentication = '' - #type database DBuser auth-method - host all all 0.0.0.0/0 md5 + #type database DBuser host auth-method + host all all all md5 ''; services.redis.servers.mcaptcha.enable = true; services.redis.servers.mcaptcha.port = 6379; @@ -80,7 +80,9 @@ in my_own_services.start() my_own_services.wait_for_unit("redis-mcaptcha.service") - my_own_services.wait_for_unit("postgresql.service") + # Waiting for postgresql in multiple steps to avoid timeouts under load + my_own_services.wait_for_unit("postgresql.service") # startup + my_own_services.wait_for_unit("postgresql.target") # initial setup finished mcaptcha.start()