From 4e11a66b0d4a24677897aaaaa04c13a9ade83b93 Mon Sep 17 00:00:00 2001
From: cyan <>
Date: Wed, 24 Oct 2007 07:41:46 +0000
Subject: [PATCH] * Move checking of username/realname validity to its own
 function. * Create a new JS method under the system object,
 system.check_name(),   which utilizes this new function to check
 username/realname validity.

---
 src/sbbs3/js_system.c | 18 ++++++++++++++++++
 src/sbbs3/newuser.cpp | 14 ++++----------
 src/sbbs3/userdat.c   | 20 ++++++++++++++++++++
 src/sbbs3/userdat.h   |  2 ++
 4 files changed, 44 insertions(+), 10 deletions(-)

diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c
index 1e864c368f..7aa07ad8af 100644
--- a/src/sbbs3/js_system.c
+++ b/src/sbbs3/js_system.c
@@ -1335,7 +1335,21 @@ js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	return(JS_TRUE);
 }
 
+static JSBool 
+js_chkname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	char*	str;
+	scfg_t*	cfg;
+
+	str = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
+
+	if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
+		return(JS_FALSE);
 
+	*rval = BOOLEAN_TO_JSVAL(check_name(cfg,str));
+
+	return(JS_TRUE);
+}
 
 static jsSyncMethodSpec js_system_functions[] = {
 	{"username",		js_username,		1,	JSTYPE_STRING,	JSDOCSTR("number")
@@ -1429,6 +1443,10 @@ static jsSyncMethodSpec js_system_functions[] = {
 	,JSDOCSTR("compares the supplied <i>password</i> against the system password and return's <i>true</i> if it matches")
 	,311
 	},
+	{"check_name",		js_chkname,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("name/alias")
+	,JSDOCSTR("check the provided name/alias string, returns <i>true</i> if it is valid")
+	,315
+	},
 	{0}
 };
 
diff --git a/src/sbbs3/newuser.cpp b/src/sbbs3/newuser.cpp
index 787bdc4d6c..5356e15ce2 100644
--- a/src/sbbs3/newuser.cpp
+++ b/src/sbbs3/newuser.cpp
@@ -201,17 +201,12 @@ BOOL sbbs_t::newuser()
 				bputs(text[EnterYourRealName]);
 			getstr(useron.alias,LEN_ALIAS,kmode);
 			truncsp(useron.alias);
-			if(useron.alias[0]<=' ' || !isalpha(useron.alias[0])
-				|| alias(&cfg,useron.alias,tmp)!=useron.alias
-				|| !stricmp(useron.alias,cfg.sys_id)
-				|| strchr(useron.alias,0xff)
-				|| matchuser(&cfg,useron.alias,TRUE /* sysop_alias */) 
-				|| trashcan(useron.alias,"name")
+			if (!check_name(&cfg,useron.alias)
 				|| (!(cfg.uq&UQ_ALIASES) && !strchr(useron.alias,' '))) {
 				bputs(text[YouCantUseThatName]);
 				if(!yesno(text[ContinueQ]))
 					return(FALSE);
-				continue; 
+				continue;
 			}
 			break; 
 		}
@@ -219,9 +214,8 @@ BOOL sbbs_t::newuser()
 		if(cfg.uq&UQ_ALIASES && cfg.uq&UQ_REALNAME) {
 			while(online) {
 				bputs(text[EnterYourRealName]);
-				if(!getstr(useron.name,LEN_NAME,kmode)
-					|| trashcan(useron.name,"name")
-					|| strchr(useron.name,0xff)
+				getstr(useron.name,LEN_NAME,kmode);
+				if (!check_name(&cfg,useron.name)
 					|| !strchr(useron.name,' ')
 					|| (cfg.uq&UQ_DUPREAL
 						&& userdatdupe(useron.number,U_NAME,LEN_NAME
diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 2f7b779c18..a25b2092d8 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -2570,3 +2570,23 @@ time_t DLLCALL gettimeleft(scfg_t* cfg, user_t* user, time_t starttime)
 
 	return(timeleft);
 }
+
+/*************************************************************************/
+/* Check a supplied name/alias and see if it's valid by our standards.   */
+/*************************************************************************/
+BOOL DLLCALL check_name(scfg_t* cfg, char* name)
+{
+	char	tmp[512];
+
+	if (   name[0] <= ' '
+		|| !isalpha(name[0])
+		|| !stricmp(name,cfg->sys_id)
+		|| strchr(name,0xff)
+		|| matchuser(cfg,name,TRUE /* sysop_alias */)
+		|| trashcan(cfg,name,"name")
+		|| alias(cfg,name,tmp)!=name
+ 	   )
+ 		return FALSE;
+ 	return TRUE;
+} 
+
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index 133362018e..308f2db703 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -120,6 +120,8 @@ DLLEXPORT BOOL	DLLCALL user_adjust_minutes(scfg_t* cfg, user_t* user, long amoun
 
 DLLEXPORT time_t DLLCALL gettimeleft(scfg_t* cfg, user_t* user, time_t starttime);
 
+DLLEXPORT BOOL DLLCALL check_name(scfg_t* cfg, char* name);
+
 #ifdef __cplusplus
 }
 #endif
-- 
GitLab