163 lines
4.7 KiB
Go
163 lines
4.7 KiB
Go
|
|
||
|
// myBlockedUsers provides functions to manage a user's blocked users
|
||
|
|
||
|
package myBlockedUsers
|
||
|
|
||
|
import "seekia/internal/encoding"
|
||
|
import "seekia/internal/helpers"
|
||
|
import "seekia/internal/identity"
|
||
|
import "seekia/internal/myDatastores/myMapList"
|
||
|
|
||
|
|
||
|
import "sync"
|
||
|
import "errors"
|
||
|
import "time"
|
||
|
|
||
|
// We will lock this when we are adding users
|
||
|
// This is needed to prevent adding duplicates
|
||
|
var addingBlockedUsersMutex sync.Mutex
|
||
|
|
||
|
var myBlockedUsersMapListDatastore *myMapList.MyMapList
|
||
|
|
||
|
// This function must be called whenever an app user signs in
|
||
|
func InitializeMyBlockedUsersDatastore()error{
|
||
|
|
||
|
newMyBlockedUsersMapListDatastore, err := myMapList.CreateNewMapList("MyBlockedUsers")
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
myBlockedUsersMapListDatastore = newMyBlockedUsersMapListDatastore
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func BlockUser(identityHash [16]byte, reasonProvided bool, reason string)error{
|
||
|
|
||
|
addingBlockedUsersMutex.Lock()
|
||
|
defer addingBlockedUsersMutex.Unlock()
|
||
|
|
||
|
userIsBlocked, _, _, _, err := CheckIfUserIsBlocked(identityHash)
|
||
|
if (err != nil) { return err }
|
||
|
if (userIsBlocked == true){
|
||
|
// This should not happen, GUI should prevent this
|
||
|
return errors.New("BlockUser called on user who is already blocked.")
|
||
|
}
|
||
|
|
||
|
identityHashString, _, err := identity.EncodeIdentityHashBytesToString(identityHash)
|
||
|
if (err != nil){
|
||
|
identityHashHex := encoding.EncodeBytesToHexString(identityHash[:])
|
||
|
return errors.New("BlockUser called with unvalid identityHash: " + identityHashHex)
|
||
|
}
|
||
|
|
||
|
currentTimeInt := time.Now().Unix()
|
||
|
currentTimeString := helpers.ConvertInt64ToString(currentTimeInt)
|
||
|
|
||
|
newMapItem := map[string]string{
|
||
|
"IdentityHash": identityHashString,
|
||
|
"BlockedTime": currentTimeString,
|
||
|
}
|
||
|
|
||
|
if (reasonProvided == true){
|
||
|
newMapItem["Reason"] = reason
|
||
|
}
|
||
|
|
||
|
err = myBlockedUsersMapListDatastore.AddMapListItem(newMapItem)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func UnblockUser(identityHash [16]byte)error{
|
||
|
|
||
|
identityHashString, _, err := identity.EncodeIdentityHashBytesToString(identityHash)
|
||
|
if (err != nil){
|
||
|
identityHashHex := encoding.EncodeBytesToHexString(identityHash[:])
|
||
|
return errors.New("UnblockUser called with invalid identityHash: " + identityHashHex)
|
||
|
}
|
||
|
|
||
|
mapToDelete := map[string]string{
|
||
|
"IdentityHash": identityHashString,
|
||
|
}
|
||
|
|
||
|
err = myBlockedUsersMapListDatastore.DeleteMapListItems(mapToDelete)
|
||
|
if (err != nil) { return err }
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func GetMyBlockedUsersMapList(identityType string)([]map[string]string, error){
|
||
|
|
||
|
allMyBlockedUsersMapList, err := myBlockedUsersMapListDatastore.GetMapList()
|
||
|
if (err != nil) { return nil, err }
|
||
|
|
||
|
myBlockedUsersMapList := make([]map[string]string, 0)
|
||
|
|
||
|
for _, userMap := range allMyBlockedUsersMapList{
|
||
|
|
||
|
currentIdentityHashString, exists := userMap["IdentityHash"]
|
||
|
if (exists == false) {
|
||
|
return nil, errors.New("MyBlockedUsers map list item missing IdentityHash")
|
||
|
}
|
||
|
|
||
|
_, currentIdentityType, err := identity.ReadIdentityHashString(currentIdentityHashString)
|
||
|
if (err != nil) {
|
||
|
return nil, errors.New("MyBlockedUsers map list item contains invalid IdentityHash.")
|
||
|
}
|
||
|
if (currentIdentityType == identityType) {
|
||
|
|
||
|
myBlockedUsersMapList = append(myBlockedUsersMapList, userMap)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return myBlockedUsersMapList, nil
|
||
|
}
|
||
|
|
||
|
//Outputs:
|
||
|
// -bool: User is blocked
|
||
|
// -int64: Unix time of blocking (if user is blocked)
|
||
|
// -bool: Reason provided
|
||
|
// -string: Reason for blocking
|
||
|
// -error
|
||
|
func CheckIfUserIsBlocked(identityHash [16]byte)(bool, int64, bool, string, error){
|
||
|
|
||
|
identityHashString, _, err := identity.EncodeIdentityHashBytesToString(identityHash)
|
||
|
if (err != nil){
|
||
|
identityHashHex := encoding.EncodeBytesToHexString(identityHash[:])
|
||
|
return false, 0, false, "", errors.New("CheckIfUserIsBlocked called with invalid identity hash: " + identityHashHex)
|
||
|
}
|
||
|
|
||
|
lookupMap := map[string]string{
|
||
|
"IdentityHash": identityHashString,
|
||
|
}
|
||
|
|
||
|
anyItemsFound, blockedUsersMapList, err := myBlockedUsersMapListDatastore.GetMapListItems(lookupMap)
|
||
|
if (err != nil) { return false, 0, false, "", err }
|
||
|
if (anyItemsFound == false){
|
||
|
return false, 0, false, "", nil
|
||
|
}
|
||
|
|
||
|
if (len(blockedUsersMapList) != 1){
|
||
|
return false, 0, false, "", errors.New("Blocked users map list contains more than 1 entry for an identity hash")
|
||
|
}
|
||
|
|
||
|
blockedUserMapItem := blockedUsersMapList[0]
|
||
|
|
||
|
blockedTimeString, exists := blockedUserMapItem["BlockedTime"]
|
||
|
if (exists == false) {
|
||
|
return false, 0, false, "", errors.New("Blocked users map list contains item missing BlockedTime")
|
||
|
}
|
||
|
|
||
|
blockedTimeInt64, err := helpers.ConvertStringToInt64(blockedTimeString)
|
||
|
if (err != nil) {
|
||
|
return false, 0, false, "", errors.New("My Blocked Users map list contains invalid BlockedTime: " + blockedTimeString)
|
||
|
}
|
||
|
|
||
|
reason, exists := blockedUserMapItem["Reason"]
|
||
|
if (exists == false){
|
||
|
return true, blockedTimeInt64, false, "", nil
|
||
|
}
|
||
|
|
||
|
return true, blockedTimeInt64, true, reason, nil
|
||
|
}
|
||
|
|
||
|
|