summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-08-19 19:17:52 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-08-19 19:17:52 +0800
commit3eac366fd24b8fce50b8a411ee47514b451bb62c (patch)
tree83cc887f898e66675d9eff1db2dda973a689e9e6
parentb51992baa430532854284b1aa17831f3ca071996 (diff)
downloadpttbbs-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
-rw-r--r--mbbsd/register.c68
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;
}