nvpn 4.1.13

CLI and daemon for Nostr VPN private mesh networks
    #[test]
    fn pending_manual_join_preserves_independent_wireguard_exit_and_dns() {
        let joiner_keys = Keys::generate();
        let admin_keys = Keys::generate();
        let joiner_pubkey = joiner_keys.public_key().to_hex();
        let admin_pubkey = admin_keys.public_key().to_hex();
        let network_id = "desktop-manual-pending-wireguard";

        let mut joining = AppConfig::generated_without_networks();
        joining.nostr.secret_key = joiner_keys.secret_key().to_secret_hex();
        joining.nostr.public_key = joiner_pubkey.clone();
        joining
            .add_manual_join_network(&admin_pubkey, network_id)
            .expect("configure manual join");
        joining.set_internet_source(InternetSource::WireGuard);
        joining.wireguard_exit.address = "10.64.70.195/32".to_string();
        joining.wireguard_exit.private_key =
            "AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE=".to_string();
        joining.wireguard_exit.peer_public_key =
            "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI=".to_string();
        joining.wireguard_exit.endpoint = "198.51.100.20:51820".to_string();
        joining.wireguard_exit.allowed_ips = vec!["0.0.0.0/0".to_string()];
        joining.exit_dns.mode = nostr_vpn_core::config::ExitDnsMode::ThroughExit;
        joining.exit_dns.through_exit_servers = vec!["9.9.9.9".to_string()];

        let config = FipsPrivateTunnelConfig::from_app(
            &joining,
            network_id,
            "utun-manual-pending-wireguard",
            Some(&joiner_pubkey),
            None,
            &[],
        )
        .expect("pending manual tunnel with WireGuard exit");

        assert!(config.network_id.is_empty());
        assert!(config.route_targets.is_empty());
        assert!(config.magic_dns_records.is_empty());
        assert!(config.advertise_on_nostr);
        assert_eq!(config.wireguard_exit, joining.wireguard_exit);
        assert!(config.secure_dns_required());
        assert_eq!(
            config.exit_dns_resolver_config(false).unwrap(),
            ExitDnsResolverConfig::FailClosed
        );
        assert_eq!(
            config.exit_dns_resolver_config(true).unwrap(),
            ExitDnsResolverConfig::ThroughExit {
                servers: vec!["9.9.9.9".parse::<std::net::IpAddr>().unwrap()]
            }
        );
    }