ollie/fs/elevatefiles.go

66 lines
1.6 KiB
Go

package fs
import (
"fmt"
"strings"
"ollie/elevate"
)
// ── Elevate handlers ─────────────────────────────────────────────
var errNoElevate = fmt.Errorf("elevate broker not available")
func readElevatePolicy(ctx HandlerCtx) ([]byte, error) {
if ctx.Elevate == nil {
return nil, errNoElevate
}
p := ctx.Elevate.GlobalPolicy().Global()
return p.Marshal()
}
func writeElevatePolicy(ctx HandlerCtx, data []byte) error {
if ctx.Elevate == nil {
return errNoElevate
}
var p elevate.Policy
if err := elevate.ParsePolicy(data, &p); err != nil {
return err
}
return ctx.Elevate.GlobalPolicy().SetGlobal(p)
}
func listElevatePending(ctx HandlerCtx) ([]FsNodeDecl, error) {
if ctx.Elevate == nil {
return nil, errNoElevate
}
pending := ctx.Elevate.Pending()
out := make([]FsNodeDecl, len(pending))
for i, r := range pending {
id, req := r.ID, r
out[i] = Leaf(id, 0666,
Read(func(_ HandlerCtx) ([]byte, error) {
return []byte(req.Summary() + "\n"), nil
}),
Write(func(_ HandlerCtx, data []byte) error {
cmd := strings.TrimSpace(string(data))
var res elevate.Resolution
switch cmd {
case "approve":
res = elevate.ResolveApprove
case "deny":
res = elevate.ResolveDeny
case "persist":
res = elevate.ResolvePersist
default:
return fmt.Errorf("unknown resolution: %s (use approve/deny/persist)", cmd)
}
if !ctx.Elevate.Resolve(id, res) {
return fmt.Errorf("request already resolved or timed out")
}
return nil
}),
)
}
return out, nil
}