a30947b1ec3e1f14afc70537891759c32baf4154 jcasper Thu Feb 17 14:50:17 2022 -0800 Fixing small logic error - determining if a string ends with a / should be calculated on the input, not on the output you haven't written yet. No ticket. diff --git src/hg/cgilib/sessionThumbnail.c src/hg/cgilib/sessionThumbnail.c index 807b9f0..df6ab6c 100644 --- src/hg/cgilib/sessionThumbnail.c +++ src/hg/cgilib/sessionThumbnail.c @@ -1,82 +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 kent/LICENSE or http://genome.ucsc.edu/license/ 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) == '/' ? "" : "/", + lastChar(imgDir) == '/' ? "" : "/", dyStringContents(base)); safef(thumbnailPath->forHtml, sizeof(thumbnailPath->forCgi), "%s%s%s.png", webPath, - lastChar(thumbnailPath->forCgi) == '/' ? "" : "/", + lastChar(webPath) == '/' ? "" : "/", 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); }