diff --git a/handler.go b/handler.go index f0248bc..6175fd8 100644 --- a/handler.go +++ b/handler.go @@ -10,10 +10,11 @@ import ( ) func inviteTreeHandler(w http.ResponseWriter, r *http.Request) { + loggedUser := getLoggedUser(r) content := inviteTreePageHTML(r.Context(), InviteTreePageParams{ - loggedUser: getLoggedUser(r), + loggedUser: loggedUser, }) - htmlgo.Fprint(w, baseHTML(content), r.Context()) + htmlgo.Fprint(w, baseHTML(content, loggedUser), r.Context()) } func addToWhitelistHandler(w http.ResponseWriter, r *http.Request) { @@ -49,6 +50,41 @@ func removeFromWhitelistHandler(w http.ResponseWriter, r *http.Request) { htmlgo.Fprint(w, content, r.Context()) } +// this deletes all events from users not in the relay anymore +func cleanupStuffFromExcludedUsersHandler(w http.ResponseWriter, r *http.Request) { + loggedUser := getLoggedUser(r) + if loggedUser != s.RelayPubkey { + http.Error(w, "unauthorized, only the relay owner can do this", 403) + return + } + + oldLimit := db.MaxLimit + db.MaxLimit = 999999 + ch, err := db.QueryEvents(r.Context(), nostr.Filter{Limit: db.MaxLimit}) + if err != nil { + http.Error(w, "failed to query", 500) + return + } + db.MaxLimit = oldLimit + + count := 0 + + for evt := range ch { + if isPublicKeyInWhitelist(evt.PubKey) { + continue + } + + if err := db.DeleteEvent(r.Context(), evt); err != nil { + http.Error(w, fmt.Sprintf( + "failed to delete %s: %s -- stopping, %d events were deleted before this error", evt, err, count), 500) + return + } + count++ + } + + fmt.Fprintf(w, "deleted %d events", count) +} + func reportsViewerHandler(w http.ResponseWriter, r *http.Request) { events, err := db.QueryEvents(r.Context(), nostr.Filter{ Kinds: []int{1984}, diff --git a/main.go b/main.go index 3e3169e..f3d6691 100644 --- a/main.go +++ b/main.go @@ -106,6 +106,7 @@ func main() { // http routes relay.Router().HandleFunc("/add-to-whitelist", addToWhitelistHandler) relay.Router().HandleFunc("/remove-from-whitelist", removeFromWhitelistHandler) + relay.Router().HandleFunc("/cleanup", cleanupStuffFromExcludedUsersHandler) relay.Router().HandleFunc("/reports", reportsViewerHandler) relay.Router().HandleFunc("/browse/", joubleHandler) relay.Router().Handle("/static/", http.FileServer(http.FS(static))) diff --git a/pages.go b/pages.go index d507b95..7affcdd 100644 --- a/pages.go +++ b/pages.go @@ -9,9 +9,14 @@ import ( const buttonClass = "rounded-md text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300" -func baseHTML(inside HTMLComponent) HTMLComponent { +func baseHTML(inside HTMLComponent, loggedUser string) HTMLComponent { navItemClass := "text-gray-600 hover:bg-gray-200 rounded-md px-3 py-2 font-medium" + cleanupButton := Span("") + if loggedUser == s.RelayPubkey { + cleanupButton = A().Text("clear stuff").Href("/cleanup").Class(navItemClass) + } + return HTML( Head( Meta().Charset("utf-8"), @@ -30,6 +35,7 @@ func baseHTML(inside HTMLComponent) HTMLComponent { A().Text("invite tree").Href("/").Class(navItemClass).Attr("hx-boost", "true", "hx-target", "main", "hx-select", "main"), A().Text("browse").Href("/browse").Class(navItemClass), A().Text("reports").Href("/reports").Class(navItemClass).Attr("hx-boost", "true", "hx-target", "main", "hx-select", "main"), + cleanupButton, A().Text("").Href("#").Class(navItemClass). Attr("_", ` on click if my innerText is equal to "login" get window.nostr.signEvent({created_at: Math.round(Date.now()/1000), kind: 27235, tags: [['domain', "`+s.Domain+`"]], content: ''}) then get JSON.stringify(it) then set cookies['nip98'] to it otherwise call cookies.clear('nip98') end then call location.reload() @@ -137,5 +143,6 @@ func reportsPageHTML(ctx context.Context, params ReportsPageParams) HTMLComponen H1("reports received").Class("text-xl p-4"), Div(items...), ), + params.loggedUser, ) }