2014-06-09 10:52:16 +01:00
/**
* Copyright 2013 Albert Vaca < albertvaka @ gmail . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation ; either version 2 of
* the License or ( at your option ) version 3 or any later version
* accepted by the membership of KDE e . V . ( or its successor approved
* by the membership of KDE e . V . ) , which shall act as a proxy
* defined in Section 14 of version 3 of the license .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2013-06-25 17:06:51 +01:00
# include "device.h"
2013-08-12 15:09:52 +01:00
2014-06-09 10:52:16 +01:00
# ifdef interface // MSVC language extension, QDBusConnection uses this as a variable name
# undef interface
# endif
# include <QDBusConnection>
2016-07-05 13:13:48 +01:00
# include <QSslCertificate>
2014-06-09 10:52:16 +01:00
2013-08-12 15:09:52 +01:00
# include <KSharedConfig>
2013-07-03 02:52:44 +01:00
# include <KConfigGroup>
2014-09-22 01:37:10 +01:00
# include <KLocalizedString>
2013-08-13 04:07:32 +01:00
2014-09-21 23:59:34 +01:00
# include "core_debug.h"
2014-06-14 15:34:00 +01:00
# include "kdeconnectplugin.h"
# include "pluginloader.h"
2013-09-09 17:35:56 +01:00
# include "backends/devicelink.h"
2017-07-22 10:13:21 +01:00
# include "backends/lan/landevicelink.h"
2013-09-09 17:35:56 +01:00
# include "backends/linkprovider.h"
2013-08-12 15:09:52 +01:00
# include "networkpackage.h"
2015-03-02 04:16:07 +00:00
# include "kdeconnectconfig.h"
2015-03-24 11:26:37 +00:00
# include "daemon.h"
2013-08-12 15:09:52 +01:00
2017-09-03 20:39:44 +01:00
static void warn ( const QString & info )
2015-12-17 14:53:29 +00:00
{
qWarning ( ) < < " Device pairing error " < < info ;
}
2014-01-22 22:31:27 +00:00
Device : : Device ( QObject * parent , const QString & id )
: QObject ( parent )
, m_deviceId ( id )
2017-09-03 20:39:44 +01:00
, m_protocolVersion ( NetworkPackage : : s_protocolVersion ) //We don't know it yet
2013-07-03 02:52:44 +01:00
{
2015-03-02 04:16:07 +00:00
KdeConnectConfig : : DeviceInfo info = KdeConnectConfig : : instance ( ) - > getTrustedDevice ( id ) ;
2013-07-26 15:21:19 +01:00
2015-03-02 04:16:07 +00:00
m_deviceName = info . deviceName ;
m_deviceType = str2type ( info . deviceType ) ;
2015-03-13 23:39:13 +00:00
2013-07-26 15:21:19 +01:00
//Register in bus
2013-08-20 12:52:25 +01:00
QDBusConnection : : sessionBus ( ) . registerObject ( dbusPath ( ) , this , QDBusConnection : : ExportScriptableContents | QDBusConnection : : ExportAdaptors ) ;
2015-12-17 14:53:29 +00:00
2016-09-05 23:42:19 +01:00
//Assume every plugin is supported until addLink is called and we can get the actual list
m_supportedPlugins = PluginLoader : : instance ( ) - > getPluginList ( ) . toSet ( ) ;
2015-12-17 14:53:29 +00:00
connect ( this , & Device : : pairingError , this , & warn ) ;
2013-06-25 17:06:51 +01:00
}
2013-07-03 02:52:44 +01:00
2014-01-22 22:31:27 +00:00
Device : : Device ( QObject * parent , const NetworkPackage & identityPackage , DeviceLink * dl )
: QObject ( parent )
2016-11-26 14:38:08 +00:00
, m_deviceId ( identityPackage . get < QString > ( QStringLiteral ( " deviceId " ) ) )
, m_deviceName ( identityPackage . get < QString > ( QStringLiteral ( " deviceName " ) ) )
2013-07-03 02:52:44 +01:00
{
2014-01-17 22:07:30 +00:00
addLink ( identityPackage , dl ) ;
2015-09-08 16:28:47 +01:00
2013-08-16 05:26:40 +01:00
//Register in bus
2013-08-20 12:52:25 +01:00
QDBusConnection : : sessionBus ( ) . registerObject ( dbusPath ( ) , this , QDBusConnection : : ExportScriptableContents | QDBusConnection : : ExportAdaptors ) ;
2015-12-17 14:53:29 +00:00
connect ( this , & Device : : pairingError , this , & warn ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-16 08:27:32 +01:00
Device : : ~ Device ( )
{
2016-07-05 11:42:57 +01:00
qDeleteAll ( m_deviceLinks ) ;
m_deviceLinks . clear ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-13 04:07:32 +01:00
2013-09-01 21:13:03 +01:00
bool Device : : hasPlugin ( const QString & name ) const
2013-08-13 22:23:32 +01:00
{
return m_plugins . contains ( name ) ;
}
2013-09-01 21:13:03 +01:00
QStringList Device : : loadedPlugins ( ) const
2013-08-18 19:27:25 +01:00
{
return m_plugins . keys ( ) ;
}
2013-08-13 04:07:32 +01:00
void Device : : reloadPlugins ( )
{
2016-08-21 12:21:40 +01:00
QHash < QString , KdeConnectPlugin * > newPluginMap , oldPluginMap = m_plugins ;
2016-07-06 16:37:22 +01:00
QMultiMap < QString , KdeConnectPlugin * > newPluginsByIncomingCapability ;
2013-08-13 04:07:32 +01:00
2015-12-01 18:45:14 +00:00
if ( isTrusted ( ) & & isReachable ( ) ) { //Do not load any plugin for unpaired devices, nor useless loading them for unreachable devices
2013-08-13 04:07:32 +01:00
2013-08-14 00:35:12 +01:00
PluginLoader * loader = PluginLoader : : instance ( ) ;
2013-08-13 04:07:32 +01:00
2017-07-20 15:14:07 +01:00
for ( const QString & pluginName : qAsConst ( m_supportedPlugins ) ) {
2015-09-08 19:03:44 +01:00
const KPluginMetaData service = loader - > getPluginInfo ( pluginName ) ;
2013-08-13 04:07:32 +01:00
2015-09-08 19:03:44 +01:00
const bool pluginEnabled = isPluginEnabled ( pluginName ) ;
2016-11-26 14:38:08 +00:00
const QSet < QString > incomingCapabilities = KPluginMetaData : : readStringList ( service . rawData ( ) , QStringLiteral ( " X-KdeConnect-SupportedPackageType " ) ) . toSet ( ) ;
2015-09-08 19:03:44 +01:00
if ( pluginEnabled ) {
KdeConnectPlugin * plugin = m_plugins . take ( pluginName ) ;
2014-07-11 00:54:19 +01:00
if ( ! plugin ) {
plugin = loader - > instantiatePluginForDevice ( pluginName , this ) ;
}
2016-07-06 16:37:22 +01:00
Q_ASSERT ( plugin ) ;
2014-07-11 00:54:19 +01:00
2017-07-20 15:14:07 +01:00
for ( const QString & interface : incomingCapabilities ) {
2016-07-06 16:37:22 +01:00
newPluginsByIncomingCapability . insert ( interface , plugin ) ;
2013-08-14 00:35:12 +01:00
}
2015-09-12 16:48:24 +01:00
2013-10-29 16:29:31 +00:00
newPluginMap [ pluginName ] = plugin ;
2013-08-14 00:35:12 +01:00
}
2013-08-13 04:07:32 +01:00
}
}
2016-08-21 12:21:40 +01:00
const bool differentPlugins = oldPluginMap ! = newPluginMap ;
2016-07-06 16:37:22 +01:00
2013-10-11 14:19:23 +01:00
//Erase all left plugins in the original map (meaning that we don't want
//them anymore, otherwise they would have been moved to the newPluginMap)
2013-08-14 00:35:12 +01:00
qDeleteAll ( m_plugins ) ;
m_plugins = newPluginMap ;
2016-07-06 16:37:22 +01:00
m_pluginsByIncomingCapability = newPluginsByIncomingCapability ;
2013-08-14 00:35:12 +01:00
2016-12-30 15:38:12 +00:00
QDBusConnection bus = QDBusConnection : : sessionBus ( ) ;
2017-07-20 15:14:07 +01:00
for ( KdeConnectPlugin * plugin : qAsConst ( m_plugins ) ) {
2017-01-14 01:49:40 +00:00
//TODO: see how it works in Android (only done once, when created)
2013-10-11 14:19:23 +01:00
plugin - > connected ( ) ;
2016-12-30 15:38:12 +00:00
const QString dbusPath = plugin - > dbusPath ( ) ;
if ( ! dbusPath . isEmpty ( ) ) {
2017-01-27 00:39:03 +00:00
bus . registerObject ( dbusPath , plugin , QDBusConnection : : ExportAllProperties | QDBusConnection : : ExportScriptableInvokables | QDBusConnection : : ExportScriptableSignals | QDBusConnection : : ExportScriptableSlots ) ;
2016-12-30 15:38:12 +00:00
}
2013-08-22 02:21:08 +01:00
}
2016-07-06 16:37:22 +01:00
if ( differentPlugins ) {
Q_EMIT pluginsChanged ( ) ;
2015-09-08 16:28:47 +01:00
}
2013-08-13 04:07:32 +01:00
}
2015-03-02 04:16:07 +00:00
QString Device : : pluginsConfigFile ( ) const
{
2016-11-26 14:38:08 +00:00
return KdeConnectConfig : : instance ( ) - > deviceConfigDir ( id ( ) ) . absoluteFilePath ( QStringLiteral ( " config " ) ) ;
2015-03-02 04:16:07 +00:00
}
2013-08-30 18:10:43 +01:00
void Device : : requestPair ( )
2013-07-03 02:52:44 +01:00
{
2015-12-01 18:45:14 +00:00
if ( isTrusted ( ) ) {
Q_EMIT pairingError ( i18n ( " Already paired " ) ) ;
2015-11-30 18:36:01 +00:00
return ;
2015-06-15 03:22:13 +01:00
}
if ( ! isReachable ( ) ) {
2015-12-01 18:45:14 +00:00
Q_EMIT pairingError ( i18n ( " Device not reachable " ) ) ;
2015-06-15 03:22:13 +01:00
return ;
2013-08-30 18:10:43 +01:00
}
2017-07-20 15:14:07 +01:00
for ( DeviceLink * dl : qAsConst ( m_deviceLinks ) ) {
2015-12-02 19:04:35 +00:00
dl - > userRequestsPair ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-30 18:10:43 +01:00
}
void Device : : unpair ( )
{
2017-07-20 15:14:07 +01:00
for ( DeviceLink * dl : qAsConst ( m_deviceLinks ) ) {
2015-12-02 19:04:35 +00:00
dl - > userRequestsUnpair ( ) ;
2015-07-09 22:51:08 +01:00
}
2015-12-01 18:45:14 +00:00
KdeConnectConfig : : instance ( ) - > removeTrustedDevice ( id ( ) ) ;
2017-07-14 00:01:15 +01:00
Q_EMIT trustedChanged ( false ) ;
2015-03-16 02:13:54 +00:00
}
2013-08-30 18:10:43 +01:00
2015-12-01 18:45:14 +00:00
void Device : : pairStatusChanged ( DeviceLink : : PairStatus status )
2015-03-16 02:13:54 +00:00
{
2015-12-01 18:45:14 +00:00
if ( status = = DeviceLink : : NotPaired ) {
KdeConnectConfig : : instance ( ) - > removeTrustedDevice ( id ( ) ) ;
2013-08-30 18:10:43 +01:00
2017-07-20 15:14:07 +01:00
for ( DeviceLink * dl : qAsConst ( m_deviceLinks ) ) {
2015-12-01 18:45:14 +00:00
if ( dl ! = sender ( ) ) {
2015-12-02 19:04:35 +00:00
dl - > setPairStatus ( DeviceLink : : NotPaired ) ;
2015-12-01 18:45:14 +00:00
}
}
} else {
KdeConnectConfig : : instance ( ) - > addTrustedDevice ( id ( ) , name ( ) , type ( ) ) ;
2015-11-30 18:36:01 +00:00
}
2015-12-01 18:45:14 +00:00
reloadPlugins ( ) ; //Will load/unload plugins
2015-11-30 18:36:01 +00:00
2015-12-01 18:45:14 +00:00
bool isTrusted = ( status = = DeviceLink : : Paired ) ;
2017-01-13 13:22:01 +00:00
Q_EMIT trustedChanged ( isTrusted ) ;
2015-12-01 18:45:14 +00:00
Q_ASSERT ( isTrusted = = this - > isTrusted ( ) ) ;
2013-07-03 02:52:44 +01:00
}
static bool lessThan ( DeviceLink * p1 , DeviceLink * p2 )
{
2013-07-24 17:42:33 +01:00
return p1 - > provider ( ) - > priority ( ) > p2 - > provider ( ) - > priority ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-10-01 02:11:22 +01:00
void Device : : addLink ( const NetworkPackage & identityPackage , DeviceLink * link )
2013-07-03 02:52:44 +01:00
{
2014-09-21 22:54:27 +01:00
//qCDebug(KDECONNECT_CORE) << "Adding link to" << id() << "via" << link->provider();
2013-07-23 15:11:54 +01:00
2015-12-17 15:44:29 +00:00
Q_ASSERT ( ! m_deviceLinks . contains ( link ) ) ;
2016-11-26 14:38:08 +00:00
m_protocolVersion = identityPackage . get < int > ( QStringLiteral ( " protocolVersion " ) , - 1 ) ;
2017-09-03 20:39:44 +01:00
if ( m_protocolVersion ! = NetworkPackage : : s_protocolVersion ) {
qCWarning ( KDECONNECT_CORE ) < < m_deviceName < < " - warning, device uses a different protocol version " < < m_protocolVersion < < " expected " < < NetworkPackage : : s_protocolVersion ;
2013-10-01 02:11:22 +01:00
}
2016-11-26 14:12:38 +00:00
connect ( link , & QObject : : destroyed ,
this , & Device : : linkDestroyed ) ;
2013-07-04 18:17:22 +01:00
2013-07-03 02:52:44 +01:00
m_deviceLinks . append ( link ) ;
2013-08-10 04:21:55 +01:00
2013-10-14 17:25:44 +01:00
//re-read the device name from the identityPackage because it could have changed
2016-11-26 14:38:08 +00:00
setName ( identityPackage . get < QString > ( QStringLiteral ( " deviceName " ) ) ) ;
m_deviceType = str2type ( identityPackage . get < QString > ( QStringLiteral ( " deviceType " ) ) ) ;
2013-10-14 17:25:44 +01:00
2013-08-13 22:23:32 +01:00
//Theoretically we will never add two links from the same provider (the provider should destroy
//the old one before this is called), so we do not have to worry about destroying old links.
2015-03-02 04:16:07 +00:00
//-- Actually, we should not destroy them or the provider will store an invalid ref!
2013-08-10 04:21:55 +01:00
2016-11-26 14:12:38 +00:00
connect ( link , & DeviceLink : : receivedPackage ,
this , & Device : : privateReceivedPackage ) ;
2013-07-04 18:17:22 +01:00
2013-09-01 21:13:03 +01:00
qSort ( m_deviceLinks . begin ( ) , m_deviceLinks . end ( ) , lessThan ) ;
2013-07-28 21:00:45 +01:00
2016-11-26 14:38:08 +00:00
const bool capabilitiesSupported = identityPackage . has ( QStringLiteral ( " incomingCapabilities " ) ) | | identityPackage . has ( QStringLiteral ( " outgoingCapabilities " ) ) ;
2016-07-06 16:37:22 +01:00
if ( capabilitiesSupported ) {
2016-11-26 14:38:08 +00:00
const QSet < QString > outgoingCapabilities = identityPackage . get < QStringList > ( QStringLiteral ( " outgoingCapabilities " ) ) . toSet ( )
, incomingCapabilities = identityPackage . get < QStringList > ( QStringLiteral ( " incomingCapabilities " ) ) . toSet ( ) ;
2016-07-06 16:37:22 +01:00
m_supportedPlugins = PluginLoader : : instance ( ) - > pluginsForCapabilities ( incomingCapabilities , outgoingCapabilities ) ;
2016-07-12 11:49:21 +01:00
//qDebug() << "new plugins for" << m_deviceName << m_supportedPlugins << incomingCapabilities << outgoingCapabilities;
2016-07-06 16:37:22 +01:00
} else {
m_supportedPlugins = PluginLoader : : instance ( ) - > getPluginList ( ) . toSet ( ) ;
}
reloadPlugins ( ) ;
2013-07-28 21:00:45 +01:00
if ( m_deviceLinks . size ( ) = = 1 ) {
2016-11-23 16:24:03 +00:00
Q_EMIT reachableChanged ( true ) ;
2013-07-28 21:00:45 +01:00
}
2015-07-25 12:45:19 +01:00
2015-12-06 00:51:53 +00:00
connect ( link , & DeviceLink : : pairStatusChanged , this , & Device : : pairStatusChanged ) ;
2017-01-24 23:22:22 +00:00
connect ( link , & DeviceLink : : pairingRequest , this , & Device : : addPairingRequest ) ;
connect ( link , & DeviceLink : : pairingRequestExpired , this , & Device : : removePairingRequest ) ;
2015-12-06 00:51:53 +00:00
connect ( link , & DeviceLink : : pairingError , this , & Device : : pairingError ) ;
2013-07-03 02:52:44 +01:00
}
2017-01-24 23:22:22 +00:00
void Device : : addPairingRequest ( PairingHandler * handler )
{
2017-01-25 00:18:14 +00:00
const bool wasEmpty = m_pairRequests . isEmpty ( ) ;
2017-01-24 23:22:22 +00:00
m_pairRequests . insert ( handler ) ;
2017-01-25 00:18:14 +00:00
if ( wasEmpty ! = m_pairRequests . isEmpty ( ) )
Q_EMIT hasPairingRequestsChanged ( ! m_pairRequests . isEmpty ( ) ) ;
2017-01-24 23:22:22 +00:00
}
void Device : : removePairingRequest ( PairingHandler * handler )
{
2017-01-25 00:18:14 +00:00
const bool wasEmpty = m_pairRequests . isEmpty ( ) ;
2017-01-24 23:22:22 +00:00
m_pairRequests . remove ( handler ) ;
2017-01-25 00:18:14 +00:00
if ( wasEmpty ! = m_pairRequests . isEmpty ( ) )
Q_EMIT hasPairingRequestsChanged ( ! m_pairRequests . isEmpty ( ) ) ;
2017-02-20 20:00:26 +00:00
}
bool Device : : hasPairingRequests ( ) const
{
return ! m_pairRequests . isEmpty ( ) ;
2017-01-24 23:22:22 +00:00
}
void Device : : acceptPairing ( )
{
if ( m_pairRequests . isEmpty ( ) )
qWarning ( ) < < " no pair requests to accept! " ;
//copying because the pairing handler will be removed upon accept
const auto prCopy = m_pairRequests ;
for ( auto ph : prCopy )
ph - > acceptPairing ( ) ;
}
void Device : : rejectPairing ( )
{
if ( m_pairRequests . isEmpty ( ) )
qWarning ( ) < < " no pair requests to reject! " ;
//copying because the pairing handler will be removed upon reject
const auto prCopy = m_pairRequests ;
for ( auto ph : prCopy )
ph - > rejectPairing ( ) ;
}
2013-07-04 18:17:22 +01:00
void Device : : linkDestroyed ( QObject * o )
{
removeLink ( static_cast < DeviceLink * > ( o ) ) ;
}
2013-07-03 02:52:44 +01:00
void Device : : removeLink ( DeviceLink * link )
{
2015-12-01 18:45:14 +00:00
m_deviceLinks . removeAll ( link ) ;
2013-07-28 21:00:45 +01:00
2014-09-21 22:54:27 +01:00
//qCDebug(KDECONNECT_CORE) << "RemoveLink" << m_deviceLinks.size() << "links remaining";
2013-07-28 21:00:45 +01:00
2013-10-11 14:19:23 +01:00
if ( m_deviceLinks . isEmpty ( ) ) {
2013-08-16 00:01:58 +01:00
reloadPlugins ( ) ;
2016-11-23 16:24:03 +00:00
Q_EMIT reachableChanged ( false ) ;
2013-07-28 21:00:45 +01:00
}
2013-07-03 02:52:44 +01:00
}
2013-09-01 21:13:03 +01:00
bool Device : : sendPackage ( NetworkPackage & np )
2013-07-03 02:52:44 +01:00
{
2015-12-02 19:04:35 +00:00
Q_ASSERT ( np . type ( ) ! = PACKAGE_TYPE_PAIR ) ;
Q_ASSERT ( isTrusted ( ) ) ;
//Maybe we could block here any package that is not an identity or a pairing package to prevent sending non encrypted data
2017-07-20 15:14:07 +01:00
for ( DeviceLink * dl : qAsConst ( m_deviceLinks ) ) {
2015-12-02 19:04:35 +00:00
if ( dl - > sendPackage ( np ) ) return true ;
2013-08-13 04:40:39 +01:00
}
2013-07-23 15:11:54 +01:00
return false ;
2013-07-03 02:52:44 +01:00
}
void Device : : privateReceivedPackage ( const NetworkPackage & np )
{
2015-12-01 18:45:14 +00:00
Q_ASSERT ( np . type ( ) ! = PACKAGE_TYPE_PAIR ) ;
2016-07-06 16:37:22 +01:00
if ( isTrusted ( ) ) {
const QList < KdeConnectPlugin * > plugins = m_pluginsByIncomingCapability . values ( np . type ( ) ) ;
2016-06-03 14:51:05 +01:00
if ( plugins . isEmpty ( ) ) {
2016-06-12 19:16:19 +01:00
qWarning ( ) < < " discarding unsupported package " < < np . type ( ) < < " for " < < name ( ) ;
2016-06-03 14:51:05 +01:00
}
2017-07-20 15:14:07 +01:00
for ( KdeConnectPlugin * plugin : plugins ) {
2013-10-29 16:29:31 +00:00
plugin - > receivePackage ( np ) ;
}
} else {
2014-09-21 22:54:27 +01:00
qCDebug ( KDECONNECT_CORE ) < < " device " < < name ( ) < < " not paired, ignoring package " < < np . type ( ) ;
2015-07-27 16:28:58 +01:00
unpair ( ) ;
2013-07-03 02:52:44 +01:00
}
2013-08-30 18:10:43 +01:00
}
2015-12-01 18:45:14 +00:00
bool Device : : isTrusted ( ) const
2015-12-01 15:25:34 +00:00
{
2015-12-01 18:45:14 +00:00
return KdeConnectConfig : : instance ( ) - > trustedDevices ( ) . contains ( id ( ) ) ;
2013-11-06 20:34:06 +00:00
}
2013-07-23 15:11:54 +01:00
QStringList Device : : availableLinks ( ) const
{
QStringList sl ;
2016-11-26 15:19:00 +00:00
sl . reserve ( m_deviceLinks . size ( ) ) ;
2017-07-20 15:14:07 +01:00
for ( DeviceLink * dl : qAsConst ( m_deviceLinks ) ) {
2013-07-24 17:42:33 +01:00
sl . append ( dl - > provider ( ) - > name ( ) ) ;
2013-07-23 15:11:54 +01:00
}
return sl ;
}
2016-01-10 15:12:13 +00:00
void Device : : cleanUnneededLinks ( ) {
if ( isTrusted ( ) ) {
return ;
}
for ( int i = 0 ; i < m_deviceLinks . size ( ) ; ) {
DeviceLink * dl = m_deviceLinks [ i ] ;
if ( ! dl - > linkShouldBeKeptAlive ( ) ) {
dl - > deleteLater ( ) ;
m_deviceLinks . remove ( i ) ;
} else {
i + + ;
}
}
}
2017-07-22 10:13:21 +01:00
QHostAddress Device : : getLocalIpAddress ( ) const
{
for ( DeviceLink * dl : m_deviceLinks ) {
LanDeviceLink * ldl = dynamic_cast < LanDeviceLink * > ( dl ) ;
if ( ldl ) {
return ldl - > hostAddress ( ) ;
}
}
return QHostAddress : : Null ;
}
2017-09-03 20:39:44 +01:00
Device : : DeviceType Device : : str2type ( const QString & deviceType ) {
2016-11-26 14:38:08 +00:00
if ( deviceType = = QLatin1String ( " desktop " ) ) return Desktop ;
if ( deviceType = = QLatin1String ( " laptop " ) ) return Laptop ;
if ( deviceType = = QLatin1String ( " smartphone " ) | | deviceType = = QLatin1String ( " phone " ) ) return Phone ;
if ( deviceType = = QLatin1String ( " tablet " ) ) return Tablet ;
2013-11-06 20:31:37 +00:00
return Unknown ;
}
2013-11-06 20:34:06 +00:00
QString Device : : type2str ( Device : : DeviceType deviceType ) {
2016-11-26 14:38:08 +00:00
if ( deviceType = = Desktop ) return QStringLiteral ( " desktop " ) ;
if ( deviceType = = Laptop ) return QStringLiteral ( " laptop " ) ;
if ( deviceType = = Phone ) return QStringLiteral ( " smartphone " ) ;
if ( deviceType = = Tablet ) return QStringLiteral ( " tablet " ) ;
return QStringLiteral ( " unknown " ) ;
2014-06-14 15:34:00 +01:00
}
2014-06-14 18:09:31 +01:00
2015-05-18 07:28:58 +01:00
QString Device : : statusIconName ( ) const
{
2015-12-01 18:45:14 +00:00
return iconForStatus ( isReachable ( ) , isTrusted ( ) ) ;
2015-05-18 07:28:58 +01:00
}
2014-06-14 18:09:31 +01:00
QString Device : : iconName ( ) const
{
2015-05-18 07:28:58 +01:00
return iconForStatus ( true , false ) ;
}
2015-12-01 18:45:14 +00:00
QString Device : : iconForStatus ( bool reachable , bool trusted ) const
2015-05-18 07:28:58 +01:00
{
Device : : DeviceType deviceType = m_deviceType ;
if ( deviceType = = Device : : Unknown ) {
deviceType = Device : : Phone ; //Assume phone if we don't know the type
} else if ( deviceType = = Device : : Desktop ) {
deviceType = Device : : Device : : Laptop ; // We don't have desktop icon yet
2014-06-14 18:09:31 +01:00
}
2015-05-18 07:28:58 +01:00
2015-12-01 18:45:14 +00:00
QString status = ( reachable ? ( trusted ? QStringLiteral ( " connected " ) : QStringLiteral ( " disconnected " ) ) : QStringLiteral ( " trusted " ) ) ;
2015-05-18 07:28:58 +01:00
QString type = type2str ( deviceType ) ;
2016-11-28 15:27:13 +00:00
return type + status ;
2014-06-14 18:09:31 +01:00
}
2015-03-14 03:28:54 +00:00
2017-09-03 20:39:44 +01:00
void Device : : setName ( const QString & name )
2015-03-14 03:28:54 +00:00
{
if ( m_deviceName ! = name ) {
m_deviceName = name ;
Q_EMIT nameChanged ( name ) ;
}
}
2015-09-07 13:54:33 +01:00
KdeConnectPlugin * Device : : plugin ( const QString & pluginName ) const
{
return m_plugins [ pluginName ] ;
}
2015-09-08 16:28:47 +01:00
void Device : : setPluginEnabled ( const QString & pluginName , bool enabled )
{
KConfigGroup pluginStates = KSharedConfig : : openConfig ( pluginsConfigFile ( ) ) - > group ( " Plugins " ) ;
const QString enabledKey = pluginName + QStringLiteral ( " Enabled " ) ;
pluginStates . writeEntry ( enabledKey , enabled ) ;
reloadPlugins ( ) ;
}
bool Device : : isPluginEnabled ( const QString & pluginName ) const
{
const QString enabledKey = pluginName + QStringLiteral ( " Enabled " ) ;
KConfigGroup pluginStates = KSharedConfig : : openConfig ( pluginsConfigFile ( ) ) - > group ( " Plugins " ) ;
return ( pluginStates . hasKey ( enabledKey ) ? pluginStates . readEntry ( enabledKey , false )
: PluginLoader : : instance ( ) - > getPluginInfo ( pluginName ) . isEnabledByDefault ( ) ) ;
}
2015-11-30 18:36:01 +00:00
QString Device : : encryptionInfo ( ) const
{
QString result ;
2016-08-29 19:40:36 +01:00
QCryptographicHash : : Algorithm digestAlgorithm = QCryptographicHash : : Algorithm : : Sha1 ;
2015-11-30 18:36:01 +00:00
2016-08-29 19:40:36 +01:00
QString localSha1 = QString : : fromLatin1 ( KdeConnectConfig : : instance ( ) - > certificate ( ) . digest ( digestAlgorithm ) . toHex ( ) ) ;
2016-11-16 20:37:07 +00:00
for ( int i = 2 ; i < localSha1 . size ( ) ; i + = 3 ) {
2016-08-29 19:40:36 +01:00
localSha1 . insert ( i , ' : ' ) ; // Improve readability
2015-11-30 18:36:01 +00:00
}
2016-08-29 19:40:36 +01:00
result + = i18n ( " SHA1 fingerprint of your device certificate is: %1 \n " , localSha1 ) ;
2015-11-30 18:36:01 +00:00
2016-11-26 14:38:08 +00:00
std : : string remotePem = KdeConnectConfig : : instance ( ) - > getDeviceProperty ( id ( ) , QStringLiteral ( " certificate " ) ) . toStdString ( ) ;
2016-11-16 20:37:07 +00:00
QSslCertificate remoteCertificate = QSslCertificate ( QByteArray ( remotePem . c_str ( ) , ( int ) remotePem . size ( ) ) ) ;
2016-08-29 19:40:36 +01:00
QString remoteSha1 = QString : : fromLatin1 ( remoteCertificate . digest ( digestAlgorithm ) . toHex ( ) ) ;
2016-11-16 20:37:07 +00:00
for ( int i = 2 ; i < remoteSha1 . size ( ) ; i + = 3 ) {
2016-08-29 19:40:36 +01:00
remoteSha1 . insert ( i , ' : ' ) ; // Improve readability
2015-11-30 18:36:01 +00:00
}
2016-08-29 19:40:36 +01:00
result + = i18n ( " SHA1 fingerprint of remote device certificate is: %1 \n " , remoteSha1 ) ;
2015-11-30 18:36:01 +00:00
return result ;
}