Diff

core/configmanager.lua @ 13746:3d58ea9c5356

Merge 13.0->trunk
author Kim Alvefur <zash@zash.se>
date Sat, 22 Feb 2025 00:26:35 +0100
parent 13745:994ea8d54b72
child 13840:1b4f2d010141
line wrap: on
line diff
--- a/core/configmanager.lua	Mon Feb 17 23:06:26 2025 +0000
+++ b/core/configmanager.lua	Sat Feb 22 00:26:35 2025 +0100
@@ -34,8 +34,9 @@
 
 local config_mt = { __index = function (t, _) return rawget(t, "*"); end};
 local config = setmetatable({ ["*"] = { } }, config_mt);
-local delayed_warnings = {};
 local files = {};
+local credentials_directory = nil;
+local credential_fallback_fatal = true;
 
 -- When host not found, use global
 local host_mt = { __index = function(_, k) return config["*"][k] end }
@@ -45,11 +46,12 @@
 end
 
 function _M.get(host, key)
-	if host and key and delayed_warnings[host.."/"..key] then
-		local warning = delayed_warnings[host.."/"..key];
-		log("warn", "%s", warning.text);
+	local v = config[host][key];
+	if v and errors.is_error(v) then
+		log("warn", "%s:%d: %s", v.context.filename, v.context.fileline, v.text);
+		return nil;
 	end
-	return config[host][key];
+	return v;
 end
 function _M.rawget(host, key)
 	local hostconfig = rawget(config, host);
@@ -250,10 +252,6 @@
 						t_insert(warnings, ("%s:%d: Duplicate option '%s'"):format(config_file, get_line_number(config_file), k));
 					end
 					set_options[option_path] = true;
-					if errors.is_error(v) then
-						delayed_warnings[option_path] = v;
-						return;
-					end
 					set(config_table, env.__currenthost or "*", k, v);
 				end
 		});
@@ -371,19 +369,17 @@
 		env.FileLine = filereader(config_path, "*l");
 		env.FileLines = linereader(config_path);
 
-		if _G.prosody.paths.credentials then
-			env.Credential = filereader(_G.prosody.paths.credentials, "*a");
-		elseif _G.prosody.process_type == "prosody" then
+		if credentials_directory then
+			env.Credential = filereader(credentials_directory, "*a");
+		elseif credential_fallback_fatal then
 			env.Credential = function() error("Credential() requires the $CREDENTIALS_DIRECTORY environment variable to be set", 2) end
 		else
 			env.Credential = function()
 				return errors.new({
-						type = "continue",
-						text = ("%s:%d: Credential() requires the $CREDENTIALS_DIRECTORY environment variable to be set")
-							:format(config_file, get_line_number(config_file));
-					});
+						type = "continue";
+						text = "Credential() requires the $CREDENTIALS_DIRECTORY environment variable to be set";
+					}, { filename = config_file; fileline = get_line_number(config_file) });
 			end
-
 		end
 
 		local chunk, err = envload(data, "@"..config_file, env);
@@ -405,4 +401,12 @@
 
 end
 
+function _M.set_credentials_directory(directory)
+	credentials_directory = directory;
+end
+
+function _M.set_credential_fallback_mode(mode)
+	credential_fallback_fatal = mode == "error";
+end
+
 return _M;