fix: don't create native messaging manifest file unless browser directory exists (#6116)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
## Unversioned
|
## Unversioned
|
||||||
|
|
||||||
|
- Bugfix: Don't create native messaging manifest file if browser directory doesn't exist. (#6116)
|
||||||
- Dev: Conan will no longer generate a `CMakeUserPresets.json` file. (#6117)
|
- Dev: Conan will no longer generate a `CMakeUserPresets.json` file. (#6117)
|
||||||
|
|
||||||
## 2.5.3
|
## 2.5.3
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
using namespace chatterino::nm::detail;
|
||||||
using namespace chatterino;
|
using namespace chatterino;
|
||||||
using namespace chatterino::literals;
|
using namespace chatterino::literals;
|
||||||
|
|
||||||
@@ -38,7 +39,8 @@ struct Config {
|
|||||||
QString fileName;
|
QString fileName;
|
||||||
QString registryKey;
|
QString registryKey;
|
||||||
#else
|
#else
|
||||||
QString directory;
|
QString browserDirectory;
|
||||||
|
QString nmDirectory;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -48,10 +50,11 @@ const Config FIREFOX{
|
|||||||
.registryKey =
|
.registryKey =
|
||||||
u"HKCU\\Software\\Mozilla\\NativeMessagingHosts\\com.chatterino.chatterino"_s,
|
u"HKCU\\Software\\Mozilla\\NativeMessagingHosts\\com.chatterino.chatterino"_s,
|
||||||
#elif defined(Q_OS_MACOS)
|
#elif defined(Q_OS_MACOS)
|
||||||
.directory =
|
.browserDirectory = u"~/Library/Application Support/Mozilla"_s,
|
||||||
u"~/Library/Application Support/Mozilla/NativeMessagingHosts"_s,
|
.nmDirectory = u"NativeMessagingHosts"_s,
|
||||||
#else
|
#else
|
||||||
.directory = u"~/.mozilla/native-messaging-hosts"_s,
|
.browserDirectory = u"~/.mozilla"_s,
|
||||||
|
.nmDirectory = u"native-messaging-hosts"_s,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -61,15 +64,36 @@ const Config CHROME{
|
|||||||
.registryKey =
|
.registryKey =
|
||||||
u"HKCU\\Software\\Google\\Chrome\\NativeMessagingHosts\\com.chatterino.chatterino"_s,
|
u"HKCU\\Software\\Google\\Chrome\\NativeMessagingHosts\\com.chatterino.chatterino"_s,
|
||||||
#elif defined(Q_OS_MACOS)
|
#elif defined(Q_OS_MACOS)
|
||||||
.directory =
|
.browserDirectory = u"~/Library/Application Support/Google/Chrome/"_s,
|
||||||
u"~/Library/Application Support/Google/Chrome/NativeMessagingHosts"_s,
|
.nmDirectory = u"NativeMessagingHosts"_s,
|
||||||
#else
|
#else
|
||||||
.directory = u"~/.config/google-chrome/NativeMessagingHosts"_s,
|
.browserDirectory = u"~/.config/google-chrome"_s,
|
||||||
|
.nmDirectory = u"NativeMessagingHosts"_s,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void writeManifestTo(QString directory, const QString &filename,
|
void registerNmManifest([[maybe_unused]] const Paths &paths,
|
||||||
const QJsonDocument &json)
|
const Config &config, const QJsonDocument &document)
|
||||||
|
{
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
writeManifestTo(paths.miscDirectory, u"."_s, config.fileName, document);
|
||||||
|
|
||||||
|
QSettings registry(config.registryKey, QSettings::NativeFormat);
|
||||||
|
registry.setValue("Default",
|
||||||
|
QString(paths.miscDirectory % u'/' % config.fileName));
|
||||||
|
#else
|
||||||
|
writeManifestTo(config.browserDirectory, config.nmDirectory,
|
||||||
|
u"com.chatterino.chatterino.json"_s, document);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace chatterino::nm::detail {
|
||||||
|
|
||||||
|
nonstd::expected<void, WriteManifestError> writeManifestTo(
|
||||||
|
QString directory, const QString &nmDirectory, const QString &filename,
|
||||||
|
const QJsonDocument &json)
|
||||||
{
|
{
|
||||||
if (directory.startsWith('~'))
|
if (directory.startsWith('~'))
|
||||||
{
|
{
|
||||||
@@ -77,40 +101,31 @@ void writeManifestTo(QString directory, const QString &filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
QDir dir(directory);
|
QDir dir(directory);
|
||||||
if (!dir.mkpath(u"."_s))
|
if (!dir.exists(nmDirectory) && !dir.mkdir(nmDirectory))
|
||||||
{
|
{
|
||||||
qCWarning(chatterinoNativeMessage) << "Failed to create" << directory;
|
qCWarning(chatterinoNativeMessage)
|
||||||
return;
|
<< "Failed to create" << nmDirectory << "in" << directory;
|
||||||
|
return makeUnexpected(WriteManifestError::FailedToCreateDirectory);
|
||||||
}
|
}
|
||||||
|
dir.cd(nmDirectory);
|
||||||
|
|
||||||
QFile file(dir.filePath(filename));
|
QFile file(dir.filePath(filename));
|
||||||
if (!file.open(QFile::WriteOnly | QFile::Truncate))
|
if (!file.open(QFile::WriteOnly | QFile::Truncate))
|
||||||
{
|
{
|
||||||
qCWarning(chatterinoNativeMessage)
|
qCWarning(chatterinoNativeMessage)
|
||||||
<< "Failed to open" << filename << "in" << directory;
|
<< "Failed to open" << filename << "in" << directory;
|
||||||
return;
|
return makeUnexpected(WriteManifestError::FailedToCreateFile);
|
||||||
}
|
}
|
||||||
file.write(json.toJson());
|
file.write(json.toJson());
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerNmManifest([[maybe_unused]] const Paths &paths,
|
} // namespace chatterino::nm::detail
|
||||||
const Config &config, const QJsonDocument &document)
|
|
||||||
{
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
writeManifestTo(paths.miscDirectory, config.fileName, document);
|
|
||||||
|
|
||||||
QSettings registry(config.registryKey, QSettings::NativeFormat);
|
|
||||||
registry.setValue("Default",
|
|
||||||
QString(paths.miscDirectory % u'/' % config.fileName));
|
|
||||||
#else
|
|
||||||
writeManifestTo(config.directory, u"com.chatterino.chatterino.json"_s,
|
|
||||||
document);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
|
using namespace chatterino::nm::detail;
|
||||||
using namespace literals;
|
using namespace literals;
|
||||||
|
|
||||||
void registerNmHost(const Paths &paths)
|
void registerNmHost(const Paths &paths)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/Atomic.hpp"
|
#include "common/Atomic.hpp"
|
||||||
|
#include "util/Expected.hpp"
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
@@ -8,6 +9,19 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
namespace chatterino::nm::detail {
|
||||||
|
|
||||||
|
enum class WriteManifestError : std::uint8_t {
|
||||||
|
FailedToCreateDirectory,
|
||||||
|
FailedToCreateFile,
|
||||||
|
};
|
||||||
|
|
||||||
|
nonstd::expected<void, WriteManifestError> writeManifestTo(
|
||||||
|
QString directory, const QString &nmDirectory, const QString &filename,
|
||||||
|
const QJsonDocument &json);
|
||||||
|
|
||||||
|
} // namespace chatterino::nm::detail
|
||||||
|
|
||||||
namespace chatterino {
|
namespace chatterino {
|
||||||
|
|
||||||
class Application;
|
class Application;
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ set(test_SOURCES
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/src/OnceFlag.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/OnceFlag.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/IncognitoBrowser.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/IncognitoBrowser.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/EventSubMessages.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/EventSubMessages.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/src/NativeMessaging.cpp
|
||||||
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.cpp
|
${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.hpp
|
${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.hpp
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
#include "singletons/NativeMessaging.hpp"
|
||||||
|
|
||||||
|
#include "Test.hpp"
|
||||||
|
#include "util/CombinePath.hpp"
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QTemporaryDir>
|
||||||
|
|
||||||
|
using namespace chatterino;
|
||||||
|
|
||||||
|
using namespace chatterino::nm::detail;
|
||||||
|
|
||||||
|
class NativeMessagingFixture : public ::testing::Test
|
||||||
|
{
|
||||||
|
QTemporaryDir tempDir;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
NativeMessagingFixture()
|
||||||
|
: dir(combinePath(this->tempDir.path(), QString("native-messaging")))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QDir dir;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(NativeMessagingFixture, writeManifestToSubDirCreated)
|
||||||
|
{
|
||||||
|
// writeManifestTo should succeed if the subdir directory is created
|
||||||
|
ASSERT_TRUE(this->dir.mkpath("."));
|
||||||
|
|
||||||
|
ASSERT_TRUE(writeManifestTo(this->dir.path(), "native-messaging-hosts",
|
||||||
|
"test.json", QJsonDocument())
|
||||||
|
.has_value());
|
||||||
|
|
||||||
|
QDir nmDir = combinePath(this->dir.path(), "native-messaging-hosts");
|
||||||
|
|
||||||
|
ASSERT_TRUE(nmDir.exists());
|
||||||
|
|
||||||
|
ASSERT_TRUE(QFile(combinePath(nmDir.path(), "test.json")).exists());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(NativeMessagingFixture, writeManifestToSubDirNotCreated)
|
||||||
|
{
|
||||||
|
// writeManifestTo should fail if the subdir is not created
|
||||||
|
ASSERT_EQ(writeManifestTo(this->dir.path(), "native-messaging-hosts",
|
||||||
|
"test.json", QJsonDocument())
|
||||||
|
.error(),
|
||||||
|
WriteManifestError::FailedToCreateDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(NativeMessagingFixture, writeManifestToWindowsCurrentDir)
|
||||||
|
{
|
||||||
|
// writeManifestTo should succeed if the subdir is created and the path to create is "."
|
||||||
|
ASSERT_TRUE(this->dir.mkpath("."));
|
||||||
|
|
||||||
|
ASSERT_TRUE(
|
||||||
|
writeManifestTo(this->dir.path(), ".", "test.json", QJsonDocument())
|
||||||
|
.has_value());
|
||||||
|
|
||||||
|
ASSERT_TRUE(QFile(combinePath(this->dir.path(), "test.json")).exists());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user