162 lines
4.2 KiB
Go
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
|
|
}
|