capsule AI-native Unix-like composition layer

src/server/internal/api/kanshan_owner.go

2,293 bytes · 82 lines · capsule://quake0day/[email protected] raw on github

package api

import (
	"net/http"
	"strings"

	"github.com/cyberverse/server/internal/agenttask"
	"github.com/cyberverse/server/internal/kanshan"
	"github.com/cyberverse/server/internal/orchestrator"
)

func isKanshanCharacter(characterID string) bool {
	return strings.TrimSpace(characterID) == kanshan.CharacterID
}

func writeNotFound(w http.ResponseWriter, message string) {
	if strings.TrimSpace(message) == "" {
		message = "not found"
	}
	writeJSON(w, http.StatusNotFound, ErrorResponse{Error: message})
}

func (r *Router) authorizeKanshanSessionAccess(w http.ResponseWriter, req *http.Request, session *orchestrator.Session) bool {
	if session == nil || !isKanshanCharacter(session.CharacterID) {
		return true
	}
	ownerID, err := r.ensureAnonymousOwner(w, req)
	if err != nil {
		writeJSON(w, http.StatusInternalServerError, ErrorResponse{Error: err.Error()})
		return false
	}
	if session.OwnerIDSnapshot() != ownerID {
		writeNotFound(w, orchestrator.ErrSessionNotFound.Error())
		return false
	}
	return true
}

func (r *Router) authorizeTaskAccess(w http.ResponseWriter, req *http.Request, task *agenttask.Task) bool {
	if task == nil || strings.TrimSpace(task.OwnerID) == "" {
		return true
	}
	ownerID, err := r.ensureAnonymousOwner(w, req)
	if err != nil {
		writeJSON(w, http.StatusInternalServerError, ErrorResponse{Error: err.Error()})
		return false
	}
	if task.OwnerID != ownerID {
		writeNotFound(w, agenttask.ErrNotFound.Error())
		return false
	}
	return true
}

func (r *Router) filterVisibleTasks(w http.ResponseWriter, req *http.Request, tasks []agenttask.Task) ([]agenttask.Task, bool) {
	ownerID, hasOwner := anonymousOwnerFromRequest(req)
	visible := tasks[:0]
	privateDenied := false
	for _, task := range tasks {
		if strings.TrimSpace(task.OwnerID) == "" {
			visible = append(visible, task)
			continue
		}
		if hasOwner && task.OwnerID == ownerID {
			visible = append(visible, task)
			continue
		}
		privateDenied = true
	}
	if len(visible) == 0 && privateDenied {
		if !hasOwner {
			if _, err := r.ensureAnonymousOwner(w, req); err != nil {
				writeJSON(w, http.StatusInternalServerError, ErrorResponse{Error: err.Error()})
				return nil, false
			}
		}
		writeNotFound(w, agenttask.ErrNotFound.Error())
		return nil, false
	}
	return visible, true
}