diff options
Diffstat (limited to 'src/util/auth.h')
0 files changed, 0 insertions, 0 deletions
-- minetest.lua
-- Packet dissector for the UDP-based Minetest protocol
-- Copy this to $HOME/.wireshark/plugins/
--
-- Minetest-c55
-- Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
-- Table of Contents:
-- Part 1: Client command dissectors (TOSERVER_*)
-- Part 2: Server command dissectors (TOCLIENT_*)
-- Part 3: Wrapper protocol subdissectors
-- Part 4: Wrapper protocol main dissector
-- Part 5: Utility functions
--------------------------------------------
-- Part 1 --
-- Client command dissectors (TOSERVER_*) --
--------------------------------------------
minetest_client_commands = {}
minetest_client_obsolete = {}
-- TOSERVER_INIT
do
local f_ser_fmt = ProtoField.uint8("minetest.client.init_ser_version",
"Maximum serialization format version", base.DEC)
local f_player_name = ProtoField.stringz("minetest.client.init_player_name", "Player Name")
local f_password = ProtoField.stringz("minetest.client.init_password", "Password")
local f_version = ProtoField.uint16("minetest.client.init_version", "Version", base.DEC)
minetest_client_commands[0x10] = {
"INIT", -- Command name
53, -- Minimum message length including code
{ f_ser_fmt, -- List of fields [optional]
f_player_name,
f_password,
f_version },
function(buffer, pinfo, tree, t) -- Dissector function [optional]
t:add(f_ser_fmt, buffer(2,1))
t:add(f_player_name, buffer(3,20))
t:add(f_password, buffer(23,28))
t:add(f_version, buffer(51,2))
end
}
end
-- TOSERVER_INIT2
minetest_client_commands[0x11] = { "INIT2", 2 }
-- TOSERVER_GETBLOCK (obsolete)
minetest_client_commands[0x20] = { "GETBLOCK", 2 }
minetest_client_obsolete[0x20] = true
-- TOSERVER_ADDNODE (obsolete)
minetest_client_commands[0x21] = { "ADDNODE", 2 }
minetest_client_obsolete[0x21] = true
-- TOSERVER_REMOVENODE (obsolete)
minetest_client_commands[0x22] = { "REMOVENODE", 2 }
minetest_client_obsolete[0x22] = true
-- TOSERVER_PLAYERPOS
do
local f_x = ProtoField.int32("minetest.client.playerpos_x", "Position X", base.DEC)
local f_y = ProtoField.int32("minetest.client.playerpos_y", "Position Y", base.DEC)
local f_z = ProtoField.int32("minetest.client.playerpos_z", "Position Z", base.DEC)
local f_speed_x = ProtoField.int32("minetest.client.playerpos_speed_x", "Speed X", base.DEC)
local f_speed_y = ProtoField.int32("minetest.client.playerpos_speed_y", "Speed Y", base.DEC)
local f_speed_z = ProtoField.int32("minetest.client.playerpos_speed_z", "Speed Z", base.DEC)
local f_pitch = ProtoField.int32("minetest.client.playerpos_pitch", "Pitch", base.DEC)
local f_yaw = ProtoField.int32("minetest.client.playerpos_yaw", "Yaw", base.DEC)
minetest_client_commands[0x23] = {
"PLAYERPOS", 34,
{ f_x, f_y, f_z, f_speed_x, f_speed_y, f_speed_z, f_pitch, f_yaw },
function(buffer, pinfo, tree, t)
t:add(f_x, buffer(2,4))
t:add(f_y, buffer(6,4))
t:add(f_z, buffer(10,4))
t:add(f_speed_x, buffer(14,4))
t:add(f_speed_y, buffer(18,4))
t:add(f_speed_z, buffer(22,4))
t:add(f_pitch, buffer(26,4))
t:add(f_yaw, buffer(30,4))
end
}
end
-- TOSERVER_GOTBLOCKS
do
local f_count = ProtoField.uint8("minetest.client.gotblocks_count", "Count", base.DEC)
local f_block = ProtoField.bytes("minetset.client.gotblocks_block", "Block", base.DEC)
local f_x = ProtoField.int16("minetest.client.gotblocks_x", "Block position X", base.DEC)
local f_y = ProtoField.int16("minetest.client.gotblocks_y", "Block position Y", base.DEC)
local f_z = ProtoField.int16("minetest.client.gotblocks_z", "Block position Z", base.DEC)
minetest_client_commands[0x24] = {
"GOTBLOCKS", 3,
{ f_count, f_block, f_x, f_y, f_z },
function(buffer, pinfo, tree, t)
t:add(f_count, buffer(2,1))
local count = buffer(2,1):uint()
if minetest_check_length(buffer, 3 + 6*count, t) then
pinfo.cols.info:append(" * " .. count)
local index
for index = 0, count - 1 do
local pos = 3 + 6*index
local t2 = t:add(f_block, buffer(pos, 6))
t2:set_text("Block, X: " .. buffer(pos, 2):int()
.. ", Y: " .. buffer(pos + 2, 2):int()
.. ", Z: " .. buffer(pos + 4, 2):int())
t2:add(f_x, buffer(pos, 2))
t2:add(f_y, buffer(pos + 2, 2))
t2:add(f_z, buffer(pos + 4, 2))
end
end
end
}
end
-- TOSERVER_DELETEDBLOCKS
-- TODO: Test this
do
local f_count = ProtoField.uint8("minetest.client.deletedblocks_count", "Count", base.DEC)
local f_block = ProtoField.bytes("minetset.client.deletedblocks_block", "Block", base.DEC)
local f_x = ProtoField.int16("minetest.client.deletedblocks_x", "Block position X", base.DEC)
local f_y = ProtoField.int16("minetest.client.deletedblocks_y", "Block position Y", base.DEC)
local f_z = ProtoField.int16("minetest.client.deletedblocks_z", "Block position Z", base.DEC)
minetest_client_commands[0x25] = {
"DELETEDBLOCKS", 3,
{ f_count, f_block, f_x, f_y, f_z },
function(buffer, pinfo, tree, t)
t:add(f_count, buffer(2,1))
local count = buffer(2,1):uint()
if minetest_check_length(buffer, 3 + 6*count, t) then
pinfo.cols.info:append(" * " .. count)
local index
for index = 0, count - 1 do
local pos = 3 + 6*index
local t2 = t:add(f_block, buffer(pos, 6))
t2:set_text("Block, X: " .. buffer(pos, 2):int()
.. ", Y: " .. buffer(pos + 2, 2):int()
.. ", Z: " .. buffer(pos + 4, 2):int())
t2:add(f_x, buffer(pos, 2))
t2:add(f_y, buffer(pos + 2, 2))
t2:add(f_z, buffer(pos + 4, 2))
end
end
end
}
end
-- TOSERVER_ADDNODE_FROM_INVENTORY (obsolete)
minetest_client_commands[0x26] = { "ADDNODE_FROM_INVENTORY", 2 }
minetest_client_obsolete[0x26] = true
-- TOSERVER_CLICK_OBJECT
-- TODO: Test this
do
local vs_button = {
[0] = "left",
[1] = "right"
}
local f_button = ProtoField.uint8("minetest.client.click_object_button", "Button", base.DEC, vs_button)
local f_blockpos_x = ProtoField.int16("minetest.client.click_object_blockpos_x", "Block position X", base.DEC)
local f_blockpos_y = ProtoField.int16("minetest.client.click_object_blockpos_y", "Block position Y", base.DEC)
local f_blockpos_z = ProtoField.int16("minetest.client.click_object_blockpos_z", "Block position Z", base.DEC)
local f_id = ProtoField.int16("minetest.client.click_object_id", "ID", base.DEC)
local f_item = ProtoField.uint16("minetest.client.click_object_item", "Item", base.DEC)
minetest_client_commands[0x27] = {
"CLICK_OBJECT", 13,
{ f_button, f_blockpos_x, f_blockpos_y, f_blockpos_z, f_id, f_item },
function(buffer, pinfo, tree, t)
t:add(f_button, buffer(2,1))
t:add(f_blockpos_x, buffer(3,2))
t:add(f_blockpos_y, buffer(5,2))
t:add(f_blockpos_z, buffer(7,2))
t:add(f_id, buffer(9,2))
t:add(f_item, buffer(11,2))
end
}
end
-- TOSERVER_GROUND_ACTION
do
local vs_action = {
[0] = "Start digging",
[1] = "Place block",
[2] = "Stop digging",
[3] = "Digging completed"
}
local f_action = ProtoField.uint8("minetest.client.ground_action", "Action", base.DEC, vs_action)
local f_nodepos_undersurface_x = ProtoField.int16(
"minetest.client.ground_action_nodepos_undersurface_x",
"Node position (under surface) X")
local f_nodepos_undersurface_y = ProtoField.int16(
"minetest.client.ground_action_nodepos_undersurface_y",
"Node position (under surface) Y")
local f_nodepos_undersurface_z = ProtoField.int16(
"minetest.client.ground_action_nodepos_undersurface_z",
"Node position (under surface) Z")
local f_nodepos_abovesurface_x = ProtoField.int16(
"minetest.client.ground_action_nodepos_abovesurface_x",
"Node position (above surface) X")
local f_nodepos_abovesurface_y = ProtoField.int16(
"minetest.client.ground_action_nodepos_abovesurface_y",
"Node position (above surface) Y")
local f_nodepos_abovesurface_z = ProtoField.int16(
"minetest.client.ground_action_nodepos_abovesurface_z",
"Node position (above surface) Z")
local f_item = ProtoField.uint16("minetest.client.ground_action_item", "Item")
minetest_client_commands[0x28] = {
"GROUND_ACTION", 17,
{ f_action,
f_nodepos_undersurface_x,
f_nodepos_undersurface_y,
f_nodepos_undersurface_z,
f_nodepos_abovesurface_x,
f_nodepos_abovesurface_y,
f_nodepos_abovesurface_z,
f_item },
function(buffer, pinfo, tree, t)
t:add(f_action, buffer(2,1))
t:add(f_nodepos_undersurface_x, buffer(3,2))
t:add(f_nodepos_undersurface_y, buffer(5,2))
t:add(f_nodepos_undersurface_z, buffer(7,2))
t:add(f_nodepos_abovesurface_x, buffer(9,2))
t:add(f_nodepos_abovesurface_y, buffer(11,2))
t:add(f_nodepos_abovesurface_z, buffer(13,2))
t:add(f_item, buffer(15,2))
end
}
end
-- TOSERVER_RELEASE (obsolete)
minetest_client_commands[0x29] = { "RELEASE", 2 }
minetest_client_obsolete[0x29] = true
-- TOSERVER_SIGNTEXT (old signs)
-- TODO: Test this or mark obsolete
do
local f_blockpos_x = ProtoField.int16("minetest.client.signtext_blockpos_x", "Block position X", base.DEC)
local f_blockpos_y = ProtoField.int16("minetest.client.signtext_blockpos_y", "Block position Y", base.DEC)
local f_blockpos_z = ProtoField.int16("minetest.client.signtext_blockpos_z", "Block position Z", base.DEC)
local f_id = ProtoField.int16("minetest.client.signtext_id", "ID", base.DEC)
local f_textlen = ProtoField.uint16("minetest.client.signtext_textlen", "Text length", base.DEC)
local f_text = ProtoField.string("minetest.client.signtext_text", "Text")
minetest_client_commands[0x30] = {
"SIGNTEXT", 12,
{ f_blockpos_x, f_blockpos_y, f_blockpos_z, f_id, f_textlen, f_text },
function(buffer, pinfo, tree, t)
t:add(f_blockpos_x, buffer(2,2))
t:add(f_blockpos_y, buffer(4,2))
t:add(f_blockpos_z, buffer(6,2))
t:add(f_id, buffer(8,2))
t:add(f_textlen, buffer(10,2))
local textlen = buffer(10,2):uint()
if minetest_check_length(buffer, 12 + textlen, t) then
t:add(f_text, buffer, buffer(12,textlen))
end
end
}
end
-- TOSERVER_INVENTORY_ACTION
do
local f_action = ProtoField.string("minetest.client.inventory_action", "Action")
minetest_client_commands[0x31] = {
"INVENTORY_ACTION", 2,
{ f_action },
function(buffer, pinfo, tree, t)
t:add(f_action, buffer(2, buffer:len() - 2))
end
}
end
-- TOSERVER_CHAT_MESSAGE
do
local f_length = ProtoField.uint16("minetest.client.chat_message_length", "Length", base.DEC)
local f_message = ProtoField.string("minetest.client.chat_message", "Message")
minetest_client_commands[0x32] = {
"CHAT_MESSAGE", 4,
{ f_length, f_message },
function(buffer, pinfo, tree, t)
t:add(f_length, buffer(2,2))
local textlen = buffer(2,2):uint()
if minetest_check_length(buffer, 4 + textlen*2, t) then
t:add(f_message, minetest_convert_utf16(buffer(4, textlen*2), "Converted chat message"))
end
end
}
end
-- TOSERVER_SIGNNODETEXT
do
local f_pos_x = ProtoField.int16("minetest.client.signnodetext_pos_x", "Block position X", base.DEC)
local f_pos_y = ProtoField.int16("minetest.client.signnodetext_pos_y", "Block position Y", base.DEC)
local f_pos_z = ProtoField.int16("minetest.client.signnodetext_pos_z", "Block position Z", base.DEC)
local f_textlen = ProtoField.uint16("minetest.client.signnodetext_textlen", "Text length", base.DEC)
local f_text = ProtoField.string("minetest.client.signnodetext_text", "Text")
minetest_client_commands[0x33] = {
"SIGNNODETEXT", 10,
{ f_pos_x, f_pos_y, f_pos_z, f_textlen, f_text },
function(buffer, pinfo, tree, t)
t:add(f_pos_x, buffer(2,2))
t:add(f_pos_y, buffer(4,2))
t:add(f_pos_z, buffer(6,2))
t:add(f_textlen, buffer(8,2))
local textlen = buffer(8,2):uint()
if minetest_check_length(buffer, 10 + textlen, t) then
t:add(f_text, buffer(10, textlen))
end
end
}
end
-- TOSERVER_CLICK_ACTIVEOBJECT
do
local vs_button = {
[0] = "left",
[1] = "right"
}
local f_button = ProtoField.uint8("minetest.client.click_activeobject_button", "Button", base.DEC, vs_button)
local f_id = ProtoField.uint16("minetest.client.click_activeobject_id", "ID", base.DEC)
local f_item = ProtoField.uint16("minetest.client.click_activeobject_item", "Item", base.DEC)
minetest_client_commands[0x34] = {
"CLICK_ACTIVEOBJECT", 7,
{ f_button, f_id, f_item },
function(buffer, pinfo, tree, t)
t:add(f_button, buffer(2,1))
t:add(f_id, buffer(3,2))
t:add(f_item, buffer(5,2))
end
}
end
-- TOSERVER_DAMAGE
do
local f_amount = ProtoField.uint8("minetest.client.damage_amount", "Amount", base.DEC)
minetest_client_commands[0x35] = {
"DAMAGE", 3,
{ f_amount },
function(buffer, pinfo, tree, t)
t:add(f_amount, buffer(2,1))
end
}
end
-- TOSERVER_PASSWORD
do
local f_old_password = ProtoField.string("minetest.client.password_old", "Old password")
local f_new_password = ProtoField.string("minetest.client.password_new", "New password")
minetest_client_commands[0x36] = {
"PASSWORD", 58,
{ f_old_password, f_new_password },
function(buffer, pinfo, tree, t)
t:add(f_old_password, buffer(2,28))
t:add(f_new_password, buffer(30,28))
end
}
end
-- TOSERVER_PLAYERITEM
do
local f_item = ProtoField.uint16("minetest.client.playeritem_item", "Wielded item")
minetest_client_commands[0x37] = {
"PLAYERITEM", 4,
{ f_item },
function(buffer, pinfo, tree, t)
t:add(f_item, buffer(2,2))
end
}
end
-- TOSERVER_RESPAWN
minetest_client_commands[0x38] = { "RESPAWN", 2 }
--------------------------------------------
-- Part 2 --
-- Server command dissectors (TOCLIENT_*) --
--------------------------------------------
minetest_server_commands = {}
minetest_server_obsolete = {}
-- TOCLIENT_INIT
do
local f_version = ProtoField.uint8("minetest.server.init_version", "Deployed version", base.DEC)
local f_pos_x = ProtoField.int16("minetest.server.init_pos_x", "Position X", base.DEC)
local f_pos_y = ProtoField.int16("minetest.server.init_pos_y", "Position Y", base.DEC)
local f_pos_z = ProtoField.int16("minetest.server.init_pos_x", "Position Z", base.DEC)
local f_map_seed = ProtoField.uint64("minetest.server.init_map_seed", "Map seed", base.DEC)
minetest_server_commands[0x10] = {
"INIT", 17,
{ f_version, f_pos_x, f_pos_y, f_pos_z, f_map_seed },
function(buffer, pinfo, tree, t)
t:add(f_version, buffer(2,1))
t:add(f_pos_x, buffer(3,2))
t:add(f_pos_y, buffer(5,2))
t:add(f_pos_z, buffer(7,2))
t:add(f_map_seed, buffer(9,8))
end
}
end
-- TOCLIENT_BLOCKDATA
do
local f_x = ProtoField.int16("minetest.server.blockdata_x", "Block position X", base.DEC)
local f_y = ProtoField.int16("minetest.server.blockdata_y", "Block position Y", base.DEC)
local f_z = ProtoField.int16("minetest.server.blockdata_z", "Block position Z", base.DEC)
local f_data = ProtoField.bytes("minetest.server.blockdata_block", "Serialized MapBlock")
minetest_server_commands[0x20] = {
"BLOCKDATA", 8,
{ f_x, f_y, f_z, f_data },
function(buffer, pinfo, tree, t)
t:add(f_x, buffer(2,2))
t:add(f_y, buffer(4,2))
t:add(f_z, buffer(6,2))
t:add(f_data, buffer(8, buffer:len() - 8))
end
}
end
-- TOCLIENT_ADDNODE
do
local f_x = ProtoField.int16("minetest.server.addnode_x", "Position X", base.DEC)
local f_y = ProtoField.int16("minetest.server.addnode_y", "Position Y", base.DEC)
local f_z = ProtoField.int16("minetest.server.addnode_z", "Position Z", base.DEC)
local f_data = ProtoField.bytes("minetest.server.addnode_node", "Serialized MapNode")
minetest_server_commands[0x21] = {
"ADDNODE", 8,
{ f_x, f_y, f_z, f_data },
function(buffer, pinfo, tree, t)
t:add(f_x, buffer(2,2))
t:add(f_y, buffer(4,2))
t:add(f_z, buffer(6,2))
t:add(f_data, buffer(8, buffer:len() - 8))
end
}
end
-- TOCLIENT_REMOVENODE
do
local f_x = ProtoField.int16("minetest.server.removenode_x", "Position X", base.DEC)
local f_y = ProtoField.int16("minetest.server.removenode_y", "Position Y", base.DEC)
local f_z = ProtoField.int16("minetest.server.removenode_z", "Position Z", base.DEC)
minetest_server_commands[0x22] = {
"REMOVENODE", 8,
{ f_x, f_y, f_z },
function(buffer, pinfo, tree, t)
t:add(f_x, buffer(2,2))
t:add(f_y, buffer(4,2))
t:add(f_z, buffer(6,2))
end
}
end
-- TOCLIENT_PLAYERPOS (obsolete)
minetest_server_commands[0x23] = { "PLAYERPOS", 2 }
minetest_server_obsolete[0x23] = true
-- TOCLIENT_PLAYERINFO
do
local f_count = ProtoField.uint16("minetest.server.playerinfo_count", "Count", base.DEC)
local f_player = ProtoField.bytes("minetest.server.playerinfo_player", "Player", base.DEC)
local f_peer_id = ProtoField.uint16("minetest.server.playerinfo_peer_id", "Peer ID", base.DEC)
local f_name = ProtoField.string("minetest.server.playerinfo_name", "Name")
minetest_server_commands[0x24] = {
"PLAYERINFO", 2,
{ f_count, f_player, f_peer_id, f_name },
function(buffer, pinfo, tree, t)
local count = 0
local pos, index
for pos = 2, buffer:len() - 22, 22 do -- does lua have integer division?
count = count + 1
end
t:add(f_count, count):set_generated()
t:set_len(2 + 22 * count)
pinfo.cols.info:append(" * " .. count)
for index = 0, count - 1 do
local pos = 2 + 22 * index
local t2 = t:add(f_player, buffer(pos, 22))
t2:set_text("Player, ID: " .. buffer(pos, 2):uint()
.. ", Name: " .. buffer(pos + 2, 20):string())
t2:add(f_peer_id, buffer(pos, 2))
t2:add(f_name, buffer(pos + 2, 20))
end
end
}
end
-- TOCLIENT_OPT_BLOCK_NOT_FOUND (obsolete)
minetest_server_commands[0x25] = { "OPT_BLOCK_NOT_FOUND", 2 }
minetest_server_obsolete[0x25] = true
-- TOCLIENT_SECTORMETA (obsolete)
minetest_server_commands[0x26] = { "SECTORMETA", 2 }
minetest_server_obsolete[0x26] = true
-- TOCLIENT_INVENTORY
do
local f_inventory = ProtoField.string("minetest.server.inventory", "Inventory")
minetest_server_commands[0x27] = {
"INVENTORY", 2,
{ f_inventory },
function(buffer, pinfo, tree, t)
t:add(f_inventory, buffer(2, buffer:len() - 2))
end
}
end
-- TOCLIENT_OBJECTDATA
do
local f_player_count = ProtoField.uint16("minetest.server.objectdata_player_count",
"Count of player positions", base.DEC)
local f_player = ProtoField.bytes("minetest.server.objectdata_player", "Player position")
local f_peer_id = ProtoField.uint16("minetest.server.objectdata_player_peer_id", "Peer ID")
local f_x = ProtoField.int32("minetest.server.objectdata_player_x", "Position X", base.DEC)
local f_y = ProtoField.int32("minetest.server.objectdata_player_y", "Position Y", base.DEC)
local f_z = ProtoField.int32("minetest.server.objectdata_player_z", "Position Z", base.DEC)
local f_speed_x = ProtoField.int32("minetest.server.objectdata_player_speed_x", "Speed X", base.DEC)
local f_speed_y = ProtoField.int32("minetest.server.objectdata_player_speed_y", "Speed Y", base.DEC)
local f_speed_z = ProtoField.int32("minetest.server.objectdata_player_speed_z", "Speed Z", base.DEC)
local f_pitch = ProtoField.int32("minetest.server.objectdata_player_pitch", "Pitch", base.DEC)
local f_yaw = ProtoField.int32("minetest.server.objectdata_player_yaw", "Yaw", base.DEC)
local f_block_count = ProtoField.uint16("minetest.server.objectdata_block_count",
"Count of blocks", base.DEC)
minetest_server_commands[0x28] = {
"OBJECTDATA", 6,
{ f_player_count, f_player, f_peer_id, f_x, f_y, f_z,
f_speed_x, f_speed_y, f_speed_z,f_pitch, f_yaw,
f_block_count },
function(buffer, pinfo, tree, t)