66 lines
1.6 KiB
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
|
|
} |