32d8c9cb1c107f4bee849bdbf0db07b6bfb2a94d max Wed Jul 8 05:35:07 2026 -0700 hgLogin: require new user names to be at least two characters, refs #10138 Single-character user names are now reserved ("l" is used internally for anonymous shared-session links), so signup() rejects them. The check is only in the account-creation path, so existing accounts -- including any single-character ones -- keep working for login and sessions. diff --git src/hg/hgLogin/hgLogin.c src/hg/hgLogin/hgLogin.c index af0d66723a4..c10d1496378 100644 --- src/hg/hgLogin/hgLogin.c +++ src/hg/hgLogin/hgLogin.c @@ -989,30 +989,39 @@ } void signup(struct sqlConnection *conn) /* process the signup form */ { char query[1024]; char *user = cartUsualString(cart, "hgLogin_userName", ""); char *encUserName = cgiEncodeFull(user); if (!user || sameString(user,"")) { freez(&errMsg); errMsg = cloneString("User name cannot be blank."); signupPage(conn); return; } +/* Require at least two characters. Single-character user names are reserved (e.g. "l" is used + * internally for anonymous shared-session links). */ +if (strlen(user) < 2) + { + freez(&errMsg); + errMsg = cloneString("User name must be at least two characters long."); + signupPage(conn); + return; + } /* Make sure the escaped usrename is less than 32 characters */ if (strlen(encUserName) > 32) { char buf[1024]; safef(buf,sizeof(buf), "Encoded user name: '%s' is %d characters. Please use a shorter name: less than 32 characters after URL encoding.", encUserName, (int)strlen(encUserName)); freez(&errMsg); errMsg = cloneString(buf); signupPage(conn); return; } sqlSafef(query,sizeof(query), "SELECT password FROM gbMembers WHERE userName='%s'", user); char *password = sqlQuickString(conn, query); if (password)