From 25deee5287ac32aec76898f99aa93f53562e2ba9 Mon Sep 17 00:00:00 2001 From: ac-stef Date: Sat, 20 Feb 2016 20:15:06 +0100 Subject: [PATCH] more versatile disconnect reasons --- source/src/client.cpp | 4 +--- source/src/protocol.cpp | 37 +++++++++++++++++++++++++++++++++++++ source/src/protocol.h | 6 +++++- source/src/protos.h | 3 ++- source/src/server.cpp | 22 ++++++++-------------- source/src/serveractions.h | 6 +++--- source/src/serverchecks.h | 2 +- source/src/tools.h | 1 + 8 files changed, 58 insertions(+), 23 deletions(-) diff --git a/source/src/client.cpp b/source/src/client.cpp index fffa8290..64faedcd 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -164,7 +164,7 @@ void disconnect(int onlyclean, int async) { if(!discmillis) { - enet_peer_disconnect(curpeer, DISC_NONE); + enet_peer_disconnect(curpeer, DISC_BECAUSE); enet_host_flush(clienthost); discmillis = totalmillis; } @@ -629,8 +629,6 @@ void gets2c() // get updates from the server case ENET_EVENT_TYPE_DISCONNECT: { - extern const char *disc_reason(int reason); - if(event.data>=DISC_NUM) event.data = DISC_NONE; if(event.peer==connpeer) { conoutf("\f3could not connect to server"); diff --git a/source/src/protocol.cpp b/source/src/protocol.cpp index 002bac13..977c86d8 100644 --- a/source/src/protocol.cpp +++ b/source/src/protocol.cpp @@ -438,3 +438,40 @@ int msgsizelookup(int msg) return msg >= 0 && msg < SV_NUM ? sizetable[msg] : -1; } +const char *disc_reason(int reason) +{ + static const char *prot[] = { "terminated by enet", "end of packet", "client num", "tag type", "duplicate connection", "overflow", "random", "voodoo", "sync" }, + *refused[] = { "connection refused", "due to ban", "due to blacklisting", "wrong password", "server FULL", "server mastermode is \"private\"" }, + *removed[] = { "removed from server", "failed admin login", "inappropriate nickname", "annoyance limit exceeded", "SPAM", "DOS", "ludicrous speed", "fishslapped", "afk" }, + *kick[] = { "kicked", "banned", "kicked by vote", "banned by vote", "kicked by server operator", "banned by server operator", + "auto kicked - teamkilling", "auto banned - teamkilling", "auto kicked - friendly fire", "auto banned - friendly fire", "auto kick", "auto ban" }; + static string res; + const int prot_n = constarraysize(prot), ref_n = constarraysize(refused), rem_n = constarraysize(removed), kick_n = constarraysize(kick); + if(reason >= DISC_PROTOCOL && reason < DISC_REFUSED) + { // protocol related errors + if(reason < DISC_PROTOCOL + prot_n) return prot[reason]; + else formatstring(res)("network protocol error '%d'", reason); + } + else if(reason >= DISC_REFUSED && reason < DISC_REMOVED) + { // connection refused + if(reason < DISC_REFUSED + ref_n) return refused[reason - DISC_REFUSED]; + else formatstring(res)("connection refused '%d'", reason); + } + else if(reason >= DISC_REMOVED && reason < DISC_KICK) + { // player removed from server + if(reason < DISC_REMOVED + rem_n) return removed[reason - DISC_REMOVED]; + else formatstring(res)("removed from server '%d'", reason); + } + else if(reason >= DISC_KICK && reason < DISC_UNKNOWN) + { // kicks & bans + reason -= DISC_KICK; + if(reason < kick_n) return kick[reason]; + else formatstring(res)("%s '%d'", reason & 1 ? "banned" : "kicked", reason + DISC_KICK); + } + else + { // unknown reasons + formatstring(res)("unknown '%d'", reason); + } + return res; +} + diff --git a/source/src/protocol.h b/source/src/protocol.h index 725fb4c4..cee35f76 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -73,7 +73,11 @@ enum { EDITXY_HEIGHT = 0, EDITXY_TEX, EDITXY_TYPE, EDITXY_VDELTA, EDITXY_EQUALIS #define DNF 100.0f #define DVELF 4.0f -enum { DISC_NONE = 0, DISC_EOP, DISC_CN, DISC_MKICK, DISC_MBAN, DISC_TAGT, DISC_BANREFUSE, DISC_WRONGPW, DISC_SOPLOGINFAIL, DISC_MAXCLIENTS, DISC_MASTERMODE, DISC_AUTOKICK, DISC_AUTOBAN, DISC_DUP, DISC_BADNICK, DISC_OVERFLOW, DISC_ABUSE, DISC_AFK, DISC_FFIRE, DISC_CHEAT, DISC_NUM }; +enum { DISC_PROTOCOL = 0, DISC_EOP, DISC_CN, DISC_TAGT, DISC_DUP, DISC_OVERFLOW, DISC_RANDOM, DISC_VOODOO, DISC_SYNC, // div. protocol errors + DISC_REFUSED = 16, DISC_BANNED, DISC_BLACKLISTED, DISC_WRONGPW, DISC_MAXCLIENTS, DISC_PRIVATE, // connection refused + DISC_REMOVED = 32, DISC_SOPLOGINFAIL, DISC_BADNICK, DISC_ANNOY, DISC_SPAM, DISC_DOS, DISC_SPEEDING, DISC_FISHSLAP, DISC_AFK, // disconnected + DISC_KICK = 48, DISC_BAN, DISC_VOTEKICK, DISC_VOTEBAN, DISC_OPKICK, DISC_OPBAN, DISC_TKKICK, DISC_TKBAN, DISC_FFKICK, DISC_FFBAN, DISC_AUTOKICK, DISC_AUTOBAN, + DISC_UNKNOWN = 99, DISC_BECAUSE }; enum { BAN_NONE = 0, BAN_VOTE, BAN_AUTO, BAN_BLACKLIST, BAN_MASTER }; #define EXT_ACK -1 diff --git a/source/src/protos.h b/source/src/protos.h index a90ac798..85b318b9 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -1060,11 +1060,12 @@ extern char *filtertext(char *dst, const char *src, int flags, int len = sizeof( extern void filterrichtext(char *dst, const char *src, int len = sizeof(string)-1); extern void filterlang(char *d, const char *s); extern void trimtrailingwhitespace(char *s); +extern int msgsizelookup(int msg); +extern const char *disc_reason(int reason); extern string mastername; extern int masterport; extern ENetSocket connectmaster(); extern void serverms(int mode, int numplayers, int minremain, char *smapname, int millis, const ENetAddress &localaddr, int *mnum, int *msend, int *mrec, int *cnum, int *csend, int *crec, int protocol_version, const char *servdesccur, int _interm); -extern int msgsizelookup(int msg); extern const char *genpwdhash(const char *name, const char *pwd, int salt); extern void servermsinit(const char *master, const char *ip, int serverport, bool listen); extern bool serverpickup(int i, int sender); diff --git a/source/src/server.cpp b/source/src/server.cpp index 59128ab5..9ce01588 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -2191,7 +2191,7 @@ void addgban(const char *name) { client &c = *clients[i]; if(c.type!=ST_TCPIP) continue; - if(checkgban(c.peer->address.host)) disconnect_client(c.clientnum, DISC_BANREFUSE); + if(checkgban(c.peer->address.host)) disconnect_client(c.clientnum, DISC_BANNED); } } @@ -2472,12 +2472,6 @@ void senddisconnectedscores(int cn) sendpacket(cn, 1, p.finalize()); } -const char *disc_reason(int reason) -{ - static const char *disc_reasons[] = { "normal", "error - end of packet", "error - client num", "vote-kicked from the server", "vote-banned from the server", "error - tag type", "connection refused - you have been banned from this server", "incorrect password", "unsuccessful administrator login", "the server is FULL - try again later", "servers mastermode is \"private\" - wait until the servers mastermode is \"open\"", "auto-kick - your score dropped below the servers threshold", "auto-ban - your score dropped below the servers threshold", "duplicate connection", "inappropriate nickname", "error - packet flood", "auto-kick - excess spam detected", "auto-kick - inactivity detected", "auto-kick - team killing detected", "auto-kick - abnormal client behavior detected" }; - return reason >= 0 && (size_t)reason < sizeof(disc_reasons)/sizeof(disc_reasons[0]) ? disc_reasons[reason] : "unknown"; -} - void disconnect_client(int n, int reason) { if(!clients.inrange(n) || clients[n]->type!=ST_TCPIP) return; @@ -2854,9 +2848,9 @@ void process(ENetPacket *packet, int sender, int chan) } else disconnect_client(sender, DISC_WRONGPW); } - else if(srvprivate) disconnect_client(sender, DISC_MASTERMODE); + else if(srvprivate) disconnect_client(sender, DISC_PRIVATE); else if(srvfull) disconnect_client(sender, DISC_MAXCLIENTS); - else if(banned) disconnect_client(sender, DISC_BANREFUSE); + else if(banned) disconnect_client(sender, DISC_BANNED); else { cl->isauthed = true; @@ -2952,7 +2946,7 @@ void process(ENetPacket *packet, int sender, int chan) if (canspeech) { sendservmsg("\f3Please do not spam; your message was not delivered.", sender); - if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_ABUSE); + if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_SPAM); } else { @@ -2994,7 +2988,7 @@ void process(ENetPacket *packet, int sender, int chan) if (canspeech) { sendservmsg("\f3Please do not spam; your message was not delivered.", sender); - if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_ABUSE); + if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_SPAM); } else { @@ -3031,7 +3025,7 @@ void process(ENetPacket *packet, int sender, int chan) if (canspeech) { sendservmsg("\f3Please do not spam; your message was not delivered.", sender); - if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_ABUSE); + if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_SPAM); } else { @@ -3148,7 +3142,7 @@ void process(ENetPacket *packet, int sender, int chan) { ++cl->fastprofileupdates; if(cl->fastprofileupdates == 3) sendservmsg("\f3Please do not spam", sender); - if(cl->fastprofileupdates >= 5) { disconnect_client(sender, DISC_ABUSE); break; } + if(cl->fastprofileupdates >= 5) { disconnect_client(sender, DISC_SPAM); break; } } else if(servmillis - cl->lastprofileupdate > 10000) cl->fastprofileupdates = 0; cl->lastprofileupdate = servmillis; @@ -3192,7 +3186,7 @@ void process(ENetPacket *packet, int sender, int chan) { ++cl->fastprofileupdates; if(cl->fastprofileupdates == 3) sendservmsg("\f3Please do not spam", sender); - if(cl->fastprofileupdates >= 5) disconnect_client(sender, DISC_ABUSE); + if(cl->fastprofileupdates >= 5) disconnect_client(sender, DISC_SPAM); } else if(servmillis - cl->lastprofileupdate > 10000) cl->fastprofileupdates = 0; cl->lastprofileupdate = servmillis; diff --git a/source/src/serveractions.h b/source/src/serveractions.h index e9f6c5e6..3d6e904a 100644 --- a/source/src/serveractions.h +++ b/source/src/serveractions.h @@ -30,7 +30,7 @@ void kick_abuser(int cn, int &cmillis, int &count, int limit) if ( count <= 0 ) count = 1; } cmillis = servmillis; - if( count >= limit ) disconnect_client(cn, DISC_ABUSE); + if( count >= limit ) disconnect_client(cn, DISC_SPAM); } struct mapaction : serveraction @@ -188,7 +188,7 @@ struct giveadminaction : playeraction struct kickaction : playeraction { bool wasvalid; - void perform() { disconnect(DISC_MKICK); } + void perform() { disconnect(DISC_VOTEKICK); } virtual bool isvalid() { return wasvalid || playeraction::isvalid(); } kickaction(int cn, char *reason) : playeraction(cn) { @@ -208,7 +208,7 @@ struct banaction : playeraction void perform() { int i = findcnbyaddress(&address); - if(i >= 0) addban(clients[i], DISC_MBAN, BAN_VOTE); + if(i >= 0) addban(clients[i], DISC_VOTEBAN, BAN_VOTE); } virtual bool isvalid() { return wasvalid || playeraction::isvalid(); } banaction(int cn, char *reason) : playeraction(cn) diff --git a/source/src/serverchecks.h b/source/src/serverchecks.h index d263f717..15d3c9e8 100644 --- a/source/src/serverchecks.h +++ b/source/src/serverchecks.h @@ -467,7 +467,7 @@ void check_ffire(client *target, client *actor, int damage) logline(ACLOG_INFO, "[%s] %s %s", actor->hostname, actor->name, "kicked for excessive friendly fire"); defformatstring(msg)("%s %s", actor->name, "kicked for excessive friendly fire"); sendservmsg(msg); - disconnect_client(actor->clientnum, DISC_FFIRE); + disconnect_client(actor->clientnum, DISC_FFKICK); } } diff --git a/source/src/tools.h b/source/src/tools.h index fffc93b2..cd900560 100644 --- a/source/src/tools.h +++ b/source/src/tools.h @@ -66,6 +66,7 @@ inline int iabs(int n) { return labs(n); } #define rnd(x) ((int)(randomMT()&0xFFFFFF)%(x)) #define rndscale(x) (float((randomMT()&0xFFFFFF)*double(x)/double(0xFFFFFF))) #define detrnd(s, x) ((int)(((((uint)(s))*1103515245+12345)>>16)%(x))) +#define constarraysize(x) ((int)(sizeof(x)/sizeof(*x))) #define loop(v,m) for(int v = 0; v