diff --git a/source/src/client.cpp b/source/src/client.cpp index 2a8de28b..c9093728 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -70,12 +70,14 @@ COMMANDN(team, newteam, ARG_1STR); COMMANDN(name, newname, ARG_1STR); COMMANDN(skin, newskin, ARG_1INT); -void connects(char *servername) +void connects(char *servername, char *password) { disconnect(1); // reset state ENetAddress address; address.port = CUBE_SERVER_PORT; + + addmsg(SV_PWD, "rs", !password ? " " : password); if(servername) { @@ -169,7 +171,7 @@ void lanconnect() COMMAND(echo, ARG_VARI); COMMANDN(say, toserver, ARG_VARI); -COMMANDN(connect, connects, ARG_1STR); +COMMANDN(connect, connects, ARG_2STR); COMMAND(lanconnect, ARG_NONE); COMMANDN(disconnect, trydisconnect, ARG_NONE); @@ -214,16 +216,10 @@ void addmsg(int type, const char *fmt, ...) int lastupdate = 0, lastping = 0; bool senditemstoserver = false; // after a map change, since server doesn't have map data -bool sendpwd = false; -string clientpassword; -void password(char *p) { s_strcpy(clientpassword, p); }; -COMMAND(password, ARG_1STR); - bool netmapstart() { senditemstoserver = true; return clienthost!=NULL; }; void initclientnet() { - clientpassword[0] = 0; newname("unnamed"); ctf_team("cube"); }; @@ -250,15 +246,6 @@ void c2sinfo(dynent *d) // send update to the server ENetPacket *packet = enet_packet_create(NULL, 100, 0); ucharbuf q(packet->data, packet->dataLength); - if(sendpwd && clientpassword[0]) - { - packet->flags = ENET_PACKET_FLAG_RELIABLE; - putint(q, SV_PWD); - sendstring(clientpassword, q); - clientpassword[0] = 0; // avoid sending pwd to other servers on connect - sendpwd = false; - }; - putint(q, SV_POS); putint(q, clientnum); putuint(q, (int)(d->o.x*DMF)); // quantize coordinates to 1/16th of a cube, between 1 and 3 bytes diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 10ea3910..4e9b9243 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -112,11 +112,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) }; clientnum = mycn; // we are now fully connected bool firstplayer = !getint(p); - if(getint(p) > 0) - { - conoutf("INFO: this server is password protected"); - sendpwd = true; - }; + if(getint(p) > 0) conoutf("INFO: this server is password protected"); if(firstplayer && getclientmap()[0]) changemap(getclientmap()); // we are the first client on this server, set map break; }; diff --git a/source/src/protos.h b/source/src/protos.h index 3e247800..b44e9681 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -69,7 +69,7 @@ extern void setarraypointers(); // client extern void localservertoclient(int chan, uchar *buf, int len); -extern void connects(char *servername); +extern void connects(char *servername, char *password = NULL); extern void disconnect(int onlyclean = 0, int async = 0); extern void toserver(char *text); extern void addmsg(int type, const char *fmt = NULL, ...); diff --git a/source/src/server.cpp b/source/src/server.cpp index 61fb5d13..87e454d3 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -238,7 +238,7 @@ void restoreserverstate(vector &ents) // hack: called from savegame co int interm = 0, minremain = 0, mapend = 0; bool mapreload = false; -char *serverpassword; +string serverpassword = ""; bool isdedicated; ENetHost *serverhost = NULL; @@ -560,19 +560,6 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 client *cl = sender>=0 ? clients[sender] : NULL; int cn = sender, type; - if(serverpassword[0] && sender>=0 && sender<=clients.length() && !clients[sender]->isauthed) - { - int msg = getint(p); - getstring(text, p); - if(msg != SV_PWD || !text[0] || strcmp(text, serverpassword)) disconnect_client(sender, DISC_WRONGPW); - else - { - clients[sender]->isauthed = true; - sendmapinfo(sender); - }; - return; - }; - if(packet->flags&ENET_PACKET_FLAG_RELIABLE) reliablemessages = true; #define QUEUE_MSG { while(curmsgmessages.add(p.buf[curmsg++]); } @@ -661,6 +648,7 @@ 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); @@ -774,7 +762,10 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 }; 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: @@ -1044,7 +1035,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 { - serverpassword = passwd; + if(passwd) strcpy_s(serverpassword, passwd); maxclients = maxcl ? min(maxcl, MAXCLIENTS) : DEFAULTCLIENTS; servermsinit(master ? master : "masterserver.cubers.net/cgi-bin/actioncube.pl/", sdesc, dedicated);