247 lines
6.0 KiB
C#
247 lines
6.0 KiB
C#
using Org.BouncyCastle.Utilities;
|
|
using Org.BouncyCastle.X509;
|
|
using Sophia.Net.DRM;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Voile.Patchouli.Reflection;
|
|
using Voile.Properties;
|
|
|
|
namespace Voile
|
|
{
|
|
public partial class FirstRunWizard : Form
|
|
{
|
|
public FirstRunWizard()
|
|
{
|
|
InitializeComponent();
|
|
DisplayTabPage(0);
|
|
}
|
|
|
|
private TabPage[] allPages;
|
|
private int currentTabPage;
|
|
private Stack<int> pastPages;
|
|
|
|
private bool beginnerMode;
|
|
private FileInfo licenceCertificateFileInfo;
|
|
private byte[] licenseBuffer;
|
|
private int licenseState;
|
|
private X509Certificate licenseCertificate;
|
|
private bool sharewareMode;
|
|
|
|
private bool dataStorageRadioButtonsGenerated;
|
|
|
|
public void DisplayTabPage(int target, bool isGoingBack = false)
|
|
{
|
|
if (pastPages == null)
|
|
pastPages = new Stack<int>();
|
|
else
|
|
pastPages.Push(target);
|
|
|
|
if (allPages == null)
|
|
{
|
|
allPages = new TabPage[tabControl1.TabPages.Count];
|
|
for (int i = 0; i < tabControl1.TabPages.Count; i++)
|
|
{
|
|
allPages[i] = tabControl1.TabPages[i];
|
|
}
|
|
}
|
|
|
|
tabControl1.TabPages.Clear();
|
|
tabControl1.TabPages.Add(allPages[target]);
|
|
currentTabPage = target;
|
|
RefreshView();
|
|
}
|
|
|
|
void RefreshView()
|
|
{
|
|
buttonBack.Enabled = false;
|
|
buttonNext.Enabled = false;
|
|
|
|
if (pastPages != null)
|
|
{
|
|
if (pastPages.Count > 0)
|
|
{
|
|
buttonBack.Enabled = true;
|
|
}
|
|
}
|
|
|
|
switch (currentTabPage)
|
|
{
|
|
case 0:
|
|
beginnerMode = radioButtonAmBegginer.Checked;
|
|
buttonNext.Enabled = radioButtonAmBegginer.Checked || radioButtonAmExpert.Checked;
|
|
break;
|
|
case 1:
|
|
//Lizenzstatus validieren.
|
|
buttonValidateLicense.Enabled = ((licenceCertificateFileInfo != null) & radioButtonHasLicense.Checked);
|
|
buttonLoadLicenseFile.Enabled = radioButtonHasLicense.Checked;
|
|
pictureBox2.Visible = radioButtonHasLicense.Checked;
|
|
if (pictureBox2.Visible)
|
|
{
|
|
switch(licenseState)
|
|
{
|
|
case 0: //Noch nichts geladen.
|
|
pictureBox2.Image = Resources.SETUPAPI_18_1_32x32x4; //Fragezeichen
|
|
break;
|
|
case 1: //Root cert konnte nicht geladen werden.
|
|
case 2: //Lizenz file konnte nicht geladen werden.
|
|
case 3: //Lizenzzertifikat wurde nicht von sophia.net ausgestellt.
|
|
case 4: //Lizennzertifikat enthält keine sophia.net extensions
|
|
case 5: //sophia.net extension ist leer
|
|
case 7: //sophia.net extension hat ungültige länge
|
|
pictureBox2.Image = Resources.TRFFC10C_1_32x32x4; //rote Ampel
|
|
break;
|
|
case 6: //gültige lizenz
|
|
pictureBox2.Image = Resources.TRFFC10A_1_32x32x4; //grüne Ampel
|
|
break;
|
|
case 8:
|
|
default:
|
|
pictureBox2.Image = Resources.iblicense_133_1_32x32x4; //Ausrufezeichen
|
|
licenseState = 8;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Können wir weiter machen?
|
|
sharewareMode = radioButtonNoLicense.Checked;
|
|
buttonNext.Enabled = (sharewareMode) | (licenseState == 6);
|
|
break;
|
|
case 2:
|
|
if (!dataStorageRadioButtonsGenerated)
|
|
GenerateDataStorageRadioButtons();
|
|
break;
|
|
default:
|
|
MessageBox.Show("Could not find handler for the current tab page.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
private void GenerateDataStorageRadioButtons()
|
|
{
|
|
VoilePluginManager pluginManager = VoilePluginManager.GetInstance();
|
|
IReadOnlyList<VoilePluginInfo> dataStoragePlugins = pluginManager.GetDataStorages();
|
|
//TODO: Finish generating the radio buttons for the data storage.
|
|
}
|
|
|
|
private void radioButton3_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
RefreshView();
|
|
}
|
|
|
|
private void radioButtonAmBegginer_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
RefreshView();
|
|
}
|
|
|
|
private void radioButtonAmExpert_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
RefreshView();
|
|
}
|
|
|
|
private void radioButtonNoLicense_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
RefreshView();
|
|
}
|
|
|
|
private void pictureBox2_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void buttonNext_Click(object sender, EventArgs e)
|
|
{
|
|
if (currentTabPage == 0)
|
|
{
|
|
DisplayTabPage(1);
|
|
}
|
|
}
|
|
|
|
private void buttonLoadLicenseFile_Click(object sender, EventArgs e)
|
|
{
|
|
if (openFileDialogCertificate.ShowDialog() == DialogResult.OK)
|
|
{
|
|
licenceCertificateFileInfo = new FileInfo(openFileDialogCertificate.FileName);
|
|
licenseBuffer = File.ReadAllBytes(licenceCertificateFileInfo.FullName);
|
|
textBox1.Text = licenceCertificateFileInfo.FullName;
|
|
licenseState = 0;
|
|
pictureBox2.Image = Resources.SETUPAPI_18_1_32x32x4;
|
|
}
|
|
RefreshView();
|
|
}
|
|
|
|
private void buttonValidateLicense_Click(object sender, EventArgs e)
|
|
{
|
|
VoileContext voileContext = VoileContext.GetContext();
|
|
|
|
if (voileContext.SophiaNetRootCertificate == null)
|
|
{
|
|
try
|
|
{
|
|
byte[] sophianetCertBuffer = Resources.sophianet_cert;
|
|
voileContext.SophiaNetRootCertificate = SophiaNetDrmApi.ImportCertificate(sophianetCertBuffer);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
licenseState = 1;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
licenseCertificate = SophiaNetDrmApi.ImportCertificate(licenseBuffer);
|
|
}
|
|
catch (Exception f)
|
|
{
|
|
licenseState = 2;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
|
|
bool certificateChainValid = SophiaNetDrmApi.ValidateCertificateChain(licenseCertificate, voileContext.SophiaNetRootCertificate);
|
|
if (!certificateChainValid)
|
|
{
|
|
licenseState = 3;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
|
|
byte[] sophiaNetExtensionBuffer;
|
|
try
|
|
{
|
|
sophiaNetExtensionBuffer = SophiaNetDrmApi.GetSophiaNetExtensionFromCertificate(licenseCertificate);
|
|
}
|
|
catch (Exception g)
|
|
{
|
|
licenseState = 4;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
|
|
if (sophiaNetExtensionBuffer.Length == 0)
|
|
{
|
|
licenseState = 5;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
if (sophiaNetExtensionBuffer.Length % 16 != 0)
|
|
{
|
|
licenseState = 7;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
|
|
licenseState = 6;
|
|
RefreshView();
|
|
return;
|
|
}
|
|
}
|
|
}
|