diff --git a/init.lua b/init.lua index 52e8141..e35875b 100644 --- a/init.lua +++ b/init.lua @@ -36,13 +36,6 @@ dofile(MP .. "/gui.lua") dofile(MP .. "/onjoin.lua") -- optional webmail stuff below - ---[[ minetest.conf -secure.http_mods = mail -webmail.url = http://127.0.0.1:8080 -webmail.key = myserverkey ---]] - local http = minetest.request_http_api() if http then @@ -53,8 +46,17 @@ if http then if not webmail_key then error("webmail.key is not defined") end print("[mail] loading webmail-component with endpoint: " .. webmail_url) - dofile(MP .. "/tan.lua") - dofile(MP .. "/webmail.lua") + + mail.handlers = {} + dofile(MP .. "/webmail/tan.lua") + dofile(MP .. "/webmail/webmail.lua") + dofile(MP .. "/webmail/hook.lua") + dofile(MP .. "/webmail/handler_auth.lua") + dofile(MP .. "/webmail/handler_send.lua") + dofile(MP .. "/webmail/handler_messages.lua") + dofile(MP .. "/webmail/handler_delete.lua") + dofile(MP .. "/webmail/handler_mark_read.lua") + dofile(MP .. "/webmail/handler_mark_unread.lua") mail.webmail_init(http, webmail_url, webmail_key) end diff --git a/webmail.lua b/webmail.lua deleted file mode 100644 index 72cc1a7..0000000 --- a/webmail.lua +++ /dev/null @@ -1,130 +0,0 @@ --- false per default -local has_xban2_mod = minetest.get_modpath("xban2") - -local MP = minetest.get_modpath(minetest.get_current_modname()) -local Channel = dofile(MP .. "/util/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 - -- check tan - local tan = mail.tan[auth.name] - if tan ~= nil then - success = tan == auth.password - end - - -- check auth - if not success 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 - end - - channel.send({ - type = "auth", - data = { - name = auth.name, - success = success, - message = message - } - }) -end - --- send request from webmail -local function send_handler(sendmail) - -- send mail from webclient - minetest.log("action", "[webmail] sending mail from webclient: " .. sendmail.src .. " -> " .. sendmail.dst) - mail.send(sendmail) -end - --- get player messages request from webmail -local function get_player_messages_handler(playername) - local messages = mail.getMessages(playername) - channel.send({ - type = "player-messages", - playername = playername, - data = messages - }) -end - --- remove mail -local function delete_mail_handler(playername, index) - local messages = mail.getMessages(playername) - if messages[index] then - table.remove(messages, index) - end - mail.setMessages(playername, messages) -end - --- mark mail as read -local function mark_mail_read_handler(playername, index) - local messages = mail.getMessages(playername) - if messages[index] then - messages[index].unread = false - end - mail.setMessages(playername, messages) -end - --- mark mail as unread -local function mark_mail_unread_handler(playername, index) - local messages = mail.getMessages(playername) - if messages[index] then - messages[index].unread = true - end - mail.setMessages(playername, messages) -end - -function mail.webmail_send_hook(m) - channel.send({ - type = "new-message", - data = m - }) -end -mail.register_on_receive(mail.webmail_send_hook) - -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) - - elseif data.type == "send" then - send_handler(data.data) -- { src, dst, subject, body } - - elseif data.type == "delete-mail" then - delete_mail_handler(data.playername, data.index) -- index 1-based - - elseif data.type == "mark-mail-read" then - mark_mail_read_handler(data.playername, data.index) -- index 1-based - - elseif data.type == "mark-mail-unread" then - mark_mail_unread_handler(data.playername, data.index) -- index 1-based - - elseif data.type == "player-messages" then - get_player_messages_handler(data.data) - - end - end) -end diff --git a/webmail/handler_auth.lua b/webmail/handler_auth.lua new file mode 100644 index 0000000..dcc8417 --- /dev/null +++ b/webmail/handler_auth.lua @@ -0,0 +1,45 @@ +local has_xban2_mod = minetest.get_modpath("xban2") + +-- auth request from webmail +function mail.handlers.auth(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 + -- check tan + local tan = mail.tan[auth.name] + if tan ~= nil then + success = tan == auth.password + end + + -- check auth + if not success 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 + end + + mail.channel.send({ + type = "auth", + data = { + name = auth.name, + success = success, + message = message + } + }) +end diff --git a/webmail/handler_delete.lua b/webmail/handler_delete.lua new file mode 100644 index 0000000..2809bed --- /dev/null +++ b/webmail/handler_delete.lua @@ -0,0 +1,8 @@ +-- remove mail +function mail.handlers.delete(playername, index) + local messages = mail.getMessages(playername) + if messages[index] then + table.remove(messages, index) + end + mail.setMessages(playername, messages) +end diff --git a/webmail/handler_mark_read.lua b/webmail/handler_mark_read.lua new file mode 100644 index 0000000..a1ddf0f --- /dev/null +++ b/webmail/handler_mark_read.lua @@ -0,0 +1,9 @@ + +-- mark mail as read +function mail.handlers.mark_read(playername, index) + local messages = mail.getMessages(playername) + if messages[index] then + messages[index].unread = false + end + mail.setMessages(playername, messages) +end diff --git a/webmail/handler_mark_unread.lua b/webmail/handler_mark_unread.lua new file mode 100644 index 0000000..75331ce --- /dev/null +++ b/webmail/handler_mark_unread.lua @@ -0,0 +1,9 @@ + +-- mark mail as unread +function mail.handlers.mark_unread(playername, index) + local messages = mail.getMessages(playername) + if messages[index] then + messages[index].unread = true + end + mail.setMessages(playername, messages) +end diff --git a/webmail/handler_messages.lua b/webmail/handler_messages.lua new file mode 100644 index 0000000..c1693a4 --- /dev/null +++ b/webmail/handler_messages.lua @@ -0,0 +1,9 @@ +-- get player messages request from webmail +function mail.handlers.messages(playername) + local messages = mail.getMessages(playername) + mail.channel.send({ + type = "player-messages", + playername = playername, + data = messages + }) +end diff --git a/webmail/handler_send.lua b/webmail/handler_send.lua new file mode 100644 index 0000000..ed42662 --- /dev/null +++ b/webmail/handler_send.lua @@ -0,0 +1,7 @@ + +-- send request from webmail +function mail.handlers.send(sendmail) + -- send mail from webclient + minetest.log("action", "[webmail] sending mail from webclient: " .. sendmail.src .. " -> " .. sendmail.dst) + mail.send(sendmail) +end diff --git a/webmail/hook.lua b/webmail/hook.lua new file mode 100644 index 0000000..afe87a8 --- /dev/null +++ b/webmail/hook.lua @@ -0,0 +1,8 @@ +function mail.webmail_send_hook(m) + mail.channel.send({ + type = "new-message", + data = m + }) +end + +mail.register_on_receive(mail.webmail_send_hook) diff --git a/tan.lua b/webmail/tan.lua similarity index 100% rename from tan.lua rename to webmail/tan.lua diff --git a/webmail/webmail.lua b/webmail/webmail.lua new file mode 100644 index 0000000..592afe1 --- /dev/null +++ b/webmail/webmail.lua @@ -0,0 +1,31 @@ +local MP = minetest.get_modpath(minetest.get_current_modname()) +local Channel = dofile(MP .. "/util/channel.lua") + + +function mail.webmail_init(http, url, key) + mail.channel = Channel(http, url .. "/api/minetest/channel", { + extra_headers = { "webmailkey: " .. key } + }) + + mail.channel.receive(function(data) + if data.type == "auth" then + mail.handlers.auth(data.data) + + elseif data.type == "send" then + mail.handler.auth(data.data) -- { src, dst, subject, body } + + elseif data.type == "delete-mail" then + mail.handlers.delete(data.playername, data.index) -- index 1-based + + elseif data.type == "mark-mail-read" then + mail.handlers.mark_read(data.playername, data.index) -- index 1-based + + elseif data.type == "mark-mail-unread" then + mail.handlers.mark_unread(data.playername, data.index) -- index 1-based + + elseif data.type == "player-messages" then + mail.handlers.messages(data.data) + + end + end) +end