diff --git a/lua/init.lua b/lua/init.lua index 3f5fbb0..467a0a6 100644 --- a/lua/init.lua +++ b/lua/init.lua @@ -1,9 +1,9 @@ local snet = {} local socket = require("socket") -snet._VERSION = "SNET v.1.0.0" +snet._VERSION = "SNET v.1.0.1" snet._COPYRIGHT = "Copyright © 2020 Pavel Akulichev" -snet._DESCRIPTION = "Simple Network Module v.1.0.0" +snet._DESCRIPTION = "Simple Network Module v.1.0.1" -- SNET Statuses Definition SNET_DISCONNECTED = 0 @@ -18,6 +18,7 @@ SNET_BYPASS_PRIORITY = 0 -- SNET Service Packet IDs SNET_CONFIRM_PRIORITY = 0xFFFFFFFF +SNET_BLOCK_PACKET = 0xFFFFFFFF - 1 snet.bstream = require("snet.bstream") local server_class = require("snet.server") diff --git a/lua/server.lua b/lua/server.lua index 47a6ed5..cfe952d 100644 --- a/lua/server.lua +++ b/lua/server.lua @@ -8,14 +8,68 @@ server.last_ids = {} server.events = {} server.clients = {} server.packets = {} +server.blacklist = {} function server:add_event_handler(event, callback) table.insert(self.events, {event, callback}) end +local function is_blacklisted(handle, address) + if type(address) ~= 'string' then + return false + end + + for i, v in ipairs(handle.blacklist) do + if v[1] == address then + return true, i + end + end + + return false +end + +function server:block_address(address) + if type(address) ~= 'string' then + return false + end + + for i, v in ipairs(self.blacklist) do + if v[1] == address then + return false + end + end + + table.insert(self.blacklist, {address, 0}) + return true +end + +function server:unblock_address(address) + if type(address) ~= 'string' then + return false + end + + for i, v in ipairs(self.blacklist) do + if v[1] == address then + table.remove(self.blacklist, i) + return true + end + end + + return false +end + local function get_packet(object) local data, address, port = object.socket:receivefrom() if data and address and port then + local is_block, list_id = is_blacklisted(object, tostring(address)) + if is_block then + if os.time() >= object.blacklist[list_id][2] then + object.blacklist[list_id][2] = os.time() + 60 + object:send(SNET_BLOCK_PACKET, bstream.new(), + SNET_BYPASS_PRIORITY, address, port) + end + return false + end if data:sub(1, 1):byte() ~= 0x0 then return false end data = data:sub(2, #data) return data, address, port