From fefc85d50080bc9e38ef4fb2b93a4c847a88a507 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Wed, 25 Feb 2026 19:31:37 -0800 Subject: [PATCH] Add unbanpubkey and unallowpubkey --- khatru/nip86.go | 18 +++++++++++++++++ nip86/methods.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/khatru/nip86.go b/khatru/nip86.go index 7131da9..59108b3 100644 --- a/khatru/nip86.go +++ b/khatru/nip86.go @@ -21,8 +21,10 @@ type RelayManagementAPI struct { BanPubKey func(ctx context.Context, pubkey nostr.PubKey, reason string) error ListBannedPubKeys func(ctx context.Context) ([]nip86.PubKeyReason, error) + UnbanPubKey func(ctx context.Context, pubkey nostr.PubKey, reason string) error AllowPubKey func(ctx context.Context, pubkey nostr.PubKey, reason string) error ListAllowedPubKeys func(ctx context.Context) ([]nip86.PubKeyReason, error) + UnallowPubKey func(ctx context.Context, pubkey nostr.PubKey, reason string) error ListEventsNeedingModeration func(ctx context.Context) ([]nip86.IDReason, error) AllowEvent func(ctx context.Context, id nostr.ID, reason string) error BanEvent func(ctx context.Context, id nostr.ID, reason string) error @@ -168,6 +170,14 @@ func (rl *Relay) HandleNIP86(w http.ResponseWriter, r *http.Request) { } else { resp.Result = result } + case nip86.UnbanPubKey: + if rl.ManagementAPI.UnbanPubKey == nil { + resp.Error = fmt.Sprintf("method %s not supported", thing.MethodName()) + } else if err := rl.ManagementAPI.UnbanPubKey(ctx, thing.PubKey, thing.Reason); err != nil { + resp.Error = err.Error() + } else { + resp.Result = true + } case nip86.AllowPubKey: if rl.ManagementAPI.AllowPubKey == nil { resp.Error = fmt.Sprintf("method %s not supported", thing.MethodName()) @@ -184,6 +194,14 @@ func (rl *Relay) HandleNIP86(w http.ResponseWriter, r *http.Request) { } else { resp.Result = result } + case nip86.UnallowPubKey: + if rl.ManagementAPI.UnallowPubKey == nil { + resp.Error = fmt.Sprintf("method %s not supported", thing.MethodName()) + } else if err := rl.ManagementAPI.UnallowPubKey(ctx, thing.PubKey, thing.Reason); err != nil { + resp.Error = err.Error() + } else { + resp.Result = true + } case nip86.BanEvent: if rl.ManagementAPI.BanEvent == nil { resp.Error = fmt.Sprintf("method %s not supported", thing.MethodName()) diff --git a/nip86/methods.go b/nip86/methods.go index aa34189..ba06914 100644 --- a/nip86/methods.go +++ b/nip86/methods.go @@ -32,6 +32,24 @@ func DecodeRequest(req Request) (MethodParams, error) { return BanPubKey{pk, reason}, nil case "listbannedpubkeys": return ListBannedPubKeys{}, nil + case "unbanpubkey": + if len(req.Params) == 0 { + return nil, fmt.Errorf("invalid number of params for '%s'", req.Method) + } + pkh, ok := req.Params[0].(string) + if !ok { + return nil, fmt.Errorf("missing pubkey param for '%s'", req.Method) + } + pk, err := nostr.PubKeyFromHex(pkh) + if err != nil { + return nil, fmt.Errorf("invalid pubkey param for '%s'", req.Method) + } + + var reason string + if len(req.Params) >= 2 { + reason, _ = req.Params[1].(string) + } + return UnbanPubKey{pk, reason}, nil case "allowpubkey": if len(req.Params) == 0 { return nil, fmt.Errorf("invalid number of params for '%s'", req.Method) @@ -52,6 +70,24 @@ func DecodeRequest(req Request) (MethodParams, error) { return AllowPubKey{pk, reason}, nil case "listallowedpubkeys": return ListAllowedPubKeys{}, nil + case "unallowpubkey": + if len(req.Params) == 0 { + return nil, fmt.Errorf("invalid number of params for '%s'", req.Method) + } + pkh, ok := req.Params[0].(string) + if !ok { + return nil, fmt.Errorf("missing pubkey param for '%s'", req.Method) + } + pk, err := nostr.PubKeyFromHex(pkh) + if err != nil { + return nil, fmt.Errorf("invalid pubkey param for '%s'", req.Method) + } + + var reason string + if len(req.Params) >= 2 { + reason, _ = req.Params[1].(string) + } + return UnallowPubKey{pk, reason}, nil case "listeventsneedingmoderation": return ListEventsNeedingModeration{}, nil case "allowevent": @@ -219,8 +255,10 @@ var ( _ MethodParams = (*SupportedMethods)(nil) _ MethodParams = (*BanPubKey)(nil) _ MethodParams = (*ListBannedPubKeys)(nil) + _ MethodParams = (*UnbanPubKey)(nil) _ MethodParams = (*AllowPubKey)(nil) _ MethodParams = (*ListAllowedPubKeys)(nil) + _ MethodParams = (*UnallowPubKey)(nil) _ MethodParams = (*ListEventsNeedingModeration)(nil) _ MethodParams = (*AllowEvent)(nil) _ MethodParams = (*BanEvent)(nil) @@ -256,6 +294,13 @@ type ListBannedPubKeys struct{} func (ListBannedPubKeys) MethodName() string { return "listbannedpubkeys" } +type UnbanPubKey struct { + PubKey nostr.PubKey + Reason string +} + +func (UnbanPubKey) MethodName() string { return "unbanpubkey" } + type AllowPubKey struct { PubKey nostr.PubKey Reason string @@ -267,6 +312,13 @@ type ListAllowedPubKeys struct{} func (ListAllowedPubKeys) MethodName() string { return "listallowedpubkeys" } +type UnallowPubKey struct { + PubKey nostr.PubKey + Reason string +} + +func (UnallowPubKey) MethodName() string { return "unallowpubkey" } + type ListEventsNeedingModeration struct{} func (ListEventsNeedingModeration) MethodName() string { return "listeventsneedingmoderation" }