protected void cancelpendingcmdbutton_Click(object sender, EventArgs e)
 {
     using (VendingModelContainer dc = new VendingModelContainer())
     {
         using (var dbContextTransaction = dc.Database.BeginTransaction())
         {
             try
             {
                 Accounts            tmpacc      = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name && x.Valid && !x.Suspended);
                 WaterDevices        tmpdev      = dc.WaterDevices.First(x => x.ID == wvdid && x.Valid && x.AccountID == tmpacc.ID);
                 WaterDeviceCommands cmdtocancel = dc.WaterDeviceCommands.Where(x => x.WaterDeviceID == tmpdev.ID && x.RequestedDatetime == 0).First();
                 dc.WaterDeviceCommands.Remove(cmdtocancel);
                 dc.SaveChanges();
                 dbContextTransaction.Commit();
                 ScriptManager.RegisterClientScriptBlock((sender as Control), this.GetType(), "alert", "alert('Команда успешно отменена.')", true);
                 Logger.AccountLog(Request.UserHostAddress, "отмена команды устройству №" + cmdtocancel.WaterDeviceID, cmdtocancel.Command, cmdtocancel.WaterDeviceID);
                 Logger.SystemLog(Request.UserHostAddress, "отмена команды устройству №" + cmdtocancel.WaterDeviceID, cmdtocancel.Command, "Server");
             }
             catch (Exception ex)
             {
                 Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name);
             }
         }
     }
     FillTablesWithData();
 }
    protected void changedevmodetotpbutton_Click(object sender, EventArgs e)
    {
        TwoFactorAuth tfa     = new TwoFactorAuth(WWWVars.SiteName);
        Accounts      useracc = null;

        using (VendingModelContainer dc = new VendingModelContainer())
        {
            useracc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name && x.Valid && !x.Suspended);
            if (useracc.TOTPSecret != "" && changedevmodetotp.Text != "")
            {
                if (tfa.VerifyCode(useracc.TOTPSecret, changedevmodetotp.Text))
                {
                    DateTime cdt      = DateTime.Now;
                    long     cdtlong  = Convert.ToInt64(cdt.ToString("yyyyMMddHHmmss"));
                    string   cdtstr   = cdt.ToString("dd.MM.yyyy HH:mm:ss");
                    WDCmd    tmpwdcmd = null;
                    string   cmddescr = "";
                    switch (devmodecb.SelectedValue)
                    {
                    case "salesmode":
                    {
                        tmpwdcmd = WDCmdSet.GoToSalesMode;
                        cmddescr = "Переход в РЕЖИМ ПРОДАЖ";
                        break;
                    }

                    case "oosmode":
                    {
                        tmpwdcmd = WDCmdSet.GoToOOSMode;
                        cmddescr = "Переход в режим НЕ ОБСЛУЖИВАЕТ";
                        break;
                    }

                    case "servicemode":
                    {
                        tmpwdcmd = WDCmdSet.GoToServiceMode;
                        cmddescr = "Переход в СЛУЖЕБНЫЙ РЕЖИМ";
                        break;
                    }

                    case "shutdown":
                    {
                        tmpwdcmd = WDCmdSet.Shutdown;
                        cmddescr = "ВЫКЛЮЧЕНИЕ";
                        break;
                    }

                    case "reboot":
                    {
                        tmpwdcmd = WDCmdSet.Reboot;
                        cmddescr = "ПЕРЕЗАГРУЗКА";
                        break;
                    }

                    case "incasso":
                    {
                        tmpwdcmd = WDCmdSet.Incassation;
                        cmddescr = "ИНКАССАЦИЯ";
                        break;
                    }

                    case "KKTCloseStage":
                    {
                        tmpwdcmd = WDCmdSet.KKTCloseStage;
                        cmddescr = "ЗАКРЫТИЕ СМЕНЫ";
                        break;
                    }

                    case "KKTRegistrationMode":
                    {
                        tmpwdcmd = WDCmdSet.KKTRegistrationMode;
                        cmddescr = "ККТ: РЕЖИМ РЕГИСТРАЦИИ";
                        break;
                    }

                    case "KKTOpenStage":
                    {
                        tmpwdcmd = WDCmdSet.KKTOpenStage;
                        cmddescr = "ККТ: ОТКРЫТЬ СМЕНУ";
                        break;
                    }

                    case "KKTCancelReceipt":
                    {
                        tmpwdcmd = WDCmdSet.KKTCancelReceipt;
                        cmddescr = "ККТ: ОТМЕНА ТЕКУЩЕГО ЧЕКА";
                        break;
                    }

                    case "Unregister":
                    {
                        tmpwdcmd = WDCmdSet.Unregister;
                        cmddescr = "Удаление устройства (отмена регистрации)";
                        break;
                    }
                    }
                    //формируем команду
                    WaterDeviceCommands tmpcmd = new WaterDeviceCommands()
                    {
                        AckDatetime          = 0,
                        AckDatetimeStr       = "",
                        Command              = tmpwdcmd.Command,
                        FormedDatetime       = cdtlong,
                        FormedDatetimeStr    = cdtstr,
                        WaterDeviceID        = wvdid,
                        RequestedDatetime    = 0,
                        RequestedDatetimeStr = "",
                        Result = ""
                    };
                    dc.WaterDeviceCommands.Add(tmpcmd);
                    dc.SaveChanges();
                    Logger.AccountLog(Request.UserHostAddress, "Новая команда устройству №" + tmpcmd.WaterDeviceID, tmpcmd.Command, tmpcmd.WaterDeviceID);
                    Logger.SystemLog(Request.UserHostAddress, "Новая команда устройству №" + tmpcmd.WaterDeviceID, tmpcmd.Command, "Server");
                    changedevmodetotpbox.Visible = false;
                    changedevmodebutton.Visible  = true;
                    changedevmodemsg.Text        = "";
                    //devmodecb.SelectedIndex = 0;
                    devmodecb.Enabled = true;
                    ScriptManager.RegisterClientScriptBlock((sender as Control), this.GetType(), "alert", "alert('Команда \"" + cmddescr + "\" сформирована. Дождитесь ее выполнения на устройстве.')", true);
                }
                else
                {
                    changedevmodetotpmsg.Text    = "Неверный одноразовый пароль";
                    changedevmodebutton.Visible  = false;
                    changedevmodetotpbox.Visible = true;
                }
            }
        }
        FillTablesWithData();
    }
 protected void Page_Load(object sender, EventArgs e)
 {
     using (VendingModelContainer dc = new VendingModelContainer())
     {
         try
         {
             DateTime dt           = DateTime.Now;
             long     cdt          = Convert.ToInt64(dt.ToString("yyyyMMddHHmmss"));
             string   cdtstr       = dt.ToString("dd.MM.yyyy HH:mm:ss");
             var      waterdevices = dc.WaterDevices;
             //считываем запрос
             string encryptedrequest      = Request.Form["Request"];
             byte[] encryptedrequestbytes = Convert.FromBase64String(encryptedrequest);
             string signature             = Request.Form["Signature"];
             byte[] signaturebytes        = Convert.FromBase64String(signature);
             string encryptedaeskey       = Request.Form["AData"];
             byte[] encryptedaeskeybytes  = Convert.FromBase64String(encryptedaeskey);
             string encryptediv           = Request.Form["BData"];
             byte[] encryptedivbytes      = Convert.FromBase64String(encryptediv);
             //инициализируем криптодвижок для расшифровки
             CspParameters cspParams = new CspParameters
             {
                 ProviderType = 1
             };
             RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
             CryptoHelper             ch          = new CryptoHelper();
             //расшифровываем симметричный ключ и вектор инициализации
             byte[] AESKeyBytes = ch.DecryptData(encryptedaeskeybytes);
             byte[] AESIVBytes  = ch.DecryptData(encryptedivbytes);
             AesCryptoServiceProvider AESProv = new AesCryptoServiceProvider
             {
                 Mode    = CipherMode.CBC,
                 Padding = PaddingMode.PKCS7,
                 KeySize = 128,
                 Key     = AESKeyBytes,
                 IV      = AESIVBytes
             };
             //расшифровываем запрос
             string       plaintext    = "";
             MemoryStream memoryStream = null;
             try
             {
                 memoryStream = new MemoryStream(encryptedrequestbytes);
                 using (CryptoStream cryptoStream = new CryptoStream(memoryStream, AESProv.CreateDecryptor(), CryptoStreamMode.Read))
                 {
                     plaintext = new StreamReader(cryptoStream, Encoding.UTF8).ReadToEnd();
                 }
             }
             finally
             {
                 if (memoryStream != null)
                 {
                     memoryStream.Dispose();
                 }
             }
             //byte[] plaintextbytes = rsaProvider.Decrypt(encryptedrequestbytes, false);
             long devid = Deserialize <long>(plaintext);
             //инициализируем криптодвижок для проверки подписи присланных данных
             rsaProvider = new RSACryptoServiceProvider();
             var tmpdev = dc.WaterDevices.First(x => x.ID == devid && x.Valid);
             rsaProvider.ImportCspBlob(tmpdev.PublicKey);
             bool signcorrect = rsaProvider.VerifyData(Encoding.UTF8.GetBytes(plaintext), CryptoConfig.MapNameToOID("SHA512"), signaturebytes);
             if (signcorrect)
             {
                 WaterDeviceCommands tmpcmd = dc.WaterDeviceCommands.First(x => x.WaterDeviceID == tmpdev.ID && x.RequestedDatetime == 0);
                 tmpcmd.RequestedDatetime    = cdt;
                 tmpcmd.RequestedDatetimeStr = cdtstr;
                 dc.SaveChanges();
                 if (tmpcmd.Command == "Unregister")
                 {
                     tmpdev.Valid = false;
                     dc.SaveChanges();
                 }
                 Response.Write(tmpcmd.Command);
             }
         }
         catch /*(Exception ex)*/
         {
         }
         finally
         {
         }
     }
 }