[quake3-commits] r2105 - in trunk: . code/client code/qcommon code/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Jul 29 09:46:51 EDT 2011


Author: thilo
Date: 2011-07-29 09:46:50 -0400 (Fri, 29 Jul 2011)
New Revision: 2105

Modified:
   trunk/README
   trunk/code/client/cl_main.c
   trunk/code/qcommon/common.c
   trunk/code/qcommon/q_shared.h
   trunk/code/qcommon/qcommon.h
   trunk/code/server/server.h
   trunk/code/server/sv_client.c
   trunk/code/server/sv_init.c
   trunk/code/server/sv_main.c
Log:
- Switch master server protocol to dpmaster for better game separation. Based partly on patch by Zack Middleton
- Get rid of ugly cvars sv_heartbeat and cl_gamename and replace with single com_gamename
- Remove sv_flatline. Flatlines are ignored by dpmaster and are considered to be insecure because flatlines can be udp-spoofed.


Modified: trunk/README
===================================================================
--- trunk/README	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/README	2011-07-29 13:46:50 UTC (rev 2105)
@@ -120,8 +120,6 @@
   cl_mouseAccelStyle                - Set to 1 for QuakeLive mouse acceleration
                                       behaviour, 0 for standard q3
   cl_mouseAccelOffset               - Tuning the acceleration curve, see below
-  cl_gamename                       - Gamename sent to master server in
-                                      getserversExt query
 
   in_joystickUseAnalog              - Do not translate joystick axis events
                                       to keyboard commands
@@ -197,6 +195,10 @@
                                       through which other processes can control
                                       the server while it is running. 
                                       Nonfunctional on Windows.
+  com_gamename                      - Gamename sent to master server in
+                                      getservers[Ext] query and infoResponse
+                                      "gamename" infostring value. Also used
+                                      for filtering local network games.
   com_protocol                      - Specify protocol version number for
                                       current ioquake3 protocol, see
                                       "Network protocols" section below
@@ -210,9 +212,6 @@
                                       holds custom pk3 files for your server
   sv_banFile                        - Name of the file that is used for storing
                                       the server bans
-  sv_heartbeat                      - Heartbeat string sent to master server
-  sv_flatline                       - Heartbeat string sent to master server
-                                      when server is killed
 
   net_ip6                           - IPv6 address to bind to
   net_port6                         - port to bind to using the ipv6 address
@@ -527,25 +526,18 @@
   
     +set com_homepath <homedirname>
   
-  to the command line. You can also control which kind of messages to send to
-  the master server:
+  to the command line. You can also control which game name to use when talking
+  to the master server:
   
-    +set sv_heartbeat <heartbeat> +set sv_flatline <flatline>
-    +set cl_gamename <gamename>
+    +set com_gamename <gamename>
   
-  The <heartbeat> and <flatline> message can be specific to your game. The
-  flatline message is sent to signal the master server that the game server is
-  quitting. Vanilla quake3 uses "QuakeArena-1" both for the heartbeat and
-  flatline messages.
-  The cl_gamename message is for dpmaster to specify which game the client
-  wants a server list for. It is only used in the new ipv6 based getServersExt
-  query.
+  So clients requesting a server list will only receive servers that have a
+  matching game name.
   
   Example line:
   
     +set com_basegame basefoo +set com_homepath .foo
-    +set sv_heartbeat fooalive +set sv_flatline foodead
-    +set cl_gamename foo
+    +set com_gamename foo
 
 
   If you really changed parts that would make vanilla ioquake3 incompatible with

Modified: trunk/code/client/cl_main.c
===================================================================
--- trunk/code/client/cl_main.c	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/client/cl_main.c	2011-07-29 13:46:50 UTC (rev 2105)
@@ -109,8 +109,6 @@
 
 cvar_t	*cl_consoleKeys;
 
-cvar_t  *cl_gamename;
-
 clientActive_t		cl;
 clientConnection_t	clc;
 clientStatic_t		cls;
@@ -2306,9 +2304,9 @@
 #endif
 
 		// The challenge request shall be followed by a client challenge so no malicious server can hijack this connection.
-		// Add the heartbeat gamename so the server knows we're running the correct game and can reject the client
+		// Add the gamename so the server knows we're running the correct game or can reject the client
 		// with a meaningful message
-		Com_sprintf(data, sizeof(data), "getchallenge %d %s", clc.challenge, Cvar_VariableString("sv_heartbeat"));
+		Com_sprintf(data, sizeof(data), "getchallenge %d %s", clc.challenge, com_gamename->string);
 
 		NET_OutOfBandPrint(NS_CLIENT, clc.serverAddress, "%s", data);
 		break;
@@ -3472,8 +3470,6 @@
 	// ~ and `, as keys and characters
 	cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE);
 
-	cl_gamename = Cvar_Get("cl_gamename", GAMENAME_FOR_MASTER, CVAR_TEMP);
-
 	// userinfo
 	Cvar_Get ("name", "UnnamedPlayer", CVAR_USERINFO | CVAR_ARCHIVE );
 	Cvar_Get ("rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE );
@@ -3696,9 +3692,19 @@
 	char	info[MAX_INFO_STRING];
 	char	*infoString;
 	int		prot;
+	char	*gamename;
 
 	infoString = MSG_ReadString( msg );
 
+	// if this isn't the correct gamename, ignore it
+	gamename = Info_ValueForKey( infoString, "gamename" );
+
+	if (gamename && *gamename && strcmp(gamename, com_gamename->string))
+	{
+		Com_DPrintf( "Game mismatch in info packet: %s\n", infoString );
+		return;
+	}
+
 	// if this isn't the correct protocol version, ignore it
 	prot = atoi( Info_ValueForKey( infoString, "protocol" ) );
 
@@ -4078,16 +4084,17 @@
 		if(v4enabled)
 		{
 			Com_sprintf(command, sizeof(command), "getserversExt %s %s",
-				cl_gamename->string, Cmd_Argv(2));
+				com_gamename->string, Cmd_Argv(2));
 		}
 		else
 		{
 			Com_sprintf(command, sizeof(command), "getserversExt %s %s ipv6",
-				cl_gamename->string, Cmd_Argv(2));
+				com_gamename->string, Cmd_Argv(2));
 		}
 	}
 	else
-		Com_sprintf(command, sizeof(command), "getservers %s", Cmd_Argv(2));
+		Com_sprintf(command, sizeof(command), "getservers %s %s",
+			com_gamename->string, Cmd_Argv(2));
 
 	for (i=3; i < count; i++)
 	{

Modified: trunk/code/qcommon/common.c
===================================================================
--- trunk/code/qcommon/common.c	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/qcommon/common.c	2011-07-29 13:46:50 UTC (rev 2105)
@@ -85,6 +85,7 @@
 cvar_t	*com_maxfpsMinimized;
 cvar_t	*com_abnormalExit;
 cvar_t	*com_standalone;
+cvar_t	*com_gamename;
 cvar_t	*com_protocol;
 #ifdef LEGACY_PROTOCOL
 cvar_t	*com_legacyprotocol;
@@ -2793,6 +2794,7 @@
 
 	s = va("%s %s %s", Q3_VERSION, PLATFORM_STRING, __DATE__ );
 	com_version = Cvar_Get ("version", s, CVAR_ROM | CVAR_SERVERINFO );
+	com_gamename = Cvar_Get("com_gamename", GAMENAME_FOR_MASTER, CVAR_SERVERINFO | CVAR_INIT);
 	com_protocol = Cvar_Get("com_protocol", va("%i", PROTOCOL_VERSION), CVAR_SERVERINFO | CVAR_INIT);
 #ifdef LEGACY_PROTOCOL
 	com_legacyprotocol = Cvar_Get("com_legacyprotocol", va("%i", PROTOCOL_LEGACY_VERSION), CVAR_INIT);

Modified: trunk/code/qcommon/q_shared.h
===================================================================
--- trunk/code/qcommon/q_shared.h	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/qcommon/q_shared.h	2011-07-29 13:46:50 UTC (rev 2105)
@@ -31,27 +31,26 @@
   #define BASEGAME			"foobar"
   #define CLIENT_WINDOW_TITLE     	"changeme"
   #define CLIENT_WINDOW_MIN_TITLE 	"changeme2"
-  #define GAMENAME_FOR_MASTER		"iofoo3"		// must NOT contain whitespaces
-  #define HEARTBEAT_FOR_MASTER		GAMENAME_FOR_MASTER
-  #define FLATLINE_FOR_MASTER		GAMENAME_FOR_MASTER "dead"
   #define HOMEPATH_NAME_UNIX		".foo"
   #define HOMEPATH_NAME_WIN		"FooBar"
   #define HOMEPATH_NAME_MACOSX		HOMEPATH_NAME_WIN
+  #define GAMENAME_FOR_MASTER		"foobar"	// must NOT contain whitespace
 //  #define LEGACY_PROTOCOL	// You probably don't need this for your standalone game
 #else
   #define PRODUCT_NAME			"ioq3"
   #define BASEGAME			"baseq3"
   #define CLIENT_WINDOW_TITLE     	"ioquake3"
   #define CLIENT_WINDOW_MIN_TITLE 	"ioq3"
-  #define GAMENAME_FOR_MASTER		"Quake3Arena"
-  #define HEARTBEAT_FOR_MASTER		"QuakeArena-1"
-  #define FLATLINE_FOR_MASTER		HEARTBEAT_FOR_MASTER
   #define HOMEPATH_NAME_UNIX		".q3a"
   #define HOMEPATH_NAME_WIN		"Quake3"
   #define HOMEPATH_NAME_MACOSX		HOMEPATH_NAME_WIN
+  #define GAMENAME_FOR_MASTER		"Quake3Arena"
   #define LEGACY_PROTOCOL
 #endif
 
+// Heartbeat for dpmaster protocol. You shouldn't change this unless you know what you're doing
+#define HEARTBEAT_FOR_MASTER		"DarkPlaces"
+
 #define BASETA				"missionpack"
 
 #ifndef PRODUCT_VERSION

Modified: trunk/code/qcommon/qcommon.h
===================================================================
--- trunk/code/qcommon/qcommon.h	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/qcommon/qcommon.h	2011-07-29 13:46:50 UTC (rev 2105)
@@ -870,6 +870,7 @@
 extern	cvar_t	*cl_packetdelay;
 extern	cvar_t	*sv_packetdelay;
 
+extern	cvar_t	*com_gamename;
 extern	cvar_t	*com_protocol;
 #ifdef LEGACY_PROTOCOL
 extern	cvar_t	*com_legacyprotocol;

Modified: trunk/code/server/server.h
===================================================================
--- trunk/code/server/server.h	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/server/server.h	2011-07-29 13:46:50 UTC (rev 2105)
@@ -294,8 +294,6 @@
 extern	cvar_t	*sv_strictAuth;
 #endif
 extern	cvar_t	*sv_banFile;
-extern	cvar_t	*sv_heartbeat;
-extern	cvar_t	*sv_flatline;
 
 extern	serverBan_t serverBans[SERVER_MAXBANS];
 extern	int serverBansCount;

Modified: trunk/code/server/sv_client.c
===================================================================
--- trunk/code/server/sv_client.c	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/server/sv_client.c	2011-07-29 13:46:50 UTC (rev 2105)
@@ -70,10 +70,10 @@
 	if(gameName && *gameName)
 	{
 		// reject client if the heartbeat string sent by the client doesn't match ours
-		if(strcmp(gameName, sv_heartbeat->string))
+		if(strcmp(gameName, com_gamename->string))
 		{
  			NET_OutOfBandPrint(NS_SERVER, from, "print\nGame mismatch: This is a %s server\n",
- 				sv_heartbeat->string);
+ 				com_gamename->string);
 			return;
 		}
 	}

Modified: trunk/code/server/sv_init.c
===================================================================
--- trunk/code/server/sv_init.c	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/server/sv_init.c	2011-07-29 13:46:50 UTC (rev 2105)
@@ -686,8 +686,6 @@
 	sv_strictAuth = Cvar_Get ("sv_strictAuth", "1", CVAR_ARCHIVE );
 #endif
 	sv_banFile = Cvar_Get("sv_banFile", "serverbans.dat", CVAR_ARCHIVE);
-	sv_heartbeat = Cvar_Get("sv_heartbeat", HEARTBEAT_FOR_MASTER, CVAR_INIT);
-	sv_flatline = Cvar_Get("sv_flatline", FLATLINE_FOR_MASTER, CVAR_INIT);
 
 	// initialize bot cvars so they are listed and can be set before loading the botlib
 	SV_BotInitCvars();

Modified: trunk/code/server/sv_main.c
===================================================================
--- trunk/code/server/sv_main.c	2011-07-29 12:27:00 UTC (rev 2104)
+++ trunk/code/server/sv_main.c	2011-07-29 13:46:50 UTC (rev 2105)
@@ -61,9 +61,6 @@
 cvar_t	*sv_strictAuth;
 #endif
 cvar_t	*sv_banFile;
-cvar_t  *sv_heartbeat;			// Heartbeat string that is sent to the master
-cvar_t  *sv_flatline;			// If the master server supports it we can send a flatline
-					// when server is killed
 
 serverBan_t serverBans[SERVER_MAXBANS];
 int serverBansCount = 0;
@@ -338,11 +335,11 @@
 void SV_MasterShutdown( void ) {
 	// send a hearbeat right now
 	svs.nextHeartbeatTime = -9999;
-	SV_MasterHeartbeat(sv_flatline->string);
+	SV_MasterHeartbeat(HEARTBEAT_FOR_MASTER);
 
 	// send it again to minimize chance of drops
 	svs.nextHeartbeatTime = -9999;
-	SV_MasterHeartbeat(sv_flatline->string);
+	SV_MasterHeartbeat(HEARTBEAT_FOR_MASTER);
 
 	// when the master tries to poll the server, it won't respond, so
 	// it will be removed from the list
@@ -644,6 +641,8 @@
 	// to prevent timed spoofed reply packets that add ghost servers
 	Info_SetValueForKey( infostring, "challenge", Cmd_Argv(1) );
 
+	Info_SetValueForKey( infostring, "gamename", com_gamename->string );
+
 #ifdef LEGACY_PROTOCOL
 	if(com_legacyprotocol->integer > 0)
 		Info_SetValueForKey(infostring, "protocol", va("%i", com_legacyprotocol->integer));
@@ -1154,7 +1153,7 @@
 	SV_SendClientMessages();
 
 	// send a heartbeat to the master if needed
-	SV_MasterHeartbeat(sv_heartbeat->string);
+	SV_MasterHeartbeat(HEARTBEAT_FOR_MASTER);
 }
 
 /*



More information about the quake3-commits mailing list