Browse Source

Action column on server grid for connection security.

Kenric Nugteren 2 years ago
parent
commit
f33fb734b2

+ 1 - 1
prs.server/Forms/Console/Console.xaml.cs

@@ -125,7 +125,7 @@ namespace PRSServer
 
         private void Console_Loaded(object sender, RoutedEventArgs e)
         {
-            _client = new PipeClient<string>(ServiceName,".");
+            _client = new PipeClient<string>(ServiceName, ".");
             _client.MessageReceived += (o, args) =>
             {
                 var m = args.Message;

+ 107 - 2
prs.server/Forms/ServerGrid.cs

@@ -15,7 +15,9 @@ using System.Windows.Controls;
 using System.Windows.Media.Imaging;
 using Comal.Classes;
 using Comal.Stores;
+using GenHTTP.Engine;
 using H.Pipes.Extensions;
+using H.Pipes.Factories;
 using InABox.Client.IPC;
 using InABox.Clients;
 using InABox.Configuration;
@@ -24,6 +26,7 @@ using InABox.Database;
 using InABox.Database.SQLite;
 using InABox.DeviceIdentifier;
 using InABox.DynamicGrid;
+using InABox.IPC.Shared;
 using InABox.Scripting;
 using InABox.Wpf.Editors;
 using InABox.WPF;
@@ -55,6 +58,8 @@ namespace PRSServer
                 { Position = DynamicActionColumnPosition.Start, ToolTip = TypeToolTip });
             ActionColumns.Add(new DynamicImageColumn(StateImage, StateAction)
                 { Position = DynamicActionColumnPosition.End, ToolTip = StateToolTip });
+            ActionColumns.Add(new DynamicImageColumn(SecureImage)
+                {  Position = DynamicActionColumnPosition.End, ToolTip = SecureToolTip });
             //ActionColumns.Add(new DynamicImageColumn(ConsoleImage, ConsoleAction)
             //    { Position = DynamicActionColumnPosition.End, ToolTip = StateToolTip });
             ActionColumns.Add(new DynamicMenuColumn(CreateServerMenu,ServerMenuStatus)
@@ -67,6 +72,52 @@ namespace PRSServer
 
         }
 
+        private BitmapImage secureImage = Properties.Resources.secure.AsBitmapImage();
+        private BitmapImage insecureImage = Properties.Resources.insecure.AsBitmapImage();
+        private BitmapImage? SecureImage(CoreRow? row)
+        {
+            if(row is null)
+            {
+                return secureImage;
+            }
+            else
+            {
+                var key = row.Get<Server, string>(x => x.Key);
+                if(DatabaseInfos.TryGetValue(key, out var info))
+                {
+                    return info.IsHTTPS
+                        ? secureImage
+                        : insecureImage;
+                }
+                else
+                {
+                    return null;
+                }
+            }
+        }
+
+        private FrameworkElement? SecureToolTip(DynamicActionColumn column, CoreRow? row)
+        {
+            if(row is null)
+            {
+                return column.TextToolTip("Connection Security");
+            }
+            else
+            {
+                var key = row.Get<Server, string>(x => x.Key);
+                if (DatabaseInfos.TryGetValue(key, out var info))
+                {
+                    return info.IsHTTPS
+                        ? column.TextToolTip("Secure (HTTPS) Connection")
+                        : column.TextToolTip("Insecure (HTTP) Connection");
+                }
+                else
+                {
+                    return null;
+                }
+            }
+        }
+
         private DynamicMenuStatus ServerMenuStatus(CoreRow arg)
         {
             if (arg == null)
@@ -227,6 +278,9 @@ namespace PRSServer
             );
         }
 
+        private Dictionary<string, DatabaseInfo> DatabaseInfos { get; set; } = new Dictionary<string, DatabaseInfo>();
+        private HashSet<string> LoadingInfos = new HashSet<string>();
+
         protected override void Reload(Filters<Server> criteria, Columns<Server> columns, ref SortOrder<Server>? sort,
             Action<CoreTable?, Exception?> action)
         {
@@ -256,10 +310,61 @@ namespace PRSServer
                 table.Rows.Add(row);
             }
 
+            if (table.Rows.Any(x => x.Get<Server, ServerType>(x => x.Type) == ServerType.Certificate))
+            {
+                foreach (var row in table.Rows.Where(x => x.Get<Server, ServerType>(x => x.Type) == ServerType.Database))
+                {
+                    var key = row.Get<Server, string>(x => x.Key);
+
+                    var service = GetService(key);
+                    if (service is not null && service.Status == ServiceControllerStatus.Running)
+                    {
+                        if (!LoadingInfos.Contains(key))
+                        {
+                            LoadingInfos.Add(key);
+                            Task.Run(() =>
+                            {
+                                while (true)
+                                {
+                                    var client = IPCClientFactory.GetClient(DatabaseServerProperties.GetPipeName(key));
+
+                                    var response = client.Send(PipeRequest.Info(new InfoRequest()), 10_000).GetResponse<InfoResponse>();
+                                    if (response.Status != StatusCode.Error)
+                                    {
+                                        DatabaseInfos[key] = response.Info;
+                                        break;
+                                    }
+                                    else
+                                    {
+                                        DatabaseInfos.Remove(key);
+                                        var service = GetService(key);
+                                        if (service is null || service.Status != ServiceControllerStatus.Running)
+                                        {
+                                            break;
+                                        }
+                                    }
+                                }
+                                Dispatcher.Invoke(() =>
+                                {
+                                    InvalidateRow(row);
+                                });
+                                LoadingInfos.Remove(key);
+                            });
+                        }
+                    }
+                    else
+                    {
+                        if(DatabaseInfos.TryGetValue(key, out var info))
+                        {
+                            DatabaseInfos.Remove(key);
+                        }
+                    }
+                }
+            }
+
             action(table, null);
 
-            if (_monitor == null)
-                _monitor = Task.Run(() =>
+            _monitor ??= Task.Run(() =>
                 {
                     while (true)
                     {

+ 20 - 0
prs.server/Properties/Resources.Designer.cs

@@ -210,6 +210,16 @@ namespace PRSServer.Properties {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap insecure {
+            get {
+                object obj = ResourceManager.GetObject("insecure", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>
@@ -300,6 +310,16 @@ namespace PRSServer.Properties {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        public static System.Drawing.Bitmap secure {
+            get {
+                object obj = ResourceManager.GetObject("secure", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized resource of type System.Drawing.Bitmap.
         /// </summary>

+ 6 - 0
prs.server/Properties/Resources.resx

@@ -177,6 +177,9 @@
     <value>..\Resources\html.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
             PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="insecure" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\insecure.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="jpg" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\jpg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
             PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -213,6 +216,9 @@
     <value>..\Resources\script.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
             PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="secure" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\secure.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="service" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\service.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,
             PublicKeyToken=b03f5f7f11d50a3a</value>

BIN
prs.server/Resources/insecure.png


BIN
prs.server/Resources/secure.png