package host import ( "context" "encoding/json" "net/http" "os" "time" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/hostguard" ) func rootFenceViewClient(call hostbox.JournalCall) hostguard.FenceViewProvider { return func(ctx context.Context, host string, c hostguard.Captured) (hostguard.FenceView, error) { if call == nil { return hostguard.FenceView{}, os.ErrPermission } ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() q := hostbox.JournalRequest{V: 1, Op: "fence-view", Target: hostguard.FenceTarget{Host: host, Incarnation: c.Incarnation, Stamp: c.Stamp}} out, err := call(ctx, q) if ctx.Err() != nil { return hostguard.FenceView{}, ctx.Err() } if err != nil { return hostguard.FenceView{}, err } if out.V != 1 || out.Error != "" || out.FenceView == nil || out.FenceView.Schema != 1 || out.FenceView.Host != host || out.FenceView.Captured != c { return hostguard.FenceView{}, os.ErrPermission } return *out.FenceView, nil } } func (h ClaimRootHTTP) serveFenceView(w http.ResponseWriter, r *http.Request, q hostbox.JournalRequest) { root := h.Stop.Coordinator.Guard.Root if q.V != 1 || root == nil || q.Target.Incarnation == "" || q.Target.Stamp == 0 { w.WriteHeader(http.StatusForbidden) return } v, err := root.View(r.Context(), q.Target.Host, hostguard.Captured{Incarnation: q.Target.Incarnation, Stamp: q.Target.Stamp}) if err != nil { w.WriteHeader(http.StatusConflict) return } w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(hostbox.JournalResponse{V: 1, ID: q.ID, FenceView: &v}) }