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);