| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 | package modelsimport (	"strings"	jwt "github.com/golang-jwt/jwt/v4"	"golang.zx2c4.com/wireguard/wgctrl/wgtypes")const (	// PLACEHOLDER_KEY_TEXT - access key placeholder text if option turned off	PLACEHOLDER_KEY_TEXT = "ACCESS_KEY"	// PLACEHOLDER_TOKEN_TEXT - access key token placeholder text if option turned off	PLACEHOLDER_TOKEN_TEXT = "ACCESS_TOKEN")// CustomExtClient - struct for CustomExtClient paramstype CustomExtClient struct {	ClientID  string `json:"clientid"`	PublicKey string `json:"publickey,omitempty"`}// AuthParams - struct for auth paramstype AuthParams struct {	MacAddress string `json:"macaddress"`	ID         string `json:"id"`	Password   string `json:"password"`}// User struct - struct for Userstype User struct {	UserName string   `json:"username" bson:"username" validate:"min=3,max=40,in_charset|email"`	Password string   `json:"password" bson:"password" validate:"required,min=5"`	Networks []string `json:"networks" bson:"networks"`	IsAdmin  bool     `json:"isadmin" bson:"isadmin"`	Groups   []string `json:"groups" bson:"groups" yaml:"groups"`}// ReturnUser - return user structtype ReturnUser struct {	UserName string   `json:"username" bson:"username"`	Networks []string `json:"networks" bson:"networks"`	IsAdmin  bool     `json:"isadmin" bson:"isadmin"`	Groups   []string `json:"groups" bson:"groups"`}// UserAuthParams - user auth params structtype UserAuthParams struct {	UserName string `json:"username"`	Password string `json:"password"`}// UserClaims - user claims structtype UserClaims struct {	IsAdmin  bool	UserName string	Networks []string	Groups   []string	jwt.RegisteredClaims}// SuccessfulUserLoginResponse - successlogin structtype SuccessfulUserLoginResponse struct {	UserName  string	AuthToken string}// Claims is  a struct that will be encoded to a JWT.// jwt.StandardClaims is an embedded type to provide expiry timetype Claims struct {	ID         string	MacAddress string	Network    string	jwt.RegisteredClaims}// SuccessfulLoginResponse is struct to send the request responsetype SuccessfulLoginResponse struct {	ID        string	AuthToken string}// ErrorResponse is struct for errortype ErrorResponse struct {	Code    int	Message string}// NodeAuth - struct for node authtype NodeAuth struct {	Network    string	Password   string	MacAddress string // Depricated	ID         string}// SuccessResponse is struct for sending error message with code.type SuccessResponse struct {	Code     int	Message  string	Response interface{}}// DisplayKey - what is displayed for keytype DisplayKey struct {	Name string `json:"name" bson:"name"`	Uses int    `json:"uses" bson:"uses"`}// GlobalConfig - global configtype GlobalConfig struct {	Name string `json:"name" bson:"name"`}// CheckInResponse - checkin responsetype CheckInResponse struct {	Success          bool   `json:"success" bson:"success"`	NeedPeerUpdate   bool   `json:"needpeerupdate" bson:"needpeerupdate"`	NeedConfigUpdate bool   `json:"needconfigupdate" bson:"needconfigupdate"`	NeedKeyUpdate    bool   `json:"needkeyupdate" bson:"needkeyupdate"`	NeedDelete       bool   `json:"needdelete" bson:"needdelete"`	NodeMessage      string `json:"nodemessage" bson:"nodemessage"`	IsPending        bool   `json:"ispending" bson:"ispending"`}// PeersResponse - peers responsetype PeersResponse struct {	PublicKey           string `json:"publickey" bson:"publickey"`	Endpoint            string `json:"endpoint" bson:"endpoint"`	Address             string `json:"address" bson:"address"`	Address6            string `json:"address6" bson:"address6"`	LocalAddress        string `json:"localaddress" bson:"localaddress"`	LocalListenPort     int32  `json:"locallistenport" bson:"locallistenport"`	IsEgressGateway     string `json:"isegressgateway" bson:"isegressgateway"`	EgressGatewayRanges string `json:"egressgatewayrange" bson:"egressgatewayrange"`	ListenPort          int32  `json:"listenport" bson:"listenport"`	KeepAlive           int32  `json:"persistentkeepalive" bson:"persistentkeepalive"`}// ExtPeersResponse - ext peers responsetype ExtPeersResponse struct {	PublicKey       string `json:"publickey" bson:"publickey"`	Endpoint        string `json:"endpoint" bson:"endpoint"`	Address         string `json:"address" bson:"address"`	Address6        string `json:"address6" bson:"address6"`	LocalAddress    string `json:"localaddress" bson:"localaddress"`	LocalListenPort int32  `json:"locallistenport" bson:"locallistenport"`	ListenPort      int32  `json:"listenport" bson:"listenport"`	KeepAlive       int32  `json:"persistentkeepalive" bson:"persistentkeepalive"`}// EgressGatewayRequest - egress gateway requesttype EgressGatewayRequest struct {	NodeID     string   `json:"nodeid" bson:"nodeid"`	NetID      string   `json:"netid" bson:"netid"`	NatEnabled string   `json:"natenabled" bson:"natenabled"`	Ranges     []string `json:"ranges" bson:"ranges"`}// RelayRequest - relay request structtype RelayRequest struct {	NodeID     string   `json:"nodeid" bson:"nodeid"`	NetID      string   `json:"netid" bson:"netid"`	RelayAddrs []string `json:"relayaddrs" bson:"relayaddrs"`}// HostRelayRequest - struct for host relay creationtype HostRelayRequest struct {	HostID       string   `json:"host_id"`	RelayedHosts []string `json:"relayed_hosts"`}// ServerUpdateData - contains data to configure server// and if it should set peerstype ServerUpdateData struct {	UpdatePeers bool       `json:"updatepeers" bson:"updatepeers"`	Node        LegacyNode `json:"servernode" bson:"servernode"`}// Telemetry - contains UUID of the server and timestamp of last send to posthog// also contains assymetrical encryption pub/priv keys for any server traffictype Telemetry struct {	UUID           string `json:"uuid" bson:"uuid"`	LastSend       int64  `json:"lastsend" bson:"lastsend"`	TrafficKeyPriv []byte `json:"traffickeypriv" bson:"traffickeypriv"`	TrafficKeyPub  []byte `json:"traffickeypub" bson:"traffickeypub"`}// ServerAddr - to pass to clients to tell server addresses and if it's the leader or nottype ServerAddr struct {	IsLeader bool   `json:"isleader" bson:"isleader" yaml:"isleader"`	Address  string `json:"address" bson:"address" yaml:"address"`}// TrafficKeys - struct to hold public keystype TrafficKeys struct {	Mine   []byte `json:"mine" bson:"mine" yaml:"mine"`	Server []byte `json:"server" bson:"server" yaml:"server"`}// HostPull - response of a host's pulltype HostPull struct {	Host         Host                 `json:"host" yaml:"host"`	Peers        []wgtypes.PeerConfig `json:"peers" yaml:"peers"`	ServerConfig ServerConfig         `json:"server_config" yaml:"server_config"`	PeerIDs      PeerMap              `json:"peer_ids,omitempty" yaml:"peer_ids,omitempty"`}// NodeGet - struct for a single node get responsetype NodeGet struct {	Node         Node                 `json:"node" bson:"node" yaml:"node"`	Host         Host                 `json:"host" yaml:"host"`	Peers        []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"`	HostPeers    []wgtypes.PeerConfig `json:"host_peers" bson:"host_peers" yaml:"host_peers"`	ServerConfig ServerConfig         `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"`	PeerIDs      PeerMap              `json:"peerids,omitempty" bson:"peerids,omitempty" yaml:"peerids,omitempty"`}// NodeJoinResponse data returned to node in response to jointype NodeJoinResponse struct {	Node         Node                 `json:"node" bson:"node" yaml:"node"`	Host         Host                 `json:"host" yaml:"host"`	ServerConfig ServerConfig         `json:"serverconfig" bson:"serverconfig" yaml:"serverconfig"`	Peers        []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"`}// ServerConfig - struct for dealing with the server information for a netclienttype ServerConfig struct {	CoreDNSAddr string       `yaml:"corednsaddr"`	API         string       `yaml:"api"`	APIPort     string       `yaml:"apiport"`	DNSMode     string       `yaml:"dnsmode"`	Version     string       `yaml:"version"`	MQPort      string       `yaml:"mqport"`	MQUserName  string       `yaml:"mq_username"`	MQPassword  string       `yaml:"mq_password"`	Server      string       `yaml:"server"`	Broker      string       `yaml:"broker"`	Is_EE       bool         `yaml:"isee"`	StunPort    int          `yaml:"stun_port"`	StunList    []StunServer `yaml:"stun_list"`	TrafficKey  []byte       `yaml:"traffickey"`}// User.NameInCharset - returns if name is in charset below or notfunc (user *User) NameInCharSet() bool {	charset := "abcdefghijklmnopqrstuvwxyz1234567890-."	for _, char := range user.UserName {		if !strings.Contains(charset, strings.ToLower(string(char))) {			return false		}	}	return true}// ServerIDs - struct to hold server ids.type ServerIDs struct {	ServerIDs []string `json:"server_ids"`}// JoinData - struct to hold data required for node to join a network on servertype JoinData struct {	Host Host   `json:"host" yaml:"host"`	Node Node   `json:"node" yaml:"node"`	Key  string `json:"key" yaml:"key"`}// StunServer - struct to hold data required for using stun servertype StunServer struct {	Domain string `json:"domain" yaml:"domain"`	Port   int    `json:"port" yaml:"port"`}
 |