7a185fecc55ea44b360f04d250e64bcbaaf4d53e
hiram
  Wed Sep 2 13:45:33 2026 -0700
remove references and functions related to the "debug" argument, becomes a harmless no-operation and eliminated potential security loop-holes no redmine

diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c
index 024bfec48a7..3b55202de6e 100644
--- src/hg/hubApi/hubApi.c
+++ src/hg/hubApi/hubApi.c
@@ -21,31 +21,32 @@
 | registrationTime | varchar(255)     | NO   |     | NULL    |       |
 | dbCount          | int(10) unsigned | NO   |     | NULL    |       |
 | dbList           | blob             | YES  |     | NULL    |       |
 | descriptionUrl   | longblob         | YES  |     | NULL    |       |
 +------------------+------------------+------+-----+---------+-------+
 */
 
 /* Global Variables for all modules */
 
 static int maxItemLimit = 1000000;   /* maximum of 1,000,000 items returned */
 int maxItemsOutput = 1000000;   /* can be set in URL maxItemsOutput=N */
 boolean reachedMaxItems = FALSE;	/* during getData, signal to return */
 long long itemsReturned = 0;	/* for getData functions, number of items returned */
 /* for debugging purpose, current bot delay value */
 int botDelay = 0;
-boolean debug = FALSE;	/* can be set in URL debug=1, to turn off: debug=0 */
+/* debug options removed/disabled 2026-09-02 */
+/* boolean debug = FALSE; can be set in URL debug=1, to turn off: debug=0 */
 #define delayFraction	0.03
 
 /* default is to list all trackDb entries, composite containers too.
  * This option will limit to only the actual track entries with data
  */
 boolean trackLeavesOnly = FALSE;  /* set by CGI parameter 'trackLeavesOnly' */
 /* this selects output type 'arrays', where the default type is: objects */
 boolean jsonOutputArrays = FALSE; /* set by CGI parameter 'jsonOutputArrays' */
 
 boolean measureTiming = FALSE;	/* set by CGI parameters */
 
 /* downloadUrl for use in error exits when reachedMaxItems */
 struct dyString *downloadUrl = NULL;
 
 /* valid argument listings to verify extraneous arguments */
@@ -263,32 +264,30 @@
     }
 
 boolean superChild = tdbIsSuperTrackChild(tdb);
 char *genome = NULL;
 if (hub)
     genome = hub->genomeList->name;
 
 // tdb->track (and tdb->parent->track) carry the hub_<id>_ decoration;
 // display and outgoing URLs should show/use the name as it actually
 // appears in trackDb.txt.  protectedTrack() below still needs the
 // decorated tdb->track, untouched, to recognize a hub track.
 char *trackName = trackHubSkipHubName(tdb->track);
 char *parentName = tdb->parent ? trackHubSkipHubName(tdb->parent->track) : NULL;
 
 struct dyString *extraDyFlags = dyStringNew(128);
-if (debug)
-    dyStringAppend(extraDyFlags, ";debug=1");
 if (jsonOutputArrays)
     dyStringAppend(extraDyFlags, ";jsonOutputArrays=1");
 char *extraFlags = dyStringCannibalize(&extraDyFlags);
 
 if (protectedTrack(db, tdb, tdb->track))
     hPrintf("<li>%s : %s &lt;protected data&gt;</li>\n", trackName, tdb->type);
 else if (db)
     {
     if (hub)
 	{
 	char urlReference[2048];
 	safef(urlReference,	sizeof(urlReference), " <a href='%s/getData/track?hubUrl=%s;genome=%s;track=%s;maxItemsOutput=5%s' target=_blank>(sample data)%s</a>\n", urlPrefix, hub->url, genome, trackName, extraFlags, errorPrint);
 
 	if (tdb->parent)
 	    hPrintf("<li><b>%s</b>: %s subtrack of parent: %s%s</li>\n", trackName, tdb->type, parentName, urlReference);
@@ -314,32 +313,30 @@
     safef(urlReference, sizeof(urlReference), " <a href='%s/getData/track?hubUrl=%s;genome=%s;track=%s;maxItemsOutput=5%s' target=_blank>(sample data)%s</a>\n", urlPrefix, hub->url, genome, trackName, extraFlags, errorPrint);
 
     if (tdb->parent)
 	hPrintf("<li><b>%s</b>: %s subtrack of parent: %s%s</li>\n", trackName, tdb->type, parentName, urlReference);
     else
 	hPrintf("<li><b>%s</b>: %s%s</li>\n", trackName, tdb->type, urlReference);
     }
 else
     hPrintf("<li>%s : %s not db hub track ?</li>\n", trackName, tdb->type);
 }
 
 static void hubSampleUrl(struct trackHub *hub, char *db, struct trackDb *tdb,
     long chromCount, long itemCount, char *genome, char *errorString)
 {
 struct dyString *extraDyFlags = dyStringNew(128);
-if (debug)
-    dyStringAppend(extraDyFlags, ";debug=1");
 if (jsonOutputArrays)
     dyStringAppend(extraDyFlags, ";jsonOutputArrays=1");
 char *extraFlags = dyStringCannibalize(&extraDyFlags);
 
 char errorPrint[2048];
 errorPrint[0] = 0;
 
 if (isNotEmpty(errorString))
     {
     safef(errorPrint, sizeof(errorPrint), " : <font color='red'>ERROR: %s</font>", errorString);
     }
 
 char countsMessage[512];
 countsMessage[0] = 0;
 if (chromCount > 0 || itemCount > 0)
@@ -512,35 +509,30 @@
     {
     retVal = 1;
     dyStringPrintf(errors, "%s", errCatch->message->string);
     }
 errCatchFree(&errCatch);
 
 return retVal;
 }	/* static int bbiBriefMeasure() */
 
 static void hubSubTracks(struct trackHub *hub, char *db, struct trackDb *tdb,
     struct hash *countTracks,  long chromCount, long itemCount,
     char *chromName, unsigned chromSize, char *genome, char *errorString)
 /* tdb has subtracks, show only subTracks, no details, this is RECURSIVE */
 {
 hPrintf("    <li><ul>\n");
-if (debug)
-    {
-    hPrintf("    <li>subtracks for '%s' db: '%s'</li>\n", trackHubSkipHubName(tdb->track), db);
-    hPrintf("    <li>chrom: '%s' size: %u</li>\n", chromName, chromSize);
-    }
 if (tdb->subtracks)
     {
     struct trackDb *tdbEl = NULL;
     for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next)
 	{
 	// display name as it appears in trackDb.txt; tdbEl->track itself
 	// stays decorated for hashCountTrack()/recursive calls below
 	char *tdbElName = trackHubSkipHubName(tdbEl->track);
 	char *tdbElParentName = tdbEl->parent ? trackHubSkipHubName(tdbEl->parent->track) : NULL;
 	// trackHasData() also excludes tdbIsContainer() (e.g. 'container
 	// multiWig'), which has no bigDataUrl of its own -- its data comes
 	// from its children.
 	if (trackHasData(tdbEl))
 	    {
             char *bigDataIndex = NULL;
@@ -565,37 +557,33 @@
 		hPrintf("<li><b>%s</b>: %s : subtrack of parent: %s</li>\n", tdbElName, tdbEl->type, tdbElParentName);
 	    }
 	hashCountTrack(tdbEl, countTracks);
         if (tdbEl->subtracks)
 	    hubSubTracks(hub, db, tdbEl, countTracks, chromCount, itemCount, chromName, chromSize, genome, errorString);
 	}
     }
 hPrintf("    </ul></li>\n");
 }	/* hubSubTracks() */
 
 static void showSubTracks(struct trackHub *hub, char *db, struct trackDb *tdb, struct hash *countTracks,
     char *chromName, unsigned chromSize, char *errorString)
 /* tdb has subtracks, show only subTracks, no details */
 {
 hPrintf("    <li><ul>\n");
-if (debug)
-    hPrintf("    <li>subtracks for '%s' db: '%s'</li>\n", tdb->track, db);
 if (tdb->subtracks)
     {
     struct dyString *extraDyFlags = dyStringNew(128);
-    if (debug)
-	dyStringAppend(extraDyFlags, ";debug=1");
     if (jsonOutputArrays)
 	dyStringAppend(extraDyFlags, ";jsonOutputArrays=1");
     char *extraFlags = dyStringCannibalize(&extraDyFlags);
     struct trackDb *tdbEl = NULL;
     for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next)
 	{
         if (tdbIsCompositeView(tdbEl))
 	    hPrintf("<li><b>%s</b>: %s : composite view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track);
 	else
 	    {
 	    if (isSupportedType(tdbEl->type))
 		sampleUrl(hub, db, tdbEl, errorString);
 	    else
                 if (hub && hub->url)
 		    hPrintf("<li><b>%s</b>: %s : subtrack of parent: %s, genome %s, url %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track, db, hub->url);
@@ -626,33 +614,30 @@
     if (sameWord("track", hel->name))
 	continue;	// already output in header
     if (sameWord("tableBrowser", hel->name)
 		&& startsWithWord("off", (char*)hel->val))
 	hPrintf("    <li><b>protectedData</b>: 'true'</li>\n");
     else if (protectedData && sameWord("bigDataUrl", hel->name))
 	hPrintf("    <li><b>bigDataUrl</b>: &lt;protected data&gt;</li>\n");
     else if (isEmpty((char *)hel->val))
 	hPrintf("    <li><b>%s</b>: &lt;empty&gt;</li>\n", hel->name);
     else
 	hPrintf("    <li><b>%s</b>: '%s'</li>\n", hel->name, (char *)hel->val);
     }
 if (tdb->subtracks)
     {
     struct trackDb *tdbEl = NULL;
-    if (debug)
-	hPrintf("   <li>has %d subtrack(s)</li>\n", slCount(tdb->subtracks));
-
     for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next)
 	{
         hPrintf("<li>subtrack: %s of parent: %s : type: '%s' (TBD: sample data)</li>\n", trackHubSkipHubName(tdbEl->track), trackHubSkipHubName(tdbEl->parent->track), tdbEl->type);
 	hashCountTrack(tdbEl, countTracks);
 	trackSettings(db, tdbEl, countTracks);
 	}
     }
 hPrintf("    </ul></li>\n");
 }
 
 static void hubCountOneTdb(struct trackHub *hub, char *db, struct trackDb *tdb,
     char *bigDataIndex, struct hash *countTracks, char *chromName,
     unsigned chromSize, char *genome)
 {
 char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
@@ -1129,39 +1114,30 @@
 
 if (isEmpty(httpHost))
     urlPrefix = "";
 else
     {
     if (! startsWith("hgwdev-api", httpHost))
 	{
 	if (startsWith("hgwdev",httpHost) || startsWith("genome-test", httpHost))
 	    {
 	    urlPrefix = "../cgi-bin/hubApi";
 	    }
 	}
     }
 }
 
-static void showCartDump()
-/* for information purposes only during development, will become obsolete */
-{
-hPrintf("<h4>cart dump</h4>");
-hPrintf("<pre>\n");
-cartDump(cart);
-hPrintf("</pre>\n");
-}
-
 static void sendJsonHogMessage(char *hogHost)
 {
 apiErrAbort(err429, err429Msg, "Your host, %s, has been sending too many requests lately and is "
        "unfairly loading our site, impacting performance for other users. "
        "Please contact genome-www@soe.ucsc.edu to ask that your site "
        "be reenabled.  Also, please consider downloading sequence and/or "
        "annotations in bulk -- see http://genome.ucsc.edu/downloads.html.",
        hogHost);
 }
 
 static void sendHogMessage(char *hogHost)
 {
 puts("X-Content-Type-Options: nosniff");
 cspWriteResponseHeader();
 puts("Content-Type:text/html");
@@ -1305,34 +1281,30 @@
 hCheckBox("jsonOutputArrays", jsonOutputArrays);
 hWrites("&nbsp;more array data than objects (default: mostly object output)");
 hWrites("</td></tr>\n");
 
 /* go button at the bottom of the table */
 hWrites("<tr><td>&nbsp;</td><td align=center>");
 hButton("sourceSelected", "go");
 hWrites("</td><td>press 'go' after selections made</td></tr>\n");
 
 hPrintf("</form>\n");
 
 hPrintf("<tr><th colspan=3>(example JSON list output: <a href='/list/publicHubs' target=_blank>Public hubs</a>, and <a href='/list/ucscGenomes' target=_blank>UCSC database genomes</a>)</th></tr>\n");
 
 hPrintf("</table>\n");
 hPrintf("</td></tr></table>\n");
-
-/* how does debug carry forward ? */
-// if (debug)
-//    cgiMakeHiddenVar("debug", "1");
 }
 
 static void apiRequest(char *pathInfo)
 {
 hPrintDisable();
 /*expect no more than MAX_PATH_INFO number of words*/
 char *words[MAX_PATH_INFO];
 /* can immediately verify valid parameters right here right now */
 char *start = cgiOptionalString("start");
 char *end = cgiOptionalString("end");
 char *db = cgiOptionalString("genome");
 char *hubUrl = cgiOptionalString("hubUrl");
 struct dyString *errorMsg = dyStringNew(128);
 
 // first check for curated hubs
@@ -1467,128 +1439,74 @@
 char *pathInfo = getenv("PATH_INFO");
 /* nothing on incoming path, then display the WEB page instead */
 if (sameOk("/",pathInfo))
     pathInfo = NULL;
 
 (void) hubPublicDbLoadAll();
 
 webStartJWest(cart, database, "Genome Browser API");
 // webStartGbNoBanner(cart, database, "UCSC JSON API interface");
 // webStartGbOptionalBanner(cart, database, "UCSC JSON API interface", TRUE, FALSE);
 
 hPrintf("<div class='container-fluid gbPage'>\n");
 /* these style mentions need to go into custom css file */
 hPrintf("<div style='border:10px solid white'>\n");
 
-if (debug)
-    {
-    hPrintf("<ul>\n");
-    hPrintf("<li>hgBotDelay: %d</li>\n", botDelay);
-    char *envVar = getenv("BROWSER_HOST");
-    hPrintf("<li>BROWSER_HOST:%s</li>\n", envVar);
-    envVar = getenv("CONTEXT_DOCUMENT_ROOT");
-    hPrintf("<li>CONTEXT_DOCUMENT_ROOT:%s</li>\n", envVar);
-    envVar = getenv("CONTEXT_PREFIX");
-    hPrintf("<li>CONTEXT_PREFIX:%s</li>\n", envVar);
-    envVar = getenv("DOCUMENT_ROOT");
-    hPrintf("<li>DOCUMENT_ROOT:%s</li>\n", envVar);
-    envVar = getenv("HTTP_HOST");
-    hPrintf("<li>HTTP_HOST:%s</li>\n", envVar);
-    envVar = getenv("REQUEST_URI");
-    hPrintf("<li>REQUEST_URI:%s</li>\n", envVar);
-    envVar = getenv("SCRIPT_FILENAME");
-    hPrintf("<li>SCRIPT_FILENAME:%s</li>\n", envVar);
-    envVar = getenv("SCRIPT_NAME");
-    hPrintf("<li>SCRIPT_NAME:%s</li>\n", envVar);
-    envVar = getenv("SCRIPT_URI");
-    hPrintf("<li>SCRIPT_URI:%s</li>\n", envVar);
-    envVar = getenv("SCRIPT_URL");
-    hPrintf("<li>SCRIPT_URL:%s</li>\n", envVar);
-    envVar = getenv("SERVER_NAME");
-    hPrintf("<li>SERVER_NAME:%s</li>\n", envVar);
-    envVar = getenv("PATH_INFO");
-    if (isNotEmpty(envVar))
-       hPrintf("<li>PATH_INFO:'%s'</li>\n", envVar);
-    else
-       hPrintf("<li>PATH_INFO:&lt;empty&gt;</li>\n");
-    hPrintf("</ul>\n");
-    }
-
 char *otherHubUrl = cartUsualString(cart, "urlHub", "");
 char *hubDropDown = cartUsualString(cart, "publicHubs", defaultHub);
 char *urlDropDown = urlFromShortLabel(hubDropDown);
 char *ucscDb = cartUsualString(cart, "ucscGenome", defaultDb);
 char *selectRadio = cartUsualString(cart, RADIO_GROUP, RADIO_PUBHUB);
 char *urlInput = urlDropDown;	/* assume public hub */
-if (debug)
-    {
-    hPrintf("<ul>\n");
-    hPrintf("<li>otherHubUrl: '%s'</li>\n", otherHubUrl);
-    hPrintf("<li>hubDropDown: '%s'</li>\n", hubDropDown);
-    hPrintf("<li>urlDropDown: '%s'</li>\n", urlDropDown);
-    hPrintf("<li>ucscDb: '%s'</li>\n", ucscDb);
-    hPrintf("<li>urlInput: '%s'</li>\n", urlInput);
-    hPrintf("<li>trackLeavesOnly: '%s'</li>\n", trackLeavesOnly ? "TRUE" : "FALSE");
-    hPrintf("<li>jsonOutputArrays: '%s'</li>\n", jsonOutputArrays ? "TRUE" : "FALSE");
-    hPrintf("</ul>\n");
-    }
 if (isEmpty(otherHubUrl))
     otherHubUrl = urlInput;
 
 if (sameWord(RADIO_OTHERHUB, selectRadio))	/* requested other hub URL */
     urlInput = otherHubUrl;
 
 long lastTime = clock1000();
 struct trackHub *hub = errCatchTrackHubOpen(urlInput);
 if (measureTiming)
     {
     long thisTime = clock1000();
     hPrintf("<em>hub open time: %ld millis</em><br>\n", thisTime - lastTime);
     }
 
 hPrintf("<h3>Documentation: <a href='../../goldenPath/help/api.html'>API definitions/help</a>, and <a href='../../goldenPath/help/trackDb/trackDbHub.html' target=_blank>Track definition document</a> for definitions of track settings.</h3>\n");
 
-if (debug)
-    showCartDump();
-
 hPrintf("<h2>Explore hub or database assemblies and tracks (v%s)</h2>\n", SRC_VERSION);
 
 selectionForm();
 
 /* these style mentions need to go into custom css file */
 hPrintf("<div style='height:500px;overflow:scroll'>\n");
 
 if (sameWord(RADIO_UCSCDB, selectRadio))  /* requested UCSC db track list */
     {
     tracksForUcscDb(ucscDb);
     }
 else
     {
     hPrintf("<h3>%s url: <em>%s</em></h3>\n", sameWord(RADIO_PUBHUB,selectRadio) ? "Public hub" : "Other hub", urlInput);
     hPrintf("<ul>\n");
     hubInfo("hub name", hub->name);
     hubInfo("short label", hub->shortLabel);
     hubInfo("long label", hub->longLabel);
     hubInfo("genomes file", hub->genomesFile);
     hubInfo("default db", hub->defaultDb);
     hubInfo("description url", hub->descriptionUrl);
     hubInfo("email", hub->email);
-    if (debug)
-	{
-	hubInfo("version", hub->version);	/* UCSC internal info */
-	hubInfo("level", hub->level);		/* UCSC internal info */
-	}
     hPrintf("</ul>\n");
 
     genomeList(hub);
     }
 
 if (timedOut)
     hPrintf("<h1>Reached time out %ld seconds</h1>", timeOutSeconds);
 if (measureTiming)
     hPrintf("<em>Overall total time: %ld millis</em><br>\n", clock1000() - enteredMainTime);
 
 hPrintf("</div> <!-- end of text analysis output -->\n");
 hPrintf("</div> <!-- end of surrounding border-->\n");
 hPrintf("</div> <!-- end this page contents -->\n");
 
 webIncludeFile("inc/jWestFooter.html");
@@ -1625,34 +1543,30 @@
     else
 	apiErrAbort(err400, err400Msg, "unrecognized 'trackLeavesOnly=%s' argument, can only be =1 or =0", trackLeaves);
     }
 
 char *jsonArray = cgiOptionalString("jsonOutputArrays");
 if (isNotEmpty(jsonArray))
     {
     if (SETTING_IS_ON(jsonArray))
 	jsonOutputArrays = TRUE;
     else if (sameString("0", jsonArray))
 	jsonOutputArrays = FALSE;
     else
 	apiErrAbort(err400, err400Msg, "unrecognized 'jsonOutputArrays=%s' argument, can only be =1 or =0", jsonArray);
     }
 
-int maybeDebug = cgiOptionalInt("debug", 0);
-if (1 == maybeDebug)
-    debug = TRUE;
-
 char *measTime = cgiOptionalString("measureTiming");
 if (isNotEmpty(measTime) && sameWord("1", measTime))
     measureTiming = TRUE;
 char *maxOut = cgiOptionalString("maxItemsOutput");
 if (isNotEmpty(maxOut))
     {
     long long n = -2;
     struct errCatch *errCatch = errCatchNew();
     if (errCatchStart(errCatch))
         {
 	n = sqlLongLong(maxOut);
         }
     errCatchEnd(errCatch);
     if (errCatch->gotError)
 	apiErrAbort(err400, err400Msg, "can not recognize maxItemsOutput '%s' as a number", maxOut);