diff --git a/dnetwork-secret-dialog/src/main.cpp b/dnetwork-secret-dialog/src/main.cpp index 1e2adc89..19563c8e 100644 --- a/dnetwork-secret-dialog/src/main.cpp +++ b/dnetwork-secret-dialog/src/main.cpp @@ -13,6 +13,7 @@ #include #include +#include #include DCORE_USE_NAMESPACE @@ -64,6 +65,8 @@ int main(int argc, char *argv[]) } file.close(); + // GetSecrets超时时间120000,参考NM中nm-secret-agent.c中函数nm_secret_agent_get_secrets里的设置 + QTimer::singleShot(120000, &app, &DApplication::quit); NetworkDialog *networkDialog = new NetworkDialog(); QObject::connect(&app, &QCoreApplication::aboutToQuit, [networkDialog]() { diff --git a/dnetwork-secret-dialog/src/networkdialog.cpp b/dnetwork-secret-dialog/src/networkdialog.cpp index e9e29456..0344ad54 100644 --- a/dnetwork-secret-dialog/src/networkdialog.cpp +++ b/dnetwork-secret-dialog/src/networkdialog.cpp @@ -4,26 +4,30 @@ #include "networkdialog.h" -#include #include -#include -#include -#include -#include -#include #include +#include #include #include +#include +#include +#include +#include +#include #include static const QString NetworkDialogApp = "dde-network-dialog"; //网络列表执行文件 -static QMap s_FunMap = { +static const QString identity = "identity"; +static const QMap s_FunMap = { + { "secretsResult", &NetworkDialog::onSecretsResult }, { "password", &NetworkDialog::onPassword } }; NetworkDialog::NetworkDialog(QObject *parent) : QObject(parent) + , m_needIdentity(false) + , m_quitNow(false) , m_clinet(new QLocalSocket(this)) { connect(m_clinet, SIGNAL(connected()), this, SLOT(connectedHandler())); @@ -37,49 +41,6 @@ NetworkDialog::~NetworkDialog() m_clinet->close(); } -void NetworkDialog::onPassword(QLocalSocket *socket, const QByteArray &data) -{ - qInfo() << "Received password and deal with it."; - QJsonDocument doc = QJsonDocument::fromJson(data); - if (!doc.isObject()) { - qWarning() << "Wrong format for password, it is not Object."; - return; - } - - QJsonObject obj = doc.object(); - QString key = obj.value("key").toString(); - QString passwd = obj.value("password").toString(); - bool input = obj.value("input").toBool(); - - if (m_key != key) { - qWarning() << "Missmatched ssid, old key is " << m_key << ", and now is" << key; - return; - } - - if (!input) { - qWarning() << "Only deal with password from input."; - qApp->exit(1); - return; - } - QJsonObject resultJsonObj; - QJsonArray secretsJsonArray; - secretsJsonArray.append(passwd); - resultJsonObj.insert("secrets", secretsJsonArray); - - QFile file; - if (!file.open(stdout, QFile::WriteOnly)) { - qWarning() << "open STDOUT failed"; - qApp->exit(-4); - } - file.write(QJsonDocument(resultJsonObj).toJson()); - file.flush(); - file.close(); - m_clinet->flush(); - m_clinet->close(); - qInfo() << "Wirte password to dde-session-daemon and exit it."; - qApp->exit(0); -} - /** * @brief NetworkDialog::exec * 调dde-network-dialog处理密码输入 @@ -95,21 +56,41 @@ bool NetworkDialog::exec(const QJsonDocument &doc) qDebug() << "Only deal with wireless for the connection type, now connType:" << obj.value("connType"); return false; } - QJsonArray array = obj.value("devices").toArray(); - QString device; - if (!array.isEmpty()) { - device = array.first().toString(); - } QString connName = obj.value("connId").toString(); - if (!connName.isEmpty() && (1 == obj.value("secrets").toArray().size())) { + if (!connName.isEmpty()) { + m_data = "\nrequestSecrets:" + doc.toJson(QJsonDocument::Compact) + "\n"; + QJsonArray array = obj.value("devices").toArray(); + QString device; + if (!array.isEmpty()) { + device = array.first().toString(); + } + QJsonObject propsObj = obj.value("props").toObject(); + QString password; + int count = 0; + for (auto secret : obj.value("secrets").toArray()) { + const QString& key = secret.toString(); + if (key == identity) { + m_needIdentity = true; + continue; + } + count++; + if (propsObj.contains(key)) { + password = propsObj.value(key).toString(); + } + } m_key = connName; QJsonObject json; json.insert("dev", device); json.insert("ssid", m_key); json.insert("wait", true); - QJsonDocument doc; - doc.setObject(json); - m_data = "\nconnect:" + doc.toJson(QJsonDocument::Compact) + "\n"; + if (m_needIdentity) { + m_identityContent = propsObj.value(identity).toString(); + json.insert(identity, m_identityContent); + } + json.insert("password", password); + QJsonDocument passwordDoc; + passwordDoc.setObject(json); + m_data += "\nconnect:" + passwordDoc.toJson(QJsonDocument::Compact) + "\n"; ConnectToServer(); qDebug() << "Connect to server :" << m_clinet->serverName() << ", ssid:" << m_key; return true; @@ -117,6 +98,62 @@ bool NetworkDialog::exec(const QJsonDocument &doc) return false; } +void NetworkDialog::onSecretsResult(QLocalSocket *socket, const QByteArray &data) +{ + Q_UNUSED(socket); + if (data.isEmpty()) { + exit(1); + return; + } + + QFile file; + if (!file.open(stdout, QFile::WriteOnly)) { + qWarning() << "Open stdout failed"; + exit(-4); + } + file.write(data); + file.flush(); + file.close(); + exit(0); +} + +void NetworkDialog::onPassword(QLocalSocket *socket, const QByteArray &data) +{ + Q_UNUSED(socket); + QJsonDocument doc = QJsonDocument::fromJson(data); + if (!doc.isObject()) + return; + QJsonObject obj = doc.object(); + QString key = obj.value("key").toString(); + QString passwd = obj.value("password").toString(); + QString identityContent; + bool input = obj.value("input").toBool(); + if (m_key != key) + return; + if (!input) { + exit(1); + return; + } + QJsonObject resultJsonObj; + QJsonArray secretsJsonArray; + if (m_needIdentity) { + // 如果从networkcore获取的用户身份信息为空,则使用调用者传进来的数据.(用于兼容dde-network-core低版本情况) + identityContent = obj.value(identity).toString().isEmpty() ? m_identityContent : obj.value(identity).toString(); + secretsJsonArray.append(identityContent); + } + secretsJsonArray.append(passwd); + resultJsonObj.insert("secrets", secretsJsonArray); + QFile file; + if (!file.open(stdout, QFile::WriteOnly)) { + qDebug() << "open STDOUT failed"; + exit(-4); + } + file.write(QJsonDocument(resultJsonObj).toJson()); + file.flush(); + file.close(); + exit(0); +} + void NetworkDialog::connectedHandler() { if (!m_clinet->isOpen() || m_data.isEmpty()) @@ -129,7 +166,7 @@ void NetworkDialog::connectedHandler() void NetworkDialog::disConnectedHandler() { qDebug() << "Received disconnect event from the socket and exit it."; - qApp->exit(0); + exit(0); } bool NetworkDialog::ConnectToServer() @@ -152,6 +189,15 @@ bool NetworkDialog::ConnectToServer() return state == QLocalSocket::ConnectedState; } +void NetworkDialog::exit(int returnCode) +{ + if (m_quitNow) + return; + + m_quitNow = true; + qApp->exit(returnCode); +} + void NetworkDialog::readyReadHandler() { QLocalSocket *socket = static_cast(sender()); @@ -163,6 +209,9 @@ void NetworkDialog::readyReadHandler() QList dataArray = allData.split('\n'); m_lastData = dataArray.last(); for (const QByteArray &data : dataArray) { + if (m_quitNow) + return; + int keyIndex = data.indexOf(':'); if (keyIndex == -1) continue; diff --git a/dnetwork-secret-dialog/src/networkdialog.h b/dnetwork-secret-dialog/src/networkdialog.h index 83bbff25..2e994b3f 100644 --- a/dnetwork-secret-dialog/src/networkdialog.h +++ b/dnetwork-secret-dialog/src/networkdialog.h @@ -18,18 +18,22 @@ class NetworkDialog : public QObject ~NetworkDialog(); bool exec(const QJsonDocument &doc); + void onSecretsResult(QLocalSocket *socket, const QByteArray &data); void onPassword(QLocalSocket *socket, const QByteArray &data); private Q_SLOTS: void connectedHandler(); void disConnectedHandler(); - void readyReadHandler(); bool ConnectToServer(); + void exit(int returnCode); + void readyReadHandler(); private: QString m_key; QByteArray m_lastData; // 用于数据拼接 - + bool m_needIdentity; // 认证信息是否需要用户名 + QString m_identityContent; + bool m_quitNow; QByteArray m_data; QLocalSocket *m_clinet; };