5f7a14fde8cdb24b01fc0e5eadba145bfd9ecb04 max Sat Jul 25 23:16:06 2026 -0700 hgLogin: social login (Google/ORCID), email login link, change email. refs #37929 diff --git src/hg/hgMenubar/hgMenubar.c src/hg/hgMenubar/hgMenubar.c index 2302170fca7..c4169b593b0 100644 --- src/hg/hgMenubar/hgMenubar.c +++ src/hg/hgMenubar/hgMenubar.c @@ -29,34 +29,37 @@ return cloneString(""); struct dyString *dy = dyStringNew(512); char *userName = wikiLinkUserName(); if (userName == NULL) { // Link straight to the login page (absolute URL from wikiLink), not through hgSession. char *loginUrl = wikiLinkUserLoginUrl(""); dyStringPrintf(dy, "<a class='topRightLink' href=\"%s\" id='loginLink' " "title='Log in to save and share sessions'>Login</a>", loginUrl); } else { // No hgsid available on static pages; the logout return URL simply omits it. char *logoutUrl = wikiLinkUserLogoutUrl(""); char *changePwUrl = wikiLinkChangePasswordUrl(""); + char *changeEmailUrl = wikiLinkChangeEmailUrl(""); dyStringPrintf(dy, "<a class='topRightLink' href='#' id='loginLink' " "title='Account info and sign out' " - "data-username=\"%s\" data-logouturl=\"%s\" data-changepwurl=\"%s\">%s</a>", - userName, logoutUrl, changePwUrl ? changePwUrl : "", userName); + "data-username=\"%s\" data-logouturl=\"%s\" data-changepwurl=\"%s\" " + "data-changeemailurl=\"%s\">%s</a>", + userName, logoutUrl, changePwUrl ? changePwUrl : "", + changeEmailUrl ? changeEmailUrl : "", userName); } return dyStringCannibalize(&dy); } char *incFilePath(char *cgiPath, char *filePath, char *docRoot) /* Replace CGI_NAME in cgiPath with docRoot/filePath. filePath must begin with "/" eg "/inc/..." */ { char *incPath = replaceChars(cgiPath, "/"CGI_NAME, filePath); return catTwoStrings(docRoot, incPath); } void printIncludes(char* baseDir, char *docRoot) { // Cache-buster for the menu-bar CSS/JS: append ?v=<file mtime> so browsers refetch these when // they change instead of serving a stale cached copy (the CGIs get this from