summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThilo Schulz <arny@ats.s.bawue.de>2011-07-29 13:46:50 +0000
committerTim Angus <tim@ngus.net>2013-01-10 22:55:15 +0000
commit7f1fee44e5cd45cff829951757f5c6460c06cbe8 (patch)
tree1e6f6bcf78ded45a20f2b9e7b0652fbc143a0724 /src
parente7c06719510940898e1f7f8215f4137202611308 (diff)
- 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.
Diffstat (limited to 'src')
-rw-r--r--src/client/cl_main.c77
-rw-r--r--src/qcommon/common.c2
-rw-r--r--src/qcommon/q_shared.h5
-rw-r--r--src/qcommon/qcommon.h2
-rw-r--r--src/server/server.h4
-rw-r--r--src/server/sv_client.c4
-rw-r--r--src/server/sv_init.c3
-rw-r--r--src/server/sv_main.c12
8 files changed, 31 insertions, 78 deletions
diff --git a/src/client/cl_main.c b/src/client/cl_main.c
index b9742649..a10b1444 100644
--- a/src/client/cl_main.c
+++ b/src/client/cl_main.c
@@ -111,8 +111,6 @@ cvar_t *cl_guidServerUniq;
cvar_t *cl_consoleKeys;
-cvar_t *cl_gamename;
-
clientActive_t cl;
clientConnection_t clc;
clientStatic_t cls;
@@ -228,58 +226,6 @@ void CL_UpdateVoipGain(const char *idstr, float gain)
}
}
-/*
-================
-CL_VoipParseTargets
-
-Sets clc.voipTarget{1,2,3} by asking the cgame to produce a string and then
-parsing it as a series of client numbers
-Perhaps it would be better to allow the cgame to set the three integers
-directly, but this way we can change the net protocol without changing the
-vmcall
-================
-*/
-static void CL_VoipParseTargets( void )
-{
- const char *target = cl_voipSendTarget->string;
- intptr_t p = VM_Call( cgvm, CG_VOIP_STRING );
-
- if( p )
- target = VM_ExplicitArgPtr( cgvm, p );
-
- if( !target[ 0 ] || Q_stricmp( target, "all" ) == 0 )
- clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0x7FFFFFFF;
- else if( Q_stricmp( target, "none" ) == 0 )
- clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0;
- else
- {
- char *end;
- int val;
- clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0;
-
- while( 1 )
- {
- while( *target && !isdigit( *target ) )
- target++;
- if( !*target )
- break;
-
- val = strtol( target, &end, 10 );
- assert( target != end );
- if( val < 0 || val >= MAX_CLIENTS )
- Com_Printf( S_COLOR_YELLOW "WARNING: VoIP target %d is not a valid "
- "client number\n", val );
- else if( val < 31 )
- clc.voipTarget1 |= 1 << val;
- else if( ( val -= 31 ) < 31 )
- clc.voipTarget2 |= 1 << val;
- else if( ( val -= 31 ) < 31 )
- clc.voipTarget3 |= 1 << val;
- target = end;
- }
- }
-}
-
void CL_Voip_f( void )
{
const char *cmd = Cmd_Argv(1);
@@ -2369,9 +2315,9 @@ void CL_CheckForResend( void ) {
// requesting a challenge
// 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;
@@ -3597,8 +3543,6 @@ void CL_Init( void ) {
// ~ 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", Sys_GetCurrentUser( ), CVAR_USERINFO | CVAR_ARCHIVE );
Cvar_Get ("rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE );
@@ -3812,9 +3756,19 @@ void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) {
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" ) );
if ( prot != PROTOCOL_VERSION ) {
@@ -4185,16 +4139,17 @@ void CL_GlobalServers_f( void ) {
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++)
{
diff --git a/src/qcommon/common.c b/src/qcommon/common.c
index 3127dec1..5589b384 100644
--- a/src/qcommon/common.c
+++ b/src/qcommon/common.c
@@ -84,6 +84,7 @@ cvar_t *com_maxfpsUnfocused;
cvar_t *com_minimized;
cvar_t *com_maxfpsMinimized;
cvar_t *com_abnormalExit;
+cvar_t *com_gamename;
cvar_t *com_homepath;
cvar_t *com_busyWait;
@@ -2661,6 +2662,7 @@ void Com_Init( char *commandLine ) {
s = va("%s %s %s", Q3_VERSION, PLATFORM_STRING, __DATE__ );
com_version = Cvar_Get ("version", s, CVAR_ROM | CVAR_SERVERINFO );
Cvar_Get ("protocol", va("%i", PROTOCOL_VERSION), CVAR_SERVERINFO | CVAR_ROM);
+ com_gamename = Cvar_Get("com_gamename", GAMENAME_FOR_MASTER, CVAR_SERVERINFO | CVAR_INIT);
Sys_Init();
diff --git a/src/qcommon/q_shared.h b/src/qcommon/q_shared.h
index 189d1751..51e3b220 100644
--- a/src/qcommon/q_shared.h
+++ b/src/qcommon/q_shared.h
@@ -38,12 +38,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define Q3_VERSION PRODUCT_NAME " " PRODUCT_VERSION
#define GAMENAME_FOR_MASTER "Tremulous"
-#define HEARTBEAT_FOR_MASTER GAMENAME_FOR_MASTER
-#define FLATLINE_FOR_MASTER GAMENAME_FOR_MASTER "dead"
#define HOMEPATH_NAME_UNIX ".tremulous"
#define HOMEPATH_NAME_WIN "Tremulous"
#define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN
+// Heartbeat for dpmaster protocol. You shouldn't change this unless you know what you're doing
+#define HEARTBEAT_FOR_MASTER "DarkPlaces"
+
#define MAX_TEAMNAME 32
#define MAX_MASTER_SERVERS 5 // number of supported master servers
diff --git a/src/qcommon/qcommon.h b/src/qcommon/qcommon.h
index ead93b15..275fb4a5 100644
--- a/src/qcommon/qcommon.h
+++ b/src/qcommon/qcommon.h
@@ -846,6 +846,8 @@ extern cvar_t *sv_paused;
extern cvar_t *cl_packetdelay;
extern cvar_t *sv_packetdelay;
+extern cvar_t *com_gamename;
+
// com_speeds times
extern int time_game;
extern int time_frontend;
diff --git a/src/server/server.h b/src/server/server.h
index de4ecc27..f97782f3 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -281,9 +281,7 @@ extern cvar_t *sv_minPing;
extern cvar_t *sv_maxPing;
extern cvar_t *sv_pure;
extern cvar_t *sv_lanForceRate;
-extern cvar_t *sv_dequeuePeriod;
-extern cvar_t *sv_heartbeat;
-extern cvar_t *sv_flatline;
+extern cvar_t *sv_banFile;
#ifdef USE_VOIP
extern cvar_t *sv_voip;
diff --git a/src/server/sv_client.c b/src/server/sv_client.c
index 094ed98f..f3d190de 100644
--- a/src/server/sv_client.c
+++ b/src/server/sv_client.c
@@ -66,10 +66,10 @@ void SV_GetChallenge(netadr_t from)
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;
}
}
diff --git a/src/server/sv_init.c b/src/server/sv_init.c
index d2326db5..45c87895 100644
--- a/src/server/sv_init.c
+++ b/src/server/sv_init.c
@@ -671,9 +671,6 @@ void SV_Init (void)
sv_killserver = Cvar_Get ("sv_killserver", "0", 0);
sv_mapChecksum = Cvar_Get ("sv_mapChecksum", "", CVAR_ROM);
sv_lanForceRate = Cvar_Get ("sv_lanForceRate", "1", CVAR_ARCHIVE );
- sv_dequeuePeriod = Cvar_Get ("sv_dequeuePeriod", "500", CVAR_ARCHIVE );
- sv_heartbeat = Cvar_Get("sv_heartbeat", HEARTBEAT_FOR_MASTER, CVAR_INIT);
- sv_flatline = Cvar_Get("sv_flatline", FLATLINE_FOR_MASTER, CVAR_INIT);
}
diff --git a/src/server/sv_main.c b/src/server/sv_main.c
index fdd7127b..c6ee8304 100644
--- a/src/server/sv_main.c
+++ b/src/server/sv_main.c
@@ -56,10 +56,7 @@ cvar_t *sv_minPing;
cvar_t *sv_maxPing;
cvar_t *sv_pure;
cvar_t *sv_lanForceRate; // dedicated 1 (LAN) server forces local client rates to 99999 (bug #491)
-cvar_t *sv_dequeuePeriod;
-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
+cvar_t *sv_banFile;
/*
=============================================================================
@@ -323,11 +320,11 @@ Informs all masters that this server is going down
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
@@ -649,6 +646,7 @@ void SVC_Info( netadr_t from ) {
Info_SetValueForKey( infostring, "challenge", Cmd_Argv(1) );
Info_SetValueForKey( infostring, "protocol", va("%i", PROTOCOL_VERSION) );
+ Info_SetValueForKey( infostring, "gamename", com_gamename->string );
Info_SetValueForKey( infostring, "hostname", sv_hostname->string );
Info_SetValueForKey( infostring, "mapname", sv_mapname->string );
Info_SetValueForKey( infostring, "clients", va("%i", count) );
@@ -1137,7 +1135,7 @@ void SV_Frame( int msec ) {
SV_SendClientMessages();
// send a heartbeat to the master if needed
- SV_MasterHeartbeat(sv_heartbeat->string);
+ SV_MasterHeartbeat(HEARTBEAT_FOR_MASTER);
}
/*