Synced some more :)
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11249 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
834d702dd1
commit
dddcafda2a
@ -66,7 +66,7 @@ struct gm_account* gm_account_db = NULL;
|
|||||||
unsigned int GM_num = 0; // number of gm accounts
|
unsigned int GM_num = 0; // number of gm accounts
|
||||||
unsigned int GM_max = 0;
|
unsigned int GM_max = 0;
|
||||||
|
|
||||||
//Account flood protection [Kevin]
|
//Account registration flood protection [Kevin]
|
||||||
int allowed_regs = 1;
|
int allowed_regs = 1;
|
||||||
int time_allowed = 10; //in seconds
|
int time_allowed = 10; //in seconds
|
||||||
unsigned int new_reg_tick = 0;
|
unsigned int new_reg_tick = 0;
|
||||||
@ -1054,7 +1054,8 @@ int check_GM_file(int tid, unsigned int tick, int id, int data)
|
|||||||
bool check_encrypted(const char* str1, const char* str2, const char* passwd)
|
bool check_encrypted(const char* str1, const char* str2, const char* passwd)
|
||||||
{
|
{
|
||||||
char md5str[64], md5bin[32];
|
char md5str[64], md5bin[32];
|
||||||
snprintf(md5str, sizeof(md5str), "%s%s", str1, str2); md5str[sizeof(md5str)-1] = '\0';
|
snprintf(md5str, sizeof(md5str), "%s%s", str1, str2);
|
||||||
|
md5str[sizeof(md5str)-1] = '\0';
|
||||||
MD5_String2binary(md5str, md5bin);
|
MD5_String2binary(md5str, md5bin);
|
||||||
|
|
||||||
return (0==memcmp(passwd, md5bin, 16));
|
return (0==memcmp(passwd, md5bin, 16));
|
||||||
@ -1079,7 +1080,7 @@ bool check_password(struct login_session_data* ld, int passwdenc, const char* pa
|
|||||||
|
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
// Account creation (with e-mail check)
|
// Make new account
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
int mmo_auth_new(struct mmo_account* account, char sex, char* email)
|
int mmo_auth_new(struct mmo_account* account, char sex, char* email)
|
||||||
{
|
{
|
||||||
@ -1146,7 +1147,7 @@ int mmo_auth(struct mmo_account* account, int fd)
|
|||||||
|
|
||||||
char ip[16];
|
char ip[16];
|
||||||
uint8* sin_addr = (uint8*)&session[fd]->client_addr;
|
uint8* sin_addr = (uint8*)&session[fd]->client_addr;
|
||||||
sprintf(ip, "%d.%d.%d.%d", sin_addr[3], sin_addr[2], sin_addr[1], sin_addr[0]);
|
sprintf(ip, "%u.%u.%u.%u", sin_addr[3], sin_addr[2], sin_addr[1], sin_addr[0]);
|
||||||
|
|
||||||
// DNS Blacklist check
|
// DNS Blacklist check
|
||||||
if( login_config.use_dnsbl )
|
if( login_config.use_dnsbl )
|
||||||
@ -1156,7 +1157,7 @@ int mmo_auth(struct mmo_account* account, int fd)
|
|||||||
char* dnsbl_serv;
|
char* dnsbl_serv;
|
||||||
bool matched = false;
|
bool matched = false;
|
||||||
|
|
||||||
sprintf(r_ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
|
sprintf(r_ip, "%u.%u.%u.%u", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
|
||||||
|
|
||||||
for( dnsbl_serv = strtok(login_config.dnsbl_servs,","); !matched && dnsbl_serv != NULL; dnsbl_serv = strtok(NULL,",") )
|
for( dnsbl_serv = strtok(login_config.dnsbl_servs,","); !matched && dnsbl_serv != NULL; dnsbl_serv = strtok(NULL,",") )
|
||||||
{
|
{
|
||||||
@ -1351,16 +1352,18 @@ int mmo_auth(struct mmo_account* account, int fd)
|
|||||||
|
|
||||||
static int online_db_setoffline(DBKey key, void* data, va_list ap)
|
static int online_db_setoffline(DBKey key, void* data, va_list ap)
|
||||||
{
|
{
|
||||||
struct online_login_data *p = (struct online_login_data *)data;
|
struct online_login_data* p = (struct online_login_data*)data;
|
||||||
int server = va_arg(ap, int);
|
int server = va_arg(ap, int);
|
||||||
if (server == -1) {
|
if( server == -1 )
|
||||||
|
{
|
||||||
p->char_server = -1;
|
p->char_server = -1;
|
||||||
if (p->waiting_disconnect != -1)
|
if( p->waiting_disconnect != -1 )
|
||||||
{
|
{
|
||||||
delete_timer(p->waiting_disconnect, waiting_disconnect_timer);
|
delete_timer(p->waiting_disconnect, waiting_disconnect_timer);
|
||||||
p->waiting_disconnect = -1;
|
p->waiting_disconnect = -1;
|
||||||
}
|
}
|
||||||
} else if (p->char_server == server)
|
}
|
||||||
|
else if( p->char_server == server )
|
||||||
p->char_server = -2; //Char server disconnected.
|
p->char_server = -2; //Char server disconnected.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1377,33 +1380,33 @@ int parse_fromchar(int fd)
|
|||||||
char ip[16];
|
char ip[16];
|
||||||
ip2str(ipl, ip);
|
ip2str(ipl, ip);
|
||||||
|
|
||||||
for(id = 0; id < MAX_SERVERS; id++)
|
ARR_FIND(0, MAX_SERVERS, id, server_fd[id] == fd);
|
||||||
if (server_fd[id] == fd)
|
if (id == MAX_SERVERS)
|
||||||
break;
|
{// not a char server
|
||||||
if (id == MAX_SERVERS) { // not a char server
|
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
do_close(fd);
|
do_close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(session[fd]->eof) {
|
if( session[fd]->eof )
|
||||||
|
{
|
||||||
ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
|
ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
|
||||||
login_log("Char-server '%s' has disconnected (ip: %s).\n", server[id].name, ip);
|
login_log("Char-server '%s' has disconnected (ip: %s).\n", server[id].name, ip);
|
||||||
server_fd[id] = -1;
|
server_fd[id] = -1;
|
||||||
memset(&server[id], 0, sizeof(struct mmo_char_server));
|
memset(&server[id], 0, sizeof(struct mmo_char_server));
|
||||||
online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char server to offline.
|
online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char server to offline.
|
||||||
do_close(fd);
|
do_close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (RFIFOREST(fd) >= 2)
|
while( RFIFOREST(fd) >= 2 )
|
||||||
{
|
{
|
||||||
uint16 command = RFIFOW(fd,0);
|
uint16 command = RFIFOW(fd,0);
|
||||||
|
|
||||||
if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && command != 0x2714)) // 0x2714 is done very often (number of players)
|
if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && command != 0x2714)) // 0x2714 is done very often (number of players)
|
||||||
ShowDebug("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, command, RFIFOREST(fd));
|
ShowDebug("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, command, RFIFOREST(fd));
|
||||||
|
|
||||||
switch (command)
|
switch( command )
|
||||||
{
|
{
|
||||||
|
|
||||||
case 0x2709: // request from map-server via char-server to reload GM accounts
|
case 0x2709: // request from map-server via char-server to reload GM accounts
|
||||||
@ -1412,49 +1415,55 @@ int parse_fromchar(int fd)
|
|||||||
// send GM accounts to all char-servers
|
// send GM accounts to all char-servers
|
||||||
send_GM_accounts(-1);
|
send_GM_accounts(-1);
|
||||||
RFIFOSKIP(fd,2);
|
RFIFOSKIP(fd,2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x2712: // request from char-server to authenticate an account
|
case 0x2712: // request from char-server to authenticate an account
|
||||||
if (RFIFOREST(fd) < 19)
|
if( RFIFOREST(fd) < 19 )
|
||||||
return 0;
|
return 0;
|
||||||
{
|
{
|
||||||
uint32 account_id = RFIFOL(fd,2);
|
uint32 account_id = RFIFOL(fd,2);
|
||||||
for(i = 0; i < AUTH_FIFO_SIZE; i++)
|
for( i = 0; i < AUTH_FIFO_SIZE; ++i )
|
||||||
{
|
{
|
||||||
if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
|
if( auth_fifo[i].account_id == RFIFOL(fd,2) &&
|
||||||
auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
|
auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
|
||||||
auth_fifo[i].login_id2 == RFIFOL(fd,10) &&
|
auth_fifo[i].login_id2 == RFIFOL(fd,10) &&
|
||||||
auth_fifo[i].sex == RFIFOB(fd,14) &&
|
auth_fifo[i].sex == RFIFOB(fd,14) &&
|
||||||
auth_fifo[i].ip == ntohl(RFIFOL(fd,15)) &&
|
auth_fifo[i].ip == ntohl(RFIFOL(fd,15)) &&
|
||||||
!auth_fifo[i].delflag)
|
!auth_fifo[i].delflag)
|
||||||
{
|
{
|
||||||
unsigned int k;
|
|
||||||
time_t connect_until_time = 0;
|
|
||||||
char email[40] = "";
|
|
||||||
auth_fifo[i].delflag = 1;
|
auth_fifo[i].delflag = 1;
|
||||||
login_log("Char-server '%s': authentification of the account %d accepted (ip: %s).\n",
|
|
||||||
server[id].name, account_id, ip);
|
|
||||||
for(k = 0; k < auth_num; k++) {
|
|
||||||
if (auth_dat[k].account_id == account_id) {
|
|
||||||
strcpy(email, auth_dat[k].email);
|
|
||||||
connect_until_time = auth_dat[k].connect_until_time;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WFIFOHEAD(fd,51);
|
|
||||||
WFIFOW(fd,0) = 0x2713;
|
|
||||||
WFIFOL(fd,2) = account_id;
|
|
||||||
WFIFOB(fd,6) = 0;
|
|
||||||
memcpy(WFIFOP(fd, 7), email, 40);
|
|
||||||
WFIFOL(fd,47) = (unsigned long)connect_until_time;
|
|
||||||
WFIFOSET(fd,51);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// authentification not found
|
|
||||||
if (i == AUTH_FIFO_SIZE) {
|
if( i != AUTH_FIFO_SIZE && account_id > 0 )
|
||||||
login_log("Char-server '%s': authentification of the account %d REFUSED (ip: %s).\n",
|
{// send ack
|
||||||
server[id].name, account_id, ip);
|
time_t connect_until_time;
|
||||||
|
char email[40];
|
||||||
|
unsigned int k;
|
||||||
|
|
||||||
|
login_log("Char-server '%s': authentification of the account %d accepted (ip: %s).\n", server[id].name, account_id, ip);
|
||||||
|
|
||||||
|
ARR_FIND(0, auth_num, k, auth_dat[k].account_id == account_id);
|
||||||
|
if( k != auth_num ) {
|
||||||
|
strcpy(email, auth_dat[k].email);
|
||||||
|
connect_until_time = auth_dat[k].connect_until_time;
|
||||||
|
} else {
|
||||||
|
memset(email, 0, sizeof(email));
|
||||||
|
connect_until_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
WFIFOHEAD(fd,51);
|
||||||
|
WFIFOW(fd,0) = 0x2713;
|
||||||
|
WFIFOL(fd,2) = account_id;
|
||||||
|
WFIFOB(fd,6) = 0;
|
||||||
|
memcpy(WFIFOP(fd, 7), email, 40);
|
||||||
|
WFIFOL(fd,47) = (unsigned long)connect_until_time;
|
||||||
|
WFIFOSET(fd,51);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{// authentification not found
|
||||||
|
login_log("Char-server '%s': authentification of the account %d REFUSED (ip: %s).\n", server[id].name, account_id, ip);
|
||||||
WFIFOHEAD(fd,51);
|
WFIFOHEAD(fd,51);
|
||||||
WFIFOW(fd,0) = 0x2713;
|
WFIFOW(fd,0) = 0x2713;
|
||||||
WFIFOL(fd,2) = account_id;
|
WFIFOL(fd,2) = account_id;
|
||||||
@ -1869,7 +1878,7 @@ int parse_fromchar(int fd)
|
|||||||
struct online_login_data *p;
|
struct online_login_data *p;
|
||||||
int aid;
|
int aid;
|
||||||
uint32 i, users;
|
uint32 i, users;
|
||||||
online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char-server offline first
|
online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char-server offline first
|
||||||
users = RFIFOW(fd,4);
|
users = RFIFOW(fd,4);
|
||||||
for (i = 0; i < users; i++) {
|
for (i = 0; i < users; i++) {
|
||||||
aid = RFIFOL(fd,6+i*4);
|
aid = RFIFOL(fd,6+i*4);
|
||||||
@ -1926,7 +1935,7 @@ int parse_fromchar(int fd)
|
|||||||
|
|
||||||
case 0x2737: //Request to set all offline.
|
case 0x2737: //Request to set all offline.
|
||||||
ShowInfo("Setting accounts from char-server %d offline.\n", id);
|
ShowInfo("Setting accounts from char-server %d offline.\n", id);
|
||||||
online_db->foreach(online_db,online_db_setoffline,id);
|
online_db->foreach(online_db, online_db_setoffline, id);
|
||||||
RFIFOSKIP(fd,2);
|
RFIFOSKIP(fd,2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1988,26 +1997,27 @@ int parse_fromchar(int fd)
|
|||||||
int parse_admin(int fd)
|
int parse_admin(int fd)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
uint32 ipl = session[fd]->client_addr;
|
|
||||||
char* account_name;
|
char* account_name;
|
||||||
char ip[16];
|
|
||||||
|
|
||||||
|
uint32 ipl = session[fd]->client_addr;
|
||||||
|
char ip[16];
|
||||||
ip2str(ipl, ip);
|
ip2str(ipl, ip);
|
||||||
|
|
||||||
if (session[fd]->eof) {
|
if( session[fd]->eof )
|
||||||
|
{
|
||||||
do_close(fd);
|
do_close(fd);
|
||||||
ShowInfo("Remote administration has disconnected (session #%d).\n", fd);
|
ShowInfo("Remote administration has disconnected (session #%d).\n", fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (RFIFOREST(fd) >= 2)
|
while( RFIFOREST(fd) >= 2 )
|
||||||
{
|
{
|
||||||
uint16 command = RFIFOW(fd,0);
|
uint16 command = RFIFOW(fd,0);
|
||||||
|
|
||||||
if (display_parse_admin)
|
if (display_parse_admin)
|
||||||
ShowDebug("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", fd, command, RFIFOREST(fd));
|
ShowDebug("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", fd, command, RFIFOREST(fd));
|
||||||
|
|
||||||
switch(command)
|
switch( command )
|
||||||
{
|
{
|
||||||
|
|
||||||
case 0x7530: // Request of the server version
|
case 0x7530: // Request of the server version
|
||||||
@ -2980,7 +2990,7 @@ int parse_login(int fd)
|
|||||||
|
|
||||||
ip2str(ipl, ip);
|
ip2str(ipl, ip);
|
||||||
|
|
||||||
while (RFIFOREST(fd) >= 2)
|
while( RFIFOREST(fd) >= 2 )
|
||||||
{
|
{
|
||||||
uint16 command = RFIFOW(fd,0);
|
uint16 command = RFIFOW(fd,0);
|
||||||
|
|
||||||
@ -3152,23 +3162,20 @@ int parse_login(int fd)
|
|||||||
case 0x791a: // Sending request of the coding key (administration packet)
|
case 0x791a: // Sending request of the coding key (administration packet)
|
||||||
{
|
{
|
||||||
struct login_session_data* ld;
|
struct login_session_data* ld;
|
||||||
if (session[fd]->session_data) {
|
if( session[fd]->session_data )
|
||||||
|
{
|
||||||
ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
|
ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ld = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data));
|
CREATE(ld, struct login_session_data, 1);
|
||||||
session[fd]->session_data = ld;
|
session[fd]->session_data = ld;
|
||||||
if (command == 0x01db)
|
|
||||||
login_log("Sending request of the coding key (ip: %s)\n", ip);
|
|
||||||
else
|
|
||||||
login_log("'ladmin': Sending request of the coding key (ip: %s)\n", ip);
|
|
||||||
|
|
||||||
// Creation of the coding key
|
// Creation of the coding key
|
||||||
memset(ld->md5key, '\0', sizeof(ld->md5key));
|
memset(ld->md5key, '\0', sizeof(ld->md5key));
|
||||||
ld->md5keylen = (uint16)(12 + rand() % 4);
|
ld->md5keylen = (uint16)(12 + rand() % 4);
|
||||||
for(i = 0; i < ld->md5keylen; i++)
|
for( i = 0; i < ld->md5keylen; ++i )
|
||||||
ld->md5key[i] = (char)(1 + rand() % 255);
|
ld->md5key[i] = (char)(1 + rand() % 255);
|
||||||
|
|
||||||
WFIFOHEAD(fd,4 + ld->md5keylen);
|
WFIFOHEAD(fd,4 + ld->md5keylen);
|
||||||
@ -3374,6 +3381,7 @@ int parse_console(char* buf)
|
|||||||
|
|
||||||
sscanf(buf, "%[^\n]", command);
|
sscanf(buf, "%[^\n]", command);
|
||||||
|
|
||||||
|
ShowInfo("Console command :%s", command);
|
||||||
login_log("Console command :%s\n", command);
|
login_log("Console command :%s\n", command);
|
||||||
|
|
||||||
if( strcmpi("shutdown", command) == 0 ||
|
if( strcmpi("shutdown", command) == 0 ||
|
||||||
@ -3485,19 +3493,17 @@ int login_config_read(const char* cfgName)
|
|||||||
if (line[0] == '/' && line[1] == '/')
|
if (line[0] == '/' && line[1] == '/')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memset(w2, 0, sizeof(w2));
|
|
||||||
|
|
||||||
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) < 2)
|
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) < 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
remove_control_chars(w1);
|
remove_control_chars(w1);
|
||||||
remove_control_chars(w2);
|
remove_control_chars(w2);
|
||||||
|
|
||||||
if(strcmpi(w1,"timestamp_format") == 0) {
|
if(!strcmpi(w1,"timestamp_format"))
|
||||||
strncpy(timestamp_format, w2, 20);
|
strncpy(timestamp_format, w2, 20);
|
||||||
} else if(strcmpi(w1,"stdout_with_ansisequence")==0){
|
else if(!strcmpi(w1,"stdout_with_ansisequence"))
|
||||||
stdout_with_ansisequence = config_switch(w2);
|
stdout_with_ansisequence = config_switch(w2);
|
||||||
} else if(strcmpi(w1,"console_silent")==0){
|
else if(!strcmpi(w1,"console_silent")) {
|
||||||
ShowInfo("Console Silent Setting: %d\n", atoi(w2));
|
ShowInfo("Console Silent Setting: %d\n", atoi(w2));
|
||||||
msg_silent = atoi(w2);
|
msg_silent = atoi(w2);
|
||||||
}
|
}
|
||||||
@ -3546,6 +3552,7 @@ int login_config_read(const char* cfgName)
|
|||||||
}
|
}
|
||||||
else if( !strcmpi(w1, "login_port") ) {
|
else if( !strcmpi(w1, "login_port") ) {
|
||||||
login_config.login_port = (uint16)atoi(w2);
|
login_config.login_port = (uint16)atoi(w2);
|
||||||
|
ShowStatus("set login_port : %s\n",w2);
|
||||||
}
|
}
|
||||||
else if (strcmpi(w1, "account_filename") == 0) {
|
else if (strcmpi(w1, "account_filename") == 0) {
|
||||||
memset(account_filename, 0, sizeof(account_filename));
|
memset(account_filename, 0, sizeof(account_filename));
|
||||||
@ -3991,17 +3998,16 @@ void do_abort(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------
|
|
||||||
// Main function of login-server
|
|
||||||
//------------------------------
|
|
||||||
void set_server_type(void)
|
void set_server_type(void)
|
||||||
{
|
{
|
||||||
SERVER_TYPE = ATHENA_SERVER_LOGIN;
|
SERVER_TYPE = ATHENA_SERVER_LOGIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_init(int argc, char **argv)
|
//------------------------------
|
||||||
|
// Login server initialization
|
||||||
|
//------------------------------
|
||||||
|
int do_init(int argc, char** argv)
|
||||||
{
|
{
|
||||||
// initialize login server
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
login_set_defaults();
|
login_set_defaults();
|
||||||
@ -4066,7 +4072,7 @@ int do_init(int argc, char **argv)
|
|||||||
login_fd = make_listen_bind(login_config.login_ip, login_config.login_port);
|
login_fd = make_listen_bind(login_config.login_ip, login_config.login_port);
|
||||||
|
|
||||||
login_log("The login-server is ready (Server is listening on the port %d).\n", login_config.login_port);
|
login_log("The login-server is ready (Server is listening on the port %d).\n", login_config.login_port);
|
||||||
ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", login_config.login_port);
|
ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %u).\n\n", login_config.login_port);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -347,6 +347,62 @@ void mmo_db_close(void)
|
|||||||
do_close(login_fd);
|
do_close(login_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// Packet send to all char-servers, except one (wos: without our self)
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
int charif_sendallwos(int sfd, uint8* buf, size_t len)
|
||||||
|
{
|
||||||
|
int i, c;
|
||||||
|
|
||||||
|
for( i = 0, c = 0; i < MAX_SERVERS; ++i )
|
||||||
|
{
|
||||||
|
int fd = server_fd[i];
|
||||||
|
if( session_isValid(fd) && fd != sfd )
|
||||||
|
{
|
||||||
|
WFIFOHEAD(fd,len);
|
||||||
|
memcpy(WFIFOP(fd,0), buf, len);
|
||||||
|
WFIFOSET(fd,len);
|
||||||
|
++c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// encrypted/unencrypted password check
|
||||||
|
//-----------------------------------------------------
|
||||||
|
bool check_encrypted(const char* str1, const char* str2, const char* passwd)
|
||||||
|
{
|
||||||
|
char md5str[64], md5bin[32];
|
||||||
|
|
||||||
|
snprintf(md5str, sizeof(md5str), "%s%s", str1, str2);
|
||||||
|
md5str[sizeof(md5str)-1] = '\0';
|
||||||
|
MD5_String2binary(md5str, md5bin);
|
||||||
|
|
||||||
|
return (0==memcmp(passwd, md5bin, 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool check_password(struct login_session_data* ld, int passwdenc, const char* passwd, const char* refpass)
|
||||||
|
{
|
||||||
|
if(passwdenc == 0)
|
||||||
|
{
|
||||||
|
return (0==strcmp(passwd, refpass));
|
||||||
|
}
|
||||||
|
else if (ld)
|
||||||
|
{
|
||||||
|
// password mode set to 1 -> (md5key, refpass) enable with <passwordencrypt></passwordencrypt>
|
||||||
|
// password mode set to 2 -> (refpass, md5key) enable with <passwordencrypt2></passwordencrypt2>
|
||||||
|
|
||||||
|
return ((passwdenc&0x01) && check_encrypted(ld->md5key, refpass, passwd)) ||
|
||||||
|
((passwdenc&0x02) && check_encrypted(refpass, ld->md5key, passwd));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
// Make new account
|
// Make new account
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
@ -417,61 +473,6 @@ int mmo_auth_new(struct mmo_account* account, char sex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// Packet send to all char-servers, except one (wos: without our self)
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
int charif_sendallwos(int sfd, uint8* buf, size_t len)
|
|
||||||
{
|
|
||||||
int i, c;
|
|
||||||
|
|
||||||
for( i = 0, c = 0; i < MAX_SERVERS; ++i )
|
|
||||||
{
|
|
||||||
int fd = server_fd[i];
|
|
||||||
if( session_isValid(fd) && fd != sfd )
|
|
||||||
{
|
|
||||||
WFIFOHEAD(fd,len);
|
|
||||||
memcpy(WFIFOP(fd,0), buf, len);
|
|
||||||
WFIFOSET(fd,len);
|
|
||||||
++c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------
|
|
||||||
// encrypted/unencrypted password check
|
|
||||||
//-----------------------------------------------------
|
|
||||||
bool check_encrypted(const char* str1, const char* str2, const char* passwd)
|
|
||||||
{
|
|
||||||
char md5str[64], md5bin[32];
|
|
||||||
|
|
||||||
snprintf(md5str, sizeof(md5str), "%s%s", str1, str2);
|
|
||||||
md5str[sizeof(md5str)-1] = '\0';
|
|
||||||
MD5_String2binary(md5str, md5bin);
|
|
||||||
|
|
||||||
return (0==memcmp(passwd, md5bin, 16));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool check_password(struct login_session_data* ld, int passwdenc, const char* passwd, const char* refpass)
|
|
||||||
{
|
|
||||||
if(passwdenc == 0)
|
|
||||||
{
|
|
||||||
return (0==strcmp(passwd, refpass));
|
|
||||||
}
|
|
||||||
else if (ld)
|
|
||||||
{
|
|
||||||
// password mode set to 1 -> (md5key, refpass) enable with <passwordencrypt></passwordencrypt>
|
|
||||||
// password mode set to 2 -> (refpass, md5key) enable with <passwordencrypt2></passwordencrypt2>
|
|
||||||
|
|
||||||
return ((passwdenc&0x01) && check_encrypted(ld->md5key, refpass, passwd)) ||
|
|
||||||
((passwdenc&0x02) && check_encrypted(refpass, ld->md5key, passwd));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
// Check/authentication of a connection
|
// Check/authentication of a connection
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
@ -524,7 +525,7 @@ int mmo_auth(struct mmo_account* account, int fd)
|
|||||||
if( login_config.new_account_flag )
|
if( login_config.new_account_flag )
|
||||||
{
|
{
|
||||||
if( len > 2 && strnlen(account->passwd, NAME_LENGTH) >= 4 && // valid user and password lengths
|
if( len > 2 && strnlen(account->passwd, NAME_LENGTH) >= 4 && // valid user and password lengths
|
||||||
account->passwdenc == 0 &&// unencoded password
|
account->passwdenc == 0 && // unencoded password
|
||||||
account->userid[len-2] == '_' && memchr("FfMm", (unsigned char)account->userid[len-1], 4) ) // _M/_F suffix
|
account->userid[len-2] == '_' && memchr("FfMm", (unsigned char)account->userid[len-1], 4) ) // _M/_F suffix
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
@ -703,9 +704,7 @@ int parse_fromchar(int fd)
|
|||||||
char ip[16];
|
char ip[16];
|
||||||
ip2str(ipl, ip);
|
ip2str(ipl, ip);
|
||||||
|
|
||||||
for( id = 0; id < MAX_SERVERS; ++id )
|
ARR_FIND(0, MAX_SERVERS, id, server_fd[id] == fd);
|
||||||
if( server_fd[id] == fd )
|
|
||||||
break;
|
|
||||||
if( id == MAX_SERVERS )
|
if( id == MAX_SERVERS )
|
||||||
{// not a char server
|
{// not a char server
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
@ -748,16 +747,15 @@ int parse_fromchar(int fd)
|
|||||||
if( RFIFOREST(fd) < 19 )
|
if( RFIFOREST(fd) < 19 )
|
||||||
return 0;
|
return 0;
|
||||||
{
|
{
|
||||||
int account_id;
|
uint32 account_id = RFIFOL(fd,2);
|
||||||
account_id = RFIFOL(fd,2); // speed up
|
|
||||||
for( i = 0; i < AUTH_FIFO_SIZE; ++i )
|
for( i = 0; i < AUTH_FIFO_SIZE; ++i )
|
||||||
{
|
{
|
||||||
if( auth_fifo[i].account_id == account_id &&
|
if( auth_fifo[i].account_id == RFIFOL(fd,2) &&
|
||||||
auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
|
auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
|
||||||
auth_fifo[i].login_id2 == RFIFOL(fd,10) &&
|
auth_fifo[i].login_id2 == RFIFOL(fd,10) &&
|
||||||
auth_fifo[i].sex == RFIFOB(fd,14) &&
|
auth_fifo[i].sex == RFIFOB(fd,14) &&
|
||||||
auth_fifo[i].ip == ntohl(RFIFOL(fd,15)) &&
|
auth_fifo[i].ip == ntohl(RFIFOL(fd,15)) &&
|
||||||
!auth_fifo[i].delflag)
|
!auth_fifo[i].delflag)
|
||||||
{
|
{
|
||||||
auth_fifo[i].delflag = 1;
|
auth_fifo[i].delflag = 1;
|
||||||
break;
|
break;
|
||||||
@ -766,11 +764,9 @@ int parse_fromchar(int fd)
|
|||||||
|
|
||||||
if( i != AUTH_FIFO_SIZE && account_id > 0 )
|
if( i != AUTH_FIFO_SIZE && account_id > 0 )
|
||||||
{// send ack
|
{// send ack
|
||||||
uint32 connect_until_time = 0;
|
uint32 connect_until_time;
|
||||||
char email[40];
|
char email[40];
|
||||||
|
|
||||||
memset(email, 0, sizeof(email));
|
|
||||||
account_id = RFIFOL(fd,2);
|
|
||||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, account_id) )
|
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, account_id) )
|
||||||
Sql_ShowDebug(sql_handle);
|
Sql_ShowDebug(sql_handle);
|
||||||
if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
|
if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
|
||||||
@ -778,21 +774,19 @@ int parse_fromchar(int fd)
|
|||||||
char* data = NULL;
|
char* data = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
Sql_GetData(sql_handle, 0, &data, &len);
|
Sql_GetData(sql_handle, 0, &data, &len); safestrncpy(email, data, sizeof(email));
|
||||||
|
Sql_GetData(sql_handle, 1, &data, NULL); connect_until_time = (uint32)strtoul(data, NULL, 10);
|
||||||
if( len > sizeof(email) )
|
if( len > sizeof(email) )
|
||||||
{
|
|
||||||
#if defined(DEBUG)
|
|
||||||
ShowDebug("parse_fromchar:0x2712: email is too long (len=%u,maxlen=%u)\n", len, sizeof(email));
|
ShowDebug("parse_fromchar:0x2712: email is too long (len=%u,maxlen=%u)\n", len, sizeof(email));
|
||||||
#endif
|
|
||||||
len = sizeof(email);
|
|
||||||
}
|
|
||||||
memcpy(email, data, len);
|
|
||||||
|
|
||||||
Sql_GetData(sql_handle, 1, &data, NULL);
|
|
||||||
connect_until_time = (uint32)strtoul(data, NULL, 10);
|
|
||||||
|
|
||||||
Sql_FreeResult(sql_handle);
|
Sql_FreeResult(sql_handle);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(email, 0, sizeof(email));
|
||||||
|
connect_until_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
WFIFOHEAD(fd,51);
|
WFIFOHEAD(fd,51);
|
||||||
WFIFOW(fd,0) = 0x2713;
|
WFIFOW(fd,0) = 0x2713;
|
||||||
WFIFOL(fd,2) = account_id;
|
WFIFOL(fd,2) = account_id;
|
||||||
@ -802,11 +796,13 @@ int parse_fromchar(int fd)
|
|||||||
WFIFOSET(fd,51);
|
WFIFOSET(fd,51);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{// authentification not found
|
||||||
WFIFOHEAD(fd,51);
|
WFIFOHEAD(fd,51);
|
||||||
WFIFOW(fd,0) = 0x2713;
|
WFIFOW(fd,0) = 0x2713;
|
||||||
WFIFOL(fd,2) = account_id;
|
WFIFOL(fd,2) = account_id;
|
||||||
WFIFOB(fd,6) = 1;
|
WFIFOB(fd,6) = 1;
|
||||||
|
// It is unnecessary to send email
|
||||||
|
// It is unnecessary to send validity date of the account
|
||||||
WFIFOSET(fd,51);
|
WFIFOSET(fd,51);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -828,7 +824,7 @@ int parse_fromchar(int fd)
|
|||||||
Sql_ShowDebug(sql_handle);
|
Sql_ShowDebug(sql_handle);
|
||||||
}
|
}
|
||||||
// send some answer
|
// send some answer
|
||||||
WFIFOHEAD(fd,6);
|
WFIFOHEAD(fd,2);
|
||||||
WFIFOW(fd,0) = 0x2718;
|
WFIFOW(fd,0) = 0x2718;
|
||||||
WFIFOSET(fd,2);
|
WFIFOSET(fd,2);
|
||||||
|
|
||||||
@ -1177,7 +1173,7 @@ int parse_fromchar(int fd)
|
|||||||
struct online_login_data *p;
|
struct online_login_data *p;
|
||||||
int aid;
|
int aid;
|
||||||
uint32 i, users;
|
uint32 i, users;
|
||||||
online_db->foreach(online_db,online_db_setoffline,id); //Set all chars from this char-server offline first
|
online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char-server offline first
|
||||||
users = RFIFOW(fd,4);
|
users = RFIFOW(fd,4);
|
||||||
for (i = 0; i < users; i++) {
|
for (i = 0; i < users; i++) {
|
||||||
aid = RFIFOL(fd,6+i*4);
|
aid = RFIFOL(fd,6+i*4);
|
||||||
@ -1245,12 +1241,12 @@ int parse_fromchar(int fd)
|
|||||||
|
|
||||||
case 0x2737: //Request to set all offline.
|
case 0x2737: //Request to set all offline.
|
||||||
ShowInfo("Setting accounts from char-server %d offline.\n", id);
|
ShowInfo("Setting accounts from char-server %d offline.\n", id);
|
||||||
online_db->foreach(online_db,online_db_setoffline,id);
|
online_db->foreach(online_db, online_db_setoffline, id);
|
||||||
RFIFOSKIP(fd,2);
|
RFIFOSKIP(fd,2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ShowError("parse_fromchar: Unknown packet 0x%x from a char-server! Disconnecting!\n", RFIFOW(fd,0));
|
ShowError("parse_fromchar: Unknown packet 0x%x from a char-server! Disconnecting!\n", command);
|
||||||
set_eof(fd);
|
set_eof(fd);
|
||||||
return 0;
|
return 0;
|
||||||
} // switch
|
} // switch
|
||||||
@ -1602,7 +1598,7 @@ int parse_login(int fd)
|
|||||||
memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
|
memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
|
||||||
server[account.account_id].ip = ntohl(RFIFOL(fd,54));
|
server[account.account_id].ip = ntohl(RFIFOL(fd,54));
|
||||||
server[account.account_id].port = ntohs(RFIFOW(fd,58));
|
server[account.account_id].port = ntohs(RFIFOW(fd,58));
|
||||||
memcpy(server[account.account_id].name, server_name, 20);
|
safestrncpy(server[account.account_id].name, server_name, sizeof(server[account.account_id].name));
|
||||||
server[account.account_id].users = 0;
|
server[account.account_id].users = 0;
|
||||||
server[account.account_id].maintenance = RFIFOW(fd,82);
|
server[account.account_id].maintenance = RFIFOW(fd,82);
|
||||||
server[account.account_id].new_ = RFIFOW(fd,84);
|
server[account.account_id].new_ = RFIFOW(fd,84);
|
||||||
@ -1741,8 +1737,8 @@ int login_lan_config_read(const char *lancfgName)
|
|||||||
if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
|
if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) {
|
if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4)
|
||||||
|
{
|
||||||
ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
|
ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1807,11 +1803,11 @@ int login_config_read(const char* cfgName)
|
|||||||
remove_control_chars(w1);
|
remove_control_chars(w1);
|
||||||
remove_control_chars(w2);
|
remove_control_chars(w2);
|
||||||
|
|
||||||
if(!strcmpi(w1,"timestamp_format")) {
|
if(!strcmpi(w1,"timestamp_format"))
|
||||||
strncpy(timestamp_format, w2, 20);
|
strncpy(timestamp_format, w2, 20);
|
||||||
} else if(!strcmpi(w1,"stdout_with_ansisequence")) {
|
else if(!strcmpi(w1,"stdout_with_ansisequence"))
|
||||||
stdout_with_ansisequence = config_switch(w2);
|
stdout_with_ansisequence = config_switch(w2);
|
||||||
} else if(!strcmpi(w1,"console_silent")) {
|
else if(!strcmpi(w1,"console_silent")) {
|
||||||
ShowInfo("Console Silent Setting: %d\n", atoi(w2));
|
ShowInfo("Console Silent Setting: %d\n", atoi(w2));
|
||||||
msg_silent = atoi(w2);
|
msg_silent = atoi(w2);
|
||||||
}
|
}
|
||||||
@ -1825,18 +1821,18 @@ int login_config_read(const char* cfgName)
|
|||||||
login_config.login_port = (uint16)atoi(w2);
|
login_config.login_port = (uint16)atoi(w2);
|
||||||
ShowStatus("set login_port : %s\n",w2);
|
ShowStatus("set login_port : %s\n",w2);
|
||||||
}
|
}
|
||||||
else if (!strcmpi(w1, "log_login"))
|
else if(!strcmpi(w1, "log_login"))
|
||||||
login_config.log_login = config_switch(w2);
|
login_config.log_login = config_switch(w2);
|
||||||
|
|
||||||
else if (!strcmpi(w1, "ipban"))
|
else if(!strcmpi(w1, "ipban"))
|
||||||
login_config.ipban = config_switch(w2);
|
login_config.ipban = config_switch(w2);
|
||||||
else if (!strcmpi(w1, "dynamic_pass_failure_ban"))
|
else if(!strcmpi(w1, "dynamic_pass_failure_ban"))
|
||||||
login_config.dynamic_pass_failure_ban = config_switch(w2);
|
login_config.dynamic_pass_failure_ban = config_switch(w2);
|
||||||
else if (!strcmpi(w1, "dynamic_pass_failure_ban_interval"))
|
else if(!strcmpi(w1, "dynamic_pass_failure_ban_interval"))
|
||||||
login_config.dynamic_pass_failure_ban_interval = atoi(w2);
|
login_config.dynamic_pass_failure_ban_interval = atoi(w2);
|
||||||
else if (!strcmpi(w1, "dynamic_pass_failure_ban_limit"))
|
else if(!strcmpi(w1, "dynamic_pass_failure_ban_limit"))
|
||||||
login_config.dynamic_pass_failure_ban_limit = atoi(w2);
|
login_config.dynamic_pass_failure_ban_limit = atoi(w2);
|
||||||
else if (!strcmpi(w1, "dynamic_pass_failure_ban_duration"))
|
else if(!strcmpi(w1, "dynamic_pass_failure_ban_duration"))
|
||||||
login_config.dynamic_pass_failure_ban_duration = atoi(w2);
|
login_config.dynamic_pass_failure_ban_duration = atoi(w2);
|
||||||
|
|
||||||
else if(!strcmpi(w1, "new_account"))
|
else if(!strcmpi(w1, "new_account"))
|
||||||
@ -1865,9 +1861,9 @@ int login_config_read(const char* cfgName)
|
|||||||
login_config.use_dnsbl = (bool)config_switch(w2);
|
login_config.use_dnsbl = (bool)config_switch(w2);
|
||||||
else if(!strcmpi(w1, "dnsbl_servers"))
|
else if(!strcmpi(w1, "dnsbl_servers"))
|
||||||
safestrncpy(login_config.dnsbl_servs, w2, sizeof(login_config.dnsbl_servs));
|
safestrncpy(login_config.dnsbl_servs, w2, sizeof(login_config.dnsbl_servs));
|
||||||
else if (!strcmpi(w1, "ip_sync_interval"))
|
else if(!strcmpi(w1, "ip_sync_interval"))
|
||||||
login_config.ip_sync_interval = (unsigned int)1000*60*atoi(w2); //w2 comes in minutes.
|
login_config.ip_sync_interval = (unsigned int)1000*60*atoi(w2); //w2 comes in minutes.
|
||||||
else if (!strcmpi(w1, "import"))
|
else if(!strcmpi(w1, "import"))
|
||||||
login_config_read(w2);
|
login_config_read(w2);
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -1979,9 +1975,11 @@ void set_server_type(void)
|
|||||||
SERVER_TYPE = ATHENA_SERVER_LOGIN;
|
SERVER_TYPE = ATHENA_SERVER_LOGIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// Login server initialization
|
||||||
|
//------------------------------
|
||||||
int do_init(int argc, char** argv)
|
int do_init(int argc, char** argv)
|
||||||
{
|
{
|
||||||
// initialize login server
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
login_set_defaults();
|
login_set_defaults();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user