Skip to content
This repository was archived by the owner on Sep 27, 2024. It is now read-only.

Commit e2ca2e1

Browse files
Merge pull request #271 from matejak/refactor_messaging
Refactored handling of scanner messages
2 parents f4aaae1 + 7786cd8 commit e2ca2e1

File tree

2 files changed

+130
-17
lines changed

2 files changed

+130
-17
lines changed

include/OscapScannerBase.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,21 @@ class OscapScannerBase : public Scanner
7777

7878
ReadingState mReadingState;
7979

80+
enum MessageType
81+
{
82+
MSG_INFO, MSG_WARNING, MSG_ERROR, MSG_UNKNOWN
83+
};
84+
85+
virtual void filterStdErr(QString& errorText);
86+
void emitMessage(MessageType kind, QString& message);
87+
virtual void selectWarning(MessageType& kind, const QString& message);
88+
virtual void processWarning(QString& message);
89+
virtual void selectInfo(MessageType& kind, const QString& message);
90+
virtual void processInfo(QString& message);
91+
virtual void selectError(MessageType& kind, const QString& message);
92+
virtual void processError(QString& message);
93+
virtual void processUnknown(QString& message);
94+
8095
/// We keep filling this buffer until we reach : or \n
8196
QString mReadBuffer;
8297

src/OscapScannerBase.cpp

Lines changed: 115 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,117 @@ void OscapScannerBase::readStdOut(QProcess& process)
418418
while (tryToReadStdOutChar(process));
419419
}
420420

421+
422+
void OscapScannerBase::emitMessage(MessageType kind, QString& message)
423+
{
424+
QString rawMessage = QObject::tr(message.toUtf8().constData());
425+
switch (kind)
426+
{
427+
case MSG_INFO:
428+
{
429+
emit infoMessage(message);
430+
break;
431+
}
432+
case MSG_WARNING:
433+
{
434+
emit warningMessage(message);
435+
break;
436+
}
437+
default:
438+
emit errorMessage(message);
439+
}
440+
}
441+
442+
443+
void OscapScannerBase::selectWarning(MessageType& kind, const QString& message)
444+
{
445+
if (message.contains("WARNING: "))
446+
{
447+
kind = MSG_WARNING;
448+
}
449+
if (message.contains(QRegExp("^W:\\s")))
450+
{
451+
kind = MSG_WARNING;
452+
}
453+
}
454+
455+
456+
void OscapScannerBase::processWarning(QString& message)
457+
{
458+
message = guiFriendlyMessage(message);
459+
}
460+
461+
462+
void OscapScannerBase::selectInfo(MessageType& kind, const QString& message)
463+
{
464+
if (message.contains(QRegExp("^Downloading: .+ \\.{3} \\w+\\n")))
465+
{
466+
kind = MSG_INFO;
467+
}
468+
}
469+
470+
471+
void OscapScannerBase::processInfo(QString& message)
472+
{
473+
(void)message; // suppress the unused arg warning
474+
}
475+
476+
477+
void OscapScannerBase::selectError(MessageType& kind, const QString& message)
478+
{
479+
if (message.contains(QRegExp("^E:\\s")))
480+
{
481+
kind = MSG_ERROR;
482+
}
483+
}
484+
485+
486+
void OscapScannerBase::processError(QString& message)
487+
{
488+
message.remove(QRegExp("Error:\\s*"));
489+
message.remove(QRegExp("^E:\\s*"));
490+
message.remove(QRegExp("\\n"));
491+
}
492+
493+
494+
void OscapScannerBase::processUnknown(QString& message)
495+
{
496+
message = QString("The 'oscap' process has written the following content to stderr:\n%1").arg(message);
497+
}
498+
499+
500+
void OscapScannerBase::filterStdErr(QString& errorText)
501+
{
502+
MessageType type = MSG_UNKNOWN;
503+
// let detection of a more severe type of message (error) overrule a benign one (info)
504+
selectInfo(type, errorText);
505+
selectWarning(type, errorText);
506+
selectError(type, errorText);
507+
switch(type)
508+
{
509+
case MSG_INFO:
510+
{
511+
processInfo(errorText);
512+
break;
513+
}
514+
case MSG_WARNING:
515+
{
516+
processWarning(errorText);
517+
break;
518+
}
519+
case MSG_ERROR:
520+
{
521+
processError(errorText);
522+
break;
523+
}
524+
default:
525+
{
526+
processUnknown(errorText);
527+
}
528+
}
529+
emitMessage(type, errorText);
530+
}
531+
421532
void OscapScannerBase::watchStdErr(QProcess& process)
422533
{
423534
process.setReadChannel(QProcess::StandardError);
@@ -433,21 +544,7 @@ void OscapScannerBase::watchStdErr(QProcess& process)
433544

434545
if (!stdErrOutput.isEmpty())
435546
{
436-
if (stdErrOutput.contains("WARNING: "))
437-
{
438-
QString guiMessage = guiFriendlyMessage(stdErrOutput);
439-
emit warningMessage(QObject::tr(guiMessage.toUtf8().constData()));
440-
}
441-
// Openscap >= 1.2.11 (60fb9f0c98eee) sends this message through stderr
442-
else if (stdErrOutput.contains(QRegExp("^Downloading: .+ \\.{3} \\w+\\n")))
443-
{
444-
emit infoMessage(stdErrOutput);
445-
}
446-
else
447-
{
448-
emit errorMessage(QObject::tr("The 'oscap' process has written the following content to stderr:\n"
449-
"%1").arg(stdErrOutput));
450-
}
547+
filterStdErr(stdErrOutput);
451548
}
452549

453550
}
@@ -458,8 +555,9 @@ QString OscapScannerBase::guiFriendlyMessage(const QString& cliMessage)
458555
{
459556
QString guiMessage = cliMessage;
460557

461-
// Remove "WARNING:" prefix and trailing \n
462-
guiMessage.remove(QRegExp("(WARNING: )|\n"));
558+
guiMessage.remove(QRegExp("WARNING:\\s*"));
559+
guiMessage.remove(QRegExp("^W:\\s*"));
560+
guiMessage.remove(QRegExp("\\n"));
463561

464562
if (cliMessage.contains("--fetch-remote-resources"))
465563
guiMessage = QString("Remote resources might be necessary for this profile to work properly. Please select \"Fetch remote resources\" for complete scan");

0 commit comments

Comments
 (0)