summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
183d637)
Don't use deprecated API for QProcess in ExecWrapper for starting
a script; arguments should be given as a QStringList instead of
a QString. Modernize and improve the parsing of the command line
by switching to QRegularExpression from QRegExp.
Resolves a deprecation warning that was introduced in Qt 5.15.
#include <QFile>
#include <QTextCodec>
#include <QFile>
#include <QTextCodec>
+#include <QRegularExpression>
#include "client.h"
#include "messagemodel.h"
#include "client.h"
#include "messagemodel.h"
void ExecWrapper::start(const BufferInfo& info, const QString& command)
{
_bufferInfo = info;
void ExecWrapper::start(const BufferInfo& info, const QString& command)
{
_bufferInfo = info;
- QRegExp rx(R"(^\s*(\S+)(\s+(.*))?$)");
- if (!rx.exactMatch(command)) {
+ QStringList params;
+
+ static const QRegularExpression rx{R"(^\s*(\S+)(\s+(.*))?$)"};
+ auto match = rx.match(command);
+ if (!match.hasMatch()) {
emit error(tr("Invalid command string for /exec: %1").arg(command));
}
else {
emit error(tr("Invalid command string for /exec: %1").arg(command));
}
else {
- _scriptName = rx.cap(1);
- params = rx.cap(3);
+ _scriptName = match.captured(1);
+ static const QRegularExpression splitRx{"\\s+"};
+ params = match.captured(3).split(splitRx, QString::SkipEmptyParts);
}
// Make sure we don't execute something outside a script dir
}
// Make sure we don't execute something outside a script dir
- if (_scriptName.contains("../") || _scriptName.contains("..\\"))
+ if (_scriptName.contains("../") || _scriptName.contains("..\\")) {
emit error(tr(R"(Name "%1" is invalid: ../ or ..\ are not allowed!)").arg(_scriptName));
emit error(tr(R"(Name "%1" is invalid: ../ or ..\ are not allowed!)").arg(_scriptName));
+ }
+ else if (!_scriptName.isEmpty()) {
foreach (QString scriptDir, Quassel::scriptDirPaths()) {
QString fileName = scriptDir + _scriptName;
if (!QFile::exists(fileName))
continue;
_process.setWorkingDirectory(scriptDir);
foreach (QString scriptDir, Quassel::scriptDirPaths()) {
QString fileName = scriptDir + _scriptName;
if (!QFile::exists(fileName))
continue;
_process.setWorkingDirectory(scriptDir);
- _process.start('"' + fileName + "\" " + params);
+ _process.start(_scriptName, params);
return;
}
emit error(tr("Could not find script \"%1\"").arg(_scriptName));
return;
}
emit error(tr("Could not find script \"%1\"").arg(_scriptName));