diff --git a/core/git-access.c b/core/git-access.c index bd958b517..31ab9f1d8 100644 --- a/core/git-access.c +++ b/core/git-access.c @@ -130,11 +130,22 @@ static int push_transfer_progress_cb(unsigned int current, unsigned int total, s return git_storage_update_progress(buf); } -char *get_local_dir(const char *remote, const char *branch) +char *get_local_dir(const char *remote_in, const char *branch) { SHA_CTX ctx; unsigned char hash[20]; + // this optimization could in theory lead to odd things happening if the + // cloud backend servers ever get out of sync - but when a user switches + // between those servers (either because one is down, or because the algorithm + // which server to pick changed, or because the user is on a different continent), + // then the hash and therefore the local directory would change. To prevent that + // from happening, normalize the cloud string to always use the old default name. + // That's trivial with QString operations and painful to do right in plain C, so + // let's be lazy and call a C++ helper function + // just remember to free the string we get back + const char *remote = normalize_cloud_name(remote_in); + // That zero-byte update is so that we don't get hash // collisions for "repo1 branch" vs "repo 1branch". SHA1_Init(&ctx); @@ -142,7 +153,7 @@ char *get_local_dir(const char *remote, const char *branch) SHA1_Update(&ctx, "", 1); SHA1_Update(&ctx, branch, strlen(branch)); SHA1_Final(hash, &ctx); - + free((void *)remote); return format_string("%s/cloudstorage/%02x%02x%02x%02x%02x%02x%02x%02x", system_default_directory(), hash[0], hash[1], hash[2], hash[3], diff --git a/core/qthelper.cpp b/core/qthelper.cpp index 6678cc87f..185e46bbc 100644 --- a/core/qthelper.cpp +++ b/core/qthelper.cpp @@ -22,6 +22,7 @@ #include "trip.h" #include "imagedownloader.h" #include "xmlparams.h" +#include "core/git-access.h" // for CLOUD_HOST definitions #include #include #include @@ -1455,6 +1456,15 @@ extern "C" char *cloud_url() return copy_qstring(filename); } +extern "C" const char *normalize_cloud_name(const char *remote_in) +{ + // replace ssrf-cloud-XX.subsurface... names with cloud.subsurface... names + // that trailing '/' is to match old code + QString ri(remote_in); + ri.replace(QRegularExpression(CLOUD_HOST_PATTERN), CLOUD_HOST_GENERIC "/"); + return strdup(ri.toUtf8().constData()); +} + extern "C" bool getProxyString(char **buffer) { if (prefs.proxy_type == QNetworkProxy::HttpProxy) { diff --git a/core/qthelper.h b/core/qthelper.h index 135689c69..1fc2e55f3 100644 --- a/core/qthelper.h +++ b/core/qthelper.h @@ -147,6 +147,7 @@ void copy_image_and_overwrite(const char *cfileName, const char *path, const cha char *move_away(const char *path); const char *local_file_path(struct picture *picture); char *cloud_url(); +const char *normalize_cloud_name(const char *remote_in); char *hashfile_name_string(); char *picturedir_string(); const char *subsurface_user_agent();