3b2f2b6a075942048a3acac89af44e332a326b7b galt Thu Jun 13 16:23:19 2019 -0700 Enable > 4GB uploads by increasing maximium size of dyString to long (64 bits size) instead of int (32 bits size). This limit was impeding uploads artificially at 4GB. diff --git src/hg/encode3/encodeDataWarehouse/edwWebAuthLogin/edwWebAuthLogin.c src/hg/encode3/encodeDataWarehouse/edwWebAuthLogin/edwWebAuthLogin.c index b5e5008..e2aa797 100644 --- src/hg/encode3/encodeDataWarehouse/edwWebAuthLogin/edwWebAuthLogin.c +++ src/hg/encode3/encodeDataWarehouse/edwWebAuthLogin/edwWebAuthLogin.c @@ -1,110 +1,110 @@ /* edwWebAuthLogin - A tiny little program to help manage Persona logins. Specifically * a little CGI that gets passed in an assertion and then checks that assertion * against the persona verifier web service. If it checks out it sets a cookie called * 'email' with the email address the user logged with Persona. */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "cheapcgi.h" #include "htmshell.h" #include "net.h" #include "jsHelper.h" #include "edwLib.h" void usage() /* Explain usage and exit. */ { errAbort( "edwWebAuthLogin - A tiny little program to help manage Persona logins.\n" "This is meant to be run as a CGI not from the command line\n" ); } char *personaUrl = "https://verifier.login.persona.org/verify"; char *mustGetJsonObjString(struct jsonElement *obj, char *name, char *url) /* Make sure json is an obj, and return a child of given name that is a string. * The URL is just used for error reporting. */ { if (obj->type != jsonObject) errAbort("json response from %s doesn't begin with '{'", url); struct jsonElement *string = hashFindVal(obj->val.jeHash, name); if (string == NULL) errAbort("missing expected %s in json response from %s", name, url); if (string->type != jsonString) errAbort("Expecting string value for %s in json from %s", name, url); return string->val.jeString; } char *mustGetEnv(char *name) /* Get environment variable or squawk and die */ { char *val = getenv(name); if (val == NULL) errAbort("Missing required environment variable %s", name); return val; } char *checkAuth() /* Check authorization assertion and abort if it does not look good. * Returns with email address if all good. */ { /* Get assertion out of CGI variables we were passed. Put it and pointer to self * into cgi variables to pass to assertion checker. */ struct dyString *dyCgi = dyStringNew(0); char *assertion=cgiString("assertion"); cgiEncodeIntoDy("assertion", assertion, dyCgi); char *server = mustGetEnv("SERVER_NAME"); char *port = mustGetEnv("SERVER_PORT"); char serverAndPort[2+strlen(server)+strlen(port)]; safef(serverAndPort, sizeof(serverAndPort), "%s:%s", server, port); cgiEncodeIntoDy("audience", serverAndPort, dyCgi); /* Pass a little CGI post request to Persona including our CGI vars. */ struct dyString *dyHeader = dyStringNew(0); dyStringPrintf(dyHeader, "Content-type: application/x-www-form-urlencoded\r\n"); -dyStringPrintf(dyHeader, "Content-length: %d\r\n", dyCgi->stringSize); +dyStringPrintf(dyHeader, "Content-length: %ld\r\n", dyCgi->stringSize); int sd = netOpenHttpExt(personaUrl, "POST", dyHeader->string); mustWriteFd(sd, dyCgi->string, dyCgi->stringSize); /* Get Persona's response up through end of HTTP header */ /* There's probably a simpler way to do this. We don't need the forwarding. */ char *newUrl = NULL; int newSd = 0; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, personaUrl, &newSd, &newUrl)) errAbort("%s didn't give a good http header", personaUrl); if (newUrl != NULL) { sd = newSd; freeMem(newUrl); } /* Parse out response as JavaScript and check status field and fetch email field. */ struct dyString *response = netSlurpFile(sd); struct jsonElement *json = jsonParse(response->string); char *status = mustGetJsonObjString(json, "status", personaUrl); if (!sameString(status, "okay")) errAbort("Status not okay, is %s from %s", status, personaUrl); /* Return email */ return mustGetJsonObjString(json, "email", personaUrl); } int main(int argc, char *argv[]) /* Process command line. */ { if (!cgiIsOnWeb()) usage(); char *email = checkAuth(); char sid[EDW_SID_SIZE]; edwMakeSid(email, sid); printf("Content-Type:text/plain\r\n"); printf("Set-Cookie: email=%s\r\n", cgiEncode(email)); printf("Set-Cookie: sid=%s\r\n", cgiEncode(sid)); printf("\r\n"); printf("ok\n"); return 0; }