fix: nip42 support

This commit is contained in:
Amarpreet Minhas 2024-08-16 19:26:49 -04:00
parent 42cf28fe1b
commit 2270cf5497

View file

@ -34,6 +34,51 @@ type nostrWellKnown struct {
NIP46 map[string][]string `json:"nip46,omitempty"`
}
func NewRelay(version string) *khatru.Relay {
// relay configuration
relay = khatru.NewRelay()
relay.Info.Name = config.GetConfig().RelayName
relay.Info.PubKey = config.GetConfig().RelayPubkey
relay.Info.Description = config.GetConfig().RelayDescription
relay.Info.Icon = config.GetConfig().RelayIcon
relay.Info.Contact = config.GetConfig().RelayContact
relay.Info.Version = version
relay.Info.Software = "https://git.devvul.com/asara/well-goknown"
// contact lists
relay.Info.SupportedNIPs = []int{
1, // basic protocol
2, // contact lists
4, // encrypted DMs
11, // relay info
42, // auth
45, // event counts
70, // protected events
}
relay.OnConnect = append(relay.OnConnect, func(ctx context.Context) {
khatru.RequestAuth(ctx)
})
// storage
relay.StoreEvent = append(relay.StoreEvent, RelayDb.SaveEvent)
relay.QueryEvents = append(relay.QueryEvents, RelayDb.QueryEvents)
relay.CountEvents = append(relay.CountEvents, RelayDb.CountEvents)
relay.DeleteEvent = append(relay.DeleteEvent, RelayDb.DeleteEvent)
// apply policies
relay.RejectEvent = append(
relay.RejectEvent,
RejectUnregisteredNpubs,
policies.ValidateKind,
)
relay.RejectFilter = append(
relay.RejectFilter,
policies.RejectKind04Snoopers,
)
return relay
}
func GetNostrAddr(w http.ResponseWriter, r *http.Request) {
l := gologger.Get(config.GetConfig().LogLevel).With().Str("context", "nostr").Logger()
@ -54,7 +99,7 @@ func GetNostrAddr(w http.ResponseWriter, r *http.Request) {
var uid int
err = DB.QueryRow("SELECT owner_id FROM nip05s WHERE name=$1 AND domain=$2", name, domain).Scan(&uid)
if err != nil {
l.Error().Msgf("user (%s@%s) doesn't exist: %s", name, domain, err.Error())
l.Debug().Msgf("user (%s@%s) doesn't exist: %s", name, domain, err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
@ -63,7 +108,7 @@ func GetNostrAddr(w http.ResponseWriter, r *http.Request) {
user := nostrUser{}
err = DB.QueryRow("SELECT pubkey, relays FROM users WHERE id=$1", uid).Scan(&user.Pubkey, &user.Relays)
if err != nil {
l.Error().Msgf("unable to get user info for uid %v: %s", uid, err.Error())
l.Debug().Msgf("unable to get user info for uid %v: %s", uid, err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
@ -72,7 +117,7 @@ func GetNostrAddr(w http.ResponseWriter, r *http.Request) {
names := []string{}
err = DB.Select(&names, "SELECT nip05s.name FROM nip05s JOIN users ON nip05s.owner_id = users.id WHERE nip05s.owner_id = $1", uid)
if err != nil {
l.Error().Msgf("unable to get nip05 names for uid %v: %s", uid, err.Error())
l.Debug().Msgf("unable to get nip05 names for uid %v: %s", uid, err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
@ -109,7 +154,7 @@ func GetNostrAddr(w http.ResponseWriter, r *http.Request) {
j, err := json.Marshal(ret)
if err != nil {
l.Error().Msg(err.Error())
l.Error().Msgf("unable to marshal nip05 response: %s", err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
@ -121,56 +166,21 @@ func GetNostrAddr(w http.ResponseWriter, r *http.Request) {
return
}
func NewRelay(version string) *khatru.Relay {
// relay configuration
relay = khatru.NewRelay()
relay.Info.Name = config.GetConfig().RelayName
relay.Info.PubKey = config.GetConfig().RelayPubkey
relay.Info.Description = config.GetConfig().RelayDescription
relay.Info.Icon = config.GetConfig().RelayIcon
relay.Info.Contact = config.GetConfig().RelayContact
relay.Info.Version = version
relay.Info.Software = "https://git.devvul.com/asara/well-goknown"
// contact lists
relay.Info.SupportedNIPs = append(relay.Info.SupportedNIPs, 2)
// dms
relay.Info.SupportedNIPs = append(relay.Info.SupportedNIPs, 4)
relay.OnConnect = append(relay.OnConnect, func(ctx context.Context) {
khatru.RequestAuth(ctx)
})
// storage
relay.StoreEvent = append(relay.StoreEvent, RelayDb.SaveEvent)
relay.QueryEvents = append(relay.QueryEvents, RelayDb.QueryEvents)
relay.CountEvents = append(relay.CountEvents, RelayDb.CountEvents)
relay.DeleteEvent = append(relay.DeleteEvent, RelayDb.DeleteEvent)
// apply policies
//policies.ApplySaneDefaults(relay)
relay.RejectEvent = append(
relay.RejectEvent,
RejectUnregisteredNpubs,
policies.RejectEventsWithBase64Media,
policies.ValidateKind,
)
relay.RejectFilter = append(
relay.RejectFilter,
policies.RejectKind04Snoopers,
)
return relay
}
func RejectUnregisteredNpubs(ctx context.Context, event *nostr.Event) (reject bool, msg string) {
l := gologger.Get(config.GetConfig().LogLevel).With().Str("context", "nostr-reject-unregistered").Logger()
l.Debug().Msgf("event-debug pubkey: %s, kind: %v", event.PubKey, event.Kind)
// always allow auth messages
if event.Kind == 22242 {
return false, ""
}
authenticatedUser := khatru.GetAuthed(ctx)
if authenticatedUser == "" {
l.Debug().Msgf("pubkey not authed: %s", event.PubKey)
return true, fmt.Sprintf("auth-required: interacting with this relay requires authentication")
}
// reject nip-04 messages to users who aren't registered
if event.Kind == 4 {
receiver := event.Tags.GetFirst([]string{"p"}).Value()
@ -181,24 +191,24 @@ func RejectUnregisteredNpubs(ctx context.Context, event *nostr.Event) (reject bo
}
var sid int
err = DB.QueryRow("SELECT id FROM users WHERE pubkey=$1", event.PubKey).Scan(&sid)
err = DB.QueryRow("SELECT id FROM users WHERE pubkey=$1", authenticatedUser).Scan(&sid)
if err != nil {
sid = -1
}
if rid != -1 || sid != -1 {
if rid != -1 && sid != -1 {
l.Debug().Msgf("pubkeys %s or %s not found to be registered", receiver, event.PubKey)
return true, fmt.Sprintf("nobody in this nip04 message is registered to the relay")
return true, fmt.Sprintf("restricted: nobody in this nip04 message is registered to the relay")
}
return false, ""
}
// check if user is registered
var uid int
err := DB.QueryRow("SELECT id FROM users WHERE pubkey=$1", event.PubKey).Scan(&uid)
err := DB.QueryRow("SELECT id FROM users WHERE pubkey=$1", authenticatedUser).Scan(&uid)
if err != nil {
l.Debug().Msgf("kind: %v, pubkey: %s, error: %s", event.Kind, event.PubKey, err.Error())
return true, fmt.Sprintf("restricted: pubkey %s is not registered to any users", event.PubKey)
return true, fmt.Sprintf("restricted: pubkey %s is not registered to any users", authenticatedUser)
}
return false, ""
}