diff options
-rw-r--r-- | core/checkcloudconnection.cpp | 18 | ||||
-rw-r--r-- | core/git-access.c | 20 | ||||
-rw-r--r-- | core/qthelper.h | 2 |
3 files changed, 26 insertions, 14 deletions
diff --git a/core/checkcloudconnection.cpp b/core/checkcloudconnection.cpp index 05e529b90..b8e9fc26f 100644 --- a/core/checkcloudconnection.cpp +++ b/core/checkcloudconnection.cpp @@ -11,6 +11,7 @@ #include "git-access.h" #include "errorhelper.h" #include "core/subsurface-string.h" +#include "core/membuffer.h" #include "core/settings/qPrefCloudStorage.h" #include "checkcloudconnection.h" @@ -197,9 +198,20 @@ void CheckCloudConnection::gotContinent(QNetworkReply *reply) } // helper to be used from C code -extern "C" bool canReachCloudServer() +extern "C" bool canReachCloudServer(const char **remote) { if (verbose) - qWarning() << "Cloud storage: checking connection to cloud server"; - return CheckCloudConnection().checkServer(); + qWarning() << "Cloud storage: checking connection to cloud server" << *remote; + bool connection = CheckCloudConnection().checkServer(); + if (strstr(*remote, prefs.cloud_base_url) == nullptr) { + // we switched the cloud URL - likely because we couldn't reach the server passed in + // the strstr with the offset is designed so we match the right component in the name; + // the cloud_base_url ends with a '/', so we need the text starting at "git/..." + char *newremote = format_string("%s%s", prefs.cloud_base_url, strstr(*remote, "org/git/") + 4); + if (verbose) + qDebug() << "updating remote to: " << newremote; + free((void*)*remote); + *remote = newremote; + } + return connection; } diff --git a/core/git-access.c b/core/git-access.c index c66a24a5d..4b8762749 100644 --- a/core/git-access.c +++ b/core/git-access.c @@ -718,7 +718,7 @@ int sync_with_remote(git_repository *repo, const char *remote, const char *branc // we know that we already checked for the cloud server, but to give a decent warning message // here in case none of them are reachable, let's check one more time - if (is_subsurface_cloud && !canReachCloudServer()) { + if (is_subsurface_cloud && !canReachCloudServer(&remote)) { // this is not an error, just a warning message, so return 0 SSRF_INFO("git storage: cannot connect to remote server"); report_error("Cannot connect to cloud server, working with local copy"); @@ -889,7 +889,7 @@ static git_repository *create_local_repo(const char *localdir, const char *remot opts.fetch_opts.callbacks.certificate_check = certificate_check_cb; opts.checkout_branch = branch; - if (is_subsurface_cloud && !canReachCloudServer()) { + if (is_subsurface_cloud && !canReachCloudServer(&remote)) { SSRF_INFO("git storage: cannot reach remote server"); return 0; } @@ -985,10 +985,10 @@ static struct git_repository *get_remote_repo(const char *localdir, const char * * https://host/repo[branch] * file://repo[branch] */ -static struct git_repository *is_remote_git_repository(char *remote, const char *branch) +static struct git_repository *is_remote_git_repository(char **remote, const char *branch) { char c, *localdir; - char *p = remote; + char *p = *remote; while ((c = *p++) >= 'a' && c <= 'z') /* nothing */; @@ -1024,7 +1024,7 @@ static struct git_repository *is_remote_git_repository(char *remote, const char * next we need to make sure that any encoded username * has been extracted from the URL */ - char *at = strchr(remote, '@'); + char *at = strchr(*remote, '@'); if (at) { /* was this the @ that denotes an account? that means it was before the * first '/' after the protocol:// - so let's find a '/' after that and compare */ @@ -1037,13 +1037,13 @@ static struct git_repository *is_remote_git_repository(char *remote, const char memmove(p, at + 1, strlen(at + 1) + 1); } } - localdir = get_local_dir(remote, branch); + localdir = get_local_dir(*remote, branch); if (!localdir) return NULL; /* remember if the current git storage we are working on is our cloud storage * this is used to create more user friendly error message and warnings */ - is_subsurface_cloud = strstr(remote, prefs.cloud_base_url) != NULL; + is_subsurface_cloud = strstr(*remote, prefs.cloud_base_url) != NULL; /* if we are planning to access the server, make sure it's available and try to * pick one of the alternative servers if necessary */ @@ -1051,9 +1051,9 @@ static struct git_repository *is_remote_git_repository(char *remote, const char // since we know that this is Subsurface cloud storage, we don't have to // worry about the local directory name changing if we end up with a different // cloud_base_url... the algorithm normalizes those URLs - (void)canReachCloudServer(); + (void)canReachCloudServer((const char **)remote); } - return get_remote_repo(localdir, remote, branch); + return get_remote_repo(localdir, *remote, branch); } /* @@ -1127,7 +1127,7 @@ struct git_repository *is_git_repository(const char *filename, const char **bran *remote = loc; return dummy_git_repository; } - repo = is_remote_git_repository(loc, branch); + repo = is_remote_git_repository(&loc, branch); if (repo) { if (remote) *remote = loc; diff --git a/core/qthelper.h b/core/qthelper.h index 1fc2e55f3..cd28e1705 100644 --- a/core/qthelper.h +++ b/core/qthelper.h @@ -138,7 +138,7 @@ extern "C" { char *printGPSCoordsC(const location_t *loc); bool getProxyString(char **buffer); -bool canReachCloudServer(); +bool canReachCloudServer(const char **remote); void updateWindowTitle(); void subsurface_mkdir(const char *dir); char *get_file_name(const char *fileName); |