MaimMim Man in the middle minetest interceptor
- prototype - between client and server, allow to capture all exchanges and potentially change them - created to capture server maps in laby - first test get only MapBlock, support version serialization version 28 - prepartion for 29 with zstd but untested. # Conflicts: # fetch_dependencies.sh
This commit is contained in:
97
java/org/artisanlogiciel/games/minetest/MapBlock.java
Normal file
97
java/org/artisanlogiciel/games/minetest/MapBlock.java
Normal file
@@ -0,0 +1,97 @@
|
||||
package org.artisanlogiciel.games.minetest;
|
||||
|
||||
import com.github.luben.zstd.Zstd;
|
||||
import org.artisanlogiciel.games.minetest.core.Constant;
|
||||
import org.artisanlogiciel.games.minetest.core.PacketException;
|
||||
import org.artisanlogiciel.games.minetest.core.Serialize;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* A block of nodes of MAP_BLOCKSIZE in any x,y,z direction
|
||||
*/
|
||||
public class MapBlock {
|
||||
|
||||
final static int nodecount = Constant.MAP_BLOCKSIZE * Constant.MAP_BLOCKSIZE * Constant.MAP_BLOCKSIZE;
|
||||
|
||||
int m_lighting_complete;
|
||||
|
||||
ArrayList<MapNode> nodes;
|
||||
|
||||
ArrayList<MapNode> getNodes()
|
||||
{
|
||||
if ( nodes == null )
|
||||
{
|
||||
nodes = new ArrayList<>(nodecount);
|
||||
}
|
||||
return nodes;
|
||||
}
|
||||
|
||||
// in memory case
|
||||
public void deSerialize(ByteBuffer buffer, int version)
|
||||
throws PacketException
|
||||
{
|
||||
|
||||
int flags = 0;
|
||||
int content_width = 0;
|
||||
int params_width = 0;
|
||||
|
||||
if ( version >= 29) {
|
||||
// ByteBuffer byteBuffer = ByteBuffer.wrap(networkPacket.getBuffer(),offset,networkPacket.getLength() - offset);
|
||||
|
||||
/*
|
||||
// force to have a direct buffer.
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(networkPacket.getLength());
|
||||
byteBuffer.put(networkPacket.getBuffer());
|
||||
byteBuffer.position(networkPacket.getOffset());
|
||||
|
||||
//System.arraycopy(networkPacket.getBuffer(), 0, byteBuffer.array(), 0, length);
|
||||
// zstd compression
|
||||
// FIXME, can we know original size ? somehow related to BLOCKSIZE³
|
||||
long originalSizeMax = Zstd.decompressedSize(byteBuffer);
|
||||
System.out.println(String.format("originalSizeMax=%d", originalSizeMax));
|
||||
ByteBuffer decompressed = Zstd.decompress(byteBuffer,(int) originalSizeMax);
|
||||
*/
|
||||
byte out[] = new byte[16386];
|
||||
long outLength = Zstd.decompressByteArray(out, 0, out.length, buffer.array(), buffer.arrayOffset(), buffer.limit());
|
||||
|
||||
// Should be a MapBlock
|
||||
MapBlock block = new MapBlock();
|
||||
ByteBuffer decompressed = ByteBuffer.wrap(out, 0, (int) outLength);
|
||||
buffer = decompressed;
|
||||
}
|
||||
|
||||
flags = Serialize.readU8(buffer);
|
||||
|
||||
if ( version >= 27 ) {
|
||||
m_lighting_complete = Serialize.readU16(buffer);
|
||||
}
|
||||
|
||||
content_width = Serialize.readU8(buffer);
|
||||
params_width = Serialize.readU8(buffer);
|
||||
|
||||
System.out.println(String.format(" flags %x lightning_complete %d content_witd %d params_width %d ",flags, m_lighting_complete, content_width, params_width));
|
||||
|
||||
if (( version < 29 ) && ( version >= 11 ))
|
||||
{
|
||||
// ZLib decompression
|
||||
try {
|
||||
byte decompressed[] = Serialize.decompress(buffer);
|
||||
buffer = ByteBuffer.wrap(decompressed);
|
||||
}
|
||||
catch ( Exception e)
|
||||
{
|
||||
// TODO
|
||||
System.err.println(e);
|
||||
e.printStackTrace(System.err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
nodes = getNodes();
|
||||
MapNode.deSerializeBulk(buffer,version, nodes,nodecount,content_width,params_width);
|
||||
|
||||
//m_node_metadata.deSerialize(is, m_gamedef->idef());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user