2026-04-06 00:20:51 -05:00

239 lines
5.6 KiB
Go

package connector
import (
"fmt"
"net/http"
"strconv"
"github.com/Adaptix-Framework/axc2"
"github.com/gin-gonic/gin"
)
type AgentTaskDelete struct {
AgentId string `json:"agent_id"`
TasksId []string `json:"tasks_array"`
}
func (tc *TsConnector) TcAgentTaskCancel(ctx *gin.Context) {
var (
agentTasks AgentTaskDelete
err error
)
err = ctx.ShouldBindJSON(&agentTasks)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": "invalid JSON data", "ok": false})
return
}
var errorsSlice []string
for _, taskId := range agentTasks.TasksId {
err = tc.teamserver.TsTaskCancel(agentTasks.AgentId, taskId)
if err != nil {
errorsSlice = append(errorsSlice, err.Error())
}
}
if len(errorsSlice) > 0 {
message := ""
for i, errorMessage := range errorsSlice {
message += fmt.Sprintf("%d. %s\n", i+1, errorMessage)
}
ctx.JSON(http.StatusOK, gin.H{"message": message, "ok": false})
return
}
ctx.JSON(http.StatusOK, gin.H{"message": "", "ok": true})
}
func (tc *TsConnector) TcAgentTaskDelete(ctx *gin.Context) {
var (
agentTasks AgentTaskDelete
err error
)
err = ctx.ShouldBindJSON(&agentTasks)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": "invalid JSON data", "ok": false})
return
}
var errorsSlice []string
for _, taskId := range agentTasks.TasksId {
err = tc.teamserver.TsTaskDelete(agentTasks.AgentId, taskId)
if err != nil {
errorsSlice = append(errorsSlice, err.Error())
}
}
if len(errorsSlice) > 0 {
message := ""
for i, errorMessage := range errorsSlice {
message += fmt.Sprintf("%d. %s\n", i+1, errorMessage)
}
ctx.JSON(http.StatusOK, gin.H{"message": message, "ok": false})
return
}
ctx.JSON(http.StatusOK, gin.H{"message": "", "ok": true})
}
type AgentTaskHook struct {
AgentId string `json:"a_id"`
TaskId string `json:"a_task_id"`
HookId string `json:"a_hook_id"`
JobIndex int `json:"a_job_index"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
func (tc *TsConnector) TcAgentTaskHook(ctx *gin.Context) {
var (
username string
tasksHook AgentTaskHook
err error
ok bool
)
err = ctx.ShouldBindJSON(&tasksHook)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": "invalid JSON data", "ok": false})
return
}
value, exists := ctx.Get("username")
if !exists {
ctx.JSON(http.StatusOK, gin.H{"message": "Server error: username not found in context", "ok": false})
return
}
username, ok = value.(string)
if !ok {
ctx.JSON(http.StatusOK, gin.H{"message": "Server error: invalid username type in context", "ok": false})
return
}
hookData := adaptix.TaskData{
AgentId: tasksHook.AgentId,
TaskId: tasksHook.TaskId,
HookId: tasksHook.HookId,
Client: username,
MessageType: tasksHook.MessageType,
Message: tasksHook.Message,
ClearText: tasksHook.Text,
Completed: tasksHook.Completed,
}
err = tc.teamserver.TsTaskPostHook(hookData, tasksHook.JobIndex)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": err.Error(), "ok": false})
return
}
ctx.JSON(http.StatusOK, gin.H{"message": "", "ok": true})
}
type TaskSave struct {
AgentId string `json:"agent_id"`
CommandLine string `json:"command_line"`
MessageType int `json:"message_type"`
Message string `json:"message"`
ClearText string `json:"clear_text"`
}
func (tc *TsConnector) TcAgentTaskSave(ctx *gin.Context) {
var (
taskSave TaskSave
username string
err error
ok bool
)
err = ctx.ShouldBindJSON(&taskSave)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": "invalid JSON data", "ok": false})
return
}
value, exists := ctx.Get("username")
if !exists {
ctx.JSON(http.StatusOK, gin.H{"message": "Server error: username not found in context", "ok": false})
return
}
username, ok = value.(string)
if !ok {
ctx.JSON(http.StatusOK, gin.H{"message": "Server error: invalid username type in context", "ok": false})
return
}
taskData := adaptix.TaskData{
AgentId: taskSave.AgentId,
CommandLine: taskSave.CommandLine,
Client: username,
MessageType: taskSave.MessageType,
Message: taskSave.Message,
ClearText: taskSave.ClearText,
}
err = tc.teamserver.TsTaskSave(taskData)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": err.Error(), "ok": false})
return
}
ctx.JSON(http.StatusOK, gin.H{"message": "", "ok": true})
}
func (tc *TsConnector) TcAgentTaskList(ctx *gin.Context) {
agentId := ctx.Query("agent_id")
if agentId == "" {
ctx.JSON(http.StatusOK, gin.H{"message": "agent_id is required", "ok": false})
return
}
limit := 200
offset := 0
if raw := ctx.Query("limit"); raw != "" {
value, err := strconv.Atoi(raw)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": "limit must be an integer", "ok": false})
return
}
if value < 0 {
ctx.JSON(http.StatusOK, gin.H{"message": "limit must be >= 0", "ok": false})
return
}
if value > 1000 {
value = 1000
}
limit = value
}
if raw := ctx.Query("offset"); raw != "" {
value, err := strconv.Atoi(raw)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": "offset must be an integer", "ok": false})
return
}
if value < 0 {
ctx.JSON(http.StatusOK, gin.H{"message": "offset must be >= 0", "ok": false})
return
}
offset = value
}
jsonTasks, err := tc.teamserver.TsTaskListCompleted(agentId, limit, offset)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{"message": err.Error(), "ok": false})
return
}
ctx.Data(http.StatusOK, "application/json; charset=utf-8", jsonTasks)
}