From d655a31bdb068e4a1c1a18a740247c2d1d1565da Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Mon, 18 Sep 2017 00:19:55 -0400 Subject: [PATCH] Added prompts for SSL failures --- TGCommandLine/Program.cs | 29 +++++++-- TGControlPanel/Program.cs | 114 +++++++++++++++++++---------------- TGServiceInterface/Server.cs | 33 ++++++++-- 3 files changed, 116 insertions(+), 60 deletions(-) diff --git a/TGCommandLine/Program.cs b/TGCommandLine/Program.cs index 2d60af356b..df5fbee814 100644 --- a/TGCommandLine/Program.cs +++ b/TGCommandLine/Program.cs @@ -56,9 +56,9 @@ namespace TGCommandLine } if (badConnectionString) - { - Console.WriteLine("Remote connection usage: <-c/--connect> username:password@address:port"); - return ExitCode.BadCommand; + { + Console.WriteLine("Remote connection usage: <-c/--connect> username:password@address:port"); + return ExitCode.BadCommand; } var res = Server.VerifyConnection(); @@ -113,11 +113,30 @@ namespace TGCommandLine return result; } + static bool BadCertificateInteractive(string message) + { + Console.WriteLine(message); + Console.Write("Do you wish to continue? NOT RECCOMENDED! (y/N): "); + var result = Console.ReadLine().Trim().ToLower(); + return result == "y" || result == "yes"; + } + static int Main(string[] args) { Command.OutputProcVar.Value = Console.WriteLine; - if (args.Length != 0) - return (int)RunCommandLine(new List(args)); + if (args.Length != 0) + { + Server.SetBadCertificateHandler((message) => { + foreach (var I in args) + if (I.ToLower() == "--disable-ssl-verification") //im just not even going to document this because i hate it so much + return true; + return false; + }); + //allow self signed certs in debug mode + return (int)RunCommandLine(new List(args)); + } + + Server.SetBadCertificateHandler(BadCertificateInteractive); Console.WriteLine("Type 'remote' to connect to a remote service"); //interactive mode diff --git a/TGControlPanel/Program.cs b/TGControlPanel/Program.cs index 55de52accf..43ff631518 100644 --- a/TGControlPanel/Program.cs +++ b/TGControlPanel/Program.cs @@ -5,58 +5,70 @@ using TGServiceInterface; namespace TGControlPanel { - static class Program - { - [STAThread] - static void Main(string [] args) - { - try - { - if (Properties.Settings.Default.UpgradeRequired) - { - Properties.Settings.Default.Upgrade(); - Properties.Settings.Default.UpgradeRequired = false; - Properties.Settings.Default.Save(); - } - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Login()); - } - catch (Exception e) - { - ServiceDisconnectException(e); - } - finally - { - Properties.Settings.Default.Save(); - } - } + static class Program + { + [STAThread] + static void Main(string[] args) + { + Server.SetBadCertificateHandler(BadCertificateHandler); + try + { + if (Properties.Settings.Default.UpgradeRequired) + { + Properties.Settings.Default.Upgrade(); + Properties.Settings.Default.UpgradeRequired = false; + Properties.Settings.Default.Save(); + } + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Login()); + } + catch (Exception e) + { + ServiceDisconnectException(e); + } + finally + { + Properties.Settings.Default.Save(); + } + } + static bool SSLErrorPromptResult = false; + static bool BadCertificateHandler(string message) + { + if (!SSLErrorPromptResult) + { + var result = MessageBox.Show(message + " IT IS HIGHLY RECCOMENDED YOU DO NOT PROCEED! Continue?", "SSL Error", MessageBoxButtons.YesNo) == DialogResult.Yes; + SSLErrorPromptResult = result; + return result; + } + return true; + } - public static void ServiceDisconnectException(Exception e) - { - MessageBox.Show("An unhandled exception occurred. This usually means we lost connection to the service. Error" + e.ToString()); - } + public static void ServiceDisconnectException(Exception e) + { + MessageBox.Show("An unhandled exception occurred. This usually means we lost connection to the service. Error" + e.ToString()); + } - public static string TextPrompt(string caption, string text) - { - Form prompt = new Form() - { - Width = 500, - Height = 150, - FormBorderStyle = FormBorderStyle.FixedDialog, - Text = caption, - StartPosition = FormStartPosition.CenterScreen - }; - Label textLabel = new Label() { Left = 50, Top = 20, Text = text, AutoSize = true }; - TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 }; - Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK }; - confirmation.Click += (sender, e) => { prompt.Close(); }; - prompt.Controls.Add(textBox); - prompt.Controls.Add(confirmation); - prompt.Controls.Add(textLabel); - prompt.AcceptButton = confirmation; + public static string TextPrompt(string caption, string text) + { + Form prompt = new Form() + { + Width = 500, + Height = 150, + FormBorderStyle = FormBorderStyle.FixedDialog, + Text = caption, + StartPosition = FormStartPosition.CenterScreen + }; + Label textLabel = new Label() { Left = 50, Top = 20, Text = text, AutoSize = true }; + TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 }; + Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK }; + confirmation.Click += (sender, e) => { prompt.Close(); }; + prompt.Controls.Add(textBox); + prompt.Controls.Add(confirmation); + prompt.Controls.Add(textLabel); + prompt.AcceptButton = confirmation; - return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : null; - } - } + return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : null; + } + } } diff --git a/TGServiceInterface/Server.cs b/TGServiceInterface/Server.cs index 855250dfb2..866bde3d54 100644 --- a/TGServiceInterface/Server.cs +++ b/TGServiceInterface/Server.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Net; +using System.Net.Security; using System.ServiceModel; namespace TGServiceInterface { @@ -37,6 +38,34 @@ namespace TGServiceInterface /// static string HTTPSPassword; + + public static void SetBadCertificateHandler(Func handler) + { + ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, error) => + { + string ErrorMessage; + switch (error) + { + case SslPolicyErrors.None: + return true; + case SslPolicyErrors.RemoteCertificateChainErrors: + ErrorMessage = "There are certificate chain errors."; + break; + case SslPolicyErrors.RemoteCertificateNameMismatch: + ErrorMessage = "The certificate name does not match."; + break; + case SslPolicyErrors.RemoteCertificateNotAvailable: + ErrorMessage = "The certificate doesn't exist in the trust store."; + break; + default: + ErrorMessage = "An unknown error occurred."; + break; + } + ErrorMessage = String.Format("The certificate failed to verify for {0}:{1}. {2} {3}", HTTPSURL, HTTPSPort, ErrorMessage, cert.ToString()); + return handler(ErrorMessage); + }; + } + /// /// Set the interface to look for services on the current computer /// @@ -93,10 +122,6 @@ namespace TGServiceInterface outChannel.Credentials.UserName.UserName = HTTPSUsername; outChannel.Credentials.UserName.Password = HTTPSPassword; } -#if DEBUG - //allow self signed certs in debug mode - ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, error) => true; -#endif return outChannel.CreateChannel(); }