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

229 lines
6.7 KiB
Go

package database
import (
"AdaptixServer/core/utils/logs"
"database/sql"
"errors"
"fmt"
"strings"
"github.com/Adaptix-Framework/axc2"
)
func (dbms *DBMS) DbTargetExist(targetId string) bool {
var id string
err := dbms.database.QueryRow("SELECT TargetId FROM Targets WHERE TargetId = ? LIMIT 1;", targetId).Scan(&id)
return err == nil
}
func (dbms *DBMS) DbTargetsAdd(targetsData []*adaptix.TargetData) error {
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
tx, err := dbms.database.Begin()
if err != nil {
return err
}
insertQuery := `INSERT OR IGNORE INTO Targets (TargetId, Computer, Domain, Address, Os, OsDesk, Tag, Info, Date, Alive, Agents) values(?,?,?,?,?,?,?,?,?,?,?);`
stmt, err := tx.Prepare(insertQuery)
if err != nil {
_ = tx.Rollback()
return err
}
defer func(stmt *sql.Stmt) {
_ = stmt.Close()
}(stmt)
for _, targetData := range targetsData {
_, err = stmt.Exec(targetData.TargetId, targetData.Computer, targetData.Domain, targetData.Address, targetData.Os,
targetData.OsDesk, targetData.Tag, targetData.Info, targetData.Date, targetData.Alive, strings.Join(targetData.Agents, ","))
if err != nil {
logs.Error("", err.Error())
continue
}
}
return tx.Commit()
}
func (dbms *DBMS) DbTargetUpdate(targetData *adaptix.TargetData) error {
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
updateQuery := `UPDATE Targets SET Computer = ?, Domain = ?, Address = ?, Os = ?, OsDesk = ?, Tag = ?, Info = ?, Alive = ?, Agents = ? WHERE TargetId = ?;`
result, err := dbms.database.Exec(updateQuery, targetData.Computer, targetData.Domain, targetData.Address, targetData.Os,
targetData.OsDesk, targetData.Tag, targetData.Info, targetData.Alive, strings.Join(targetData.Agents, ","), targetData.TargetId)
if err != nil {
return err
}
rows, _ := result.RowsAffected()
if rows == 0 {
return fmt.Errorf("target %s does not exist", targetData.TargetId)
}
return nil
}
func (dbms *DBMS) DbTargetDelete(targetId string) error {
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
deleteQuery := `DELETE FROM Targets WHERE TargetId = ?;`
_, err := dbms.database.Exec(deleteQuery, targetId)
return err
}
func (dbms *DBMS) DbTargetDeleteBatch(targetIds []string) error {
if len(targetIds) == 0 {
return nil
}
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
placeholders := make([]string, len(targetIds))
args := make([]interface{}, len(targetIds))
for i, id := range targetIds {
placeholders[i] = "?"
args[i] = id
}
deleteQuery := fmt.Sprintf("DELETE FROM Targets WHERE TargetId IN (%s);",
strings.Join(placeholders, ","))
_, err := dbms.database.Exec(deleteQuery, args...)
return err
}
func (dbms *DBMS) DbTargetUpdateBatch(targets []*adaptix.TargetData) error {
if len(targets) == 0 {
return nil
}
ok := dbms.DatabaseExists()
if !ok {
return errors.New("database does not exist")
}
tx, err := dbms.database.Begin()
if err != nil {
return err
}
updateQuery := `UPDATE Targets SET Computer = ?, Domain = ?, Address = ?, Os = ?, OsDesk = ?, Tag = ?, Info = ?, Alive = ?, Agents = ? WHERE TargetId = ?;`
stmt, err := tx.Prepare(updateQuery)
if err != nil {
_ = tx.Rollback()
return err
}
defer func(stmt *sql.Stmt) {
_ = stmt.Close()
}(stmt)
for _, t := range targets {
_, err = stmt.Exec(t.Computer, t.Domain, t.Address, t.Os, t.OsDesk, t.Tag, t.Info, t.Alive, strings.Join(t.Agents, ","), t.TargetId)
if err != nil {
_ = tx.Rollback()
return err
}
}
return tx.Commit()
}
func (dbms *DBMS) DbTargetById(targetId string) (*adaptix.TargetData, error) {
if !dbms.DatabaseExists() {
return nil, errors.New("database does not exist")
}
target := &adaptix.TargetData{}
agentsStr := ""
selectQuery := `SELECT TargetId, Computer, Domain, Address, Os, OsDesk, Tag, Info, Date, Alive, Agents FROM Targets WHERE TargetId = ?;`
err := dbms.database.QueryRow(selectQuery, targetId).Scan(&target.TargetId, &target.Computer, &target.Domain, &target.Address, &target.Os,
&target.OsDesk, &target.Tag, &target.Info, &target.Date, &target.Alive, &agentsStr)
if err != nil {
return nil, fmt.Errorf("target %s not found", targetId)
}
if agentsStr != "" {
target.Agents = strings.Split(agentsStr, ",")
}
return target, nil
}
func (dbms *DBMS) DbTargetFindByMatch(address, computer, domain string) (*adaptix.TargetData, error) {
if !dbms.DatabaseExists() {
return nil, errors.New("database does not exist")
}
selectQuery := `SELECT TargetId, Computer, Domain, Address, Os, OsDesk, Tag, Info, Date, Alive, Agents FROM Targets WHERE (Address = ? AND Address != '') OR (LOWER(Computer) = LOWER(?) AND LOWER(Domain) = LOWER(?)) LIMIT 1;`
target := &adaptix.TargetData{}
agentsStr := ""
err := dbms.database.QueryRow(selectQuery, address, computer, domain).Scan(&target.TargetId, &target.Computer, &target.Domain, &target.Address, &target.Os,
&target.OsDesk, &target.Tag, &target.Info, &target.Date, &target.Alive, &agentsStr)
if err != nil {
return nil, fmt.Errorf("target not found")
}
if agentsStr != "" {
target.Agents = strings.Split(agentsStr, ",")
}
return target, nil
}
func (dbms *DBMS) DbTargetSetTagBatch(targetIds []string, tag string) error {
if len(targetIds) == 0 {
return nil
}
if !dbms.DatabaseExists() {
return errors.New("database does not exist")
}
placeholders := make([]string, len(targetIds))
args := make([]interface{}, 0, len(targetIds)+1)
args = append(args, tag)
for i, id := range targetIds {
placeholders[i] = "?"
args = append(args, id)
}
updateQuery := fmt.Sprintf("UPDATE Targets SET Tag = ? WHERE TargetId IN (%s);", strings.Join(placeholders, ","))
_, err := dbms.database.Exec(updateQuery, args...)
return err
}
func (dbms *DBMS) DbTargetsAll() []*adaptix.TargetData {
var targets []*adaptix.TargetData
ok := dbms.DatabaseExists()
if ok {
selectQuery := `SELECT TargetId, Computer, Domain, Address, Os, OsDesk, Tag, Info, Date, Alive, Agents FROM Targets ORDER BY Date;`
query, err := dbms.database.Query(selectQuery)
if err != nil {
logs.Debug("", "Failed to query targets: "+err.Error())
return targets
}
defer func(query *sql.Rows) {
_ = query.Close()
}(query)
for query.Next() {
targetData := &adaptix.TargetData{}
agentsStr := ""
err = query.Scan(&targetData.TargetId, &targetData.Computer, &targetData.Domain, &targetData.Address, &targetData.Os,
&targetData.OsDesk, &targetData.Tag, &targetData.Info, &targetData.Date, &targetData.Alive, &agentsStr)
if err != nil {
continue
}
if agentsStr != "" {
targetData.Agents = strings.Split(agentsStr, ",")
}
targets = append(targets, targetData)
}
}
return targets
}