Bug#1085591: bookworm-pu: package lgogdownloader/3.9-2
Package: release.debian.org
Severity: normal
Tags: bookworm
User: release.debian.org@packages.debian.org
Usertags: pu
Dear release team,
[ Reason ]
The version of lgogdownloader in stable crashes with current URLs used
in GOG; see #1085527 for an example. This renders the package
unusable.
[ Impact ]
Users can no longer download artifacts using lgogdownloader, which is
the package’s sole purpose.
[ Tests ]
The proposed fix is the fix implemented upstream; see
https://github.com/Sude-/lgogdownloader/issues/279 for details. The
patches apply as-is to the version in Bookworm; see
https://github.com/Sude-/lgogdownloader/commit/52b8bdc8fa0028bcb875c6a723c6e04deeecbcb8
and
https://github.com/Sude-/lgogdownloader/commit/6556dc6a82b4e3d64ef1a7940736be3a7b2ac956
The fix is already available in unstable (it’s included in version
3.15) and works there. 3.9 with these patches builds and works fine; I
can reproduce the bug and verify that the suggested patch fixes it.
[ Risks ]
The fix seems straightforward enough to me. In any case the package is
already broken, making it worse won’t make the situation worse for
users.
[ Checklist ]
[x] *all* changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in (old)stable
[x] the issue is verified as fixed in unstable
[ Changes ]
The changes add a number of checks to the
galaxyAPI::getPathFromDownloadUrl function to handle new components
found in URLs.
[ Other info ]
Nothing I can think of!
Regards,
Stephen
diff --git a/debian/changelog b/debian/changelog
index a798d46..1cb1f94 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+lgogdownloader (3.9-2+deb12u1) bookworm; urgency=medium
+
+ * Apply upstream fixes for parsing Galaxy URLs. Closes: #1085527.
+
+ -- Stephen Kitt <skitt@debian.org> Sun, 20 Oct 2024 21:39:20 +0200
+
lgogdownloader (3.9-2) unstable; urgency=medium
* qtwebengine5-dev is now available on mips64el, use it there. Thanks
diff --git a/debian/patches/galaxy-urls-1.patch b/debian/patches/galaxy-urls-1.patch
new file mode 100644
index 0000000..bcc5a24
--- /dev/null
+++ b/debian/patches/galaxy-urls-1.patch
@@ -0,0 +1,24 @@
+commit 52b8bdc8fa0028bcb875c6a723c6e04deeecbcb8
+Author: Sude <lgogdownloader@gmail.com>
+Date: Thu Aug 22 18:13:44 2024 +0300
+
+ Fix galaxyAPI::getPathFromDownlinkUrl with Fastly CDN urls
+
+ Fastly CDN urls don't contain query strings
+
+diff --git a/src/galaxyapi.cpp b/src/galaxyapi.cpp
+index 56d5745..7699d69 100644
+--- a/src/galaxyapi.cpp
++++ b/src/galaxyapi.cpp
+@@ -567,6 +567,11 @@ std::string galaxyAPI::getPathFromDownlinkUrl(const std::string& downlink_url, c
+ else
+ filename_end_pos = downlink_url_unescaped.find_first_of("?");
+
++ // Downlink doesn't contain "?path=" or "?"
++ // Set end pos to length
++ if (filename_end_pos == std::string::npos)
++ filename_end_pos = downlink_url_unescaped.length();
++
+ if (downlink_url_unescaped.find("/" + gamename + "/") != std::string::npos)
+ {
+ path.assign(downlink_url_unescaped.begin()+downlink_url_unescaped.find("/" + gamename + "/"), downlink_url_unescaped.begin()+filename_end_pos);
diff --git a/debian/patches/galaxy-urls-2.patch b/debian/patches/galaxy-urls-2.patch
new file mode 100644
index 0000000..8d32f26
--- /dev/null
+++ b/debian/patches/galaxy-urls-2.patch
@@ -0,0 +1,88 @@
+commit 6556dc6a82b4e3d64ef1a7940736be3a7b2ac956
+Author: Sude <lgogdownloader@gmail.com>
+Date: Thu Aug 22 21:50:23 2024 +0300
+
+ Add more checks to galaxyAPI::getPathFromDownlinkUrl
+
+diff --git a/src/galaxyapi.cpp b/src/galaxyapi.cpp
+index 7699d69..716ebdd 100644
+--- a/src/galaxyapi.cpp
++++ b/src/galaxyapi.cpp
+@@ -547,40 +547,51 @@ std::string galaxyAPI::getPathFromDownlinkUrl(const std::string& downlink_url, c
+ {
+ std::string path;
+ std::string downlink_url_unescaped = (std::string)curl_easy_unescape(curlhandle, downlink_url.c_str(), downlink_url.size(), NULL);
++ size_t filename_start_pos = 0;
+
+- // GOG has changed the url formatting few times between 2 different formats.
+- // Try to get proper file name in both cases.
+- size_t filename_end_pos;
+- if (downlink_url_unescaped.find("?path=") != std::string::npos)
++ // If url ends in "/" then remove it
++ if (downlink_url_unescaped.back() == '/')
++ downlink_url_unescaped.assign(downlink_url_unescaped.begin(), downlink_url_unescaped.end()-1);
++
++ // Assume that filename starts after last "/" in url
++ if (downlink_url_unescaped.find_last_of("/") != std::string::npos)
++ filename_start_pos = downlink_url_unescaped.find_last_of("/") + 1;
++
++ // Url contains "/gamename/"
++ if (downlink_url_unescaped.find("/" + gamename + "/") != std::string::npos)
++ filename_start_pos = downlink_url_unescaped.find("/" + gamename + "/");
++
++ // Assume that filename ends at the end of url
++ size_t filename_end_pos = downlink_url_unescaped.length();
++
++ // Check to see if url has any query strings
++ if (downlink_url_unescaped.find("?") != std::string::npos)
+ {
+- size_t token_pos = downlink_url_unescaped.find("&token=");
+- size_t access_token_pos = downlink_url_unescaped.find("&access_token=");
+- if ((token_pos != std::string::npos) && (access_token_pos != std::string::npos))
+- {
+- filename_end_pos = std::min(token_pos, access_token_pos);
+- }
+- else
++ // Assume that filename ends at first "?"
++ filename_end_pos = downlink_url_unescaped.find_first_of("?");
++
++ // Check for "?path="
++ if (downlink_url_unescaped.find("?path=") != std::string::npos)
+ {
+- filename_end_pos = downlink_url_unescaped.find_first_of("&");
++ size_t token_pos = downlink_url_unescaped.find("&token=");
++ size_t access_token_pos = downlink_url_unescaped.find("&access_token=");
++ if ((token_pos != std::string::npos) && (access_token_pos != std::string::npos))
++ {
++ filename_end_pos = std::min(token_pos, access_token_pos);
++ }
++ else
++ {
++ if (downlink_url_unescaped.find_first_of("&") != std::string::npos)
++ filename_end_pos = downlink_url_unescaped.find_first_of("&");
++ }
+ }
+ }
+- else
+- filename_end_pos = downlink_url_unescaped.find_first_of("?");
+
+- // Downlink doesn't contain "?path=" or "?"
+- // Set end pos to length
+- if (filename_end_pos == std::string::npos)
+- filename_end_pos = downlink_url_unescaped.length();
++ path.assign(downlink_url_unescaped.begin()+filename_start_pos, downlink_url_unescaped.begin()+filename_end_pos);
+
+- if (downlink_url_unescaped.find("/" + gamename + "/") != std::string::npos)
+- {
+- path.assign(downlink_url_unescaped.begin()+downlink_url_unescaped.find("/" + gamename + "/"), downlink_url_unescaped.begin()+filename_end_pos);
+- }
+- else
+- {
+- path.assign(downlink_url_unescaped.begin()+downlink_url_unescaped.find_last_of("/")+1, downlink_url_unescaped.begin()+filename_end_pos);
++ // Make sure that path contains "/gamename/"
++ if (path.find("/" + gamename + "/") == std::string::npos)
+ path = "/" + gamename + "/" + path;
+- }
+
+ // Workaround for filename issue caused by different (currently unknown) url formatting scheme
+ // https://github.com/Sude-/lgogdownloader/issues/126
diff --git a/debian/patches/series b/debian/patches/series
index 4c469df..f993a5c 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,4 @@
manpage-whatis.patch
reproducible.patch
+galaxy-urls-1.patch
+galaxy-urls-2.patch
Reply to: