From 5d20c811262b13510c2b5263ecd3c179b3b9f6b5 Mon Sep 17 00:00:00 2001 From: Neil Horne <15316949+elecpower@users.noreply.github.com> Date: Wed, 29 May 2024 10:28:49 +1000 Subject: [PATCH] fix(cpn): validate translated update component name when used for folder name (#5079) --- companion/src/updates/updateinterface.cpp | 62 +++++++++++++++-------- companion/src/updates/updateinterface.h | 1 + 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/companion/src/updates/updateinterface.cpp b/companion/src/updates/updateinterface.cpp index a89652c5a..6081cc4ca 100644 --- a/companion/src/updates/updateinterface.cpp +++ b/companion/src/updates/updateinterface.cpp @@ -957,38 +957,26 @@ void UpdateInterface::setReleaseId(QString name) bool UpdateInterface::setRunFolders() { - QRegularExpression rx("[0-9a-zA-Z_\\-.]+"); - // the validator treats the regexp as "^[0-9a-zA-Z_\-.]+$" - QRegularExpressionValidator v(rx); - int pos = 0; + // translated component names my not be valid folder names + QString compfldr(m_name); - QString fldr(m_repo->releases()->name().trimmed()); + if (!validateFolder(compfldr)) + compfldr = QString("C%1").arg(m_id); - if (v.validate(fldr, pos) != QValidator::Acceptable) { - fldr.replace("\"", ""); - fldr.replace("'", ""); - fldr.replace("(", "_"); - fldr.replace(")", "_"); - fldr.replace("[", "_"); - fldr.replace("]", "_"); - fldr.replace(" ", "_"); - fldr.replace("__", "_"); + // release names may my not be valid folder names + QString relfldr(m_repo->releases()->name()); - if (v.validate(fldr, pos) != QValidator::Acceptable) { - //m_status->reportProgress(tr("Unable to use release name %1 for directory name using default %2") - // .arg(m_repo->releases()->name().trimmed()).arg(QString("R%1").arg(m_repo->releases()->id())), QtDebugMsg); - fldr = QString("R%1").arg(m_repo->releases()->id()); - } - } + if (!validateFolder(relfldr)) + relfldr = QString("R%1").arg(m_repo->releases()->id()); - m_downloadDir = QString("%1/%2/%3").arg(m_params->downloadDir).arg(m_name).arg(fldr); + m_downloadDir = QString("%1/%2/%3").arg(m_params->downloadDir).arg(compfldr).arg(relfldr); if (!checkCreateDirectory(m_downloadDir, UPDFLG_Download)) return false; //m_status->reportProgress(tr("Download directory: %1").arg(m_downloadDir), QtDebugMsg); - m_decompressDir = QString("%1/%2/%3").arg(m_params->decompressDir).arg(m_name).arg(fldr); + m_decompressDir = QString("%1/%2/%3").arg(m_params->decompressDir).arg(compfldr).arg(relfldr); if (!checkCreateDirectory(m_decompressDir, UPDFLG_Decompress)) return false; @@ -1160,6 +1148,36 @@ const QString UpdateInterface::updateFlagToString(const int flag) } } +bool UpdateInterface::validateFolder(QString & fldr) +{ + QRegularExpression rx("[0-9a-zA-Z_\\-.]+"); + // the validator treats the regexp as "^[0-9a-zA-Z_\-.]+$" + QRegularExpressionValidator v(rx); + int pos = 0; + + fldr = fldr.trimmed(); + + if (v.validate(fldr, pos) != QValidator::Acceptable) { + fldr.replace("\"", ""); + fldr.replace("'", ""); + fldr.replace("(", "_"); + fldr.replace(")", "_"); + fldr.replace("[", "_"); + fldr.replace("]", "_"); + fldr.replace(" ", "_"); + fldr.replace("__", "_"); + + if (v.validate(fldr, pos) != QValidator::Acceptable) { + return false; + } + } + + if (fldr.isEmpty()) + return false; + + return true; +} + const QString UpdateInterface::versionCurrent() { return g.component[m_id].version(); diff --git a/companion/src/updates/updateinterface.h b/companion/src/updates/updateinterface.h index 746a70ce6..c84387b83 100644 --- a/companion/src/updates/updateinterface.h +++ b/companion/src/updates/updateinterface.h @@ -175,6 +175,7 @@ class UpdateInterface : public QWidget bool decompressArchive(const QString & archivePath, const QString & destPath); int releaseSettingsSave(); bool setRunFolders(); + bool validateFolder(QString & fldr); bool okToRun() { return m_result == PROC_RESULT_SUCCESS && m_stopping == false; } void runAsyncInstall();