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 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(); 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 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; } } }