c5af95b7146dde46f2d2f70ecad1eb9b4c37b57f
galt
Mon Feb 3 17:36:09 2025 -0800
Revert "Fixing security concern in hgEncodeVocab. fixes #287. Note that actual full cleanup by removing the unneeded encode/cv.ra from trackDb files has not been done yet., and making the code tolerate its presence or absence in the trackDb.ra files, at the start of the controlledVocabulary setting."
This reverts commit 156dbcfc96c9a4a5eba481f8d979700b0ca1024e.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 8a89d8db1ea..5d1c4bbeae8 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -174,38 +174,47 @@
// until it's implemented
{
char *tbOff = trackDbSetting(tdb, "tableBrowser");
if (isNotEmpty(tbOff) && sameString(nextWord(&tbOff), "off"))
return FALSE;
char *hint = " title='Open data format (table schema) in new window'";
if (label == NULL)
label = " View data format";
struct trackDb *topLevel = trackDbTopLevelSelfOrParent(tdb);
printf(SCHEMA_LINKED, db, topLevel->grp, topLevel->track, tdb->table, hint, label);
return TRUE;
}
return FALSE;
}
-char *wgEncodeVocabLink(char *term,char *value,char *title, char *label,char *suffix)
+char *wgEncodeVocabLink(char *file,char *term,char *value,char *title, char *label,char *suffix)
// returns allocated string of HTML link to controlled vocabulary term
{
+#define VOCAB_LINK_WITH_FILE "%s"
#define VOCAB_LINK "%s"
struct dyString *dyLink = NULL;
char *encTerm = cgiEncode(term);
char *encValue = cgiEncode(value);
+if (file != NULL)
+ {
+ char *encFile = cgiEncode(file);
+ dyLink = dyStringCreate(VOCAB_LINK_WITH_FILE,encFile,encTerm,encValue,title,label);
+ freeMem(encFile);
+ }
+else
dyLink = dyStringCreate(VOCAB_LINK,encTerm,encValue,title,label);
if (suffix != NULL)
dyStringAppend(dyLink,suffix); // Don't encode since this may contain HTML
freeMem(encTerm);
freeMem(encValue);
return dyStringCannibalize(&dyLink);
}
char *pairsAsHtmlTable( struct slPair *pairs, struct trackDb *tdb, boolean showLongLabel,boolean showShortLabel)
/* Return a string which is an HTML table of the tags for this track. */
{
if (pairs == NULL)
return "";
@@ -274,36 +283,36 @@
dyStringAppend(dyTable,"
");
slNameFree(&file);
}
dyStringAppend(dyTable,"");
}
else
{ // Don't bother with tableName
if (cvTermTypes && differentString(mdbVar->var,MDB_VAR_TABLENAME))
{
struct hash *cvTerm = hashFindVal(cvTermTypes,mdbVar->var);
if (cvTerm != NULL) // even if cvTerm isn't used,
{ // it proves that it exists and a link is desirable
if (!cvTermIsHidden(mdbVar->var))
{
char *label = (char *)cvLabel(NULL,mdbVar->var);
- char *linkOfType = wgEncodeVocabLink(CV_TYPE,mdbVar->var,label,
+ char *linkOfType = wgEncodeVocabLink(NULL,CV_TYPE,mdbVar->var,label,
label,NULL);
if (cvTermIsCvDefined(mdbVar->var))
{
label = (char *)cvLabel(mdbVar->var,mdbVar->val);
- char *linkOfTerm = wgEncodeVocabLink(CV_TERM,mdbVar->val,label,
+ char *linkOfTerm = wgEncodeVocabLink(NULL,CV_TERM,mdbVar->val,label,
label,NULL);
dyStringPrintf(dyTable,"