website-ssl-certificate-che.../MainForm.cs

285 lines
7.7 KiB
C#

using RyzStudio.IO;
using RyzStudio.Windows.Forms;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.Net.Http;
using System.Net.Security;
using System.Reflection.Emit;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WebsiteSSLCertificateChecker
{
public partial class MainForm : Form
{
protected const string DEFAULLT_LABEL_RESULTS = "SSL Certificate Results";
protected CancellationTokenSource cancellationToken = new CancellationTokenSource();
protected bool isBusy = false;
protected bool requestCancel = false;
public MainForm()
{
InitializeComponent();
//memoBox1.TextBox.BackColor = memoBox1.BackColor;
memoBox2.ReadOnly = false;
Clear();
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
if (this.IsBusy)
{
e.Cancel = true;
return;
}
}
public bool IsBusy
{
get => isBusy;
set
{
isBusy = value;
UIControl.SetEnable(memoBox2, !isBusy);
UIControl.SetEnable(memoBox1, !isBusy);
UIControl.SetValue(pictureBox1, (isBusy ? UIcon.GetIcon(typeof(UIResource), "loading_block") : null));
UIControl.SetEnable(button5, !isBusy);
UIControl.SetEnable(button1, !isBusy);
}
}
/// <summary>
/// New
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.IsBusy)
{
return;
}
Clear();
}
/// <summary>
/// Close
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void exitToolStripMenuItem2_Click(object sender, EventArgs e)
{
if (this.IsBusy)
{
return;
}
this.Close();
}
/// <summary>
/// Options
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void optionsToolStripMenuItem_Click(object sender, EventArgs e)
{
// do nothing
}
/// <summary>
/// Help
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void viewHelpToolStripMenuItem1_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start(new ProcessStartInfo()
{
FileName = AppResource.AppHelpURL,
UseShellExecute = true
});
}
catch
{
// do nothing
}
}
/// <summary>
/// About
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show(Application.ProductName + " v" + Application.ProductVersion, "About", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Clear URL address list
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void memoBox2_OnButtonClick(object sender, EventArgs e)
{
if (this.IsBusy)
{
return;
}
UIControl.SetText(memoBox2, string.Empty);
}
/// <summary>
/// Clear SSL certificate results
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void memoBox1_OnButtonClick(object sender, EventArgs e)
{
if (this.IsBusy)
{
return;
}
UIControl.SetText(label1, DEFAULLT_LABEL_RESULTS);
UIControl.SetText(memoBox1, string.Empty);
}
/// <summary>
/// Run
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void button5_MouseClick(object sender, MouseEventArgs e)
{
if (this.IsBusy)
{
return;
}
this.IsBusy = true;
int counter = 0;
foreach (string line in memoBox2.Lines)
{
if (string.IsNullOrWhiteSpace(line))
{
continue;
}
counter++;
UIControl.SetText(label1, string.Format("{0} ({1})", DEFAULLT_LABEL_RESULTS, counter.ToString()));
await RetrieveSSLInfo(line);
}
this.IsBusy = false;
}
/// <summary>
/// Close
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_MouseClick(object sender, MouseEventArgs e)
{
if (this.IsBusy)
{
return;
}
this.Close();
}
protected void AddText(string text)
{
UIControl.AddLine(memoBox1, text);
}
private void Clear()
{
label1.Text = DEFAULLT_LABEL_RESULTS;
memoBox1.Text = memoBox2.Text = string.Empty;
memoBox1.WordWrap = memoBox2.WordWrap = false;
}
protected string ReFormatDateTime(string datetime)
{
if (string.IsNullOrWhiteSpace(datetime))
{
return string.Empty;
}
if (!DateTime.TryParse(datetime, out DateTime result))
{
return string.Empty;
}
return result.ToString("yyyy-MM-dd HH:mm:ss");
}
private async Task RetrieveSSLInfo(string url)
{
AddText("> " + url);
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (requestMessage, certificate, chain, sslErrors) => {
AddText("Requested URL = " + requestMessage.RequestUri);
AddText("Subject = " + certificate?.Subject ?? string.Empty);
AddText("Issuer = " + certificate?.Issuer ?? string.Empty);
AddText("Effective Date = " + ReFormatDateTime(certificate!.GetEffectiveDateString()));
AddText("Expiration Date = " + ReFormatDateTime(certificate.GetExpirationDateString()));
AddText("Thumbprint = " + certificate.Thumbprint);
AddText("Error = " + sslErrors);
AddText(String.Empty);
return sslErrors == SslPolicyErrors.None;
};
HttpClient webClient = new HttpClient(clientHandler);
try
{
HttpResponseMessage response = await webClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException exc)
{
AddText("Error = " + exc.Message);
}
catch (Exception exc)
{
AddText("Error = " + exc.Message);
}
AddText(String.Empty.PadLeft(84, '-'));
clientHandler.Dispose();
webClient.Dispose();
}
}
}