diff --git a/modules/modpython/znc.py b/modules/modpython/znc.py index feb98fda..5f0784f3 100644 --- a/modules/modpython/znc.py +++ b/modules/modpython/znc.py @@ -768,6 +768,11 @@ def find_open(modname): module = importlib.import_module(fullname) except ImportError: return (None, None) + if not isinstance(module.__loader__, ZNCModuleLoader): + # If modname/ is a directory, it was "loaded" using _NamespaceLoader. + # This is the case for e.g. modperl. + # https://github.com/znc/znc/issues/1757 + return (None, None) return (module, os.path.join(module.__loader__._datadir, modname)) def load_module(modname, args, module_type, user, network, retmsg, modpython): diff --git a/test/integration/tests/scripting.cpp b/test/integration/tests/scripting.cpp index e4dcfc8e..d269b1d7 100644 --- a/test/integration/tests/scripting.cpp +++ b/test/integration/tests/scripting.cpp @@ -279,5 +279,22 @@ TEST_F(ZNCTest, ModpythonPackage) { client.ReadUntil("value = b"); } +TEST_F(ZNCTest, ModpythonModperl) { + if (QProcessEnvironment::systemEnvironment().value( + "DISABLED_ZNC_PERL_PYTHON_TEST") == "1") { + return; + } + auto znc = Run(); + znc->CanLeak(); + + auto ircd = ConnectIRCd(); + auto client = LoginClient(); + // https://github.com/znc/znc/issues/1757 + client.Write("znc loadmod modpython"); + client.ReadUntil("Loaded module modpython"); + client.Write("znc loadmod modperl"); + client.ReadUntil("Loaded module modperl"); +} + } // namespace } // namespace znc_inttest