aboutsummaryrefslogtreecommitdiff
path: root/utils/ipn_tool/Program.cs
diff options
context:
space:
mode:
authorjmpoep <OriginalEntryPoint@qq.com>2023-12-07 16:51:07 +0800
committerjmpoep <OriginalEntryPoint@qq.com>2023-12-07 16:51:07 +0800
commit28008a746a31abb7909dd86cb0cd413ac8943b0b (patch)
treea30b74b8cad548048c3c1551d652828ab76fa9bd /utils/ipn_tool/Program.cs
downloadvmprotect-3.5.1-28008a746a31abb7909dd86cb0cd413ac8943b0b.tar
vmprotect-3.5.1-28008a746a31abb7909dd86cb0cd413ac8943b0b.tar.gz
vmprotect-3.5.1-28008a746a31abb7909dd86cb0cd413ac8943b0b.tar.bz2
vmprotect-3.5.1-28008a746a31abb7909dd86cb0cd413ac8943b0b.zip
first commitHEADmaster
Diffstat (limited to 'utils/ipn_tool/Program.cs')
-rw-r--r--utils/ipn_tool/Program.cs301
1 files changed, 301 insertions, 0 deletions
diff --git a/utils/ipn_tool/Program.cs b/utils/ipn_tool/Program.cs
new file mode 100644
index 0000000..b86dbdb
--- /dev/null
+++ b/utils/ipn_tool/Program.cs
@@ -0,0 +1,301 @@
+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");
+ }
+
+ }
+}