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

162 lines
4.2 KiB
Go

package server
import (
"AdaptixServer/core/eventing"
"AdaptixServer/core/utils/krypt"
"AdaptixServer/core/utils/logs"
"AdaptixServer/core/utils/tformat"
"encoding/json"
"errors"
"fmt"
"os"
"time"
"github.com/Adaptix-Framework/axc2"
)
func (ts *Teamserver) TsScreenshotList() (string, error) {
dbScreens := ts.DBMS.DbScreenshotAll()
screens := make([]adaptix.ScreenData, 0, len(dbScreens))
for _, s := range dbScreens {
s.LocalPath = "******"
s.Content = nil
screens = append(screens, s)
}
jsonScreenshot, err := json.Marshal(screens)
if err != nil {
return "", err
}
return string(jsonScreenshot), nil
}
func (ts *Teamserver) TsScreenshotGetImage(screenId string) ([]byte, error) {
screenData, err := ts.DBMS.DbScreenshotById(screenId)
if err != nil {
return []byte(""), errors.New("Screen not found: " + screenId)
}
content, err := os.ReadFile(screenData.LocalPath)
if err != nil {
return []byte(""), errors.New("Failed to read screenshot file: " + err.Error())
}
return content, nil
}
func (ts *Teamserver) TsScreenshotAdd(agentId string, Note string, Content []byte) error {
// --- PRE HOOK ---
preEvent := &eventing.EventDataScreenshotAdd{
AgentId: agentId,
Note: Note,
Content: Content,
}
if !ts.EventManager.Emit(eventing.EventScreenshotAdd, eventing.HookPre, preEvent) {
if preEvent.Error != nil {
return preEvent.Error
}
return fmt.Errorf("operation cancelled by hook")
}
// ----------------
screenData := adaptix.ScreenData{
Note: Note,
Date: time.Now().Unix(),
Content: Content,
}
format, err := tformat.DetectImageFormat(Content)
if err != nil {
return err
}
value, ok := ts.Agents.Get(agentId)
if !ok {
return errors.New("Agent not found: " + agentId)
}
agent, ok := value.(*Agent)
if !ok {
return errors.New("Invalid agent type: " + agentId)
}
agentData := agent.GetData()
screenData.User = agentData.Username
screenData.Computer = agentData.Computer
screenData.ScreenId, _ = krypt.GenerateUID(8)
d := time.Now().Format("15:04:05 02.01.2006")
saveName := krypt.MD5(append([]byte(d), screenData.Content...)) + "." + format
dirPath := logs.RepoLogsInstance.ScreenshotPath
_, err = os.Stat(dirPath)
if os.IsNotExist(err) {
err = os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
return errors.New("Failed to create screenshots path: " + err.Error())
}
}
screenData.LocalPath = dirPath + "/" + saveName
err = os.WriteFile(screenData.LocalPath, Content, os.ModePerm)
if err != nil {
return errors.New("Failed to create file: " + err.Error())
}
packet := CreateSpScreenshotCreate(screenData)
ts.TsSyncAllClientsWithCategory(packet, SyncCategoryScreenshotRealtime)
screenData.Content = nil
_ = ts.DBMS.DbScreenshotInsert(screenData)
// --- POST HOOK ---
postEvent := &eventing.EventDataScreenshotAdd{
AgentId: agentId,
Note: Note,
Content: Content,
}
ts.EventManager.EmitAsync(eventing.EventScreenshotAdd, postEvent)
// -----------------
return nil
}
func (ts *Teamserver) TsScreenshotNote(screenId string, note string) error {
_, err := ts.DBMS.DbScreenshotById(screenId)
if err != nil {
return errors.New("Screen not found: " + screenId)
}
_ = ts.DBMS.DbScreenshotUpdate(screenId, note)
packet := CreateSpScreenshotUpdate(screenId, note)
ts.TsSyncStateWithCategory(packet, "screenshot:"+screenId, SyncCategoryScreenshotRealtime)
return nil
}
func (ts *Teamserver) TsScreenshotDelete(screenId string) error {
// --- PRE HOOK ---
preEvent := &eventing.EventDataScreenshotRemove{ScreenId: screenId}
if !ts.EventManager.Emit(eventing.EventScreenshotRemove, eventing.HookPre, preEvent) {
if preEvent.Error != nil {
return preEvent.Error
}
return fmt.Errorf("operation cancelled by hook")
}
// ----------------
screenData, err := ts.DBMS.DbScreenshotById(screenId)
if err != nil {
return errors.New("Screen not found: " + screenId)
}
_ = os.Remove(screenData.LocalPath)
_ = ts.DBMS.DbScreenshotDelete(screenId)
packet := CreateSpScreenshotDelete(screenId)
ts.TsSyncAllClientsWithCategory(packet, SyncCategoryScreenshotRealtime)
// --- POST HOOK ---
postEvent := &eventing.EventDataScreenshotRemove{ScreenId: screenId}
ts.EventManager.EmitAsync(eventing.EventScreenshotRemove, postEvent)
// -----------------
return nil
}