package server import ( "net/http" "jarl/internal/auth" "jarl/internal/engine" ) // zoneFillPTR: POST /zones/{zone}/fill-ptr adds the PTR records a reverse // zone lacks for its view's A and AAAA records (docs/reverse.md). func (s *Server) zoneFillPTR(w http.ResponseWriter, r *http.Request, p *auth.Principal) error { st, err := s.state(r) if err != nil { return err } z, err := s.zoneByPath(r, st, p) if err != nil { return err } return s.mutate(w, r, p, "", []engine.Request{engine.NewRequest(engine.OpZoneFillPTR, z.ID, engine.LinkInput{ZoneID: z.ID})}, nil) } // reverseSuggestions: GET /reverse-zones/suggestions lists the reverse // zones the private views lack for their records' addresses. func (s *Server) reverseSuggestions(w http.ResponseWriter, r *http.Request, p *auth.Principal) error { st, err := s.state(r) if err != nil { return err } out := []engine.ReverseSuggestion{} for _, sg := range s.eng.ReverseSuggestions(st) { if p.CanSeeZone(sg.Zone+".", sg.View) { out = append(out, sg) } } writeJSON(w, http.StatusOK, out) return nil } // reverseDismiss: POST /reverse-zones/dismiss {"view": "internal", // "prefix": "185.199.108.153/32"} hides a suggestion; /undismiss shows it // again. func (s *Server) reverseDismiss(dismiss bool) handler { return func(w http.ResponseWriter, r *http.Request, p *auth.Principal) error { var in engine.DismissInput if err := decodeJSON(r, &in); err != nil { return err } op := engine.OpReverseUndismiss if dismiss { op = engine.OpReverseDismiss } return s.mutate(w, r, p, "", []engine.Request{engine.NewRequest(op, 0, in)}, nil) } }