| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 | package modelsimport (	"strings"	"time"	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")// 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"`	IsAdmin      bool                `json:"isadmin" bson:"isadmin"`	IsSuperAdmin bool                `json:"issuperadmin"`	RemoteGwIDs  map[string]struct{} `json:"remote_gw_ids"`}// ReturnUser - return user structtype ReturnUser struct {	UserName     string              `json:"username"`	IsAdmin      bool                `json:"isadmin"`	IsSuperAdmin bool                `json:"issuperadmin"`	RemoteGwIDs  map[string]struct{} `json:"remote_gw_ids"`}// UserAuthParams - user auth params structtype UserAuthParams struct {	UserName string `json:"username"`	Password string `json:"password"`}// UserClaims - user claims structtype UserClaims struct {	IsAdmin      bool	IsSuperAdmin bool	UserName     string	jwt.RegisteredClaims}// IngressGwUsers - struct to hold users on a ingress gwtype IngressGwUsers struct {	NodeID  string       `json:"node_id"`	Network string       `json:"network"`	Users   []ReturnUser `json:"users"`}// UserRemoteGws - struct to hold user's remote gwstype UserRemoteGws struct {	GwID      string    `json:"remote_access_gw_id"`	GWName    string    `json:"gw_name"`	Network   string    `json:"network"`	Connected bool      `json:"connected"`	GwClient  ExtClient `json:"gw_client"`}// UserRemoteGwsReq - struct to hold user remote acccess gws reqtype UserRemoteGwsReq struct {	RemoteAccessClientID string `json:"remote_access_clientid"`}// 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"`	NetID        string   `json:"netid"`	RelayedNodes []string `json:"relayaddrs"`}// HostRelayRequest - struct for host relay creationtype HostRelayRequest struct {	HostID       string   `json:"host_id"`	RelayedHosts []string `json:"relayed_hosts"`}// IngressRequest - ingress request structtype IngressRequest struct {	ExtclientDNS string `json:"extclientdns"`	Failover     bool   `json:"failover"`}// 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"`	Nodes        []Node               `json:"nodes" yaml:"nodes"`	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"`	IsPro       bool   `yaml:"isee" json:"Is_EE"`	StunPort    int    `yaml:"stun_port"`	TrafficKey  []byte `yaml:"traffickey"`	TurnDomain  string `yaml:"turn_domain"`	TurnPort    int    `yaml:"turn_port"`	UseTurn     bool   `yaml:"use_turn"`}// 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"`}// HookDetails - struct to hold hook infotype HookDetails struct {	Hook     func() error	Interval time.Duration}// LicenseLimits - struct license limitstype LicenseLimits struct {	Servers  int `json:"servers"`	Users    int `json:"users"`	Hosts    int `json:"hosts"`	Clients  int `json:"clients"`	Networks int `json:"networks"`}
 |