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/lib/wikiLink.c src/hg/lib/wikiLink.c
index bd393d75758..c0ba08902c3 100644
--- src/hg/lib/wikiLink.c
+++ src/hg/lib/wikiLink.c
@@ -535,28 +535,43 @@
         loginUrl(), retEnc);
     }
 else
     {
     if (! wikiLinkEnabled())
         errAbort("wikiLinkUserLogoutUrl called when wiki is not enable (specified "
             "in hg.conf).");
     safef(buf, sizeof(buf),
         "http://%s/index.php?title=Special:UserlogoutUCSC&returnto=%s",
          wikiLinkHost(), retEnc);
     }
 freez(&retEnc);
 return(cloneString(buf));
 }
 
+char *wikiLinkChangeEmailUrl(char *hgsid)
+/* Return the URL for the user change email page.  Only supported by the hgLogin
+ * login system; returns NULL when a remote wiki handles logins. */
+{
+if (!loginSystemEnabled())
+    return NULL;
+char buf[2048];
+char *retEnc = encodedHgSessionReturnUrl(hgsid);
+safef(buf, sizeof(buf),
+    "%s?hgLogin.do.changeEmailPage=1&returnto=%s",
+    loginUrl(), retEnc);
+freez(&retEnc);
+return(cloneString(buf));
+}
+
 void wikiFixLogoutLinkWithJs()
 /* HTTP Basic Auth requires a strange hack to logout. This code prints a script 
  * that fixes an html link with id=logoutLink */
 {
 struct dyString *dy = dyStringNew(4096);
 // logoutJs.h is a stringified .js file
 #include "logoutJs.h"
 dyStringAppend(dy, cdwLogoutJs);
 dyStringPrintf(dy, "$('#logoutLink').click( function() { logout('/', 'http://cirm.ucsc.edu'); return false; });\n");
 jsInline(dy->string);
 dyStringFree(&dy);
 printf("<script src='//cdnjs.cloudflare.com/ajax/libs/bowser/1.6.1/bowser.min.js'></script>");
 }