khatru-pyramid/whitelist.go

111 lines
2.4 KiB
Go
Raw Normal View History

2023-09-06 20:49:18 +02:00
package main
import (
"context"
"encoding/json"
"os"
"github.com/nbd-wtf/go-nostr"
)
type WhitelistEntry struct {
2023-10-16 23:09:12 -03:00
PublicKey string `json:"pk"`
2023-09-06 20:49:18 +02:00
InvitedBy string `json:"invited_by"`
}
var whitelist []WhitelistEntry
2023-09-06 20:49:18 +02:00
func whitelistRejecter(ctx context.Context, evt *nostr.Event) (reject bool, msg string) {
// check if user in whitelist
2023-10-18 11:58:09 -03:00
if !isPublicKeyInWhitelist(evt.PubKey) {
2023-09-06 20:49:18 +02:00
return true, "You are not invited to this relay"
}
2023-10-11 22:26:31 +02:00
/*
kind 20201
invited/whitelisted user invites new user
*/
if evt.Kind == 20201 {
2023-09-06 20:49:18 +02:00
pTags := evt.Tags.GetAll([]string{"p"})
for _, tag := range pTags {
2023-10-18 11:58:09 -03:00
if nostr.IsValidPublicKeyHex(tag.Value()) && !isPublicKeyInWhitelist(tag.Value()) {
whitelist = append(whitelist, WhitelistEntry{PublicKey: tag.Value(), InvitedBy: evt.PubKey})
2023-09-06 20:49:18 +02:00
}
}
}
2023-10-11 22:26:31 +02:00
/*
kind 20202
p tag = user removes user they invited OR admin removes user
e tag = admin removes event
*/
if evt.Kind == 20202 {
2023-09-06 20:49:18 +02:00
pTags := evt.Tags.GetAll([]string{"p"})
for _, tag := range pTags {
for _, user := range whitelist {
/*
1: User in whitelist
2: Cant remove self
3: User should have invited user OR be relay admin
*/
2023-10-16 23:09:12 -03:00
if user.PublicKey == tag.Value() && evt.PubKey != tag.Value() && (user.InvitedBy == evt.PubKey || evt.PubKey == s.RelayPubkey) {
log.Info().Str("user", tag.Value()).Msg("deleting user")
2023-09-18 19:18:24 +00:00
deleteFromWhitelistRecursively(ctx, tag.Value())
}
}
}
2023-10-16 23:09:12 -03:00
if evt.PubKey == s.RelayPubkey {
eTags := evt.Tags.GetAll([]string{"e"})
for _, tag := range eTags {
filter := nostr.Filter{
IDs: []string{tag.Value()},
}
events, _ := db.QueryEvents(ctx, filter)
2023-09-18 19:18:24 +00:00
2023-10-16 23:09:12 -03:00
for evt := range events {
log.Info().Str("event", evt.ID).Msg("deleting event")
err := db.DeleteEvent(ctx, evt)
if err != nil {
2023-10-16 23:09:12 -03:00
log.Warn().Err(err).Msg("failed to delete event")
}
2023-09-06 20:49:18 +02:00
}
}
}
}
return false, ""
}
func loadWhitelist() error {
2023-09-06 20:49:18 +02:00
if _, err := os.Stat("whitelist.json"); os.IsNotExist(err) {
whitelist = []WhitelistEntry{}
2023-09-06 20:49:18 +02:00
return nil
} else if err != nil {
return err
}
2023-09-06 20:49:18 +02:00
fileContent, err := os.ReadFile("whitelist.json")
if err != nil {
return err
}
2023-09-06 20:49:18 +02:00
if err := json.Unmarshal(fileContent, &whitelist); err != nil {
return err
}
2023-09-06 20:49:18 +02:00
return nil
}
func saveWhitelist() error {
2023-09-06 20:49:18 +02:00
jsonBytes, err := json.Marshal(whitelist)
if err != nil {
return err
}
2023-09-06 20:49:18 +02:00
if err := os.WriteFile("whitelist.json", jsonBytes, 0644); err != nil {
return err
}
2023-09-06 20:49:18 +02:00
return nil
}