diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2009-08-19 19:17:52 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2009-08-19 19:17:52 +0800 |
commit | 3eac366fd24b8fce50b8a411ee47514b451bb62c (patch) | |
tree | 83cc887f898e66675d9eff1db2dda973a689e9e6 /mbbsd/register.c | |
parent | b51992baa430532854284b1aa17831f3ca071996 (diff) | |
download | pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.tar pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.tar.gz pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.tar.bz2 pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.tar.lz pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.tar.xz pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.tar.zst pttbbs-3eac366fd24b8fce50b8a411ee47514b451bb62c.zip |
* prevent ambiguous account registration
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4752 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/register.c')
-rw-r--r-- | mbbsd/register.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/mbbsd/register.c b/mbbsd/register.c index cadcdd3d..207325f4 100644 --- a/mbbsd/register.c +++ b/mbbsd/register.c @@ -632,6 +632,70 @@ setupnewuser(const userec_t *user) return uid; } +void +build_unambiguous_userid(char *uid) +{ + int i = 0; + const char *ambtbl[] = { + "0Oo", + "1Il", + NULL + }; + + for (i = 0; ambtbl[i]; ) + { + size_t pos = strcspn(uid, ambtbl[i]); + if (!uid[pos]) + { + i++; + continue; + } + uid[pos] = ambtbl[i][0]; + uid += (pos+1); // skip the processed character + } +} + +int +find_ambiguous_userid(const char *userid) +{ + const char *ambchars = "0Oo1Il"; + size_t uidlen = 0, iamb; + char ambuid[IDLEN+1], shmuid[IDLEN+1]; + int i; + + assert(userid && *userid); + + // if NULL, found nothing. + iamb = strcspn(userid, ambchars); + if (!userid[iamb]) + return 0; + + // build un-ambiguous uid + uidlen = strlcpy(ambuid, userid, sizeof(ambuid)); + build_unambiguous_userid(ambuid); + + for (i = 0; i < MAX_USERS; i++) + { + const char *ruid = SHM->userid[i]; + + // quick test: same non-amb prefix, and remote uid has amb characters + if (iamb > 0 && tolower(*ruid) != tolower(*ambuid)) + continue; + if (!ruid[strcspn(ruid, ambchars)]) + continue; + + // copy and check remote uid length + if (strlcpy(shmuid, ruid, sizeof(shmuid)) != uidlen) + continue; + + build_unambiguous_userid(shmuid); + if (strcasecmp(shmuid, ambuid) == 0) + return 1; + } + + return 0; +} + ///////////////////////////////////////////////////////////////////////////// // New Registration (Phase 1: Create Account) ///////////////////////////////////////////////////////////////////////////// @@ -705,6 +769,10 @@ new_register(void) } else if (reserved_user_id(passbuf)) outs("此代號已由系統保留,請使用別的代號\n"); +#ifndef NO_CHECK_AMBIGUOUS_USERID + else if (find_ambiguous_userid(passbuf)) + outs("此代號過於近似它人帳號,請改用別的代號。\n"); +#endif else // success break; } |