From dc1c33491dbbf883539c5d2cf941271905b6c381 Mon Sep 17 00:00:00 2001 From: Sami Kananoja Date: Fri, 13 Mar 2015 09:54:13 +0200 Subject: [PATCH] =?UTF-8?q?[ssu]=C2=A0Use=20Wlan=20MAC=20address=20as=20th?= =?UTF-8?q?e=20device=20UID=20if=20IMEI=20is=20not=20found.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libssu/ssudeviceinfo.cpp | 65 ++++++++++++++++++++++++++++------------ libssu/ssudeviceinfo.h | 3 +- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/libssu/ssudeviceinfo.cpp b/libssu/ssudeviceinfo.cpp index 8de63fd..271bde8 100644 --- a/libssu/ssudeviceinfo.cpp +++ b/libssu/ssudeviceinfo.cpp @@ -281,34 +281,61 @@ ofonoGetImeis() return result; } +static QStringList +getWlanMacs() +{ + // Based on QtSystems' qnetworkinfo_linux.cpp + QStringList result; + + QStringList dirs = QDir(QLatin1String("/sys/class/net/")) + .entryList(QStringList() << QLatin1String("wlan*")); + foreach (const QString &dir, dirs) { + QFile carrier(QString("/sys/class/net/%1/address").arg(dir)); + if (carrier.open(QIODevice::ReadOnly)) { + result.append(QString::fromLatin1(carrier.readAll().simplified().data())); + } + } + return result; +} + +static QString +normalizeUid(const QString& uid) +{ + // Normalize by stripping colons, dashes and making it lowercase + return uid.trimmed().replace(":", "").replace("-", "").toLower(); +} + QString SsuDeviceInfo::deviceUid(){ + SsuLog *ssuLog = SsuLog::instance(); QStringList imeis = ofonoGetImeis(); + if (imeis.size() > 0) { + return imeis[0]; + } - if (imeis.size() == 0) { - qWarning() << "Could not get IMEI(s) from ofono, trying fallback"; + QStringList wlanMacs = getWlanMacs(); + if (wlanMacs.size() > 0) { + return normalizeUid(wlanMacs[0]); + } - // The fallback list is taken from QtSystems' qdeviceinfo_linux.cpp - QStringList fallbackFiles; - fallbackFiles << "/sys/devices/virtual/dmi/id/product_uuid"; - fallbackFiles << "/etc/machine-id"; - fallbackFiles << "/etc/unique-id"; - fallbackFiles << "/var/lib/dbus/machine-id"; + ssuLog->print(LOG_WARNING, "Could not get IMEI(s) from ofono, nor WLAN mac, trying fallback"); - foreach (const QString &filename, fallbackFiles) { - QFile machineId(filename); - if (machineId.open(QFile::ReadOnly | QFile::Text)) { - QTextStream in(&machineId); + // The fallback list is taken from QtSystems' qdeviceinfo_linux.cpp + QStringList fallbackFiles; + fallbackFiles << "/sys/devices/virtual/dmi/id/product_uuid"; + fallbackFiles << "/etc/machine-id"; + fallbackFiles << "/etc/unique-id"; + fallbackFiles << "/var/lib/dbus/machine-id"; - // Normalize by stripping colons, dashes and making it lowercase - return in.readAll().trimmed().replace(":", "").replace("-", "").toLower(); - } + foreach (const QString &filename, fallbackFiles) { + QFile machineId(filename); + if (machineId.open(QFile::ReadOnly | QFile::Text)) { + QTextStream in(&machineId); + return normalizeUid(in.readAll()); } - - qCritical() << "Could not read fallback UID - returning empty string"; - return ""; } - return imeis[0]; + ssuLog->print(LOG_CRIT, "Could not read fallback UID - returning empty string"); + return ""; } QStringList SsuDeviceInfo::disabledRepos(){ diff --git a/libssu/ssudeviceinfo.h b/libssu/ssudeviceinfo.h index 654b3ec..813904e 100644 --- a/libssu/ssudeviceinfo.h +++ b/libssu/ssudeviceinfo.h @@ -54,7 +54,8 @@ class SsuDeviceInfo: public QObject { Q_INVOKABLE QString deviceModel(); /** * Calculate the device ID used in ssu requests - * @return QSystemDeviceInfo::imei(), if available, or QSystemDeviceInfo::uniqueDeviceID() + * @return QSystemDeviceInfo::imei(), if available, or QNetworkInfo::macAddress(QNetworkInfo::WlanMode, 0), + * if available, or QSystemDeviceInfo::uniqueDeviceID() */ Q_INVOKABLE QString deviceUid(); /**