156dbcfc96c9a4a5eba481f8d979700b0ca1024e
galt
Mon Feb 3 06:28:18 2025 -0800
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.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 5d1c4bbeae8..8a89d8db1ea 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -174,47 +174,38 @@
// 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 *file,char *term,char *value,char *title, char *label,char *suffix)
+char *wgEncodeVocabLink(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 "";
@@ -283,36 +274,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(NULL,CV_TYPE,mdbVar->var,label,
+ char *linkOfType = wgEncodeVocabLink(CV_TYPE,mdbVar->var,label,
label,NULL);
if (cvTermIsCvDefined(mdbVar->var))
{
label = (char *)cvLabel(mdbVar->var,mdbVar->val);
- char *linkOfTerm = wgEncodeVocabLink(NULL,CV_TERM,mdbVar->val,label,
+ char *linkOfTerm = wgEncodeVocabLink(CV_TERM,mdbVar->val,label,
label,NULL);
dyStringPrintf(dyTable,"