Merge commit 'ad25fb61f76b88e27caa9d9bd9759c990c400a7f' as 'auth_export'
commit
68e8a0562d
|
@ -0,0 +1,35 @@
|
|||
# Auth_export mod for minetest
|
||||
|
||||
This is an ad-hoc mod written to interface Minetest with Mediawiki
|
||||
(see [the mediawiki plugin](/AuthMinetest.git/)). It is intended only
|
||||
for usage with the http server bundled with the mediawiki plugin.
|
||||
|
||||
## Installation
|
||||
|
||||
To set up your minetest installation to communicate with the minetest server, edit your "minetest.conf":
|
||||
|
||||
```
|
||||
# enable curl/http on that mod
|
||||
secure.http_mods = mail
|
||||
secure.http_mods = auth_export
|
||||
```
|
||||
|
||||
## BUGS
|
||||
|
||||
Bugs are tracked on
|
||||
[Hemiptera](https://bugs.linux-forks.de/MinetestMediawiki/). Send bugs
|
||||
as an e-mail to <MinetestMediawiki@bugs.linux-forks.de>
|
||||
|
||||
## TODO
|
||||
|
||||
* Improve architecture – This mod's architecture is rather ugly right now
|
||||
* Integrate with various ban mechanisms
|
||||
* Add service-specific access rights, such as a "wiki" priv for wiki
|
||||
access, or "nowiki" xban flag to ban access to wiki
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
This mod is essentially scavenged from
|
||||
[the webmail mod](https://github.com/thomasrudin-mt/mail) by Thomas
|
||||
Rudin.
|
|
@ -0,0 +1,93 @@
|
|||
-- bi-directional http-channel
|
||||
-- with long-poll GET and POST on the same URL
|
||||
|
||||
local debug = true
|
||||
|
||||
local function Channel(http, url, cfg)
|
||||
cfg = cfg or {}
|
||||
local extra_headers = cfg.extra_headers or {}
|
||||
local timeout = cfg.timeout or 1
|
||||
local long_poll_timeout = cfg.long_poll_timeout or 30
|
||||
local error_retry = cfg.error_retry or 10
|
||||
|
||||
-- assemble post-header with json content
|
||||
local post_headers = { "Content-Type: application/json" }
|
||||
for _,header in pairs(cfg.extra_headers) do
|
||||
table.insert(post_headers, header)
|
||||
end
|
||||
|
||||
local recv_listeners = {}
|
||||
local run = true
|
||||
|
||||
local recv_loop
|
||||
|
||||
recv_loop = function()
|
||||
assert(run)
|
||||
|
||||
-- long-poll GET
|
||||
http.fetch({
|
||||
url = url,
|
||||
extra_headers = extra_headers,
|
||||
timeout = long_poll_timeout
|
||||
}, function(res)
|
||||
if res.succeeded and res.code == 200 then
|
||||
local data = minetest.parse_json(res.data)
|
||||
|
||||
if debug then
|
||||
minetest.log("action", "[webmail-rx] " .. dump(data))
|
||||
end
|
||||
|
||||
if data then
|
||||
for _,listener in pairs(recv_listeners) do
|
||||
listener(data)
|
||||
end
|
||||
end
|
||||
-- reschedule immediately
|
||||
minetest.after(0, recv_loop)
|
||||
else
|
||||
-- error, retry after some time
|
||||
minetest.after(error_retry, recv_loop)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
local send = function(data)
|
||||
assert(run)
|
||||
-- POST
|
||||
|
||||
if debug then
|
||||
minetest.log("action", "[webmail-tx] " .. dump(data))
|
||||
end
|
||||
|
||||
http.fetch({
|
||||
url = url,
|
||||
extra_headers = post_headers,
|
||||
timeout = timeout,
|
||||
post_data = minetest.write_json(data)
|
||||
}, function(res)
|
||||
-- TODO: error-handling
|
||||
end)
|
||||
end
|
||||
|
||||
local receive = function(listener)
|
||||
table.insert(recv_listeners, listener)
|
||||
end
|
||||
|
||||
local close = function()
|
||||
run = false
|
||||
end
|
||||
|
||||
recv_loop();
|
||||
|
||||
return {
|
||||
send = send,
|
||||
receive = receive,
|
||||
close = close
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
return Channel
|
|
@ -0,0 +1,26 @@
|
|||
local http = minetest.request_http_api()
|
||||
mail = {}
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
mail.webmail = {}
|
||||
mail.webmail.disallow_banned_players = true
|
||||
if http then
|
||||
local webmail_url = "http://127.0.0.1:8080"
|
||||
local webmail_key = "foo bar baz" -- not used in the mod but might get used in the future.
|
||||
|
||||
if not webmail_url then error("webmail.url is not defined") end
|
||||
if not webmail_key then error("webmail.key is not defined") end
|
||||
|
||||
print("[mail] loading webmail-component with endpoint: " .. webmail_url)
|
||||
dofile(MP .. "/webmail.lua")
|
||||
mail.webmail_init(http, webmail_url, webmail_key)
|
||||
end
|
||||
|
||||
|
||||
minetest.register_on_prejoinplayer(function(name, ip)
|
||||
if minetest.player_exists(name) then
|
||||
return
|
||||
end
|
||||
if name:match("_") then
|
||||
return "For security reasons, underscores are banned on this server. Please choose another username!"
|
||||
end
|
||||
end)
|
|
@ -0,0 +1,53 @@
|
|||
-- false per default
|
||||
local has_xban2_mod = minetest.get_modpath("xban2")
|
||||
|
||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||
local Channel = dofile(MP .. "/channel.lua")
|
||||
local channel
|
||||
-- auth request from webmail
|
||||
local function auth_handler(auth)
|
||||
local handler = minetest.get_auth_handler()
|
||||
minetest.log("action", "[webmail] auth: " .. auth.name)
|
||||
|
||||
local success = false
|
||||
local banned = false
|
||||
local message = ""
|
||||
|
||||
if mail.webmail.disallow_banned_players and has_xban2_mod then
|
||||
-- check xban db
|
||||
local xbanentry = xban.find_entry(auth.name)
|
||||
if xbanentry and xbanentry.banned then
|
||||
banned = true
|
||||
message = "Banned!"
|
||||
end
|
||||
end
|
||||
|
||||
if not banned then
|
||||
local entry = handler.get_auth(auth.name)
|
||||
if entry and minetest.check_password_entry(auth.name, entry.password, auth.password) then
|
||||
success = true
|
||||
end
|
||||
end
|
||||
|
||||
channel.send({
|
||||
type = "auth",
|
||||
data = {
|
||||
name = auth.name,
|
||||
success = success,
|
||||
message = message
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
function mail.webmail_init(http, url, key)
|
||||
channel = Channel(http, url .. "/api/minetest/channel", {
|
||||
extra_headers = { "webmailkey: " .. key }
|
||||
})
|
||||
|
||||
channel.receive(function(data)
|
||||
if data.type == "auth" then
|
||||
auth_handler(data.data)
|
||||
end
|
||||
end)
|
||||
end
|
Loading…
Reference in New Issue