<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://olddev.minetest.org/index.php?action=history&amp;feed=atom&amp;title=Minetest.register_authentication_handler</id>
	<title>Minetest.register authentication handler - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://olddev.minetest.org/index.php?action=history&amp;feed=atom&amp;title=Minetest.register_authentication_handler"/>
	<link rel="alternate" type="text/html" href="https://olddev.minetest.org/index.php?title=Minetest.register_authentication_handler&amp;action=history"/>
	<updated>2026-04-15T08:20:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.7</generator>
	<entry>
		<id>https://olddev.minetest.org/index.php?title=Minetest.register_authentication_handler&amp;diff=238&amp;oldid=prev</id>
		<title>&gt;ROllerozxa at 13:56, 25 October 2022</title>
		<link rel="alternate" type="text/html" href="https://olddev.minetest.org/index.php?title=Minetest.register_authentication_handler&amp;diff=238&amp;oldid=prev"/>
		<updated>2022-10-25T13:56:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{UnofficialLua}}&lt;br /&gt;
{{DISPLAYTITLE:minetest.register_authentication_handler}}&lt;br /&gt;
&lt;br /&gt;
Registers a custom authentication handler. See this for an example authentication handler:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
local function read_auth_file()&lt;br /&gt;
	local newtable = {}&lt;br /&gt;
	local file, errmsg = io.open(minetest.auth_file_path, 'rb')&lt;br /&gt;
	if not file then&lt;br /&gt;
		minetest.log(&amp;quot;info&amp;quot;, minetest.auth_file_path..&amp;quot; could not be opened for reading (&amp;quot;..errmsg..&amp;quot;); assuming new world&amp;quot;)&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	for line in file:lines() do&lt;br /&gt;
		if line ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			local name, password, privilegestring = string.match(line, &amp;quot;([^:]*):([^:]*):([^:]*)&amp;quot;)&lt;br /&gt;
			if not name or not password or not privilegestring then&lt;br /&gt;
				error(&amp;quot;Invalid line in auth.txt: &amp;quot;..dump(line))&lt;br /&gt;
			end&lt;br /&gt;
			local privileges = minetest.string_to_privs(privilegestring)&lt;br /&gt;
			newtable[name] = {password=password, privileges=privileges}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	io.close(file)&lt;br /&gt;
	minetest.auth_table = newtable&lt;br /&gt;
	minetest.notify_authentication_modified()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function save_auth_file()&lt;br /&gt;
	local newtable = {}&lt;br /&gt;
	-- Check table for validness before attempting to save&lt;br /&gt;
	for name, stuff in pairs(minetest.auth_table) do&lt;br /&gt;
		assert(type(name) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		assert(name ~= &amp;quot;&amp;quot;)&lt;br /&gt;
		assert(type(stuff) == &amp;quot;table&amp;quot;)&lt;br /&gt;
		assert(type(stuff.password) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		assert(type(stuff.privileges) == &amp;quot;table&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local file, errmsg = io.open(minetest.auth_file_path, 'w+b')&lt;br /&gt;
	if not file then&lt;br /&gt;
		error(minetest.auth_file_path..&amp;quot; could not be opened for writing: &amp;quot;..errmsg)&lt;br /&gt;
	end&lt;br /&gt;
	for name, stuff in pairs(minetest.auth_table) do&lt;br /&gt;
		local privstring = minetest.privs_to_string(stuff.privileges)&lt;br /&gt;
		file:write(name..&amp;quot;:&amp;quot;..stuff.password..&amp;quot;:&amp;quot;..privstring..'\n')&lt;br /&gt;
	end&lt;br /&gt;
	io.close(file)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
minetest.builtin_auth_handler = {&lt;br /&gt;
	get_auth = function(name)&lt;br /&gt;
		assert(type(name) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		-- Figure out what password to use for a new player (singleplayer&lt;br /&gt;
		-- always has an empty password, otherwise use default, which is&lt;br /&gt;
		-- usually empty too)&lt;br /&gt;
		local new_password_hash = &amp;quot;&amp;quot;&lt;br /&gt;
		-- If not in authentication table, return nil&lt;br /&gt;
		if not minetest.auth_table[name] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		-- Figure out what privileges the player should have.&lt;br /&gt;
		-- Take a copy of the privilege table&lt;br /&gt;
		local privileges = {}&lt;br /&gt;
		for priv, _ in pairs(minetest.auth_table[name].privileges) do&lt;br /&gt;
			privileges[priv] = true&lt;br /&gt;
		end&lt;br /&gt;
		-- If singleplayer, give all privileges except those marked as give_to_singleplayer = false&lt;br /&gt;
		if minetest.is_singleplayer() then&lt;br /&gt;
			for priv, def in pairs(minetest.registered_privileges) do&lt;br /&gt;
				if def.give_to_singleplayer then&lt;br /&gt;
					privileges[priv] = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		-- For the admin, give everything&lt;br /&gt;
		elseif name == minetest.setting_get(&amp;quot;name&amp;quot;) then&lt;br /&gt;
			for priv, def in pairs(minetest.registered_privileges) do&lt;br /&gt;
				privileges[priv] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- All done&lt;br /&gt;
		return {&lt;br /&gt;
			password = minetest.auth_table[name].password,&lt;br /&gt;
			privileges = privileges,&lt;br /&gt;
		}&lt;br /&gt;
	end,&lt;br /&gt;
	create_auth = function(name, password)&lt;br /&gt;
		assert(type(name) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		assert(type(password) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		minetest.log('info', &amp;quot;Built-in authentication handler adding player '&amp;quot;..name..&amp;quot;'&amp;quot;)&lt;br /&gt;
		minetest.auth_table[name] = {&lt;br /&gt;
			password = password,&lt;br /&gt;
			privileges = minetest.string_to_privs(minetest.setting_get(&amp;quot;default_privs&amp;quot;)),&lt;br /&gt;
		}&lt;br /&gt;
		save_auth_file()&lt;br /&gt;
	end,&lt;br /&gt;
	set_password = function(name, password)&lt;br /&gt;
		assert(type(name) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		assert(type(password) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		if not minetest.auth_table[name] then&lt;br /&gt;
			minetest.builtin_auth_handler.create_auth(name, password)&lt;br /&gt;
		else&lt;br /&gt;
			minetest.log('info', &amp;quot;Built-in authentication handler setting password of player '&amp;quot;..name..&amp;quot;'&amp;quot;)&lt;br /&gt;
			minetest.auth_table[name].password = password&lt;br /&gt;
			save_auth_file()&lt;br /&gt;
		end&lt;br /&gt;
		return true&lt;br /&gt;
	end,&lt;br /&gt;
	set_privileges = function(name, privileges)&lt;br /&gt;
		assert(type(name) == &amp;quot;string&amp;quot;)&lt;br /&gt;
		assert(type(privileges) == &amp;quot;table&amp;quot;)&lt;br /&gt;
		if not minetest.auth_table[name] then&lt;br /&gt;
			minetest.builtin_auth_handler.create_auth(name, minetest.get_password_hash(name, minetest.setting_get(&amp;quot;default_password&amp;quot;)))&lt;br /&gt;
		end&lt;br /&gt;
		minetest.auth_table[name].privileges = privileges&lt;br /&gt;
		minetest.notify_authentication_modified(name)&lt;br /&gt;
		save_auth_file()&lt;br /&gt;
	end,&lt;br /&gt;
	reload = function()&lt;br /&gt;
		read_auth_file()&lt;br /&gt;
		return true&lt;br /&gt;
	end,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Methods|r]]&lt;/div&gt;</summary>
		<author><name>&gt;ROllerozxa</name></author>
	</entry>
</feed>