Skip to content Skip to sidebar Skip to footer

Chrome Addon Is Randomly Sending Trash To My C++ Native Host Application

I'm trying to write a simple parental control app for my university project, but I'm a newbie in browser addons. I want to use Chrome addon to send hosts viewed by the user in real

Solution 1:

Based on this answer I have built a class that monitors "stdin", get the text and decode it using QFile:

nativemessenger.h

#ifndef NATIVEMESSENGER_H#define NATIVEMESSENGER_H#include<QObject>#include<QFile>classNativeMessenger : public QObject
{
    Q_OBJECT
public:
    explicitNativeMessenger(QObject *parent = nullptr);
public Q_SLOTS:
    voidsendMessage(const QByteArray & message);
Q_SIGNALS:
    voidmessageChanged(const QByteArray & message);
private Q_SLOTS:
    voidreadyRead();
private:
    QFile m_qin;
    QFile m_qout;
};

#endif// NATIVEMESSENGER_H

nativemessenger.cpp

#include"nativemessenger.h"#include<QCoreApplication>#ifdef Q_OS_WIN#include<QWinEventNotifier>#include<windows.h>#else#include<QSocketNotifier>#endif
NativeMessenger::NativeMessenger(QObject *parent) : QObject(parent)
{
#ifdef Q_OS_WIN// https://developer.chrome.com/apps/nativeMessaging#native-messaging-debugging
    _setmode(_fileno(stdin), _O_BINARY);
    _setmode(_fileno(stdout), _O_BINARY);
#endif

    m_qin.open(stdin, QIODevice::ReadOnly | QIODevice::Unbuffered);
    m_qout.open(stdout, QIODevice::WriteOnly);

#ifdef Q_OS_WIN
    QWinEventNotifier *m_notifier = newQWinEventNotifier(GetStdHandle(STD_INPUT_HANDLE));
    connect(m_notifier, &QWinEventNotifier::activated, this, &NativeMessenger::readyRead);
#else
    QSocketNotifier *m_notifier = newQSocketNotifier(fileno(stdin), QSocketNotifier::Read, this);
    connect(m_notifier, &QSocketNotifier::activated, this, &NativeMessenger::readyRead);
#endif
}

voidNativeMessenger::sendMessage(const QByteArray &message){
    quint32 len = message.length();
    m_qout.write(reinterpret_cast<char *>(&len), sizeof(len));
    m_qout.write(message);
    m_qout.flush();
}

voidNativeMessenger::readyRead(){
    m_qin.startTransaction();
    quint32 length = 0;
    qint64 rc = m_qin.read(reinterpret_cast<char *>(&length), sizeof(quint32));
    if (rc == -1) {
        m_qin.rollbackTransaction();
        return;
    }
    QByteArray message = m_qin.read(length);
    if (message.length() != int(length)) {
        m_qin.rollbackTransaction();
        return;
    }
    if (message.isEmpty()) {
        m_qin.rollbackTransaction();
        return;
    }
    m_qin.commitTransaction();
    Q_EMIT messageChanged(message);
}

main.cpp

#include<QCoreApplication>#include<QJsonDocument>#include<QJsonObject>#include<QDebug>#include"nativemessenger.h"intmain(int argc, char *argv[]){
    QCoreApplication a(argc, argv);
    NativeMessenger listener;
    QObject::connect(&listener, &NativeMessenger::messageChanged,
                     [&listener]
                     (const QByteArray & message){
        // decode message 
        QJsonParseError error;
        QJsonDocument json = QJsonDocument::fromJson(message, &error);
        if(error.error != QJsonParseError::NoError){
            qDebug() << error.errorString();
        }
        // build response
        QJsonObject object
        {
            {"data", json.object()},
            {"name", QCoreApplication::applicationName()}
        };
        QByteArray response = QJsonDocument(object).toJson(QJsonDocument::Compact);
        // send response
        listener.sendMessage(response);
    });
    return a.exec();
}

A complete example can be found here.

Post a Comment for "Chrome Addon Is Randomly Sending Trash To My C++ Native Host Application"