DEADSOFTWARE

Net: Improve malformed packet handling more
[d2df-sdl.git] / src / game / g_nethandler.pas
1 (* Copyright (C) Doom 2D: Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *)
15 {$INCLUDE ../shared/a_modes.inc}
16 unit g_nethandler;
18 interface
20 uses e_msg, g_net, g_netmsg, ENet;
22 type
23 TNetClientMsgHandler = function (M: TMsg): Boolean;
24 TNetHostMsgHandler = function (S: pTNetClient; M: TMsg): Boolean;
26 procedure g_Net_Client_HandlePacket(P: pENetPacket; Handler: TNetClientMsgHandler);
27 procedure g_Net_Host_HandlePacket(S: pTNetClient; P: pENetPacket; Handler: TNetHostMsgHandler);
29 function g_Net_ClientMsgHandler(NetMsg: TMsg): Boolean;
30 function g_Net_ClientLightMsgHandler(NetMsg: TMsg): Boolean;
31 function g_Net_HostMsgHandler(S: pTNetClient; NetMsg: TMsg): Boolean;
33 implementation
35 uses sysutils, g_console;
37 procedure g_Net_Client_HandlePacket(P: pENetPacket; Handler: TNetClientMsgHandler);
38 var
39 MNext: Integer;
40 MSize: LongWord;
41 MHandled: Boolean = false;
42 NetMsg: TMsg;
43 Err: Boolean;
44 begin
45 if not NetMsg.Init(P^.data, P^.dataLength, True) then
46 Exit;
48 Err := False;
49 MNext := 0;
51 while (NetMsg.BytesLeft() > 0) and (not Err) do
52 begin
53 try
54 MSize := NetMsg.ReadLongWord();
55 MNext := NetMsg.ReadCount + MSize;
56 MHandled := Handler(NetMsg); // TODO: maybe do something with this bool
57 NetMsg.Seek(MNext);
58 except
59 Err := True;
60 end;
61 end;
63 MHandled := not MHandled; //k8: stfu, fpc!
65 enet_packet_destroy(P);
66 //if Err then begin MC_MalformedPacket(S); Exit; end;
67 end;
69 procedure g_Net_Host_HandlePacket(S: pTNetClient; P: pENetPacket; Handler: TNetHostMsgHandler);
70 var
71 MNext: Integer;
72 MSize: LongWord;
73 MHandled: Boolean = false;
74 NetMsg: TMsg;
75 Err: Boolean;
76 begin
77 if not NetMsg.Init(P^.data, P^.dataLength, True) then
78 Exit;
80 Err := False;
81 MNext := 0;
83 while (NetMsg.BytesLeft() > 0) and (not Err) do
84 begin
85 try
86 MSize := NetMsg.ReadLongWord();
87 MNext := NetMsg.ReadCount + MSize;
88 MHandled := Handler(S, NetMsg); // TODO: maybe do something with this bool
89 NetMsg.Seek(MNext);
90 except
91 Err := True;
92 end;
93 end;
95 MHandled := not MHandled; //k8: stfu, fpc!
97 enet_packet_destroy(P);
98 if Err then begin MH_MalformedPacket(S); Exit; end;
99 end;
102 function g_Net_ClientMsgHandler(NetMsg: TMsg): Boolean;
103 var
104 MID: Byte;
105 Err: Boolean;
106 begin
107 Result := True;
108 Err := False;
109 try
110 MID := NetMsg.ReadByte();
111 except
112 MID := 0;
113 Err := True;
114 end;
116 //if Err then begin MC_MalformedPacket(S); Exit; end;
118 case MID of
119 NET_MSG_CHAT: MC_RECV_Chat(NetMsg);
120 NET_MSG_GFX: MC_RECV_Effect(NetMsg);
121 NET_MSG_SND: MC_RECV_Sound(NetMsg);
122 NET_MSG_SCORE: MC_RECV_GameStats(NetMsg);
123 NET_MSG_COOP: MC_RECV_CoopStats(NetMsg);
124 NET_MSG_GEVENT: MC_RECV_GameEvent(NetMsg);
125 NET_MSG_FLAG: MC_RECV_FlagEvent(NetMsg);
126 NET_MSG_GSET: MC_RECV_GameSettings(NetMsg);
127 NET_MSG_FLAGPOS:MC_RECV_FlagPos(NetMsg);
129 NET_MSG_PLR: MC_RECV_PlayerCreate(NetMsg);
130 NET_MSG_PLRPOS: MC_RECV_PlayerPos(NetMsg);
131 NET_MSG_PLRSTA: MC_RECV_PlayerStats(NetMsg);
132 NET_MSG_PLRDEL: MC_RECV_PlayerDelete(NetMsg);
133 NET_MSG_PLRDMG: MC_RECV_PlayerDamage(NetMsg);
134 NET_MSG_PLRDIE: MC_RECV_PlayerDeath(NetMsg);
135 NET_MSG_PLRFIRE:MC_RECV_PlayerFire(NetMsg);
136 NET_MSG_PLRSET: MC_RECV_PlayerSettings(NetMsg);
138 NET_MSG_MSPAWN: MC_RECV_MonsterSpawn(NetMsg);
139 NET_MSG_MPOS: MC_RECV_MonsterPos(NetMsg);
140 NET_MSG_MSTATE: MC_RECV_MonsterState(NetMsg);
141 NET_MSG_MSHOT: MC_RECV_MonsterShot(NetMsg);
142 NET_MSG_MDEL: MC_RECV_MonsterDelete(NetMsg);
144 NET_MSG_SHADD: MC_RECV_CreateShot(NetMsg);
145 NET_MSG_SHPOS: MC_RECV_UpdateShot(NetMsg);
146 NET_MSG_SHDEL: MC_RECV_DeleteShot(NetMsg);
148 NET_MSG_ISPAWN: MC_RECV_ItemSpawn(NetMsg);
149 NET_MSG_IDEL: MC_RECV_ItemDestroy(NetMsg);
150 NET_MSG_IPOS: MC_RECV_ItemPos(NetMsg);
152 NET_MSG_PSTATE: MC_RECV_PanelState(NetMsg);
153 NET_MSG_PTEX: MC_RECV_PanelTexture(NetMsg);
155 NET_MSG_TSOUND: MC_RECV_TriggerSound(NetMsg);
156 NET_MSG_TMUSIC: MC_RECV_TriggerMusic(NetMsg);
158 NET_MSG_TIME_SYNC: MC_RECV_TimeSync(NetMsg);
159 NET_MSG_VOTE_EVENT: MC_RECV_VoteEvent(NetMsg);
161 else
162 begin
163 Result := False;
164 g_Console_Add('unknown message ID: ' + IntToStr(MID));
165 end;
166 end;
167 end;
169 function g_Net_ClientLightMsgHandler(NetMsg: TMsg): Boolean;
170 var
171 MID: Byte;
172 Err: Boolean;
173 begin
174 Result := True;
175 Err := False;
176 try
177 MID := NetMsg.ReadByte();
178 except
179 MID := 0;
180 Err := True;
181 end;
183 //if Err then begin MC_MalformedPacket(S); Exit; end;
185 case MID of
186 NET_MSG_GEVENT: MC_RECV_GameEvent(NetMsg);
187 NET_MSG_GSET: MC_RECV_GameSettings(NetMsg);
189 NET_MSG_PLR: if NetState <> NET_STATE_AUTH then MC_RECV_PlayerCreate(NetMsg);
190 NET_MSG_PLRDEL: if NetState <> NET_STATE_AUTH then MC_RECV_PlayerDelete(NetMsg);
192 else Result := False;
193 end;
194 end;
196 function g_Net_HostMsgHandler(S: pTNetClient; NetMsg: TMsg): Boolean;
197 var
198 MID: Byte;
199 Err: Boolean;
200 begin
201 Result := True;
202 Err := False;
203 try
204 MID := NetMsg.ReadByte();
205 except
206 MID := 0;
207 Err := True;
208 end;
210 if Err then begin MH_MalformedPacket(S); Exit; end;
212 case MID of
213 NET_MSG_INFO: MH_RECV_Info(S, NetMsg);
214 NET_MSG_CHAT: MH_RECV_Chat(S, NetMsg);
215 NET_MSG_REQFST: MH_RECV_FullStateRequest(S, NetMsg);
217 NET_MSG_PLRPOS: MH_RECV_PlayerPos(S, NetMsg);
218 NET_MSG_PLRSET: MH_RECV_PlayerSettings(S, NetMsg);
219 NET_MSG_CHEAT: MH_RECV_CheatRequest(S, NetMsg);
221 NET_MSG_RCON_AUTH: MH_RECV_RCONPassword(S, NetMsg);
222 NET_MSG_RCON_CMD: MH_RECV_RCONCommand(S, NetMsg);
224 //NET_MSG_MAP_REQUEST: MH_RECV_MapRequest(S, NetMsg);
225 //NET_MSG_RES_REQUEST: MH_RECV_ResRequest(S, NetMsg);
227 NET_MSG_VOTE_EVENT: MH_RECV_Vote(S, NetMsg);
228 end;
229 end;
231 end.