|
5 | 5 | // Please see LICENSE files in the repository root for full details. |
6 | 6 |
|
7 | 7 | use chrono::Duration; |
| 8 | +use mas_iana::jose::JsonWebSignatureAlg; |
8 | 9 | use mas_storage::{ |
9 | 10 | Clock, Pagination, RepositoryAccess, |
10 | 11 | clock::MockClock, |
| 12 | + upstream_oauth2::UpstreamOAuthProviderParams, |
11 | 13 | user::{ |
12 | 14 | BrowserSessionFilter, BrowserSessionRepository, UserEmailFilter, UserEmailRepository, |
13 | 15 | UserFilter, UserPasswordRepository, UserRepository, |
14 | 16 | }, |
15 | 17 | }; |
| 18 | +use oauth2_types::scope::{OPENID, Scope}; |
16 | 19 | use rand::SeedableRng; |
17 | 20 | use rand_chacha::ChaChaRng; |
18 | 21 | use sqlx::PgPool; |
@@ -717,6 +720,97 @@ async fn test_user_session(pool: PgPool) { |
717 | 720 | assert_eq!(repo.browser_session().count(all_bob).await.unwrap(), 5); |
718 | 721 | assert_eq!(repo.browser_session().count(active_bob).await.unwrap(), 0); |
719 | 722 | assert_eq!(repo.browser_session().count(finished).await.unwrap(), 11); |
| 723 | + |
| 724 | + // Checking the 'authenticaated by upstream sessions' filter |
| 725 | + // We need a provider |
| 726 | + let provider = repo |
| 727 | + .upstream_oauth_provider() |
| 728 | + .add( |
| 729 | + &mut rng, |
| 730 | + &clock, |
| 731 | + UpstreamOAuthProviderParams { |
| 732 | + issuer: None, |
| 733 | + human_name: None, |
| 734 | + brand_name: None, |
| 735 | + scope: Scope::from_iter([OPENID]), |
| 736 | + token_endpoint_auth_method: |
| 737 | + mas_data_model::UpstreamOAuthProviderTokenAuthMethod::None, |
| 738 | + token_endpoint_signing_alg: None, |
| 739 | + id_token_signed_response_alg: JsonWebSignatureAlg::Rs256, |
| 740 | + fetch_userinfo: false, |
| 741 | + userinfo_signed_response_alg: None, |
| 742 | + client_id: "client".to_owned(), |
| 743 | + encrypted_client_secret: None, |
| 744 | + claims_imports: mas_data_model::UpstreamOAuthProviderClaimsImports::default(), |
| 745 | + authorization_endpoint_override: None, |
| 746 | + token_endpoint_override: None, |
| 747 | + userinfo_endpoint_override: None, |
| 748 | + jwks_uri_override: None, |
| 749 | + discovery_mode: mas_data_model::UpstreamOAuthProviderDiscoveryMode::Disabled, |
| 750 | + pkce_mode: mas_data_model::UpstreamOAuthProviderPkceMode::Disabled, |
| 751 | + response_mode: None, |
| 752 | + additional_authorization_parameters: Vec::new(), |
| 753 | + forward_login_hint: false, |
| 754 | + ui_order: 0, |
| 755 | + on_backchannel_logout: |
| 756 | + mas_data_model::UpstreamOAuthProviderOnBackchannelLogout::DoNothing, |
| 757 | + }, |
| 758 | + ) |
| 759 | + .await |
| 760 | + .unwrap(); |
| 761 | + |
| 762 | + // Start a authorization session |
| 763 | + let upstream_oauth_session = repo |
| 764 | + .upstream_oauth_session() |
| 765 | + .add(&mut rng, &clock, &provider, "state".to_owned(), None, None) |
| 766 | + .await |
| 767 | + .unwrap(); |
| 768 | + |
| 769 | + // Start a browser session |
| 770 | + let session = repo |
| 771 | + .browser_session() |
| 772 | + .add(&mut rng, &clock, &alice, None) |
| 773 | + .await |
| 774 | + .unwrap(); |
| 775 | + |
| 776 | + // Make the session from alice authenticated by this session |
| 777 | + repo.browser_session() |
| 778 | + .authenticate_with_upstream(&mut rng, &clock, &session, &upstream_oauth_session) |
| 779 | + .await |
| 780 | + .unwrap(); |
| 781 | + |
| 782 | + let session_list = vec![upstream_oauth_session]; |
| 783 | + let filter = BrowserSessionFilter::new().authenticated_by_upstream_sessions_only(&session_list); |
| 784 | + |
| 785 | + // Now try to look it up |
| 786 | + let page = repo |
| 787 | + .browser_session() |
| 788 | + .list(filter, Pagination::first(10)) |
| 789 | + .await |
| 790 | + .unwrap(); |
| 791 | + assert_eq!(page.edges.len(), 1); |
| 792 | + assert_eq!(page.edges[0].id, session.id); |
| 793 | + |
| 794 | + // Try counting |
| 795 | + assert_eq!(repo.browser_session().count(filter).await.unwrap(), 1); |
| 796 | + |
| 797 | + // Try finishing the session |
| 798 | + let affected = repo |
| 799 | + .browser_session() |
| 800 | + .finish_bulk(&clock, filter) |
| 801 | + .await |
| 802 | + .unwrap(); |
| 803 | + assert_eq!(affected, 1); |
| 804 | + |
| 805 | + // Lookup the session by its ID |
| 806 | + let lookup = repo |
| 807 | + .browser_session() |
| 808 | + .lookup(session.id) |
| 809 | + .await |
| 810 | + .unwrap() |
| 811 | + .expect("session to be found in the database"); |
| 812 | + // It should be finished |
| 813 | + assert!(lookup.finished_at.is_some()); |
720 | 814 | } |
721 | 815 |
|
722 | 816 | #[sqlx::test(migrator = "crate::MIGRATOR")] |
|
0 commit comments