diff --git a/source/src/client.cpp b/source/src/client.cpp index c9093728..73d32072 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -70,15 +70,17 @@ COMMANDN(team, newteam, ARG_1STR); COMMANDN(name, newname, ARG_1STR); COMMANDN(skin, newskin, ARG_1INT); +string clientpassword = ""; + void connects(char *servername, char *password) { disconnect(1); // reset state + s_strcpy(clientpassword, password ? password : ""); + ENetAddress address; address.port = CUBE_SERVER_PORT; - addmsg(SV_PWD, "rs", !password ? " " : password); - if(servername) { addserver(servername); @@ -270,6 +272,12 @@ void c2sinfo(dynent *d) // send update to the server packet = enet_packet_create (NULL, MAXTRANS, 0); ucharbuf p(packet->data, packet->dataLength); + if(clientpassword[0]) + { + putint(p, SV_PWD); + sendstring(clientpassword, p); + clientpassword[0] = 0; + }; if(gun_changed) { packet->flags = ENET_PACKET_FLAG_RELIABLE; diff --git a/source/src/server.cpp b/source/src/server.cpp index 87e454d3..3f45e3fa 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -560,12 +560,30 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 client *cl = sender>=0 ? clients[sender] : NULL; int cn = sender, type; + + if(!clients[cn]->isauthed) + { + if(!serverpassword[0]) clients[sender]->isauthed = true; + else if(chan==0) return; + else if(chan!=1 || getint(p)!=SV_PWD) disconnect_client(sender, DISC_WRONGPW); + else + { + getstring(text, p); + if(!strcmp(text, serverpassword)) clients[sender]->isauthed = true; + else disconnect_client(sender, DISC_WRONGPW); + }; + }; + if(packet->flags&ENET_PACKET_FLAG_RELIABLE) reliablemessages = true; #define QUEUE_MSG { while(curmsgmessages.add(p.buf[curmsg++]); } int curmsg; while((curmsg = p.length()) < p.maxlen) switch(type = getint(p)) { + case SV_PWD: + getstring(text, p); + break; + case SV_CDIS: { int n = getint(p); @@ -648,7 +666,6 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 { cn = getint(p); CN_CHECK; - if(serverpassword[0] && !clients[cn]->isauthed) return; loopi(3) clients[cn]->pos[i] = getuint(p); getuint(p); loopi(6) getint(p); @@ -761,13 +778,6 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 break; }; - case SV_PWD: - SENDER_CHECK; - getstring(text, p); - if(!strcmp(text, serverpassword) || !serverpassword[0]) clients[sender]->isauthed = true; - else disconnect_client(sender, DISC_WRONGPW); - break; - case SV_FRAGS: CN_CHECK; cl->score.frags = getint(p); @@ -1035,7 +1045,7 @@ void localconnect() void initserver(bool dedicated, int uprate, char *sdesc, char *ip, char *master, char *passwd, int maxcl, char *maprot, char *masterpwd) // EDIT: AH { - if(passwd) strcpy_s(serverpassword, passwd); + if(passwd) s_strcpy(serverpassword, passwd); maxclients = maxcl ? min(maxcl, MAXCLIENTS) : DEFAULTCLIENTS; servermsinit(master ? master : "masterserver.cubers.net/cgi-bin/actioncube.pl/", sdesc, dedicated);