fe99a2d141b3f2d33e8706c1061d59015e0c571d
hiram
  Thu Jun 4 14:39:19 2026 -0700
correct detection of login status and correct use of local hgcentraltest when not on one of the RR servers refs #31811

diff --git src/hg/hubApi/liftOver.c src/hg/hubApi/liftOver.c
index 274b64ede17..3c655490ab1 100644
--- src/hg/hubApi/liftOver.c
+++ src/hg/hubApi/liftOver.c
@@ -159,51 +159,64 @@
             jsonWriteBoolean(jw, "pending", TRUE);
             jsonWriteNumber(jw, "pendingStatus", sqlSigned(row[1]));
             jsonWriteString(jw, "pendingRequestTime", row[2]);
             }
         sqlFreeResult(&sr);
         }
     }
 
 apiFinishOutput(0, NULL, jw);
 hDisconnectOtto(&conn);
 }
 
 static void loginStatus()
 /* output current user login status as JSON */
 {
-char *userName = (loginSystemEnabled() || wikiLinkEnabled()) ? wikiLinkUserName() : NULL;
+/* wikiLinkUserName() handles all cookie validation internally */
+char *userName = wikiLinkUserName();
 struct jsonWrite *jw = apiStartOutput();
 char hgLoginLink[2048];
+boolean privateHost = hIsPrivateHost();
+/* can not use hgcentral hglogin from hgwdev/genome-test */
+if (privateHost)
+    safef(hgLoginLink, sizeof(hgLoginLink), "%shgLogin", hLocalHostCgiBinUrl());
+else
     safef(hgLoginLink, sizeof(hgLoginLink), "%shgLogin", hLoginHostCgiBinUrl());
 
 if (userName != NULL)
     {
     // Get both email and realName from gbMembers table
-    struct sqlConnection *sc = hConnectOtto();
+    struct sqlConnection *sc = NULL;
+    if (privateHost)
+	sc = hConnectCentral();
+    else
+	sc = hConnectOtto();
     struct dyString *query = sqlDyStringCreate("select email, realName from gbMembers where userName = '%s'", userName);
     struct sqlResult *sr = sqlGetResult(sc, dyStringCannibalize(&query));
     char **row = sqlNextRow(sr);
 
     char *email = NULL;
     char *realName = NULL;
     if (row != NULL)
         {
         email = cloneString(row[0] ? row[0] : "");
         realName = cloneString(row[1] ? row[1] : "");
         }
     sqlFreeResult(&sr);
+    if (privateHost)
+	hDisconnectCentral(&sc);
+    else
 	hDisconnectOtto(&sc);
 
     // Build logout URL with returnto parameter
     char *returnTo = cgiOptionalString("returnTo");
     struct dyString *logoutUrl = dyStringNew(0);
     dyStringPrintf(logoutUrl, "%s?hgLogin.do.displayLogout=1", hgLoginLink);
     if (isNotEmpty(returnTo))
         {
         char *encodedReturnUrl = cgiEncodeFull(returnTo);
 
         dyStringPrintf(logoutUrl, "&returnto=%s", encodedReturnUrl);
         freeMem(encodedReturnUrl);
         }
 
     jsonWriteString(jw, "userName", userName);