VMProtect/utils/ipn_tool/Program.cs

302 lines
9.1 KiB
C#
Raw Permalink Normal View History

2023-05-14 16:21:09 +03:00
using System;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Text;
using System.Xml;
namespace ipn_tool
{
static class Program
{
static int Main(string[] args)
{
switch (args.Length)
{
case 2:
if (args[0] == "-export_wm")
return ExportWatermarks(args[1]);
break;
case 3:
switch (args[0])
{
case "-export_bl":
return MergeBlacklist(args[1], args[2]);
case "-export_tasks":
return ExportTasks(null, args[1], args[2]);
case "-check_ssvtest":
return CheckSsvTest.Result(args[1], args[2]);
}
break;
case 4:
if (args[0] == "-export_task")
return ExportTasks(args[1], args[2], args[3]);
if (args[0] == "-check_wm")
return Watermarks.CheckIfPresent(args[1], args[2], args[3]);
break;
case 5:
if (args[0] == "-register_result")
return RegisterResult(args[1], args[2], args[3], args[4]);
break;
}
Console.WriteLine("IPN database tool. USAGE:");
Console.WriteLine("a) Export watermarks: ipn_tool -export_wm <filename.dat>");
Console.WriteLine("b) Merge project with blacklist: ipn_tool -export_bl <filenamein.vmp> <filenameout.vmp>");
Console.WriteLine("c) Prepare for all actual end-user builds: ipn_tool -export_tasks <destPath> <version>");
Console.WriteLine("d) Prepare for actual end-user build: ipn_tool -export_task <licenseID> <destPath> <version>");
Console.WriteLine("e) Register build result: ipn_tool -register_result <licenseID> <bambooBuildUrl> <true|false> <version>");
Console.WriteLine("f) Parse and check ssvtest.log: ipn_tool -check_ssvtest <ssvtest.log> <taggant.pem>");
Console.WriteLine("g) Check if watermark present: ipn_tool -check_wm <filename.dat> <wm_id> <binary_file>");
return 1;
}
private static int RegisterResult(string licenseId, string bambooBuildUrl, string success, string version)
{
int ret;
using (var con = IpnConn())
{
using (var cmd = new SqlCommand("dbo.RegisterBuildTaskResult", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 600;
cmd.Parameters.AddWithValue("@licenseID", int.Parse(licenseId));
cmd.Parameters.AddWithValue("@bambooBuildUrl", bambooBuildUrl);
cmd.Parameters.AddWithValue("@success", bool.Parse(success));
cmd.Parameters.AddWithValue("@version", version);
con.Open();
ret = (int)cmd.ExecuteScalar();
Console.WriteLine("RegisterResult (0 - OK): {0}.", ret);
}
}
return ret;
}
private enum Platform
{
Windows,
Linux,
Mac
}
private static Platform RunningPlatform()
{
switch (Environment.OSVersion.Platform)
{
case PlatformID.Unix:
// Well, there are chances MacOSX is reported as Unix instead of MacOSX.
// Instead of platform check, we'll do a feature checks (Mac specific root folders)
if (Directory.Exists("/Applications")
& Directory.Exists("/System")
& Directory.Exists("/Users")
& Directory.Exists("/Volumes"))
return Platform.Mac;
else
return Platform.Linux;
case PlatformID.MacOSX:
return Platform.Mac;
default:
return Platform.Windows;
}
}
private static int ExportTasks(string licenseId, string rootPath, string version)
{
var ret = 1;
if (!rootPath.EndsWith(Path.DirectorySeparatorChar + @"licenses"))
{
Console.WriteLine(@"RootPath '{0}' check failed (should ends with {1}licenses)", rootPath, Path.DirectorySeparatorChar);
}
else using (var con = IpnConn())
{
using (var cmd = new SqlCommand("dbo.ExportBuildTaskInfo", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 600;
cmd.Parameters.AddWithValue("@licenseID", licenseId == null ? DBNull.Value : (object)int.Parse(licenseId));
cmd.Parameters.AddWithValue("@filterOutVersion", version);
cmd.Parameters.AddWithValue("@filterByOperatingSystem", RunningPlatform().ToString());
con.Open();
var cnt = 0;
using (var r = cmd.ExecuteReader())
{
if (licenseId == null)
{
Directory.Delete(rootPath, true);
}
while (r.Read())
{
++cnt;
var lId = r.GetInt32(0);
var task = r.GetString(1);
var key = r.GetString(2);
var taggant = r.GetString(3);
Directory.CreateDirectory(Path.Combine(rootPath, lId.ToString(CultureInfo.InvariantCulture)));
var taskIniName = Path.Combine(rootPath, lId.ToString(), "task.ini");
using (var taskIni = new StreamWriter(new FileStream(taskIniName, FileMode.OpenOrCreate, FileAccess.Write), new UTF8Encoding(false)))
{
var doc = new XmlDocument();
doc.LoadXml(task);
// ReSharper disable once PossibleNullReferenceException
foreach (XmlAttribute attr in doc.DocumentElement.Attributes)
{
taskIni.WriteLine("{0}={1}", attr.Name, attr.Value);
}
}
var keyName = Path.Combine(rootPath, lId.ToString(), "VMProtect.key");
File.WriteAllText(keyName, key);
var tagName = Path.Combine(rootPath, lId.ToString(), "taggant.pem");
File.WriteAllText(tagName,
String.Join("\r\n", taggant.Split(new[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)));
}
Console.WriteLine("ExportTasks: {0} item(s) exported.", cnt);
if (cnt > 0)
ret = 0;
}
}
}
return ret;
}
private static int MergeBlacklist(string filenameIn, string filenameOut)
{
var ret = 1;
using (var con = IpnConn())
{
using (var cmd = new SqlCommand("dbo.ExportBlacklist", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 600;
con.Open();
var xml = new XmlDocument();
xml.Load(filenameIn);
var lm = xml.SelectSingleNode("Document/LicenseManager");
if (lm != null)
{
lm.InnerXml = "";
var cnt = 0;
using (var r = cmd.ExecuteReader())
{
while (r.Read())
{
XmlNode license = xml.CreateElement("License");
XmlAttribute adate = xml.CreateAttribute("Date");
adate.Value = r.GetDateTime(1).ToString("yyyy-MM-dd");
XmlAttribute aname = xml.CreateAttribute("CustomerName");
aname.Value = r.GetString(2);
XmlAttribute aemail = xml.CreateAttribute("CustomerEmail");
aemail.Value = r.GetString(3);
XmlAttribute akey = xml.CreateAttribute("SerialNumber");
akey.Value = r.GetString(4);
if (license.Attributes != null)
{
license.Attributes.Append(adate);
license.Attributes.Append(aname);
license.Attributes.Append(aemail);
license.Attributes.Append(akey);
XmlAttribute ablocked = xml.CreateAttribute("Blocked");
ablocked.Value = "1";
license.Attributes.Append(ablocked);
}
lm.AppendChild(license);
cnt++;
}
}
xml.Save(filenameOut);
Console.WriteLine("MergeBlacklist: {0} item(s) exported.", cnt);
if (cnt > 0)
ret = 0;
}
}
}
return ret;
}
private static int ExportWatermarks(string filenameOut)
{
var ret = 1;
using (var con = IpnConn())
{
using (var cmd = new SqlCommand("dbo.ExportWatermarks", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 600;
con.Open();
var xml = new XmlDocument();
xml.InsertBefore(xml.CreateXmlDeclaration("1.0",null,null), xml.DocumentElement);
XmlNode rootNode = xml.CreateElement("Document");
xml.AppendChild(rootNode);
XmlNode wms = xml.CreateElement("Watermarks");
rootNode.AppendChild(wms);
int cnt = 0;
using (var r = cmd.ExecuteReader())
{
while (r.Read())
{
XmlNode wm = xml.CreateElement("Watermark");
XmlAttribute aid = xml.CreateAttribute("Id");
aid.Value = cnt.ToString(CultureInfo.InvariantCulture);
XmlAttribute aname = xml.CreateAttribute("Name");
aname.Value = r.GetString(0);
XmlAttribute areadablename = xml.CreateAttribute("ReadableName");
areadablename.Value = r.GetString(1);
XmlAttribute aemail = xml.CreateAttribute("EMail");
aemail.Value = r.GetString(2);
wm.InnerText = r.GetString(3);
if (wm.Attributes != null)
{
wm.Attributes.Append(aid);
wm.Attributes.Append(aname);
wm.Attributes.Append(areadablename);
wm.Attributes.Append(aemail);
if (r.GetInt32(4) == 0)
{
XmlAttribute aenabled = xml.CreateAttribute("Enabled");
aenabled.Value = "0";
wm.Attributes.Append(aenabled);
}
}
wms.AppendChild(wm);
cnt++;
}
}
XmlAttribute acnt = xml.CreateAttribute("Id");
acnt.Value = cnt.ToString(CultureInfo.InvariantCulture);
if (wms.Attributes != null)
wms.Attributes.Append(acnt);
xml.Save(filenameOut);
Console.WriteLine("ExportWatermarks: {0} item(s) exported.", cnt);
if (cnt > 0)
ret = 0;
}
}
return ret;
}
private static SqlConnection IpnConn()
{
return new SqlConnection("server=scb-serv;database=ipn;user id=ipn_reader;password=rAqiEiGBOh39;Connection Timeout=300");
}
}
}