diff options
author | Simon Rettberg | 2020-06-05 12:04:15 +0200 |
---|---|---|
committer | Simon Rettberg | 2020-06-05 12:04:15 +0200 |
commit | 6c5d2c5e68e86536b6c511f5067bb26efbc5b1a4 (patch) | |
tree | 7ed920faef4cdbc31dd7946683cf9ee6e96577a3 /src/loginrpc.cpp | |
parent | Move createBackground so it actually gets called (diff) | |
download | slxgreeter-6c5d2c5e68e86536b6c511f5067bb26efbc5b1a4.tar.gz slxgreeter-6c5d2c5e68e86536b6c511f5067bb26efbc5b1a4.tar.xz slxgreeter-6c5d2c5e68e86536b6c511f5067bb26efbc5b1a4.zip |
Add simple RPC to remotely trigger login
Diffstat (limited to 'src/loginrpc.cpp')
-rw-r--r-- | src/loginrpc.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/loginrpc.cpp b/src/loginrpc.cpp new file mode 100644 index 0000000..4ced53e --- /dev/null +++ b/src/loginrpc.cpp @@ -0,0 +1,45 @@ +#include "loginrpc.h" + +#include <QtNetwork/QTcpServer> +#include <QtNetwork/QTcpSocket> +#include <QDebug> + +LoginRpc::LoginRpc(int port, QObject *parent) + : QObject(parent) +{ + QTcpServer *srv = new QTcpServer(this); + srv->listen(QHostAddress::Any, port); + connect(srv, &QTcpServer::newConnection, [=] { + while (srv->hasPendingConnections()) { + QTcpSocket *sock = srv->nextPendingConnection(); + handleIncoming(sock); + } + }); +} + +void LoginRpc::handleIncoming(QTcpSocket *sock) { + connect(sock, &QTcpSocket::readyRead, [=] { + QByteArray ba = sock->readAll(); // XXX We assume everything arrives in one packet + if (ba.length() < 2) { + sock->deleteLater(); + return; + } + int vers = (ba[0] << 8) + ba[1]; + ba = ba.mid(2); + ba = QByteArray::fromBase64(ba); + if (vers == 1) { + handleCommandV1(QString::fromUtf8(ba)); + } else { + qDebug() << "Ignoring unknown Login RPC version" << vers; + } + }); +} + +void LoginRpc::handleCommandV1(const QString &command) +{ + QStringList lines = command.split('\n'); + while (lines.count() < 3) { + lines.append(QString()); + } + emit loginRequest(lines[0], lines[1], lines[2]); +} |