372 lines
15 KiB
Go
372 lines
15 KiB
Go
|
|
||
|
// myRanges provides functions to retrieve and modify a user's Host and Moderator ranges
|
||
|
// These ranges define what portion of the Seekia network the user will host and/or moderate
|
||
|
|
||
|
package myRanges
|
||
|
|
||
|
// Moderator and Host Mode each have 4 types of ranges:
|
||
|
// -Mate identities
|
||
|
// -Host identities (For Host mode, we either host all or none)
|
||
|
// -Moderator identities (For Host or Moderator mode, we either host all or none)
|
||
|
// -Messages inboxes
|
||
|
|
||
|
// A user's ranges define what profiles and messages they will download
|
||
|
// Profiles to download are determined by the identity hash of the profile author
|
||
|
// Messages to download are determined by the Message's inbox
|
||
|
|
||
|
// For profiles/messages a user is hosting/moderating, they will also download all reviews and reports for the profiles/messages.
|
||
|
|
||
|
// Identity reviews/reports to download are determined by the reviewed/reported identity hash
|
||
|
// Profile/Attribute reviews/reports to download are determined by the reviewed/reported profile author identity hash
|
||
|
// Message reviews/reports to download are determined by the reviewed/reported message's inbox
|
||
|
|
||
|
//TODO: For moderation ranges, there must be a way to stop hosting content within our range, after we have reviewed it
|
||
|
// We have to keep track of this dropped content, and check for it within the backgroundDownloads package
|
||
|
|
||
|
import "seekia/internal/byteRange"
|
||
|
import "seekia/internal/encoding"
|
||
|
import "seekia/internal/identity"
|
||
|
import "seekia/internal/messaging/inbox"
|
||
|
import "seekia/internal/mySettings"
|
||
|
|
||
|
import "errors"
|
||
|
|
||
|
func AdjustMyRanges(myIdentityType string)error{
|
||
|
|
||
|
//TODO
|
||
|
// This function will see how much disk space is available, and adjust the moderation and host ranges accordingly
|
||
|
// This function is run by backgroundJobs on a regular schedule
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Host mode enabled
|
||
|
// -bool: Identity is within my host range
|
||
|
// -error
|
||
|
func CheckIfIdentityHashIsWithinMyHostedRange(identityHash [16]byte)(bool, bool, error){
|
||
|
|
||
|
identityType, err := identity.GetIdentityTypeFromIdentityHash(identityHash)
|
||
|
if (err != nil) {
|
||
|
identityHashHex := encoding.EncodeBytesToHexString(identityHash[:])
|
||
|
return false, false, errors.New("CheckIfIdentityHashIsWithinMyHostedRange called with invalid identityHash: " + identityHashHex)
|
||
|
}
|
||
|
|
||
|
hostModeEnabled, hostingAnyIdentities, myIdentityRangeStart, myIdentityRangeEnd, err := GetMyIdentitiesToHostRange(identityType)
|
||
|
if (err != nil) { return false, false, err }
|
||
|
if (hostModeEnabled == false){
|
||
|
return false, false, nil
|
||
|
}
|
||
|
if (hostingAnyIdentities == false){
|
||
|
return true, false, nil
|
||
|
}
|
||
|
if (identityType != "Mate"){
|
||
|
// Hosts must host either all or none of the Host/moderator identities, so no range check is needed
|
||
|
return true, true, nil
|
||
|
}
|
||
|
|
||
|
isWithinRange, err := byteRange.CheckIfIdentityHashIsWithinRange(myIdentityRangeStart, myIdentityRangeEnd, identityHash)
|
||
|
if (err != nil) { return false, false, err }
|
||
|
|
||
|
return true, isWithinRange, nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Host mode enabled
|
||
|
// -bool: Hosting any identities of provided identityType
|
||
|
// -[16]byte: Identity hash range start
|
||
|
// -[16]byte: Identity hash range end
|
||
|
// -error
|
||
|
func GetMyIdentitiesToHostRange(identityType string)(bool, bool, [16]byte, [16]byte, error){
|
||
|
|
||
|
if (identityType != "Mate" && identityType != "Host" && identityType != "Moderator"){
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("GetMyIdentitiesToHostRange called with invalid identityType: " + identityType)
|
||
|
}
|
||
|
|
||
|
settingExists, hostModeOnOffStatus, err := mySettings.GetSetting("HostModeOnOffStatus")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == false || hostModeOnOffStatus != "On"){
|
||
|
return false, false, [16]byte{}, [16]byte{}, nil
|
||
|
}
|
||
|
settingExists, hostingIdentityTypeContent, err := mySettings.GetSetting("Hosting" + identityType + "Content")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == true && hostingIdentityTypeContent == "No"){
|
||
|
// The default is for all identityType content to be hosted
|
||
|
return true, false, [16]byte{}, [16]byte{}, nil
|
||
|
}
|
||
|
|
||
|
if (identityType != "Mate"){
|
||
|
// Hosts will host either all or none of host/moderator identities
|
||
|
minimumIdentityBound, maximumIdentityBound := byteRange.GetMinimumMaximumIdentityHashBounds()
|
||
|
|
||
|
return true, true, minimumIdentityBound, maximumIdentityBound, nil
|
||
|
}
|
||
|
|
||
|
settingExists, hostedMateRangeStartString, err := mySettings.GetSetting("HostedMateContentRangeStart")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == false){
|
||
|
// The default range is all identities.
|
||
|
// The client will automatically reduce this range if storage limits are reached.
|
||
|
minimumIdentityBound, maximumIdentityBound := byteRange.GetMinimumMaximumIdentityHashBounds()
|
||
|
return true, true, minimumIdentityBound, maximumIdentityBound, nil
|
||
|
}
|
||
|
|
||
|
settingExists, hostedMateRangeEndString, err := mySettings.GetSetting("HostedMateContentRangeEnd")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == false){
|
||
|
// This should not happen.
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("HostedMateContentRangeStart exists but no end range found.")
|
||
|
}
|
||
|
|
||
|
hostedMateRangeStart, _, err := identity.ReadIdentityHashString(hostedMateRangeStartString)
|
||
|
if (err != nil){
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("HostedMateContentRangeStart is invalid: " + hostedMateRangeStartString)
|
||
|
}
|
||
|
|
||
|
hostedMateRangeEnd, _, err := identity.ReadIdentityHashString(hostedMateRangeEndString)
|
||
|
if (err != nil){
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("HostedMateContentRangeEnd is invalid: " + hostedMateRangeEndString)
|
||
|
}
|
||
|
|
||
|
return true, true, hostedMateRangeStart, hostedMateRangeEnd, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Host mode enabled
|
||
|
// -bool: Inbox is within my hosted range
|
||
|
// -error
|
||
|
func CheckIfMessageInboxIsWithinMyHostedRange(messageInbox [10]byte)(bool, bool, error){
|
||
|
|
||
|
hostModeEnabled, hostingAnyInboxes, myInboxRangeStart, myInboxRangeEnd, err := GetMyInboxesToHostRange()
|
||
|
if (err != nil) { return false, false, err }
|
||
|
if (hostModeEnabled == false){
|
||
|
return false, false, nil
|
||
|
}
|
||
|
if (hostingAnyInboxes == false){
|
||
|
return true, false, nil
|
||
|
}
|
||
|
|
||
|
isWithinRange, err := byteRange.CheckIfInboxIsWithinRange(myInboxRangeStart, myInboxRangeEnd, messageInbox)
|
||
|
if (err != nil) { return false, false, err }
|
||
|
|
||
|
return true, isWithinRange, nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Host mode enabled
|
||
|
// -bool: Hosting any inboxes
|
||
|
// -[10]byte: Inbox range start
|
||
|
// -[10]byte: Inbox range end
|
||
|
// -error
|
||
|
func GetMyInboxesToHostRange()(bool, bool, [10]byte, [10]byte, error){
|
||
|
|
||
|
settingExists, hostModeOnOffStatus, err := mySettings.GetSetting("HostModeOnOffStatus")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (settingExists == false || hostModeOnOffStatus != "On"){
|
||
|
return false, false, [10]byte{}, [10]byte{}, nil
|
||
|
}
|
||
|
settingExists, hostMessagesOnOffStatus, err := mySettings.GetSetting("HostMessagesOnOffStatus")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (settingExists == false || hostMessagesOnOffStatus != "On"){
|
||
|
// The default is off
|
||
|
return true, false, [10]byte{}, [10]byte{}, nil
|
||
|
}
|
||
|
|
||
|
settingExists, hostedInboxRangeStartString, err := mySettings.GetSetting("HostedInboxRangeStart")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (settingExists == false){
|
||
|
|
||
|
// The default range is all inboxes
|
||
|
|
||
|
minimumInboxBound, maximumInboxBound := byteRange.GetMinimumMaximumInboxBounds()
|
||
|
|
||
|
return true, true, minimumInboxBound, maximumInboxBound, nil
|
||
|
}
|
||
|
|
||
|
settingExists, hostedInboxRangeEndString, err := mySettings.GetSetting("HostedInboxRangeEnd")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (settingExists == false){
|
||
|
// This should not happen.
|
||
|
return false, false, [10]byte{}, [10]byte{}, errors.New("HostedInboxRangeStart exists but no end range found.")
|
||
|
}
|
||
|
|
||
|
hostedInboxRangeStart, err := inbox.ReadInboxString(hostedInboxRangeStartString)
|
||
|
if (err != nil) {
|
||
|
return false, false, [10]byte{}, [10]byte{}, errors.New("HostedInboxRangeStart is invalid: " + hostedInboxRangeStartString)
|
||
|
}
|
||
|
|
||
|
hostedInboxRangeEnd, err := inbox.ReadInboxString(hostedInboxRangeEndString)
|
||
|
if (err != nil) {
|
||
|
return false, false, [10]byte{}, [10]byte{}, errors.New("HostedInboxRangeEnd is invalid: " + hostedInboxRangeEndString)
|
||
|
}
|
||
|
|
||
|
return true, true, hostedInboxRangeStart, hostedInboxRangeEnd, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Moderator mode enabled
|
||
|
// -bool: Identity is within my moderation range
|
||
|
// -error
|
||
|
func CheckIfIdentityHashIsWithinMyModerationRange(identityHash [16]byte)(bool, bool, error){
|
||
|
|
||
|
identityType, err := identity.GetIdentityTypeFromIdentityHash(identityHash)
|
||
|
if (err != nil) {
|
||
|
identityHashHex := encoding.EncodeBytesToHexString(identityHash[:])
|
||
|
return false, false, errors.New("CheckIfIdentityHashIsWithinMyModerationRange called with invalid identityHash: " + identityHashHex)
|
||
|
}
|
||
|
|
||
|
moderatorModeEnabled, moderatingAny, myIdentityRangeStart, myIdentityRangeEnd, err := GetMyIdentitiesToModerateRange(identityType)
|
||
|
if (err != nil) { return false, false, err }
|
||
|
if (moderatorModeEnabled == false){
|
||
|
return false, false, nil
|
||
|
}
|
||
|
if (moderatingAny == false){
|
||
|
return true, false, nil
|
||
|
}
|
||
|
|
||
|
isWithinRange, err := byteRange.CheckIfIdentityHashIsWithinRange(myIdentityRangeStart, myIdentityRangeEnd, identityHash)
|
||
|
if (err != nil) { return false, false, err }
|
||
|
|
||
|
return true, isWithinRange, nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Moderator mode enabled
|
||
|
// -bool: Moderating any identities of requested identityType
|
||
|
// -[16]byte: Identity hash Range start
|
||
|
// -[16]byte: Identity hash Range end
|
||
|
// -error
|
||
|
func GetMyIdentitiesToModerateRange(identityType string)(bool, bool, [16]byte, [16]byte, error){
|
||
|
|
||
|
if (identityType != "Mate" && identityType != "Host" && identityType != "Moderator"){
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("GetMyIdentitiesToModerateRange called with invalid identityType: " + identityType)
|
||
|
}
|
||
|
|
||
|
settingExists, moderatorModeOnOffStatus, err := mySettings.GetSetting("ModeratorModeOnOffStatus")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == false || moderatorModeOnOffStatus != "On"){
|
||
|
return false, false, [16]byte{}, [16]byte{}, nil
|
||
|
}
|
||
|
settingExists, moderatingContentStatus, err := mySettings.GetSetting("Moderate" + identityType + "ContentOnOffStatus")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == true && moderatingContentStatus == "Off"){
|
||
|
// This setting is on by default
|
||
|
return true, false, [16]byte{}, [16]byte{}, nil
|
||
|
}
|
||
|
|
||
|
if (identityType == "Moderator"){
|
||
|
// The default is all identities
|
||
|
minimumIdentityBound, maximumIdentityBound := byteRange.GetMinimumMaximumIdentityHashBounds()
|
||
|
|
||
|
return true, true, minimumIdentityBound, maximumIdentityBound, nil
|
||
|
}
|
||
|
|
||
|
settingExists, moderatedContentRangeStartString, err := mySettings.GetSetting("Moderated" + identityType + "ContentRangeStart")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == false){
|
||
|
// The default is all identities
|
||
|
minimumIdentityBound, maximumIdentityBound := byteRange.GetMinimumMaximumIdentityHashBounds()
|
||
|
|
||
|
return true, true, minimumIdentityBound, maximumIdentityBound, nil
|
||
|
}
|
||
|
|
||
|
settingExists, moderatedContentRangeEndString, err := mySettings.GetSetting("Moderated" + identityType + "ContentRangeEnd")
|
||
|
if (err != nil) { return false, false, [16]byte{}, [16]byte{}, err }
|
||
|
if (settingExists == false){
|
||
|
// This should not happen.
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("Moderated" + identityType + "ContentRangeStart exists, but no end range found.")
|
||
|
}
|
||
|
|
||
|
moderatedContentRangeStart, _, err := identity.ReadIdentityHashString(moderatedContentRangeStartString)
|
||
|
if (err != nil){
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("Moderated" + identityType + "ContentRangeStart is invalid: " + moderatedContentRangeStartString)
|
||
|
}
|
||
|
|
||
|
moderatedContentRangeEnd, _, err := identity.ReadIdentityHashString(moderatedContentRangeEndString)
|
||
|
if (err != nil){
|
||
|
return false, false, [16]byte{}, [16]byte{}, errors.New("Moderated" + identityType + "ContentRangeEnd is invalid: " + moderatedContentRangeEndString)
|
||
|
}
|
||
|
|
||
|
return true, true, moderatedContentRangeStart, moderatedContentRangeEnd, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Moderator mode enabled
|
||
|
// -bool: Inbox is within my moderation range
|
||
|
// -error
|
||
|
func CheckIfMessageInboxIsWithinMyModerationRange(messageInbox [10]byte)(bool, bool, error){
|
||
|
|
||
|
moderatorModeEnabled, moderatingAny, myInboxRangeStart, myInboxRangeEnd, err := GetMyInboxesToModerateRange()
|
||
|
if (err != nil) { return false, false, err }
|
||
|
if (moderatorModeEnabled == false){
|
||
|
return false, false, nil
|
||
|
}
|
||
|
if (moderatingAny == false){
|
||
|
return true, false, nil
|
||
|
}
|
||
|
|
||
|
isWithinRange, err := byteRange.CheckIfInboxIsWithinRange(myInboxRangeStart, myInboxRangeEnd, messageInbox)
|
||
|
if (err != nil) { return false, false, err }
|
||
|
|
||
|
return true, isWithinRange, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: Moderator mode enabled
|
||
|
// -bool: Moderating any messages
|
||
|
// -[10]byte: Inbox Range start
|
||
|
// -[10]byte: Inbox Range end
|
||
|
// -error
|
||
|
func GetMyInboxesToModerateRange()(bool, bool, [10]byte, [10]byte, error){
|
||
|
|
||
|
settingExists, moderatorModeOnOffStatus, err := mySettings.GetSetting("ModeratorModeOnOffStatus")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (settingExists == false || moderatorModeOnOffStatus != "On"){
|
||
|
return false, false, [10]byte{}, [10]byte{}, nil
|
||
|
}
|
||
|
exists, moderatingMessages, err := mySettings.GetSetting("ModerateMessagesOnOffStatus")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (exists == false || moderatingMessages != "On"){
|
||
|
// The default is off
|
||
|
return true, false, [10]byte{}, [10]byte{}, nil
|
||
|
}
|
||
|
|
||
|
exists, moderatedInboxRangeStartString, err := mySettings.GetSetting("ModeratedInboxRangeStart")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (exists == false){
|
||
|
|
||
|
// The default is to moderate all messages
|
||
|
// This will be automatically reduced if size exceeds available disk space
|
||
|
|
||
|
minimumInboxBound, maximumInboxBound := byteRange.GetMinimumMaximumInboxBounds()
|
||
|
|
||
|
return true, true, minimumInboxBound, maximumInboxBound, nil
|
||
|
}
|
||
|
|
||
|
exists, moderatedInboxRangeEndString, err := mySettings.GetSetting("ModeratedInboxRangeEnd")
|
||
|
if (err != nil) { return false, false, [10]byte{}, [10]byte{}, err }
|
||
|
if (exists == false){
|
||
|
return false, false, [10]byte{}, [10]byte{}, errors.New("ModeratedInboxRangeStart exists but no end range found.")
|
||
|
}
|
||
|
|
||
|
moderatedInboxRangeStart, err := inbox.ReadInboxString(moderatedInboxRangeStartString)
|
||
|
if (err != nil) {
|
||
|
return false, false, [10]byte{}, [10]byte{}, errors.New("ModeratedInboxRangeStart is invalid: " + moderatedInboxRangeStartString)
|
||
|
}
|
||
|
|
||
|
moderatedInboxRangeEnd, err := inbox.ReadInboxString(moderatedInboxRangeEndString)
|
||
|
if (err != nil) {
|
||
|
return false, false, [10]byte{}, [10]byte{}, errors.New("ModeratedInboxRangeEnd is invalid: " + moderatedInboxRangeEndString)
|
||
|
}
|
||
|
|
||
|
return true, true, moderatedInboxRangeStart, moderatedInboxRangeEnd, nil
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|