- Modify color generating codes to only accept numbers and not alphabetical chars anymore

- Fix client clean name so that it cannot be tricked anymore, see https://bugzilla.icculus.org/show_bug.cgi?id=3313
This commit is contained in:
Thilo Schulz 2009-10-03 21:15:23 +00:00
parent 96a3b4b169
commit b433f3d01c
2 changed files with 51 additions and 77 deletions

View file

@ -607,85 +607,59 @@ static void ForceClientSkin( gclient_t *client, char *model, const char *skin )
ClientCheckName ClientCheckName
============ ============
*/ */
static void ClientCleanName( const char *in, char *out, int outSize ) { static void ClientCleanName(const char *in, char *out, int outSize)
int len, colorlessLen; {
char ch; int outpos = 0, colorlessLen = 0, spaces = 0;
char *p;
int spaces;
//save room for trailing null byte // discard leading spaces
outSize--; for(; *in == ' '; in++);
len = 0; for(; *in && outpos < outSize - 1; in++)
colorlessLen = 0; {
p = out; out[outpos] = *in;
*p = 0;
spaces = 0;
while( 1 ) { if(*in == ' ')
ch = *in++; {
if( !ch ) { // don't allow too many consecutive spaces
break; if(spaces > 2)
}
// don't allow leading spaces
if( colorlessLen == 0 && ch == ' ' ) {
continue;
}
// check colors
if( ch == Q_COLOR_ESCAPE ) {
// solo trailing carat is not a color prefix
if( !*in ) {
break;
}
// don't allow black in a name, period
if( ColorIndex(*in) == 0 ) {
in++;
continue; continue;
}
// make sure room in dest for both chars
if( len > outSize - 2 ) {
break;
}
*out++ = ch;
*out++ = *in++;
len += 2;
continue;
}
// don't allow too many consecutive spaces
// don't count spaces in colorlessLen
if( ch == ' ' ) {
spaces++; spaces++;
if( spaces > 3 ) { }
continue; if(outpos > 0 && out[outpos - 1] == Q_COLOR_ESCAPE)
{
if(Q_IsColorString(&out[outpos - 1]))
{
colorlessLen--;
if(*in == COLOR_BLACK)
{
// Disallow color black in names to prevent players
// from getting advantage playing in front of black backgrounds
outpos--;
continue;
}
}
else
{
spaces = 0;
colorlessLen++;
} }
*out++ = ch;
len++;
continue;
} }
else { else
{
spaces = 0; spaces = 0;
colorlessLen++;
} }
if( len > outSize - 1 ) { outpos++;
break;
}
*out++ = ch;
colorlessLen++;
len++;
} }
*out = 0;
out[outpos] = '\0';
// don't allow empty names // don't allow empty names
if( *p == 0 || colorlessLen == 0 ) { if( *out == '\0' || colorlessLen == 0)
Q_strncpyz( p, "UnnamedPlayer", outSize ); Q_strncpyz(out, "UnnamedPlayer", outSize );
}
} }

View file

@ -365,20 +365,20 @@ extern vec4_t colorMdGrey;
extern vec4_t colorDkGrey; extern vec4_t colorDkGrey;
#define Q_COLOR_ESCAPE '^' #define Q_COLOR_ESCAPE '^'
#define Q_IsColorString(p) ( p && *(p) == Q_COLOR_ESCAPE && *((p)+1) && isalnum(*((p)+1)) ) // ^[0-9a-zA-Z] #define Q_IsColorString(p) ((p) && *(p) == Q_COLOR_ESCAPE && *((p)+1) && *((p)+1) >= '0' && *((p)+1) <= '7') // ^[0-9a-zA-Z]
#define COLOR_BLACK '0' #define COLOR_BLACK '0'
#define COLOR_RED '1' #define COLOR_RED '1'
#define COLOR_GREEN '2' #define COLOR_GREEN '2'
#define COLOR_YELLOW '3' #define COLOR_YELLOW '3'
#define COLOR_BLUE '4' #define COLOR_BLUE '4'
#define COLOR_CYAN '5' #define COLOR_CYAN '5'
#define COLOR_MAGENTA '6' #define COLOR_MAGENTA '6'
#define COLOR_WHITE '7' #define COLOR_WHITE '7'
#define ColorIndex(c) ( ( (c) - '0' ) & 7 ) #define ColorIndex(c) ((c) - '0')
#define S_COLOR_BLACK "^0" #define S_COLOR_BLACK "^0"
#define S_COLOR_RED "^1" #define S_COLOR_RED "^1"
#define S_COLOR_GREEN "^2" #define S_COLOR_GREEN "^2"
#define S_COLOR_YELLOW "^3" #define S_COLOR_YELLOW "^3"
#define S_COLOR_BLUE "^4" #define S_COLOR_BLUE "^4"