diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 564cd38..4ee173d 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -610,6 +610,15 @@ namespace MeshCentralRouter.Properties { } } + /// + /// Looks up a localized string similar to Message Sent. + /// + internal static string MessageSent { + get { + return ResourceManager.GetString("MessageSent", resourceCulture); + } + } + /// /// Looks up a localized string similar to MQTT. /// @@ -845,6 +854,15 @@ namespace MeshCentralRouter.Properties { } } + /// + /// Looks up a localized string similar to Send token to registered messaging application?. + /// + internal static string SendTokenMSG { + get { + return ResourceManager.GetString("SendTokenMSG", resourceCulture); + } + } + /// /// Looks up a localized string similar to Send token to registered phone number?. /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 356d614..6a98f0c 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -472,4 +472,10 @@ None + + Message Sent + + + Send token to registered messaging application? + \ No newline at end of file diff --git a/src/MainForm.Designer.cs b/src/MainForm.Designer.cs index 5fa8008..0897163 100644 --- a/src/MainForm.Designer.cs +++ b/src/MainForm.Designer.cs @@ -52,6 +52,7 @@ this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.panel2 = new System.Windows.Forms.Panel(); + this.msgTokenButton = new System.Windows.Forms.Button(); this.tokenRememberCheckBox = new System.Windows.Forms.CheckBox(); this.emailTokenButton = new System.Windows.Forms.Button(); this.smsTokenButton = new System.Windows.Forms.Button(); @@ -331,6 +332,7 @@ // // panel2 // + this.panel2.Controls.Add(this.msgTokenButton); this.panel2.Controls.Add(this.tokenRememberCheckBox); this.panel2.Controls.Add(this.emailTokenButton); this.panel2.Controls.Add(this.smsTokenButton); @@ -345,6 +347,13 @@ resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // + // msgTokenButton + // + resources.ApplyResources(this.msgTokenButton, "msgTokenButton"); + this.msgTokenButton.Name = "msgTokenButton"; + this.msgTokenButton.UseVisualStyleBackColor = true; + this.msgTokenButton.Click += new System.EventHandler(this.msgTokenButton_Click); + // // tokenRememberCheckBox // resources.ApplyResources(this.tokenRememberCheckBox, "tokenRememberCheckBox"); @@ -1149,6 +1158,7 @@ private System.Windows.Forms.Button connectionSettings; private System.Windows.Forms.ToolStripMenuItem customAppsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem customAppsToolStripMenuItem1; + private System.Windows.Forms.Button msgTokenButton; } } diff --git a/src/MainForm.cs b/src/MainForm.cs index 2a97c72..6bf6978 100644 --- a/src/MainForm.cs +++ b/src/MainForm.cs @@ -51,6 +51,7 @@ namespace MeshCentralRouter public bool forceExit = false; public bool sendEmailToken = false; public bool sendSMSToken = false; + public bool sendMsgToken = false; public bool allowUpdates = Settings.GetRegValue("CheckForUpdates", true); public bool collapseDeviceGroup = Settings.GetRegValue("CollapseDeviceGroups", true); public Uri authLoginUrl = null; @@ -990,10 +991,12 @@ namespace MeshCentralRouter if (meshcentral.disconnectMsg == "tokenrequired") { emailTokenButton.Visible = (meshcentral.disconnectEmail2FA == true) && (meshcentral.disconnectEmail2FASent == false); - tokenEmailSentLabel.Visible = (meshcentral.disconnectEmail2FASent == true) || (meshcentral.disconnectSms2FASent == true); + tokenEmailSentLabel.Visible = (meshcentral.disconnectEmail2FASent == true) || (meshcentral.disconnectSms2FASent == true) || (meshcentral.disconnectMsg2FASent == true); smsTokenButton.Visible = ((meshcentral.disconnectSms2FA == true) && (meshcentral.disconnectSms2FASent == false)); + msgTokenButton.Visible = ((meshcentral.disconnectMsg2FA == true) && (meshcentral.disconnectMsg2FASent == false)); if (meshcentral.disconnectEmail2FASent) { tokenEmailSentLabel.Text = Translate.T(Properties.Resources.EmailSent); } if (meshcentral.disconnectSms2FASent) { tokenEmailSentLabel.Text = Translate.T(Properties.Resources.SmsSent); } + if (meshcentral.disconnectMsg2FASent) { tokenEmailSentLabel.Text = Translate.T(Properties.Resources.MessageSent); } if ((meshcentral.disconnectEmail2FA == true) && (meshcentral.disconnectEmail2FASent == false)) { smsTokenButton.Left = emailTokenButton.Left + emailTokenButton.Width + 5; @@ -1406,7 +1409,7 @@ namespace MeshCentralRouter private void nextButton2_Click(object sender, EventArgs e) { - if ((tokenTextBox.Text.Replace(" ", "") == "") && (sendEmailToken == false) && (sendSMSToken == false)) return; + if ((tokenTextBox.Text.Replace(" ", "") == "") && (sendEmailToken == false) && (sendSMSToken == false) && (sendMsgToken == false)) return; // Attempt to login with token addButton.Enabled = false; @@ -1465,6 +1468,11 @@ namespace MeshCentralRouter sendSMSToken = false; meshcentral.connect(serverurl, userNameTextBox.Text, passwordTextBox.Text, "**sms**", getClientAuthCertificate()); } + else if (sendMsgToken == true) + { + sendMsgToken = false; + meshcentral.connect(serverurl, userNameTextBox.Text, passwordTextBox.Text, "**msg**", getClientAuthCertificate()); + } else { meshcentral.connect(serverurl, userNameTextBox.Text, passwordTextBox.Text, tokenTextBox.Text.Replace(" ", ""), getClientAuthCertificate()); @@ -1779,6 +1787,7 @@ namespace MeshCentralRouter { sendEmailToken = true; sendSMSToken = false; + sendMsgToken = false; nextButton2_Click(this, null); } } @@ -1789,6 +1798,18 @@ namespace MeshCentralRouter { sendEmailToken = false; sendSMSToken = true; + sendMsgToken = false; + nextButton2_Click(this, null); + } + } + + private void msgTokenButton_Click(object sender, EventArgs e) + { + if (MessageBox.Show(this, Translate.T(Properties.Resources.SendTokenMSG), Translate.T(Properties.Resources.TwoFactorAuthentication), MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) + { + sendEmailToken = false; + sendSMSToken = false; + sendMsgToken = true; nextButton2_Click(this, null); } } diff --git a/src/MainForm.resx b/src/MainForm.resx index 658b436..69d8a4a 100644 --- a/src/MainForm.resx +++ b/src/MainForm.resx @@ -129,10 +129,13 @@ - 10, 286 + 13, 355 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 @@ -163,10 +166,13 @@ NoControl - 111, 286 + 148, 355 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 104 @@ -202,10 +208,13 @@ NoControl - 241, 225 + 321, 277 + + + 4, 0, 4, 0 - 88, 13 + 114, 17 19 @@ -235,10 +244,13 @@ NoControl - 238, 176 + 317, 217 + + + 4, 0, 4, 0 - 53, 13 + 69, 17 18 @@ -265,10 +277,13 @@ NoControl - 238, 135 + 317, 166 + + + 4, 0, 4, 0 - 55, 13 + 73, 17 17 @@ -295,10 +310,13 @@ NoControl - 238, 92 + 317, 113 + + + 4, 0, 4, 0 - 38, 13 + 50, 17 16 @@ -322,13 +340,16 @@ Top, Left, Right - 241, 192 + 321, 236 + + + 4, 4, 4, 4 - 214, 20 + 287, 22 102 @@ -352,10 +373,13 @@ meshcentral.com - 241, 110 + 321, 135 + + + 4, 4, 4, 4 - 214, 21 + 287, 24 100 @@ -376,10 +400,13 @@ Top, Left, Right - 241, 151 + 321, 186 + + + 4, 4, 4, 4 - 214, 20 + 287, 22 101 @@ -403,10 +430,13 @@ NoControl - 174, 260 + 235, 323 + + + 4, 0, 4, 0 - 303, 13 + 404, 16 103 @@ -439,10 +469,13 @@ NoControl - 3, 260 + 4, 323 + + + 4, 0, 4, 0 - 37, 13 + 47, 17 11 @@ -469,10 +502,13 @@ NoControl - 372, 286 + 499, 355 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 105 @@ -499,10 +535,13 @@ NoControl - 0, 278 + 0, 345 + + + 4, 4, 4, 4 - 478, 40 + 640, 49 StretchImage @@ -529,10 +568,13 @@ NoControl - 12, 9 + 16, 11 + + + 4, 0, 4, 0 - 454, 56 + 608, 69 6 @@ -559,10 +601,13 @@ NoControl - 15, 68 + 20, 84 + + + 4, 4, 4, 4 - 217, 170 + 292, 212 Zoom @@ -586,10 +631,13 @@ Fill - 3, 3 + 4, 4 + + + 4, 4, 4, 4 - 478, 316 + 640, 392 6 @@ -607,13 +655,16 @@ 0 - 4, 25 + 4, 28 + + + 4, 4, 4, 4 - 3, 3, 3, 3 + 4, 4, 4, 4 - 484, 322 + 648, 400 0 @@ -633,6 +684,39 @@ 0 + + NoControl + + + 320, 216 + + + 4, 4, 4, 4 + + + 127, 28 + + + 207 + + + Messaging + + + False + + + msgTokenButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + True @@ -640,10 +724,13 @@ NoControl - 241, 221 + 321, 272 + + + 4, 4, 4, 4 - 131, 17 + 170, 21 204 @@ -664,16 +751,19 @@ panel2 - 0 + 1 NoControl - 241, 177 + 321, 180 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 202 @@ -694,16 +784,19 @@ panel2 - 1 + 2 NoControl - 342, 177 + 456, 180 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 203 @@ -724,7 +817,7 @@ panel2 - 2 + 3 True @@ -733,10 +826,13 @@ NoControl - 238, 182 + 317, 186 + + + 4, 0, 4, 0 - 55, 13 + 73, 17 21 @@ -757,7 +853,7 @@ panel2 - 3 + 4 True @@ -766,10 +862,13 @@ NoControl - 238, 135 + 317, 128 + + + 4, 0, 4, 0 - 38, 13 + 48, 17 19 @@ -787,16 +886,19 @@ panel2 - 4 + 5 Top, Left, Right - 241, 151 + 321, 148 + + + 4, 4, 4, 4 - 214, 20 + 287, 22 201 @@ -811,7 +913,7 @@ panel2 - 5 + 6 Top, Bottom, Left, Right @@ -820,10 +922,13 @@ NoControl - 15, 68 + 20, 84 + + + 4, 4, 4, 4 - 217, 170 + 292, 212 Zoom @@ -841,7 +946,7 @@ panel2 - 6 + 7 Bottom, Right @@ -850,10 +955,13 @@ NoControl - 270, 286 + 363, 355 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 205 @@ -871,7 +979,7 @@ panel2 - 7 + 8 Bottom, Right @@ -880,10 +988,13 @@ NoControl - 372, 286 + 499, 355 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 206 @@ -901,7 +1012,7 @@ panel2 - 8 + 9 Bottom, Left, Right @@ -910,10 +1021,13 @@ NoControl - 0, 278 + 0, 345 + + + 4, 4, 4, 4 - 478, 40 + 640, 49 StretchImage @@ -931,7 +1045,7 @@ panel2 - 9 + 10 Top, Left, Right @@ -940,10 +1054,13 @@ NoControl - 12, 9 + 16, 11 + + + 4, 0, 4, 0 - 454, 56 + 608, 69 6 @@ -961,16 +1078,19 @@ panel2 - 10 + 11 Fill - 3, 3 + 4, 4 + + + 4, 4, 4, 4 - 478, 316 + 640, 392 7 @@ -988,13 +1108,16 @@ 0 - 4, 25 + 4, 28 + + + 4, 4, 4, 4 - 3, 3, 3, 3 + 4, 4, 4, 4 - 484, 322 + 648, 400 1 @@ -1024,10 +1147,13 @@ NoControl - 208, 256 + 277, 319 + + + 4, 4, 4, 4 - 145, 17 + 190, 21 302 @@ -1051,7 +1177,10 @@ Top, Bottom, Left, Right - 15, 82 + 20, 101 + + + 4, 4, 4, 4 True @@ -1060,7 +1189,7 @@ Vertical - 450, 162 + 602, 202 25 @@ -1084,10 +1213,13 @@ NoControl - 14, 251 + 19, 313 + + + 4, 4, 4, 4 - 188, 23 + 251, 28 301 @@ -1117,10 +1249,13 @@ NoControl - 8, 6 + 11, 7 + + + 4, 0, 4, 0 - 468, 22 + 627, 27 23 @@ -1150,10 +1285,13 @@ NoControl - 12, 34 + 16, 42 + + + 4, 0, 4, 0 - 454, 45 + 608, 55 22 @@ -1180,10 +1318,13 @@ NoControl - 276, 291 + 371, 362 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 303 @@ -1210,10 +1351,13 @@ NoControl - 378, 291 + 507, 362 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 304 @@ -1240,10 +1384,13 @@ NoControl - 0, 282 + 0, 351 + + + 4, 4, 4, 4 - 484, 40 + 648, 49 StretchImage @@ -1269,8 +1416,11 @@ 0, 0 + + 4, 4, 4, 4 + - 484, 322 + 648, 400 8 @@ -1288,10 +1438,13 @@ 0 - 4, 25 + 4, 28 + + + 4, 4, 4, 4 - 484, 322 + 648, 400 2 @@ -1321,49 +1474,49 @@ 613, 17 - 185, 22 + 218, 26 Show &Group Names - 185, 22 + 218, 26 Show &Offline Devices - 182, 6 + 215, 6 - 185, 22 + 218, 26 Sort by &Name - 185, 22 + 218, 26 Sort by G&roup - 182, 6 + 215, 6 - 185, 22 + 218, 26 S&ettings... - 185, 22 + 218, 26 &Custom Apps... - 186, 148 + 219, 172 mainContextMenuStrip @@ -1378,10 +1531,13 @@ NoControl - 454, 2 + 608, 2 + + + 4, 0, 4, 0 - 25, 25 + 31, 31 403 @@ -1405,10 +1561,13 @@ Top, Right - 306, 5 + 411, 6 + + + 4, 4, 4, 4 - 146, 20 + 193, 22 402 @@ -1444,10 +1603,13 @@ NoControl - 6, 191 + 8, 226 + + + 4, 4, 4, 4 - 168, 35 + 224, 43 405 @@ -1489,82 +1651,82 @@ Segoe UI, 9pt, style=Bold - 170, 22 + 198, 24 Add &Map... - 170, 22 + 198, 24 Add &Relay Map... - 167, 6 + 195, 6 - 171, 22 + 204, 26 Ask Consent + Bar - 171, 22 + 204, 26 Ask Consent - 171, 22 + 204, 26 Privacy Bar - 170, 22 + 198, 24 Remote Desktop... - 170, 22 + 198, 24 Remote Files... - 170, 22 + 198, 24 HTTP - 170, 22 + 198, 24 HTTPS - 170, 22 + 198, 24 RDP - 170, 22 + 198, 24 SSH - 170, 22 + 198, 24 SCP - 171, 208 + 199, 226 devicesContextMenuStrip @@ -1580,7 +1742,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADg - HQAAAk1TRnQBSQFMAgEBEAEAARgBAQEYAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA + HQAAAk1TRnQBSQFMAgEBEAEAASgBAQEoAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABUAMAAQEBAAEYBgABPP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AJYAA/0D+AP3A/sD/yEAA/0D+gP5 A/wD/xgAAfoB+wH6A/4qAAP9A/8tAAP7A88D1QPbA88D1AO+A9QYAAP8A90D4APjA90D4APUA+MSAAP8 AZEBjwF9AU4BaAEhAfQB9QH0JAAD/gPRA8YD+ioAAcYCxwHPAtAB2ALZA90DywPBA68DmgP3FQAD2APd @@ -1711,10 +1873,13 @@ - 10, 4 + 13, 5 + + + 4, 4, 4, 4 - 446, 210 + 593, 258 404 @@ -1726,7 +1891,7 @@ devicesListView - MeshCentralRouter.ListViewExtended, MeshCentralRouter, Version=1.8.8219.36334, Culture=neutral, PublicKeyToken=null + MeshCentralRouter.ListViewExtended, MeshCentralRouter, Version=1.8.8332.12419, Culture=neutral, PublicKeyToken=null devicesPanel @@ -1744,10 +1909,13 @@ NoControl - 2, 88 + 3, 108 + + + 4, 0, 4, 0 - 372, 52 + 490, 64 5 @@ -1783,10 +1951,13 @@ NoControl - 2, 88 + 3, 108 + + + 4, 0, 4, 0 - 372, 52 + 490, 64 4 @@ -1812,8 +1983,11 @@ 0, 0 + + 4, 4, 4, 4 + - 470, 248 + 628, 305 50 @@ -1831,13 +2005,16 @@ 0 - 4, 25 + 4, 28 + + + 4, 4, 4, 4 - 3, 3, 3, 3 + 4, 4, 4, 4 - 470, 250 + 632, 315 0 @@ -1864,10 +2041,13 @@ NoControl - 4, 182 + 5, 221 + + + 4, 4, 4, 4 - 168, 35 + 224, 43 55 @@ -1906,10 +2086,13 @@ NoControl - 6, 79 + 8, 97 + + + 4, 0, 4, 0 - 446, 52 + 586, 64 4 @@ -1937,8 +2120,11 @@ Click "Add" to get started. 0, 0 + + 4, 4, 4, 4 + - 472, 221 + 628, 268 49 @@ -1962,10 +2148,13 @@ Click "Add" to get started. NoControl - 1, 226 + 1, 275 + + + 4, 4, 4, 4 - 20, 20 + 27, 25 54 @@ -1989,10 +2178,13 @@ Click "Add" to get started. NoControl - 240, 226 + 320, 275 + + + 4, 4, 4, 4 - 20, 20 + 27, 25 5 @@ -2019,10 +2211,13 @@ Click "Add" to get started. NoControl - 372, 223 + 496, 271 + + + 4, 4, 4, 4 - 100, 23 + 133, 28 50 @@ -2052,10 +2247,13 @@ Click "Add" to get started. NoControl - 266, 223 + 355, 271 + + + 4, 4, 4, 4 - 100, 23 + 133, 28 52 @@ -2076,13 +2274,16 @@ Click "Add" to get started. 5 - 4, 25 + 4, 28 + + + 4, 4, 4, 4 - 3, 3, 3, 3 + 4, 4, 4, 4 - 472, 253 + 632, 315 1 @@ -2103,10 +2304,13 @@ Click "Add" to get started. 1 - 3, 3 + 4, 4 + + + 4, 4, 4, 4 - 478, 279 + 640, 347 401 @@ -2130,10 +2334,13 @@ Click "Add" to get started. NoControl - 10, 291 + 13, 362 + + + 4, 4, 4, 4 - 109, 23 + 145, 28 406 @@ -2163,10 +2370,13 @@ Click "Add" to get started. NoControl - 276, 291 + 371, 362 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 407 @@ -2193,10 +2403,13 @@ Click "Add" to get started. NoControl - 378, 291 + 507, 362 + + + 4, 4, 4, 4 - 95, 23 + 127, 28 408 @@ -2223,10 +2436,13 @@ Click "Add" to get started. NoControl - 0, 282 + 0, 351 + + + 4, 4, 4, 4 - 484, 40 + 648, 49 StretchImage @@ -2252,8 +2468,11 @@ Click "Add" to get started. 0, 0 + + 4, 4, 4, 4 + - 484, 322 + 648, 400 8 @@ -2271,10 +2490,13 @@ Click "Add" to get started. 0 - 4, 25 + 4, 28 + + + 4, 4, 4, 4 - 484, 322 + 648, 400 4 @@ -2304,7 +2526,7 @@ Click "Add" to get started. 0, 0, 0, 0 - 492, 351 + 656, 432 8 @@ -2328,10 +2550,13 @@ Click "Add" to get started. Fill - 0, 65 + 0, 80 + + + 4, 4, 4, 4 - 492, 351 + 656, 432 9 @@ -2357,8 +2582,11 @@ Click "Add" to get started. 0, 0 + + 4, 4, 4, 4 + - 492, 65 + 656, 80 Zoom @@ -2384,8 +2612,11 @@ Click "Add" to get started. 0, 0 + + 4, 4, 4, 4 + - 492, 416 + 656, 512 8 @@ -2415,22 +2646,22 @@ Click "Add" to get started. 418, 17 - 112, 22 + 123, 24 &Open... - 109, 6 + 120, 6 - 112, 22 + 123, 24 E&xit - 113, 54 + 124, 58 trayIconContextMenuStrip @@ -4142,34 +4373,34 @@ Click "Add" to get started. 905, 17 - 168, 22 + 193, 24 &Open Mappings... - 168, 22 + 193, 24 &Save Mappings... - 165, 6 + 190, 6 - 168, 22 + 193, 24 S&ettings... - 168, 22 + 193, 24 &Custom Apps... - 169, 98 + 194, 106 mappingsContextMenuStrip @@ -4199,10 +4430,10 @@ Click "Add" to get started. True - 6, 13 + 8, 16 - 492, 416 + 656, 512 @@ -5898,6 +6129,9 @@ Click "Add" to get started. AADAPwAAwD8AAMA/AADAPwAA + + 4, 4, 4, 4 + MeshCentral Router diff --git a/src/MeshCentralServer.cs b/src/MeshCentralServer.cs index ca0195c..3306841 100644 --- a/src/MeshCentralServer.cs +++ b/src/MeshCentralServer.cs @@ -46,6 +46,8 @@ namespace MeshCentralRouter public bool disconnectEmail2FASent = false; public bool disconnectSms2FA = false; public bool disconnectSms2FASent = false; + public bool disconnectMsg2FA = false; + public bool disconnectMsg2FASent = false; public X509Certificate2 disconnectCert; public string authCookie = null; public string rauthCookie = null; @@ -247,6 +249,8 @@ namespace MeshCentralRouter if (jsonAction.ContainsKey("email2fasent")) { disconnectEmail2FASent = (bool)jsonAction["email2fasent"]; } else { disconnectEmail2FASent = false; } if (jsonAction.ContainsKey("sms2fa")) { disconnectSms2FA = (bool)jsonAction["sms2fa"]; } else { disconnectSms2FA = false; } if (jsonAction.ContainsKey("sms2fasent")) { disconnectSms2FASent = (bool)jsonAction["sms2fasent"]; } else { disconnectSms2FASent = false; } + if (jsonAction.ContainsKey("msg2fa")) { disconnectMsg2FA = (bool)jsonAction["msg2fa"]; } else { disconnectMsg2FA = false; } + if (jsonAction.ContainsKey("msg2fasent")) { disconnectMsg2FASent = (bool)jsonAction["msg2fasent"]; } else { disconnectMsg2FASent = false; } if (jsonAction.ContainsKey("twoFactorCookieDays") && (jsonAction["twoFactorCookieDays"].GetType() == typeof(int))) { twoFactorCookieDays = (int)jsonAction["twoFactorCookieDays"]; } break; }