go-ssb-room/muxrpc/handlers/tunnel/server/members.go

59 lines
1.3 KiB
Go

// SPDX-FileCopyrightText: 2021 The NGI Pointer Secure-Scuttlebutt Team of 2020/2021
//
// SPDX-License-Identifier: MIT
package server
import (
"context"
"encoding/json"
"fmt"
"github.com/ssbc/go-muxrpc/v2"
refs "github.com/ssbc/go-ssb-refs"
"github.com/ssbc/go-ssb-room/v2/internal/network"
"github.com/ssbc/go-ssb-room/v2/roomdb"
)
type Member struct {
ID refs.FeedRef `json:"id"`
}
func (h *Handler) members(ctx context.Context, req *muxrpc.Request, snk *muxrpc.ByteSink) error {
peer, err := network.GetFeedRefFromAddr(req.RemoteAddr())
if err != nil {
return err
}
pm, err := h.config.GetPrivacyMode(ctx)
if err != nil {
return fmt.Errorf("running with unknown privacy mode: %w", err)
}
if pm == roomdb.ModeCommunity || pm == roomdb.ModeRestricted {
_, err := h.membersdb.GetByFeed(ctx, peer)
if err != nil {
return fmt.Errorf("external users are not allowed to list members: %w", err)
}
}
members, err := h.membersdb.List(ctx)
if err != nil {
return fmt.Errorf("error listing members: %w", err)
}
snk.SetEncoding(muxrpc.TypeJSON)
for _, member := range members {
if err = json.NewEncoder(snk).Encode([]Member{
{
ID: member.PubKey,
},
}); err != nil {
return fmt.Errorf("encoder error: %w", err)
}
}
return snk.Close()
}