Files
activestep/Step.Utils/CandiesController.cs
2020-09-12 16:11:43 +02:00

475 lines
15 KiB
C#

using Microsoft.Win32;
using Step.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step.Utils
{
public static class CandiesController
{
private const String BASE36 = "4K6IJZL1M27PQRSNOVWXTU80FGH39ABCDEY5";
private const String BASE10 = "0431786295";
private const String KEY_NAME = "HKEY_LOCAL_MACHINE\\SOFTWARE\\CMS\\ACTIVE";
private const String KEY_VALUE_NAME = "cil";
private const int BASE_TIME = 730119; // 1/1/2000
private static int randomTime = 0;
private static TimeSpan MorningTime = new TimeSpan(6, 15, 0);
private static DateTime StartTimePlusDelay = DateTime.Now;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#region PUBLIC_METHODS
// Decodifica password esportando i dati. Ereditata da CMS-Control
public static bool LincensePasswordDecode(String Password, out string Matricola, out int MatricolaNumerica, out int Command, out long Parameter)
{
String decryptedString;
int nChk = 0;
Matricola = "";
MatricolaNumerica = 0;
Command = 0;
Parameter = 0;
try
{
decryptedString = AlgoritmoService_Back(Password).ToString();
for (int i = 0; i <= decryptedString.Length - 1 - 1; i++)
{
nChk += (int)char.GetNumericValue(decryptedString[i]);
}
//inserita password con checksum errato
if (decryptedString.Last() != nChk.ToString().Last())
return false;
int indexParameterOffset = 6;
if(decryptedString.Count() > 13)
{
// If decrypted string has more than 13 characters means that the machine number contains a letter
var machinNumberString = decryptedString.Substring(1, 11);
MatricolaNumerica = int.Parse(machinNumberString);
// Convert machineNumber from int to ascii
Matricola = SupportFunctions.ConvertIntToAsciiString(MatricolaNumerica);
// Change the offset of the parameter
indexParameterOffset = 12;
}
else
{
// If decrypted string has less than 13 characters use the old method
Matricola = decryptedString.Substring(2, 4);
MatricolaNumerica = Int32.Parse(Matricola);
}
Command = short.Parse(decryptedString.Substring(0, 1));
Parameter = long.Parse(decryptedString.Substring(indexParameterOffset, decryptedString.Length - indexParameterOffset - 1));
}
catch (Exception)
{
return false;
}
return true;
}
// Lettura della licenza da registro. Ereditata da CMS-Control
public static bool GetPCLincense(bool containsLetters, out long EndLincence, out int Matricola, out long Parameter)
{
string szLicReg_X = String.Empty;
long Lincence = 0;
Matricola = 0;
Parameter = 0;
EndLincence = 0;
//Leggo nel Registro
Licenza_Registry_RW(false, ref szLicReg_X);
Lincence = long.Parse(szLicReg_X);
return GetDataFromLincense(Lincence, containsLetters, out EndLincence, out Matricola, out Parameter);
}
// Scrittura della licenza nel registro. Ereditata da CMS-Control
public static void SetPCLincense(int Matricola, long Parameter)
{
string Licenza = SetLincenseFromData(Matricola, Parameter);
Licenza_Registry_RW(true, ref Licenza);
}
// Gestisce la creazione della licenza, da scrivere poi nel CN
public static string SetLincenseFromData(int Matricola, long Parameter)
{
long nLic;
int days;
if (Parameter > BASE_TIME)
days = (int)(Parameter - BASE_TIME);
else if (Parameter > Int32.MaxValue)
days = Int32.MaxValue;
else
days = 0;
nLic = ((long)Matricola << 16) + days;
return AlgoritmoLicence(nLic);
}
// Gestisce l'export dei dati partendo dalla licenza letta dal CN
public static bool GetDataFromLincense(long RawLincence, bool containsLetters, out long EndLincence, out int Matricola, out long Parameter)
{
Matricola = 0;
Parameter = 0;
EndLincence = 0;
if (RawLincence == 0)
return false;
EndLincence = AlgoritmoLicence_Back(RawLincence.ToString());
Parameter = EndLincence & 0xFFFF;
if(containsLetters)
Matricola = (int)((EndLincence >> 16) & 0xFFFFFFFF);
else
Matricola = (int)((EndLincence >> 16) & 0xFFFF);
if (Matricola > 0)
return true;
else
return false;
}
//Elabora la licenza e decide se va riscritta
public static void ElaborateLincense(bool bPC_VALID, bool bNC_VALID, long PCParam, long NCParam, long PcPLic, long NCLic, out DateTime newDate, out bool toRewrite)
{
long newParam=0;
if (bNC_VALID & bPC_VALID)
{
if (PCParam == NCParam)
{
newParam = PCParam + BASE_TIME;
toRewrite = false;
}
else if (PCParam < NCParam)
{
newParam = PCParam + BASE_TIME;
toRewrite = true;
}
else
{
newParam = NCParam + BASE_TIME;
toRewrite = true;
}
}
else if (bNC_VALID)
{
newParam = NCParam + BASE_TIME;
toRewrite = true;
}
else if (bPC_VALID)
{
newParam = PCParam + BASE_TIME;
toRewrite = true;
}
else
{
// tutto a zero? immagino sia la prima accensione
if (PcPLic == 0 && NCLic == 0)
{
newParam = BASE_TIME;
toRewrite = true;
}
//ho creato il file? immagino sia la prima accensione con memorie cn sporche
else if (NCLic == 0 && File.Exists(Constants.CANDY_DUMMYFILE_PATH))
{
newParam = BASE_TIME;
toRewrite = true;
}
//a questo punto blocco.. ipotizzo una forzatura
else
{
newParam = 0;
toRewrite = true;
}
}
newDate = new DateTime(newParam * TimeSpan.TicksPerDay);
}
// Controllo dell'orario per iniziare a gestire la licenza
public static bool IsTimeToMangeCandies()
{
//Controllo solo se sono dopo le 6 e 15 + T random (CMS-Control)
if (DateTime.Now.TimeOfDay < MorningTime)
{
randomTime = 0;
return false;
}
// Aggiungo un T random in cui inizio il controllo: da 10 minuti a entro 4 ore dall'avvio
if (randomTime == 0)
{
Random rand = new Random();
randomTime = rand.Next((4 * 60) - 10) + 10;
// randomTime = 1;
StartTimePlusDelay = DateTime.Now;
StartTimePlusDelay = StartTimePlusDelay.Add(new TimeSpan(0, randomTime, 0));
}
// If time expired return true
if (DateTime.Now > StartTimePlusDelay)
return true;
//return true;
return false;
}
// Controllo dell'orario per iniziare a controllare
public static bool ElaborateExpiredBit(DateTime date,bool NcExpiredBit, out bool NewExpiredBit)
{
DateTime LastWriteTime;
NewExpiredBit = false;
//Manage Dummy file
if (File.Exists(Constants.CANDY_DUMMYFILE_PATH))
{
if (File.GetLastWriteTime(Constants.CANDY_DUMMYFILE_PATH) < DateTime.Now)
File.SetLastWriteTime(Constants.CANDY_DUMMYFILE_PATH, DateTime.Now);
}
else
File.Create(Constants.CANDY_DUMMYFILE_PATH);
LastWriteTime = File.GetLastWriteTime(Constants.CANDY_DUMMYFILE_PATH);
//Manage Lincese Expired Bit
//1. If unlimited
if(date.Ticks / TimeSpan.TicksPerDay == BASE_TIME)
{
if (NcExpiredBit)
{
NewExpiredBit = false;
return true;
}
}
//2. If limited
else
{
DateTime SevenDaysDate = DateTime.Now + new TimeSpan(7 * TimeSpan.TicksPerDay);
//2.1 today > Expired Lincense Date
//2.2 Expired File Date > Expired Lincense Date
//2.3 today + 1 Week > Expired File Date
if (date < DateTime.Now || date < LastWriteTime || SevenDaysDate < LastWriteTime)
{
if (!NcExpiredBit)
{
NewExpiredBit = true;
return true;
}
}
else
{
if (NcExpiredBit)
{
NewExpiredBit = false;
return true;
}
}
}
//Nothing to write
return false;
}
// Decodifica password delle teste. Ereditata da CMS-Control
public static bool HeadsPasswordCheck(String Password, int Matricola, int Testa)
{
string[] aCript = new string[19];
string szDay, szMonth, szYear, szRes, psw;
long nDay, nMonth, nYear, nAdd1;
long nMatr, nHead, nAdd2, nRes;
aCript[0] = "Q";
aCript[1] = "W";
aCript[2] = "E";
aCript[3] = "R";
aCript[4] = "Z";
aCript[5] = "Y";
aCript[6] = "U";
aCript[7] = "I";
aCript[8] = "P";
aCript[9] = "A";
aCript[10] = "S";
aCript[11] = "D" ;
aCript[12] = "F" ;
aCript[13] = "G" ;
aCript[14] = "X" ;
aCript[15] = "J" ;
aCript[16] = "K" ;
aCript[17] = "L" ;
aCript[18] = "M";
szDay = DateTime.Now.Day.ToString();
szMonth = DateTime.Now.Month.ToString();
szYear = DateTime.Now.ToString("yy");
if(Matricola > 0 && Testa >= 0)
{
//First step calculate the DAY
nDay = 11 + Convert.ToInt32(szDay) * 3;
nMonth = 12 + Convert.ToInt32(szMonth) * 7;
nYear = 31 + Convert.ToInt32(szYear);
nAdd1 = 111 + nDay * nMonth * nYear;
//Second step calculate the Machine and the head
nMatr = (Matricola + 121211);
nHead = 131 + (Testa * 17);
nAdd2 = nMatr + nHead;
//Thirth step mix result ....
nRes = (nAdd1 + nAdd2) * 13L;
szRes = String.Format(nRes.ToString(), "{0:0000000}");
//Generate Password
psw = aCript[Convert.ToInt32(Mid(szRes, 1, 1)) + Convert.ToInt32(Mid(szRes, 7, 1))] + Mid(szRes, 1, 3) +
aCript[Convert.ToInt32(Mid(szRes, 6, 1)) + Convert.ToInt32(Mid(szRes, 5, 1))] + Mid(szRes, 4, 3) +
aCript[Convert.ToInt32(Mid(szRes, 4, 1)) + Convert.ToInt32(Mid(szRes, 3, 1))] + Mid(szRes, 7, szRes.Length -6);
if (Password == psw)
return true;
else
return false;
}
return false;
}
#endregion
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#region PRIVATE_METHODS
private static long AlgoritmoService_Back(string val)
{
// Base36ToDec
long lVal = 0;
int ChrPos;
const int BASE = 36;
val = val.ToUpper();
while (val.Length > 0)
{
lVal = lVal * BASE;
ChrPos = BASE36.IndexOf(Left(val, 1));
if (ChrPos >= 0)
lVal = lVal + ChrPos;
val = Mid(val, 2);
}
return lVal;
}
private static long AlgoritmoLicence_Back(string val)
{
long lVal = 0;
int ChrPos;
const int BASE = 10;
val = val.ToUpper();
while (val.Length > 0)
{
lVal = lVal * BASE;
ChrPos = BASE10.IndexOf(Left(val, 1));
if (ChrPos >= 0)
lVal = lVal + ChrPos;
val = Mid(val, 2);
}
return lVal;
}
private static string AlgoritmoLicence(long lVal)
{
String sVal = "";
while(lVal >= 10)
{
sVal = sVal + AlgoritmoLicence(lVal/10);
lVal = lVal - 10 * (lVal/10);
}
// lVal < 10
sVal = sVal + Mid(BASE10, (int)(lVal + 1), 1);
return sVal;
}
private static string Left(string value, int size)
{
if (string.IsNullOrEmpty(value))
return value;
size = (size >= value.Length ? value.Length : size);
string newValue = value.Substring(0, size);
return newValue;
}
private static string Mid(string value, int index)
{
// Check index and string correctness
if (string.IsNullOrEmpty(value))
return value;
index = index - 1;
if (index >= value.Length)
return "";
// Create substring
return value.Substring(index);
}
private static string Mid(string value, int index,int lenght)
{
value = Mid(value, index);
if (lenght <= value.Length)
value = value.Substring(0, lenght);
return value;
}
private static void Licenza_Registry_RW(bool bWrite, ref string Licenza)
{
Object objLicence;
// KEY_NAME
if (bWrite)
Registry.SetValue(KEY_NAME, KEY_VALUE_NAME, Licenza, RegistryValueKind.String);
objLicence = Registry.GetValue(KEY_NAME, KEY_VALUE_NAME,0);
if (objLicence == null) objLicence = 0;
Licenza = objLicence.ToString();
}
#endregion
}
}