seekia/internal/network/hostRanges/hostRanges.go

136 lines
6.1 KiB
Go
Raw Normal View History

// hostRanges provides functions to retrieve a host's hosted ranges from their profile map
package hostRanges
import "seekia/internal/byteRange"
import "seekia/internal/encoding"
import "seekia/internal/messaging/inbox"
import "seekia/internal/profiles/readProfiles"
import messagepack "github.com/vmihailenco/msgpack/v5"
import "errors"
//Outputs:
// -bool: Host is hosting any provided identityType content
// -[16]byte: Hosted Identity hash range start
// -[16]byte: Hosted Identity hash range end
// -error
func GetHostedIdentityHashRangeFromHostRawProfileMap(hostRawProfileMap map[int]messagepack.RawMessage, identityType string)(bool, [16]byte, [16]byte, error){
if (identityType != "Mate" && identityType != "Host" && identityType != "Moderator"){
return false, [16]byte{}, [16]byte{}, errors.New("GetHostedIdentityHashRangeFromHostRawProfileMap called with invalid identityType: " + identityType)
}
hostIsDisabled, _, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "Disabled")
if (err != nil) { return false, [16]byte{}, [16]byte{}, err }
if (hostIsDisabled == true){
return false, [16]byte{}, [16]byte{}, nil
}
exists, hostingIdentityTypeContent, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "Hosting" + identityType + "Content")
if (err != nil) { return false, [16]byte{}, [16]byte{}, err }
if (exists == false){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains Host profile map missing Hosting" + identityType + "Content")
}
if (hostingIdentityTypeContent != "Yes"){
return false, [16]byte{}, [16]byte{}, nil
}
if (identityType != "Mate"){
// Hosts must host either all or none of Host/Moderator content
minimumIdentityBound, maximumIdentityBound := byteRange.GetMinimumMaximumIdentityHashBounds()
return true, minimumIdentityBound, maximumIdentityBound, nil
}
exists, theirMateHostRangeStartString, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "MateIdentitiesRangeStart")
if (err != nil) { return false, [16]byte{}, [16]byte{}, err }
if (exists == false){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains host profile missing MateIdentitiesRangeStart")
}
exists, theirMateHostRangeEndString, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "MateIdentitiesRangeEnd")
if (err != nil) { return false, [16]byte{}, [16]byte{}, err }
if (exists == false){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains host profile missing MateIdentitiesRangeEnd")
}
theirMateHostRangeStartBytes, err := encoding.DecodeHexStringToBytes(theirMateHostRangeStartString)
if (err != nil){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains host profile containing invalid MateIdentitiesRangeStart: Not Hex: " + theirMateHostRangeStartString)
}
if (len(theirMateHostRangeStartBytes) != 16){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains host profile containing invalid MateIdentitiesRangeStart: Invalid length: " + theirMateHostRangeStartString)
}
theirMateHostRangeStart := [16]byte(theirMateHostRangeStartBytes)
theirMateHostRangeEndBytes, err := encoding.DecodeHexStringToBytes(theirMateHostRangeEndString)
if (err != nil){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains host profile containing invalid MateIdentitiesRangeEnd: Not Hex: " + theirMateHostRangeEndString)
}
if (len(theirMateHostRangeEndBytes) != 16){
return false, [16]byte{}, [16]byte{}, errors.New("Database corrupt: Contains host profile containing invalid MateIdentitiesRangeEnd: Invalid length: " + theirMateHostRangeEndString)
}
theirMateHostRangeEnd := [16]byte(theirMateHostRangeEndBytes)
return true, theirMateHostRangeStart, theirMateHostRangeEnd, nil
}
//Outputs:
// -bool: Host is hosting any messages
// -[10]byte: Hosted message Inbox range start
// -[10]byte: Hosted message inbox range end
// -error
func GetHostedMessageInboxesRangeFromHostRawProfileMap(hostRawProfileMap map[int]messagepack.RawMessage)(bool, [10]byte, [10]byte, error){
hostIsDisabled, _, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "Disabled")
if (err != nil) { return false, [10]byte{}, [10]byte{}, err }
if (hostIsDisabled == true){
return false, [10]byte{}, [10]byte{}, nil
}
exists, hostingMessages, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "HostingMessages")
if (err != nil) { return false, [10]byte{}, [10]byte{}, err }
if (exists == false) {
return false, [10]byte{}, [10]byte{}, errors.New("Database corrupt: Contains host profile missing HostingMessages")
}
if (hostingMessages != "Yes"){
return false, [10]byte{}, [10]byte{}, nil
}
exists, theirInboxHostRangeStartString, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "MessageInboxesRangeStart")
if (err != nil) { return false, [10]byte{}, [10]byte{}, err }
if (exists == false){
return false, [10]byte{}, [10]byte{}, errors.New("Database corrupt: Contains host profile missing MessageInboxesRangeStart")
}
exists, theirInboxHostRangeEndString, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(hostRawProfileMap, "MessageInboxesRangeEnd")
if (err != nil) { return false, [10]byte{}, [10]byte{}, err }
if (exists == false){
return false, [10]byte{}, [10]byte{}, errors.New("Database corrupt: Contains host profile missing MessageInboxesRangeEnd")
}
theirInboxHostRangeStart, err := inbox.ReadInboxString(theirInboxHostRangeStartString)
if (err != nil){
return false, [10]byte{}, [10]byte{}, errors.New("Database corrupt: Contains host profile with invalid MessageInboxesRangeStart: " + theirInboxHostRangeStartString)
}
theirInboxHostRangeEnd, err := inbox.ReadInboxString(theirInboxHostRangeEndString)
if (err != nil){
return false, [10]byte{}, [10]byte{}, errors.New("Database corrupt: Contains host profile with invalid MessageInboxesRangeEnd: " + theirInboxHostRangeEndString)
}
return true, theirInboxHostRangeStart, theirInboxHostRangeEnd, nil
}