Fix support for QProcess::ProcessChannelMode.

This commit is contained in:
Andrius Štikonas 2018-07-15 17:37:15 +01:00
parent e761c131d0
commit e5b63b0d6f
4 changed files with 13 additions and 11 deletions

View File

@ -54,6 +54,7 @@ struct ExternalCommandPrivate
QByteArray m_Output; QByteArray m_Output;
QByteArray m_Input; QByteArray m_Input;
DBusThread *m_thread; DBusThread *m_thread;
QProcess::ProcessChannelMode processChannelMode;
}; };
unsigned int ExternalCommand::counter = 0; unsigned int ExternalCommand::counter = 0;
@ -81,7 +82,7 @@ ExternalCommand::ExternalCommand(const QString& cmd, const QStringList& args, co
if(!startHelper()) if(!startHelper())
Log(Log::Level::error) << xi18nc("@info:status", "Could not obtain administrator privileges."); Log(Log::Level::error) << xi18nc("@info:status", "Could not obtain administrator privileges.");
setup(processChannelMode); d->processChannelMode = processChannelMode;
} }
/** Creates a new ExternalCommand instance with Report. /** Creates a new ExternalCommand instance with Report.
@ -98,20 +99,18 @@ ExternalCommand::ExternalCommand(Report& report, const QString& cmd, const QStri
d->m_ExitCode = -1; d->m_ExitCode = -1;
d->m_Output = QByteArray(); d->m_Output = QByteArray();
setup(processChannelMode); d->processChannelMode = processChannelMode;
} }
ExternalCommand::~ExternalCommand() ExternalCommand::~ExternalCommand()
{ {
} }
void ExternalCommand::setup(const QProcess::ProcessChannelMode processChannelMode) // void ExternalCommand::setup()
{ // {
// d->arguments.insert(QStringLiteral("processChannelMode"), processChannelMode); // FIXME
// connect(this, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this, &ExternalCommand::onFinished); // connect(this, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this, &ExternalCommand::onFinished);
// connect(this, &ExternalCommand::readyReadStandardOutput, this, &ExternalCommand::onReadOutput); // connect(this, &ExternalCommand::readyReadStandardOutput, this, &ExternalCommand::onReadOutput);
} // }
/** Executes the external command. /** Executes the external command.
@param timeout timeout to wait for the process to start @param timeout timeout to wait for the process to start
@ -150,6 +149,7 @@ bool ExternalCommand::start(int timeout)
for (const auto &argument : qAsConst(d->m_Args)) for (const auto &argument : qAsConst(d->m_Args))
request.append(argument.toUtf8()); request.append(argument.toUtf8());
request.append(d->m_Input); request.append(d->m_Input);
request.append(d->processChannelMode);
QByteArray hash = QCryptographicHash::hash(request, QCryptographicHash::Sha512); QByteArray hash = QCryptographicHash::hash(request, QCryptographicHash::Sha512);
@ -157,7 +157,8 @@ bool ExternalCommand::start(int timeout)
privateKey->signMessage(hash, QCA::EMSA3_Raw), privateKey->signMessage(hash, QCA::EMSA3_Raw),
cmd, cmd,
args(), args(),
d->m_Input); d->m_Input,
d->processChannelMode);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this);

View File

@ -126,7 +126,6 @@ public Q_SLOTS:
private: private:
void setExitCode(int i); void setExitCode(int i);
void setup(const QProcess::ProcessChannelMode processChannelMode);
void onFinished(int exitCode, QProcess::ExitStatus exitStatus); void onFinished(int exitCode, QProcess::ExitStatus exitStatus);
void onReadOutput(); void onReadOutput();

View File

@ -244,7 +244,7 @@ bool ExternalCommandHelper::copyblocks(const QByteArray& signature, const QStrin
return rval; return rval;
} }
QVariantMap ExternalCommandHelper::start(const QByteArray& signature, const QString& command, const QStringList& arguments, const QByteArray& input) QVariantMap ExternalCommandHelper::start(const QByteArray& signature, const QString& command, const QStringList& arguments, const QByteArray& input, const int processChannelMode)
{ {
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QVariantMap reply; QVariantMap reply;
@ -255,6 +255,7 @@ QVariantMap ExternalCommandHelper::start(const QByteArray& signature, const QStr
for (const auto &argument : arguments) for (const auto &argument : arguments)
request.append(argument.toUtf8()); request.append(argument.toUtf8());
request.append(input); request.append(input);
request.append(processChannelMode);
QByteArray hash = QCryptographicHash::hash(request, QCryptographicHash::Sha512); QByteArray hash = QCryptographicHash::hash(request, QCryptographicHash::Sha512);
if (!m_publicKey.verifyMessage(hash, signature, QCA::EMSA3_Raw)) { if (!m_publicKey.verifyMessage(hash, signature, QCA::EMSA3_Raw)) {
qCritical() << xi18n("Invalid cryptographic signature"); qCritical() << xi18n("Invalid cryptographic signature");
@ -265,6 +266,7 @@ QVariantMap ExternalCommandHelper::start(const QByteArray& signature, const QStr
// connect(&cmd, &QProcess::readyReadStandardOutput, this, &ExternalCommandHelper::onReadOutput); // connect(&cmd, &QProcess::readyReadStandardOutput, this, &ExternalCommandHelper::onReadOutput);
m_cmd.setEnvironment( { QStringLiteral("LVM_SUPPRESS_FD_WARNINGS=1") } ); m_cmd.setEnvironment( { QStringLiteral("LVM_SUPPRESS_FD_WARNINGS=1") } );
m_cmd.setProcessChannelMode(static_cast<QProcess::ProcessChannelMode>(processChannelMode));
m_cmd.start(command, arguments); m_cmd.start(command, arguments);
m_cmd.write(input); m_cmd.write(input);
m_cmd.closeWriteChannel(); m_cmd.closeWriteChannel();

View File

@ -43,7 +43,7 @@ public:
public Q_SLOTS: public Q_SLOTS:
ActionReply init(const QVariantMap& args); ActionReply init(const QVariantMap& args);
Q_SCRIPTABLE QVariantMap start(const QByteArray& signature, const QString& command, const QStringList& arguments, const QByteArray& input); Q_SCRIPTABLE QVariantMap start(const QByteArray& signature, const QString& command, const QStringList& arguments, const QByteArray& input, const int processChannelMode);
Q_SCRIPTABLE bool copyblocks(const QByteArray& signature, const QString& sourceDevice, const qint64 sourceFirstByte, const qint64 sourceLength, const QString& targetDevice, const qint64 targetFirstByte, const qint64 blockSize); Q_SCRIPTABLE bool copyblocks(const QByteArray& signature, const QString& sourceDevice, const qint64 sourceFirstByte, const qint64 sourceLength, const QString& targetDevice, const qint64 targetFirstByte, const qint64 blockSize);
Q_SCRIPTABLE void exit(const QByteArray& signature); Q_SCRIPTABLE void exit(const QByteArray& signature);