Skip to content

Commit

Permalink
Move device info related functionality into separate class
Browse files Browse the repository at this point in the history
  • Loading branch information
Bernd Wachter committed Mar 19, 2013
1 parent e066760 commit b28e7f8
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 133 deletions.
4 changes: 3 additions & 1 deletion libssu/libssu.pro
@@ -1,7 +1,9 @@
BUILD = ../build/libssu
HEADERS = ssu.h \
ssudeviceinfo.h \
../constants.h
SOURCES = ssu.cpp
SOURCES = ssu.cpp \
ssudeviceinfo.cpp
TEMPLATE = lib
TARGET = ssu
CONFIG += dll mobility link_pkgconfig
Expand Down
123 changes: 6 additions & 117 deletions libssu/ssu.cpp
Expand Up @@ -5,15 +5,11 @@
* @date 2012
*/

#include <QSystemDeviceInfo>

#include <QtXml/QDomDocument>

#include "ssu.h"
#include "../constants.h"

QTM_USE_NAMESPACE

Ssu::Ssu(QString fallbackLog): QObject(){
errorFlag = false;
fallbackLogPath = fallbackLog;
Expand All @@ -34,7 +30,6 @@ Ssu::Ssu(QString fallbackLog): QObject(){

settings = new QSettings(SSU_CONFIGURATION, QSettings::IniFormat);
repoSettings = new QSettings(SSU_REPO_CONFIGURATION, QSettings::IniFormat);
boardMappings = new QSettings(SSU_BOARD_MAPPING_CONFIGURATION, QSettings::IniFormat);
QSettings defaultSettings(SSU_DEFAULT_CONFIGURATION, QSettings::IniFormat);

int configVersion=0;
Expand Down Expand Up @@ -151,112 +146,6 @@ QString Ssu::credentialsUrl(QString scope){
return "your-configuration-is-broken-and-does-not-contain-credentials-url-for-" + scope;
}

QString Ssu::deviceFamily(){
QString model = deviceModel();

if (!cachedFamily.isEmpty())
return cachedFamily;

cachedFamily = "UNKNOWN";

if (boardMappings->contains("variants/" + model))
model = boardMappings->value("variants/" + model).toString();

if (boardMappings->contains(model + "/family"))
cachedFamily = boardMappings->value(model + "/family").toString();

return cachedFamily;
}

QString Ssu::deviceModel(){
QDir dir;
QFile procCpuinfo;
QStringList keys;

if (!cachedModel.isEmpty())
return cachedModel;

boardMappings->beginGroup("file.exists");
keys = boardMappings->allKeys();

// check if the device can be identified by testing for a file
foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (dir.exists(value)){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
if (!cachedModel.isEmpty()) return cachedModel;

// check if the QSystemInfo model is useful
QSystemDeviceInfo devInfo;
QString model = devInfo.model();
boardMappings->beginGroup("systeminfo.equals");
keys = boardMappings->allKeys();
foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (model == value){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
if (!cachedModel.isEmpty()) return cachedModel;

// check if the device can be identified by a string in /proc/cpuinfo
procCpuinfo.setFileName("/proc/cpuinfo");
procCpuinfo.open(QIODevice::ReadOnly | QIODevice::Text);
if (procCpuinfo.isOpen()){
QTextStream in(&procCpuinfo);
QString cpuinfo = in.readAll();
boardMappings->beginGroup("cpuinfo.contains");
keys = boardMappings->allKeys();

foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (cpuinfo.contains(value)){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
}
if (!cachedModel.isEmpty()) return cachedModel;


// check if there's a match on arch ofr generic fallback. This probably
// only makes sense for x86
boardMappings->beginGroup("arch.equals");
keys = boardMappings->allKeys();
foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (settings->value("arch").toString() == value){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
if (cachedModel.isEmpty()) cachedModel = "UNKNOWN";

return cachedModel;
}

QString Ssu::deviceUid(){
QString IMEI;
QSystemDeviceInfo devInfo;

IMEI = devInfo.imei();

// this might not be completely unique (or might change on reflash), but works for now
if (IMEI == ""){
IMEI = devInfo.uniqueDeviceID();
}

return IMEI;
}

bool Ssu::error(){
return errorFlag;
}
Expand Down Expand Up @@ -393,8 +282,8 @@ QString Ssu::repoUrl(QString repoName, bool rndRepo, QHash<QString, QString> rep
repoParameters.insert("arch", settings->value("arch").toString());

repoParameters.insert("adaptation", settings->value("adaptation").toString());
repoParameters.insert("deviceFamily", deviceFamily());
repoParameters.insert("deviceModel", deviceModel());
repoParameters.insert("deviceFamily", deviceInfo.deviceFamily());
repoParameters.insert("deviceModel", deviceInfo.deviceModel());

// Domain variables
// first read all variables from default-domain
Expand Down Expand Up @@ -539,7 +428,7 @@ void Ssu::sendRegistration(QString usernameDomain, QString password){
} else
ssuRegisterUrl = settings->value("register-url").toString();

QString IMEI = deviceUid();
QString IMEI = deviceInfo.deviceUid();
if (IMEI == ""){
setError("No valid UID available for your device. For phones: is your modem online?");
return;
Expand All @@ -564,7 +453,7 @@ void Ssu::sendRegistration(QString usernameDomain, QString password){

QUrl form;
form.addQueryItem("protocolVersion", SSU_PROTOCOL_VERSION);
form.addQueryItem("deviceModel", deviceModel());
form.addQueryItem("deviceModel", deviceInfo.deviceModel());
if (!domain().isEmpty()){
form.addQueryItem("domain", domain());
}
Expand Down Expand Up @@ -688,7 +577,7 @@ void Ssu::storeAuthorizedKeys(QByteArray data){
void Ssu::updateCredentials(bool force){
errorFlag = false;

if (deviceUid() == ""){
if (deviceInfo.deviceUid() == ""){
setError("No valid UID available for your device. For phones: is your modem online?");
return;
}
Expand Down Expand Up @@ -745,7 +634,7 @@ void Ssu::updateCredentials(bool force){
sslConfiguration.setLocalCertificate(certificate);

QNetworkRequest request;
request.setUrl(QUrl(ssuCredentialsUrl.arg(deviceUid())));
request.setUrl(QUrl(ssuCredentialsUrl.arg(deviceInfo.deviceUid())));

printJournal(LOG_DEBUG, QString("Sending credential update request to %1")
.arg(request.url().toString()));
Expand Down
25 changes: 10 additions & 15 deletions libssu/ssu.h
Expand Up @@ -18,6 +18,8 @@

#include <systemd/sd-journal.h>

#include <ssudeviceinfo.h>

class Ssu: public QObject {
Q_OBJECT

Expand All @@ -42,19 +44,6 @@ class Ssu: public QObject {
* Return the URL for which credentials scope is valid
*/
QString credentialsUrl(QString scope);
/**
* Try to find the device family for the system this is running on
*/
Q_INVOKABLE QString deviceFamily();
/**
* Try to find out ond what kind of system this is running
*/
Q_INVOKABLE QString deviceModel();
/**
* Calculate the device ID used in SSU requests
* @return QSystemDeviceInfo::imei(), if available, or QSystemDeviceInfo::uniqueDeviceID()
*/
Q_INVOKABLE QString deviceUid();
/**
* Returns if the last operation was successful
* @retval true last operation was successful
Expand Down Expand Up @@ -127,13 +116,19 @@ class Ssu: public QObject {
*/
Q_INVOKABLE bool useSslVerify();


// compat stuff, might go away when refactoring is finished
Q_INVOKABLE QString deviceFamily(){ return deviceInfo.deviceFamily(); };
Q_INVOKABLE QString deviceModel(){ return deviceInfo.deviceModel(); };
Q_INVOKABLE QString deviceUid(){ return deviceInfo.deviceUid(); };

private:
QString errorString, fallbackLogPath;
QString cachedModel, cachedFamily;
bool errorFlag;
QNetworkAccessManager *manager;
int pendingRequests;
QSettings *settings, *repoSettings, *boardMappings;
QSettings *settings, *repoSettings;
SsuDeviceInfo deviceInfo;
bool registerDevice(QDomDocument *response);
bool setCredentials(QDomDocument *response);
bool verifyResponse(QDomDocument *response);
Expand Down
128 changes: 128 additions & 0 deletions libssu/ssudeviceinfo.cpp
@@ -0,0 +1,128 @@
/**
* @file ssudeviceinfo.cpp
* @copyright 2013 2013 Jolla Ltd.
* @author Bernd Wachter <bwachter@lart.info>
* @date 2013
*/

#include <QSystemDeviceInfo>
#include <QTextStream>
#include <QDir>

#include "ssudeviceinfo.h"
#include "../constants.h"

QTM_USE_NAMESPACE

SsuDeviceInfo::SsuDeviceInfo(): QObject(){

boardMappings = new QSettings(SSU_BOARD_MAPPING_CONFIGURATION, QSettings::IniFormat);
}

QString SsuDeviceInfo::deviceFamily(){
QString model = deviceModel();

if (!cachedFamily.isEmpty())
return cachedFamily;

cachedFamily = "UNKNOWN";

if (boardMappings->contains("variants/" + model))
model = boardMappings->value("variants/" + model).toString();

if (boardMappings->contains(model + "/family"))
cachedFamily = boardMappings->value(model + "/family").toString();

return cachedFamily;
}

QString SsuDeviceInfo::deviceModel(){
QDir dir;
QFile procCpuinfo;
QStringList keys;

if (!cachedModel.isEmpty())
return cachedModel;

boardMappings->beginGroup("file.exists");
keys = boardMappings->allKeys();

// check if the device can be identified by testing for a file
foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (dir.exists(value)){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
if (!cachedModel.isEmpty()) return cachedModel;

// check if the QSystemInfo model is useful
QSystemDeviceInfo devInfo;
QString model = devInfo.model();
boardMappings->beginGroup("systeminfo.equals");
keys = boardMappings->allKeys();
foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (model == value){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
if (!cachedModel.isEmpty()) return cachedModel;

// check if the device can be identified by a string in /proc/cpuinfo
procCpuinfo.setFileName("/proc/cpuinfo");
procCpuinfo.open(QIODevice::ReadOnly | QIODevice::Text);
if (procCpuinfo.isOpen()){
QTextStream in(&procCpuinfo);
QString cpuinfo = in.readAll();
boardMappings->beginGroup("cpuinfo.contains");
keys = boardMappings->allKeys();

foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (cpuinfo.contains(value)){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
}
if (!cachedModel.isEmpty()) return cachedModel;


// check if there's a match on arch ofr generic fallback. This probably
// only makes sense for x86
boardMappings->beginGroup("arch.equals");
keys = boardMappings->allKeys();

QSettings settings(SSU_CONFIGURATION, QSettings::IniFormat);
foreach (const QString &key, keys){
QString value = boardMappings->value(key).toString();
if (settings.value("arch").toString() == value){
cachedModel = key;
break;
}
}
boardMappings->endGroup();
if (cachedModel.isEmpty()) cachedModel = "UNKNOWN";

return cachedModel;
}

QString SsuDeviceInfo::deviceUid(){
QString IMEI;
QSystemDeviceInfo devInfo;

IMEI = devInfo.imei();

// this might not be completely unique (or might change on reflash), but works for now
if (IMEI == ""){
IMEI = devInfo.uniqueDeviceID();
}

return IMEI;
}

0 comments on commit b28e7f8

Please sign in to comment.