seekia/internal/network/enabledHosts/enabledHosts.go

144 lines
4.2 KiB
Go

// enabledHosts provides functions to retrieve and refresh a list of all enabled hosts
// An enabled host is a host whose profile is not disabled
package enabledHosts
import "seekia/internal/badgerDatabase"
import "seekia/internal/helpers"
import "seekia/internal/profiles/profileStorage"
import "seekia/internal/profiles/readProfiles"
import "errors"
import "sync"
import "slices"
var enabledHostsListMutex sync.RWMutex
// This list stores all enabled hosts
// It will not necessarily be up to date
var enabledHostsList [][16]byte
// This variable stores the network type that the enabledHostsList belongs to
var enabledHostsListNetworkType byte
// This function must be called upon application startup, and then again on a regular automatic interval
// It is also used when refreshing viewedHosts
// It should also be called whenever the application network type is changed
func UpdateEnabledHostsList(networkType byte)error{
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return errors.New("UpdateEnabledHostsList called with invalid networkType: " + networkTypeString)
}
_, err := GetEnabledHostsList(false, networkType)
if (err != nil){ return err }
return nil
}
func GetNumberOfEnabledHosts(allowCache bool, networkType byte)(int, error){
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return 0, errors.New("GetNumberOfEnabledHosts called with invalid networkType: " + networkTypeString)
}
currentEnabledHostsList, err := GetEnabledHostsList(allowCache, networkType)
if (err != nil){ return 0, err }
numberOfHosts := len(currentEnabledHostsList)
return numberOfHosts, nil
}
func CheckIfHostIsEnabled(allowCache bool, hostIdentityHash [16]byte, networkType byte)(bool, error){
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return false, errors.New("CheckIfHostIsEnabled called with invalid networkType: " + networkTypeString)
}
currentEnabledHostsList, err := GetEnabledHostsList(allowCache, networkType)
if (err != nil){ return false, err }
isEnabled := slices.Contains(currentEnabledHostsList, hostIdentityHash)
return isEnabled, nil
}
//Outputs:
// -[][16]byte: List of enabled host identity hashes
// -error
func GetEnabledHostsList(allowCache bool, networkType byte)([][16]byte, error){
isValid := helpers.VerifyNetworkType(networkType)
if (isValid == false){
networkTypeString := helpers.ConvertByteToString(networkType)
return nil, errors.New("GetEnabledHostsList called with invalid networkType: " + networkTypeString)
}
if (allowCache == true){
enabledHostsListMutex.RLock()
if (enabledHostsList != nil && enabledHostsListNetworkType == networkType){
// A cache list is generated which belongs to the specified networkType
listCopy := slices.Clone(enabledHostsList)
enabledHostsListMutex.RUnlock()
return listCopy, nil
}
// We must generate a new enabled hosts cache list
enabledHostsListMutex.RUnlock()
}
hostIdentityHashesList, err := badgerDatabase.GetAllProfileIdentityHashes("Host")
if (err != nil) { return nil, err }
newEnabledHostsList := make([][16]byte, 0)
for _, identityHash := range hostIdentityHashesList{
profileExists, _, _, _, _, newestRawProfileMap, err := profileStorage.GetNewestUserProfile(identityHash, networkType)
if (err != nil) { return nil, err }
if (profileExists == false){
// Profile does not exist anymore.
// Missing entries from Identity Profiles list will be removed automatically by backgroundJobs
continue
}
profileIsDisabled, _, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(newestRawProfileMap, "Disabled")
if (err != nil) { return nil, err }
if (profileIsDisabled == true){
continue
}
newEnabledHostsList = append(newEnabledHostsList, identityHash)
}
enabledHostsListMutex.Lock()
enabledHostsList = newEnabledHostsList
enabledHostsListNetworkType = networkType
listCopy := slices.Clone(enabledHostsList)
enabledHostsListMutex.Unlock()
return listCopy, nil
}