File indexing completed on 2024-05-05 04:58:43

0001 /**
0002  * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #ifndef LANLINKPROVIDER_H
0008 #define LANLINKPROVIDER_H
0009 
0010 #include <QNetworkInformation>
0011 #include <QObject>
0012 #include <QSslSocket>
0013 #include <QTcpServer>
0014 #include <QTimer>
0015 #include <QUdpSocket>
0016 
0017 #include "backends/linkprovider.h"
0018 #include "kdeconnectcore_export.h"
0019 #include "landevicelink.h"
0020 #include "server.h"
0021 #ifdef KDECONNECT_MDNS
0022 #include "mdnsdiscovery.h"
0023 #endif
0024 
0025 class KDECONNECTCORE_EXPORT LanLinkProvider : public LinkProvider
0026 {
0027     Q_OBJECT
0028 
0029 public:
0030     /**
0031      * @param testMode Some special overrides needed while testing
0032      */
0033     LanLinkProvider(bool testMode = false);
0034     ~LanLinkProvider() override;
0035 
0036     QString name() override
0037     {
0038         return QStringLiteral("LanLinkProvider");
0039     }
0040 
0041     int priority() override
0042     {
0043         return 20;
0044     }
0045 
0046     void sendUdpIdentityPacket(const QList<QHostAddress> &addresses);
0047 
0048     static void configureSslSocket(QSslSocket *socket, const QString &deviceId, bool isDeviceTrusted);
0049     static void configureSocket(QSslSocket *socket);
0050 
0051     /**
0052      * This is the default UDP port both for broadcasting and receiving identity packets
0053      */
0054     const static quint16 UDP_PORT = 1716;
0055     const static quint16 MIN_TCP_PORT = 1716;
0056     const static quint16 MAX_TCP_PORT = 1764;
0057 
0058 public Q_SLOTS:
0059     void onNetworkChange() override;
0060     void onLinkDestroyed(const QString &deviceId, DeviceLink *oldPtr) override;
0061     void onStart() override;
0062     void onStop() override;
0063     void tcpSocketConnected();
0064     void encrypted();
0065     void connectError(QAbstractSocket::SocketError socketError);
0066 
0067 private Q_SLOTS:
0068     void udpBroadcastReceived();
0069     void newConnection();
0070     void dataReceived();
0071     void sslErrors(const QList<QSslError> &errors);
0072     void combinedOnNetworkChange();
0073 
0074 private:
0075     void addLink(QSslSocket *socket, const DeviceInfo &deviceInfo);
0076     QList<QHostAddress> getBroadcastAddresses();
0077     void sendUdpIdentityPacket(QUdpSocket &socket, const QList<QHostAddress> &addresses);
0078     void broadcastUdpIdentityPacket();
0079 
0080     Server *m_server;
0081     QUdpSocket m_udpSocket;
0082     quint16 m_tcpPort;
0083 
0084     QMap<QString, LanDeviceLink *> m_links;
0085 
0086     struct PendingConnect {
0087         NetworkPacket *np;
0088         QHostAddress sender;
0089     };
0090     QMap<QSslSocket *, PendingConnect> m_receivedIdentityPackets;
0091     QMap<QString, qint64> m_lastConnectionTime;
0092     const bool m_testMode;
0093     QTimer m_combineNetworkChangeTimer;
0094 
0095 #ifdef KDECONNECT_MDNS
0096     MdnsDiscovery m_mdnsDiscovery;
0097 #endif
0098 };
0099 
0100 #endif