From 7b4791005a828da661fdaa850b0b8c045ff6c28a Mon Sep 17 00:00:00 2001 From: emeric Date: Thu, 14 Nov 2024 23:18:00 +0100 Subject: [PATCH] Fixed crash when a library is set with a trailing /, fixes #552 --- src/libs/core/test/Path.cpp | 2 ++ src/libs/database/impl/MediaLibrary.cpp | 13 +++++++++++-- src/libs/database/impl/Migration.cpp | 9 ++++++++- src/libs/database/include/database/MediaLibrary.hpp | 2 +- src/lms/ui/admin/MediaLibraryModal.cpp | 2 +- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/libs/core/test/Path.cpp b/src/libs/core/test/Path.cpp index 56cf530e7..1e525b068 100644 --- a/src/libs/core/test/Path.cpp +++ b/src/libs/core/test/Path.cpp @@ -93,6 +93,8 @@ namespace lms::core::pathUtils::tests { "/root/", "/root/", true }, { "/folder/file.txt", "/root", false }, { "/folder/file.txt", "/root/", false }, + { "/file.txt", "/root", false }, + { "/file.txt", "/root/", false }, { "", "/root", false }, }; diff --git a/src/libs/database/impl/MediaLibrary.cpp b/src/libs/database/impl/MediaLibrary.cpp index 59655bc17..65482ea25 100644 --- a/src/libs/database/impl/MediaLibrary.cpp +++ b/src/libs/database/impl/MediaLibrary.cpp @@ -31,9 +31,9 @@ namespace lms::db { MediaLibrary::MediaLibrary(const std::filesystem::path& p, std::string_view name) - : _path{ p } - , _name{ std::string{ name, 0, maxNameLength } } + : _name{ std::string{ name, 0, maxNameLength } } { + setPath(p); } MediaLibrary::pointer MediaLibrary::create(Session& session, const std::filesystem::path& p, std::string_view name) @@ -77,4 +77,13 @@ namespace lms::db func(mediaLibrary); }); } + + void MediaLibrary::setPath(const std::filesystem::path& p) + { + assert(p.is_absolute()); + if (!p.has_filename() && p.has_parent_path()) + _path = p.parent_path(); + else + _path = p; + } } // namespace lms::db diff --git a/src/libs/database/impl/Migration.cpp b/src/libs/database/impl/Migration.cpp index b0b3be0f6..f8c419fd3 100644 --- a/src/libs/database/impl/Migration.cpp +++ b/src/libs/database/impl/Migration.cpp @@ -35,7 +35,7 @@ namespace lms::db { namespace { - static constexpr Version LMS_DATABASE_VERSION{ 73 }; + static constexpr Version LMS_DATABASE_VERSION{ 74 }; } VersionInfo::VersionInfo() @@ -941,6 +941,12 @@ SELECT utils::executeCommand(*session.getDboSession(), "UPDATE scan_settings SET scan_version = scan_version + 1"); } + void migrateFromV73(Session& session) + { + // Remove any trailing '/' in library paths + utils::executeCommand(*session.getDboSession(), "UPDATE media_library SET path = rtrim(path, '/') WHERE path LIKE '%/'"); + } + bool doDbMigration(Session& session) { constexpr std::string_view outdatedMsg{ "Outdated database, please rebuild it (delete the .db file and restart)" }; @@ -990,6 +996,7 @@ SELECT { 70, migrateFromV70 }, { 71, migrateFromV71 }, { 72, migrateFromV72 }, + { 73, migrateFromV73 }, }; bool migrationPerformed{}; diff --git a/src/libs/database/include/database/MediaLibrary.hpp b/src/libs/database/include/database/MediaLibrary.hpp index 6d3c391cb..26144fbc6 100644 --- a/src/libs/database/include/database/MediaLibrary.hpp +++ b/src/libs/database/include/database/MediaLibrary.hpp @@ -53,7 +53,7 @@ namespace lms::db // setters void setName(std::string_view name) { _name = name; } - void setPath(const std::filesystem::path& p) { _path = p; } + void setPath(const std::filesystem::path& p); template void persist(Action& a) diff --git a/src/lms/ui/admin/MediaLibraryModal.cpp b/src/lms/ui/admin/MediaLibraryModal.cpp index d02218504..4b5560109 100644 --- a/src/lms/ui/admin/MediaLibraryModal.cpp +++ b/src/lms/ui/admin/MediaLibraryModal.cpp @@ -87,7 +87,7 @@ namespace lms::ui if (p.is_relative()) return Wt::WValidator::Result(Wt::ValidationState::Invalid, Wt::WString::tr("Lms.Admin.MediaLibrary.path-must-be-absolute")); - // TODO check and translate rights issues + // TODO check and translate access rights issues bool res{ std::filesystem::is_directory(p, ec) }; if (ec) return Wt::WValidator::Result(Wt::ValidationState::Invalid, ec.message()); // TODO translate common errors