summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/char/char.c26
-rw-r--r--src/char_sql/char.c20
-rw-r--r--src/login/login.c29
-rw-r--r--src/login_sql/login.c29
-rw-r--r--src/map/clif.c19
5 files changed, 75 insertions, 48 deletions
diff --git a/src/char/char.c b/src/char/char.c
index ae0c8593e..76dad5203 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -2345,7 +2345,7 @@ int parse_fromlogin(int fd)
{
WFIFOHEAD(i,3);
WFIFOW(i,0) = 0x81;
- WFIFOB(i,2) = 2;
+ WFIFOB(i,2) = 2; // "Someone has already logged in with this id"
WFIFOSET(i,3);
break;
}
@@ -3257,12 +3257,18 @@ int parse_char(int fd)
{
// request to connect
+ // 0065 <account id>.L <login id1>.L <login id2>.L <???>.W <sex>.B
case 0x65:
if (RFIFOREST(fd) < 17)
return 0;
{
+ int account_id = RFIFOL(fd,2);
+ int login_id1 = RFIFOL(fd,6);
+ int login_id2 = RFIFOL(fd,10);
+ int sex = RFIFOB(fd,16);
+
int GM_value;
- ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", account_id, login_id1, login_id2);
if (sd) {
//Received again auth packet for already authentified account?? Discard it.
@@ -3271,24 +3277,24 @@ int parse_char(int fd)
RFIFOSKIP(fd,17);
break;
}
- if ((GM_value = isGM(RFIFOL(fd,2))))
- ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
+ if( (GM_value = isGM(account_id)) != 0 )
+ ShowInfo("Account Logged On; Account ID: %d (GM level %d).\n", account_id, GM_value);
else
- ShowInfo("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
+ ShowInfo("Account Logged On; Account ID: %d.\n", account_id);
CREATE(session[fd]->session_data, struct char_session_data, 1);
sd = (struct char_session_data*)session[fd]->session_data;
strncpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
sd->connect_until_time = 0; // unknown or unlimited (not displaying on map-server)
- sd->account_id = RFIFOL(fd,2);
- sd->login_id1 = RFIFOL(fd,6);
- sd->login_id2 = RFIFOL(fd,10);
- sd->sex = RFIFOB(fd,16);
+ sd->account_id = account_id;
+ sd->login_id1 = login_id1;
+ sd->login_id2 = login_id2;
+ sd->sex = sex;
sd->auth = false; // not authed yet
// send back account_id
WFIFOHEAD(fd,4);
- WFIFOL(fd,0) = RFIFOL(fd,2);
+ WFIFOL(fd,0) = account_id;
WFIFOSET(fd,4);
// search authentification
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 73907cf22..9112265da 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -1943,7 +1943,7 @@ int parse_fromlogin(int fd)
{
WFIFOHEAD(i,3);
WFIFOW(i,0) = 0x81;
- WFIFOB(i,2) = 2;
+ WFIFOB(i,2) = 2; // "Someone has already logged in with this id"
WFIFOSET(i,3);
}
else //Shouldn't happen, but just in case.
@@ -2871,11 +2871,17 @@ int parse_char(int fd)
{
// request to connect
+ // 0065 <account id>.L <login id1>.L <login id2>.L <???>.W <sex>.B
case 0x65:
if (RFIFOREST(fd) < 17)
return 0;
{
- ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ int account_id = RFIFOL(fd,2);
+ int login_id1 = RFIFOL(fd,6);
+ int login_id2 = RFIFOL(fd,10);
+ int sex = RFIFOB(fd,16);
+
+ ShowInfo("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", account_id, login_id1, login_id2);
if (sd) {
//Received again auth packet for already authentified account?? Discard it.
//TODO: Perhaps log this as a hack attempt?
@@ -2887,15 +2893,15 @@ int parse_char(int fd)
CREATE(session[fd]->session_data, struct char_session_data, 1);
sd = (struct char_session_data*)session[fd]->session_data;
sd->connect_until_time = 0; // unknown or unlimited (not displaying on map-server)
- sd->account_id = RFIFOL(fd,2);
- sd->login_id1 = RFIFOL(fd,6);
- sd->login_id2 = RFIFOL(fd,10);
- sd->sex = RFIFOB(fd,16);
+ sd->account_id = account_id;
+ sd->login_id1 = login_id1;
+ sd->login_id2 = login_id2;
+ sd->sex = sex;
sd->auth = false; // not authed yet
// send back account_id
WFIFOHEAD(fd,4);
- WFIFOL(fd,0) = RFIFOL(fd,2);
+ WFIFOL(fd,0) = account_id;
WFIFOSET(fd,4);
// search authentification
diff --git a/src/login/login.c b/src/login/login.c
index 02c6cbd38..2931c87cb 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -1151,17 +1151,22 @@ int mmo_auth(struct mmo_account* account, int fd)
if( login_config.online_check )
{
struct online_login_data* data = idb_get(online_db,auth_dat[i].account_id);
- if( data && data->char_server > -1 )
- {
- //Request char servers to kick this account out. [Skotlex]
- uint8 buf[8];
- ShowNotice("User '%s' is already online - Rejected.\n", auth_dat[i].userid);
- WBUFW(buf,0) = 0x2734;
- WBUFL(buf,2) = auth_dat[i].account_id;
- charif_sendallwos(-1, buf, 6);
- if( data->waiting_disconnect == -1 )
- data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, auth_dat[i].account_id, 0);
- return 3; // Rejected
+ if( data )
+ {// account is already marked as online!
+ if( data->char_server > -1 )
+ {
+ //Request char servers to kick this account out. [Skotlex]
+ uint8 buf[8];
+ ShowNotice("User '%s' is already online - Rejected.\n", auth_dat[i].userid);
+ WBUFW(buf,0) = 0x2734;
+ WBUFL(buf,2) = auth_dat[i].account_id;
+ charif_sendallwos(-1, buf, 6);
+ if( data->waiting_disconnect == -1 )
+ data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, auth_dat[i].account_id, 0);
+ return 3; // Rejected
+ }
+ else
+ ; // the client disconnects after doing auth, so can't really kick it... need some form of expiration timer
}
}
@@ -1274,7 +1279,7 @@ int parse_fromchar(int fd)
auth_fifo[i].login_id2 == login_id2 &&
auth_fifo[i].sex == sex &&
auth_fifo[i].ip == ip_ &&
- !auth_fifo[i].delflag );
+ auth_fifo[i].delflag == 0 );
if( i == AUTH_FIFO_SIZE || account_id <= 0 )
{// authentication not found
diff --git a/src/login_sql/login.c b/src/login_sql/login.c
index f4a40c990..fddb4b248 100644
--- a/src/login_sql/login.c
+++ b/src/login_sql/login.c
@@ -553,17 +553,22 @@ int mmo_auth(struct mmo_account* account, int fd)
if( login_config.online_check )
{
struct online_login_data* data = idb_get(online_db, account->account_id);
- if( data && data->char_server > -1 )
- {
- //Request char servers to kick this account out. [Skotlex]
- uint8 buf[8];
- ShowNotice("User '%s' is already online - Rejected.\n", account->userid);
- WBUFW(buf,0) = 0x2734;
- WBUFL(buf,2) = account->account_id;
- charif_sendallwos(-1, buf, 6);
- if( data->waiting_disconnect == -1 )
- data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, account->account_id, 0);
- return 3; // Rejected
+ if( data )
+ {// account is already marked as online!
+ if( data->char_server > -1 )
+ {// Request char servers to kick this account out. [Skotlex]
+ uint8 buf[8];
+ ShowNotice("User '%s' is already online - Rejected.\n", account->userid);
+ WBUFW(buf,0) = 0x2734;
+ WBUFL(buf,2) = account->account_id;
+ charif_sendallwos(-1, buf, 6);
+ if( data->waiting_disconnect == -1 )
+ data->waiting_disconnect = add_timer(gettick()+30000, waiting_disconnect_timer, account->account_id, 0);
+ return 3; // Rejected
+ }
+ else
+ ; // the client disconnects after doing auth, so can't really kick it... need some form of expiration timer
+
}
}
@@ -667,7 +672,7 @@ int parse_fromchar(int fd)
auth_fifo[i].login_id2 == login_id2 &&
auth_fifo[i].sex == sex &&
auth_fifo[i].ip == ip_ &&
- !auth_fifo[i].delflag );
+ auth_fifo[i].delflag == 0 );
if( i == AUTH_FIFO_SIZE || account_id <= 0 )
{// authentication not found
diff --git a/src/map/clif.c b/src/map/clif.c
index ea2270024..e3809ded9 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -12065,16 +12065,21 @@ void clif_parse_Adopt_request(int fd, struct map_session_data *sd)
void clif_parse_Adopt_reply(int fd, struct map_session_data *sd)
{
- struct map_session_data *p1_sd = map_id2sd(RFIFOL(fd,2)), *p2_sd = map_id2sd(RFIFOL(fd,6));
- int result = RFIFOL(fd,10), pid = sd->adopt_invite;
+ int p1_id = RFIFOL(fd,2);
+ int p2_id = RFIFOL(fd,6);
+ int result = RFIFOL(fd,10);
+ struct map_session_data* p1_sd = map_id2sd(p1_id);
+ struct map_session_data* p2_sd = map_id2sd(p2_id);
+ int pid = sd->adopt_invite;
sd->adopt_invite = 0;
- if( !p1_sd )
- return; // Parent is not online
-
- if( pid != p1_sd->status.account_id || !result )
- return; // Not the same sender | Reply No
+ if( p1_sd == NULL || p2_sd == NULL )
+ return; // Both players need to be online
+ if( pid != p1_sd->status.account_id || p2_id != p1_sd->status.partner_id )
+ return; // Incorrect values
+ if( result == 0 )
+ return; // Rejected
pc_adoption(p1_sd, p2_sd, sd);
}