a43625b78a309952c8017aee3c3e92adca5739e8 braney Tue Aug 18 12:03:17 2026 -0700 hgHubConnect: encode the hub url in the genome list, refs #38123 diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c index fb7adbfe078..fd56a944ed5 100644 --- src/hg/hgHubConnect/hgHubConnect.c +++ src/hg/hgHubConnect/hgHubConnect.c @@ -118,82 +118,86 @@ if ( string[len - 1] == ',') string[len - 1] = 0; else if (len > 2 && endsWith(string,", ")) string[len - 2] = 0; } return string; } #define GENLISTWIDTH 40 static void printGenomeList(char *hubUrl, struct slName *genomes, int row, boolean withLink, boolean withPaste) /* print supported assembly names from sl list */ { struct dyString *dyLongHtml = dyStringNew(1024); struct dyString *dyShortHtml = dyStringNew(1024); +// hubUrl comes from the user, so encode it before it goes below: cgiEncode for the query +// parameter, htmlEncode for the attribute the javascript copies to the clipboard. +char *urlForQuery = cgiEncode(hubUrl); +char *urlForAttr = htmlEncode(hubUrl); char *linkHtml = ""; // create two strings: one shortened to GENLISTWIDTH characters // and another one with all genomes int charCount = 0; struct slName *genome = genomes; for(; genome; genome = genome->next) { // an assembly hub's genome name comes from the hub, so encode it: escName for the query // string, escTrimmed for the text and title attributes char *escName = cgiEncode(genome->name); char *trimmedName = trackHubSkipHubName(genome->name); char *escTrimmed = htmlEncode(trimmedName); char *shortName = cloneString(trimmedName); // If even the first element is too long, truncate its short name. if (genome==genomes && strlen(trimmedName) > GENLISTWIDTH) shortName[GENLISTWIDTH] = 0; // append to dyShortHtml if necessary if (charCount == 0 || (charCount+strlen(trimmedName)<=GENLISTWIDTH)) { if (withLink) { if (hubConnectIsCurated(genome->name)) { - dyStringPrintf(dyShortHtml,"%s" , escTrimmed, hubUrl, escName, htmlEncode(shortName)); + dyStringPrintf(dyShortHtml,"%s" , escTrimmed, urlForQuery, escName, htmlEncode(shortName)); } else { - dyStringPrintf(dyShortHtml,"%s" , escTrimmed, hubUrl, escName, htmlEncode(shortName)); + dyStringPrintf(dyShortHtml,"%s" , escTrimmed, urlForQuery, escName, htmlEncode(shortName)); } // https://hgdownload-test.gi.ucsc.edu/hubs/GCA/009/914/755/GCA_009914755.4/hub.txt if (withPaste) - dyStringPrintf(dyShortHtml, linkHtml, hubUrl); + dyStringPrintf(dyShortHtml, linkHtml, urlForAttr); } else dyStringPrintf(dyShortHtml,"%s" , htmlEncode(shortName)); dyStringPrintf(dyShortHtml,", "); } freeMem(shortName); charCount += strlen(trimmedName); // always append to dyLongHtml if (withLink) { if (hubConnectIsCurated(genome->name)) { - dyStringPrintf(dyLongHtml,"%s" , escTrimmed, hubUrl, escName, escTrimmed); + dyStringPrintf(dyLongHtml,"%s" , escTrimmed, urlForQuery, escName, escTrimmed); } else { - dyStringPrintf(dyLongHtml,"%s" , escTrimmed, hubUrl, escName, escTrimmed); + dyStringPrintf(dyLongHtml,"%s" , escTrimmed, urlForQuery, escName, escTrimmed); } if (withPaste) - dyStringPrintf(dyLongHtml, linkHtml, hubUrl); + dyStringPrintf(dyLongHtml, linkHtml, urlForAttr); } else dyStringPrintf(dyLongHtml,"%s" , escTrimmed); if (genome->next) { dyStringPrintf(dyLongHtml,", "); } } char *longHtml = dyStringCannibalize(&dyLongHtml); char *shortHtml = dyStringCannibalize(&dyShortHtml); shortHtml = removeLastComma(shortHtml);