// Copyright (c) 2022-2023 Niko Bonnieure, Par le Peuple, NextGraph.org developers // All rights reserved. // Licensed under the Apache License, Version 2.0 // // or the MIT license , // at your option. All files in the project carrying such // notice may not be copied, modified, or distributed except // according to those terms. use p2p_net::types::{BindAddress, BrokerServerV0, OverlayId, UserId, IP}; use p2p_repo::types::PrivKey; use serde::{Deserialize, Serialize}; /// AcceptForwardForV0 type /// allow answers to connection requests originating from a client behind a reverse proxy /// Format of last param in the tuple is a list of comma separated hosts or CIDR subnetworks IPv4 and/or IPv6 addresses accepted as X-Forwarded-For /// Empty string means all addresses are accepted #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum AcceptForwardForV0 { /// X-Forwarded-For not allowed No, /// X-Forwarded-For accepted only for clients with private LAN addresses. First param is the domain of the proxy server Private((String, String)), /// X-Forwarded-For accepted only for clients with public addresses. First param is the domain of the proxy server /// domain can take an option port (trailing `:port`) PublicDomain((String, String)), /// X-Forwarded-For accepted only for clients with public addresses. First param is the domain of the proxy server /// domain can take an option port (trailing `:port`) /// second param is the privKey of the PeerId of the proxy server, useful when the proxy server is load balancing to several daemons /// that should all use the same PeerId to answer requests PublicDomainPeer((String, PrivKey, String)), /// accepts only clients with public addresses that arrive on a LAN address binding. This is used for DMZ and port forwarding configs /// first param is the port, second param in tuple is the interval for periodic probe of the external IP PublicDyn((u16, u32, String)), /// accepts only clients with public addresses that arrive on a LAN address binding. This is used for DMZ and port forwarding configs /// First param is the IPv4 bind address of the reverse NAT server (DMZ, port forwarding) /// Second param is ab optional IPv6 bind address of the reverse NAT server (DMZ, port forwarding) PublicStatic((BindAddress, Option, String)), } /// DaemonConfig Listener Version 0 #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ListenerV0 { /// local interface name to bind to /// names of interfaces can be retrieved with the --list-interfaces option pub interface_name: String, /// optional number of seconds for an interval of periodic refresh /// of the actual IP(s) of the interface. Used for dynamic IP interfaces (DHCP) pub interface_refresh: u32, // if to bind to the ipv6 address of the interface pub ipv6: bool, /// local port to listen on pub port: u16, // will answer a probe coming from private LAN and if is_private, with its own peerId, so that guests on the network will be able to connect. pub discoverable: bool, /// Answers to connection requests originating from a direct client, without X-Forwarded-For headers /// Can be used in combination with a accept_forward_for config, when a local daemon is behind a proxy, and also serves as broker for local apps/webbrowsers pub accept_direct: bool, /// X-Forwarded-For config. only valid if IP/interface is localhost or private pub accept_forward_for: AcceptForwardForV0, // impl fn is_private() // returns false if public IP in interface, or if PublicDyn, PublicStatic // if the ip is local or private, and the forwarding is not PublicDyn nor PublicStatic, (if is_private) then the app is served on HTTP get of / // an interface with no accept_forward_for and no accept_direct, is de facto, disabled } impl ListenerV0 { pub fn new_direct(name: String, ipv6: bool, port: u16) -> Self { Self { interface_name: name, interface_refresh: 0, ipv6, port, discoverable: false, accept_direct: true, accept_forward_for: AcceptForwardForV0::No, } } } /// Broker Overlay Permission #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub enum BrokerOverlayPermission { Nobody, Anybody, AllRegisteredUser, UsersList(Vec), } /// Broker Overlay Config #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct BrokerOverlayConfigV0 { // list of overlays this config applies to. empty array means applying to all pub overlays: Vec, // Who can ask to join an overlay on the core pub core: BrokerOverlayPermission, // Who can connect as a client to this server pub server: BrokerOverlayPermission, // if core == Nobody and server == Nobody then the listeners will not be started // are ExtRequest allowed on the server? this requires the core to be ON. pub allow_read: bool, /// an empty list means to forward to the peer known for each overlay. /// forward and core are mutually exclusive. forward becomes the default when core is disabled (set to Nobody). /// core always takes precedence. pub forward: Vec, } impl BrokerOverlayConfigV0 { pub fn new() -> Self { BrokerOverlayConfigV0 { overlays: vec![], core: BrokerOverlayPermission::Nobody, server: BrokerOverlayPermission::Nobody, allow_read: false, forward: vec![], } } }