protected void Page_Load(object sender, EventArgs e) { using (VendingModelContainer dc = new VendingModelContainer()) { try { DateTime dt = DateTime.Now; CryptoHelper ch = new CryptoHelper(); 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"]; string signature = Request.Form["Signature"]; string encryptedaeskey = Request.Form["AData"]; string encryptediv = Request.Form["BData"]; var devicestable = dc.WaterDevices; WaterDeviceTelemetry logentry = null; bool signcorrect = ch.DecryptVerifyDeviceLog(encryptedrequest, signature, encryptedaeskey, encryptediv, out logentry); if (signcorrect) { logentry.DateTime = cdt; logentry.DateTimeStr = cdtstr; var telemetrytable = dc.WaterDeviceTelemetry; var statetable = dc.WaterDeviceState; try { WaterDeviceState tmpstate = statetable.Where(x => x.WaterDeviceID == logentry.WaterDeviceID).First(); dc.Entry(tmpstate).CurrentValues.SetValues(logentry); } catch { var tmpstate = (WaterDeviceState)logentry; statetable.Add(tmpstate); } telemetrytable.Add(logentry); dc.SaveChanges(); } } catch /*(Exception ex)*/ { } finally { } } }
private void FillTablesWithData() { List <string> warnlist = new List <string>() { }; using (VendingModelContainer dc = new VendingModelContainer()) { using (var dbContextTransaction = dc.Database.BeginTransaction()) { try { try { if (globalmenuitemhandler.Value != "sales") { salesinfopanel.Visible = false; } if (globalmenuitemhandler.Value != "devcontrol") { vmcpanel.Visible = false; } switch (globalmenuitemhandler.Value) { case "devinfo": { deviceinfopanel.Visible = true; break; } case "cash": { cashinfopanel.Visible = true; break; } case "devcontrol": { vmcpanel.Visible = true; break; } case "devsettings": { devicesettingspanel.Visible = true; break; } case "devcomponents": { devcomponentspanel.Visible = true; break; } } } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } //если пришла информация об успешном выполнении операции, показываем сообщение что все заебись if (successheadertext.Length > 5 && successmsgtext.Length > 5) { successheader.Text = successheadertext; successmsg.Text = successmsgtext; successpanel.Visible = true; } //инициализируем переменные и считываем объекты из БД Accounts tmpacc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name && x.Valid && !x.Suspended); if (tmpacc.TOTPSecret == "") { warnlist.Add("Не настроена двухфакторная авторизация. Управление устройством невозможно."); } WaterDevices tmpdev = dc.WaterDevices.First(x => x.ID == wvdid && x.AccountID == tmpacc.ID && x.Valid); WaterDeviceTelemetry tmptele = dc.WaterDeviceTelemetry.Where(x => x.WaterDeviceID == wvdid).OrderByDescending(y => y.DateTime).First(); //если связи с устройством нет, показываем предупреждение DateTime lastlogdt = DateTime.ParseExact(tmptele.DateTime.ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture); lastseendatetimelabel.Text = tmptele.DateTimeStr; if (lastlogdt.AddMinutes(5) < DateTime.Now) { timeoutwarnpanel.Visible = true; } else { } DateTime cdt = DateTime.Now; long cdtlong = Convert.ToInt64(cdt.ToString("yyyyMMddHHmmss")); string cdtstr = cdt.ToString("dd.MM.yyyy HH:mm:ss"); if (salesinfopanel.Visible) { //заполняем таблицу продаж salestable.Rows.Clear(); var watersales = dc.WaterSales.Where(x => x.WaterDeviceID == tmpdev.ID).OrderByDescending(y => y.ID).Take(100); foreach (var item in watersales) { TableRow newtablerow = new TableRow { HorizontalAlign = HorizontalAlign.Center, VerticalAlign = VerticalAlign.Middle }; TableCell datetimecell = new TableCell { Width = 125, Text = item.EndDateTimeString }; TableCell qtycell = new TableCell { Width = 99, Text = item.Quantity.ToString("N2") }; TableCell totalcell = new TableCell { Width = 99, Text = (item.Quantity * item.PRICE_PER_ITEM_MDE / 100).ToString("N2") }; TableCell usercashcell = new TableCell { Width = 99, Text = item.UserCash.ToString("N2") }; TableCell changecell = new TableCell { Width = 99, Text = (item.ActualChangeDispensed - item.ChangeActualDiff).ToString("N2") }; TableCell actchangecell = new TableCell { Width = 99, Text = item.ActualChangeDispensed.ToString("N2") }; TableCell stageandreceiptcell = new TableCell { Width = 120, Text = item.StageNumber.ToString() + " \\ " + item.ReceiptNumber.ToString() }; newtablerow.Cells.AddRange(new TableCell[] { datetimecell, qtycell, totalcell, usercashcell, changecell, actchangecell, stageandreceiptcell }); salestable.Rows.Add(newtablerow); } //Заполняем графики данными DateTime last24hstart = cdt.AddDays(-1); DateTime lastmonthstart = cdt.AddMonths(-1).Date; DateTime lastyearstart = cdt.AddYears(-1).Date; long start24h = Convert.ToInt64(last24hstart.ToString("yyyyMMddHHmmss")); long startmonth = Convert.ToInt64(lastmonthstart.ToString("yyyyMMddHHmmss")); long startyear = Convert.ToInt64(lastyearstart.ToString("yyyyMMddHHmmss")); saleslast24hchart.ChartAreas[0].AxisX.Minimum = Convert.ToDouble(last24hstart.ToOADate()); saleslast24hchart.ChartAreas[0].AxisX.Maximum = Convert.ToDouble(cdt.ToOADate()); saleslastmonthchartdaily.ChartAreas[0].AxisX.Minimum = Convert.ToDouble(lastmonthstart.ToOADate()); saleslastmonthchartdaily.ChartAreas[0].AxisX.Maximum = Convert.ToDouble(cdt.AddDays(1).Date.ToOADate()); saleslastyearweekly.ChartAreas[0].AxisX.Minimum = Convert.ToDouble(lastyearstart.ToOADate()); saleslastyearweekly.ChartAreas[0].AxisX.Maximum = Convert.ToDouble(cdt.AddDays(1).Date.ToOADate()); saleslast24hchart.Series[0].Points.Clear(); saleslastmonthchartdaily.Series[0].Points.Clear(); saleslastyearweekly.Series[0].Points.Clear(); var last24hwatersales = dc.WaterSales.Where(x => x.WaterDeviceID == tmpdev.ID && x.EndDateTime > start24h).OrderBy(y => y.ID); foreach (var item in last24hwatersales) { DateTime saledt = DateTime.ParseExact(item.EndDateTime.ToString(), "yyyyMMddHHmmss", CultureInfo.InvariantCulture); double total = ((double)(item.Quantity) * item.PRICE_PER_ITEM_MDE / 100 - (double)(item.ChangeActualDiff)); saleslast24hchart.Series[0].Points.AddXY(saledt, total); } var lastmonthwatersales = dc.WaterSales.Where(x => x.WaterDeviceID == tmpdev.ID && x.EndDateTime > startmonth).OrderBy(y => y.ID); foreach (var item in lastmonthwatersales) { DateTime saledt = DateTime.ParseExact(item.EndDateTime.ToString(), "yyyyMMddHHmmss", CultureInfo.InvariantCulture); double total = ((double)(item.Quantity) * item.PRICE_PER_ITEM_MDE / 100 - (double)(item.ChangeActualDiff)); saleslastmonthchartdaily.Series[0].Points.AddXY(saledt, total); } var lastyearwatersales = dc.WaterSales.Where(x => x.WaterDeviceID == tmpdev.ID && x.EndDateTime > startyear).OrderBy(y => y.ID); foreach (var item in lastyearwatersales) { DateTime saledt = DateTime.ParseExact(item.EndDateTime.ToString(), "yyyyMMddHHmmss", CultureInfo.InvariantCulture); double total = ((double)(item.Quantity) * item.PRICE_PER_ITEM_MDE / 100 - (double)(item.ChangeActualDiff)); saleslastyearweekly.Series[0].Points.AddXY(saledt, total); } } //если есть неисполненные команды устройству, отсылка новых команд невозможна, кнопки надо заблокировать bool pendingcommands = (dc.WaterDeviceCommands.Where(x => x.WaterDeviceID == tmpdev.ID && x.RequestedDatetime == 0).Count() > 0); devmodecb.Enabled = (!pendingcommands && !changedevmodetotpbox.Visible && tmpacc.TOTPSecret != ""); changedevmodebutton.Enabled = (devmodecb.Enabled && devmodecb.SelectedIndex > 0); if (pendingcommands) { changedevmodemsg.Text = "Отмените предыдущую команду или дождитесь ее выполнения"; pendingcommand.Text = dc.WaterDeviceCommands.Where(x => x.WaterDeviceID == tmpdev.ID && x.RequestedDatetime == 0).First().Command; } pendingcmdwarnpanel.Visible = pendingcommands; ccsumcell.Text = tmptele.CCSum.ToString("N2"); cbsumcell.Text = tmptele.CBCount.ToString() + "\\" + tmptele.CBSum.ToString("N2"); basumcell.Text = tmptele.BABillsCount.ToString() + "\\" + tmptele.BASum.ToString("N2"); if (tmpdev.LocationAddress == "" || tmpdev.LocationLatitude == 0 || tmpdev.LocationLongtitude == 0) { warnlist.Add("Не указан адрес установки"); } if (!tmptele.KKTPrinterConnected) { warnlist.Add("Принтер чеков не найден"); } if (tmptele.KKTPrinterPaperEmpty) { warnlist.Add("Принтер чеков: кончилась бумага"); } if (tmptele.KKTPrinterNonRecoverableError) { warnlist.Add("Принтер чеков: критическая ошибка"); } if (tmptele.KKTPrinterCutterError) { warnlist.Add("Принтер чеков: ошибка отрезчика"); } if (tmptele.KKTPrinterOverHeated) { warnlist.Add("Принтер чеков: перегрев"); } if (tmptele.KKTPrinterPaperJammed) { warnlist.Add("Принтер чеков: замятие бумаги"); } if (tmptele.KKTPrinterPaperEnding) { warnlist.Add("Принтер чеков: бумага кончается"); } if (tmptele.KKTStageOver24h) { warnlist.Add("Длительность смены превысила 24 часа"); } if (tmptele.VMCMode == "4" || tmptele.VMCMode == "5") { warnlist.Add("Режим продаж неактивен"); } if (tmptele.IncassoSum > 3000) { warnlist.Add("Рекомендуется проведение инкасации (сумма больше 3000)"); } if (tmptele.BABillsCount > 300) { warnlist.Add("Рекомендуется проведение инкасации (купюроприемник близок к заполнению)"); } if (tmptele.CC10RURCount < 20 || tmptele.CC5RURCount < 20 || tmptele.CC2RURCount < 20 || tmptele.CC1RURCount < 20) { warnlist.Add("Монетоприемник недостаточно заполнен"); } if (tmptele.WaterTempCelsius < 4) { warnlist.Add("Критически низкая температура воды"); } inboxtempcell.Text = tmptele.InboxTempCelsius.ToString("N2"); if (tmptele.InboxTempCelsius > 50) { warnlist.Add("Критически высокая температура устройства, возможны сбои в работе"); } ambienttempcell.Text = tmptele.AmbientTempCelsius.ToString("N2"); ambienthumcell.Text = tmptele.AmbientRelativeHumidity.ToString("N2"); if (tmptele.AmbientRelativeHumidity > 70) { warnlist.Add("Критически высокая влажность внутри торгового автомата"); } waterlevelcell.Text = tmptele.WaterLevelPercent.ToString(); if (tmptele.WaterLevelPercent < 20) { warnlist.Add("Низкий уровень воды"); } if (tmptele.MDBInitStep != 5) { warnlist.Add("Устройства приема наличных не готовы"); } if (deviceinfopanel.Visible) { //заполняем таблицу информации об устройстве regdtcell.Text = tmpdev.RegistrationDateTimeStr; addresslink.Text = tmpdev.LocationAddress; addresslink.NavigateUrl = "/User/ChangeDeviceAddress.aspx?wvdid=" + wvdid.ToString(); devproductnamecell.Text = tmpdev.ProductName; devcontactphonecell.Text = tmpdev.CustomerServiceContactPhone; taxsystemtypecell.Text = tmpdev.TaxSystemType.ToString(); devpricecell.Text = tmpdev.PRICE_PER_ITEM_MDE.ToString(); totalhourscell.Text = tmptele.TotalHoursWorked.ToString("N2"); wccell.Text = tmptele.TotalLitersDIspensed.ToString("N2"); lastseendatetimecell.Text = tmptele.DateTimeStr; vmcmodecell.Text = tmptele.VMCMode; softversioncell.Text = tmptele.ProgramVersion; } if (cashinfopanel.Visible) { //заполняем таблицу текущих итогов devtotalsum.Text = (tmptele.CCSum + tmptele.IncassoSum).ToString("N2"); incassocell.Text = tmptele.IncassoSum.ToString("N2"); //заполняем таблицу состояния монетоприемника cc10cell.Text = tmptele.CC10RURCount.ToString(); cc5cell.Text = tmptele.CC5RURCount.ToString(); cc2cell.Text = tmptele.CC2RURCount.ToString(); cc1cell.Text = tmptele.CC1RURCount.ToString(); //заполняем таблицу инкассаций last100incassotable.Rows.Clear(); var waterincassos = dc.WaterDeviceIncasso.Where(x => x.WaterDeviceID == tmpdev.ID).OrderByDescending(y => y.ID).Take(100); foreach (var item in waterincassos) { TableRow newtablerow = new TableRow { HorizontalAlign = HorizontalAlign.Center, VerticalAlign = VerticalAlign.Middle }; TableCell datetimecell = new TableCell { Width = 200, Text = item.IncassoDatetimeStr }; TableCell cashboxcoins = new TableCell { Width = 275, Text = item.IncassoCashboxCoins.ToString() + "\\" + item.IncassoCashboxSum.ToString("N2") }; TableCell babillscell = new TableCell { Width = 275, Text = item.IncassoBABills.ToString() + "\\" + item.IncassoBASum.ToString("N2") }; newtablerow.Cells.AddRange(new TableCell[] { datetimecell, cashboxcoins, babillscell }); last100incassotable.Rows.Add(newtablerow); } //если таблица не пустая, показываем ее last100incassodiv.Visible = (last100incassotable.Rows.Count > 0); } if (devicesettingspanel.Visible) { //заполняем таблицу индивидуальных настроек rcptprodnamecell.Text = tmpdev.ProductName; phonecell.Text = tmpdev.CustomerServiceContactPhone; pricecell.Text = tmpdev.PRICE_PER_ITEM_MDE.ToString(); taxsystemcell.Text = tmpdev.TaxSystemType.ToString(); tankheigthcell.Text = tmpdev.WaterTankHeigthcm.ToString(); watersensoraddresscell.Text = String.Join(String.Empty, Array.ConvertAll(tmpdev.WaterTempSensorAddress, x => x.ToString("X2"))); usekktcell.SelectedValue = tmpdev.UseKKT ? "1" : "0"; devicesettingsversioncell.Text = tmpdev.SettingsVersion.ToString(); } if (devcomponentspanel.Visible) { //заполняем таблицу периферийных устройств watertempcell.Text = tmptele.WaterTempCelsius.ToString("N2"); string heaterstatestring = "Нет"; string xtltstatestring = "Нет"; string fillpumpstatestring = "Нет"; if (tmptele.IsHeaterOn) { heaterstatestring = "Да"; } if (tmptele.IsExternalLightOn) { xtltstatestring = "Да"; } if (tmptele.IsFillPumpSocketActive) { fillpumpstatestring = "Да"; } heateroncell.Text = heaterstatestring; xtltoncell.Text = xtltstatestring; fillpumponcell.Text = fillpumpstatestring; kktmfgnumbercell.Text = tmptele.KKTMfgNumber; kktmodecell.Text = BitConverter.ToString(new byte[] { (byte)tmptele.KKTCurrentMode }); string kktstageopenedstr = "Нет"; string kktstageover24hstr = "Нет"; string kktprnconnectedstr = "Нет"; string kktprnpaperemptystr = "Нет"; string kktprnctirerrorstr = "Нет"; string kktprncuttererrorstr = "Нет"; string kktprnoverheatstr = "Нет"; string kktprnpaperjammedstr = "Нет"; string kktprnpaperendingstr = "Нет"; string kktreceiptopenedstr = "Нет"; if (tmptele.KKTPrinterConnected) { kktprnconnectedstr = "Да"; } if (tmptele.KKTPrinterPaperEmpty) { kktprnpaperemptystr = "Да"; } if (tmptele.KKTPrinterNonRecoverableError) { kktprnctirerrorstr = "Да"; } if (tmptele.KKTPrinterCutterError) { kktprncuttererrorstr = "Да"; } if (tmptele.KKTPrinterOverHeated) { kktprnoverheatstr = "Да"; } if (tmptele.KKTPrinterPaperJammed) { kktprnpaperjammedstr = "Да"; } if (tmptele.KKTPrinterPaperEnding) { kktprnpaperendingstr = "Да"; } if (tmptele.KKTStageOpened) { kktstageopenedstr = "Да"; } if (tmptele.KKTStageOver24h) { kktstageover24hstr = "Да"; } if (tmptele.KKTReceiptOpened) { kktreceiptopenedstr = "Да"; } kktstageopenedcell.Text = kktstageopenedstr; kktstageover24hcell.Text = kktstageover24hstr; kktprinterconnectedcell.Text = kktprnconnectedstr; kktprinterpaperemptycell.Text = kktprnpaperemptystr; kktprinterpaperendingcell.Text = kktprnpaperendingstr; kktprintercuttererrorcell.Text = kktprncuttererrorstr; kktprinteroverheatcell.Text = kktprnoverheatstr; kktprinterpaperjammedcell.Text = kktprnpaperjammedstr; kktprintererrorcell.Text = kktprnctirerrorstr; kktstagenumbercell.Text = tmptele.KKTStageNumber; kktsreceiptopenedcell.Text = kktreceiptopenedstr; kktstagecloseddatetimecell.Text = tmptele.LastStageClosedDateTimeStr; kktnextreceiptnumbercell.Text = tmptele.KKTReceiptNextNumber.ToString(); mdbinitstepcell.Text = tmptele.MDBInitStep.ToString(); } } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } finally { warnpanel.Controls.Clear(); if (warnlist.Count > 0) { Label caplabel = new Label(); caplabel.Text = "Предупреждения: "; caplabel.Font.Bold = true; caplabel.Font.Name = "Arial"; caplabel.Font.Size = 14; caplabel.ForeColor = System.Drawing.Color.Black; warnpanel.Controls.Add(caplabel); warnpanel.Controls.Add(new LiteralControl("<br>")); foreach (var item in warnlist) { Label newlabel = new Label(); newlabel.Text = item; newlabel.Font.Bold = true; newlabel.Font.Name = "Arial"; newlabel.Font.Size = 13; newlabel.ForeColor = System.Drawing.Color.Black; warnpanel.Controls.Add(newlabel); warnpanel.Controls.Add(new LiteralControl("<br>")); } devwarningpanel.Visible = true; } if (globalmenuitemhandler != null) { } } } } }
protected void AccountMenu_MenuItemClick(object sender, MenuEventArgs e) { globalmenuitemhandler = e.Item; if (globalmenuitemhandler.Value != "licence") { licpanel.Visible = false; } switch (globalmenuitemhandler.Value) { case "licence": { licpanel.Visible = true; break; } case "mydevlist": { using (VendingModelContainer dc = new VendingModelContainer()) { Accounts tmpacc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name); List <WaterDevices> tmpdevlist = dc.WaterDevices.Where(x => x.AccountID == tmpacc.ID).ToList(); for (int i = 0; i < tmpdevlist.Count; i++) { try { WaterDevices tmpdev = tmpdevlist[i]; WaterDeviceTelemetry tmpdevtelemetry = dc.WaterDeviceTelemetry.Where(x => x.WaterDeviceID == tmpdev.ID).OrderByDescending(y => y.DateTime).First(); TableRow devtablerow = new TableRow(); if (i % 2 == 1) { devtablerow.BackColor = System.Drawing.Color.FromArgb(0x53, 0x00, 0xA6); } else { devtablerow.BackColor = System.Drawing.Color.FromArgb(0x00, 0x00, 0x99); } devtablerow.Height = 60; TableCell devidcell = new TableCell(); devidcell.Width = 100; devidcell.Height = 60; devidcell.HorizontalAlign = HorizontalAlign.Center; devidcell.VerticalAlign = VerticalAlign.Middle; devidcell.Text = "<a href=\"/User/WaterDeviceInfo.aspx?wvdid=" + tmpdev.ID.ToString() + "\">" + tmpdev.ID.ToString() + "</a>"; TableCell adresscell = new TableCell(); adresscell.Width = 390; adresscell.Height = 60; adresscell.HorizontalAlign = HorizontalAlign.Center; adresscell.VerticalAlign = VerticalAlign.Middle; adresscell.Text = tmpdev.LocationAddress; TableCell onlinecell = new TableCell(); onlinecell.Width = 60; onlinecell.Height = 60; onlinecell.HorizontalAlign = HorizontalAlign.Center; onlinecell.VerticalAlign = VerticalAlign.Middle; DateTime lastlogdt = DateTime.ParseExact(tmpdevtelemetry.DateTime.ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture); if (lastlogdt.AddMinutes(5) < DateTime.Now) { onlinecell.Text = string.Format("<img src=\"/images/disconnected-64.png\" />"); } else { onlinecell.Text = string.Format("<img src='/images/connected-64.png' />"); } TableCell statuscell = new TableCell(); statuscell.Width = 70; statuscell.Height = 60; statuscell.HorizontalAlign = HorizontalAlign.Center; statuscell.VerticalAlign = VerticalAlign.Middle; if (tmpdevtelemetry.KKTPrinterNonRecoverableError || tmpdevtelemetry.KKTPrinterPaperEnding || tmpdevtelemetry.KKTPrinterPaperJammed || tmpdevtelemetry.KKTPrinterPaperEmpty || tmpdevtelemetry.KKTPrinterCutterError || tmpdevtelemetry.KKTStageOver24h || tmpdevtelemetry.WaterLevelPercent < 20 || tmpdevtelemetry.BABillsCount > 300 || tmpdevtelemetry.WaterTempCelsius < 4 || tmpdevtelemetry.CC10RURCount < 20 || tmpdevtelemetry.CC5RURCount < 20 || tmpdevtelemetry.CC2RURCount < 20 || tmpdevtelemetry.CC1RURCount < 20 || tmpdevtelemetry.VMCMode != "1" || tmpdevtelemetry.MDBInitStep != 5 || tmpdevtelemetry.KKTCurrentMode != 1) { statuscell.Text = string.Format("<img src=\"/images/warning.png\" />"); } else { statuscell.Text = string.Format("<img src='/images/OK.png' />"); } TableCell incassosumcell = new TableCell(); incassosumcell.Width = 120; incassosumcell.Height = 60; incassosumcell.HorizontalAlign = HorizontalAlign.Center; incassosumcell.VerticalAlign = VerticalAlign.Middle; incassosumcell.Text = tmpdevtelemetry.IncassoSum.ToString(); TableCell totalsumcell = new TableCell(); totalsumcell.Width = 120; totalsumcell.Height = 60; totalsumcell.HorizontalAlign = HorizontalAlign.Center; totalsumcell.VerticalAlign = VerticalAlign.Middle; totalsumcell.Text = (tmpdevtelemetry.IncassoSum + tmpdevtelemetry.CCSum).ToString(); devtablerow.Cells.AddRange(new TableCell[] { devidcell, adresscell, onlinecell, statuscell, incassosumcell, totalsumcell }); devlist.Rows.Add(devtablerow); } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } } } devlistpanel.Visible = true; break; } case "exit": { //vmcpanel.Visible = true; FormsAuthentication.SignOut(); using (VendingModelContainer dc = new VendingModelContainer()) { try { Accounts tmpacc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name); Logger.AccountLog(Request.UserHostAddress, "Выход из системы", "", tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Выход из системы", tmpacc.UserID, "Server"); } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } } Response.Redirect("~/Login.aspx"); break; } } }
public bool DecryptVerifyDeviceLog(string encryptedrequest, string signature, string adata, string bdata, out WaterDeviceTelemetry outlogentry) { byte[] encryptedrequestbytes = Convert.FromBase64String(encryptedrequest); byte[] signaturebytes = Convert.FromBase64String(signature); byte[] encryptedaeskeybytes = Convert.FromBase64String(adata); byte[] encryptedivbytes = Convert.FromBase64String(bdata); bool signcorrect = false; try { //инициализируем криптодвижок для расшифровки CspParameters cspParams = new CspParameters { ProviderType = 1 }; RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams); rsaProvider.ImportCspBlob(PrivateKey); //расшифровываем симметричный ключ и вектор инициализации byte[] AESKeyBytes = rsaProvider.Decrypt(encryptedaeskeybytes, false); byte[] AESIVBytes = rsaProvider.Decrypt(encryptedivbytes, false); 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(); } } WaterDeviceTelemetry tmplog = Deserialize <WaterDeviceTelemetry>(plaintext); //инициализируем криптодвижок для проверки подписи присланных данных rsaProvider = new RSACryptoServiceProvider(); using (VendingModelContainer dc = new VendingModelContainer()) { var devicestable = dc.WaterDevices; rsaProvider.ImportCspBlob(devicestable.First(x => x.ID == tmplog.WaterDeviceID).PublicKey); } signcorrect = rsaProvider.VerifyData(Encoding.UTF8.GetBytes(plaintext), CryptoConfig.MapNameToOID("SHA512"), signaturebytes); outlogentry = tmplog; } catch { outlogentry = null; } return(signcorrect); }