mirror of
https://github.com/gravitl/netmaker.git
synced 2026-04-23 00:17:10 +08:00
edda2868fc
* feat(go): add user schema; * feat(go): migrate to user schema; * feat(go): add audit fields; * feat(go): remove unused fields from the network model; * feat(go): add network schema; * feat(go): migrate to network schema; * refactor(go): add comment to clarify migration logic; * fix(go): test failures; * fix(go): test failures; * feat(go): change membership table to store memberships at all scopes; * feat(go): add schema for access grants; * feat(go): remove nameservers from new networks table; ensure db passed for schema functions; * feat(go): set max conns for sqlite to 1; * fix(go): issues updating user account status; * refactor(go): remove converters and access grants; * refactor(go): add json tags in schema models; * refactor(go): rename file to migrate_v1_6_0.go; * refactor(go): add user groups and user roles tables; use schema tables; * refactor(go): inline get and list from schema package; * refactor(go): inline get network and list users from schema package; * fix(go): staticcheck issues; * fix(go): remove test not in use; fix test case; * fix(go): validate network; * fix(go): resolve static checks; * fix(go): new models errors; * fix(go): test errors; * fix(go): handle no records; * fix(go): add validations for user object; * fix(go): set correct extclient status; * fix(go): test error; * feat(go): make schema the base package; * feat(go): add host schema; * feat(go): use schema host everywhere; * feat(go): inline get host, list hosts and delete host; * feat(go): use non-ptr value; * feat(go): use save to upsert all fields; * feat(go): use save to upsert all fields; * feat(go): save turn endpoint as string; * feat(go): check for gorm error record not found; * fix(go): test failures; * fix(go): update all network fields; * fix(go): update all network fields; * feat(go): add paginated list networks api; * feat(go): add paginated list users api; * feat(go): add paginated list hosts api; * feat(go): add pagination to list groups api; * fix(go): comment; * fix(go): implement marshal and unmarshal text for custom types; * fix(go): implement marshal and unmarshal json for custom types; * fix(go): just use the old model for unmarshalling; * fix(go): implement marshal and unmarshal json for custom types; * feat(go): remove paginated list networks api; * feat(go): use custom paginated response object; * fix(go): ensure default values for page and per_page are used when not passed; * fix(go): rename v1.6.0 to v1.5.1; * fix(go): check for gorm.ErrRecordNotFound instead of database.IsEmptyRecord; * fix(go): use host id, not pending host id; * feat(go): add filters to paginated apis; * feat(go): add filters to paginated apis; * feat(go): remove check for max username length; * feat(go): add filters to count as well; * feat(go): use library to check email address validity; * feat(go): ignore pagination if params not passed; * fix(go): pagination issues; * fix(go): check exists before using; * fix(go): remove debug log; * fix(go): use gorm err record not found; * fix(go): use gorm err record not found; * fix(go): use user principal name when creating pending user; * fix(go): use schema package for consts; * fix(go): prevent disabling superadmin user; Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * fix(go): swap is admin and is superadmin; Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * fix(go): remove dead code block; https://github.com/gravitl/netmaker/pull/3910#discussion_r2928837937 * fix(go): incorrect message when trying to disable self; https://github.com/gravitl/netmaker/pull/3910#discussion_r2928837934 * fix(go): use correct header; Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * fix(go): return after error response; Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * fix(go): use correct order of params; https://github.com/gravitl/netmaker/pull/3910#discussion_r2929593036 * fix(go): set default values for page and page size; use v2 instead of /list; * Update logic/auth.go Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * Update schema/user_roles.go Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * fix(go): syntax error; * fix(go): set default values when page and per_page are not passed or 0; * fix(go): use uuid.parse instead of uuid.must parse; * fix(go): review errors; * fix(go): review errors; * Update controllers/user.go Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * Update controllers/user.go Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * NM-163: fix errors: * Update db/types/options.go Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * fix(go): persist return user in event; * Update db/types/options.go Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com> * NM-163: duplicate lines of code * NM-163: fix(go): fix missing return and filter parsing in user controller - Add missing return after error response in updateUserAccountStatus to prevent double-response and spurious ext-client side-effects - Use switch statements in listUsers to skip unrecognized account_status and mfa_status filter values * fix(go): check for both min and max page size; * fix(go): enclose transfer superadmin in transaction; * fix(go): review errors; * fix(go): remove free tier checks; * fix(go): review fixes; --------- Co-authored-by: VishalDalwadi <dalwadivishal26@gmail.com> Co-authored-by: Vishal Dalwadi <51291657+VishalDalwadi@users.noreply.github.com> Co-authored-by: tenki-reviewer[bot] <262613592+tenki-reviewer[bot]@users.noreply.github.com>
149 lines
5.3 KiB
Go
149 lines
5.3 KiB
Go
package models
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gravitl/netmaker/schema"
|
|
)
|
|
|
|
// ApiHost - the host struct for API usage
|
|
type ApiHost struct {
|
|
ID string `json:"id"`
|
|
Verbosity int `json:"verbosity"`
|
|
FirewallInUse string `json:"firewallinuse"`
|
|
Version string `json:"version"`
|
|
Name string `json:"name"`
|
|
OS string `json:"os"`
|
|
OSFamily string `json:"os_family" yaml:"os_family"`
|
|
OSVersion string `json:"os_version" yaml:"os_version"`
|
|
KernelVersion string `json:"kernel_version" yaml:"kernel_version"`
|
|
Debug bool `json:"debug"`
|
|
IsStaticPort bool `json:"isstaticport"`
|
|
IsStatic bool `json:"isstatic"`
|
|
ListenPort int `json:"listenport"`
|
|
WgPublicListenPort int `json:"wg_public_listen_port" yaml:"wg_public_listen_port"`
|
|
MTU int `json:"mtu" yaml:"mtu"`
|
|
Interfaces []ApiIface `json:"interfaces" yaml:"interfaces"`
|
|
DefaultInterface string `json:"defaultinterface" yaml:"defautlinterface"`
|
|
EndpointIP string `json:"endpointip" yaml:"endpointip"`
|
|
EndpointIPv6 string `json:"endpointipv6" yaml:"endpointipv6"`
|
|
PublicKey string `json:"publickey"`
|
|
MacAddress string `json:"macaddress"`
|
|
Nodes []string `json:"nodes"`
|
|
IsDefault bool `json:"isdefault" yaml:"isdefault"`
|
|
NatType string `json:"nat_type" yaml:"nat_type"`
|
|
PersistentKeepalive int `json:"persistentkeepalive" yaml:"persistentkeepalive"`
|
|
AutoUpdate bool `json:"autoupdate" yaml:"autoupdate"`
|
|
DNS string `json:"dns" yaml:"dns"`
|
|
EnableFlowLogs bool `json:"enable_flow_logs" yaml:"enable_flow_logs"`
|
|
Location string `json:"location"`
|
|
CountryCode string `json:"country_code"`
|
|
}
|
|
|
|
// ApiIface - the interface struct for API usage
|
|
// The original Iface struct contains a net.Address, which does not get marshalled correctly
|
|
type ApiIface struct {
|
|
Name string `json:"name"`
|
|
AddressString string `json:"addressString"`
|
|
}
|
|
|
|
// NewApiHostFromSchemaHost - converts a Netmaker host to an API editable host
|
|
func NewApiHostFromSchemaHost(h *schema.Host) *ApiHost {
|
|
a := ApiHost{}
|
|
a.Debug = h.Debug
|
|
a.EndpointIP = h.EndpointIP.String()
|
|
if a.EndpointIP == "<nil>" {
|
|
a.EndpointIP = ""
|
|
}
|
|
a.EndpointIPv6 = h.EndpointIPv6.String()
|
|
if a.EndpointIPv6 == "<nil>" {
|
|
a.EndpointIPv6 = ""
|
|
}
|
|
a.FirewallInUse = h.FirewallInUse
|
|
a.ID = h.ID.String()
|
|
a.Interfaces = make([]ApiIface, len(h.Interfaces))
|
|
for i := range a.Interfaces {
|
|
a.Interfaces[i] = ApiIface{
|
|
Name: h.Interfaces[i].Name,
|
|
AddressString: h.Interfaces[i].Address.String(),
|
|
}
|
|
}
|
|
a.DefaultInterface = h.DefaultInterface
|
|
a.IsStaticPort = h.IsStaticPort
|
|
a.IsStatic = h.IsStatic
|
|
a.ListenPort = h.ListenPort
|
|
a.MTU = h.MTU
|
|
a.MacAddress = h.MacAddress.String()
|
|
a.Name = h.Name
|
|
a.OS = h.OS
|
|
a.OSFamily = h.OSFamily
|
|
a.KernelVersion = h.KernelVersion
|
|
a.Nodes = h.Nodes
|
|
a.WgPublicListenPort = h.WgPublicListenPort
|
|
a.PublicKey = h.PublicKey.String()
|
|
a.Verbosity = h.Verbosity
|
|
a.Version = h.Version
|
|
a.IsDefault = h.IsDefault
|
|
a.NatType = h.NatType
|
|
a.PersistentKeepalive = int(h.PersistentKeepalive.Seconds())
|
|
a.AutoUpdate = h.AutoUpdate
|
|
a.DNS = h.DNS
|
|
a.EnableFlowLogs = h.EnableFlowLogs
|
|
a.Location = h.Location
|
|
a.CountryCode = h.CountryCode
|
|
return &a
|
|
}
|
|
|
|
// APIHost.ConvertAPIHostToNMHost - convert's a given apihost struct to
|
|
// a Host struct
|
|
func (a *ApiHost) ConvertAPIHostToNMHost(currentHost *schema.Host) *schema.Host {
|
|
h := schema.Host{}
|
|
h.ID = currentHost.ID
|
|
h.HostPass = currentHost.HostPass
|
|
h.DaemonInstalled = currentHost.DaemonInstalled
|
|
if len(a.EndpointIP) == 0 || strings.Contains(a.EndpointIP, "nil") {
|
|
h.EndpointIP = currentHost.EndpointIP
|
|
} else {
|
|
h.EndpointIP = net.ParseIP(a.EndpointIP)
|
|
}
|
|
if len(a.EndpointIPv6) == 0 || strings.Contains(a.EndpointIPv6, "nil") {
|
|
h.EndpointIPv6 = currentHost.EndpointIPv6
|
|
} else {
|
|
h.EndpointIPv6 = net.ParseIP(a.EndpointIPv6)
|
|
}
|
|
h.Debug = a.Debug
|
|
h.FirewallInUse = a.FirewallInUse
|
|
h.IPForwarding = currentHost.IPForwarding
|
|
h.Interface = currentHost.Interface
|
|
h.Interfaces = currentHost.Interfaces
|
|
h.DefaultInterface = currentHost.DefaultInterface
|
|
h.IsDocker = currentHost.IsDocker
|
|
h.IsK8S = currentHost.IsK8S
|
|
h.IsStaticPort = a.IsStaticPort
|
|
h.IsStatic = a.IsStatic
|
|
h.ListenPort = a.ListenPort
|
|
h.MTU = a.MTU
|
|
h.MacAddress = currentHost.MacAddress
|
|
h.PublicKey = currentHost.PublicKey
|
|
h.Name = a.Name
|
|
h.Version = currentHost.Version
|
|
h.Verbosity = a.Verbosity
|
|
h.Nodes = currentHost.Nodes
|
|
h.TrafficKeyPublic = currentHost.TrafficKeyPublic
|
|
h.OS = currentHost.OS
|
|
h.OSFamily = currentHost.OSFamily
|
|
h.KernelVersion = currentHost.KernelVersion
|
|
h.IsDefault = a.IsDefault
|
|
h.NatType = currentHost.NatType
|
|
h.TurnEndpoint = currentHost.TurnEndpoint
|
|
h.PersistentKeepalive = time.Duration(a.PersistentKeepalive) * time.Second
|
|
h.AutoUpdate = a.AutoUpdate
|
|
h.DNS = strings.ToLower(a.DNS)
|
|
h.EnableFlowLogs = a.EnableFlowLogs
|
|
h.Location = currentHost.Location
|
|
h.CountryCode = currentHost.CountryCode
|
|
return &h
|
|
}
|