@@ -99,12 +99,7 @@ class OAuthTestCase : public QObject
9999 QString _expectedClientId = Theme::instance()->oauthClientId ();
100100
101101public:
102- enum State { StartState,
103- StatusPhpState,
104- BrowserOpened,
105- TokenAsked,
106- UserInfoFetched,
107- CustomState } state = StartState;
102+ enum State { StartState, StatusPhpState, BrowserOpened, TokenAsked, CustomState } state = StartState;
108103 Q_ENUM (State);
109104
110105 // for oauth2 we use localhost, for oidc we use 127.0.0.1
@@ -134,8 +129,6 @@ class OAuthTestCase : public QObject
134129 return this ->wellKnownReply (op, req);
135130 } else if (req.url ().path ().endsWith (QLatin1String (" status.php" ))) {
136131 return this ->statusPhpReply (op, req);
137- } else if (req.url ().path ().endsWith (QLatin1String (" ocs/v2.php/cloud/user" )) && req.url ().query () == QLatin1String (" format=json" )) {
138- return this ->userInfoReply (op, req);
139132 } else if (req.url ().path ().endsWith (QLatin1String (" clients-registrations" ))) {
140133 return this ->clientRegistrationReply (op, req);
141134 }
@@ -189,7 +182,7 @@ class OAuthTestCase : public QObject
189182
190183 virtual void browserReplyFinished () {
191184 QCOMPARE (sender (), browserReply.data ());
192- QCOMPARE (state, UserInfoFetched );
185+ QCOMPARE (state, TokenAsked );
193186 browserReply->deleteLater ();
194187 QCOMPARE (QNetworkReply::NoError, browserReply->error ());
195188 QCOMPARE (browserReply->rawHeader (" Location" ), QByteArray (" opencloud://success" ));
@@ -220,19 +213,6 @@ class OAuthTestCase : public QObject
220213 return new FakePostReply (op, req, std::move (payload), fakeAm);
221214 }
222215
223- virtual QNetworkReply *userInfoReply (QNetworkAccessManager::Operation op, const QNetworkRequest &req)
224- {
225- OC_ASSERT (state == TokenAsked);
226- state = UserInfoFetched;
227- OC_ASSERT (op == QNetworkAccessManager::GetOperation);
228- OC_ASSERT (req.url ().toString ().startsWith (sOAuthTestServer .toString ()));
229- OC_ASSERT (req.url ().path () == sOAuthTestServer .path () + QStringLiteral (" /ocs/v2.php/cloud/user" ));
230- OC_ASSERT (req.url ().query () == QStringLiteral (" format=json" ));
231- auto payload = std::make_unique<QBuffer>();
232- payload->setData (userInfoPayload ());
233- return new FakePostReply (op, req, std::move (payload), fakeAm);
234- }
235-
236216 virtual QNetworkReply *wellKnownReply (QNetworkAccessManager::Operation op, const QNetworkRequest &req)
237217 {
238218 return new FakeErrorReply (op, req, fakeAm, 404 );
@@ -246,7 +226,7 @@ class OAuthTestCase : public QObject
246226 virtual QByteArray tokenReplyPayload () const {
247227 // the dummy server provides the user admin
248228 QJsonDocument jsondata (QJsonObject{{QStringLiteral (" access_token" ), QStringLiteral (" 123" )}, {QStringLiteral (" refresh_token" ), QStringLiteral (" 456" )},
249- {QStringLiteral (" message_url" ), QStringLiteral (" opencloud://success" )}, {QStringLiteral (" user_id " ), QStringLiteral ( " admin " )},
229+ {QStringLiteral (" message_url" ), QStringLiteral (" opencloud://success" )}, {QStringLiteral (" id_token " ), idToken ( )},
250230 {QStringLiteral (" token_type" ), QStringLiteral (" Bearer" )}});
251231 return jsondata.toJson ();
252232 }
@@ -260,25 +240,49 @@ class OAuthTestCase : public QObject
260240 return jsondata.toJson ();
261241 }
262242
263- virtual QByteArray userInfoPayload () const
243+ virtual QString idToken () const
264244 {
265- // the dummy server provides the user admin
266- // we don't provide "meta" at the moment, since it is not used
267- QJsonDocument jsonData (QJsonObject{{QStringLiteral (" ocs" ),
268- QJsonObject{{QStringLiteral (" data" ),
269- QJsonObject{
270- {QStringLiteral (" display-name" ), QStringLiteral (" Admin" )},
271- {QStringLiteral (" id" ), QStringLiteral (" admin" )},
272- {QStringLiteral (" email" ), QStringLiteral (" admin@admin.admin" )},
273-
274- }}}}});
275- return jsonData.toJson ();
245+ /* https://10015.io/tools/jwt-encoder-decoder with sample key
246+ {
247+ "amr": [
248+ "pwd",
249+ "pop",
250+ "hwk",
251+ "user",
252+ "pin",
253+ "mfa"
254+ ],
255+ "at_hash": "jEL4ptHeYx4eQa847tOVoQ",
256+ "aud": [
257+ "OpenCloudDesktop"
258+ ],
259+ "auth_time": 1737560752,
260+ "azp": "OpenCloudDesktop",
261+ "client_id": "OpenCloudDesktop",
262+ "email": "admin@admin.admin",
263+ "email_verified": true,
264+ "exp": 1739884152,
265+ "iat": 1739880552,
266+ "iss": "oauthtest://someserver/opencloud",
267+ "jti": "e2db5f2d-6bcc-42d7-a20f-46955d7ab6b4",
268+ "name": "Admin",
269+ "preferred_username": "admin",
270+ "sub": "f4a04b62-e17a-4a98-bcc6-63345ded5a25"
271+ }
272+ */
273+ return QStringLiteral (
274+ " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9."
275+ " eyJhbXIiOlsicHdkIiwicG9wIiwiaHdrIiwidXNlciIsInBpbiIsIm1mYSJdLCJhdF9oYXNoIjoiakVMNHB0SGVZeDRlUWE4NDd0T1ZvUSIsImF1ZCI6WyJPcGVuQ2xvdWREZXNrdG9wIl0sIm"
276+ " F1dGhfdGltZSI6MTczNzU2MDc1MiwiYXpwIjoiT3BlbkNsb3VkRGVza3RvcCIsImNsaWVudF9pZCI6Ik9wZW5DbG91ZERlc2t0b3AiLCJlbWFpbCI6ImFkbWluQGFkbWluLmFkbWluIiwiZW1h"
277+ " aWxfdmVyaWZpZWQiOnRydWUsImV4cCI6MTczOTg4NDE1MiwiaWF0IjoxNzM5ODgwNTUyLCJpc3MiOiJvYXV0aHRlc3Q6Ly9zb21lc2VydmVyL29wZW5jbG91ZCIsImp0aSI6ImUyZGI1ZjJkLT"
278+ " ZiY2MtNDJkNy1hMjBmLTQ2OTU1ZDdhYjZiNCIsIm5hbWUiOiJBZG1pbiIsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwic3ViIjoiZjRhMDRiNjItZTE3YS00YTk4LWJjYzYtNjMzNDVk"
279+ " ZWQ1YTI1In0.wj3NyKWaDhWWwui6lxGdmJEGUyqCsNYCRJFTbgIUeC4" );
276280 }
277281
278282 virtual void oauthResult (OAuth::Result result, const QString &token, const QString &refreshToken)
279283 {
280284 QCOMPARE (result, OAuth::LoggedIn);
281- QCOMPARE (state, UserInfoFetched );
285+ QCOMPARE (state, TokenAsked );
282286 QCOMPARE (token, QStringLiteral (" 123" ));
283287 QCOMPARE (refreshToken, QStringLiteral (" 456" ));
284288 gotAuthOk = true ;
@@ -638,6 +642,18 @@ private Q_SLOTS:
638642 return out;
639643 }
640644
645+ QString idToken () const override
646+ {
647+ // same as the parent implementation but with the current client id
648+ return QStringLiteral (
649+ " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9."
650+ " eyJhbXIiOlsicHdkIiwicG9wIiwiaHdrIiwidXNlciIsInBpbiIsIm1mYSJdLCJhdF9oYXNoIjoiakVMNHB0SGVZeDRlUWE4NDd0T1ZvUSIsImF1ZCI6WyIzZTRlYTBmMy01OWVhLT"
651+ " QzNGEtOTJmMi1iMGQzYjU0NDQzZTkiXSwiYXV0aF90aW1lIjoxNzM3NTYwNzUyLCJhenAiOiJPcGVuQ2xvdWREZXNrdG9wIiwiY2xpZW50X2lkIjoiT3BlbkNsb3VkRGVza3RvcCIs"
652+ " ImVtYWlsIjoiYWRtaW5AYWRtaW4uYWRtaW4iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzM5ODg0MTUyLCJpYXQiOjE3Mzk4ODA1NTIsImlzcyI6Im9hdXRodGVzdDovL3"
653+ " NvbWVzZXJ2ZXIvb3BlbmNsb3VkIiwianRpIjoiZTJkYjVmMmQtNmJjYy00MmQ3LWEyMGYtNDY5NTVkN2FiNmI0IiwibmFtZSI6IkFkbWluIiwicHJlZmVycmVkX3VzZXJuYW1lIjoi"
654+ " YWRtaW4iLCJzdWIiOiJmNGEwNGI2Mi1lMTdhLTRhOTgtYmNjNi02MzM0NWRlZDVhMjUifQ.UVjqXnuHFiu2iIPOW8qXze_a8tVMk03kuxoN4FKxhoY" );
655+ }
656+
641657 } test;
642658 test.test ();
643659 }
0 commit comments