@@ -27,7 +27,8 @@ class DesktopServiceHook : public QObject
2727 ~DesktopServiceHook () { QDesktopServices::unsetUrlHandler (QStringLiteral (" oauthtest" )); }
2828};
2929
30- static const QUrl sOAuthTestServer (QStringLiteral(" oauthtest://someserver/owncloud" ));
30+ static const QUrl sOpenIdBaseURL (QStringLiteral(" oauthtest://auth.example.com" ));
31+ static const QUrl sOpenIdAuthURL (QStringLiteral(" oauthtest://auth.example.com/realms/test/protocol/openid-connect/auth" ));
3132
3233
3334class FakePostReply : public QNetworkReply
@@ -115,8 +116,7 @@ class OAuthTestCase : public QObject
115116 CustomState } state = StartState;
116117 Q_ENUM (State);
117118
118- // for oauth2 we use localhost, for oidc we use 127.0.0.1
119- QString localHost = QStringLiteral(" localhost" );
119+ QString localHost = QStringLiteral(" 127.0.0.1" );
120120 bool replyToBrowserOk = false ;
121121 bool gotAuthOk = false ;
122122 virtual bool done () const { return replyToBrowserOk && gotAuthOk; }
@@ -133,16 +133,18 @@ class OAuthTestCase : public QObject
133133 {
134134 fakeAm = new FakeAM ({}, nullptr );
135135 account = Account::create (QUuid::createUuid ());
136- account->setUrl (sOAuthTestServer );
136+ account->setUrl (sOpenIdBaseURL );
137137 // the account seizes ownership over the qnam in account->setCredentials(...) by keeping a shared pointer on it
138138 // therefore, we should never call fakeAm->setThis(...)
139139 account->setCredentials (new FakeCredentials { fakeAm });
140140 fakeAm->setOverride ([this ](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *device) {
141141 if (req.url ().path ().endsWith (QLatin1String (" .well-known/openid-configuration" ))) {
142142 return this ->wellKnownReply (op, req);
143- } else if (req.url ().path ().endsWith (QLatin1String (" status.php" ))) {
143+ }
144+ if (req.url ().path ().endsWith (QLatin1String (" status.php" ))) {
144145 return this ->statusPhpReply (op, req);
145- } else if (req.url ().path ().endsWith (QLatin1String (" ocs/v2.php/cloud/user" )) && req.url ().query () == QLatin1String (" format=json" )) {
146+ }
147+ if (req.url ().path ().endsWith (QLatin1String (" ocs/v2.php/cloud/user" )) && req.url ().query () == QLatin1String (" format=json" )) {
146148 return this ->userInfoReply (op, req);
147149 }
148150 OC_ASSERT (device);
@@ -158,6 +160,13 @@ class OAuthTestCase : public QObject
158160 }
159161
160162 virtual void test ()
163+ {
164+ runTest ();
165+
166+ QTRY_VERIFY (done ());
167+ }
168+
169+ virtual void runTest ()
161170 {
162171 oauth = prepareOauth ();
163172 oauth->startAuthentication ();
@@ -166,15 +175,13 @@ class OAuthTestCase : public QObject
166175 if (spy.wait ()) {
167176 oauth->openBrowser ();
168177 }
169-
170- QTRY_VERIFY (done ());
171178 }
172179
173180 virtual void openBrowserHook (const QUrl &url) {
174181 QCOMPARE (state, StatusPhpState);
175182 state = BrowserOpened;
176- QCOMPARE (url.path (), sOAuthTestServer .path () + QStringLiteral ( " /index.php/apps/oauth2/authorize " ));
177- QVERIFY (url.toString ().startsWith (sOAuthTestServer .toString ()));
183+ QCOMPARE (url.path (), sOpenIdAuthURL .path ());
184+ QVERIFY (url.toString ().startsWith (sOpenIdBaseURL .toString ()));
178185 QUrlQuery query (url);
179186 QCOMPARE (query.queryItemValue (QStringLiteral (" response_type" )), QLatin1String (" code" ));
180187 QCOMPARE (query.queryItemValue (QStringLiteral (" client_id" )), _expectedClientId);
@@ -207,8 +214,7 @@ class OAuthTestCase : public QObject
207214 OC_ASSERT (state == BrowserOpened);
208215 state = TokenAsked;
209216 OC_ASSERT (op == QNetworkAccessManager::PostOperation);
210- OC_ASSERT (req.url ().toString ().startsWith (sOAuthTestServer .toString ()));
211- OC_ASSERT (req.url ().path () == sOAuthTestServer .path () + QStringLiteral (" /index.php/apps/oauth2/api/v1/token" ));
217+
212218 auto payload = std::make_unique<QBuffer>();
213219 payload->setData (tokenReplyPayload ());
214220 return new FakePostReply (op, req, std::move (payload), fakeAm);
@@ -219,8 +225,8 @@ class OAuthTestCase : public QObject
219225 OC_ASSERT (state == StartState);
220226 state = StatusPhpState;
221227 OC_ASSERT (op == QNetworkAccessManager::GetOperation);
222- OC_ASSERT (req.url ().toString ().startsWith (sOAuthTestServer .toString ()));
223- OC_ASSERT (req.url ().path () == sOAuthTestServer .path () + QStringLiteral (" /status.php" ));
228+ OC_ASSERT (req.url ().toString ().startsWith (sOpenIdBaseURL .toString ()));
229+ OC_ASSERT (req.url ().path () == sOpenIdBaseURL .path () + QStringLiteral (" /status.php" ));
224230 auto payload = std::make_unique<QBuffer>();
225231 payload->setData (statusPhpPayload ());
226232 return new FakePostReply (op, req, std::move (payload), fakeAm);
@@ -231,17 +237,22 @@ class OAuthTestCase : public QObject
231237 OC_ASSERT (state == TokenAsked);
232238 state = UserInfoFetched;
233239 OC_ASSERT (op == QNetworkAccessManager::GetOperation);
234- OC_ASSERT (req.url ().toString ().startsWith (sOAuthTestServer .toString ()));
235- OC_ASSERT (req.url ().path () == sOAuthTestServer .path () + QStringLiteral (" /ocs/v2.php/cloud/user" ));
240+ OC_ASSERT (req.url ().toString ().startsWith (sOpenIdBaseURL .toString ()));
241+ OC_ASSERT (req.url ().path () == sOpenIdBaseURL .path () + QStringLiteral (" /ocs/v2.php/cloud/user" ));
236242 OC_ASSERT (req.url ().query () == QStringLiteral (" format=json" ));
237243 auto payload = std::make_unique<QBuffer>();
238244 payload->setData (userInfoPayload ());
239245 return new FakePostReply (op, req, std::move (payload), fakeAm);
240246 }
241247
242- virtual QNetworkReply *wellKnownReply (QNetworkAccessManager::Operation op, const QNetworkRequest &req)
243- {
244- return new FakeErrorReply (op, req, fakeAm, 404 );
248+ virtual QNetworkReply * wellKnownReply (QNetworkAccessManager::Operation op, const QNetworkRequest & req) {
249+ OC_ASSERT (op == QNetworkAccessManager::GetOperation);
250+ QJsonDocument jsondata (QJsonObject{
251+ {QStringLiteral (" authorization_endpoint" ), sOpenIdAuthURL .toString ()},
252+ {QStringLiteral (" token_endpoint" ), QStringLiteral (" oauthtest://openidserver/token_endpoint" )},
253+ {QStringLiteral (" token_endpoint_auth_methods_supported" ), QJsonArray{QStringLiteral (" client_secret_post" )}},
254+ });
255+ return new FakePayloadReply (op, req, jsondata.toJson (), fakeAm);
245256 }
246257
247258 virtual QByteArray tokenReplyPayload () const {
@@ -411,37 +422,58 @@ private Q_SLOTS:
411422 localHost = QStringLiteral (" 127.0.0.1" );
412423 }
413424
414- QNetworkReply * wellKnownReply (QNetworkAccessManager::Operation op, const QNetworkRequest & req) override {
415- OC_ASSERT (op == QNetworkAccessManager::GetOperation);
416- QJsonDocument jsondata (QJsonObject{
417- {QStringLiteral (" authorization_endpoint" ),
418- QJsonValue (QStringLiteral (" oauthtest://openidserver" ) + sOAuthTestServer .path () + QStringLiteral (" /index.php/apps/oauth2/authorize" ))},
419- {QStringLiteral (" token_endpoint" ), QStringLiteral (" oauthtest://openidserver/token_endpoint" )},
420- {QStringLiteral (" token_endpoint_auth_methods_supported" ), QJsonArray{QStringLiteral (" client_secret_post" )}},
421- });
422- return new FakePayloadReply (op, req, jsondata.toJson (), fakeAm);
423- }
424-
425425 void openBrowserHook (const QUrl & url) override {
426- OC_ASSERT (url.host () == QStringLiteral (" openidserver " ));
426+ OC_ASSERT (url.host () == QStringLiteral (" auth.example.com " ));
427427 QUrl url2 = url;
428- url2.setHost (sOAuthTestServer .host ());
428+ url2.setHost (sOpenIdBaseURL .host ());
429429 OAuthTestCase::openBrowserHook (url2);
430430 }
431431
432+ /*
432433 QNetworkReply *tokenReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *device) override
433434 {
434435 OC_ASSERT(browserReply);
435436 OC_ASSERT(request.url().toString().startsWith(QStringLiteral("oauthtest://openidserver/token_endpoint")));
436437 auto req = request;
437438 req.setUrl(QUrl(request.url().toString().replace(QLatin1String("oauthtest://openidserver/token_endpoint"),
438- sOAuthTestServer .toString () + QStringLiteral (" /index.php/apps/oauth2/api/v1/token" ))));
439+ sOpenIdBaseURL .toString() + QStringLiteral("/index.php/apps/oauth2/api/v1/token"))));
439440 return OAuthTestCase::tokenReply(op, req, device);
440- }
441+ }*/
441442 } test;
442443 test.test ();
443444 }
444445
446+ void testWellKnown307 () {
447+ struct Test : OAuthTestCase {
448+ Test ()
449+ {
450+ localHost = QStringLiteral (" 127.0.0.1" );
451+ }
452+
453+ QNetworkReply *wellKnownReply (QNetworkAccessManager::Operation op, const QNetworkRequest &req) override
454+ {
455+ return new FakeErrorReply (op, req, fakeAm, 404 );
456+ }
457+
458+ void oauthResult (OAuth::Result result, const QString &token, const QString &refreshToken) override
459+ {
460+ QCOMPARE (result, OAuth::ErrorIdPUnreachable);
461+ QCOMPARE (state, StatusPhpState);
462+ QCOMPARE (token, QStringLiteral (" " ));
463+ QCOMPARE (refreshToken, QStringLiteral (" " ));
464+ }
465+
466+ void openBrowserHook (const QUrl & url) override {
467+ OC_ASSERT (url.host () == QStringLiteral (" openidserver" ));
468+ QUrl url2 = url;
469+ url2.setHost (sOpenIdBaseURL .host ());
470+ OAuthTestCase::openBrowserHook (url2);
471+ }
472+ } test;
473+ test.runTest ();
474+ QTRY_VERIFY (test.gotAuthOk == false );
475+ QTRY_VERIFY (test.replyToBrowserOk == false );
476+ }
445477
446478 void testTimeout ()
447479 {
0 commit comments