I have made the following changes intended for : CE:MW:Shared / ssu Please review and accept or decline. BOSS has already run some checks on this request. See the "Messages from BOSS" section below.
https://build.pub.meego.com//request/show/7688 Thank You, Pekka Lundstrom [This message was auto-generated] --- Request # 7688: Messages from BOSS: State: review at 2013-01-16T18:13:33 by bossbot Reviews: accepted by bossbot : Prechecks succeeded. new for CE-maintainers : Please replace this text with a review and approve/reject the review (not the SR). BOSS will take care of the rest Changes: submit: home:plundstr:branches:CE:MW:Shared / ssu -> CE:MW:Shared / ssu changes files: -------------- --- ssu.changes +++ ssu.changes @@ -0,0 +1,4 @@ +* Wed Jan 16 2013 Pekka Lundstrom <[email protected]> - 0.18 +- Added domain support for registration +- Added support to remove old values from config by using ssu-defaults.ini + old: ---- ssu-0.17.tar.gz new: ---- ssu-0.18.tar.gz spec files: ----------- --- ssu.spec +++ ssu.spec @@ -1,5 +1,5 @@ Name: ssu -Version: 0.17 +Version: 0.18 Release: 1 Summary: SSU enabler for RND Group: System/Base other changes: -------------- ++++++ ssu-0.17.tar.gz -> ssu-0.18.tar.gz --- libssu/ssu.cpp +++ libssu/ssu.cpp @@ -54,7 +54,17 @@ defaultKeys = defaultSettings.allKeys(); defaultSettings.endGroup(); foreach (const QString &key, defaultKeys){ - if (!settings->contains(key)){ + // Default keys support both commands and new keys + if (key.compare("cmd-remove", Qt::CaseSensitive) == 0){ + // Remove keys listed in value as string list + QStringList oldKeys = defaultSettings.value(currentSection + key).toStringList(); + foreach (const QString &oldKey, oldKeys){ + if (settings->contains(oldKey)){ + settings->remove(oldKey); + qDebug() << "Removing old key:" << oldKey; + } + } + } else if (!settings->contains(key)){ // Add new keys.. settings->setValue(key, defaultSettings.value(currentSection + key)); qDebug() << "Adding new key: " << key; @@ -256,6 +266,13 @@ return "release"; } +QString Ssu::domain(){ + if (settings->contains("domain")) + return settings->value("domain").toString(); + else + return ""; +} + bool Ssu::isRegistered(){ if (!settings->contains("privateKey")) return false; @@ -352,6 +369,19 @@ repoParameters.insert("deviceFamily", deviceFamily()); repoParameters.insert("deviceModel", deviceModel()); + // Domain variables + QString domainSection = domain() + "-domain"; + QStringList sections = repoSettings->childGroups(); + if (sections.contains(domainSection)) + repoSettings->beginGroup(domainSection); + else + repoSettings->beginGroup("default-domain"); + QStringList domainKeys = repoSettings->allKeys(); + foreach (const QString &key, domainKeys){ + repoParameters.insert(key, repoSettings->value(key).toString()); + } + repoSettings->endGroup(); + if (settings->contains("repository-urls/" + repoName)) r = settings->value("repository-urls/" + repoName).toString(); else { @@ -440,10 +470,23 @@ emit done(); } -void Ssu::sendRegistration(QString username, QString password){ +void Ssu::sendRegistration(QString usernameDomain, QString password){ errorFlag = false; QString ssuCaCertificate, ssuRegisterUrl; + QString username, domainName; + + // Username can include also domain, (user@domain), separate those + if (usernameDomain.contains('@')) { + // separate domain/username and set domain + username = usernameDomain.section('@', 0, 0); + domainName = usernameDomain.section('@', 1, 1); + setDomain(domainName); + } else { + // No domain defined + username = usernameDomain; + } + if (!settings->contains("ca-certificate")){ setError("CA certificate for SSU not set (config key 'ca-certificate')"); return; @@ -451,8 +494,11 @@ ssuCaCertificate = settings->value("ca-certificate").toString(); if (!settings->contains("register-url")){ - setError("URL for SSU registration not set (config key 'register-url')"); - return; + ssuRegisterUrl = repoUrl("register-url"); + if (ssuRegisterUrl.isEmpty()){ + setError("URL for SSU registration not set (config key 'register-url')"); + return; + } } else ssuRegisterUrl = settings->value("register-url").toString(); @@ -482,8 +528,13 @@ QUrl form; form.addQueryItem("protocolVersion", SSU_PROTOCOL_VERSION); form.addQueryItem("deviceModel", deviceModel()); + if (!domain().isEmpty()){ + form.addQueryItem("domain", domain()); + } qDebug() << "Sending request to " << request.url(); + qDebug() << form.encodedQueryItems(); + QNetworkReply *reply; pendingRequests++; @@ -494,8 +545,8 @@ if (!homeUrl.isEmpty()){ // clear header, the other request bits are reusable request.setHeader(QNetworkRequest::ContentTypeHeader, 0); - qDebug() << "sending request to " << homeUrl; request.setUrl(homeUrl + "/authorized_keys"); + qDebug() << "sending request to " << request.url(); pendingRequests++; manager->get(request); } @@ -565,6 +616,11 @@ settings->setValue("release", release); } +void Ssu::setDomain(QString domain){ + settings->setValue("domain", domain); + settings->sync(); +} + void Ssu::storeAuthorizedKeys(QByteArray data){ QDir dir; @@ -605,8 +661,11 @@ ssuCaCertificate = settings->value("ca-certificate").toString(); if (!settings->contains("credentials-url")){ - setError("URL for credentials update not set (config key 'credentials-url')"); - return; + ssuCredentialsUrl = repoUrl("credentials-url"); + if (ssuCredentialsUrl.isEmpty()){ + setError("URL for credentials update not set (config key 'credentials-url')"); + return; + } } else ssuCredentialsUrl = settings->value("credentials-url").toString(); @@ -649,9 +708,6 @@ qDebug() << request.url(); request.setSslConfiguration(sslConfiguration); - QUrl form; - form.addQueryItem("protocolVersion", SSU_PROTOCOL_VERSION); - pendingRequests++; manager->get(request); } --- libssu/ssu.h +++ libssu/ssu.h @@ -65,6 +65,11 @@ */ Q_INVOKABLE QString flavour(); /** + * Get the current domain used in registration + * @return domain, or "" if not set + */ + Q_INVOKABLE QString domain(); + /** * Return devices RND registration status * @retval true device is registered * @retval false device is not registered @@ -99,6 +104,10 @@ */ Q_INVOKABLE void setRelease(QString release, bool rnd=false); /** + * Set the domain string (usually something like nemo, jolla, ..) + */ + Q_INVOKABLE void setDomain(QString domain); + /** * Unregister a device. This will clean all registration data from a device, * though will not touch the information on SSU server; the information there * has to be manually cleaned for a device we don't own anymore, but will be --- repos.ini +++ repos.ini @@ -34,26 +34,26 @@ [all] credentials=jolla - +credentials-url=https://%(ssuRegDomain)/%(ssuRegPath)/%1/credentials.xml +register-url=https://%(ssuRegDomain)/%(ssuRegPath)/%1/register.xml [release] -jolla=https://packages.example.com/releases/%(release)/jolla/%(arch)/ -jolla-bad=https://packages.example.com/notused-bad/%(release)/bad/%(arch)/ -mer-core=https://packages.example.com/%(release)/mer/%(arch)/%(debugSplit)/ -adaptation-common-main=https://packages.example.com/releases/%(release)/nemo/adaptation-%(deviceFamily)-common/%(arch)/ -adaptation=https://packages.example.com/releases/%(release)/nemo/adaptation-%(adaptation)/%(arch)/ -nemo=https://packages.example.com/releases/%(release)/nemo/platform/%(arch)/ - +jolla=https://%(packagesDomain)/releases/%(release)/jolla/%(arch)/ +jolla-bad=https://%(packagesDomain)/notused-bad/%(release)/bad/%(arch)/ +mer-core=https://%(packagesDomain)/%(release)/mer/%(arch)/%(debugSplit)/ +adaptation-common-main=https://%(packagesDomain)/releases/%(release)/nemo/adaptation-%(deviceFamily)-common/%(arch)/ +adaptation=https://%(packagesDomain)/releases/%(release)/nemo/adaptation-%(adaptation)/%(arch)/ +nemo=https://%(packagesDomain)/releases/%(release)/nemo/platform/%(arch)/ [rnd] -mer-core=https://packages.example.com/mer/%(release)/builds/%(arch)/%(debugSplit)/ -adaptation-common-main=https://packages.example.com/nemo/%(release)/adaptation-%(adaptation)-common/%(arch)/ -adaptation=https://packages.example.com/nemo/%(release)/adaptation-%(deviceFamily)/%(arch)/ -nemo=https://packages.example.com/nemo/%(release)/platform/%(arch)/ -non-oss-bad=https://dump.example.com/pj:/non-oss-bad%(flavour)/%(release)_%(arch)/ -non-oss=https://dump.example.com/pj:/non-oss%(flavour)/%(release)_%(arch)/ -oss-bad=https://dump.example.com/pj:/oss-bad%(flavour)/%(release)_%(arch)/ -oss=https://dump.example.com/pj:/oss%(flavour)/%(release)_%(arch)/ +mer-core=https://%(packagesDomain)/mer/%(release)/builds/%(arch)/%(debugSplit)/ +adaptation-common-main=https://%(packagesDomain)/nemo/%(release)/adaptation-%(adaptation)-common/%(arch)/ +adaptation=https://%(packagesDomain)/nemo/%(release)/adaptation-%(deviceFamily)/%(arch)/ +nemo=https://%(packagesDomain)/nemo/%(release)/platform/%(arch)/ +non-oss-bad=https://%(dumpDomain)/pj:/non-oss-bad%(flavour)/%(release)_%(arch)/ +non-oss=https://%(dumpDomain)/pj:/non-oss%(flavour)/%(release)_%(arch)/ +oss-bad=https://%(dumpDomain)/pj:/oss-bad%(flavour)/%(release)_%(arch)/ +oss=https://%(dumpDomain)/pj:/oss%(flavour)/%(release)_%(arch)/ [devel-flavour] flavour-pattern= @@ -63,3 +63,16 @@ [testing-flavour] flavour-pattern=:/testing + +[example-domain] +dumpDomain=dump.example.com +packagesDomain=packages.example.com +ssuRegDomain=ssu.example.com +ssuRegPath=ssu/device + +# fallback if domain is not matched or not set +[default-domain] +dumpDomain=dump.testing.com +packagesDomain=packages.testing.com +ssuRegDomain=ssu.testing.com +ssuRegPath=ssu/device --- ssu-defaults.ini +++ ssu-defaults.ini @@ -1,3 +1,12 @@ +# ssu configuration is located in /etc/ssu/ssu.ini +# When ssu is initialized configVersion number in that file is compared +# to configVersion in this file (/usr/share/ssu/ssu-defaults.ini). +# If this file has bigger version then upgrade takes place. +# Starting from next bigger version block new key/value pairs are read and added to +# the config (/etc/ssu/ssu.ini) assuming config doesn't have that key already. +# Old keys can be removed from the config with special key called "cmd-remove" +# Syntax cmd-remove=<old-key1>, <old-key2>, ... + [General] configVersion=2 @@ -8,10 +17,8 @@ release= adaptation= ca-certificate= -credentials-url=https://example.com/ssu/device/%1/credentials.xml -register-url=https://example.com/ssu/device/%1/register.xml credentials-scope=example [2] release=latest -credentials-url-example=https://example.com + --- ssu.ini +++ ssu.ini @@ -6,8 +6,6 @@ release= adaptation= ca-certificate= -credentials-url=https://example.com/ssu/device/%1/credentials.xml -register-url=https://example.com/ssu/device/%1/register.xml credentials-scope=example [repository-urls] --- tests/ut_urlresolver/urlresolvertest.cpp +++ tests/ut_urlresolver/urlresolvertest.cpp @@ -60,6 +60,28 @@ ssu.setRelease("latest", true); } +void UrlResolverTest::checkDomain(){ + QString credentialsUrl; + QString registerUrl; + + // domain not defined -> default + ssu.setDomain(""); + credentialsUrl = ssu.repoUrl("credentials-url"); + QCOMPARE(credentialsUrl, QString("https://ssu.testing.com/ssu/device/%1/credentials.xml")); + + // domain defined but not matching block -> default + ssu.setDomain("nevermind"); + credentialsUrl = ssu.repoUrl("credentials-url"); + QCOMPARE(credentialsUrl, QString("https://ssu.testing.com/ssu/device/%1/credentials.xml")); + + ssu.setDomain("example"); + QCOMPARE(ssu.domain(), QString("example")); + credentialsUrl = ssu.repoUrl("credentials-url"); + QCOMPARE(credentialsUrl, QString("https://ssu.example.com/ssu/device/%1/credentials.xml")); + registerUrl = ssu.repoUrl("register-url"); + QCOMPARE(registerUrl, QString("https://ssu.example.com/ssu/device/%1/register.xml")); + +} void UrlResolverTest::checkCleanUrl(){ QHashIterator<QString, QString> i(rndRepos); while (i.hasNext()){ @@ -101,3 +123,5 @@ QCOMPARE(url, i.value()); } } + + --- tests/ut_urlresolver/urlresolvertest.h +++ tests/ut_urlresolver/urlresolvertest.h @@ -22,6 +22,7 @@ void cleanupTestCase(); void checkFlavour(); void checkRelease(); + void checkDomain(); void checkCleanUrl(); void simpleRepoUrlLookup(); void checkReleaseRepoUrls();
