mirror of
https://github.com/netbirdio/netbird.git
synced 2025-04-27 21:09:09 +02:00
Add FindExistingPostureCheck (#2075)
This commit is contained in:
parent
f176807ebe
commit
012235ff12
@ -132,6 +132,7 @@ type AccountManager interface {
|
|||||||
GetValidatedPeers(account *Account) (map[string]struct{}, error)
|
GetValidatedPeers(account *Account) (map[string]struct{}, error)
|
||||||
SyncAndMarkPeer(peerPubKey string, realIP net.IP) (*nbpeer.Peer, *NetworkMap, error)
|
SyncAndMarkPeer(peerPubKey string, realIP net.IP) (*nbpeer.Peer, *NetworkMap, error)
|
||||||
CancelPeerRoutines(peer *nbpeer.Peer) error
|
CancelPeerRoutines(peer *nbpeer.Peer) error
|
||||||
|
FindExistingPostureCheck(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DefaultAccountManager struct {
|
type DefaultAccountManager struct {
|
||||||
@ -1961,6 +1962,10 @@ func (am *DefaultAccountManager) onPeersInvalidated(accountID string) {
|
|||||||
am.updateAccountPeers(updatedAccount)
|
am.updateAccountPeers(updatedAccount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (am *DefaultAccountManager) FindExistingPostureCheck(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error) {
|
||||||
|
return am.Store.GetPostureCheckByChecksDefinition(accountID, checks)
|
||||||
|
}
|
||||||
|
|
||||||
// addAllGroup to account object if it doesn't exist
|
// addAllGroup to account object if it doesn't exist
|
||||||
func addAllGroup(account *Account) error {
|
func addAllGroup(account *Account) error {
|
||||||
if len(account.Groups) == 0 {
|
if len(account.Groups) == 0 {
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
nbgroup "github.com/netbirdio/netbird/management/server/group"
|
nbgroup "github.com/netbirdio/netbird/management/server/group"
|
||||||
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
||||||
|
"github.com/netbirdio/netbird/management/server/posture"
|
||||||
"github.com/netbirdio/netbird/management/server/status"
|
"github.com/netbirdio/netbird/management/server/status"
|
||||||
"github.com/netbirdio/netbird/management/server/telemetry"
|
"github.com/netbirdio/netbird/management/server/telemetry"
|
||||||
|
|
||||||
@ -667,6 +668,10 @@ func (s *FileStore) SaveUserLastLogin(accountID, userID string, lastLogin time.T
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *FileStore) GetPostureCheckByChecksDefinition(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error) {
|
||||||
|
return nil, status.Errorf(status.Internal, "GetPostureCheckByChecksDefinition is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
// Close the FileStore persisting data to disk
|
// Close the FileStore persisting data to disk
|
||||||
func (s *FileStore) Close() error {
|
func (s *FileStore) Close() error {
|
||||||
s.mux.Lock()
|
s.mux.Lock()
|
||||||
|
@ -3,12 +3,10 @@ package http
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/netip"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/rs/xid"
|
|
||||||
|
|
||||||
"github.com/netbirdio/netbird/management/server"
|
"github.com/netbirdio/netbird/management/server"
|
||||||
"github.com/netbirdio/netbird/management/server/geolocation"
|
"github.com/netbirdio/netbird/management/server/geolocation"
|
||||||
@ -59,7 +57,7 @@ func (p *PostureChecksHandler) GetAllPostureChecks(w http.ResponseWriter, r *htt
|
|||||||
|
|
||||||
postureChecks := []*api.PostureCheck{}
|
postureChecks := []*api.PostureCheck{}
|
||||||
for _, postureCheck := range accountPostureChecks {
|
for _, postureCheck := range accountPostureChecks {
|
||||||
postureChecks = append(postureChecks, toPostureChecksResponse(postureCheck))
|
postureChecks = append(postureChecks, postureCheck.ToAPIResponse())
|
||||||
}
|
}
|
||||||
|
|
||||||
util.WriteJSONObject(w, postureChecks)
|
util.WriteJSONObject(w, postureChecks)
|
||||||
@ -130,7 +128,7 @@ func (p *PostureChecksHandler) GetPostureCheck(w http.ResponseWriter, r *http.Re
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
util.WriteJSONObject(w, toPostureChecksResponse(postureChecks))
|
util.WriteJSONObject(w, postureChecks.ToAPIResponse())
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeletePostureCheck handles posture check deletion request
|
// DeletePostureCheck handles posture check deletion request
|
||||||
@ -178,55 +176,26 @@ func (p *PostureChecksHandler) savePostureChecks(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if postureChecksID == "" {
|
|
||||||
postureChecksID = xid.New().String()
|
|
||||||
}
|
|
||||||
|
|
||||||
postureChecks := posture.Checks{
|
|
||||||
ID: postureChecksID,
|
|
||||||
Name: req.Name,
|
|
||||||
Description: req.Description,
|
|
||||||
}
|
|
||||||
|
|
||||||
if nbVersionCheck := req.Checks.NbVersionCheck; nbVersionCheck != nil {
|
|
||||||
postureChecks.Checks.NBVersionCheck = &posture.NBVersionCheck{
|
|
||||||
MinVersion: nbVersionCheck.MinVersion,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if osVersionCheck := req.Checks.OsVersionCheck; osVersionCheck != nil {
|
|
||||||
postureChecks.Checks.OSVersionCheck = &posture.OSVersionCheck{
|
|
||||||
Android: (*posture.MinVersionCheck)(osVersionCheck.Android),
|
|
||||||
Darwin: (*posture.MinVersionCheck)(osVersionCheck.Darwin),
|
|
||||||
Ios: (*posture.MinVersionCheck)(osVersionCheck.Ios),
|
|
||||||
Linux: (*posture.MinKernelVersionCheck)(osVersionCheck.Linux),
|
|
||||||
Windows: (*posture.MinKernelVersionCheck)(osVersionCheck.Windows),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if geoLocationCheck := req.Checks.GeoLocationCheck; geoLocationCheck != nil {
|
if geoLocationCheck := req.Checks.GeoLocationCheck; geoLocationCheck != nil {
|
||||||
if p.geolocationManager == nil {
|
if p.geolocationManager == nil {
|
||||||
// TODO: update error message to include geo db self hosted doc link when ready
|
// TODO: update error message to include geo db self hosted doc link when ready
|
||||||
util.WriteError(status.Errorf(status.PreconditionFailed, "Geo location database is not initialized"), w)
|
util.WriteError(status.Errorf(status.PreconditionFailed, "Geo location database is not initialized"), w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
postureChecks.Checks.GeoLocationCheck = toPostureGeoLocationCheck(geoLocationCheck)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if peerNetworkRangeCheck := req.Checks.PeerNetworkRangeCheck; peerNetworkRangeCheck != nil {
|
postureChecks, err := posture.NewChecksFromAPIPostureCheckUpdate(req, postureChecksID)
|
||||||
postureChecks.Checks.PeerNetworkRangeCheck, err = toPeerNetworkRangeCheck(peerNetworkRangeCheck)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.WriteError(status.Errorf(status.InvalidArgument, "invalid network prefix"), w)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := p.accountManager.SavePostureChecks(account.Id, user.Id, &postureChecks); err != nil {
|
|
||||||
util.WriteError(err, w)
|
util.WriteError(err, w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
util.WriteJSONObject(w, toPostureChecksResponse(&postureChecks))
|
if err := p.accountManager.SavePostureChecks(account.Id, user.Id, postureChecks); err != nil {
|
||||||
|
util.WriteError(err, w)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
util.WriteJSONObject(w, postureChecks.ToAPIResponse())
|
||||||
}
|
}
|
||||||
|
|
||||||
func validatePostureChecksUpdate(req api.PostureCheckUpdate) error {
|
func validatePostureChecksUpdate(req api.PostureCheckUpdate) error {
|
||||||
@ -294,105 +263,3 @@ func validatePostureChecksUpdate(req api.PostureCheckUpdate) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func toPostureChecksResponse(postureChecks *posture.Checks) *api.PostureCheck {
|
|
||||||
var checks api.Checks
|
|
||||||
|
|
||||||
if postureChecks.Checks.NBVersionCheck != nil {
|
|
||||||
checks.NbVersionCheck = &api.NBVersionCheck{
|
|
||||||
MinVersion: postureChecks.Checks.NBVersionCheck.MinVersion,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if postureChecks.Checks.OSVersionCheck != nil {
|
|
||||||
checks.OsVersionCheck = &api.OSVersionCheck{
|
|
||||||
Android: (*api.MinVersionCheck)(postureChecks.Checks.OSVersionCheck.Android),
|
|
||||||
Darwin: (*api.MinVersionCheck)(postureChecks.Checks.OSVersionCheck.Darwin),
|
|
||||||
Ios: (*api.MinVersionCheck)(postureChecks.Checks.OSVersionCheck.Ios),
|
|
||||||
Linux: (*api.MinKernelVersionCheck)(postureChecks.Checks.OSVersionCheck.Linux),
|
|
||||||
Windows: (*api.MinKernelVersionCheck)(postureChecks.Checks.OSVersionCheck.Windows),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if postureChecks.Checks.GeoLocationCheck != nil {
|
|
||||||
checks.GeoLocationCheck = toGeoLocationCheckResponse(postureChecks.Checks.GeoLocationCheck)
|
|
||||||
}
|
|
||||||
|
|
||||||
if postureChecks.Checks.PeerNetworkRangeCheck != nil {
|
|
||||||
checks.PeerNetworkRangeCheck = toPeerNetworkRangeCheckResponse(postureChecks.Checks.PeerNetworkRangeCheck)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &api.PostureCheck{
|
|
||||||
Id: postureChecks.ID,
|
|
||||||
Name: postureChecks.Name,
|
|
||||||
Description: &postureChecks.Description,
|
|
||||||
Checks: checks,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toGeoLocationCheckResponse(geoLocationCheck *posture.GeoLocationCheck) *api.GeoLocationCheck {
|
|
||||||
locations := make([]api.Location, 0, len(geoLocationCheck.Locations))
|
|
||||||
for _, loc := range geoLocationCheck.Locations {
|
|
||||||
l := loc // make G601 happy
|
|
||||||
var cityName *string
|
|
||||||
if loc.CityName != "" {
|
|
||||||
cityName = &l.CityName
|
|
||||||
}
|
|
||||||
locations = append(locations, api.Location{
|
|
||||||
CityName: cityName,
|
|
||||||
CountryCode: loc.CountryCode,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return &api.GeoLocationCheck{
|
|
||||||
Action: api.GeoLocationCheckAction(geoLocationCheck.Action),
|
|
||||||
Locations: locations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toPostureGeoLocationCheck(apiGeoLocationCheck *api.GeoLocationCheck) *posture.GeoLocationCheck {
|
|
||||||
locations := make([]posture.Location, 0, len(apiGeoLocationCheck.Locations))
|
|
||||||
for _, loc := range apiGeoLocationCheck.Locations {
|
|
||||||
cityName := ""
|
|
||||||
if loc.CityName != nil {
|
|
||||||
cityName = *loc.CityName
|
|
||||||
}
|
|
||||||
locations = append(locations, posture.Location{
|
|
||||||
CountryCode: loc.CountryCode,
|
|
||||||
CityName: cityName,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return &posture.GeoLocationCheck{
|
|
||||||
Action: string(apiGeoLocationCheck.Action),
|
|
||||||
Locations: locations,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toPeerNetworkRangeCheckResponse(check *posture.PeerNetworkRangeCheck) *api.PeerNetworkRangeCheck {
|
|
||||||
netPrefixes := make([]string, 0, len(check.Ranges))
|
|
||||||
for _, netPrefix := range check.Ranges {
|
|
||||||
netPrefixes = append(netPrefixes, netPrefix.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
return &api.PeerNetworkRangeCheck{
|
|
||||||
Ranges: netPrefixes,
|
|
||||||
Action: api.PeerNetworkRangeCheckAction(check.Action),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toPeerNetworkRangeCheck(check *api.PeerNetworkRangeCheck) (*posture.PeerNetworkRangeCheck, error) {
|
|
||||||
prefixes := make([]netip.Prefix, 0)
|
|
||||||
for _, prefix := range check.Ranges {
|
|
||||||
parsedPrefix, err := netip.ParsePrefix(prefix)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
prefixes = append(prefixes, parsedPrefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &posture.PeerNetworkRangeCheck{
|
|
||||||
Ranges: prefixes,
|
|
||||||
Action: string(check.Action),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
@ -95,6 +95,7 @@ type MockAccountManager struct {
|
|||||||
GetIdpManagerFunc func() idp.Manager
|
GetIdpManagerFunc func() idp.Manager
|
||||||
UpdateIntegratedValidatorGroupsFunc func(accountID string, userID string, groups []string) error
|
UpdateIntegratedValidatorGroupsFunc func(accountID string, userID string, groups []string) error
|
||||||
GroupValidationFunc func(accountId string, groups []string) (bool, error)
|
GroupValidationFunc func(accountId string, groups []string) (bool, error)
|
||||||
|
FindExistingPostureCheckFunc func(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (am *MockAccountManager) SyncAndMarkPeer(peerPubKey string, realIP net.IP) (*nbpeer.Peer, *server.NetworkMap, error) {
|
func (am *MockAccountManager) SyncAndMarkPeer(peerPubKey string, realIP net.IP) (*nbpeer.Peer, *server.NetworkMap, error) {
|
||||||
@ -734,3 +735,11 @@ func (am *MockAccountManager) GroupValidation(accountId string, groups []string)
|
|||||||
}
|
}
|
||||||
return false, status.Errorf(codes.Unimplemented, "method GroupValidation is not implemented")
|
return false, status.Errorf(codes.Unimplemented, "method GroupValidation is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindExistingPostureCheck mocks FindExistingPostureCheck of the AccountManager interface
|
||||||
|
func (am *MockAccountManager) FindExistingPostureCheck(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error) {
|
||||||
|
if am.FindExistingPostureCheckFunc != nil {
|
||||||
|
return am.FindExistingPostureCheckFunc(accountID, checks)
|
||||||
|
}
|
||||||
|
return nil, status.Errorf(codes.Unimplemented, "method FindExistingPostureCheck is not implemented")
|
||||||
|
}
|
||||||
|
@ -5,8 +5,11 @@ import (
|
|||||||
"net/netip"
|
"net/netip"
|
||||||
|
|
||||||
"github.com/hashicorp/go-version"
|
"github.com/hashicorp/go-version"
|
||||||
|
"github.com/rs/xid"
|
||||||
|
|
||||||
|
"github.com/netbirdio/netbird/management/server/http/api"
|
||||||
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
||||||
|
"github.com/netbirdio/netbird/management/server/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -136,6 +139,96 @@ func (pc *Checks) GetChecks() []Check {
|
|||||||
return checks
|
return checks
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewChecksFromAPIPostureCheck(source api.PostureCheck) (*Checks, error) {
|
||||||
|
description := ""
|
||||||
|
if source.Description != nil {
|
||||||
|
description = *source.Description
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildPostureCheck(source.Id, source.Name, description, source.Checks)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChecksFromAPIPostureCheckUpdate(source api.PostureCheckUpdate, postureChecksID string) (*Checks, error) {
|
||||||
|
return buildPostureCheck(postureChecksID, source.Name, source.Description, *source.Checks)
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildPostureCheck(postureChecksID string, name string, description string, checks api.Checks) (*Checks, error) {
|
||||||
|
if postureChecksID == "" {
|
||||||
|
postureChecksID = xid.New().String()
|
||||||
|
}
|
||||||
|
|
||||||
|
postureChecks := Checks{
|
||||||
|
ID: postureChecksID,
|
||||||
|
Name: name,
|
||||||
|
Description: description,
|
||||||
|
}
|
||||||
|
|
||||||
|
if nbVersionCheck := checks.NbVersionCheck; nbVersionCheck != nil {
|
||||||
|
postureChecks.Checks.NBVersionCheck = &NBVersionCheck{
|
||||||
|
MinVersion: nbVersionCheck.MinVersion,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if osVersionCheck := checks.OsVersionCheck; osVersionCheck != nil {
|
||||||
|
postureChecks.Checks.OSVersionCheck = &OSVersionCheck{
|
||||||
|
Android: (*MinVersionCheck)(osVersionCheck.Android),
|
||||||
|
Darwin: (*MinVersionCheck)(osVersionCheck.Darwin),
|
||||||
|
Ios: (*MinVersionCheck)(osVersionCheck.Ios),
|
||||||
|
Linux: (*MinKernelVersionCheck)(osVersionCheck.Linux),
|
||||||
|
Windows: (*MinKernelVersionCheck)(osVersionCheck.Windows),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if geoLocationCheck := checks.GeoLocationCheck; geoLocationCheck != nil {
|
||||||
|
postureChecks.Checks.GeoLocationCheck = toPostureGeoLocationCheck(geoLocationCheck)
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
if peerNetworkRangeCheck := checks.PeerNetworkRangeCheck; peerNetworkRangeCheck != nil {
|
||||||
|
postureChecks.Checks.PeerNetworkRangeCheck, err = toPeerNetworkRangeCheck(peerNetworkRangeCheck)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(status.InvalidArgument, "invalid network prefix")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &postureChecks, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pc *Checks) ToAPIResponse() *api.PostureCheck {
|
||||||
|
var checks api.Checks
|
||||||
|
|
||||||
|
if pc.Checks.NBVersionCheck != nil {
|
||||||
|
checks.NbVersionCheck = &api.NBVersionCheck{
|
||||||
|
MinVersion: pc.Checks.NBVersionCheck.MinVersion,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pc.Checks.OSVersionCheck != nil {
|
||||||
|
checks.OsVersionCheck = &api.OSVersionCheck{
|
||||||
|
Android: (*api.MinVersionCheck)(pc.Checks.OSVersionCheck.Android),
|
||||||
|
Darwin: (*api.MinVersionCheck)(pc.Checks.OSVersionCheck.Darwin),
|
||||||
|
Ios: (*api.MinVersionCheck)(pc.Checks.OSVersionCheck.Ios),
|
||||||
|
Linux: (*api.MinKernelVersionCheck)(pc.Checks.OSVersionCheck.Linux),
|
||||||
|
Windows: (*api.MinKernelVersionCheck)(pc.Checks.OSVersionCheck.Windows),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pc.Checks.GeoLocationCheck != nil {
|
||||||
|
checks.GeoLocationCheck = toGeoLocationCheckResponse(pc.Checks.GeoLocationCheck)
|
||||||
|
}
|
||||||
|
|
||||||
|
if pc.Checks.PeerNetworkRangeCheck != nil {
|
||||||
|
checks.PeerNetworkRangeCheck = toPeerNetworkRangeCheckResponse(pc.Checks.PeerNetworkRangeCheck)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &api.PostureCheck{
|
||||||
|
Id: pc.ID,
|
||||||
|
Name: pc.Name,
|
||||||
|
Description: &pc.Description,
|
||||||
|
Checks: checks,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (pc *Checks) Validate() error {
|
func (pc *Checks) Validate() error {
|
||||||
if check := pc.Checks.NBVersionCheck; check != nil {
|
if check := pc.Checks.NBVersionCheck; check != nil {
|
||||||
if !isVersionValid(check.MinVersion) {
|
if !isVersionValid(check.MinVersion) {
|
||||||
@ -192,3 +285,70 @@ func isVersionValid(ver string) bool {
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func toGeoLocationCheckResponse(geoLocationCheck *GeoLocationCheck) *api.GeoLocationCheck {
|
||||||
|
locations := make([]api.Location, 0, len(geoLocationCheck.Locations))
|
||||||
|
for _, loc := range geoLocationCheck.Locations {
|
||||||
|
l := loc // make G601 happy
|
||||||
|
var cityName *string
|
||||||
|
if loc.CityName != "" {
|
||||||
|
cityName = &l.CityName
|
||||||
|
}
|
||||||
|
locations = append(locations, api.Location{
|
||||||
|
CityName: cityName,
|
||||||
|
CountryCode: loc.CountryCode,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &api.GeoLocationCheck{
|
||||||
|
Action: api.GeoLocationCheckAction(geoLocationCheck.Action),
|
||||||
|
Locations: locations,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func toPostureGeoLocationCheck(apiGeoLocationCheck *api.GeoLocationCheck) *GeoLocationCheck {
|
||||||
|
locations := make([]Location, 0, len(apiGeoLocationCheck.Locations))
|
||||||
|
for _, loc := range apiGeoLocationCheck.Locations {
|
||||||
|
cityName := ""
|
||||||
|
if loc.CityName != nil {
|
||||||
|
cityName = *loc.CityName
|
||||||
|
}
|
||||||
|
locations = append(locations, Location{
|
||||||
|
CountryCode: loc.CountryCode,
|
||||||
|
CityName: cityName,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &GeoLocationCheck{
|
||||||
|
Action: string(apiGeoLocationCheck.Action),
|
||||||
|
Locations: locations,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func toPeerNetworkRangeCheckResponse(check *PeerNetworkRangeCheck) *api.PeerNetworkRangeCheck {
|
||||||
|
netPrefixes := make([]string, 0, len(check.Ranges))
|
||||||
|
for _, netPrefix := range check.Ranges {
|
||||||
|
netPrefixes = append(netPrefixes, netPrefix.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &api.PeerNetworkRangeCheck{
|
||||||
|
Ranges: netPrefixes,
|
||||||
|
Action: api.PeerNetworkRangeCheckAction(check.Action),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func toPeerNetworkRangeCheck(check *api.PeerNetworkRangeCheck) (*PeerNetworkRangeCheck, error) {
|
||||||
|
prefixes := make([]netip.Prefix, 0)
|
||||||
|
for _, prefix := range check.Ranges {
|
||||||
|
parsedPrefix, err := netip.ParsePrefix(prefix)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
prefixes = append(prefixes, parsedPrefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &PeerNetworkRangeCheck{
|
||||||
|
Ranges: prefixes,
|
||||||
|
Action: string(check.Action),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -538,6 +539,21 @@ func (s *SqlStore) SaveUserLastLogin(accountID, userID string, lastLogin time.Ti
|
|||||||
return s.db.Save(user).Error
|
return s.db.Save(user).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SqlStore) GetPostureCheckByChecksDefinition(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error) {
|
||||||
|
definitionJSON, err := json.Marshal(checks)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var postureCheck posture.Checks
|
||||||
|
err = s.db.Where("account_id = ? AND checks = ?", accountID, string(definitionJSON)).First(&postureCheck).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &postureCheck, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Close closes the underlying DB connection
|
// Close closes the underlying DB connection
|
||||||
func (s *SqlStore) Close() error {
|
func (s *SqlStore) Close() error {
|
||||||
sql, err := s.db.DB()
|
sql, err := s.db.DB()
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
|
|
||||||
"github.com/netbirdio/netbird/management/server/migration"
|
"github.com/netbirdio/netbird/management/server/migration"
|
||||||
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
||||||
|
"github.com/netbirdio/netbird/management/server/posture"
|
||||||
"github.com/netbirdio/netbird/management/server/telemetry"
|
"github.com/netbirdio/netbird/management/server/telemetry"
|
||||||
"github.com/netbirdio/netbird/management/server/testutil"
|
"github.com/netbirdio/netbird/management/server/testutil"
|
||||||
"github.com/netbirdio/netbird/route"
|
"github.com/netbirdio/netbird/route"
|
||||||
@ -31,6 +32,7 @@ type Store interface {
|
|||||||
GetAccountByPrivateDomain(domain string) (*Account, error)
|
GetAccountByPrivateDomain(domain string) (*Account, error)
|
||||||
GetTokenIDByHashedToken(secret string) (string, error)
|
GetTokenIDByHashedToken(secret string) (string, error)
|
||||||
GetUserByTokenID(tokenID string) (*User, error)
|
GetUserByTokenID(tokenID string) (*User, error)
|
||||||
|
GetPostureCheckByChecksDefinition(accountID string, checks *posture.ChecksDefinition) (*posture.Checks, error)
|
||||||
SaveAccount(account *Account) error
|
SaveAccount(account *Account) error
|
||||||
DeleteHashedPAT2TokenIDIndex(hashedToken string) error
|
DeleteHashedPAT2TokenIDIndex(hashedToken string) error
|
||||||
DeleteTokenID2UserIDIndex(tokenID string) error
|
DeleteTokenID2UserIDIndex(tokenID string) error
|
||||||
|
Loading…
Reference in New Issue
Block a user