@atproto/pds 0.4.218 → 0.4.220
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/account-manager/account-manager.d.ts +17 -0
- package/dist/account-manager/account-manager.d.ts.map +1 -1
- package/dist/account-manager/account-manager.js +27 -3
- package/dist/account-manager/account-manager.js.map +1 -1
- package/dist/account-manager/oauth-store.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.js +9 -1
- package/dist/account-manager/oauth-store.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +7 -3
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +4 -0
- package/dist/config/env.js.map +1 -1
- package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts +14 -0
- package/dist/lexicons/chat/bsky/actor/declaration.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/actor/declaration.defs.js +1 -0
- package/dist/lexicons/chat/bsky/actor/declaration.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/actor/defs.defs.d.ts +35 -0
- package/dist/lexicons/chat/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/actor/defs.defs.js +17 -1
- package/dist/lexicons/chat/bsky/actor/defs.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/authFullChatClient.defs.js +1 -1
- package/dist/lexicons/chat/bsky/authFullChatClient.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/acceptConvo.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/addReaction.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/addReaction.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/addReaction.defs.js +7 -1
- package/dist/lexicons/chat/bsky/convo/addReaction.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts +430 -3
- package/dist/lexicons/chat/bsky/convo/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/defs.defs.js +234 -2
- package/dist/lexicons/chat/bsky/convo/defs.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/deleteMessageForSelf.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvo.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/getConvo.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvo.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/getConvo.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.js +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvoAvailability.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js +8 -1
- package/dist/lexicons/chat/bsky/convo/getConvoForMembers.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts +2 -2
- package/dist/lexicons/chat/bsky/convo/getLog.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getLog.defs.js +17 -0
- package/dist/lexicons/chat/bsky/convo/getLog.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getMessages.defs.d.ts +4 -3
- package/dist/lexicons/chat/bsky/convo/getMessages.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/getMessages.defs.js +3 -1
- package/dist/lexicons/chat/bsky/convo/getMessages.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/leaveConvo.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.d.ts +3 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.d.ts +25 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.js +58 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.js +45 -0
- package/dist/lexicons/chat/bsky/convo/listConvoRequests.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/listConvos.defs.d.ts +7 -0
- package/dist/lexicons/chat/bsky/convo/listConvos.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/listConvos.defs.js +2 -0
- package/dist/lexicons/chat/bsky/convo/listConvos.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/lockConvo.d.ts +3 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.defs.d.ts +22 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.defs.js +50 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.js +45 -0
- package/dist/lexicons/chat/bsky/convo/lockConvo.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/muteConvo.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/muteConvo.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/muteConvo.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/muteConvo.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/removeReaction.defs.d.ts +1 -1
- package/dist/lexicons/chat/bsky/convo/removeReaction.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/removeReaction.defs.js +6 -1
- package/dist/lexicons/chat/bsky/convo/removeReaction.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/sendMessage.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/sendMessageBatch.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/unlockConvo.d.ts +3 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts +22 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js +50 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.js +45 -0
- package/dist/lexicons/chat/bsky/convo/unlockConvo.js.map +1 -0
- package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/unmuteConvo.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.d.ts +1 -0
- package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.js +1 -0
- package/dist/lexicons/chat/bsky/convo/updateAllRead.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo/updateRead.defs.d.ts +2 -1
- package/dist/lexicons/chat/bsky/convo/updateRead.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo/updateRead.defs.js +2 -1
- package/dist/lexicons/chat/bsky/convo/updateRead.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/convo.d.ts +3 -0
- package/dist/lexicons/chat/bsky/convo.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/convo.js +4 -1
- package/dist/lexicons/chat/bsky/convo.js.map +1 -1
- package/dist/lexicons/chat/bsky/group/addMembers.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/addMembers.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts +28 -0
- package/dist/lexicons/chat/bsky/group/addMembers.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/addMembers.defs.js +63 -0
- package/dist/lexicons/chat/bsky/group/addMembers.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/addMembers.js +45 -0
- package/dist/lexicons/chat/bsky/group/addMembers.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.d.ts +28 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.js +50 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.js +45 -0
- package/dist/lexicons/chat/bsky/group/approveJoinRequest.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/createGroup.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/createGroup.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts +36 -0
- package/dist/lexicons/chat/bsky/group/createGroup.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/createGroup.defs.js +59 -0
- package/dist/lexicons/chat/bsky/group/createGroup.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/createGroup.js +45 -0
- package/dist/lexicons/chat/bsky/group/createGroup.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.defs.d.ts +26 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.defs.js +54 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.js +45 -0
- package/dist/lexicons/chat/bsky/group/createJoinLink.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/defs.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/defs.defs.d.ts +47 -0
- package/dist/lexicons/chat/bsky/group/defs.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/defs.defs.js +69 -0
- package/dist/lexicons/chat/bsky/group/defs.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/defs.js +45 -0
- package/dist/lexicons/chat/bsky/group/defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.d.ts +22 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.js +50 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.js +45 -0
- package/dist/lexicons/chat/bsky/group/disableJoinLink.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/editGroup.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/editGroup.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts +32 -0
- package/dist/lexicons/chat/bsky/group/editGroup.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/editGroup.defs.js +53 -0
- package/dist/lexicons/chat/bsky/group/editGroup.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/editGroup.js +45 -0
- package/dist/lexicons/chat/bsky/group/editGroup.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.defs.d.ts +26 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.defs.js +54 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.js +45 -0
- package/dist/lexicons/chat/bsky/group/editJoinLink.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.d.ts +22 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.js +50 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.js +45 -0
- package/dist/lexicons/chat/bsky/group/enableJoinLink.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.d.ts +20 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.js +50 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.js +45 -0
- package/dist/lexicons/chat/bsky/group/getGroupPublicInfo.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.d.ts +26 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.js +55 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.js +45 -0
- package/dist/lexicons/chat/bsky/group/listJoinRequests.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.d.ts +23 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.js +14 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.js +45 -0
- package/dist/lexicons/chat/bsky/group/rejectJoinRequest.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.defs.d.ts +28 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.defs.js +53 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.js +45 -0
- package/dist/lexicons/chat/bsky/group/removeMembers.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.d.ts +3 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.defs.d.ts +28 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.defs.js +58 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.js +45 -0
- package/dist/lexicons/chat/bsky/group/requestJoin.js.map +1 -0
- package/dist/lexicons/chat/bsky/group.d.ts +15 -0
- package/dist/lexicons/chat/bsky/group.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/group.js +54 -0
- package/dist/lexicons/chat/bsky/group.js.map +1 -0
- package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.d.ts +2 -2
- package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.js +1 -0
- package/dist/lexicons/chat/bsky/moderation/getMessageContext.defs.js.map +1 -1
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.d.ts +3 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts +32 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.d.ts.map +1 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js +23 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.defs.js.map +1 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.js +45 -0
- package/dist/lexicons/chat/bsky/moderation/subscribeModEvents.js.map +1 -0
- package/dist/lexicons/chat/bsky/moderation.d.ts +1 -0
- package/dist/lexicons/chat/bsky/moderation.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky/moderation.js +2 -1
- package/dist/lexicons/chat/bsky/moderation.js.map +1 -1
- package/dist/lexicons/chat/bsky.d.ts +1 -0
- package/dist/lexicons/chat/bsky.d.ts.map +1 -1
- package/dist/lexicons/chat/bsky.js +2 -1
- package/dist/lexicons/chat/bsky.js.map +1 -1
- package/dist/pipethrough.d.ts.map +1 -1
- package/dist/pipethrough.js +11 -7
- package/dist/pipethrough.js.map +1 -1
- package/package.json +15 -15
- package/src/account-manager/account-manager.ts +23 -2
- package/src/account-manager/oauth-store.ts +10 -2
- package/src/config/config.ts +13 -3
- package/src/config/env.ts +4 -0
- package/src/pipethrough.ts +15 -5
- package/tests/_oauth_client_assets_middleware.ts +23 -0
- package/tests/_puppeteer.ts +71 -17
- package/tests/auth.test.ts +89 -0
- package/tests/oauth.test.ts +52 -115
- package/tsconfig.build.tsbuildinfo +1 -1
package/src/pipethrough.ts
CHANGED
|
@@ -91,7 +91,7 @@ export const proxyHandler = (ctx: AppContext): CatchallHandler => {
|
|
|
91
91
|
headers,
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
await pipethroughStream(ctx, dispatchOptions, (upstream) => {
|
|
94
|
+
await pipethroughStream(ctx, req, dispatchOptions, (upstream) => {
|
|
95
95
|
res.status(upstream.statusCode)
|
|
96
96
|
|
|
97
97
|
for (const [name, val] of responseHeaders(upstream.headers)) {
|
|
@@ -188,7 +188,7 @@ export async function pipethrough(
|
|
|
188
188
|
highWaterMark: 2 * 65536, // twice the default (64KiB)
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
const { headers, body } = await pipethroughRequest(ctx, dispatchOptions)
|
|
191
|
+
const { headers, body } = await pipethroughRequest(ctx, req, dispatchOptions)
|
|
192
192
|
|
|
193
193
|
return {
|
|
194
194
|
encoding: safeString(headers['content-type']) ?? 'application/json',
|
|
@@ -291,6 +291,7 @@ export const parseProxyHeader = async (
|
|
|
291
291
|
*/
|
|
292
292
|
async function pipethroughStream(
|
|
293
293
|
ctx: AppContext,
|
|
294
|
+
req: Request,
|
|
294
295
|
dispatchOptions: Dispatcher.RequestOptions,
|
|
295
296
|
successStreamFactory: Dispatcher.StreamFactory,
|
|
296
297
|
): Promise<void> {
|
|
@@ -327,7 +328,7 @@ async function pipethroughStream(
|
|
|
327
328
|
// or writable stream errors. In the latter case, the promise will already
|
|
328
329
|
// be resolved, and reject()ing it there after will have no effect. Those
|
|
329
330
|
// error would still be logged by the successStreamFactory() function.
|
|
330
|
-
.catch(handleUpstreamRequestError)
|
|
331
|
+
.catch(handleUpstreamRequestError.bind(req))
|
|
331
332
|
.catch(reject)
|
|
332
333
|
})
|
|
333
334
|
}
|
|
@@ -338,6 +339,7 @@ async function pipethroughStream(
|
|
|
338
339
|
*/
|
|
339
340
|
async function pipethroughRequest(
|
|
340
341
|
ctx: AppContext,
|
|
342
|
+
req: Request,
|
|
341
343
|
dispatchOptions: Dispatcher.RequestOptions,
|
|
342
344
|
) {
|
|
343
345
|
// HandlerPipeThroughStream requires a readable stream to be returned, so we
|
|
@@ -345,7 +347,7 @@ async function pipethroughRequest(
|
|
|
345
347
|
|
|
346
348
|
const upstream = await ctx.proxyAgent
|
|
347
349
|
.request(dispatchOptions)
|
|
348
|
-
.catch(handleUpstreamRequestError)
|
|
350
|
+
.catch(handleUpstreamRequestError.bind(req))
|
|
349
351
|
|
|
350
352
|
if (upstream.statusCode >= 400) {
|
|
351
353
|
const parsed = await tryParsingError(upstream.headers, upstream.body)
|
|
@@ -359,15 +361,23 @@ async function pipethroughRequest(
|
|
|
359
361
|
}
|
|
360
362
|
|
|
361
363
|
function handleUpstreamRequestError(
|
|
364
|
+
this: Request,
|
|
362
365
|
err: unknown,
|
|
363
366
|
message = 'Upstream service unreachable',
|
|
364
367
|
): never {
|
|
365
|
-
|
|
368
|
+
const logger = isPinoHttpRequest(this) ? this.log : httpLogger
|
|
369
|
+
logger.error({ err }, message)
|
|
366
370
|
throw new XRPCServerError(ResponseType.UpstreamFailure, message, undefined, {
|
|
367
371
|
cause: err,
|
|
368
372
|
})
|
|
369
373
|
}
|
|
370
374
|
|
|
375
|
+
function isPinoHttpRequest(req: Request): req is Request & {
|
|
376
|
+
log: { error: (obj: unknown, msg: string) => void }
|
|
377
|
+
} {
|
|
378
|
+
return typeof (req as { log?: any }).log?.error === 'function'
|
|
379
|
+
}
|
|
380
|
+
|
|
371
381
|
// Request parsing/forwarding
|
|
372
382
|
// -------------------
|
|
373
383
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IncomingMessage, ServerResponse } from 'node:http'
|
|
2
|
+
import files from '@atproto/oauth-client-browser-example' with { type: 'json' }
|
|
3
|
+
|
|
4
|
+
export function oauthClientAssetsMiddleware(
|
|
5
|
+
req: IncomingMessage,
|
|
6
|
+
res: ServerResponse,
|
|
7
|
+
next?: (err?: unknown) => void,
|
|
8
|
+
): void {
|
|
9
|
+
const path = req.url?.split('?')[0].slice(1) || 'index.html'
|
|
10
|
+
const file = Object.hasOwn(files, path) ? files[path] : null
|
|
11
|
+
|
|
12
|
+
if (file) {
|
|
13
|
+
res
|
|
14
|
+
.writeHead(200, 'OK', { 'content-type': file.mime })
|
|
15
|
+
.end(Buffer.from(file.data, 'base64'))
|
|
16
|
+
} else if (next) {
|
|
17
|
+
next()
|
|
18
|
+
} else {
|
|
19
|
+
res
|
|
20
|
+
.writeHead(404, 'Not Found', { 'content-type': 'text/plain' })
|
|
21
|
+
.end('Page not found')
|
|
22
|
+
}
|
|
23
|
+
}
|
package/tests/_puppeteer.ts
CHANGED
|
@@ -1,27 +1,71 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
-
import { type Browser, type Page } from 'puppeteer'
|
|
2
|
+
import { type Browser, Handler, type Page, Target, TargetType } from 'puppeteer'
|
|
3
3
|
|
|
4
4
|
export class PageHelper implements AsyncDisposable {
|
|
5
5
|
constructor(protected readonly page: Page) {}
|
|
6
6
|
|
|
7
|
-
async goto(url: string) {
|
|
8
|
-
await this.page.goto(url)
|
|
7
|
+
async goto(url: string | URL) {
|
|
8
|
+
await this.page.goto(url.toString())
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
isClosed() {
|
|
12
|
+
return this.page.isClosed()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async title() {
|
|
16
|
+
await this.waitForNetworkIdle()
|
|
17
|
+
return this.page.title()
|
|
9
18
|
}
|
|
10
19
|
|
|
11
20
|
async waitForNetworkIdle() {
|
|
12
21
|
await this.page.waitForNetworkIdle()
|
|
13
22
|
}
|
|
14
23
|
|
|
15
|
-
async
|
|
16
|
-
const
|
|
24
|
+
async waitForPopup(run: () => Promise<unknown>): Promise<PageHelper> {
|
|
25
|
+
const browser = this.page.browser()
|
|
26
|
+
const popupPromise = new Promise<Page | null>((resolve, reject) => {
|
|
27
|
+
const cleanup = () => {
|
|
28
|
+
clearTimeout(timeout)
|
|
29
|
+
browser.off('targetcreated', targetcreated)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const timeout = setTimeout(() => {
|
|
33
|
+
cleanup()
|
|
34
|
+
reject(new Error('Timeout waiting for popup'))
|
|
35
|
+
}, 5_000)
|
|
36
|
+
|
|
37
|
+
const targetcreated: Handler<Target> = async (target) => {
|
|
38
|
+
switch (target.type()) {
|
|
39
|
+
case TargetType.BACKGROUND_PAGE:
|
|
40
|
+
case TargetType.PAGE: {
|
|
41
|
+
cleanup()
|
|
42
|
+
resolve(target.page())
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
browser.once('targetcreated', targetcreated)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
await run()
|
|
51
|
+
const popup = await popupPromise
|
|
52
|
+
assert(popup, 'Popup page not found')
|
|
53
|
+
|
|
54
|
+
return new PageHelper(popup)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async navigationAction(run: () => unknown | Promise<unknown>): Promise<void> {
|
|
58
|
+
const promise = this.page.waitForNavigation({ timeout: 10_000 })
|
|
17
59
|
await run()
|
|
18
60
|
await promise
|
|
19
|
-
await this.waitForNetworkIdle()
|
|
20
61
|
}
|
|
21
62
|
|
|
22
|
-
async
|
|
23
|
-
|
|
24
|
-
|
|
63
|
+
async navigationClick(text: string, tag = 'button') {
|
|
64
|
+
return this.navigationAction(() => this.clickOnText(text, tag))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async assertTitle(expected: string) {
|
|
68
|
+
await expect(this.title()).resolves.toBe(expected)
|
|
25
69
|
}
|
|
26
70
|
|
|
27
71
|
async clickOn(selector: string) {
|
|
@@ -30,8 +74,12 @@ export class PageHelper implements AsyncDisposable {
|
|
|
30
74
|
return elementHandle
|
|
31
75
|
}
|
|
32
76
|
|
|
33
|
-
async
|
|
34
|
-
return this.clickOn(
|
|
77
|
+
async clickOnText(text: string, tag = 'button') {
|
|
78
|
+
return this.clickOn(`${tag}::-p-text(${JSON.stringify(text)})`)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async clickOnAriaLabel(label: string, tag = 'button') {
|
|
82
|
+
return this.clickOn(`${tag}[aria-label=${JSON.stringify(label)}]`)
|
|
35
83
|
}
|
|
36
84
|
|
|
37
85
|
async typeIn(selector: string, text: string) {
|
|
@@ -46,16 +94,22 @@ export class PageHelper implements AsyncDisposable {
|
|
|
46
94
|
}
|
|
47
95
|
|
|
48
96
|
async ensureTextVisibility(text: string, tag = 'p') {
|
|
49
|
-
await this.page.waitForSelector(
|
|
97
|
+
await this.page.waitForSelector(
|
|
98
|
+
`${tag}::-p-text(${JSON.stringify(text)})`,
|
|
99
|
+
{
|
|
100
|
+
visible: true,
|
|
101
|
+
timeout: 5_000,
|
|
102
|
+
},
|
|
103
|
+
)
|
|
50
104
|
}
|
|
51
105
|
|
|
52
106
|
protected async getVisibleElement(selector: string) {
|
|
53
|
-
const elementHandle = await this.page.waitForSelector(selector
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
107
|
+
const elementHandle = await this.page.waitForSelector(selector, {
|
|
108
|
+
visible: true,
|
|
109
|
+
timeout: 5_000,
|
|
110
|
+
})
|
|
57
111
|
|
|
58
|
-
|
|
112
|
+
assert(elementHandle, `Element not found: ${selector}`)
|
|
59
113
|
|
|
60
114
|
return elementHandle
|
|
61
115
|
}
|
package/tests/auth.test.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as jose from 'jose'
|
|
2
|
+
import { request as undiciRequest } from 'undici'
|
|
2
3
|
import { AtpAgent } from '@atproto/api'
|
|
3
4
|
import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env'
|
|
4
5
|
import { createRefreshToken } from '../src/account-manager/helpers/auth'
|
|
@@ -121,6 +122,94 @@ describe('auth', () => {
|
|
|
121
122
|
)
|
|
122
123
|
})
|
|
123
124
|
|
|
125
|
+
it('returns identical error responses for unknown identifier and known-identifier-with-wrong-password.', async () => {
|
|
126
|
+
const probe = async (info: { identifier: string; password: string }) => {
|
|
127
|
+
const res = await fetch(
|
|
128
|
+
`${network.pds.url}/xrpc/com.atproto.server.createSession`,
|
|
129
|
+
{
|
|
130
|
+
method: 'POST',
|
|
131
|
+
headers: { 'content-type': 'application/json' },
|
|
132
|
+
body: JSON.stringify(info),
|
|
133
|
+
},
|
|
134
|
+
)
|
|
135
|
+
return { status: res.status, body: await res.json() }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// bob.test was created above with password 'password'.
|
|
139
|
+
const unknownIdentifier = await probe({
|
|
140
|
+
identifier: 'no-such-user.test',
|
|
141
|
+
password: 'any-password',
|
|
142
|
+
})
|
|
143
|
+
const knownIdentifierWrongPassword = await probe({
|
|
144
|
+
identifier: 'bob.test',
|
|
145
|
+
password: 'wrong-password',
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
expect(knownIdentifierWrongPassword).toEqual(unknownIdentifier)
|
|
149
|
+
expect(unknownIdentifier).toEqual({
|
|
150
|
+
status: 401,
|
|
151
|
+
body: {
|
|
152
|
+
error: 'AuthenticationRequired',
|
|
153
|
+
message: 'Invalid identifier or password',
|
|
154
|
+
},
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('returns identical error responses for unknown identifier and known-identifier-with-wrong-password in the OAuth sign-in flow.', async () => {
|
|
159
|
+
const issuer = new URL(network.pds.url)
|
|
160
|
+
const csrfToken = 'a'.repeat(24)
|
|
161
|
+
const probe = async (credentials: {
|
|
162
|
+
username: string
|
|
163
|
+
password: string
|
|
164
|
+
}) => {
|
|
165
|
+
// @NOTE We use undici's low-level `request` rather than fetch(),
|
|
166
|
+
// because the WHATWG fetch API treats `sec-fetch-*` as forbidden
|
|
167
|
+
// request headers and silently overwrites them with its own values
|
|
168
|
+
// (notably `sec-fetch-mode: cors` in Node). The endpoint requires
|
|
169
|
+
// `same-origin` here, so we need raw header control.
|
|
170
|
+
const res = await undiciRequest(
|
|
171
|
+
`${issuer.origin}/@atproto/oauth-provider/~api/sign-in`,
|
|
172
|
+
{
|
|
173
|
+
method: 'POST',
|
|
174
|
+
headers: {
|
|
175
|
+
'content-type': 'application/json',
|
|
176
|
+
// The endpoint restricts fetches to same-origin navigations
|
|
177
|
+
// from either `/oauth/authorize` or `/account[/*]`. Use the
|
|
178
|
+
// first-party `/account` path so we don't need a live OAuth
|
|
179
|
+
// authorization request to exist in the request store.
|
|
180
|
+
'sec-fetch-mode': 'same-origin',
|
|
181
|
+
'sec-fetch-site': 'same-origin',
|
|
182
|
+
origin: issuer.origin,
|
|
183
|
+
referer: `${issuer.origin}/account`,
|
|
184
|
+
'x-csrf-token': csrfToken,
|
|
185
|
+
cookie: `csrf-token=${csrfToken}`,
|
|
186
|
+
},
|
|
187
|
+
body: JSON.stringify({ locale: 'en', ...credentials }),
|
|
188
|
+
},
|
|
189
|
+
)
|
|
190
|
+
return { status: res.statusCode, body: await res.body.json() }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// bob.test was created above with password 'password'.
|
|
194
|
+
const unknownIdentifier = await probe({
|
|
195
|
+
username: 'no-such-user.test',
|
|
196
|
+
password: 'any-password',
|
|
197
|
+
})
|
|
198
|
+
const knownIdentifierWrongPassword = await probe({
|
|
199
|
+
username: 'bob.test',
|
|
200
|
+
password: 'wrong-password',
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
expect(knownIdentifierWrongPassword).toEqual(unknownIdentifier)
|
|
204
|
+
expect(unknownIdentifier).toEqual({
|
|
205
|
+
status: 400,
|
|
206
|
+
body: {
|
|
207
|
+
error: 'invalid_request',
|
|
208
|
+
error_description: 'Invalid identifier or password',
|
|
209
|
+
},
|
|
210
|
+
})
|
|
211
|
+
})
|
|
212
|
+
|
|
124
213
|
it('provides valid access and refresh token on session refresh.', async () => {
|
|
125
214
|
const email = 'carol@test.com'
|
|
126
215
|
const account = await createAccount({
|
package/tests/oauth.test.ts
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import { once } from 'node:events'
|
|
2
|
-
import {
|
|
3
|
-
IncomingMessage,
|
|
4
|
-
Server,
|
|
5
|
-
ServerResponse,
|
|
6
|
-
createServer,
|
|
7
|
-
} from 'node:http'
|
|
2
|
+
import { Server, createServer } from 'node:http'
|
|
8
3
|
import { AddressInfo } from 'node:net'
|
|
9
4
|
import { type Browser, launch } from 'puppeteer'
|
|
10
5
|
import { TestNetworkNoAppView } from '@atproto/dev-env'
|
|
11
|
-
import
|
|
6
|
+
import { oauthClientAssetsMiddleware } from './_oauth_client_assets_middleware.js'
|
|
12
7
|
import { PageHelper } from './_puppeteer.js'
|
|
13
8
|
|
|
14
9
|
describe('oauth', () => {
|
|
@@ -44,7 +39,7 @@ describe('oauth', () => {
|
|
|
44
39
|
password: 'alice-pass',
|
|
45
40
|
})
|
|
46
41
|
|
|
47
|
-
server = createServer(
|
|
42
|
+
server = createServer(oauthClientAssetsMiddleware)
|
|
48
43
|
server.listen(0)
|
|
49
44
|
await once(server, 'listening')
|
|
50
45
|
|
|
@@ -67,26 +62,24 @@ describe('oauth', () => {
|
|
|
67
62
|
|
|
68
63
|
// This uses prompt=create under the hood:
|
|
69
64
|
it('Allows to sign-up through OAuth', async () => {
|
|
70
|
-
|
|
65
|
+
await using page = await PageHelper.from(browser, { languages })
|
|
71
66
|
|
|
72
67
|
await page.goto(appUrl)
|
|
73
68
|
|
|
74
|
-
await page.
|
|
69
|
+
await page.assertTitle('OAuth Client Example')
|
|
75
70
|
|
|
76
|
-
await page.
|
|
77
|
-
await page.clickOnButton(`Sign up with ${new URL(network.pds.url).host}`)
|
|
78
|
-
})
|
|
71
|
+
await page.navigationClick(`Sign up with ${new URL(network.pds.url).host}`)
|
|
79
72
|
|
|
80
|
-
await page.
|
|
73
|
+
await page.assertTitle("S'inscrire")
|
|
81
74
|
|
|
82
75
|
await page.typeInInput('handle', 'bob')
|
|
83
76
|
|
|
84
|
-
await page.
|
|
77
|
+
await page.clickOnText('Suivant')
|
|
85
78
|
|
|
86
79
|
await page.typeInInput('email', 'bob@test.com')
|
|
87
80
|
await page.typeInInput('password', 'bob-pass')
|
|
88
81
|
|
|
89
|
-
await page.
|
|
82
|
+
await page.clickOnText("S'inscrire")
|
|
90
83
|
|
|
91
84
|
await page.ensureTextVisibility(
|
|
92
85
|
`L'application demande un contrôle total sur votre identité, ce qui signifie qu'elle pourrait casser de façon permanente, ou même usurper, votre compte. N'authorisez l'accès qu'aux applications auxquelles vous faites vraiment confiance.`,
|
|
@@ -96,54 +89,38 @@ describe('oauth', () => {
|
|
|
96
89
|
// the client to resolve the account's did
|
|
97
90
|
await network.processAll()
|
|
98
91
|
|
|
99
|
-
await page.
|
|
100
|
-
await page.clickOnButton("Authoriser l'accès")
|
|
101
|
-
})
|
|
92
|
+
await page.navigationClick('Autoriser')
|
|
102
93
|
|
|
103
|
-
await page.
|
|
94
|
+
await page.assertTitle('OAuth Client Example')
|
|
104
95
|
|
|
105
96
|
await page.ensureTextVisibility('Token info', 'h2')
|
|
106
97
|
|
|
107
|
-
await page.
|
|
98
|
+
await page.clickOnAriaLabel('User menu')
|
|
108
99
|
|
|
109
|
-
await page.
|
|
100
|
+
await page.clickOnText('Sign out')
|
|
110
101
|
|
|
111
102
|
await page.waitForNetworkIdle()
|
|
112
|
-
|
|
113
|
-
// TODO: Find out why we can't use "using" here
|
|
114
|
-
await page[Symbol.asyncDispose]()
|
|
115
103
|
})
|
|
116
104
|
|
|
117
|
-
it('Allows
|
|
118
|
-
|
|
105
|
+
it('Allows canceling the OAuth flow', async () => {
|
|
106
|
+
await using page = await PageHelper.from(browser, { languages })
|
|
119
107
|
|
|
120
108
|
await page.goto(appUrl)
|
|
121
109
|
|
|
122
|
-
await page.
|
|
123
|
-
|
|
124
|
-
await page.navigationAction(async () => {
|
|
125
|
-
await page.clickOnButton(`Login with ${new URL(network.pds.url).host}`)
|
|
126
|
-
})
|
|
110
|
+
await page.assertTitle('OAuth Client Example')
|
|
127
111
|
|
|
128
|
-
await page.
|
|
112
|
+
await page.navigationClick(`Login with ${new URL(network.pds.url).host}`)
|
|
129
113
|
|
|
130
|
-
await page.
|
|
131
|
-
await page.ensureTextVisibility('Se connecter', 'button')
|
|
132
|
-
await page.ensureTextVisibility('Créer un nouveau compte', 'button')
|
|
114
|
+
await page.assertTitle("S'identifier")
|
|
133
115
|
|
|
134
116
|
// Cancel the OAuth flow:
|
|
135
|
-
await page.
|
|
136
|
-
await page.clickOnButton('Annuler')
|
|
137
|
-
})
|
|
117
|
+
await page.navigationClick('Annuler')
|
|
138
118
|
|
|
139
|
-
await page.
|
|
119
|
+
await page.assertTitle('OAuth Client Example')
|
|
140
120
|
|
|
141
121
|
await page.ensureTextVisibility('Login with the Atmosphere', 'h2')
|
|
142
122
|
|
|
143
123
|
await page.waitForNetworkIdle()
|
|
144
|
-
|
|
145
|
-
// TODO: Find out why we can't use "using" here
|
|
146
|
-
await page[Symbol.asyncDispose]()
|
|
147
124
|
})
|
|
148
125
|
|
|
149
126
|
it('allows resetting the password', async () => {
|
|
@@ -153,31 +130,29 @@ describe('oauth', () => {
|
|
|
153
130
|
// noop
|
|
154
131
|
})
|
|
155
132
|
|
|
156
|
-
|
|
133
|
+
await using page = await PageHelper.from(browser, { languages })
|
|
157
134
|
|
|
158
135
|
await page.goto(appUrl)
|
|
159
136
|
|
|
160
|
-
await page.
|
|
137
|
+
await page.assertTitle('OAuth Client Example')
|
|
161
138
|
|
|
162
|
-
await page.
|
|
163
|
-
const input = await page.typeIn('input[name="identifier"]', 'alice.test')
|
|
139
|
+
const input = await page.typeInInput('identifier', 'alice.test')
|
|
164
140
|
|
|
165
|
-
|
|
166
|
-
})
|
|
141
|
+
await page.navigationAction(async () => input.press('Enter'))
|
|
167
142
|
|
|
168
|
-
await page.
|
|
143
|
+
await page.assertTitle('Connexion')
|
|
169
144
|
|
|
170
|
-
await page.
|
|
145
|
+
await page.clickOnText('Oublié ?')
|
|
171
146
|
|
|
172
|
-
await page.
|
|
147
|
+
await page.assertTitle('Mot de passe oublié')
|
|
173
148
|
|
|
174
149
|
await page.typeInInput('email', 'alice@test.com')
|
|
175
150
|
|
|
176
151
|
expect(sendTemplateMock).toHaveBeenCalledTimes(0)
|
|
177
152
|
|
|
178
|
-
await page.
|
|
153
|
+
await page.clickOnText('Suivant')
|
|
179
154
|
|
|
180
|
-
await page.
|
|
155
|
+
await page.assertTitle('Réinitialiser le mot de passe')
|
|
181
156
|
|
|
182
157
|
expect(sendTemplateMock).toHaveBeenCalledTimes(1)
|
|
183
158
|
|
|
@@ -191,34 +166,29 @@ describe('oauth', () => {
|
|
|
191
166
|
|
|
192
167
|
await page.typeInInput('password', 'alice-new-pass')
|
|
193
168
|
|
|
194
|
-
await page.
|
|
169
|
+
await page.clickOnText('Suivant')
|
|
195
170
|
|
|
196
|
-
await page.
|
|
171
|
+
await page.assertTitle('Mot de passe mis à jour')
|
|
197
172
|
|
|
198
173
|
await page.ensureTextVisibility('Mot de passe mis à jour !', 'h2')
|
|
199
174
|
|
|
200
|
-
// TODO: Find out why we can't use "using" here
|
|
201
|
-
await page[Symbol.asyncDispose]()
|
|
202
|
-
|
|
203
175
|
sendTemplateMock.mockRestore()
|
|
204
176
|
})
|
|
205
177
|
|
|
206
178
|
it('Allows to sign-in through OAuth', async () => {
|
|
207
|
-
|
|
179
|
+
await using page = await PageHelper.from(browser, { languages })
|
|
208
180
|
|
|
209
181
|
await page.goto(appUrl)
|
|
210
182
|
|
|
211
|
-
await page.
|
|
183
|
+
await page.assertTitle('OAuth Client Example')
|
|
212
184
|
|
|
213
|
-
await page.
|
|
214
|
-
const input = await page.typeIn('input[name="identifier"]', 'alice.test')
|
|
185
|
+
const input = await page.typeInInput('identifier', 'alice.test')
|
|
215
186
|
|
|
216
|
-
|
|
217
|
-
})
|
|
187
|
+
await page.navigationAction(async () => input.press('Enter'))
|
|
218
188
|
|
|
219
|
-
await page.
|
|
189
|
+
await page.assertTitle('Connexion')
|
|
220
190
|
|
|
221
|
-
await page.
|
|
191
|
+
await page.typeInInput('password', 'alice-new-pass')
|
|
222
192
|
|
|
223
193
|
// Make sure the warning is visible
|
|
224
194
|
await page.ensureTextVisibility('Avertissement', 'h3')
|
|
@@ -227,79 +197,46 @@ describe('oauth', () => {
|
|
|
227
197
|
'label::-p-text(Se souvenir de ce compte sur cet appareil)',
|
|
228
198
|
)
|
|
229
199
|
|
|
230
|
-
await page.
|
|
200
|
+
await page.clickOnText('Se connecter')
|
|
231
201
|
|
|
232
|
-
await page.
|
|
202
|
+
await page.assertTitle('Autoriser')
|
|
233
203
|
|
|
234
|
-
await page.
|
|
235
|
-
await page.clickOnButton("Authoriser l'accès")
|
|
236
|
-
})
|
|
204
|
+
await page.navigationClick('Autoriser')
|
|
237
205
|
|
|
238
|
-
await page.
|
|
206
|
+
await page.assertTitle('OAuth Client Example')
|
|
239
207
|
|
|
240
208
|
await page.ensureTextVisibility('Token info', 'h2')
|
|
241
209
|
|
|
242
|
-
await page.
|
|
210
|
+
await page.clickOnAriaLabel('User menu')
|
|
243
211
|
|
|
244
|
-
await page.
|
|
212
|
+
await page.clickOnText('Sign out')
|
|
245
213
|
|
|
246
214
|
await page.waitForNetworkIdle()
|
|
247
|
-
|
|
248
|
-
// TODO: Find out why we can't use "using" here
|
|
249
|
-
await page[Symbol.asyncDispose]()
|
|
250
215
|
})
|
|
251
216
|
|
|
252
217
|
it('remembers the session', async () => {
|
|
253
|
-
|
|
218
|
+
await using page = await PageHelper.from(browser, { languages })
|
|
254
219
|
|
|
255
220
|
await page.goto(appUrl)
|
|
256
221
|
|
|
257
|
-
await page.
|
|
222
|
+
await page.assertTitle('OAuth Client Example')
|
|
258
223
|
|
|
259
|
-
await page.
|
|
260
|
-
const input = await page.typeIn('input[name="identifier"]', 'alice.test')
|
|
224
|
+
const input = await page.typeInInput('identifier', 'alice.test')
|
|
261
225
|
|
|
262
|
-
|
|
263
|
-
})
|
|
226
|
+
await page.navigationAction(async () => input.press('Enter'))
|
|
264
227
|
|
|
265
|
-
await page.
|
|
228
|
+
await page.assertTitle('Autoriser')
|
|
266
229
|
|
|
267
|
-
await page.
|
|
268
|
-
await page.clickOnButton("Authoriser l'accès")
|
|
269
|
-
})
|
|
230
|
+
await page.navigationClick('Autoriser')
|
|
270
231
|
|
|
271
|
-
await page.
|
|
232
|
+
await page.assertTitle('OAuth Client Example')
|
|
272
233
|
|
|
273
234
|
await page.ensureTextVisibility('Token info', 'h2')
|
|
274
235
|
|
|
275
|
-
await page.
|
|
236
|
+
await page.clickOnAriaLabel('User menu')
|
|
276
237
|
|
|
277
|
-
await page.
|
|
238
|
+
await page.clickOnText('Sign out')
|
|
278
239
|
|
|
279
240
|
await page.waitForNetworkIdle()
|
|
280
|
-
|
|
281
|
-
// TODO: Find out why we can't use "using" here
|
|
282
|
-
await page[Symbol.asyncDispose]()
|
|
283
241
|
})
|
|
284
242
|
})
|
|
285
|
-
|
|
286
|
-
function clientHandler(
|
|
287
|
-
req: IncomingMessage,
|
|
288
|
-
res: ServerResponse,
|
|
289
|
-
next?: (err?: unknown) => void,
|
|
290
|
-
): void {
|
|
291
|
-
const path = req.url?.split('?')[0].slice(1) || 'index.html'
|
|
292
|
-
const file = Object.hasOwn(files, path) ? files[path] : null
|
|
293
|
-
|
|
294
|
-
if (file) {
|
|
295
|
-
res
|
|
296
|
-
.writeHead(200, 'OK', { 'content-type': file.mime })
|
|
297
|
-
.end(Buffer.from(file.data, 'base64'))
|
|
298
|
-
} else if (next) {
|
|
299
|
-
next()
|
|
300
|
-
} else {
|
|
301
|
-
res
|
|
302
|
-
.writeHead(404, 'Not Found', { 'content-type': 'text/plain' })
|
|
303
|
-
.end('Page not found')
|
|
304
|
-
}
|
|
305
|
-
}
|