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(curmsg