bool Ssu::registerDevice(QDomDocument *response){ QString certificateString = response->elementsByTagName("certificate").at(0).toElement().text(); QSslCertificate certificate(certificateString.toAscii()); SsuLog *ssuLog = SsuLog::instance(); SsuCoreConfig *settings = SsuCoreConfig::instance(); if (certificate.isNull()){ // make sure device is in unregistered state on failed registration settings->setValue("registered", false); setError("Certificate is invalid"); return false; } else settings->setValue("certificate", certificate.toPem()); QString privateKeyString = response->elementsByTagName("privateKey").at(0).toElement().text(); QSslKey privateKey(privateKeyString.toAscii(), QSsl::Rsa); if (privateKey.isNull()){ settings->setValue("registered", false); setError("Private key is invalid"); return false; } else settings->setValue("privateKey", privateKey.toPem()); // oldUser is just for reference purposes, in case we want to notify // about owner changes for the device QString oldUser = response->elementsByTagName("user").at(0).toElement().text(); ssuLog->print(LOG_DEBUG, QString("Old user for your device was: %1").arg(oldUser)); // if we came that far everything required for device registration is done settings->setValue("registered", true); settings->sync(); emit registrationStatusChanged(); return true; }
int SsuRepoManager::add(QString repo, QString repoUrl){ SsuCoreConfig *ssuSettings = SsuCoreConfig::instance(); // adding a repo is a noop when device is in update mode... if ((ssuSettings->deviceMode() & Ssu::UpdateMode) == Ssu::UpdateMode) return -1; // ... or in AppInstallMode if ((ssuSettings->deviceMode() & Ssu::AppInstallMode) == Ssu::AppInstallMode) return -1; if (repoUrl == ""){ // just enable a repository which has URL in repos.ini QStringList enabledRepos; if (ssuSettings->contains("enabled-repos")) enabledRepos = ssuSettings->value("enabled-repos").toStringList(); enabledRepos.append(repo); enabledRepos.removeDuplicates(); ssuSettings->setValue("enabled-repos", enabledRepos); } else ssuSettings->setValue("repository-urls/" + repo, repoUrl); ssuSettings->sync(); return 0; }
void Ssu::unregister(){ SsuCoreConfig *settings = SsuCoreConfig::instance(); settings->setValue("privateKey", ""); settings->setValue("certificate", ""); settings->setValue("registered", false); settings->sync(); emit registrationStatusChanged(); }
Ssu::Ssu(): QObject(){ errorFlag = false; pendingRequests = 0; #ifdef SSUCONFHACK // dirty hack to make sure we can write to the configuration // this is currently required since there's no global gconf, // and we migth not yet have users on bootstrap QFileInfo settingsInfo(SSU_CONFIGURATION); if (settingsInfo.groupId() != SSU_GROUP_ID || !settingsInfo.permission(QFile::WriteGroup)){ QProcess proc; proc.start("/usr/bin/ssuconfperm"); proc.waitForFinished(); } #endif SsuCoreConfig *settings = SsuCoreConfig::instance(); #ifdef TARGET_ARCH if (!settings->contains("arch")) settings->setValue("arch", TARGET_ARCH); #else // FIXME, try to guess a matching architecture #warning "TARGET_ARCH not defined" #endif settings->sync(); manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply *)), SLOT(requestFinished(QNetworkReply *))); }
int SsuRepoManager::remove(QString repo){ SsuCoreConfig *ssuSettings = SsuCoreConfig::instance(); // removing a repo is a noop when device is in update mode... if ((ssuSettings->deviceMode() & Ssu::UpdateMode) == Ssu::UpdateMode) return -1; // ... or AppInstallMode if ((ssuSettings->deviceMode() & Ssu::AppInstallMode) == Ssu::AppInstallMode) return -1; if (ssuSettings->contains("repository-urls/" + repo)) ssuSettings->remove("repository-urls/" + repo); if (ssuSettings->contains("enabled-repos")){ QStringList enabledRepos = ssuSettings->value("enabled-repos").toStringList(); if (enabledRepos.contains(repo)){ enabledRepos.removeAll(repo); enabledRepos.removeDuplicates(); ssuSettings->setValue("enabled-repos", enabledRepos); } } ssuSettings->sync(); return 0; }
bool Ssu::setCredentials(QDomDocument *response){ SsuCoreConfig *settings = SsuCoreConfig::instance(); // generate list with all scopes for generic section, add sections QDomNodeList credentialsList = response->elementsByTagName("credentials"); QStringList credentialScopes; for (int i=0;i<credentialsList.size();i++){ QDomNode node = credentialsList.at(i); QString scope; QDomNamedNodeMap attributes = node.attributes(); if (attributes.contains("scope")){ scope = attributes.namedItem("scope").toAttr().value(); } else { setError(tr("Credentials element does not have scope")); return false; } if (node.hasChildNodes()){ QDomElement username = node.firstChildElement("username"); QDomElement password = node.firstChildElement("password"); if (username.isNull() || password.isNull()){ setError(tr("Username and/or password not set")); return false; } else { settings->beginGroup("credentials-" + scope); settings->setValue("username", username.text()); settings->setValue("password", password.text()); settings->endGroup(); settings->sync(); credentialScopes.append(scope); } } else { setError(""); return false; } } settings->setValue("credentialScopes", credentialScopes); settings->setValue("lastCredentialsUpdate", QDateTime::currentDateTime()); settings->sync(); emit credentialsChanged(); return true; }
int SsuRepoManager::enable(QString repo){ SsuCoreConfig *ssuSettings = SsuCoreConfig::instance(); QStringList disabledRepos; if (ssuSettings->contains("disabled-repos")) disabledRepos = ssuSettings->value("disabled-repos").toStringList(); disabledRepos.removeAll(repo); disabledRepos.removeDuplicates(); ssuSettings->setValue("disabled-repos", disabledRepos); ssuSettings->sync(); return 0; }
void Ssu::updateStoreCredentials(){ QDBusMessage message = QDBusMessage::createMethodCall("com.jolla.jollastore", "/StoreClient", "com.jolla.jollastore", "storeCredentials"); QDBusPendingReply<QString, QString> reply = SsuCoreConfig::userSessionBus().asyncCall(message); reply.waitForFinished(); if (reply.isError()) { setError(QString("Store credentials not received. %1").arg(reply.error().message())); } else { SsuCoreConfig *settings = SsuCoreConfig::instance(); settings->beginGroup("credentials-store"); settings->setValue("username", reply.argumentAt<0>()); settings->setValue("password", reply.argumentAt<1>()); settings->endGroup(); settings->sync(); } }
void SsuCli::optRegister(QStringList opt){ /* * register a new device */ QString username, password; QTextStream qin(stdin); QTextStream qout(stdout); QTextStream qerr(stderr); SsuCoreConfig *ssuSettings = SsuCoreConfig::instance(); struct termios termNew, termOld; qout << "Username: "******"WARNING: Unable to disable echo on your terminal, password will echo!" << endl; qout << "Password: "******"-h") ssuSettings->setValue("repository-url-variables/user", username); QDBusPendingReply<> reply = ssuProxy->registerDevice(username, password); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; qerr << reply.error().message() << endl; ssu.sendRegistration(username, password); } state = Busy; }