From d6b4fa4ddef9de2127edf33c470468149048e40c Mon Sep 17 00:00:00 2001 From: WickedJack99 Date: Thu, 25 Jan 2024 08:45:56 +0100 Subject: [PATCH] 00002 Added needed classes from first approach. --- README.md | 14 + cacerts | Bin 0 -> 1942 bytes firewall-dashboard-simplified/pom.xml | 16 - mvn.cmd | 0 my-cacerts | Bin 0 -> 1942 bytes pom.xml | 96 ++++++ server.crt | 35 ++ server.key | 54 ++++ src/main/java/src/java/connect/Receiver.java | 61 ++++ src/main/java/src/java/connect/Sender.java | 73 +++++ .../java/src/java/connect/client/Client.java | 13 + .../src/java/connect/client/TLSClient.java | 97 ++++++ .../src/java/controller/ControllerThread.java | 97 ++++++ .../ConnectionInformation.java | 36 +++ .../ConnectionsProcessor.java | 191 +++++++++++ .../NFTableInformation.java | 54 ++++ .../nftablesProcessing/NFTablesProcessor.java | 159 ++++++++++ .../controller/interfaces/Controller.java | 5 + .../java/controller/validate/Validate.java | 70 ++++ .../java/src/java/data/ConnectionData.java | 5 + .../main/java/src/java/main}/Main.java | 2 +- .../java/src/java/queues/ReceivingQueue.java | 20 ++ .../java/src/java/queues/SendingQueue.java | 20 ++ .../src/java/view/constants/GUIConstants.java | 63 ++++ .../java/src/java/view/frames/MainFrame.java | 24 ++ src/main/java/src/java/view/menubar/Menu.java | 65 ++++ .../java/src/java/view/menubar/MenuBar.java | 39 +++ .../menubar/MenuBarLanguageController.java | 22 ++ .../java/view/menubar/MenuBarSeparator.java | 27 ++ .../java/src/java/view/menubar/MenuItem.java | 62 ++++ .../menuItems/HelpMenuItemFactory.java | 42 +++ .../menuItems/LanguageMenuItemFactory.java | 48 +++ .../view/menubar/menus/HelpMenuFactory.java | 30 ++ .../menubar/menus/LanguageMenuFactory.java | 30 ++ .../ConnectToServerPanel.java | 300 ++++++++++++++++++ .../ConnectionsTablePanel.java | 65 ++++ .../BasePanel/ControllingBasePanel.java | 39 +++ .../ControllingPanel/ControllingPanel.java | 120 +++++++ .../I_ControllingPanel_SwitchPanel.java | 9 + .../NFTFamilyPanel/IPv4FamilyButton.java | 35 ++ .../NFTFamilyPanel/IPv6FamilyButton.java | 35 ++ .../NFTFamilyPanel/InetFamilyButton.java | 35 ++ .../NFTFamilyPanel/NFTFamilyPanel.java | 71 +++++ .../NFTablesChainPanel.java | 26 ++ .../NFTablesRulePanel/NFTablesRulePanel.java | 26 ++ .../NFTablesTablePanel.java | 50 +++ .../MonitoringPanel/AlarmPanel/Alarm.java | 21 ++ .../AlarmPanel/AlarmPanel.java | 56 ++++ .../ConnectionsLineChartPanel.java | 106 +++++++ .../MonitoringPanel/MonitoringPanel.java | 52 +++ .../SystemInformationPanel.java | 32 ++ .../view/panels/StatusPanel/StatusPanel.java | 113 +++++++ .../classes/src/java/connect/Receiver.class | Bin 0 -> 1719 bytes target/classes/src/java/connect/Sender.class | Bin 0 -> 2552 bytes .../src/java/connect/client/Client.class | Bin 0 -> 258 bytes .../src/java/connect/client/TLSClient.class | Bin 0 -> 3476 bytes .../java/controller/ControllerThread.class | Bin 0 -> 2501 bytes .../ConnectionInformation.class | Bin 0 -> 3249 bytes .../ConnectionsProcessor.class | Bin 0 -> 4870 bytes .../NFTableInformation.class | Bin 0 -> 1265 bytes .../NFTablesProcessor$FieldType.class | Bin 0 -> 1580 bytes .../NFTablesProcessor.class | Bin 0 -> 5496 bytes .../controller/interfaces/Controller.class | Bin 0 -> 154 bytes .../java/controller/validate/Validate.class | Bin 0 -> 1709 bytes .../src/java/data/ConnectionData.class | Bin 0 -> 1746 bytes target/classes/src/java/main/Main.class | Bin 0 -> 544 bytes .../src/java/queues/ReceivingQueue.class | Bin 0 -> 592 bytes .../src/java/queues/SendingQueue.class | Bin 0 -> 584 bytes .../GUIConstants$E_ControllingSubPanel.class | Bin 0 -> 1572 bytes .../view/constants/GUIConstants$Frame.class | Bin 0 -> 1152 bytes .../constants/GUIConstants$Languages.class | Bin 0 -> 1231 bytes .../constants/GUIConstants$NFTablePanel.class | Bin 0 -> 1339 bytes .../view/constants/GUIConstants$Panel.class | Bin 0 -> 1484 bytes .../view/constants/GUIConstants$Status.class | Bin 0 -> 1275 bytes .../view/constants/GUIConstants$Theme.class | Bin 0 -> 1199 bytes .../java/view/constants/GUIConstants.class | Bin 0 -> 872 bytes .../src/java/view/frames/MainFrame.class | Bin 0 -> 300 bytes .../classes/src/java/view/menubar/Menu.class | Bin 0 -> 2604 bytes .../src/java/view/menubar/MenuBar.class | Bin 0 -> 1640 bytes .../menubar/MenuBarLanguageController.class | Bin 0 -> 806 bytes .../java/view/menubar/MenuBarSeparator.class | Bin 0 -> 875 bytes .../src/java/view/menubar/MenuItem.class | Bin 0 -> 2439 bytes .../menuItems/HelpMenuItemFactory$1.class | Bin 0 -> 741 bytes .../menuItems/HelpMenuItemFactory$2.class | Bin 0 -> 740 bytes .../menuItems/HelpMenuItemFactory.class | Bin 0 -> 1196 bytes .../menuItems/LanguageMenuItemFactory$1.class | Bin 0 -> 1492 bytes .../menuItems/LanguageMenuItemFactory$2.class | Bin 0 -> 1494 bytes .../menuItems/LanguageMenuItemFactory.class | Bin 0 -> 1427 bytes .../menubar/menus/HelpMenuFactory$1.class | Bin 0 -> 703 bytes .../view/menubar/menus/HelpMenuFactory.class | Bin 0 -> 1131 bytes .../menubar/menus/LanguageMenuFactory$1.class | Bin 0 -> 772 bytes .../menubar/menus/LanguageMenuFactory.class | Bin 0 -> 1350 bytes .../ConnectToServerPanel$1.class | Bin 0 -> 1531 bytes .../ConnectToServerPanel$2.class | Bin 0 -> 906 bytes .../ConnectToServerPanel.class | Bin 0 -> 6361 bytes .../ConnectionsTablePanel.class | Bin 0 -> 1765 bytes .../BasePanel/ControllingBasePanel$1.class | Bin 0 -> 909 bytes .../BasePanel/ControllingBasePanel.class | Bin 0 -> 1418 bytes .../ControllingPanel/ControllingPanel.class | Bin 0 -> 625 bytes .../I_ControllingPanel_SwitchPanel.class | Bin 0 -> 491 bytes .../NFTFamilyPanel/IPv4FamilyButton.class | Bin 0 -> 1250 bytes .../NFTFamilyPanel/IPv6FamilyButton.class | Bin 0 -> 1250 bytes .../NFTFamilyPanel/InetFamilyButton.class | Bin 0 -> 1250 bytes .../NFTFamilyPanel/NFTFamilyPanel.class | Bin 0 -> 2672 bytes .../NFTablesChainPanel.class | Bin 0 -> 847 bytes .../NFTablesRulePanel/NFTablesRulePanel.class | Bin 0 -> 840 bytes .../NFTablesTablePanel.class | Bin 0 -> 1725 bytes .../MonitoringPanel/AlarmPanel/Alarm.class | Bin 0 -> 781 bytes .../AlarmPanel/AlarmPanel.class | Bin 0 -> 2436 bytes .../ConnectionsLineChartPanel$1.class | Bin 0 -> 966 bytes .../ConnectionsLineChartPanel.class | Bin 0 -> 4116 bytes .../MonitoringPanel/MonitoringPanel.class | Bin 0 -> 1879 bytes .../SystemInformationPanel.class | Bin 0 -> 1343 bytes .../view/panels/StatusPanel/StatusPanel.class | Bin 0 -> 326 bytes .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 47 +++ 116 files changed, 2791 insertions(+), 17 deletions(-) create mode 100644 cacerts delete mode 100644 firewall-dashboard-simplified/pom.xml create mode 100644 mvn.cmd create mode 100644 my-cacerts create mode 100644 pom.xml create mode 100644 server.crt create mode 100644 server.key create mode 100644 src/main/java/src/java/connect/Receiver.java create mode 100644 src/main/java/src/java/connect/Sender.java create mode 100644 src/main/java/src/java/connect/client/Client.java create mode 100644 src/main/java/src/java/connect/client/TLSClient.java create mode 100644 src/main/java/src/java/controller/ControllerThread.java create mode 100644 src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java create mode 100644 src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java create mode 100644 src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java create mode 100644 src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java create mode 100644 src/main/java/src/java/controller/interfaces/Controller.java create mode 100644 src/main/java/src/java/controller/validate/Validate.java create mode 100644 src/main/java/src/java/data/ConnectionData.java rename {firewall-dashboard-simplified/src/main/java/src/java => src/main/java/src/java/main}/Main.java (83%) create mode 100644 src/main/java/src/java/queues/ReceivingQueue.java create mode 100644 src/main/java/src/java/queues/SendingQueue.java create mode 100644 src/main/java/src/java/view/constants/GUIConstants.java create mode 100644 src/main/java/src/java/view/frames/MainFrame.java create mode 100644 src/main/java/src/java/view/menubar/Menu.java create mode 100644 src/main/java/src/java/view/menubar/MenuBar.java create mode 100644 src/main/java/src/java/view/menubar/MenuBarLanguageController.java create mode 100644 src/main/java/src/java/view/menubar/MenuBarSeparator.java create mode 100644 src/main/java/src/java/view/menubar/MenuItem.java create mode 100644 src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java create mode 100644 src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java create mode 100644 src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java create mode 100644 src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java create mode 100644 src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java create mode 100644 src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java create mode 100644 src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java create mode 100644 src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java create mode 100644 src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java create mode 100644 src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java create mode 100644 src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java create mode 100644 src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java create mode 100644 src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java create mode 100644 target/classes/src/java/connect/Receiver.class create mode 100644 target/classes/src/java/connect/Sender.class create mode 100644 target/classes/src/java/connect/client/Client.class create mode 100644 target/classes/src/java/connect/client/TLSClient.class create mode 100644 target/classes/src/java/controller/ControllerThread.class create mode 100644 target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.class create mode 100644 target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.class create mode 100644 target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.class create mode 100644 target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor$FieldType.class create mode 100644 target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.class create mode 100644 target/classes/src/java/controller/interfaces/Controller.class create mode 100644 target/classes/src/java/controller/validate/Validate.class create mode 100644 target/classes/src/java/data/ConnectionData.class create mode 100644 target/classes/src/java/main/Main.class create mode 100644 target/classes/src/java/queues/ReceivingQueue.class create mode 100644 target/classes/src/java/queues/SendingQueue.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$E_ControllingSubPanel.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$Frame.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$Languages.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$NFTablePanel.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$Panel.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$Status.class create mode 100644 target/classes/src/java/view/constants/GUIConstants$Theme.class create mode 100644 target/classes/src/java/view/constants/GUIConstants.class create mode 100644 target/classes/src/java/view/frames/MainFrame.class create mode 100644 target/classes/src/java/view/menubar/Menu.class create mode 100644 target/classes/src/java/view/menubar/MenuBar.class create mode 100644 target/classes/src/java/view/menubar/MenuBarLanguageController.class create mode 100644 target/classes/src/java/view/menubar/MenuBarSeparator.class create mode 100644 target/classes/src/java/view/menubar/MenuItem.class create mode 100644 target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$1.class create mode 100644 target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$2.class create mode 100644 target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory.class create mode 100644 target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$1.class create mode 100644 target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$2.class create mode 100644 target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory.class create mode 100644 target/classes/src/java/view/menubar/menus/HelpMenuFactory$1.class create mode 100644 target/classes/src/java/view/menubar/menus/HelpMenuFactory.class create mode 100644 target/classes/src/java/view/menubar/menus/LanguageMenuFactory$1.class create mode 100644 target/classes/src/java/view/menubar/menus/LanguageMenuFactory.class create mode 100644 target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$1.class create mode 100644 target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$2.class create mode 100644 target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.class create mode 100644 target/classes/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel$1.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/ControllingPanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.class create mode 100644 target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.class create mode 100644 target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.class create mode 100644 target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.class create mode 100644 target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel$1.class create mode 100644 target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.class create mode 100644 target/classes/src/java/view/panels/MonitoringPanel/MonitoringPanel.class create mode 100644 target/classes/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.class create mode 100644 target/classes/src/java/view/panels/StatusPanel/StatusPanel.class create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/README.md b/README.md index 4686787..3408ee1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,19 @@ # firewall-dashboard-simplified +@author Aaron Moser +@date 02.12.2023 +@lastCHange 25.01.2024 + +Im Rahmen eines Hand on Seminar an der Hochschule Offenburg entwickelte Software zur Remote-ueberwachung und -veraenderung einer Firewall. + +## Client +Der Client wird in Java programmiert. Als UI Framework wird Java Swing verwendet. + +## Server +Der Server (Agent) wird in Python programmiert. + +## Simplified + Project containing the Hands On Seminar code. Since last approach was to cluttered, decided to simplify the design. diff --git a/cacerts b/cacerts new file mode 100644 index 0000000000000000000000000000000000000000..4eba2fa56945b5fb6e0cab71039484e7692de226 GIT binary patch literal 1942 zcmV;H2Wj{)f(McU0Ru3C2RsG|Duzgg_YDCD0ic2hEd+uGDKLTuB`|^qAqEL5hDe6@ z4FLxRpn?YyFoFjT0s#Opf(Hi%2`Yw2hW8Bt2LUi<1_>&LNQUUSNHn7KIobjOClCSwATSID2r7n1hW8Bu2?YQ! z9R>+thDZTr0|Wso1Q1!8BXYRwnSTc=v(B7T=KFwx29T%r*%14+Cmc0EZ_w%b6ANp5 z>`t-;X)q|@1qli0apPENF3I8FxZ4fZLsSEbYfoUnjrw^a(O9GfX5o_9C>PG`3Mg^t zQ1Llvr0q7L(n|{|eW*-@zOG79W!@!Dj87XKJ!tX+b^Xk9AFF~p`*90YL#(M@ZQi)= zj=86~h$nI`h;2!2h&*fpoEQ+Vn$7}|!w|S5F6CB(9z5_n(o~B*5a6&Xknj6Ah!sd6 zc#p^^N)+ro&uJFhW*}?@LLJ?wnj5BR?vj&>%xGy`N_u0SVP8-F%oeXo7?OX)(q^m3DsUnM>VuYQRniy{Z}R` z2oxjowt(1|@E%Rt`A*+_)`zRghY?Wy4uvL?x+hgoW2LD@Ba1G89hD7K(`Yc)$y}hQ z9LTZZ!Ms$%xC#?@NtOYmzrQoU8Lm-1L4sfe-7!Ci$~3XxMcqvEw++r}pG){m@}|Cu=}y>o>onKB49XHR(IMo7 z#>GpC5<*x;XZbXaSULh*VP;Lzfb_*%ee*fg6W;+gkYlSJB8u;>E@j>i8Y?LW^0KcGc|%+kTi5Ta0ABo$lDcuz;BomMw09bFOT!Xw*`igANzp0pG$ z!<51c(Nu@t@R{j()%YxLXr?n-?#KH&_AT+ZxbI#Zv<~Pp1c@485!r?86qW7#88Ljc zFTAK_)fv1hmnQrQX&;fkiF1RV0MX)LsQeG1F?uH-b0?3zu0Ex0#X(%QlLun)e(0FG z!IeBe;Vx_(WBvRvmHC9s^sZbh_Ycq^)=C?Z^4y9%Itg{H4jG;4#zox2n2SGhJ@dEF zU9C?x^kNd)P|)Sb5`rn(0%4X`g3C#e3X3#0rh)-CMmU3ZNODzRn8EL)S!3E#XGyFN zvq?R)7$w1AAWP_=1CQ-h8JXm-2zzTwXf&9)8Fh&u>O$()u%R-qFU>)+^#h!Jo=UmP z6yCz_)Btg$;E10mWBu_0u?P&J#BwvY0Cpk@BF6M8%l=lG&X3wpi7A0URRQ?9N5d3&>L zFb2baHABIheo+0;`ZaMTPTR4x-(y;8tF`n+ zMH}~@@(Cy^fF<7wfhjtNK6m2cX!s9KWPSzw)e4JcEm^$#M0cUI>i=$ywYlwVV%iy9 z+b(IVC^#2tn{2GtH5$^vxCWjU_{=~=fm~8uvu3|!>3glMH?{H8`BfHUx+MOz!=jbU z!@JQRg_2K1@HTNuy>PGh0Q(n|0{X5G(-wJwuaRd%Ge1wvg99E++Mkkv0ytLXb12VC zjxNoZTZr7P`~0^(r;QkHQlWSCT@RdBgu0nYlmFUD64#fmvN}@>Fiii(E)Pzh?hAxI zjq^ai{7;DVx!63>M(Z&NC9O71OfpC00bcZlD}~4O4&AbjYUsFbFk8Bg-Ltsd`tW4O9kmzJpcFv c6ePi0W)K5BX&1M+;M1& literal 0 HcmV?d00001 diff --git a/firewall-dashboard-simplified/pom.xml b/firewall-dashboard-simplified/pom.xml deleted file mode 100644 index b025e98..0000000 --- a/firewall-dashboard-simplified/pom.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - 4.0.0 - - src.java - firewall-dashboard-simplified - 1.0-SNAPSHOT - - - 1.8 - 1.8 - - - \ No newline at end of file diff --git a/mvn.cmd b/mvn.cmd new file mode 100644 index 0000000..e69de29 diff --git a/my-cacerts b/my-cacerts new file mode 100644 index 0000000000000000000000000000000000000000..8a8265cdd68bcabe17bbd93d3ebd4da9b1cfd631 GIT binary patch literal 1942 zcmV;H2Wj{)f(McU0Ru3C2RsG|Duzgg_YDCD0ic2hEd+uGDKLTuB`|^qAqEL5hDe6@ z4FLxRpn?YyFoFjT0s#Opf(Hi%2`Yw2hW8Bt2LUi<1_>&LNQU+thDZTr0|Wso1P~y_#m&2HBz|7QWIK>3SqXrG29Q_h*4tV`ybhr*!P=7$I_?p9 zg>(3`a-W11{kgB!a3?{aOvzx^#&MKZ-9wwj8FSH-*S1mtqxyzv+v^bTr>8?s?1JQ zZ0pLSNeaKAtjs5M!qDtyaU!TP0xYr|H5@i7-NBSr^7@)!Bn7EgT@`$-& z-AkuQkeM%iie+E&A?AYa=~>_UxK@$uPI(P1FA|Lx)vD3Zm>_rkM|M?t-<&}9OvR1X zK;U6q_1nH)_jo7wO|S4;lc@Sa!)FzGLi5$9mN0YK2;($OwY*`R3Y8)P^flzuEtm{+ zq7cmGed%JByV0Q7zP~^y7vuS76~y&4d~d&+P_hW7_DYv_ft%zyTUtDUIWP;SnMUYOVrI?TOsL~DsB)wS$%hbpRINP1!kPu@t zBdLB)l2}Yf!=_9PQPRHwr$(hOPKT#MQi{X9U0gDHiU z)lElNd%G#W z`L*Py@FQopXh35wp-3n~X-C-s1e%Q&rjAefV+a}>+Wnn7-=TWT&EIF(lKyk-IbYp5 zizGb!{Y$BB z*|BnuUknt^wA-AZYXu=8O}Ww%!`}5)qoiZuT02csK%QH&L30(~oo}OS7P>B}eCA(M zz6+4}_JDgsv?#U9s&ff7Dka*pI(ZluCRKnki%oW-D5P>qGPMTT&orUX3E&u(ZKaVg zAlSueD$lIQ79zN4062z22C(ZEhS6zg=*~mW$IqH0uMP=pII*goVnKgOu+A`s{MW8l zwjwAf2=F(s3Pspk^iW$F*qml`WYoR`P?m&Jv?GQYnyO?85wareb#y5$qL-bj?j)&` zL3#ZQNO-CYB7)pBU6%bJwCoh}`CpUc#w*4s?hS=!F$^4-)YLpf)d1aFiZ_u~?iRXeIEsJGd#>qLzN?OOnipKYl z1t>mr#FS^^sYx~7r%p+UjGW0}4P}XC+vY=$05Ph~@P*+g)c^Ojxmjk)n_Z!Wk@Q^n z1xWnW&$uC>LP?t-?Lp*j$u%kgc9#0f*lQl^wx>w_gqy|m%}A9bFEc_n^->XRqMM9M zu`$uc^K`SFCt=c}x#iJ^Fp$%s*@8ou938Rp>2BpHjO8iYs+drNc%=y6YqO^PuFBcU zQY8qnxt5YchflJ?qQG*U10`*MB48b5`Jz*iin1a)sDPq4XzGFE6by<}q7box1&ZUR zv}A@i8@3t?VAUrm=w+hgNwKNVxWQ3Ck%Y%xplmdZN7LteB|qO#6JDAon9lHI5X2`D ztyWHM&_OZ)cGKCEewooUEh!Zf7|!&^o_Oe{;xb(9v~e+~@+yXoH*lQNC9O71OfpC00bc5pw)i)+y2Mf?Fr;pi{xP7_eMN%Tk*Y;)2#axr5A7n c6gvGgZ+Guu5!cY&h2i&JMOp7 + + 4.0.0 + + src.java + src + 1.0-SNAPSHOT + + + 21 + 21 + + + + + + + junit + junit + 4.11 + test + + + org.jfree + jfreechart + 1.5.3 + + + + + com.fasterxml.jackson.core + jackson-core + 2.16.0 + + + + + com.fasterxml.jackson.core + jackson-databind + 2.16.0 + + + + + + + + maven-release-plugin + 3.3.3 + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + + diff --git a/server.crt b/server.crt new file mode 100644 index 0000000..3f16705 --- /dev/null +++ b/server.crt @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +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 +49fGV0I4AFMm8mcpmKCO3CQ/arX6khFSkQ== +-----END CERTIFICATE----- diff --git a/server.key b/server.key new file mode 100644 index 0000000..42e2993 --- /dev/null +++ b/server.key @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +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 +RJkD/R0JAl/7yp5XNB0KmA== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/src/main/java/src/java/connect/Receiver.java b/src/main/java/src/java/connect/Receiver.java new file mode 100644 index 0000000..251371c --- /dev/null +++ b/src/main/java/src/java/connect/Receiver.java @@ -0,0 +1,61 @@ +/** + * @author Aaron Moser + * @date 26.12.2023 + * @lastChange 25.01.2024 + */ +package src.java.connect; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import src.java.connect.client.TLSClient; +import src.java.queues.ReceivingQueue; + +public class Receiver extends Thread { + private static Receiver instance = null; + + private boolean receiverRunning = false; + + BufferedReader reader = null; + + private Receiver() {} + + public static Receiver getInstance() { + if (instance == null) { + instance = new Receiver(); + } + return instance; + } + + @Override + public void run() { + receiverRunning = true; + while (receiverRunning) { + receiveData(); + } + } + + public void receiveData() { + try { + if (TLSClient.getSSLSocket().isConnected()) { + if (reader == null) { + reader = new BufferedReader(new InputStreamReader(TLSClient.getSSLSocket().getInputStream())); + } + if (reader != null) { + String response; + while ((response = reader.readLine()) != null) { + //System.out.println(response); + ReceivingQueue.getInstance().add(response); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void stopThread() { + this.receiverRunning = false; + } +} diff --git a/src/main/java/src/java/connect/Sender.java b/src/main/java/src/java/connect/Sender.java new file mode 100644 index 0000000..90dd2df --- /dev/null +++ b/src/main/java/src/java/connect/Sender.java @@ -0,0 +1,73 @@ +/** + * @author Aaron Moser + * @date 26.12.2023 + * @lastChange 25.01.2024 + */ +package src.java.connect; + +import java.io.IOException; +import java.io.PrintWriter; + +import src.java.connect.client.TLSClient; +import src.java.queues.SendingQueue; + +/** + * TODO change pattern from singleton to dependency injection. + */ +public class Sender extends Thread { + private static Sender instance = null; + + private boolean senderRunning = false; + + private PrintWriter writer = null; + + private Sender() {} + + public static Sender getInstance() { + if (instance == null) { + instance = new Sender(); + } + return instance; + } + + @Override + public void run() { + senderRunning = true; + while (senderRunning) { + try { + // Wait until controller puts requests into sending queue. + String item = SendingQueue.getInstance().take(); + System.out.println("Sender sends: " + item); + sendData(item); + } catch (InterruptedException e) { + System.out.println("Sender thread was interrupted."); + Thread.currentThread().interrupt(); + return; + } + } + } + + private void sendData(String data) { + try { + if (TLSClient.getSSLSocket().isConnected()) { + if (writer == null) { + writer = new PrintWriter(TLSClient.getSSLSocket().getOutputStream()); + } + if (writer != null && data != null) { + writer.println(data); + writer.flush(); + } else { + System.out.println("Connection is not established."); + } + } else { + System.out.println("SSLSocket is null."); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void stopThread() { + this.senderRunning = false; + } +} diff --git a/src/main/java/src/java/connect/client/Client.java b/src/main/java/src/java/connect/client/Client.java new file mode 100644 index 0000000..82557fe --- /dev/null +++ b/src/main/java/src/java/connect/client/Client.java @@ -0,0 +1,13 @@ +/** + * @author Aaron Moser + */ +package src.java.connect.client; + +import src.java.data.ConnectionData; + +public interface Client { + public boolean createConnection(ConnectionData connectionData); + public void startSender(); + public void startReceiver(); + public void closeConnection(); +} diff --git a/src/main/java/src/java/connect/client/TLSClient.java b/src/main/java/src/java/connect/client/TLSClient.java new file mode 100644 index 0000000..0280366 --- /dev/null +++ b/src/main/java/src/java/connect/client/TLSClient.java @@ -0,0 +1,97 @@ +/** + * @author Aaron Moser + * @lastChange 25.01.2024 + */ +package src.java.connect.client; + +import java.io.FileInputStream; +import java.io.IOException; + +import java.net.UnknownHostException; + +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManagerFactory; + +import src.java.connect.Receiver; +import src.java.connect.Sender; +import src.java.data.ConnectionData; + +public final class TLSClient implements Client { + + private static SSLSocket sslSocket; + + public static synchronized SSLSocket getSSLSocket() { + return sslSocket; + } + + @Override + public boolean createConnection(ConnectionData connectionData) { + try { + String ipAddress = connectionData.ipAddress(); + int port = connectionData.port(); + String keyStorePath = connectionData.keyStorePath(); + String keyStprePassPhrase = connectionData.keyStorePassphrase(); + + KeyStore truststore = KeyStore.getInstance("JKS"); + truststore.load(new FileInputStream(keyStorePath), keyStprePassPhrase.toCharArray()); + + // Create a TrustManager that trusts the certificates in the truststore + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(truststore); + + // Create an SSL context with the trust manager + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustManagerFactory.getTrustManagers(), null); + + // Set the SSL context on the SSLSocketFactory + SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + sslSocket = (SSLSocket) sslSocketFactory.createSocket(ipAddress, port); + return true; + } catch (UnknownHostException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return false; + } catch (CertificateException e) { + e.printStackTrace(); + return false; + } catch (KeyStoreException e) { + e.printStackTrace(); + return false; + } catch (KeyManagementException e) { + e.printStackTrace(); + return false; + } + } + + public void startSender() { + Sender.getInstance().start(); + } + + public void startReceiver() { + Receiver.getInstance().start(); + } + + public void closeConnection() { + try { + if (sslSocket != null) { + sslSocket.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/src/java/controller/ControllerThread.java b/src/main/java/src/java/controller/ControllerThread.java new file mode 100644 index 0000000..b526e6d --- /dev/null +++ b/src/main/java/src/java/controller/ControllerThread.java @@ -0,0 +1,97 @@ +package src.java.controller; + +import src.java.connect.client.Client; +import src.java.connect.client.TLSClient; +import src.java.controller.interfaces.Controller; +import src.java.controller.validate.Validate; +import src.java.data.ConnectionData; +import src.java.queues.SendingQueue; + +/** + * @author Aaron Moser + * @date 01.12.2023 + * @lastChange 25.01.2024 + */ + +public class ControllerThread extends Thread implements Controller { + + private final static boolean SUCCESSFUL = true; + + private Client client = null; + + public ControllerThread() { + + } + + public void run() { + + //startThreads(); + + //this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Connected); + //this.model.getConnectionModel().setIPAddress(ipAddress); + //this.model.getConnectionModel().setPort(port); + //this.model.incrementVersion(); + + //SendingQueue.getInstance().add("getSysInf"); + //SendingQueue.getInstance().add("getCon"); + //SendingQueue.getInstance().add("getNFTConf"); + + } + + private boolean createConnectionStartThreadsAndGetInitialData(ConnectionData connectionData) { + boolean connectToServerSuccess = createConnectionToServer(connectionData); + + if (connectToServerSuccess) { + startThreads(); + + //this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Connected); + //this.model.getConnectionModel().setIPAddress(ipAddress); + //this.model.getConnectionModel().setPort(port); + //this.model.incrementVersion(); + + sendInitialRequests(); + return true; + } + return false; + } + + /** + * Is called if controller received event from view, which indicates, + * that the connect to server button was pressed. The function takes + * a parameter of type ViewToControllerData which contains the information + * necessary to establish a connection to a server. + * @param viewToControllerData + */ + private boolean createConnectionToServer(ConnectionData connectionData) { + //this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Pending); + + boolean validIP = Validate.isValidIPv4Address(connectionData.ipAddress()); + boolean validPort = Validate.isValidPort(connectionData.port(), 1, 60000); + System.out.println("IP: " + validIP + ", Port: " + validPort); + + if (validIP) { + if (validPort) { + this.client = new TLSClient(); + if (this.client.createConnection(connectionData) == SUCCESSFUL) { + return true; + } + } else { + //TODO send event to view that port is not valid. + } + } else { + //TODO send event to view that ip is not valid. + } + return false; + } + + private void startThreads() { + this.client.startReceiver(); + this.client.startSender(); + } + + private void sendInitialRequests() { + SendingQueue.getInstance().add("getSysInf"); + SendingQueue.getInstance().add("getCon"); + SendingQueue.getInstance().add("getNFTConf"); + } +} diff --git a/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java new file mode 100644 index 0000000..b48aab0 --- /dev/null +++ b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java @@ -0,0 +1,36 @@ +/** + * @author Aaron Moser + * @date 28.12.2023 + */ +package src.java.controller.DataProcessing.ConnectionsProcessing; + +/** + * Record displays packed information about one connection at the agent side. + */ +public final record ConnectionInformation( + int fileDescriptor, + String addressFamily, + String socketKind, + String localAddress, + int localPort, + String remoteAddress, + int remotePort, + String status, + int pid) { + + public boolean equals(ConnectionInformation other) { + return this.fileDescriptor == other.fileDescriptor && this.pid == other.pid; + } + + public String toString() { + return fileDescriptor + " | " + + addressFamily + " | " + + socketKind + " | " + + localAddress + " | " + + localPort + " | " + + remoteAddress + " | " + + remotePort + " | " + + status + " | " + + pid; + } +} diff --git a/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java new file mode 100644 index 0000000..4698ccd --- /dev/null +++ b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java @@ -0,0 +1,191 @@ +/** + * @author Aaron Moser + * @date 28.12.2023 + */ +package src.java.controller.DataProcessing.ConnectionsProcessing; + +/** + * Provides a function to retrieve information from a connection string. + * sconn(fd=9, family=, type=, laddr='', raddr='', status='NONE', pid=1789) + * fd stands for file descriptor + * laddr: local address + * raddr: remote address + * pid stands for process id + */ +public final class ConnectionsProcessor { + private static final int HEAD_LENGTH = 6; + private static final int TAIL_LENGTH = 1; + + private static final String[] ADDRESS_FAMILIES = { + "AF_UNIX", // Unix domain sockets + "AF_LOCAL", // Unix domain sockets + "AF_INET", // IPv4 communication + "AF_INET6", // IPv6 communication + "AF_NETLINK", // Used for communication with the Linux kernel using the Netlink protocol + "AF_PACKET", // Low-level packet manipulation + "AF_BLUETOOTH", // Bluetooth communication + "AF_CAN", // Controller Area Network (CAN) communication + "AF_RDS", // Reliable Datagram Sockets (RDS) communication + "AF_ALG", // Cryptographic socket support + "AF_VSOCK", // Virtual Socket (vsock) communication for hypervisor-based applications + "AF_XDP" // eXpress Data Path (XDP) socket family for high-performance packet processing + }; + + private static final String[] SOCKET_KINDS = { + "SOCK_STREAM", // provides a reliable, stream-oriented connection, typically used for TCP sockets + "SOCK_DGRAM", // provides a connectionless, unreliable communication method, typically used for UDP sockets + "SOCK_RAW", // allows low-level access to network protocols, often used for custom packet manipulation + "SOCK_SEQPACKET", // similar to SOCK_STREAM but provides a record-oriented, connection-based socket + "SOCK_RDM", // reliable datagram sockets + "SOCK_PACKET" // used for low-level packet capture and injection + }; + + private static final String[] CONNECTION_STATUSES = { + "NONE", + "ESTABLISHED", // socket connection is established and data can be exchanged + "LISTEN", // socket is listening for incoming connections + "CLOSE_WAIT", // socket is waiting for the remote end to close the connection + "TIME_WAIT", // socket is waiting for any remaining packets to arrive after the connection is closed + "CLOSED", // socket is closed and no longer in use + "SYN_SENT", // socket has sent a SYN packet to initiate a connection + "SYN_RECEIVED", // socket has received a SYN packet and is waiting for an ACK to complete the connection establishment + "FIN_WAIT1", // socket is in the process of closing the connection + "FIN_WAIT2" // socket is in the process of closing the connection + }; + + /** + * Processes a data string which contains the information about one connection at the agents side. + * @param dataString the string which contains the information. + * @return an object of type ConnectionInformation. + */ + public static ConnectionInformation processDataString(String dataString) { + String[] dataStringParts = removeHeadAndTail(dataString).split(" "); + + int fileDescriptor = -1; + String addressFamily = ""; + String socketKind = ""; + String localAddress = ""; + int localPort = -1; + String remoteAddress = ""; + int remotePort = -1; + String status = ""; + int pid = -1; + + for (int i = 0; i < dataStringParts.length; i++) { + String part = dataStringParts[i]; + + if (part.startsWith("fd")) { + fileDescriptor = processFileDescriptor(part); + + } else if (part.startsWith("family")) { + addressFamily = processAddressFamily(part); + + } else if (part.startsWith("type")) { + socketKind = processSocketKind(part); + + } else if (part.startsWith("laddr")) { + localAddress = processAddress(part); + // Check if entry after is of type port + if (dataStringParts[i+1].startsWith("port")) { + localPort = processPort(dataStringParts[i+1]); + i++; + } + } else if (part.startsWith("raddr")) { + remoteAddress = processAddress(part); + // CHeck if entry after is of type port + if (dataStringParts[i+1].startsWith("port")) { + remotePort = processPort(dataStringParts[i+1]); + i++; + } + } else if (part.startsWith("status")) { + status = processStatus(part); + + } else if (part.startsWith("pid")) { + pid = processPID(part); + + } else { + // Do nothing + } + } + + return new ConnectionInformation(fileDescriptor, addressFamily, socketKind, localAddress, localPort, remoteAddress, remotePort, status, pid); + } + + private static String removeHeadAndTail(String input) { + return input.substring(HEAD_LENGTH, input.length()-TAIL_LENGTH); + } + + private static int processFileDescriptor(String fileDescriptorString) { + int fileDescriptor = 0; + try { + fileDescriptor = Integer.valueOf(fileDescriptorString.substring(3, fileDescriptorString.length()-1)); + } catch (Exception e) { + System.out.println(e); + } + return fileDescriptor; + } + + private static String processAddressFamily(String addressFamilyString) { + for (String addressFamily : ADDRESS_FAMILIES) { + if (addressFamilyString.contains(addressFamily)) { + return addressFamily; + } + } + return ""; + } + + private static String processSocketKind(String socketKindString) { + for (String socketKind : SOCKET_KINDS) { + if (socketKindString.contains(socketKind)) { + return socketKind; + } + } + return ""; + } + + private static String processAddress(String addressString) { + if (addressString.contains("''")) { + // If it's an empty address, it contains '' + return ""; + + } else if (addressString.contains("ip") && addressString.contains("[")) { + String ipv6Head = "xaddr=addr(ip='["; + // If it's an ipv6 address, since format is xaddr=addr(ip='[ipv6 address]', + return addressString.substring(ipv6Head.length(), addressString.length()-3); + + } else if (addressString.contains("ip")) { + String ipv4Head = "xaddr=addr(ip='"; + // If it's an ipv4 address, since format is xaddr=addr(ip='ipv4 address', + return addressString.substring(ipv4Head.length(), addressString.length()-2); + + } else { + String head = "xaddr='"; + // If it's not an empty or ip address, it is xaddr='path' + return addressString.substring(head.length(), addressString.length()-1); + } + } + + private static int processPort(String portString) { + int port = 0; + try { + port = Integer.valueOf(portString.substring(5, portString.length()-2)); + } catch (Exception e) { + System.out.println(e); + } + return port; + } + + private static String processStatus(String statusString) { + return statusString.substring(8, statusString.length()-2); + } + + private static int processPID(String pidString) { + int processID = -1; + try { + processID = Integer.valueOf(pidString.substring(4)); + } catch (Exception e) { + System.out.println(e); + } + return processID; + } +} diff --git a/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java new file mode 100644 index 0000000..b239b4d --- /dev/null +++ b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java @@ -0,0 +1,54 @@ +/** + * @author Aaron Moser + * @date 29.12.2023 + */ +package src.java.controller.DataProcessing.nftablesProcessing; + +import java.util.LinkedList; + +public class NFTableInformation { + // Outer list: tables + // Middle lists: chains + // Inner lists: rules + private LinkedList>> tables; + + public NFTableInformation() {} + + public NFTableInformation(NFTableInformation nftInf) { + this.tables = new LinkedList>>(nftInf.tables); + } + +// list of list of list +// -> table1 +// -> chain1 +// -> tablename +// -> chainname +// -> rule1 +// -> rule2 + +// -> table2 + +/* +for (LinkedList> table : tables) { + for (LinkedList chain : table) { + for (String rule : chain) { + if (rule.startsWith("{\"table")) { + System.out.println(rule); + } else if (rule.startsWith("{\"chain")) { + System.out.println("\t" + rule); + } else { + System.out.println("\t\t" + rule); + } + } + } +} +*/ + + public LinkedList>>getTables() { + return tables; + } + + public void setTables(LinkedList>> tables) { + this.tables = tables; + } +} diff --git a/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java new file mode 100644 index 0000000..1c1c370 --- /dev/null +++ b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java @@ -0,0 +1,159 @@ +/** + * @author Aaron Moser + * @date 29.12.2023 + * @lastChange 30.12.2023 + */ +package src.java.controller.DataProcessing.nftablesProcessing; + +import java.util.LinkedList; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeType; +import com.fasterxml.jackson.databind.node.NullNode; + +public final class NFTablesProcessor { + private static final String NFT_MAIN_FIELD = "nftables"; + private static final String TABLE_FIELD = "table"; + private static final String CHAIN_FIELD = "chain"; + private static final String RULE_FIELD = "rule"; + private static final String NAME_FIELD = "name"; + + private enum FieldType { + TABLE, + CHAIN, + RULE, + NONE + } + + public static NFTableInformation processDataString(String data) { + NFTableInformation nfTableInformation = new NFTableInformation(); + + ObjectMapper objectMapper = new ObjectMapper(); + + LinkedList>> tables = new LinkedList>>(); + LinkedList> tableChains = null; + LinkedList tableChainRules = null; + + try { + JsonNode nfttree = objectMapper.readTree(data); + JsonNode mainRoot = getField(nfttree, NFT_MAIN_FIELD); + + String lastTable = null; + FieldType lastNodeType = FieldType.NONE; + for (JsonNode nftObject : mainRoot) { + // If next node is of type table + if (isTableEntry(nftObject)) { + switch (lastNodeType) { + // Last node was of type table. Normally chain cares + // about storing the table entry at the beginning of + // the chains rules list but since table is empty, + // the next iteration has to care about storing the + // table at the list. + case FieldType.TABLE: { + tableChainRules = new LinkedList(); + tableChainRules.add(lastTable); + tableChains = new LinkedList>(); + tableChains.add(new LinkedList(tableChainRules)); + tables.add(new LinkedList>(tableChains)); + } // Intended fall through + case FieldType.CHAIN: // Intended fall through + case FieldType.RULE: // Intended fall through + case FieldType.NONE: // Intended fall through + default: { + // Reset all lists except tables list + tableChainRules = new LinkedList(); + tableChains = new LinkedList>(); + } + } + lastNodeType = FieldType.TABLE; + // Store current table description entry + lastTable = nftObject.toString(); + + // If next node is chain, the node before must have been of type table, chain or rule + } else if (isChainEntry(nftObject)) { + switch (lastNodeType) { + case FieldType.TABLE: { + // Add table and chain to new table chain rules list + tableChainRules.add(lastTable); + tableChainRules.add(nftObject.toString()); + }break; + case FieldType.CHAIN: // Intended fall through + case FieldType.RULE: { + // Add rules of last chain to chain and reset list + tableChains.add(new LinkedList(tableChainRules)); + tableChainRules = new LinkedList(); + // Then add this chains description to list + tableChainRules.add(nftObject.toString()); + }break; + case FieldType.NONE: // Intended fall through + default: { + System.out.println("Error, missing table before chain."); + }break; + } + lastNodeType = FieldType.CHAIN; + + } else if (isRuleEntry(nftObject)) { + switch (lastNodeType) { + case FieldType.CHAIN: // Intended fall through + case FieldType.RULE: { + tableChainRules.add(nftObject.toString()); + }break; + case FieldType.TABLE:// Intended fall through + case FieldType.NONE: // Intended fall through + default: { + System.out.println("Error, missing chain before rule."); + }break; + } + lastNodeType = FieldType.RULE; + + } else { + // Do nothing + } + } + if (tableChains != null && !tableChains.isEmpty()) { + tables.add(new LinkedList>(tableChains)); + } + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + nfTableInformation.setTables(tables); + return nfTableInformation; + } + + private static boolean isTableEntry(JsonNode node) { + return isSpecifiedEntry(node, TABLE_FIELD); + + } + + private static boolean isChainEntry(JsonNode node) { + return isSpecifiedEntry(node, CHAIN_FIELD); + } + + private static boolean isRuleEntry(JsonNode node) { + return isSpecifiedEntry(node, RULE_FIELD); + } + + private static boolean isSpecifiedEntry(JsonNode node, String type) { + if (node.getNodeType() != JsonNodeType.NULL) { + JsonNode maybeNode = node.get(type); + if (maybeNode != null && maybeNode.toString() != "null") { + return true; + } + } + return false; + } + + private static JsonNode getField(JsonNode node, String fieldName) { + if (node.getNodeType() != JsonNodeType.NULL) { + if (node.get(fieldName) != null) { + return node.get(fieldName); + } + } + return NullNode.getInstance(); + } +} diff --git a/src/main/java/src/java/controller/interfaces/Controller.java b/src/main/java/src/java/controller/interfaces/Controller.java new file mode 100644 index 0000000..f649897 --- /dev/null +++ b/src/main/java/src/java/controller/interfaces/Controller.java @@ -0,0 +1,5 @@ +package src.java.controller.interfaces; + +public interface Controller { + public void start(); +} diff --git a/src/main/java/src/java/controller/validate/Validate.java b/src/main/java/src/java/controller/validate/Validate.java new file mode 100644 index 0000000..9b3061a --- /dev/null +++ b/src/main/java/src/java/controller/validate/Validate.java @@ -0,0 +1,70 @@ +/** + * @author Aaron Moser + * @date 05.12.2023 + * @lastChange 25.01.2024 + */ + + package src.java.controller.validate; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Validate { + + /** + * Checks if overhanded string is valid ip address, by checking if its length is 13 or less, + * it contains exactly 4 numbers and if the numbers are in valid range. + * @param ipv4Address + * @return + */ + public static boolean isValidIPv4Address(String ipv4Address) { + boolean isValidIPv4Address = false; + // Maximum length of ipv4 address is 13 characters, only evaluate if + // length of string is less or equal to 13. + if (ipv4Address.length() <= 13) { + String[] numbersAsString = ipv4Address.split("\\."); + // If ip address contains exactly 4 parts splitted by dots: + if (numbersAsString.length == 4) { + // Transform each part to integer and check if in valid range. + for (String numberAsString : numbersAsString) { + int number = Integer.valueOf(numberAsString); + if (number < 0 || number > 255) { + isValidIPv4Address = false; + break; + } + } + isValidIPv4Address = true; + } else { + isValidIPv4Address = false; + } + } + return isValidIPv4Address; + } + + /** + * Checks if overhanded ipv6 address is valid by applying a regex to it. + * @param ipv6Address + * @return + */ + public static boolean isValidIPv6Address(String ipv6Address) { + Pattern pattern = Pattern.compile("^([0-9a-f]{4}:){7}[0-9a-f]{4}$", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(ipv6Address); + boolean matchFound = matcher.find(); + if(matchFound) { + return true; + } else { + return false; + } + } + + /** + * Port is validated by checking if in bounds of overhanded values. + * @param port + * @param startOfRange + * @param endOfRange + * @return + */ + public static boolean isValidPort(int port, int startOfRange, int endOfRange) { + return (port >= startOfRange && port <= endOfRange); + } +} diff --git a/src/main/java/src/java/data/ConnectionData.java b/src/main/java/src/java/data/ConnectionData.java new file mode 100644 index 0000000..1a16653 --- /dev/null +++ b/src/main/java/src/java/data/ConnectionData.java @@ -0,0 +1,5 @@ +package src.java.data; + +public final record ConnectionData(String ipAddress, int port, String keyStorePath, String keyStorePassphrase) { + +} diff --git a/firewall-dashboard-simplified/src/main/java/src/java/Main.java b/src/main/java/src/java/main/Main.java similarity index 83% rename from firewall-dashboard-simplified/src/main/java/src/java/Main.java rename to src/main/java/src/java/main/Main.java index 33229c3..0e4bf04 100644 --- a/firewall-dashboard-simplified/src/main/java/src/java/Main.java +++ b/src/main/java/src/java/main/Main.java @@ -1,4 +1,4 @@ -package src.java; +package src.java.main; public class Main { public static void main(String[] args) { diff --git a/src/main/java/src/java/queues/ReceivingQueue.java b/src/main/java/src/java/queues/ReceivingQueue.java new file mode 100644 index 0000000..099f62c --- /dev/null +++ b/src/main/java/src/java/queues/ReceivingQueue.java @@ -0,0 +1,20 @@ +/** + * @author Aaron Moser + * @date 26.12.2023 + */ +package src.java.queues; + +import java.util.concurrent.LinkedBlockingQueue; + +public class ReceivingQueue extends LinkedBlockingQueue { + private static ReceivingQueue instance; + + private ReceivingQueue() {} + + public static ReceivingQueue getInstance() { + if (instance == null) { + instance = new ReceivingQueue(); + } + return instance; + } +} diff --git a/src/main/java/src/java/queues/SendingQueue.java b/src/main/java/src/java/queues/SendingQueue.java new file mode 100644 index 0000000..f37badf --- /dev/null +++ b/src/main/java/src/java/queues/SendingQueue.java @@ -0,0 +1,20 @@ +/** + * @author Aaron Moser + * @date 26.12.2023 + */ +package src.java.queues; + +import java.util.concurrent.LinkedBlockingQueue; + +public class SendingQueue extends LinkedBlockingQueue { + private static SendingQueue instance; + + private SendingQueue() {} + + public static SendingQueue getInstance() { + if (instance == null) { + instance = new SendingQueue(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/constants/GUIConstants.java b/src/main/java/src/java/view/constants/GUIConstants.java new file mode 100644 index 0000000..f987dcb --- /dev/null +++ b/src/main/java/src/java/view/constants/GUIConstants.java @@ -0,0 +1,63 @@ +/** + * @author Aaron Moser + * @date 31.10.2023 + * @lastChange 04.01.2024 + */ + +package src.java.view.constants; + +public final class GUIConstants { + /** + * Represents kinds of frames. + */ + public static enum Frame { + MainFrame, + } + + /** + * Represents kinds of panels that can be put in main frame. + */ + public static enum Panel { + MonitoringPanel, + ControllingPanel, + NFTableChainPanel, + NFTableRulePanel, + ConnectToServerPanel, + ConnectionsTablePanel + } + + public static enum E_ControllingSubPanel { + BasePanel, + NFTableFamilyPanel, + NFTableTablePanel, + NFTableChainPanel, + NFTableRulePanel, + None + } + + public static enum NFTablePanel { + NFTableTablesPanel, + NFTableChainsPanel, + NFTableRulesPanel + } + + public static enum Status { + Connected, + Connecting, + Disconnected, + + } + + /** + * Represents kinds of themes. + */ + public static enum Theme { + Dark, + Light + } + + public static enum Languages { + German, + English + } +} diff --git a/src/main/java/src/java/view/frames/MainFrame.java b/src/main/java/src/java/view/frames/MainFrame.java new file mode 100644 index 0000000..1c54801 --- /dev/null +++ b/src/main/java/src/java/view/frames/MainFrame.java @@ -0,0 +1,24 @@ +/** + * @author Aaron Moser + * @date 31.10.2023 + * @lastChange 22.01.2024 + */ +package src.java.view.frames; + +import javax.swing.*; + +public final class MainFrame extends JFrame { + + public MainFrame() { + + //this.contentPanel = new JPanel(); + //this.getContentPane().add(this.contentPanel); + + //this.setJMenuBar(MenuBar.getMenuBar()); + + //this.setTitle(this.viewModel.get_MainFrame_ViewModel().getTitle()); + //this.setPanel(this.viewModel.get_MainFrame_ViewModel().getMainFrameActivePanel()); + //this.setLocation(this.viewModel.get_MainFrame_ViewModel().getXPosition(), this.viewModel.get_MainFrame_ViewModel().getYPosition()); + //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } +} diff --git a/src/main/java/src/java/view/menubar/Menu.java b/src/main/java/src/java/view/menubar/Menu.java new file mode 100644 index 0000000..df03a8b --- /dev/null +++ b/src/main/java/src/java/view/menubar/Menu.java @@ -0,0 +1,65 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + * @lastChange 07.01.2024 + */ + +package src.java.view.menubar; + +import javax.swing.JMenu; + +import src.java.view.constants.GUIConstants.Languages; + +import java.awt.event.ActionListener; + +/** + * Menu at menu bar. + */ +public final class Menu extends JMenu { + private String[] translations = null; + + /** + * @param translations of this menus text. + * @param actionListener belonging to this menu. Events that occur by clicking on menu depending on this. + */ + public Menu(final String[] translations, ActionListener actionListener) { + this.setTranslations(translations); + this.changeLanguage(Languages.German); + if (actionListenerValid("constructor of Menu", actionListener)) { + this.addActionListener(actionListener); + } + } + + public void setTranslations(final String[] translations) { + if (null != translations) { + this.translations = translations; + } + } + + public void changeLanguage(Languages language) { + if (translationsSet("changeLanguage")) { + this.setText(translations[language.ordinal()]); + for (int index = 0; index < this.getItemCount(); index++) { + ((MenuItem)this.getItem(index)).changeLanguage(language); + } + } + } + + private boolean translationsSet(String callingMethod) { + boolean translationsSet = true; + if (null == translations) { + translationsSet = false; + System.err.println("Error at " + callingMethod + " of menu item. translations are null"); + } + return translationsSet; + } + + private boolean actionListenerValid(String callingMethod, ActionListener actionListener) { + boolean actionListenerSet = true; + if (null == actionListener) { + actionListenerSet = false; + System.err.println("Error at " + callingMethod + " of menu item. action listener is null"); + } + return actionListenerSet; + } +} diff --git a/src/main/java/src/java/view/menubar/MenuBar.java b/src/main/java/src/java/view/menubar/MenuBar.java new file mode 100644 index 0000000..84cfa22 --- /dev/null +++ b/src/main/java/src/java/view/menubar/MenuBar.java @@ -0,0 +1,39 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + * @lastChange 07.01.2024 + */ + +package src.java.view.menubar; + +import javax.swing.JMenuBar; + +import src.java.view.constants.GUIConstants.Languages; +import src.java.view.menubar.menus.HelpMenuFactory; +import src.java.view.menubar.menus.LanguageMenuFactory; + +public final class MenuBar extends JMenuBar { + + private MenuBarLanguageController languageController = null; + + private MenuBar() { + languageController = new MenuBarLanguageController(this); + + this.add(HelpMenuFactory.createHelpMenu()); + this.add(LanguageMenuFactory.createLanguageMenu(languageController)); + } + + public static MenuBar getMenuBar() { + return new MenuBar(); + } + + public void changeLanguage(Languages language) { + changeLanguageOfMenus(language); + } + + private void changeLanguageOfMenus(Languages language) { + for (int index = 0; index < this.getMenuCount(); index++) { + ((Menu)this.getMenu(index)).changeLanguage(language); + } + } +} diff --git a/src/main/java/src/java/view/menubar/MenuBarLanguageController.java b/src/main/java/src/java/view/menubar/MenuBarLanguageController.java new file mode 100644 index 0000000..c40ed89 --- /dev/null +++ b/src/main/java/src/java/view/menubar/MenuBarLanguageController.java @@ -0,0 +1,22 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + */ + +package src.java.view.menubar; + +public final class MenuBarLanguageController { + private MenuBar menuBar = null; + + public MenuBarLanguageController(MenuBar menuBar) { + this.menuBar = menuBar; + } + + public Menu getMenu(int index) { + return (Menu)this.menuBar.getMenu(index); + } + + public int getMenuCount() { + return this.menuBar.getMenuCount(); + } +} diff --git a/src/main/java/src/java/view/menubar/MenuBarSeparator.java b/src/main/java/src/java/view/menubar/MenuBarSeparator.java new file mode 100644 index 0000000..0446aeb --- /dev/null +++ b/src/main/java/src/java/view/menubar/MenuBarSeparator.java @@ -0,0 +1,27 @@ +/** + * @author Aaron Moser + * @date 31.10.2023 + */ + +package src.java.view.menubar; + +import java.awt.Color; +import java.awt.Dimension; + +import javax.swing.BorderFactory; +import javax.swing.JMenuItem; + +/** + * Horizontal line separator for menu bar. + */ +public final class MenuBarSeparator extends JMenuItem { + + static final Color color = new Color(47, 47, 47); + + public MenuBarSeparator() { + this.setEnabled(false); + this.setPreferredSize(new Dimension(0, 1)); + this.setBackground(color); + this.setBorder(BorderFactory.createLineBorder(color, 2)); + } +} diff --git a/src/main/java/src/java/view/menubar/MenuItem.java b/src/main/java/src/java/view/menubar/MenuItem.java new file mode 100644 index 0000000..271147b --- /dev/null +++ b/src/main/java/src/java/view/menubar/MenuItem.java @@ -0,0 +1,62 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + * @lastChange 07.01.2024 + */ + +package src.java.view.menubar; + +import java.awt.event.ActionListener; + +import javax.swing.JMenuItem; + +import src.java.view.constants.GUIConstants.Languages; + +/** + * Menu item at menu at menu bar. + */ +public final class MenuItem extends JMenuItem { + private String[] translations = null; + + /** + * @param translations of this menu items text. + * @param actionListener belonging to this menu item. Events that occur by clicking on menu item depending on this. + */ + public MenuItem(final String[] translations, ActionListener actionListener) { + this.setTranslations(translations); + this.changeLanguage(Languages.German); + if (actionListenerValid("constructor of Menu", actionListener)) { + this.addActionListener(actionListener); + } + } + + public void setTranslations(final String[] translations) { + if (null != translations) { + this.translations = translations; + } + } + + public void changeLanguage(Languages language) { + if (translationsSet("changeLanguage")) { + this.setText(translations[language.ordinal()]); + } + } + + private boolean translationsSet(String callingMethod) { + boolean translationsSet = true; + if (null == translations) { + translationsSet = false; + System.err.println("Error at " + callingMethod + " of menu item. translations of are null"); + } + return translationsSet; + } + + private boolean actionListenerValid(String callingMethod, ActionListener actionListener) { + boolean actionListenerSet = true; + if (null == actionListener) { + actionListenerSet = false; + System.err.println("Error at " + callingMethod + " of menu item. action listener is null"); + } + return actionListenerSet; + } +} diff --git a/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java b/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java new file mode 100644 index 0000000..22f0302 --- /dev/null +++ b/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java @@ -0,0 +1,42 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + */ + +package src.java.view.menubar.menuItems; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import src.java.view.menubar.MenuItem; + +public final class HelpMenuItemFactory { + + public static MenuItem createManualMenuItem() { + final String[] translations = {"Anleitung", "Manual"}; + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + } + }; + + MenuItem manualMenuItem = new MenuItem(translations, actionListener); + + return manualMenuItem; + } + + public static MenuItem createAboutMenuItem() { + final String[] translations = {"Über", "About"}; + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + } + }; + + MenuItem aboutMenuItem = new MenuItem(translations, actionListener); + + return aboutMenuItem; + } +} diff --git a/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java b/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java new file mode 100644 index 0000000..3a16c8f --- /dev/null +++ b/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java @@ -0,0 +1,48 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + */ + +package src.java.view.menubar.menuItems; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import src.java.view.constants.GUIConstants.Languages; +import src.java.view.menubar.MenuBarLanguageController; +import src.java.view.menubar.MenuItem; + +public final class LanguageMenuItemFactory { + + public static MenuItem createGermanMenuItem(final MenuBarLanguageController languageController) { + final String[] translations = {"Deutsch", "German"}; + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + for (int index = 0; index < languageController.getMenuCount(); index++) { + languageController.getMenu(index).changeLanguage(Languages.German); + } + } + }; + + MenuItem germanMenuItem = new MenuItem(translations, actionListener); + + return germanMenuItem; + } + + public static MenuItem createEnglishMenuItem(final MenuBarLanguageController languageController) { + final String[] translations = {"Englisch", "English"}; + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + for (int index = 0; index < languageController.getMenuCount(); index++) { + languageController.getMenu(index).changeLanguage(Languages.English); + } + } + }; + + MenuItem englishMenuItem = new MenuItem(translations, actionListener); + + return englishMenuItem; + } +} diff --git a/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java b/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java new file mode 100644 index 0000000..c820f61 --- /dev/null +++ b/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java @@ -0,0 +1,30 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + */ + +package src.java.view.menubar.menus; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import src.java.view.menubar.Menu; +import src.java.view.menubar.menuItems.HelpMenuItemFactory; + +public final class HelpMenuFactory { + + + public static Menu createHelpMenu() { + final String[] translations = {"Hilfe", "Help"}; + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + } + }; + Menu helpMenu = new Menu(translations, actionListener); + helpMenu.add(HelpMenuItemFactory.createManualMenuItem()); + helpMenu.add(HelpMenuItemFactory.createAboutMenuItem()); + return helpMenu; + } +} diff --git a/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java b/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java new file mode 100644 index 0000000..40cd3b0 --- /dev/null +++ b/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java @@ -0,0 +1,30 @@ +/** + * @author Aaron Moser + * @date 01.11.2023 + */ + +package src.java.view.menubar.menus; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import src.java.view.menubar.Menu; +import src.java.view.menubar.MenuBarLanguageController; +import src.java.view.menubar.menuItems.LanguageMenuItemFactory; + +public final class LanguageMenuFactory { + + public static Menu createLanguageMenu(MenuBarLanguageController languageController) { + final String[] translations = {"Sprache", "Language"}; + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + } + }; + Menu languageMenu = new Menu(translations, actionListener); + languageMenu.add(LanguageMenuItemFactory.createGermanMenuItem(languageController)); + languageMenu.add(LanguageMenuItemFactory.createEnglishMenuItem(languageController)); + return languageMenu; + } +} diff --git a/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java b/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java new file mode 100644 index 0000000..47b41de --- /dev/null +++ b/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java @@ -0,0 +1,300 @@ +/** + * @author Aaron Moser + * @date 02.12.2023 + * @lastChange 08.01.2024 + */ +package src.java.view.panels.ConnectToServerPanel; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.*; +import javax.swing.filechooser.FileSystemView; + +/** + * The panel to enter data to connect to the server. + */ +public final class ConnectToServerPanel extends JPanel { + + private static ConnectToServerPanel instance = null; + + private String serverCertStoreFilePath = ""; + + private JLabel mainMessageLabel = null; + private JLabel ipAddressLabel = null; + private JLabel portLabel = null; + private JLabel serverCertStoreLabel = null; + private JLabel serverCertStorePasswordLabel = null; + + private JRadioButton[] ipVersionRadioButtons = null; + + private JTextField ipAddressTextField = null; + private JTextField portTextField = null; + private JTextField trustStorePasswordTextField = null; + + private JButton connectButton = null; + private JButton trustStoreFileChooserButton = null; + + private ConnectToServerPanel() { + this.createComponents(); + this.addComponents(); + } + + public static ConnectToServerPanel getInstance() { + if (instance == null) { + instance = new ConnectToServerPanel(); + } + return instance; + } + + /** + * Creates interactable components. + */ + private void createComponents() { + this.createMainMessageLabel(); + + this.createIPVersionRadioButtons(); + this.createIPAddressLabel(); + this.createIPAddressTextField(); + + this.createPortLabel(); + this.createPortTextField(); + + this.createServerCertStoreLabel(); + this.createServerCertStoreFileChooserButton(); + this.createTrustStorePasswordLabel(); + this.createTrustStorePasswordTextField(); + + this.createConnectButton(); + } + + private void addComponents() { + this.setLayout(new GridBagLayout()); + + this.addMainMessageLabel(); + + this.addIPVersionRadioButtons(); + this.addIPAddressLabel(); + this.addIPAddressTextField(); + + this.addPortLabel(); + this.addPortTextField(); + + this.addServerCertStoreLabel(); + this.addServerCertStoreFileChooserButton(); + this.addTrustStorePasswordLabel(); + this.addTrustStorePasswordTextField(); + + this.addConnectButton(); + } + + private void createMainMessageLabel() { + this.mainMessageLabel = new JLabel(); + } + + private void addMainMessageLabel() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(0, 0, 10, 0); + this.add(this.mainMessageLabel, gridBagConstraints); + } + + private void createIPVersionRadioButtons() { + ButtonGroup ipVersionRadioButtonsGroup = new ButtonGroup(); + + this.ipVersionRadioButtons = new JRadioButton[2]; + + this.ipVersionRadioButtons[0] = new JRadioButton(); + this.ipVersionRadioButtons[1] = new JRadioButton(); + + ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[0]); + ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[1]); + + this.ipVersionRadioButtons[0].setSelected(true); + } + + private void addIPVersionRadioButtons() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 1; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(0, 0, 0, 0); + this.add(this.ipVersionRadioButtons[0], gridBagConstraints); + gridBagConstraints.gridy = 2; + this.add(this.ipVersionRadioButtons[1], gridBagConstraints); + } + + private void createIPAddressLabel() { + this.ipAddressLabel = new JLabel(); + } + + private void addIPAddressLabel() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 3; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.ipAddressLabel, gridBagConstraints); + } + + private void createIPAddressTextField() { + this.ipAddressTextField = new JTextField(24); + } + + private void addIPAddressTextField() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 4; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(0, 0, 0, 0); + this.add(this.ipAddressTextField, gridBagConstraints); + } + + private void createPortLabel() { + this.portLabel = new JLabel(); + } + + private void addPortLabel() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 5; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(0, 0, 0, 0); + this.add(this.portLabel, gridBagConstraints); + } + + private void createPortTextField() { + this.portTextField = new JTextField(24); + } + + private void addPortTextField() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 6; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(0, 0, 0, 0); + this.add(this.portTextField, gridBagConstraints); + } + + private void createServerCertStoreLabel() { + this.serverCertStoreLabel = new JLabel(); + } + + private void addServerCertStoreLabel() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 7; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.serverCertStoreLabel, gridBagConstraints); + } + + private void createServerCertStoreFileChooserButton() { + + this.trustStoreFileChooserButton = new JButton(); + + this.trustStoreFileChooserButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + JFileChooser fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + + int fileChooserOption = fileChooser.showSaveDialog(null); + + // if the user selects a file + if (fileChooserOption == JFileChooser.APPROVE_OPTION) { + serverCertStoreFilePath = fileChooser.getSelectedFile().getAbsolutePath(); + } + } + }); + } + + private void addServerCertStoreFileChooserButton() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 8; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.trustStoreFileChooserButton, gridBagConstraints); + } + + private void createTrustStorePasswordLabel() { + this.serverCertStorePasswordLabel = new JLabel(); + } + + private void addTrustStorePasswordLabel() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 9; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.serverCertStorePasswordLabel, gridBagConstraints); + } + + private void createTrustStorePasswordTextField() { + this.trustStorePasswordTextField = new JPasswordField(24); + } + + private void addTrustStorePasswordTextField() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 10; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(0, 0, 0, 0); + this.add(this.trustStorePasswordTextField, gridBagConstraints); + } + + private void createConnectButton() { + + this.connectButton = new JButton(); + + this.connectButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + // I_ViewEvent data = new AA_ConnectToServerButtonGotPressed( + // new AA_ConnectToServerData( + // ipAddressTextField.getText(), + // Integer.valueOf(portTextField.getText()), + // serverCertStoreFilePath, + // trustStorePasswordTextField.getText())); + // // Pass the data to the event manager + // view_To_ViewEventManager_Queue.add(data); + } + }); + } + + private void addConnectButton() { + GridBagConstraints gridBagConstraints = new GridBagConstraints(); + gridBagConstraints.anchor = GridBagConstraints.NORTHWEST; + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 11; + gridBagConstraints.weightx = 1; + gridBagConstraints.weighty = 1; + gridBagConstraints.insets = new Insets(10, 0, 0, 0); + this.add(this.connectButton, gridBagConstraints); + } +} diff --git a/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java b/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java new file mode 100644 index 0000000..287b251 --- /dev/null +++ b/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java @@ -0,0 +1,65 @@ +/** + * @author Aaron Moser + * @date + * @lastChange 07.01.2024 + */ +package src.java.view.panels.ConnectionsTablePanel; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +import javax.swing.BoxLayout; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +public class ConnectionsTablePanel extends JPanel { + + private static ConnectionsTablePanel instance = null; + + private JPanel connectionsPanel; + private JScrollPane scrollPane; + + private ConnectionsTablePanel() { + buildPanel(); + } + + private void buildPanel() { + this.connectionsPanel = new JPanel(); + this.connectionsPanel.setLayout(new BoxLayout(connectionsPanel, BoxLayout.Y_AXIS)); + + //for (ConnectionInformation connection : viewModel.get_ConnectionsPanel_ViewModel().getConnections()) { + // System.out.println(connection); + // JLabel connectionLabel = new JLabel( + // connection.toString()); + // this.connectionsPanel.add(connectionLabel); + //} + + JLabel label = new JLabel("Verbindungen"); + + // Fills the whole rest panel (this) with scroll pane. + this.scrollPane = new JScrollPane(connectionsPanel); + this.scrollPane.setPreferredSize(new Dimension(300,200)); + + this.setLayout(new GridBagLayout()); + GridBagConstraints labelConstraints = new GridBagConstraints(); + labelConstraints.anchor = GridBagConstraints.NORTHWEST; + labelConstraints.gridx = 0; + labelConstraints.gridy = 0; + this.add(label, labelConstraints); + + GridBagConstraints scrollPaneConstraints = new GridBagConstraints(); + scrollPaneConstraints.anchor = GridBagConstraints.NORTHWEST; + scrollPaneConstraints.gridx = 0; + scrollPaneConstraints.gridy = 1; + this.add(scrollPane, scrollPaneConstraints); + } + + public static ConnectionsTablePanel getInstance() { + if (instance == null) { + instance = new ConnectionsTablePanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java b/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java new file mode 100644 index 0000000..3b6effa --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java @@ -0,0 +1,39 @@ +package src.java.view.panels.ControllingPanel.BasePanel; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JPanel; + +public class ControllingBasePanel extends JPanel { + + private static ControllingBasePanel instance = null; + + private final JButton nftConfigButton; + + private ControllingBasePanel() { + nftConfigButton = new JButton("NFT Config"); + nftConfigButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // TODO + } + }); + + this.setLayout(new GridBagLayout()); + + GridBagConstraints nftConfButtonConstraints = new GridBagConstraints(); + + this.add(nftConfigButton, nftConfButtonConstraints); + } + + public static ControllingBasePanel getInstance() { + if (instance == null) { + instance = new ControllingBasePanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java new file mode 100644 index 0000000..7a512ec --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java @@ -0,0 +1,120 @@ +/** + * @author Aaron Moser + * @date 31.10.2023 + */ + +package src.java.view.panels.ControllingPanel; + +import java.util.ArrayDeque; +import java.util.Deque; + +import javax.swing.JPanel; + +public final class ControllingPanel extends JPanel { + + private static ControllingPanel instance = null; + + // private E_ControllingSubPanel activePanelType = E_ControllingSubPanel.None; + // private Deque previousPanelStack = new ArrayDeque(); + // private Deque nextPanelStack = new ArrayDeque(); + + private ControllingPanel() { + // this.setPanel(E_ControllingSubPanel.BasePanel); + } + + public static ControllingPanel getInstance() { + if (instance == null) { + instance = new ControllingPanel(); + } + return instance; + } + + // public void setPanel(E_ControllingSubPanel panelType) { + // this.removeAll(); + + // switch (panelType) { + // case E_ControllingSubPanel.BasePanel: { + // if (activePanelType != E_ControllingSubPanel.BasePanel) { + // previousPanelStack.push(activePanelType); + // this.activePanelType = E_ControllingSubPanel.BasePanel; + // this.add(ControllingBasePanel.getInstance(this)); + // } + // }break; + // case E_ControllingSubPanel.NFTableFamilyPanel: { + // if (activePanelType != E_ControllingSubPanel.NFTableFamilyPanel) { + // previousPanelStack.push(activePanelType); + // this.activePanelType = E_ControllingSubPanel.NFTableFamilyPanel; + // this.add(NFTFamilyPanel.getInstance()); + // } + // }break; + // case E_ControllingSubPanel.NFTableTablePanel: { + // if (activePanelType != E_ControllingSubPanel.NFTableTablePanel) { + // previousPanelStack.push(activePanelType); + // this.activePanelType = E_ControllingSubPanel.NFTableTablePanel; + // this.add(NFTablesTablePanel.getInstance()); + // } + // }break; + // case E_ControllingSubPanel.NFTableChainPanel: { + // if (activePanelType != E_ControllingSubPanel.NFTableChainPanel) { + // previousPanelStack.push(activePanelType); + // this.activePanelType = E_ControllingSubPanel.NFTableChainPanel; + // this.add(NFTablesChainPanel.getInstance()); + // } + // }break; + // case E_ControllingSubPanel.NFTableRulePanel: { + // if (activePanelType != E_ControllingSubPanel.NFTableRulePanel) { + // previousPanelStack.push(activePanelType); + // this.activePanelType = E_ControllingSubPanel.NFTableRulePanel; + // this.add(NFTablesRulePanel.getInstance()); + // } + // }break; + // default: { + + // }break; + // } + // MainFrame.getInstance(null,null).setVisible(true); + // } + + // public void switchToPreviousPanel() { + // if (!previousPanelStack.isEmpty()) { + // nextPanelStack.push(activePanelType); + // setPanel(previousPanelStack.pop()); + // } + // } + + // public void switchToNextPanel() { + // if(!nextPanelStack.isEmpty()) { + // previousPanelStack.push(activePanelType); + // setPanel(nextPanelStack.pop()); + // } + // } + + /*public void setNFTInformation(NFTablesConfigurationReceived nftConfig) { + LinkedList>> nftInformation = nftConfig.getNFTableInformation().getTables(); + + LinkedList tables = new LinkedList(); + + HashMap chains = new HashMap(); + + HashMap rules = new HashMap(); + + for (int tableIndex = 0; tableIndex < nftInformation.size(); tableIndex++) { + for (int chainIndex = 0; chainIndex < nftInformation.get(tableIndex).size(); chainIndex++) { + for (int ruleIndex = 0; ruleIndex < nftInformation.get(tableIndex).get(chainIndex).size(); ruleIndex++) { + switch (ruleIndex) { + case 0: { + tables.add(nftInformation.get(tableIndex).get(chainIndex).get(0)); + }break; + case 1: { + chains.put(nftInformation.get(tableIndex).get(chainIndex).get(0), nftInformation.get(tableIndex).get(chainIndex).get(1)); + }break; + default: { + + }break; + } + } + } + } + NFTablesTablePanel.getInstance().setTables(tables); + } */ +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java new file mode 100644 index 0000000..76c9be8 --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java @@ -0,0 +1,9 @@ +package src.java.view.panels.ControllingPanel; + +import src.java.view.constants.GUIConstants.E_ControllingSubPanel; + +public interface I_ControllingPanel_SwitchPanel { + public void switchToPreviousPanel(); + public void switchToNextPanel(); + public void setPanel(E_ControllingSubPanel controllingSubPanel); +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java new file mode 100644 index 0000000..03581ec --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java @@ -0,0 +1,35 @@ +/** + * @author Aaron Moser + * @date 04.01.2024 + * @lastChange 04.01.2024 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +public class IPv4FamilyButton extends JButton implements ActionListener { + private static IPv4FamilyButton instance = null; + + private IPv4FamilyButton() { + this.setText("IPv4"); + this.addActionListener(this); + this.setPreferredSize(new Dimension(100,100)); + } + + public static IPv4FamilyButton getInstance() { + if (instance == null) { + instance = new IPv4FamilyButton(); + } + return instance; + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'"); + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java new file mode 100644 index 0000000..335fc5f --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java @@ -0,0 +1,35 @@ +/** + * @author Aaron Moser + * @date 04.01.2024 + * @lastChange 04.01.2024 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +public class IPv6FamilyButton extends JButton implements ActionListener { + private static IPv6FamilyButton instance = null; + + private IPv6FamilyButton() { + this.setText("IPv6"); + this.addActionListener(this); + this.setPreferredSize(new Dimension(100,100)); + } + + public static IPv6FamilyButton getInstance() { + if (instance == null) { + instance = new IPv6FamilyButton(); + } + return instance; + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'"); + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java new file mode 100644 index 0000000..59b1fe5 --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java @@ -0,0 +1,35 @@ +/** + * @author Aaron Moser + * @date 04.01.2024 + * @lastChange 04.01.2024 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +public class InetFamilyButton extends JButton implements ActionListener { + private static InetFamilyButton instance = null; + + private InetFamilyButton() { + this.setText("Inet"); + this.addActionListener(this); + this.setPreferredSize(new Dimension(100,100)); + } + + public static InetFamilyButton getInstance() { + if (instance == null) { + instance = new InetFamilyButton(); + } + return instance; + } + + @Override + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'"); + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java new file mode 100644 index 0000000..736c7f6 --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java @@ -0,0 +1,71 @@ +/** + * @author Aaron Moser + * @date 31.12.2023 + * @lastChange 04.01.2024 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel; + +import javax.swing.*; + +import java.awt.*; + +public final class NFTFamilyPanel extends JPanel { + private static NFTFamilyPanel instance = null; + + private final JLabel instruction; + + private final JButton inetFamilyButton; + private final JButton ipv4FamilyButton; + private final JButton ipv6FamilyButton; + + private NFTFamilyPanel() { + instruction = new JLabel("Waehlen Sie die Familie aus, deren Tabellen / Ketten / Regeln Sie anschauen / veraendern moechten."); + + this.setLayout(new GridBagLayout()); + + this.addInstructions(); + + inetFamilyButton = InetFamilyButton.getInstance(); + ipv4FamilyButton = IPv4FamilyButton.getInstance(); + ipv6FamilyButton = IPv6FamilyButton.getInstance(); + + this.addFamilyButtons(); + } + + private void addInstructions() { + GridBagConstraints instructionConstraints = new GridBagConstraints(); + instructionConstraints.gridx = 0; + instructionConstraints.gridy = 0; + instructionConstraints.anchor = GridBagConstraints.NORTHWEST; + instructionConstraints.fill = GridBagConstraints.HORIZONTAL; + instructionConstraints.weightx = 1; + instructionConstraints.insets = new Insets(0,0,0,0); + this.add(instruction, instructionConstraints); + } + + private void addFamilyButtons() { + GridBagConstraints buttonPanelConstraints = new GridBagConstraints(); + buttonPanelConstraints.gridx = 0; + buttonPanelConstraints.gridy = 1; + buttonPanelConstraints.anchor = GridBagConstraints.NORTHWEST; + buttonPanelConstraints.fill = GridBagConstraints.HORIZONTAL; + buttonPanelConstraints.weightx = 1; + buttonPanelConstraints.insets = new Insets(0,0,0,0); + + JPanel familyButtonPanel = new JPanel(); + familyButtonPanel.setLayout(new FlowLayout()); + + familyButtonPanel.add(inetFamilyButton); + familyButtonPanel.add(ipv4FamilyButton); + familyButtonPanel.add(ipv6FamilyButton); + + this.add(familyButtonPanel, buttonPanelConstraints); + } + + public static NFTFamilyPanel getInstance() { + if (instance == null) { + instance = new NFTFamilyPanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java new file mode 100644 index 0000000..b35587c --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java @@ -0,0 +1,26 @@ +/** + * @author Aaron Moser + * @date 30.12.2023 + * @lastChange 04.01.2024 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTablesChainPanel; + +import javax.swing.BoxLayout; +import javax.swing.JPanel; + +public final class NFTablesChainPanel extends JPanel { + private static NFTablesChainPanel instance = null; + + private NFTablesChainPanel() { + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + + } + + public static NFTablesChainPanel getInstance() { + if (instance == null) { + instance = new NFTablesChainPanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java new file mode 100644 index 0000000..756069b --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java @@ -0,0 +1,26 @@ +/** + * @author Aaron Moser + * @date 04.01.2024 + * @lastChange 04.01.2024 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTablesRulePanel; + +import javax.swing.BoxLayout; +import javax.swing.JPanel; + +public final class NFTablesRulePanel extends JPanel { + private static NFTablesRulePanel instance = null; + + private NFTablesRulePanel() { + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + + } + + public static NFTablesRulePanel getInstance() { + if (instance == null) { + instance = new NFTablesRulePanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java new file mode 100644 index 0000000..cdf7abb --- /dev/null +++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java @@ -0,0 +1,50 @@ +/** + * @author Aaron Moser + * @date 30.12.2023 + * @lastChange 30.12.2023 + */ +package src.java.view.panels.ControllingPanel.NFTable.NFTablesTablePanel; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.util.List; + +import javax.swing.BoxLayout; +import javax.swing.JPanel; + +public final class NFTablesTablePanel extends JPanel { + private static NFTablesTablePanel instance = null; + + private JPanel tableListPanel = null; + + private NFTablesTablePanel() { + setTables(null); + this.setLayout(new GridBagLayout()); + + GridBagConstraints tablesPanelConstraints = new GridBagConstraints(); + + this.add(tableListPanel, tablesPanelConstraints); + } + + public static NFTablesTablePanel getInstance() { + if (instance == null) { + instance = new NFTablesTablePanel(); + } + return instance; + } + + public void setTables(List tables) { + tableListPanel = new JPanel(); + tableListPanel.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + if (tables != null) { + + for (String table : tables) { + //tableListPanel.add(); + } + } else { + //tableListPanel.add(); + } + + } +} diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java new file mode 100644 index 0000000..48c7778 --- /dev/null +++ b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java @@ -0,0 +1,21 @@ +package src.java.view.panels.MonitoringPanel.AlarmPanel; + +import java.awt.BorderLayout; + +import javax.swing.JButton; +import javax.swing.JPanel; + +public class Alarm extends JPanel { + private JButton button; + + public Alarm(String message) { + this.button = new JButton(message); + + this.setLayout(new BorderLayout()); + this.add(button); + } + + public JButton getButton() { + return button; + } +} diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java new file mode 100644 index 0000000..abba4c1 --- /dev/null +++ b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java @@ -0,0 +1,56 @@ +package src.java.view.panels.MonitoringPanel.AlarmPanel; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +import java.util.LinkedList; + +import javax.swing.BoxLayout; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +public class AlarmPanel extends JPanel { + private static AlarmPanel instance; + + private JPanel alarmsPanel; + private LinkedList alarms; + private JScrollPane scrollPane; + + private AlarmPanel() { + this.alarmsPanel = new JPanel(); + this.alarmsPanel.setLayout(new BoxLayout(alarmsPanel, BoxLayout.Y_AXIS)); + + for (int i = 0; i < 41; i++) { + Alarm alarm = new Alarm("Test " + i); + this.alarmsPanel.add(alarm); + } + + JLabel label = new JLabel("Alarme"); + + // Fills the whole rest panel (this) with scroll pane. + this.scrollPane = new JScrollPane(alarmsPanel); + this.scrollPane.setPreferredSize(new Dimension(300,200)); + + this.setLayout(new GridBagLayout()); + GridBagConstraints labelConstraints = new GridBagConstraints(); + labelConstraints.anchor = GridBagConstraints.NORTHWEST; + labelConstraints.gridx = 0; + labelConstraints.gridy = 0; + this.add(label, labelConstraints); + + GridBagConstraints scrollPaneConstraints = new GridBagConstraints(); + scrollPaneConstraints.anchor = GridBagConstraints.NORTHWEST; + scrollPaneConstraints.gridx = 0; + scrollPaneConstraints.gridy = 1; + this.add(scrollPane, scrollPaneConstraints); + } + + public static AlarmPanel getInstance() { + if (null == instance) { + instance = new AlarmPanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java new file mode 100644 index 0000000..8db684b --- /dev/null +++ b/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java @@ -0,0 +1,106 @@ +package src.java.view.panels.MonitoringPanel.ConnectionsLineChart; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; + +import java.awt.event.MouseAdapter; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.block.BlockBorder; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; +import org.jfree.chart.title.TextTitle; + +import org.jfree.data.xy.XYDataset; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; + +import org.w3c.dom.events.MouseEvent; + +public class ConnectionsLineChartPanel extends JPanel { + private static ConnectionsLineChartPanel instance; + + private ConnectionsLineChartPanel() { + XYDataset dataset = createDataset(); + JFreeChart chart = createChart(dataset); + + ChartPanel chartPanel = new ChartPanel(chart); + chartPanel.setBackground(Color.white); + chartPanel.setPreferredSize(new Dimension(400,200)); + add(chartPanel); + + addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + // MainFrame.getInstance().setPanel(null); + } + }); + } + + public static ConnectionsLineChartPanel getInstance() { + if (null == instance) { + instance = new ConnectionsLineChartPanel(); + } + return instance; + } + + private XYDataset createDataset() { + + var series = new XYSeries("TCP"); + series.add(1, 2); + series.add(2, 4); + series.add(3, 2); + series.add(4, 5); + series.add(5, 7); + + var dataset = new XYSeriesCollection(); + dataset.addSeries(series); + + return dataset; + } + + private JFreeChart createChart(XYDataset dataset) { + + JFreeChart chart = ChartFactory.createXYLineChart( + "Zugriffe in Abh. zur Zeit", + "Zeit", + "Zugriffe", + dataset, + PlotOrientation.VERTICAL, + true, + true, + false + ); + + XYPlot plot = chart.getXYPlot(); + + var renderer = new XYLineAndShapeRenderer(); + renderer.setSeriesPaint(0, Color.RED); + renderer.setSeriesStroke(0, new BasicStroke(2.0f)); + + plot.setRenderer(renderer); + plot.setBackgroundPaint(Color.white); + + plot.setRangeGridlinesVisible(true); + plot.setRangeGridlinePaint(Color.BLACK); + + plot.setDomainGridlinesVisible(true); + plot.setDomainGridlinePaint(Color.BLACK); + + chart.getLegend().setFrame(BlockBorder.NONE); + + chart.setTitle(new TextTitle("Zugriffe", + new Font("Serif", java.awt.Font.BOLD, 18) + ) + ); + + return chart; + } +} diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java new file mode 100644 index 0000000..51e81ea --- /dev/null +++ b/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java @@ -0,0 +1,52 @@ +/** + * @author Aaron Moser + * @date 31.10.2023 + */ + +package src.java.view.panels.MonitoringPanel; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +import javax.swing.JPanel; + +import src.java.view.panels.ConnectionsTablePanel.ConnectionsTablePanel; +import src.java.view.panels.MonitoringPanel.AlarmPanel.AlarmPanel; +import src.java.view.panels.MonitoringPanel.ConnectionsLineChart.ConnectionsLineChartPanel; +import src.java.view.panels.MonitoringPanel.SystemInformationPanel.SystemInformationPanel; + +public final class MonitoringPanel extends JPanel { + + private static MonitoringPanel instance = null; + + private MonitoringPanel() { + this.setLayout(new GridBagLayout()); + + GridBagConstraints alarmConstraints = new GridBagConstraints(); + alarmConstraints.gridx = 0; + alarmConstraints.gridy = 0; + this.add(AlarmPanel.getInstance(), alarmConstraints); + + GridBagConstraints connectionsLineCartConstraints = new GridBagConstraints(); + connectionsLineCartConstraints.gridx = 1; + connectionsLineCartConstraints.gridy = 0; + this.add(ConnectionsLineChartPanel.getInstance(), connectionsLineCartConstraints); + + GridBagConstraints systemInformationConstraints = new GridBagConstraints(); + systemInformationConstraints.gridx = 0; + systemInformationConstraints.gridy = 1; + this.add(SystemInformationPanel.getInstance(), systemInformationConstraints); + + GridBagConstraints connectionsPanelConstraints = new GridBagConstraints(); + connectionsPanelConstraints.gridx = 1; + connectionsPanelConstraints.gridy = 1; + this.add(ConnectionsTablePanel.getInstance(), connectionsPanelConstraints); + } + + public static MonitoringPanel getInstance() { + if (instance == null) { + instance = new MonitoringPanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java new file mode 100644 index 0000000..76d215b --- /dev/null +++ b/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java @@ -0,0 +1,32 @@ +package src.java.view.panels.MonitoringPanel.SystemInformationPanel; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; + +import javax.swing.JLabel; +import javax.swing.JPanel; + +public class SystemInformationPanel extends JPanel { + private static SystemInformationPanel instance; + + private SystemInformationPanel() { + this.setBackground(Color.red); + this.setPreferredSize(new Dimension(300,200)); + + this.setLayout(new GridBagLayout()); + GridBagConstraints labelConstraints = new GridBagConstraints(); + labelConstraints.anchor = GridBagConstraints.NORTHWEST; + labelConstraints.gridx = 0; + labelConstraints.gridy = 0; + this.add(new JLabel("System Information"), labelConstraints); + } + + public static SystemInformationPanel getInstance() { + if (null == instance) { + instance = new SystemInformationPanel(); + } + return instance; + } +} diff --git a/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java b/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java new file mode 100644 index 0000000..932279c --- /dev/null +++ b/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java @@ -0,0 +1,113 @@ +/** + * @author Aaron Moser + * @date 09.12.2023 + * @lastChange 30.12.2023 + */ +package src.java.view.panels.StatusPanel; + +import javax.swing.*; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class StatusPanel extends JPanel { + + // private static StatusPanel instance = null; + + // private final JPanel flowPanelWest; + // private final JPanel flowPanelEast; + + // private final JLabel statusLabel; + // private final JButton monitoringButton; + // private final JButton controllingButton; + + // private final JButton nextControllingButton; + // private final JButton previousControllingButton; + + //private StatusPanel() { + + // this.statusLabel = new JLabel(viewModel.get_StatusPanel_ViewModel().get_StatusLabel_Text() + ": " + viewModel.get_StatusPanel_ViewModel().get_ConnectionStatusLabel_Text()); + + // this.monitoringButton = new JButton(); + // this.monitoringButton.addActionListener(new ActionListener() { + // @Override + // public void actionPerformed(ActionEvent e) { + // view_To_ViewEventManager_Queue.add(new AB_GoToMonitoringPanelButtonGotPressed()); + + // //monitoringButton.setEnabled(false); + // //controllingButton.setEnabled(true); + // //mainFrame.setPanel(E_MainFrameActivePanel.MonitoringPanel); + // } + // }); + + // this.controllingButton = new JButton(); + // this.controllingButton.addActionListener(new ActionListener() { + // @Override + // public void actionPerformed(ActionEvent e) { + // view_To_ViewEventManager_Queue.add(new AB_GoToControllingPanelButtonGotPressed()); + // //controllingButton.setEnabled(false); + // //monitoringButton.setEnabled(true); + // //mainFrame.setPanel(E_MainFrameActivePanel.ControllingPanel); + // } + // }); + + // this.nextControllingButton = new JButton(); + // this.nextControllingButton.addActionListener(new ActionListener() { + // @Override + // public void actionPerformed(ActionEvent e) { + // ControllingPanel.getInstance().switchToNextPanel(); + // } + // }); + + // this.previousControllingButton = new JButton(); + // this.previousControllingButton.addActionListener(new ActionListener() { + // @Override + // public void actionPerformed(ActionEvent e) { + // ControllingPanel.getInstance().switchToPreviousPanel(); + // } + // }); + + // this.monitoringButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_MonitoringButtonVisibility()); + // this.controllingButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_ControllingButtonVisibility()); + + // this.nextControllingButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_NextControllingButtonVisibility()); + // this.previousControllingButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_PreviousControllingButtonVisibility()); + + // this.flowPanelWest = new JPanel(); + // this.flowPanelWest.setLayout(new FlowLayout()); + // this.flowPanelWest.add(this.statusLabel); + // this.flowPanelWest.add(this.monitoringButton); + // this.flowPanelWest.add(this.controllingButton); + + // GridBagConstraints flowPanelConstraints = new GridBagConstraints(); + // flowPanelConstraints.anchor = GridBagConstraints.WEST; + // flowPanelConstraints.gridx = 0; + // flowPanelConstraints.weightx = 0.5; + // flowPanelConstraints.weighty = 1; + // flowPanelConstraints.insets = new Insets(0, 0, 0, 0); + // this.setLayout(new GridBagLayout()); + // this.add(this.flowPanelWest, flowPanelConstraints); + + // this.flowPanelEast = new JPanel(); + // this.flowPanelEast.setLayout(new FlowLayout()); + // this.flowPanelEast.add(this.previousControllingButton); + // this.flowPanelEast.add(this.nextControllingButton); + + // GridBagConstraints flowPanelConstraintsEast = new GridBagConstraints(); + // flowPanelConstraintsEast.anchor = GridBagConstraints.EAST; + // flowPanelConstraintsEast.gridx = 1; + // flowPanelConstraintsEast.weightx = 0.5; + // flowPanelConstraintsEast.weighty = 1; + // flowPanelConstraintsEast.insets = new Insets(0, 0, 0, 0); + // this.setLayout(new GridBagLayout()); + // this.add(this.flowPanelEast, flowPanelConstraintsEast); + // } + + // public static StatusPanel getInstance(I_ReadableViewModel viewModel, View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue) { + // if (instance == null) { + // instance = new StatusPanel(viewModel, view_To_ViewEventManager_Queue); + // } + // return instance; + // } +} diff --git a/target/classes/src/java/connect/Receiver.class b/target/classes/src/java/connect/Receiver.class new file mode 100644 index 0000000000000000000000000000000000000000..e96f4b7459c253901387613477ae8a7fd4456f7c GIT binary patch literal 1719 zcmaJ>VRI8z6g@9VvuV0bOPjVp0VRkgTj@dtL{d};t+a+lnpkYVZ8wjy5H@kMVfZWh z2l`c1TE@=!(a!i2{1bk497jCwWt+qiOlEf9d-vY+&OP_u{q^skeg<$8_YK4ZPP7Bp ze&jrLY`5wA(hco(=}PaZ3=AX$#qT+}dW#E~^I0aIa2n=p`4tK%kyktTfj z&}$2f?8tDXm)z-m;eXOgGdwFWS`8id@m;4CT^J8KzB0XS;w(%;MjG69LMM%LIB(z` zfwTXSjrmGHv}@&RNv}-2i}wUfGOAX~)u#JchSZyslxWXvUxs$O-LQMcVj2a^8L$Lq z-r!>5eOw?VuU+bvTC$qdcguiHRbF2W1DDt&N46Ee)d{O1OZcQ)EOqM#CNATOKt{{g zb0Cq3uFV<`M3U-7e5lHCjU~wU+F;P7u#v_*t}7?@!(`tn>JeqXflmyuMb7lp{JJAM zvK@6WJMNy^n>dM21#*Mse61sS-M}pqCETViPMzvZMHlM1uDPL2}y`9nEmM+Ux|bT=vxDj2=z=yt;^e%k24u zh$F3LjjNcN7rvpUh0i2+BQWVV%H4Us)o)1rfXs6)Vi@N$sgK8TOrNMzj$ahA#GMKn zv-UA*#b02`5-%{*51v4R=4n1BcxM(Ft`(31U>HtlUc;>H>;NQ9$bOH^Aw~}%HurIg zjJW@f=W$Icqcc;{C%He>BX?SRh;f3Q>9PDOVwtrPWVj2%+QVDckC^)Q)gOv#7jl{+ zfuao|M_JA>I)_P$(x;n^=&DN+h^6AZg&&8A_-`Z=qowi^xjp2+!5v;PbBI~%0P~v% zxVWhe3;VdbkB_L5GXH|yE=FErac&Pc@2itNENzw#U;Vy|RGEh>&j}AKV}h)p vQ2s9r8(9An#+rfE1P!%bo|hvvle*shQm1wHMe4UWpjk4yR^UrQ$FT7aWrt;C literal 0 HcmV?d00001 diff --git a/target/classes/src/java/connect/Sender.class b/target/classes/src/java/connect/Sender.class new file mode 100644 index 0000000000000000000000000000000000000000..46f73f8a1745e31f770b5bb02cc9f3701eb2ea99 GIT binary patch literal 2552 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 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/controller/ControllerThread.class b/target/classes/src/java/controller/ControllerThread.class new file mode 100644 index 0000000000000000000000000000000000000000..0a85e80eb5c9026148de959a193cc24ce13433a7 GIT binary patch literal 2501 zcmaJ@>sk|66kR8Y34{SLfLE~4s!f8LTD7)Dtr$RKgCdEjSTDom03*XpoSD$l+jG=+ z@K5`-cAY$C(p}OG>9s)#q^q|}rKxIl z`gTP?EC}?{k>~5SKd)O&87D0vkTfh)+P=VOr5)RrhF=J`3Z=lJNZSjhZTgo4;@RB1 zK%(T-Wg2np(a?*&ZU_u$=z%7%yJFh%MssaZx;1^#k^-5EW9Zhr?wV>IEhhXG(-Szh z!}Yt;LIQEOX$zb%m?d8_8pYCd?5eN3ewZb1!meMHewjQ?-I~;WU0^J`jbG=A%2ISv z85DC1X;L57FoJ^u``<*bIaTSdOII0vpkWk!0vhw!a;Y{x)bNqo81STBkG#*xr%mbk z46x7G;Zfl5`xy!BjZSPiuQmxg<8$k-w$YDH%Jn6Tp*C9j=$8kcS+iXnK z>u!KEn9WtTC06xa(_Sv7QNXDbJ`p(Df+LZwimdCFNpxADfP#UBPjQ;HHN9Y^JiC6T z8qkU*U)a zwNCYCe@rgH1n5k+s-&I8^LHo$Ppq zRV>>}%GZ*HWvsB2dYyYa5_xm+2^*gM+Jz^)jd+ZO>w?9*j^i8CHBOh*#pg6#Lr$CO z-WlRrq~Gv{IH~H#d|h!I-}7C)F(dsIr|zZk6kZB0FX`>RFzt0`RTjebAQJU5tsB1M zZYUv9YCpHDJhBb}ujzK(lHQSu)XwB7qoblprA&m!fu5AM-SHQ<@2ifYu!59vZU`W9yg}_mMd=rN*4nIS0 zeiMiJj3u7OpA#WY0-$}8?>yhf8O{khK7$O-a_?N=VKkx}dQilV;3$10(T`(HMT|^> z@c+S};EW%hh`}p{nBd+d31na5Mg>=RkEpcfL;q2B z$Ry(4#RA<9xDVhI<~fQ7QKTUL<<+ag;HNPPV~W2j;RA}(E8GzX2mBYZU6Zh=cggJ@ zv$xPzn}Jqs_)(1@=jcE|4!^{MjIjxMM-9xa!KxZ;V`qXW9uWH>u^-_O9=G8SNBD89 b5itfE4u6$In|#*sEobVhzJc%YBM$rzx$au2 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.class b/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.class new file mode 100644 index 0000000000000000000000000000000000000000..83a899fc0781ee01d4be184f2790a29c0b71aea9 GIT binary patch literal 3249 zcmcInTT>KA6#g2Py)m$eLSRK$$%4yx*_i7lYfKbFB%%^Am}qXpY#T;qXUNQ8#j5;} zJo*ECh*jB26_v^l$d5|p>*>WE)+s9w_;9vQ_w;w}eNOE^|L*?{;0jtf3<%r`1H1mn zdTiBg--`m@b!AY$W<}O|;M+0`9q*_5vhR7)jvU_$Q%_gDhknqu)P)=}0%Nf}*COoFH==;5n*znqw|8W8!|^D_ zaDCfyuV|P+A>OY0K}2DJZ2OUX@vW%$`eQbXtY|M37~FLzCVR>8oanNERa<>o=l?lL zfu$WSZ3<+T{gy0Z5GM?bVS+Z)mNp9zc*DRDvWlBFkV9T^Ck+%dcgjFfb8`lU^}W*u z41M;dff0SSU|>|AoiR{CR-m-zc=Fa>drJm)tu0roz^brqT7jeX-NQ_@?Jy$iYe!oF zOxf5?8EyNmbt|yiGLiwcWaZC$mP=-%cGUWo?h6e0(Y9n&jci1gy>rvr?fRIHd|gNa zCu&PCCw81K;avmo;eDo~ZS6>wx@|@GoM@XIi^hv+bMU&WRg45@0OmN4V?)+4_7=F)wo_p*WW_(VV+dG69Q^2u-bdx0%i*fIplz3!9f zGZ$2+V5MF4{V0qAYgd$(zjhF2_`ZRm+g{pSL|C0*~{ z)&j3vUdxqXb8y?N%=+GNA8=8m4Mt2u~&?BSC zfl(5eBu$aZq#4pIsY043RY{ASO{<)eLF}RobNE4Ep_hmhuMUbT2Nv?|tFN+w>Ix*I zM=CDzVGgo=6)>*G2)S`JMB{q@u)Cfc-=9CXZF{ivx_BPZABua70 z6Xi=ojX=ia9QlPp3{V#eB<0L7$smo8MoA@-U~{{`U*+^YnygGHn}1;PEa@r6$S#sy ze2SsWv%zQlI+$>4GIncHqh7dGMx71{ycORTQ)DmV?XHqvXo~XKR7yxwB&BeMG)te;08Ya}3rR7klWGLnE4Qz0|`kkJHWIMtWg zeqTxnh>@zL(ywJK0U1fvGT*P|SOPMds-@bmWjp~XrD|F1*K+&?_~!{)xhN2vRh?ozr(=?;zoy5k literal 0 HcmV?d00001 diff --git a/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.class b/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..6a89df5b4885d305ae2834bc1da8b9e534f0a6a9 GIT binary patch literal 4870 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 F{{pFZUfcix literal 0 HcmV?d00001 diff --git a/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.class b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.class new file mode 100644 index 0000000000000000000000000000000000000000..dffd28687c83a90419c40f0672a74f4b090d96af GIT binary patch literal 1265 zcmb`GU2oGc6oy}?UAl&{kGAVJz6V^iokX~Rt4@>9&;%%qNkx@FaN%ZN@yHV7xJdjf zkU*0_;s@}f5XVkfQz#cmRU|t(_IdsIyeB_?e*F&M0d7~|Fg!|C=%4WS+z*pjt0anq z@*i@|4^DUMj|bQ4)&j$(Bt?xQKwwXB(9*$uws=WPD#&(CnD4gZkEf? z3hd%o%g7I8{8k(VGSxkXYG00GuE$C+yqvjd=l`RYp|2J3_jc_=C_6HidY7Tp?hF{p zd&!aTP{PF;s_+<=2}>M|PlrO;+cDIGB;?V6D`{?<2g~}6Oc|a8^C}(H;Awk)YMns^ zO@`*Ia#uk{)UW{8LjxP;;+qVc?LvX~Ob>*{(w?c3OYW1+WYb7!TLHTJM!QqUm~!*g zKbGd?VKtplOko!w4EF2dl_qO*p)mTb>CX7@?ss>1{bZ~{u`eTP=k>q;lRL&1Y>^Ko z`VAQzV+PF?`f{*{GQCqb(s+R)KFy5gh3*+@pX`<;8chPQOb<}YHedy-^ktIkG@9f? z5_4#7n&j>`G+u0f#@ZRyzhG^mwPZn7X>XlcqG2^#SzfM53b;h-2IVrY&{_t2^$$c6 z|47F}MriFggy&qZ$JsE$3-?QZ9AC9C4u=sl{@{Q{VK4(8_7+oE%`LYT;+MZIZR GZv6r)NIB{N literal 0 HcmV?d00001 diff --git a/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor$FieldType.class b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor$FieldType.class new file mode 100644 index 0000000000000000000000000000000000000000..9d78e2f69b12fd6b5b3605ca072b6b62ebc191da GIT binary patch literal 1580 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 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/controller/validate/Validate.class b/target/classes/src/java/controller/validate/Validate.class new file mode 100644 index 0000000000000000000000000000000000000000..d68a3a49cf052d16df811213713b9ac22d2e761d GIT binary patch literal 1709 zcma)6O-~zF6g_Wd>@jBSfT>VhB8U(nyuMcgwpMs@;`YD@3Ed*A&y_uTvD?>B!P0a(VG z3Q6E{+pgsv>j!$S*0dbE*=QJc?m%ytb=@&?TfKt{MPS4;Yv|T)ZhiZ)QF8=>CDSsU z+X8Yrvn8OcH0wqfGKMq+5EM95F)d@Qv%hWF_x0_DArPxHYkFf#w@p{>DHUhWYzw3+ z{|n3#qnK?ET6yCjzg(}|Mw{;Obfu4Q)3Hr!cPaBQj8TlKh`oj1zt!*o;w++JSi8=i zS4264a{|)0bFSNjh6IuVfp)85vf9*X2_BtH8pb3psF)HM?E@-Xj?{FdCHA8EMcA`Y3B!}>eqbJ%PRP!Jn%>@gr99f80rg1&-L$^wy1N3Z=*)mvWQRAk=jM4{J-5Iz=|`ab>W+U%k}yYt3AhM?=eGe+c;W-*s#3~v7u*BcKM{JxgM=_w z_ZrYJ?5&;wr3j@VL~+J<7K^kFQTISDWe+hj5_yjGZ0zhI#;Y?&>hHKS^Pm_!Dg@+$ z@&c)eU|gABn|+P*hxo9d#?{|299Kut{R1Jn^a7Ee6%kkBfoI)+6p8`4lzhqHvInTh zv_PB*#|dfzF(i4K#8pfoj|=?fO=E>su2Q$bmvj%8@ingC8)Up9@~oLaslCEoqCScg z%ZTAKq-i5DQW9C-%8VDIG(&!7X?q`Pmu{+xQK4cE!dua$d8nszH&;uZy5#p=Q>jZn zdYZZwkoY5V*ULKXTcS+X++P%5^5l+96kqWqdAVc=rbC5l3Dy4qovv1FAYYBV;hRVi$nAzA94?>W*i4+{*zh9w;aw!@$ui?cn) zl46%THM-taZM#vE+!hR>b;C5A4TiOBueY6EQ?Dg=KtYRERm3oaxP}poG7M#N2T@Q= z4Z{d2X-q>H5hdNy5cO=gHN+5Nh?fjgd}yAOh1}=mI;E8?SruMC;L=cf+Zc3e29-Tk z8q_#y!RUM8)U4_*m;6LHLK0>yo9oToO_TZ*aV)QWNqU|88t&l%!*X_Tn7;lZHE!2b zFO;W;8fG!iFms(JN+Be^HhG;AP5YnWWBG^}QOJE(?iMs;@rYsN8h5@rFYyeqJ*z1z z;;o^&oBEe)ONvI+wk^wYY)A5j*FQUkCs+w%nPIw1G}$yA<3!{=-|d?kR`Ha`S?+jX zIQJJ~n5WjU$a}ZnakE+%_H42wFW)waeU>(G|EwXlgB#Xb9j2 zX?5C%Y0v0CaZ_JtA)!yUkkS`hNb3{97RJx%G=K^Eh6o9YlA-Uahr%69l16wpsyffO zaRaWTBCD)2YQ`zIyCf%qE;LMHlva!uBg+(hRYG&LD>uXX4m&>LI%W)x+*43s$|Bcp zL6#yZM-hGD0{S3S5Q}bymXN1CN%&{(!#>ALtf7E)ydryy>>GH4EqeGO=^1)Fk5(S3 JJW9EQ`U_-HZRG#} literal 0 HcmV?d00001 diff --git a/target/classes/src/java/main/Main.class b/target/classes/src/java/main/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..f7527ca2d3a2ae70c14acf3fa0d9f30d42d33ced GIT binary patch literal 544 zcmZuuyH3ME5S+`)u`wj%#Tyc;gaVfoK}ZM*QJ9Aml!of!oWezC8(ka_p9KX-6np?5 zh1heDB1D>5@2qEby#D(B_yll@eG3_e%0vg=m_KqaJ!-3GZe4qrG`*FZkpKEFQUow~6%Lzlx z|G&9Qt|kUUqkZSk6Z8@-qfxihx3P+Xaq}tGYS?nHfh`N04ApeoUxABl>@Zjl#zRr6dV5hQ3eEM1KB>AOGlSEM zr#cYl(pTIl_ mM2rz1rDnvvqFiabVSR4k(1=`7B&)fJja}>!&(I{yp!EYb^Kohb literal 0 HcmV?d00001 diff --git a/target/classes/src/java/queues/ReceivingQueue.class b/target/classes/src/java/queues/ReceivingQueue.class new file mode 100644 index 0000000000000000000000000000000000000000..e4119b346de778a14339fa6fdc00028efc7261b6 GIT binary patch literal 592 zcma)3%Sr<=6g}y?)2V&>+K9SpT{s`mQczJ4s-TsE%QOu&cFgEB)9>=JC@8oU{3!8e zS_L=i1m-?+&bgP9_mAgS0DD-^BEhgR359pfr`)@XWF#lvxfD`Ol^&hhI*SxTBfgJ} z@;wn~5rv`D#_K9QmcxBN5aTa2Lr&?5;aW(B&F=5gErv{6X=OSL$wsr!kU9v4(m@gh z7g^*ON;E^BMmGZ)UhsiWqSbC7xZmfYvh|{wGFNKCP#8&b{5^iV(fn(HJV?+*8X1SO z0zx3!+fSBV|X|emb*jO<~CQ)JSs^g@ovI|7%oxj`X=6c|8-7f2~dn zTeL-z-iE=kOHr1fLrzd9PnAcJQB3d5;5@|FF8woc(?yYTcMiZ(OwXf)GIcEZkfiKa we?;XC#TT&48EQ|cP<>DRBymAJyFiK9WjfVZ)AH&uf|W^RnbHJSuo}m;Pg4_#UH||9 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/queues/SendingQueue.class b/target/classes/src/java/queues/SendingQueue.class new file mode 100644 index 0000000000000000000000000000000000000000..a8bd8394633ce1fe858a3d9cda2b1765b828c6f0 GIT binary patch literal 584 zcma)3%SyvQ6g|^-($qezFA&jP>%x3MOF>0Jh=N24E~n{G$Hs{!6Ti#HqM+bb@T0^# zv5KqW49tC=b1!E;K40Dd>|>*h9K&W32kte$=k8r9Qjxg6P-Cek=O!wnz|hI6sg|J| zL@G$*SSam!QccD9AdG_PPd7tFszh@Y2!<_h5pj>9)R#)?0Ykpi9WoRSqp`4&N7X?Y z6^1%Z5NGMlNW>R>6cT02ivk`Fc`QvlPZso*Oc<&Yp-+B?Z+E(j$6Fve2St=@@~R9q zU-Mvk%5UeiwjZT&AdaOO-2AJ_o{@vW^5sNvoyJrjc>k5C|J@mKHF13%lXAU54?DC& zp8kZvHY<^rqf07K#-hk2%g7dYXRsf$vO{kvOFF2L?|e64DT7<6qd^%1J|Ze}+D~Y{ tqxK4RIm7ZZniM}!K2KN>&MZ(Tbc1dy<21N-*1;M?vO;bSt60nI`WHirh6Vrt literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/constants/GUIConstants$E_ControllingSubPanel.class b/target/classes/src/java/view/constants/GUIConstants$E_ControllingSubPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..135e1f6609cada864c00acff8f6dd05011a2141b GIT binary patch literal 1572 zcmbtUZBNrs6n-vy={5?CAyeMphHL|wD4??Ox_~Z@L98rU{9w9Sp``0f+hG>}l#UM& zjmFRZDC4=;B8}0+xPIul&$;KEd+yWc^xOB3UjS?)FQJQJ&9-WpQ}s;Eoax%zOs!$s zj%qq~=J8P>e+3e|FKO*q4a3mQW2IR=R87s0;AiL+xrS;UXLikIoguuV+M3vB$QA#; zdX^zp+Iy~64Q)@Y>qg71+3z~V&Tqc_iK?5fFY3lUYZ_PW_)85_W9Z&39qlK|+r^_@ zg<<_gXHAB3H6lfKHW+-#RGGn_Z@kh%2t>dzAmauG8G<=CB%Ul@6Q(#8(U~oz%3+GV zDIj@|5KH9gWNe zoh}zlQ?o?7nk`|AA@MIm$T0ZFA!i7cG~0R7u$`?Xl9rGD9n#himnuM(R4Ob9R9Moc zup~=iNs&NwnCp=;{UqdG^iiECp>x9gdG`sd66^O}Aa;(p0Jr=C3<)q25MWe*@t^<` z0!&E)Obd_*2{0QCex`c9HsVUf-^P$q3A8b)RDx|xC>5!VX{8csV^%rG+y^?o3n_Y! z(^dGp2NM{^B<3)MWlYnLat0-gAuS?#G)=U7fhD3t5R#rBy}&j-Skyrk*CMon5#VXrN2~iyz_nE$R#oh@5O<Rc$~IK|Rhujl zwQAILKdR~-#|hq43by2#`#ATWJ9GT!?~h9W`_NT{81jy7=qG&2^{FYo>c-e|TyD9J z{T%COorEzzEgj)nc69}flPG{*)X_PA|I+jGXDAVFQ-&!$6-rhGUNw9&J_xd}fTl%;>s;V;miy2*WKk0+U_4Xfy`Z<8<_ip&Eqw z)8`gBZaHj5!xKDbcoi&G8*;}f1sL2^pHCx&Lf0Mdj3>4s4orEVYe9YO%3K<>V-76t zPHc)-0wpEBya?M0b<-M_C2WtLa8wi-GPe;Y!;&xNXj?e$yRqX|_edHF{WGEJhExiW z+>|;YPnf{~}8{#aibK>)$CH!d?2tX$2Bkp*QV$ zWrRfQ7u%zjvZcIkHzg#qt+;_8aW~xG-LLHD4m@tvTc+lJE=#?9j>W Hdj7&c+Nuyw literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/constants/GUIConstants$Languages.class b/target/classes/src/java/view/constants/GUIConstants$Languages.class new file mode 100644 index 0000000000000000000000000000000000000000..af0645c88edb15e6d0812dc0c09a57d22c3ad45d GIT binary patch literal 1231 zcmb7DT~8B16g|VX-F8{Ns(^g>U9~OPr4oHj&Ho zd}F6s-@XcRCU?6b?+RZ+B0f+1`6E$+0qXUjM`)SzIB zC+6bVP90W`+O8-zML92#ws?#ZIQ7nI@A7Jh5gmQ+-Q)Hvy zW+Dn^lRqh?oFLn1Cr&WiIK})oLX2U7{wJepRZQR|7Ez%`X5>SLAIvCIjpU>jSC-GP zbPY~X0R|vF+N)TWWQpi)+!?@MkPr!tLS z4afHiJNvatzsNMU-x~)ue``40RuN$slN8%<4hvPM+h#}w5Q+07kYS~MWA)NNs&Zsl zPG4#=(0|vpd4F!S+SuRCG`H&eRh?n=!%(}$%cgBPmcPNEWOGf1NTu_U#}Q3}VM4iN8_ zVF6i&gyFizsoD8_%8(D|+&ehtreCUsqW7mLJA*2%?R{d{3Dbh($qn&ZMD!&MIXq`r z3u{(v!}CfZBiEY@LWzc?HcIN9u50pb%jOJ|;dWjYSjwwghmPTQU0Sb(Bn7`bgy{|1 zRI51-ccn}2saR#m{Ld92V)%+N#2ei6Uw1rzvq){D(1nd`PK*8mXr$JXBXt!pF(Z0P zAgIemp%MNTRc)%pZ|etGD>bH^WBd$LvbYnGMOqg3qOzEd{Un^y!<62N^pMtD(H^Gt zGt7P?krCXd|CE$mAo(n2=;bV69uMTIK+r`Awl0!kVOh;D&Yk1oKp;i{1SH{;Ab2D) zP=d#J642Kvr=X{Mm~FjL@|Uf$@V2YWUf}7{S6aEUbEU?vEhNZNKG4V$M(8I~EPsK; fUts^{MX)S23wR;NB3=q6@#zbOH9GHgIluB3wb?&g literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/constants/GUIConstants$Panel.class b/target/classes/src/java/view/constants/GUIConstants$Panel.class new file mode 100644 index 0000000000000000000000000000000000000000..027e547b528d825f6db3e8cf9b7cad71735d1bca GIT binary patch literal 1484 zcmb7EZBr6a6n?I}Ea0Yyih`zPn1C;2sl7mmFf>eOhVLb=KWxccF3mQ-vRN zYI6GAk7_#iwgz9C5k7G5b2#U@&pG$G{QCXv3cwc15(XHuj@`_isBJaZ*0oQ$re!*= zYPwGDZZpU^ZVp} zogQkoXqX{ZwVJ9?S8bioQ3NCKVU%RM$GSsG+p5vhXp>84`kF)p5AaaJDqUPphi8tf zoyvHGHHNTi+v-`<`glh6>Yc;h;R)SVzS1+A>k!R`K@ytwJ}{Je%e?Vr`nfOO>=PO5 zc*?NeOI9{i$I167_{ZMuh8vrV8Bwg3-PCq;Lt_}}eGe-{BU5!-HvL}gq2%?2 ze$*D}G`T`vwuL;+kx*ht-Q*cD1U!3(YMSG|vK+UxO4jhv8<$E6ZZ&{ba+z4kU}7b2 ziIr?6R&o>&O>#d`rJsyAgkj=|5;`Z$KcByYHDV*a3&hS57huvaKth12fB@41%mf9P z72vKUz?=Z7kO1@1;1A;Sbr4q?{tgmKBhbOL(g=1it2Cqz=9EULgL&l~3t#E@0c7ZV zhFSr}NoE{LOke?%SVMyT(2}UpE6j>ao=q>(YhabeAqJ9NoW8(fmn=vL@QP%ym$1Yq zL2qvvD_;2qO_7(!J6LGE_GPac1+IM8H+6~J(id?cm-d&9OfMpwV;vhFN0tQfvm!B; iy~N|6VE?c44OUYC literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/constants/GUIConstants$Status.class b/target/classes/src/java/view/constants/GUIConstants$Status.class new file mode 100644 index 0000000000000000000000000000000000000000..35d3bab15d3ff04965718f0c674ab32bf058612f GIT binary patch literal 1275 zcmb7DTXWJt7(Lqn0UCRuiuU3im3vxi>jO+JLs1!N`w(G<@hPMc(}Cb50jK{;=|ej@ zc6|0nIexpOZC;!a9@u=l=R14O?%CgezFz>S;H8WihMemd>ajl3)sba>QH_D^db;ho z>YHZ0dRe42Pxpqdj1a?|0QYpetJdscpCLvt+cZ4$h@sG!g0936_j@h7%b@I8F71EG zHCsDq?x$LnMzf|d6hBN!9W5I@%eK571}U9sF@&mvBQuI{91IHz7Lj0xlzm7t-MIFp zc@7CG)ibRaVQ(r3BNBzoi`xohUPO7Zq9BS0|5{TJL!4p0VcF)vu-`GA_j;#iG9(%U zL+`b8$Kth^j6=c#>G3{UE=d^ay`f1T>*>sN9^**isf;INC!qbr^~}D4XGqi4=#HbG z7=zCz4B4Q=!_G0?Sg9T`eK|$08Dt^q@FPPd*ybNhW~!^;cJm4{C@^dV*{VI=bxQ#W zSM=9*c*J;4w879Z%-0q_(#2pjiyTW%HLGh=Mjcvz6`^gv3bc0Txzxb~u94Gz*3BH>m1U z&3~02VC}@5bcXp;EQ#V)NEAs?+zE?fIr5Wm(ilrxJ2Xa8Ylp{J)=shdjYwv2m;Mui zvOx4jtU#rV9{KIt1>GS{{*t)Am?{wu9aga#1@_RwwT}i3!1JfPXGV_ literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/constants/GUIConstants$Theme.class b/target/classes/src/java/view/constants/GUIConstants$Theme.class new file mode 100644 index 0000000000000000000000000000000000000000..edec53959e641108cef7c366a2a3d7512324ec84 GIT binary patch literal 1199 zcmb7DU2hUW6g|@g7U-5zwA6n1jS947MPoIA5E?`!Qu;tkLVTL8Bi#y%*^*+a6%2`b-{9RAw@n#)hfye)CkgJM z=}^~W-W>?q=;_QX-9P5F|KQsRr#s4Y=9t!7!m_T&ji#Z!jVbsS4p^~}!@ZV1PH z*LU18x8rELIO$uU5DMf!y@0a~M&r8iY8e03{QT8{T~-V*5h2qhPQ4aCy|7wF9vzK&}ZJc{tx;97cKw* literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/constants/GUIConstants.class b/target/classes/src/java/view/constants/GUIConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..7f38a644a2a78194d4818123bf8e515c5f354701 GIT binary patch literal 872 zcma))&raJw5XQev;%pNF1j?U6DNsm(f`r8ts;X7gR7hz+O5j>;%qkd}wd7sHb8$lA zzytK5Dn7dbap=L9`OVDkH#<9;KYt${0er`{L`k4!lfb`HH_E>W^{pSo#yVx3^?#ln zx1R%via;~J6)7|FPli`Ia01mYp$Xkrf%4AhbAd`bzR-1)QER|MRbaXs8r@5;hdLRk zVWb6SyK$hRbCrZyJWf{JWoQMqxn6xb{DdfzFRvi0geN1|2q#lfY{=QZX; zPh0m(XKQ3}0InMs7$irEDy?MX=P}^z-s8<36D8DXvtyu!3ED>Pd*mdeGNx!tm`0O4 tWRV%3zx}p^IdXwqB$vo#a)taru955H2DwRoBDbh-=K48mmU(X-n@>|Z>i7Tv literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/frames/MainFrame.class b/target/classes/src/java/view/frames/MainFrame.class new file mode 100644 index 0000000000000000000000000000000000000000..4930f7118dcbcceddf3e291264343d314ff28681 GIT binary patch literal 300 zcmaKny-or_6ot>-A66F-LSttvg~AE3l$aQkEyzNnp&!-}u32`IS^i#&%EW>P@S%uz zHpJ5AoO{kBC*S;>zK;N&(T(5{ZYrCpPrcP@%VwuOtX`Q)O*9vYJ0k>yo_pV`YRAPw zjq9G!7;(YtCxU<1pAmwW^4-MnaoIwM2BDL3VWyka+}Jlg&yCEaWv26)w(Rn`4Ax7o z2)F6~9FK(fwcOauB?V6b7XNuIHq8Qidf)y>l; zaA-RvqkQenC4(wH)^LOV4yklv>G&j6c3r{SJgYr4n9ZiNAcIwx_Rnt3$O3O>DabYD z?T#Z8?r>(&ZF)6%-cpY3R)=g_0aJ>zt{eDt#Cnw6&!7gWfhgn8RI;26cTL8vF)I8# zQC#o7QslP4_w9AZ(NV&Src<}2KVEU&wdQ(hEAzIIj)hD2*X1_h?XCFA@*P~Ydq*m2U~d`kJR)Hq-O~TL z*-x9ak0bO)k~S7dsQZU+JNT|4&1W~izU8c%pD=zy#t^@v$CzxP&v=O4Eesjiv8fjJ zKS0{x@4=rLn8aIr?qdpI2r2AlnqluPP~;f>tj0rvR~VPzSZ4B1vX~^nXDoU{gac%8kg*dX>Od5|iJFN~ z6;={LUB$f4;^g0PNL4>$WRJ9P^Z}*};}`T$ffGktct1J&BeKS53v++qEC)aMCLupoQzBKZS*PSRns zyi87o=th)b6MY~?SDYg&BpCZSc_c$qggp9{bH5;R0$;-9Z!h0g$Z9ow-hs`rEXNvf O@fFS34-diVq5lD?fP9Gn literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/MenuBar.class b/target/classes/src/java/view/menubar/MenuBar.class new file mode 100644 index 0000000000000000000000000000000000000000..47bdf38a07769cd72099ed6f61342f65a1ffe473 GIT binary patch literal 1640 zcmb7FTT|0e5dO9WLPG#47rB+2sBNkQM7$Lcsd90OJfJu{hW1#ZC1sKn@ZCS+ldn3X zz{rf_v%kfk;HZ1r6hunVJml=2v-|CSyPK15KRY#6wrOlzV#nAN zc46Igj3r)YO-Dfup-mp|8t#r|XN|}H2_c*_?QFr!ie%pQoO~`P9Ku+tDqiZ8OM*~0 zY1x)HO$bI~tAv_lJ|k2F(V#&=eF%g`4YjCK&`dD?6JJFWS|m`IFchtxT_U!sq75Ai z+6nQ>fn@@X@-YC4wG{mmM0!*U7zRls-}8Bfg$PeQXs7_3@e=^!iIARDv6 zgD1-A6UP50n$FvyZIMuG z*%`4*AeI|fJTv`j$=ve$qORl%PFl=avU8eW_z^jxtS;KNaFRLGb%m?oAz|cXKIbu3 zFh>~v7av0Cs1q1tLP5U42myI3uvEhm-xRzPVr_$U;#Jr8q3ZMrntq6;HP$Xj`2ekZ z=z6Z}AE6x}BIOTk9l#}icNg(m8KH%-+R%;;MEK*5p%cS=u9c8+8CO^f;VPnj)F>m! zr~VMMwvX6*mP?p*MW3FczqBFQ72j)`ZRB2^9^b>Y<2=;jZa?!IDEf7jto*oa4+Eo& z5s>5PV|lE}x$?mQEK&_KNw8GQ0a|$NWlECb rKndh1ROBdBH>MyHzRy&vg9;MLwHF literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/MenuBarLanguageController.class b/target/classes/src/java/view/menubar/MenuBarLanguageController.class new file mode 100644 index 0000000000000000000000000000000000000000..ed56367bf7fc0fb5d9932f50bec4f67437bc63b5 GIT binary patch literal 806 zcmaiyUr!T36vfYNOP7`@MZ~Hg)PE0cP1xXTjS-ueloWZ;^nF?;b;z=tYFy zC$>EllzP#=siKGl1rJJ4Y_*3K2o@FQP!`k&HZ-5p!;y)<>QP_>%Y$gFgQ1SCTj$PF z^36^KTeFY6-7yRHCMI!;u(?*hJp<6KqJbwK9t+lIs-W-?PX!H!b7G$O(_>3Hcib^u z4{L(ey8(hZ8}6GEf%F9`udWxRA#Z~6^j#S*6gJQlRKG-NJT{-KQ)c7Ni`{f(V2ipI z`8)&#CoX42&OOZ2R=C=uzreBH`HgBvexcTRL-Uia0_wEODA6v^R`@F{qJ|}U8kcE! zzzFx%Gdvrh5Gy(SLk?G+Q`FYZ@aPh*)Cu19r55$U{T;FqiuFw7cz4JyB8TP$BozjZMkRcaDgGezH+X)e$#NLjMG#Coo!9a#G ze!yTjuFsI&iF(4s8HR=5lPy@7x3PdlhWz#sChxRbE!Up|!;+00@(hb@8H%UlVOOZ< zygLvK%k3!O1D`9Y|C68v10_vXun1bVv4#qRH4^dTP$%_Bi1WhrO`IeAv5-fS>L1A{ zv{1#m#&1w{q`~zy&qW)TaGB~Po@YwD6iSI+M}8m;W#^>!W0pn=yK3VaHW}s#*5tvP zzKX^nDOfp$N$*SNJE)m(87ikQyBVpTP`f-JE8g34SNWl!2Y0gtButGyeG!?bL z5xh@uz3bLyI9oHOSgjqRx^HA>I6uXO+9wpJxT2Tb7hIp>)(LGjQBy(|tE8k%^BUGs VA+M^*QFcm93hyL`-c63b_Y-a8$+G|e literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/MenuItem.class b/target/classes/src/java/view/menubar/MenuItem.class new file mode 100644 index 0000000000000000000000000000000000000000..ecbbe5a29f36ea7c34c1af0d709813a2fa440374 GIT binary patch literal 2439 zcmb7FTUQfT7~O|N2I2q`E)nIDB3KeA0l|6+P>~8^gV=)DqP-l#5k@96teFW&|3+Wx zf9OkHEnUlpKDKN1H+8k$XA&UcqV;9w%sJoL`@8J#o4@{f^E-fPSO#hYx_vL7c_DXX zX2(*ynSyePYtqXs@I4=>f`O<&n?8S;@pmm}BlFG-w`EZ6Y`TAt=YAY0OG zDe!2W6{wxC94nX-xIS>odFh7S4Kiv+IYDMRufcMbA1Ft8+0=?abjDp*F+_0QgaK0^ zGLTxShd`r=bEu7Rb-_e4;sQ;+3YM#UYCnxsUvEXbfi{8R>iF}FB#=(vXXYNy&m4U8 z?ZYbYG0v8$7obn3N5g5t6-~Ft1_mYXr=wtx-P2#EpaDlOb_k~NX)S;WH5B>Iv z`M~v(?(?Lsk!DJo_yD~;msNRPk+!uiFg|dyVDBo(s)p?|(T}SF&2oLcx?%#oWze_Q zv?*sf>S3|4ro3gjW-Ebs&dp1EMS7P0E^kJIO^d=x9?Qycky2%i)d33hydw~ShNVE} zw-)4fNM@kcz=%LsDB-i5uft^>|Cot!T&LbD8(>KVY?V_|nqtmcal^z-+!8QcZ{2dF z9qM>qqh(D@V3H?Vz3SyzC~So~-CA0Q^|*t(2BsS>{z6if^ckTdWZMHaeJ&1GUC z3~gJ}+iaKyR@vrcSWv;HOAW?PA_|DrIP)^A1y-foFvYPYx9H{7tfghsa4?OAH96C9 z*L4G*W!Wwf_%S@eR|dYMXpb^wIXmu_D$l4=@Uvucy*-_kRe>KXV=r5m0Pjm@-Bx~I z&ULqn+u4)eSL{?>T;AJOrz?wk+ ziABmNNJ=ZfWpDIzGCOYp-x2o&E(4 z%)rOj_Hp|-(*RjgXvbg$Q{s>*fhk-haG6Ov!Wmd*^2wz0+!3AB41c0IGWi;x48FlV zU?20HKZXA3+_uwWV3^l4STeH_f{EdX(<-e`$ z!1tt&YV_#TkY=AMv40-2cO7TH!Mit!bBjW`&DlH=vZqT3hwSZTcI|ViqBXSrf__Af p{AkqzTq1J~mhqVHMy{UHt7qZ!8+^yTIQJy-P}Ec_o@4V)$A5%6QkMV# literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$1.class b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0c90940d69c74a745f56ab9fd472800430a61c72 GIT binary patch literal 741 zcmbVKOG_L<5dLZ%cg$wu`;|nEh=L> zKfoU)sUGzbOb!mzv-_L+s;ckqZ+`jN9eKv!xaHt2WReN)|v3DbowRdueMj`3qM376UvJ{2$G zzbkd57a{hA-FNHy+#`Hw7teA(ihb-xvLtMl{&$Jc`f3NRl_=^|L&dCK6fyNCmB*q5T*)k_;5HV+5J#u&4lT~R;oTyPRIBznS>MV37?8b z@!yg<(u)xL#_p$e1MU-6yTyatcVZt~kt_+D<^NqGbiUi6t9VyO<_ixD?_;bX<#$X~ zTd&RW0f!UYPq9GQctkT9mhg%&Q#n?Fd!-$Q`*jiCcGvzfp!+*AiEQ7jU0Ewj?qx@1-Ro`;ll;yj(1a9sh8N&P8*aiEcN^RXi0xyS;#Cn370d3toth w;7yVEJNg^=t^v;79^L^XbQ&|F6U;WimzWcqU>=KD7Ox{`kxTqmL|T~t19z{t1^@s6 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory.class b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..ccfe7d27586921b5ea92f5e7238af8a5dcef4da2 GIT binary patch literal 1196 zcmbVLU2hUW6g|V&!WIgp2()U!wpNzbu4sJ1n2;uojZhyjO^8p!I;q<%yJmNw@xS;Z z^ohhqUwrdN8Sm^$tcFU$COdcUy>rjGbLQ@kpI^QK=%A$`#_%NYE%Sm;xH+-Kr8yGr zc*y$s&mqL%wUf;&eP33jZ}9I)b6t^(^k3ao<+{?_ff{vjc{w-6dLUGn6b}a4CA+ z9dl>aIm33txB+msr>$Y_uXFXKZ@cGdtTSXft|M$YR_-l2X@st!LVYgL=59+z85s?m z3|sT-XI<&oz#S#vU7~8d>Hd*DYOftd_@y+(M7YxISkm^~t{q6>3csyxA}f9F1`byV zQg(d~3d1U0?zKXO+5%)M8T})2eUZdO9$imo=#AyoAaE$none40_)i`<6Ji)$CR0O!lEtm-ISuNxCD42Z12HR!&7gy{fql&;rdj{Xn3V zIz@_BjXaYqBb#hak^W2{G3d0aG?2pzt=VV;*&KNptRhblRXjo>1l>t~MPU#x7W;!l zvDANgh4NsEYWE5ogXaDew|fVlXnO=*q#~d|AZw_gihI}$Y3c-(M+sY~QNBWSb;>b% zW7x(Htr_gzNPS;XKTy;LQSbkcdW%46M6gHDjfK<)A$1%N!vh?WU_gogKi8^;v+DQk_ds6wH>*^mf#m?pE(QhJ(0ful|8}t_)DYk0WlJH;fk}DYEMbGB$4)+}`x0DgJ z>jVtB6N=Eto`EP`rk~IysGbY|mFHJQnPDtl?1<)?MmCq(iQx)H3=A_^=fuv$RU{dV ziclI~ovM&Ip?YnQi{cu_4U92N9Zh9>GEiKqz}k3Opyo7%RJ&b)iR+l4PHhOk$|b|} zu`Fl#=VD0VmVuiLBS$l9R5f39eI{-r&CqA>60<}*Im7I6UYwb(iE7rwBBkUXt33|)>ai??J-=DpjB+pjnIn-*DO+g{DL#k!;Elx)|kZ}H!ZP3guH zC)T9xdVwP=n?mh+Wdrva7CPgg@i>)bCLUmsVbJykSEAXFc3Ot*<51~%ZG1Zq;AxD} zl@O`Tf~2v}yF3U)U|@+Mb+r1<4Pl73fuXtT*%EIDkpG^=4+U0?%oJ+kzig=j?) zBkct`&5^7%vFzj*nAxxB``EC#NP9Qg0GAM_-E5p=Bn^_pa2bhKgah&qlWros`~id6 z&oGmR82W_KL)>^5Vo9wzMCSdUpE`0FI&vHl+7ndQ5JgN7=Z70v#+#8^Stus%Vv6#F yFa`_L^qnC;dX0afiw#hadnAT1OVkwM4LK}79&VIPDy+~7Vg4`QoSb<8 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$2.class b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$2.class new file mode 100644 index 0000000000000000000000000000000000000000..38315440e12de689c7b9724c4f2340f37b809690 GIT binary patch literal 1494 zcmb7EO;Zy=5Pg#bmc#{OL=+5y5FrW5@+o2fMG7=k0j)y0Pc~z+xS6$fCqeH15l^1A z6stV=1NNhwr-;;^&Ry*>SUUccTSzrTG4u!e^QLJUiRZ(Do3&aJv5_N}Ur zwIcT$@4OP#z$$QAuJN+iqA%LB$!+EN2dP;D5r%l)hWBRPi7Wk)({m0>=8 z;nSI2hRC{C5>YU8n=sH7Lm0g#qKGqu(>kEH;7GAus}_a-f)`!EkSKUIcXzq(XuIi* zsEQLXz{el=7+b4v9(AQ#0=j2IYZm^uz+dooa5s=#{kGEdDpGE%K}1txA`l#n)L*>!>n z!}JN5^AhA@NMYQ-ZHB?)(3(~)SY4or38Wc%>OAJ?SUvMRw9cke*?40CECu|Yiegx0b zj4p*_ZRRBn{<_P9Km-Ps8B)i~Z{HDyXp0$|tgdYlsHa|_FhbKBrl$iep3p-}KeP}% zQN+l5iFWg3YfmgY`2}Y7D|$XQVlLC#Nio0}6119)eGFI7M;6h7{$_>)Iv*zAXn5rV z`mCJ%A#6NU~k_AbPd+H;7^`#(Q*<}h^T1R}JKQ(Y63ahz12X`qZ8Won{OPTa*5 z;e;>@3)A$Tp>y;<{)G+}rzEpvhA>Ch09gxI!~@zT$afPttUMZMlua(I(i6hMUuUD8 AtpET3 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory.class b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..43e17fa0c191a76f09e595440803b625f8b7b37f GIT binary patch literal 1427 zcmbtUZBG+H5Pp`nTqzasco75(7S!@mP7q>DjR{sUBuD*FL(=$Zdv3~+>t3?A1^rk0 ziA175z#nCty`w=)sj>Fbo!i-YdFGkf`|Wed{Eo7(3 zRV)v*Xh)9AWvjzm;*d^^W}kaHRG%!Q875-KfGnK1%@g5ihT-SF^z{pdRB82yAzckW zh#XQF$s>bdhH=-IqSk3Qg?h)Efnc!R(Br`oSH9U_D%1Mdj~Jf01H!8?OnFLhE#3&# z=CX^Pp@nj;Gf429nLyF}$MkAg|E$go>_?_PB}DXx-e_?dRZ zsgT;)^RypI*N?Q2hBIouZ6?Fa&J~voTYbpvO+Q0kD=wpen+!A+lRe-tjL~5JhJa!5 zFA&M4^~Z25^#K=mnqfK_tJks>_|b8ft}NCVvWe0(dxJWEX<}jXKf1l0Lm6{)Z^ZS4 z47qyPQJ&cM%_Umsj%^pv@(8~~Vw3=gJ9HX@669baBXg7i}(kIRzk){V&$$Y~^BW2t5M%tdL zyBC;gP`ug03(PmxH_madR{l(ONo+gzu_?+VX0d=G3UQvbBo>x%pKQl5O()BgX_hjt z-~o9T>HiRq%!dZ08&Rwp6zc{>*`RRxp(s+6Wy-KYu{Zw##p4)7ifA=eZQ}_^o8D$f PnqN5)*daL_>&w3YL9lSK literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menus/HelpMenuFactory$1.class b/target/classes/src/java/view/menubar/menus/HelpMenuFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..aa30a744ee8f83417f81a963ff1349d63329b54c GIT binary patch literal 703 zcmb7COHUL*5dLZzc5oR%0a+h_95^f*>3HyjAt3|;$$%yr?!B`mG@0!--MvfrS)52b z_yhb=#_9ns1Wf3p-jDvOy8rzB^&7x8R&ulmAA+ycnI3C3HhivzY)5_V8yVC-*FO)% zv!|=*{KeYG92wzRlU{3kqQ3OcxQaR2gyqJo&!gfo+o-myXq+ugh-}#t+MkUzaf>j~ zTR$dbJ8r-oOklb|jw!-yX)GU&hJE(mb-!l9TKHlS7WD zZjj?8;r$~9DDWC@2s4#u9r^YW!b)%bfjy*Glc9?PE6d-hbqFk5n>ykU_g#osg*=4N zqzkUW7{PefB9N#x|aD|9ZKa3Q?iIOp+H^x`@JGnf@iJ_Mc%PsN{vQaid^*lh|I luY)&*sdNtW!ZR#1g)guuGD8=yuq0YXVhKw+%R()5{{hWUs7?R? literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menus/HelpMenuFactory.class b/target/classes/src/java/view/menubar/menus/HelpMenuFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..035786b0184dd4fd6e5555ffea911935a7c0088e GIT binary patch literal 1131 zcmb7DZBNrs6n-w-=vF4fZEi9qZ=!DFrQqaKjmbhnKni}CnOXdFSFTXfwWhrr`UCtw z`bCUHe}F&Acy6}^O$LT0y{G5g^YWbMoc{X#{U?A1wlz#JtcHPYobf(4`i?j^y29&q zco50Z*c0yiL$d60Tl&FA4RMB<$l2xIiSep)CTz(t`P}gw`GO%o|QTosrm#0q1ux{M~lF2Y_2ZBp6!pbmTsa}&p z^_t|%RVF$WfYE)CHao-`V^bbQZpLMc2EnAMh!1uSV;WT=lXqXxMzMfYlmN*fL` zjb%J!$Pbu1TtX^YR z9aPh(DImE4kVePv$x$FfS_a$;U9MWEy~vH>iKb7h`4=?|3;*GcA$dAnYliYoi^8Bc z{a#>;T}SO~ezajj5;xS;2<5&O)Jf`eS0JgLXY|IE{s)POBbERF literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/menubar/menus/LanguageMenuFactory$1.class b/target/classes/src/java/view/menubar/menus/LanguageMenuFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..a42334120f6ad704eea2fca5060e53254710ef35 GIT binary patch literal 772 zcmb7CQBM;=5dO9ty;@JJMJXx>4?Gkf+z`W4jY(}FnjB!F>HGFNlqJ{QWOrNQ&+^HH z2YvuQ$~b$)#26&$B{Q=-GvCcOGkf#v>KZ^FuT#_n_Ps0Qg_ApbU{T(Q5V>%yy`MYnv)5#Uj%JUu6-awPN4o? z8y!9ftaSH=0?ELRsfiUl%#flX(8{%;li74c?wcBwB+$-np~|6hI^J)cNjTSD;9b5n z_a4{aKA6-Oa%a{}X)Lha&F|!W7<=eNqJo)h-j^iM{Ay>epd%ewZ`?7sx3LD7KQu*Y zy*86$3g>p5VnaYK*+_<$c*Vmh9H~Hm7ZW(`{%0(4i652wlRdB|I9rzFdVBXEcw*US z!`mB_%6sCmH%`chPu2(QfH%pq%I~Sh!aL;K13pQ%g6-;?pJ@K5!Wrv&_?6_)x}kx->v67!ula&dizf^PO|P>F+;3egRm+s)Y^#C)S>GAP=Q;=&K{AuEIuD z>ZXhxSBABQtf?*1Zb;8W`jdsUK!4LApj&6BdZ0Wb(DmF8ee*&fRhZosNUukG%0>#^ zS#+XHpwIO~wcV&!m3}L$ffC5Mktc&)seL}5D${1)j|G<9Yr-l~JWnfW)OpMTJB3Rk zaY-+wZdtEKq0vzgC|#Pp!lPv2_J#7xM*Cqcg8>1n{6R}^Uu7^PkZA?BFhb>AvznP@ z8^h?fkQd0e_htMx#xTMCy(6$vc<-J~C4p5+H1fze>QIHoS@Vn^g{~hP6>_D!Hl{Fb z;jX}H`!vjlO{3};xxkuJK4ftZ_XP%%=D$|DEoJ^u0$uMH?64xoc}^sH&M=;V+TBs+`8$b4;H+qCjE z(1#vcvxx!8TXgD1FXaw@xrtnVUbx`1V5a zJ0`zj<{fVe&CM5b>;NarQ#v3=VFxfm44EcP5#xA*i6($zk_2;@C%ZnP&jJ<+!U!e_ h{}M%+#voPrm?}(>7sq{y6_Pet4U^>0Gy0|Z{1@qGbGrZl literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$1.class b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$1.class new file mode 100644 index 0000000000000000000000000000000000000000..76ccac451de2470350c0296e3335f462cfb3b402 GIT binary patch literal 1531 zcmbtU?M@Rx6g^Wa3uP?@kphCCVrdJqp!iuupnzh^M^e(npUZZji`$)McPR1_K7emw zB49M}0sQX|W1{gvG~U@RNlDN@G@0$}oxA7Ud*|Hy<-XH28hlwzkD)Ng}( z+rq2zGQ)7XaAt{@RJn7Rl7>EpKIQV-@b_)Hofpft!}Ap(eD1|CfI$sc7*fqH+vH(2 zJPhSsJfQokmPj2shH#akYlq9z2MpPCCJ5z(=ieYXMLVM78m^OW24+VMWK(_eqFNJfP?r_; z(YTHY6+$P4P~?=d$r~xln7lH^5#5G_6;wW-ZiutSI(8D~OGu|Ev)*sVYiETyiZ(_*AG> zE-Rv}V^K9$%JR4=d1K_9N;QmgVNXg$uCLH^^74-9`<$AqZH@b+B41*J8n%Vj1+YXy z^(_s$2(5O+$l5`>8G2WiSa$pndiEIccY#kAJzL2K_=;|N>cKvSOX#6DhRf&;5#A6( zlx$<4kbL<8{YMx+#*Nhpc7)XI&|7q6-$S1`LiPx^4sl1pw?M)7Qdqz@#POX#f1nRP zk;1QlF57?%=?EMT@rVfH=tmBZDdZkHdxBZQdP*oXnSLXsAxV=8b7Y9nKwqH$C}o(( Q675vRDj)S*rWL`=Uj|R0+W-In literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$2.class b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$2.class new file mode 100644 index 0000000000000000000000000000000000000000..64d614d59bb061e1a8744ca3da2c895f129fff3e GIT binary patch literal 906 zcmbtSQBM;=5dNk;d$gXm7DUkkYWh$y@d(i;3=tZPCMS|Wc;8+}SaR%|y>0njJ`fTg z`~m(b{J z_ow!R-IU#NK<9$}ofr|JQ)MWWIZwZgE`=GRL0GR)b?sB0vhnGD?zJ_UEcf)=6B5Qt94gACTtF}xg$OdH?qav>U{W&8B>LWasGs0R$e1fN< UBlNH#?S>Mv4AJ3xE>c7959LPgUH||9 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.class b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..0a809f06055ab1ee9252cbe32dc601d475f8b168 GIT binary patch literal 6361 zcmbtY33OD|8U9`-$t07T5JOm_NLZ5zBoGiI2}lwFg9${E#s;hHWb#Y~hnYC@l0ekiU?5O65Yh*$`T`L>9ItAOMk0F9Xpgq(u>n2S zDxopsry>^VuCzt6@^y1k$L-j5Z@0(^rMU zdTYSw<>AdH`fz|}w;3@)pm^b?Kq%6p$K!z>y*bdOhcy(NatV~?C?yL*ef8blF^bx9 zxqZ=?F}f!0RD1Z`wBgo3JU$qWb=%VuLVX>2EFOwR)(5&n(T0A*h(_WXO0Gqn4x^W;7kl~cO%vxx0ExA$1$59v@B|Y(J&!(V{4eZI(88i zH}*!OBs;n)r!E){MMB1M4W6>{4h@-&(QZ8#8qQV7Lbir+&7p|CwtrKX9%~PDg=zev z=4dbw?g+#}^4}iJt~0ms!GltT^D!j{Gc`bVnyuhPj`Zd#4)~;3u8?Q-DioB}o3D^> z^{NyKtlmO}aVV4(ixkd5k@PN57;p71R4BH37b#4@M47Esn1qQw_LeCu#}v9wFs26# zy)n9}FB;J!MqDOWCpUd}A#acxE*cx_9d z&s3WXUaHU}Kqgu!ThiQIL@rZk7LgK5q^Z@#8AWcb!a9*F9+h*(fe2i#uwDcvrwJt7 zN`%@KJ|#lqETPuX;E}m26h19;$UTvgAB#N&A@4NNgTd=oZP+lS!r^zDA)(q-{p_HED&17a`ikyo>^aM%C(AsJkK1 z(;V0m?KgbrMX3M_D{MkULvCE>B_mTbRGAr!RkF$&YY9Ynam8xOJ7i6t!gc1MbUrtO z#}y2jpUnA_T6;iYP=wAgh0;yEMd9-@JHa`d!u$q>8%07V9MiR4?5CRufzd~_6;-Qa(f&RkhDF~8>Elj`HI65!4+kW| zhH*$xAJ%Zbg?Dtf`Ytg`(6FC$5?KfEhQhb-ZQkEhLz^BZe4R`)%Qgs!sjiQ46OV=| zCYjOA9Z*T+JN7j&I=jZM1CzB}d7(P4=3=U247pWKNd98MjFo!@|5(pQsD4@YhvabYYa1`)8)y& zR*xGky5uu)EM!o4m^(A?kZgy&49Qi@mYIs#GEXsEW+`SXvLeR}#cY|Mm@Tstvt@2# zw#-b-mU)TUGAm(Q!rdoh3eTO&f3w-jFH3s`C41S)z(=lgcmEJgF+BS|C-mREworB2|r4OZ~&BW4SnaZi7i>E;0$# zN0{SyYB7OMA?#^57c*IxVLIlc6xEo43o#3IBvH@Nl_+N-<2NxY3n3azmFA)mm)Pi6 z621J2Uq;Ch+>ezc&;NTk?lJinm`0h;)s;lFAfbm!gXPOC z_aw0`p<{wt&BJB1MGMp3wM=f;(HfW2Bi7R%?U>7KtpXjW!WCGAPBPixz*m#N$0XCn zx75a`h;KXb?WFf4&-9rVx{7CB?bt^p_F>{;@3WnuBG#-M!7gs|)#i%Aq9NQ@;Tgh% zQaw^JZU~P{^^J-VJk#m%6#6{-v3m&5`~CYcr(zg;lIPChs{xqf<)Dk96(rYg>R+cn zTtiRmp}+OgG9eSwMC)7|Qw|nmABKo3L-J%B-2=3!plcezFwwo*?9V!c0}>DWu)s5d z0~{P_lRufGe=5wW>S4TQ_A;es4P_4F^(538<_!^M9iglA5#n`p{5WA4beaKN%EU}U z*MixUfLV_>@sG^4%jUT*ees-<=ce~+r@{Z>u&qS6ePlr@4=| z9CFZ1+LEtC_D-kt*+LhmO*Q6XH=eJO=K=CONS-4+=`~_F#QXg)efD+w>>CcAZa&Mm z?vopHUOLM+Y0S4AER)9MyPdty4%=gwxp{1%i_4~k<~%o=M@aK1X}&|6$9UAc1o0ke z9_OR$eO^Q#IA|_Q`0NDg_G?NDAi}o4O%pDu9X*4U{X#SNn|3;dBC(VEGsDBc~zew}n zr1>Ax{O@UK^2?14&l#_un0N0FnZ2eF<>j2O@rwZOXe;MT#w$M+*gKs%UVUSUrpD_M z7oJ)saU`C&Q^XWtOh@4n{AGt_&-)*etZA` literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.class b/target/classes/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..e6db61c4020fd98065f266b0b3dbbaf1a05b487f GIT binary patch literal 1765 zcmbtUT~ixX7=8{3glrcC8Y~}zqODCrLTK%mhL#p6H8fB(H5#4i%qCgWt;;U6yD8M^ zl{ematG`37Br|5lTOEIt<8w~dB+}k>cV^Ey@B6%8&wJke`=8(c0B{Fi#V{mr+xKd@ zC&p7F_tY|va)*Xv+J0`+bsV!6SgzwgG^)0_FU7Bx#t;>lk{*t8{*mQ0aytqwFlsq| zU^q2XV59iDVe$eKwSHD%h(z(_z(i_(&2w#Af&^y&k16$31dguNY|F8NTLO_}sw@!Q zbn9ju0&nOT#t7G<<(PZTgR1E%CRl6Htr>RN@GQwpC>&W+ZZt%Y&@lyFqmMUroP*AE zs!hwThbc#c$CfW6%;|_>G={eXrU$FoaF2_|Gq)LNn8%`Y_O`%GQdN;Njsn?+z+hHh zzK|-*h)X)&#d`vA-we8@0`mg~UD>YT7!4Yw$}wCx-Lj%lHSJMc6wu42SGAma(`lHF zhVw|t6w*vG^k^IGaVhZFYUL{Zv~6q_sp+N&ok>K>sxkwFjUWr z%5{xRk-4e>_dKhdCZp`?*uw+fI-_0}NWGGqZpRhf52{Z%jx2#*ZP_Y; zQ&(R#P!5Sw4`eH_(7!ri$pdPdO!uc{Kp}9ZVFrcX2yZ1*uRp}H^n}1zDKKi^>>7vR z^k^lw>DA0_%VziHn8eFJpB322cesY{iTnXK@FQnY zl9}#S9I}xlejlHZk4MCOiV}%_PTn4J7a?b#(SNs3cd3z2;#Z9SiLnj@Yx|r%qdx!u literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel$1.class b/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel$1.class new file mode 100644 index 0000000000000000000000000000000000000000..94b27607c05056c828c23f828539159ca7e1a1fd GIT binary patch literal 909 zcmb_aUr!T35dTek_UL)q0t%u)9j8?0Ec-CJ;KIjf5mswd-S~_rY<#v?cx_FtooB-p zq2u*ab`7CPLm58sk(f$qLXfT_QFHQ;3(2ltc!h;ks<`Oi~Nzq1^&>RGVPOc3f zUtf;6`lLoB6Bcq?sPa@*I_Og{3hfdOXHr>zN80VEdZH&>eYVvlj|ppo{LZ28hXw40 zVoA#D{m+Pye6-h9!3R3DvU1njw?Y!hzi*1tI=Pki?9c5u#wy|6EOtpqkBl72uvE^m zOl|I%oj80oaNj5gWBHj3ghhJ)&dEqUw0T!_! zJgwzKv`3;59%E@5;g#qi0{!c_Tstn^K29Bj>oT4QkFZiZKE*TnN9du0=OTr|LfY`H I2{q9B4Q=A_1poj5 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.class b/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..f529e1b7190449c2554f00e6ce3371fe7d7e58bc GIT binary patch literal 1418 zcmb_cTTc@~6#k|yv|X0l77(!9skQ}K5$^>OsG^vHCXgmP4%?wFmR+(t1^o&B8?TVq z#8(r4l<~}Nt;P7*O*)rz{k}8j^yjZ{-vMl3J&p*&6W_DUV}8cXGh3XSr`!=W-z>V0 z^xRs_cB-$G#N6b*2v2RQmN1SOgQ23lHT`pPGG7G73<=xuC3h^ruvO|rsscm5b0i7H zkzL)aOX)fc!=)>^LorzjLFom2>2ceUzJ|px@@*ZN`+^Ae>Fag{1=QjkUk*A-x~d5lq~%l*c)lk literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/ControllingPanel.class b/target/classes/src/java/view/panels/ControllingPanel/ControllingPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..d11327699e2877bda4d375af6ea5bcd1b3e1ebb0 GIT binary patch literal 625 zcmbVJO-sW-6r64P8B-f;Yen%Wv>ps1h-eX{C@58gO2OkcE_F2~B}rR*&G zCB9ul1-&(}+4qK-d9%BpU$5@~4zZj=ieV=TUFVjMxHFPs>C$i+A21m8MwcPo3a&)~409GT z$TF1L(ii8$`<@6ddC#M9<#yn5uggQJ`UK22wT%e_wuO1*$tu2)5gGMGd@{|tS8vRk z)}&N6L$MQc_wI}jlF4Q#7>2GmmMUBI?~QJ%yTcYq4SEd*Q=N(`19{|VF%+mCPgYTp&Qhj{=1 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.class b/target/classes/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..7af58d5d3d2942e2afe0765ad7414cdfb7907696 GIT binary patch literal 491 zcmbVJO-lnY5PfO2scY3%@Zi}V>c!mkpi)0r5G|~FEolffB_xt$xBfN{{s4cJn2jx{ zh=`X=X5M_fdGq@A`~u(<+Y}9gGw%eO@rtub$vJ!EMrzN7)&ys@R%SY?BP<_(4~>ht z3gRKb6e|SX)J1bMWjB+V6oFvJr<_|maU2~O$O>CJAup7c1be@)a8R=+=;X#oH`LsF=_xh| z4*ySrqD#>KOMR5;$2D36QLT6`pcy4zMGLjmbYa_Ai%0`mde_m3Hj5P-*h24Q_Z?;O Blz{*M literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.class new file mode 100644 index 0000000000000000000000000000000000000000..467c94c76514572fece4aee7063761e4b7b4056d GIT binary patch literal 1250 zcmb_b+fLg+5IswP1lN!d2$ymR&_XUPxEI| zJ`6IMdBMT{X{bUc1gub%Qi70Zw;`j+XQn1LgUZ#xG!6^w=mk~$L5Vi+ehDTPL8 z6FMd_#Sjg-IO11=A(btv!d;W}D2sq(*~p#9*!wzWFv~D%+IFuPOYK|#lZzmtm?w@M zQQtUK?uDeNhB+)qYKsg5*+QX}?17GlSY}8Nu~NX#co1;A?0h1%C%bZWP$&VFB`%zh z;odnHg-&zcWpj7j9w|nWI#Cv;^2kn(8k1>8DzWN!lPSM?$h zsYvZ(rG8Y^*-aXvNPS}^dw0gOXU?1%|Nis+2Y_w7ilUEUKMXA6z1c90hQlw7n(1*j zGX-!rR@`?2LNlp5PSF~VVuyU6dIvT z=$OP5Lp0>#h+heYRJN!JcTLixECP~cBX=TW@9UVsEW@a2+r45ewQv1TE`o?+o;Y?y zedAQQ7m}hH=CB~CEiw#b3x!s)2Ra^NnIS>MN&!FPLBQ>@^NG}+?8?x+L|K^DhkdiwmO5^#2`Ta5%nz#EW=MB2?H;0CIZ#THHHOTs z+{a#6uhslOaQm>v15*y%?v=%B@({xlhLvN_sn%Rh+ELI#m5U4CUdZ%h&S+T0GpQ-H zmXTz$t)BLFr^SOoEBp1p;(Lxuv8mqQWK9ypA{8B>XMi3}jv)P({q!CpizFv&nRdAb z*f;23=+K7|dJigh9C785UYf%8m5PD`()lJv^U1Mmr1JS|Oy_SfS4r3jyNUEQmTti& z=mIcGnUe%EMxf)EM@oU~Dp49MirWw}$hOn$Qc}6bze4|o;Ty0@6FFi@_Gj`(6wwjd zfhi(9O%!K3g!3wbB?#;h9=9R4C|H7OH(0GCjV7M{B&)mPMFlX?ifWUhcs$1o!eDr* H;@AHIbg3)4 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.class new file mode 100644 index 0000000000000000000000000000000000000000..692b52b6e80628e29817e2ba28a1f3fb899e6344 GIT binary patch literal 1250 zcmb_b+fLg+5IswP1lKen5H95spoLsoaPNHpAyEoas&J_SNO@fB1>8DzWN(1>t9p@$ zRHXK?Qa`Hd>?REnQr}p~-ktI6nKNg`zyEyy0bm`k;^<-6jzZgd&(FAZ=8AKx&VAuU z)<)pVFz`IrKiN|rYiDbpA9+IUTfF9aA6xE{FJ#Mp-HE!^&`oBTQKaFZw0iZS25^*^}?B90m2*b()O zTN8dniW->4tfDr@(3dZjTFLI4cz^|l6cO7C#jyxO;Z)pDr1n@>t_}(%pt9tt8!_BD z5wg^2&bxf!mfNGmNK+>&lG`7)dA%)llIscC6X9_X)`Y{5?PA(JM4M`$v?R+6xof!( z{HRf{2cZb})4-X{-N>9Xu!N^dQ)(?E z$);L8z1f`>4+f(WG(uZ!xgN!4ZvH0AiXi5w=omeH^cZRc>9_2q_W)TWIav#|tJTN8 z!Tdsp9^9pOzjh~))E?!fDQsV#2 F%fA|4EinK9 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..a05529b5ac0e6a6e1415df925fb2f00b260db710 GIT binary patch literal 2672 zcmb_dZBtW66n-`V0`US7C0Yd=tuG`&;|sn(C{{o$8WhE%^u>0QEXl>oz4Yb=qCP0$uOh4eANp|<_*>j%f>^W!u`sepQ06f5E1R;SZ6~B;K zlbbTLX{)WwhIExv$;^0e;Cqf^yQM`f$vmBVDf5ofJy~FI>|jbDJd#`%=$P?}ss{qcEp(zwpg%{SPpj*B<(tqk zGC8jxon`6UI+P7z*Q7BMMHq1lC(#$d>GmKR7Tq`_kbfmr*->s{$ySLXe+CstS*?sF zipu8}4J$|MWD-wQ5SYmeRZ>pVVMrqxW{gHm zkTQd*oJ-dF0#0X<5q2ZLbt^GwcSfrNA8A&9z>(Kh1(H~9ht~tYqDx0cLa_Oz0IzHe$T=&4SfQW z5wKK_cn6EEMWvyC`eC5A6sv)L--4x~3p}tety3$;)M~Ej3Trqh+m#3&GC$jMnhlX% zM%r$`9GpeGhku`2n8#y*&Jy$foq(9v(wv2b1L?MwJhQN=>UHi8vazyT5_rqbSD<11aBUsHKxo}VtrS-i3EExw}@wnM71 z57kRoS6KaIR}O6wGyodX;$ECE z5-sH$(>U@2I?V1wY8Qj4J)Bw@_-GerYdFV6Vr3T>cJN7R2Uk+RAyvb54mWGK%VE5R zDQ+>9{Y`NChE`j_b^JfLJ%q_- zaA9;0B~I)etc?=y^&Px@r6+gyCsTTo8g1nT#R!eB|uBB4@gNKuy_U`wP}&4462ki6_1O%3JbO~?_ zk@{MxA6512#?bTwuw?Jw+@uG|ZVUVSve=078f2riezYwvEGQXe1 zI!&TT#iMry@elXji{nV%j#>XisQABMb5I#YLd%F=`Pqau{I_;1p`zkUi#U{o55Ya0 zyv;}Kglt>sU4ql;4hhA6@<~=fSoE-f5}^^OSRRhgk7a6$Vy{6GifAZOWs1zf(vFpJ z;h^cEj!GFVLVLcfSIJc%J||=CVhPJ;Q=72X32dHXqHT^GluWnxyF-^fta@0(Lqau^ zdPXIz&k<(Wfr!P3N!GqTQ5l;bNxgp;-p5Y&Ug9$rn}pgxi}36~T;x%>gJhhBa!*Cv zxYhhF%r$(|6pSqO zW+6jr^`>a_Zm@LJD^Bs?8Y}={oBc>WhgUC5{a literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..453a8647e1d1c69a657e6a9af39ef2b8fc937849 GIT binary patch literal 840 zcmcIi%TC)s6g@W%dAQDll%%|A7f4AKwYmmXYN1F}2DPM(#BwmB;MTQ~Jt6e3`j8r_ zNZnTAqY!r{hQJ<1vS;SZoO92;cP_8~{sZs^FN(+!KBkH9ei3KFJqzT>Jr$7*Q+F$l zR1$|_5Dh+P#NFTdB#uIPGp7f`P~JP4B1Pm04J~=@rXyBx-kNG2vBcIw5x2>T)lbb=XJ*fcUW zEYuxTQ7WQAXx>fgZG7&D@9|LCn8lpF)FjNeJyT0DQl^H2qa_==oxaT;o;jGu0->Br zHK7ug?hq!}o`}SNNyff92~svckZSj~bf4RuM<|{)SSM6^O88&*#A#LtyB7}=U+x4U zH?5Vuf@!Z`>TL0fxfZ`Ef~~8}D+?tQ`Qv1Hx6ZR3GxQtwPhRBU@V{VS2Ni>8lnb3v zwpmD%8r?B!-3!bfcJpIA{e#w&Uo}Ci$fL$BXc!%5!os4lQN|LMGsSnTugBak*#A+v l03D98!iISNgK^7vnrJqe-9nw)b>nT-+@Ly(t?@F4=hr^4#*_d6 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..3bdc190a408e5df7b7600e351b38b50bad4a341c GIT binary patch literal 1725 zcmcIk*>V#{6g@2ok0p~v`q}>j&T(j z_54Ulzv~Ko+jk*0wuAd8}nNfb23v<(ZR1+GdqPGeReAGylh zhyu8Yg&6C(YW1)!zN=KrOd0hEMUih0oZqraXtOVB-tu_Vkn+N)?36EK~BzXEm`m#;}MlEwF#hsKw1R zJhkx^Zn8GMyQA2RLxgngEG!F58en6N6>8L5Hdb(3z)&?}Ydb_AgvyFv0&3W1hrGW6@TQYjS0qz!}=>wLP4wi9aw^6T6tH?c>bD zJ=e^7fe`=`$a0s67`f;NFn>U_OO=Q!w0+gxc)a5>d*0sK>H_*UwMwEz+YHemKI8Wk3L}&{>$X0|(q>qzih$EYwGCOJXU$syh zQ1A!%qr^M2p+@k@eHiZCd+xbs&fTBCzWo5Oi*A4t!}HvX_$P59_=%Epek?MX=KMfs z%4(ys$vcWpD4`K!F=(|rQGRK)#?09}vZ zsi5{l>xT7v1BS}J9?KAAG$I6u7|Pw=Aiz39>mQ6E*0AA#SLz^15vr&KxJLB;QDScS zo;G7?67faPY={;bAtA3vxPhAt^<3Jb#L!+Ua!p0gx%)C%u^&~=@FMxIt&qFH zROUHJcKqIeRd?yN6KRW0kOSR9>*WS7R}>!VnHkB~%IOUK?w>g_JRlRw^z$&3oX-@M zC?@aetkX@QLK&bFFA&Dxv39hxK=Ug$DQ+Dtuyuj$I6lYb1#W#f^X+%(+$J)hLCq01 zu#PsGcudhfU-N{xPs82U!9zTvaf}e1ANp1r&`YXd8;9_QOkZ4I{%$Ix_+3ri=C* zSKV~eZo25g(?vJ-131T=qs#X6Z}flEK6esvL{1khGIQsB-}`<&&->=@f1f-BFotCV z5rIpdTgu#*OER-$s^v^o+RE}W1;;jh$2INBEiK55S<+qHd^8Xf=+Ji`WV~hCX08V& z0afsy?717rnuN*&p2`t8cU9*ssj8b$)$fj(37O)HZ(?FCiNo1RaLwxU_F zrC)QI(akN5wwY&kl-}cB$#pDCCn?bLYL3MXl}>cTWM4-GqN((ZKy1P(t2ms`<&uE_q6F7v! zEZtLnu)WwjzhI09M|fkE^ec$3M8TYmi|ba9-;d7b1iZMF_RqtSaSfnC^b;O%D2 zj85jVxu|T8HVrkR`Hf@lA3sffqb*MK2hhENBv%w)X zuk3v}^dW`7uA(nX3k6wima(&<{M^Pm98IOSS3|G?vzlb(1X{2|H@}msr|8t&lA1Ji z8`}du2bQNb?yPIvaeU8rWwoIEd8bUw@53^%AkY^uBN#=~UUC*xb0S#`XLnMTxc^u5 zP%jGn5FX5?b;IE`X_qbK_2nIBp;pa?0B_EBNb<_X>6NP5!u(Fi{sm=1qNa-pX<0?n zSK0O*Fk4Y2b*Gi*9~ADt8B^QWOv(sE+34E z4}JhYlws!RlOge`m+aik?EIhK{`vdsH-KZT$7l$A@vg|OYjs#T4w)J$6Da7=tK(AM2IT}=p|5@C zHC51?LJ3Ed;H{=6-U)o`P9?+kg+P?sQq4l(af(N1C1_$UMT{o`%`O|v^SI82gG=Q; z%gag$EcR?6s|)Eg%M)e9!w~p7jY2#7G>mk>!_O;S+^AAutJ|~gDjUBkveFLj_rqH! zn-kvE5!WuL+KvC%2_)xs=nC~-b93tt0j0*o9)p4Aabk+fdIHv|3VmC~SQ9v(0syGx zkAzv5SJHb$vz<9pK76n~V3YRMq$eQSZC)C24LUJqNIy&50m-aMc6NUd`HA#S literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.class b/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..84c8925b61fa8101d815c313f09c417ea9893a1a GIT binary patch literal 4116 zcmcIn`&%2w6+Hto0Vn!elrr(e(P3baVJ`;+-Tw6imJ?%aFsx%bY#{@<5g z0Wg67gi#|f>Dal%vVK`lTsGu-VpTU~-bsvFrr}z)VJ?oViA2gWO__5I%XBh^DN{?j z?Ou1%6AvRK5LHUAB%F0BNu2ZM1?mmcadk5%1s=-Wf|HX1b*By5{(wMjylYw@l(Ob! z1hr_?5Jr6j0(&*=Lld7lTk5VH(p}w=u0VUdD`VMCeE zx&e2fEsQ$__IV-I*Hx7AmaX9~+%2$YeaUc%eRF2_GF^+IL&G7wfv^yaK|ObA(YDsi zd4b#FmC{|)VH_z%IHArMGFGJNkR1^mMyE3NjXW%#PIpZ!&0QM0(Zge@dEAx@(zfON zq;Zv&+#XQAqa~@f3G`_=h6Dqt&(npO?9>l03z?eX5DG+&`B~Ectw-vSwK;0RZSoNpGClrq-RYD96sikIrsqReu z_8_)BX!8eQyhGqfxh7Ov!<^3hxl{!3{)H$AayW?3U zDbN`Rcja=~m}ET`iOTHSqHQcJ$PUBo7?@i+)^T;s?wFN^TMvT;*&khEGuRevzzVD| z%w0bFtXj=mZepB27Z?T8)m019u!?ta`}FX{R5~?~*=^p9_p!=3SPO%tzO9U{FP~D3 z9MN-ZdK(%pW1XemFYzjez(1=yb+7r3Wvzb|1+b6(og_B*6P zXuzDGT+&zNL}?|0YiLvr>3tgBubNNo#PE=s{Gf&p;lpfEEI2+>$92P`C9!zAT+O{X zax{#OaAl`m4eE}OBh1z%HuWd*F_noQC#m8is%&1vCpCNuPqF^(DEEa0_6N25lT;tU zXYjc&J}Yo%rHdZ*d=NBz9$#S9pweyk1QONFcsD9(SFUV}myY_9hA-o37Gr8E_t=vE z!A867zOwJD8oq|F3mjC(v((75wlSY4kwg$U zy6aNqlgBmOyiE8KQ)`U)H8(dsw{j_`y$p8krtRB61geo9_(JwL;E zg^g#2%p;b`n)n-b29*a35xk7wDMJ6gd@l-?75_R_#2=N+pI9t!Sd7%2OeyzRw}IC* z{28zNPI-2Cd;gEE+)I#E5(oru1=SUTinoa`aH1+6+iN#26}$vQCapC)Cr1o*Rk{0m zpBvtF;h4fsKuhy;#7^aP$C13gG>%Ef9hK^`yy5Z|mVBhADqEy)!oz z!;C*S6T>V=MO>sAkBs&b#7BFT9YI9yV-W7=7t<-U(ceyb+D~6k(aS-4c$U8kkq+O8 z5+V_<<}gna2N|~0kknYCzPfy)#WA9?hr6DLE<~52%RQUOheEY4!XE7{;L2DL*J#ia zr$Viv+D*K-fDdp`#FN>*Tli=JpXh5174T_4$Y1Q^_$wTLqkwO#@%Q}k52)$cP5i8Y zU-TAH%tn`scsU#Wb*MSIh2L)B4+Xp$@O6$6121|tNHezQi2Zq5o}urfXv7#aT) z+ky!kz!X{W5cx2TlbE4@Sw{Hn+h{~ur~3Oh|3m8ie+BS*DgXcg literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/MonitoringPanel/MonitoringPanel.class b/target/classes/src/java/view/panels/MonitoringPanel/MonitoringPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..c974876d40745241262d14dd88f03e68bc6a405f GIT binary patch literal 1879 zcmbVNYflqF6g@*17Sil`LvQNW-DjVQ(sei+JHSKD2(yS$=5%13-e z62F@Gql{;ED+MgEag)y6Id|@zd(X_h{rT(LcL29Br=vk&-1iFRE4d-f4cpo@*Q8^W zd~?Bd?7;PGr}$6-2iH0@fevN0W%`@kW!?+-2{hY|A4sQQ2~6bw$90xIrV1sS=T8g7 zQt4#@E$6OUEf6>oM!T>+b>LN^9tNW^gz z%{n>+l3})TGcfOZ_Uav3%*$#v+t72ABla6B;BfJ*5y2{laQgUv2&2=m% z$VNn!Bp=0tl~-0FAVmg7Vd}UbuvAx4B+sFxO%Byf=Uz%LFl&Kf;wsyV0#EDBua=|3 zy)*Gk7}s%G;89({FKzpQRi1ZVxL#SR9HQH)4XfC%2rSnddu=afZJ427#dRIm1a8#~ zeGe01$wZOXL{*@Z0yBpNTGMDRtJMQo;#%<1_5~7Byng^EEMTbSMk$77==`w-adnon`WnSY81E@GAkMKVggen1A_`@Hi%dk4E*goy z9sYv0;T^O;`+{Si(Yb?eO1=4!*eCR<;pFgFoF4g%R7JCp(WuE(G?`3QvpA}3MyXad zW205gq}HP;t8i4xi5`vGYNU%e##oZj(1kYiaO_1t`q=dPk;VWCIEe`iB12O)SR^UKW;1I!ysrNz*2^%;LJ?*b1f)4A78Jk;DuYn_9VV zS_~{B;aL@$ggeTl=R_j+RNTKrPW^ar)fZX5D=J-hNO;p?6Kx(-Fo(yoTu&GVTEZ)w z?38z;GfA?%W=h2(o>K34iP{lwyI|U^9-4+QoK&+#?%CJ72cqcES%#jhZivlVbyry1 ze78dNj%3XuuN1hY%XJI%Is3Xz?WstuZRKDX{nh$b3);5HjKQ*SGMA1o#Nz+M^8u>C znu-o|%4!73p?Qb=nd65o{Yu`fSw*p?%Ns`j{E}y7+c8N5UixofP$VDCJoKY?Lr8#D z?+NwLcQes|k~o7}M6$vSRaV2Wn3Y%&}6NH1~(5lo|xT-A?x3}AuY&oc}mhhh4HR<0U6 zceQF{{AH}TTGM#Z(!A=%0R3lJ{fh1jFp{+X39GdJKpbAk%pv#QQQ{e)ykjoANT>t<8 literal 0 HcmV?d00001 diff --git a/target/classes/src/java/view/panels/StatusPanel/StatusPanel.class b/target/classes/src/java/view/panels/StatusPanel/StatusPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..eae61bbd3f351630337823b825dc2c87c2b1e490 GIT binary patch literal 326 zcmb7-eKSxHf8brMIJs>Fy@A&b&1t!eHa9Kw@rpM^Q; zbSD;dhtPS|sV?3K?cr!maOT-o`DmjTz(t1;Mmkj=+hjc zd}%|NME{|h68u$G=COL$_VS=XKe4cQ27~dZ!ILZytH(~%9&lf-=w3Kz!DqG4z#|@5 PgL-#)_Sq4qwiW&Xh=fgj literal 0 HcmV?d00001 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..4a8b3ee --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,47 @@ +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuBarSeparator.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/client/TLSClient.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/interfaces/Controller.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuItem.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/ControllerThread.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/validate/Validate.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/Sender.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/Menu.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/Receiver.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/interfaces/I_Themeable.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/main/Main.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/queues/ReceivingQueue.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/frames/MainFrame.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/constants/GUIConstants.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuBarLanguageController.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuBar.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/interfaces/I_PanelChangeable.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/client/Client.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/data/ConnectionData.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/queues/SendingQueue.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java +/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/interfaces/I_Translateable.java