summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/char/char.c24
-rw-r--r--src/char/char.h3
-rw-r--r--src/char/pincode.c83
-rw-r--r--src/char/pincode.h5
-rw-r--r--src/login/login.c2
5 files changed, 45 insertions, 72 deletions
diff --git a/src/char/char.c b/src/char/char.c
index 3436860d0..9e63a682c 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -186,6 +186,7 @@ static DBData create_online_char_data(DBKey key, va_list args)
character->account_id = key.i;
character->char_id = -1;
character->server = -1;
+ character->pincode_enable = -1;
character->fd = -1;
character->waiting_disconnect = INVALID_TIMER;
return db_ptr2data(character);
@@ -203,6 +204,8 @@ void set_char_charselect(int account_id)
character->char_id = -1;
character->server = -1;
+ if(character->pincode_enable == -1)
+ character->pincode_enable = *pincode->charselect + *pincode->enabled;
if(character->waiting_disconnect != INVALID_TIMER) {
delete_timer(character->waiting_disconnect, chardb_waiting_disconnect);
@@ -299,6 +302,7 @@ void set_char_offline(int char_id, int account_id)
{
character->char_id = -1;
character->server = -1;
+ character->pincode_enable = -1;
}
//FIXME? Why Kevin free'd the online information when the char was effectively in the map-server?
@@ -4167,10 +4171,8 @@ int parse_char(int fd)
if( RFIFOREST(fd) < 10 )
return 0;
- if( !sd->pincode_pass ) {
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->check( fd, sd );
- }
+ if( RFIFOL(fd,2) == sd->account_id )
+ pincode->check( fd, sd );
RFIFOSKIP(fd,10);
break;
@@ -4180,7 +4182,7 @@ int parse_char(int fd)
if( RFIFOREST(fd) < 6 )
return 0;
if( RFIFOL(fd,2) == sd->account_id )
- pincode->state( fd, sd, PINCODE_NOTSET );
+ pincode->sendstate( fd, sd, PINCODE_NOTSET );
RFIFOSKIP(fd,6);
break;
@@ -4189,10 +4191,8 @@ int parse_char(int fd)
case 0x8be:
if( RFIFOREST(fd) < 14 )
return 0;
- if( !sd->pincode_pass ) {
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->change( fd, sd );
- }
+ if( RFIFOL(fd,2) == sd->account_id )
+ pincode->change( fd, sd );
RFIFOSKIP(fd,14);
break;
@@ -4201,10 +4201,8 @@ int parse_char(int fd)
case 0x8ba:
if( RFIFOREST(fd) < 10 )
return 0;
- if( !sd->pincode_pass ) {
- if( RFIFOL(fd,2) == sd->account_id )
- pincode->new( fd, sd );
- }
+ if( RFIFOL(fd,2) == sd->account_id )
+ pincode->setnew( fd, sd );
RFIFOSKIP(fd,10);
break;
diff --git a/src/char/char.h b/src/char/char.h
index 934c26f45..b48ea359c 100644
--- a/src/char/char.h
+++ b/src/char/char.h
@@ -30,7 +30,6 @@ struct char_session_data {
uint32 pincode_seed;
uint16 pincode_try;
uint32 pincode_change;
- bool pincode_pass;
char new_name[NAME_LENGTH];
char birthdate[10+1]; // YYYY-MM-DD
};
@@ -41,7 +40,7 @@ struct online_char_data {
int fd;
int waiting_disconnect;
short server; // -2: unknown server, -1: not connected, 0+: id of server
- bool pincode_passed;
+ int pincode_enable;
};
DBMap* online_char_db; // int account_id -> struct online_char_data*
diff --git a/src/char/pincode.c b/src/char/pincode.c
index c7d7bce4c..3acc0aa6f 100644
--- a/src/char/pincode.c
+++ b/src/char/pincode.c
@@ -19,75 +19,54 @@ int charselect = 0;
unsigned int multiplier = 0x3498, baseSeed = 0x881234;
void pincode_handle ( int fd, struct char_session_data* sd ) {
- bool pass = true;
+ struct online_char_data* character;
- if( !*pincode->charselect ) {
- struct online_char_data* character;
- if( (character = (struct online_char_data*)idb_get(online_char_db, sd->account_id)) != NULL ) {
- if( character->pincode_passed )
- pass = false;
- }
- }
+ character = (struct online_char_data*)idb_get(online_char_db, sd->account_id);
- if( *pincode->enabled && pass ) {
-
- sd->pincode_pass = false;
- // PIN code system enabled
- if( sd->pincode[0] == '\0' ){
- // No PIN code has been set yet
- pincode->state( fd, sd, PINCODE_NOTSET );
- } else {
- if( !pincode->changetime || !( time(NULL) > (sd->pincode_change+*pincode->changetime) ) ){
- // Ask user for his PIN code
- pincode->state( fd, sd, PINCODE_ASK );
- } else {
- // User hasnt changed his PIN code too long
- pincode->state( fd, sd, PINCODE_EXPIRED );
- }
- }
- } else {
- // PIN code system, disabled
- pincode->state( fd, sd, PINCODE_OK );
+ if( character && character->pincode_enable > *pincode->charselect ){
+ character->pincode_enable = *pincode->charselect * 2;
+ }else{
+ pincode->sendstate( fd, sd, PINCODE_OK );
+ return;
}
-}
-void pincode_pass(struct char_session_data *sd) {
- struct online_char_data* character;
- if( (character = (struct online_char_data*)idb_get(online_char_db, sd->account_id)) != NULL ) {
- character->pincode_passed = true;
- }
- sd->pincode_pass = true;
+ if( strlen(sd->pincode) ){
+ if( *pincode->changetime && time(NULL) > (sd->pincode_change+*pincode->changetime) ){ // User hasnt changed his PIN code for a long time
+ pincode->sendstate( fd, sd, PINCODE_EXPIRED );
+ } else { // Ask user for his PIN code
+ pincode->sendstate( fd, sd, PINCODE_ASK );
+ }
+ } else // No PIN code has been set yet
+ pincode->sendstate( fd, sd, PINCODE_NOTSET );
}
+
void pincode_check(int fd, struct char_session_data* sd) {
- char pin[4] = "\0\0\0\0";
+ char pin[5] = "\0\0\0\0";
- strncpy(pin, (char*)RFIFOP(fd, 6), 3+1);
+ strncpy(pin, (char*)RFIFOP(fd, 6), 4+1);
pincode->decrypt(sd->pincode_seed, pin);
if( pincode->compare( fd, sd, pin ) ){
- pincode->state( fd, sd, PINCODE_OK );
+ pincode->sendstate( fd, sd, PINCODE_OK );
}
}
int pincode_compare(int fd, struct char_session_data* sd, char* pin) {
if( strcmp( sd->pincode, pin ) == 0 ){
sd->pincode_try = 0;
- pincode->pass(sd);
return 1;
} else {
- pincode->state( fd, sd, PINCODE_WRONG );
-
+ pincode->sendstate( fd, sd, PINCODE_WRONG );
if( *pincode->maxtry && ++sd->pincode_try >= *pincode->maxtry ){
pincode->error( sd->account_id );
}
-
return 0;
}
}
void pincode_change(int fd, struct char_session_data* sd) {
- char oldpin[4] = "\0\0\0\0", newpin[4] = "\0\0\0\0";
+ char oldpin[5] = "\0\0\0\0", newpin[5] = "\0\0\0\0";
- strncpy(oldpin, (char*)RFIFOP(fd,6), 3+1);
+ strncpy(oldpin, (char*)RFIFOP(fd,6), 4+1);
pincode->decrypt(sd->pincode_seed,oldpin);
if( !pincode->compare( fd, sd, oldpin ) )
return;
@@ -96,22 +75,21 @@ void pincode_change(int fd, struct char_session_data* sd) {
pincode->decrypt(sd->pincode_seed,newpin);
pincode->update( sd->account_id, newpin );
- pincode->state( fd, sd, PINCODE_OK );
+ pincode->sendstate( fd, sd, PINCODE_OK );
}
void pincode_setnew(int fd, struct char_session_data* sd) {
- char newpin[4] = "\0\0\0\0";
+ char newpin[5] = "\0\0\0\0";
- strncpy(newpin, (char*)RFIFOP(fd,6), 3+1);
+ strncpy(newpin, (char*)RFIFOP(fd,6), 4+1);
pincode->decrypt(sd->pincode_seed,newpin);
pincode->update( sd->account_id, newpin );
- pincode->state( fd, sd, PINCODE_OK );
- pincode->pass(sd);
+ pincode->sendstate( fd, sd, PINCODE_OK );
}
-// 0 = disabled / pin is correct
+// 0 = pin is correct
// 1 = ask for pin - client sends 0x8b8
// 2 = create new pin - client sends 0x8ba
// 3 = pin must be changed - client 0x8be
@@ -171,7 +149,7 @@ bool pincode_config_read(char *w1, char *w2) {
if ( strcmpi(w1, "pincode_enabled") == 0 ) {
enabled = atoi(w2);
-#ifdef PACKETVER < 20110309
+#if PACKETVER < 20110309
if( enabled ) {
ShowWarning("pincode_enabled requires PACKETVER 20110309 or higher. disabling...\n");
enabled = 0;
@@ -210,11 +188,10 @@ void pincode_defaults(void) {
pincode->decrypt = pincode_decrypt;
pincode->error = pincode_notifyLoginPinError;
pincode->update = pincode_notifyLoginPinUpdate;
- pincode->state = pincode_sendstate;
- pincode->new = pincode_setnew;
+ pincode->sendstate = pincode_sendstate;
+ pincode->setnew = pincode_setnew;
pincode->change = pincode_change;
pincode->compare = pincode_compare;
- pincode->pass = pincode_pass;
pincode->check = pincode_check;
pincode->config_read = pincode_config_read;
diff --git a/src/char/pincode.h b/src/char/pincode.h
index 1856e4baa..94e0b4f5b 100644
--- a/src/char/pincode.h
+++ b/src/char/pincode.h
@@ -27,11 +27,10 @@ struct pincode_interface {
void (*decrypt) (unsigned int userSeed, char* pin);
void (*error) (int account_id);
void (*update) (int account_id, char* pin);
- void (*state) (int fd, struct char_session_data* sd, uint16 state);
- void (*new) (int fd, struct char_session_data* sd);
+ void (*sendstate) (int fd, struct char_session_data* sd, uint16 state);
+ void (*setnew) (int fd, struct char_session_data* sd);
void (*change) (int fd, struct char_session_data* sd);
int (*compare) (int fd, struct char_session_data* sd, char* pin);
- void (*pass) (struct char_session_data *sd);
void (*check) (int fd, struct char_session_data* sd);
bool (*config_read) (char *w1, char *w2);
} pincode_s;
diff --git a/src/login/login.c b/src/login/login.c
index dfa67d932..51bc7f29c 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -559,7 +559,7 @@ int parse_fromchar(int fd)
int group_id = 0;
uint8 char_slots = 0;
char birthdate[10+1] = "";
- char pincode[4+1] = "\0\0\0\0\0";
+ char pincode[4+1] = "\0\0\0\0";
int account_id = RFIFOL(fd,2);
RFIFOSKIP(fd,6);