@@ -3,6 +3,8 @@ package groups
33import (
44 "fmt"
55 "net/http"
6+ "regexp"
7+ "strings"
68 "time"
79
810 "fiatjaf.com/nostr"
@@ -47,6 +49,9 @@ func setupEnabled() {
4749 Handler .mux = http .NewServeMux ()
4850
4951 Handler .mux .HandleFunc ("POST /groups/disable" , disableHandler )
52+ Handler .mux .HandleFunc ("POST /groups/nipad/enable" , nipadEnableHandler )
53+ Handler .mux .HandleFunc ("POST /groups/nipad/disable" , nipadDisableHandler )
54+ Handler .mux .HandleFunc ("POST /groups/nickname/{groupId}" , groupNicknameHandler )
5055 Handler .mux .HandleFunc ("POST /groups/livekit/start" , startEmbeddedLiveKitHandler )
5156 Handler .mux .HandleFunc ("POST /groups/livekit/stop" , stopEmbeddedLiveKitHandler )
5257 Handler .mux .HandleFunc ("POST /groups/livekit/log" , livekitLogHandler )
@@ -173,6 +178,104 @@ func disableHandler(w http.ResponseWriter, r *http.Request) {
173178 http .Redirect (w , r , "/groups/" , 302 )
174179}
175180
181+ func nipadEnableHandler (w http.ResponseWriter , r * http.Request ) {
182+ loggedUser , _ := global .GetLoggedUser (r )
183+
184+ if ! pyramid .IsRoot (loggedUser ) {
185+ http .Error (w , "unauthorized" , 403 )
186+ return
187+ }
188+
189+ global .Settings .Groups .NIPAD .Enabled = true
190+
191+ if err := global .SaveUserSettings (); err != nil {
192+ http .Error (w , "failed to save settings: " + err .Error (), 500 )
193+ return
194+ }
195+
196+ http .Redirect (w , r , "/groups/" , 302 )
197+ }
198+
199+ func nipadDisableHandler (w http.ResponseWriter , r * http.Request ) {
200+ loggedUser , _ := global .GetLoggedUser (r )
201+
202+ if ! pyramid .IsRoot (loggedUser ) {
203+ http .Error (w , "unauthorized" , 403 )
204+ return
205+ }
206+
207+ global .Settings .Groups .NIPAD .Enabled = false
208+
209+ if err := global .SaveUserSettings (); err != nil {
210+ http .Error (w , "failed to save settings: " + err .Error (), 500 )
211+ return
212+ }
213+
214+ http .Redirect (w , r , "/groups/" , 302 )
215+ }
216+
217+ var groupNicknameRe = regexp .MustCompile (`^[a-z0-9_]+$` )
218+
219+ // groupNicknameHandler lets a group admin set or update the group's NIP-AD nickname.
220+ func groupNicknameHandler (w http.ResponseWriter , r * http.Request ) {
221+ loggedUser , isLoggedIn := global .GetLoggedUser (r )
222+ if ! isLoggedIn {
223+ http .Error (w , "auth-required: must be logged in" , 401 )
224+ return
225+ }
226+
227+ groupId := r .PathValue ("groupId" )
228+ group , exists := State .Groups .Load (groupId )
229+ if ! exists || ! group .IsPrimaryRole (loggedUser ) {
230+ http .Error (w , "unauthorized: only group admins can set the nickname" , 403 )
231+ return
232+ }
233+
234+ nickname := strings .TrimSpace (r .FormValue ("nickname" ))
235+ nickname = strings .ToLower (nickname )
236+
237+ if nickname == "" {
238+ // clearing the nickname
239+ for name , gid := range global .Settings .Groups .NIPAD .Names {
240+ if gid == groupId {
241+ delete (global .Settings .Groups .NIPAD .Names , name )
242+ }
243+ }
244+ } else {
245+ if ! groupNicknameRe .MatchString (nickname ) {
246+ http .Error (w , "invalid nickname: must be a single word with only ascii letters, numbers and underscores" , 400 )
247+ return
248+ }
249+
250+ if isReservedNickname (nickname ) {
251+ http .Error (w , "nickname already taken: this name is reserved for a relay path" , 400 )
252+ return
253+ }
254+
255+ // check no other group already has this nickname
256+ if existing , inUse := global .Settings .Groups .NIPAD .Names [nickname ]; inUse && existing != groupId {
257+ http .Error (w , "nickname already taken" , 400 )
258+ return
259+ }
260+
261+ // clear any previous nickname for this group
262+ for name , gid := range global .Settings .Groups .NIPAD .Names {
263+ if gid == groupId {
264+ delete (global .Settings .Groups .NIPAD .Names , name )
265+ }
266+ }
267+
268+ global .Settings .Groups .NIPAD .Names [nickname ] = groupId
269+ }
270+
271+ if err := global .SaveUserSettings (); err != nil {
272+ http .Error (w , "failed to save settings: " + err .Error (), 500 )
273+ return
274+ }
275+
276+ http .Redirect (w , r , "/groups/" + groupId , 302 )
277+ }
278+
176279func wipeGroupHandler (w http.ResponseWriter , r * http.Request ) {
177280 loggedUser , _ := global .GetLoggedUser (r )
178281
0 commit comments