533112afe2a2005e80cdb1f82904ea65032d4302 braney Sat Oct 2 11:37:34 2021 -0700 split hg/lib into two separate libaries, one only used by the cgis diff --git src/hg/cgilib/sessionThumbnail.c src/hg/cgilib/sessionThumbnail.c new file mode 100644 index 0000000..7dc9061 --- /dev/null +++ src/hg/cgilib/sessionThumbnail.c @@ -0,0 +1,82 @@ +/* sessionThumbnail - get the filename, filesystem path, and web URI + * for the thumbnail image associated with a session. + * + * Copyright (C) 2016 The Regents of the University of California + * See README in this or parent directory for licensing information. */ + +#include "common.h" +#include "dystring.h" +#include "hash.h" +#include "trashDir.h" +#include "hgConfig.h" +#include "md5.h" + +#define IMGDIR_OPTION "sessionThumbnail.imgDir" +#define WEBPATH_OPTION "sessionThumbnail.webPath" + +void sessionBuildThumbnailFilePaths(struct tempName *thumbnailPath, char *userIdentifier, + char *encSessionName, char *firstUse) +/* Populate thumbnailPath with paths to the thumbnail image for the specified session. + * The basename of the thumbnail image is based on several pieces of data on the session: + * userIdentifier is an ID for the user that is suitable for being part of a filename and + * presumed to be unique, + * encSessionName is the cgi-encoded session name, + * and firstUse is the mysql-formatted time string for the session's creation date. + * Leaks memory via a dyString. */ +{ +struct dyString *base = dyStringCreate("hgPS_%s_%u_%ld", + userIdentifier, hashString(encSessionName), dateToSeconds(firstUse, "%Y-%m-%d %T")); +char *imgDir = cfgOption(IMGDIR_OPTION); +char *webPath = cfgOption(WEBPATH_OPTION); +if (imgDir != NULL && webPath != NULL) + { + makeDirsOnPath(imgDir); + safef(thumbnailPath->forCgi, sizeof(thumbnailPath->forCgi), "%s%s%s.png", imgDir, + lastChar(thumbnailPath->forCgi) == '/' ? "" : "/", + dyStringContents(base)); + safef(thumbnailPath->forHtml, sizeof(thumbnailPath->forCgi), "%s%s%s.png", imgDir, + lastChar(thumbnailPath->forCgi) == '/' ? "" : "/", + dyStringContents(base)); + } +else if (imgDir != NULL || webPath != NULL) + { + errAbort("Error with session thumbnail path configuration. " + "Either both %s and %s should be set in hg.conf or neither.", + IMGDIR_OPTION, WEBPATH_OPTION); + } +else + trashDirReusableFile(thumbnailPath, "hgPS", dyStringContents(base), ".png"); +} + +char *sessionThumbnailFilePath(char *userIdentifier, char *encSessionName, + char *firstUse) +/* Returns the path to the thumbnail image of the specified session as seen by CGIs. + * Result must be freed. */ +{ +struct tempName thumbnailPath; +sessionBuildThumbnailFilePaths(&thumbnailPath, userIdentifier, encSessionName, firstUse); +return cloneString(thumbnailPath.forCgi); +} + +char *sessionThumbnailFileUri(char *userIdentifier, char *encSessionName, + char *firstUse) +/* Returns the path to the thumbnail image of the specified session as seen by web viewers. + * Result must be freed. */ +{ +struct tempName thumbnailPath; +sessionBuildThumbnailFilePaths(&thumbnailPath, userIdentifier, encSessionName, firstUse); +return cloneString(thumbnailPath.forHtml); +} + + +char *sessionThumbnailGetUserIdentifier(char *userName, char *userIdx) +{ +/* If the user index is NULL (e.g., because the authentication server is + * remote and it couldn't be retrieved), fake a unique identifier with an md5sum. + * Be nice to just go straight to the md5sum, but must be backwards compatible with + * thumbnails generated with the old identifier strings. */ +if (userIdx != NULL) + return cloneString(userIdx); +else + return md5HexForString(userName); +}