protected void Page_Load(object sender, EventArgs e) { try { globalmenuitemhandler = DeviceMenu.SelectedItem; long tmpwvdid = Convert.ToInt64(Request.QueryString["wvdid"]); using (VendingModelContainer dc = new VendingModelContainer()) { 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 == tmpwvdid && x.AccountID == tmpacc.ID && x.Valid); wvdid = tmpdev.ID; } Title += wvdid.ToString(); if (!ScriptManager.GetCurrent(Page).IsInAsyncPostBack) { if (Request.Form.Count == 2) { successheadertext = Request.Form["successheadertext"]; successmsgtext = Request.Form["successmsgtext"]; } FillTablesWithData(); } } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } }
protected void Page_Load(object sender, EventArgs e) { using (VendingModelContainer dc = new VendingModelContainer()) { try { Accounts tmpacc = dc.Accounts.First(x => x.UserID == User.Identity.Name); if (tmpacc.UserID != WWWVars.AdminEmail) { Response.Redirect("~/User/User.aspx"); return; } if (tmpacc.TOTPSecret == "") { Response.Redirect("~/User/Setup2FA.aspx"); return; } if (!IsPostBack) { FillSummary(); FillUsersChart(); FillDevicesChart(); FillServerChart(); userschartupdatetimer.Enabled = true; } } catch { Response.Redirect("~/User/User.aspx"); return; } } }
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 changedevmodebutton_Click(object sender, EventArgs e) { using (VendingModelContainer dc = new VendingModelContainer()) { try { Accounts useracc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name && x.Valid && !x.Suspended); if (useracc.TOTPSecret != "") { changedevmodemsg.Text = "Новая команда: \"" + devmodecb.SelectedItem.Text + "\""; changedevmodebutton.Visible = false; changedevmodetotpbox.Visible = true; changedevmodetotp.Focus(); } else { changedevmodemsg.Text = "Учетная запись не настроена на двухфакторную авторизацию"; ScriptManager.RegisterClientScriptBlock((sender as Control), this.GetType(), "alert", "alert('Учетная запись не настроена на двухфакторную авторизацию.')", true); } } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); changedevmodemsg.Text = "Ошибка"; } } FillTablesWithData(); }
protected void Page_Load(object sender, EventArgs e) { using (VendingModelContainer dc = new VendingModelContainer()) { try { Accounts tmpacc = dc.Accounts.First(x => x.UserID == User.Identity.Name && x.Valid && !x.Suspended); if (tmpacc.UserID != WWWVars.AdminEmail) { Response.Redirect("~/User/User.aspx"); return; } if (tmpacc.TOTPSecret == "") { Response.Redirect("~/User/Setup2FA.aspx"); return; } LinqDataSource1.WhereParameters.Add(new Parameter("admemail", TypeCode.String, WWWVars.AdminEmail)); } catch (Exception ex) { Response.Redirect("~/User/User.aspx"); Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, "Server"); return; } } }
protected void Page_Load(object sender, EventArgs e) { Accounts useracc = null; using (VendingModelContainer dc = new VendingModelContainer()) { var useraccs = dc.Set <Accounts>(); useracc = useraccs.First(x => x.UserID == User.Identity.Name); } if (IsPostBack) { return; } if (useracc.TOTPSecret == "") { tfa = new TwoFactorAuth(WWWVars.SiteName); string secret = tfa.CreateSecret(160); totps.ImageUrl = tfa.GetQrCodeImageAsDataUri(User.Identity.Name, secret, 200); Session["totps"] = secret; twofasetupcompletebox.Visible = false; } else { twofasetupcompletebox.Visible = true; twofasetupbox.Visible = false; } }
protected void Unnamed1_Click(object sender, EventArgs e) { tfa = new TwoFactorAuth(WWWVars.SiteName); Accounts useracc = null; string userid = (string)Session["userid"]; using (VendingModelContainer dc = new VendingModelContainer()) { var useraccs = dc.Set <Accounts>(); useracc = useraccs.First(x => x.UserID == userid); } if (useracc.TOTPSecret != "" && totp.Text != null) { if (tfa.VerifyCode(useracc.TOTPSecret, totp.Text)) { Session["userid"] = ""; FormsAuthentication.RedirectFromLoginPage(useracc.UserID, false); Logger.AccountLog(Request.UserHostAddress, "Доступ предоставлен", "Введен правильный одноразовый код", useracc.ID); Logger.SystemLog(Request.UserHostAddress, "Доступ в систему предоставлен", useracc.UserID, "Server"); } else { totpmsg.Text = "Неверный одноразовый пароль"; loginbox.Visible = false; totpbox.Visible = true; Logger.AccountLog(Request.UserHostAddress, "Доступ запрещен", "Введен неправильный одноразовый код", useracc.ID); Logger.SystemLog(Request.UserHostAddress, "Ошибка: неверный одноразовый код", useracc.UserID, "Server"); } } }
public static void Refresh() { try { using (VendingModelContainer dc = new VendingModelContainer()) { WebSettings tmpws = dc.WebSettings.First(); AdminEmail = tmpws.AdminEmail; SiteName = tmpws.SiteName; ServerEndPoint = tmpws.ServerEndPoint; MailFromAddress = tmpws.MailFromAddress; EMailDisplayName = tmpws.EMailDisplayName; EMailDisplayName = tmpws.EMailDisplayName; RegDeviceMailSubject = tmpws.RegDeviceMailSubject; RegAccountMailSubject = tmpws.RegAccountMailSubject; MailUseSMTPAuth = tmpws.MailUseSMTPAuth; MailLogin = tmpws.MailLogin; MailPassword = tmpws.MailPassword; SMTPHost = tmpws.SMTPHost; SMTPPort = tmpws.SMTPPort; SMTPUseSSL = tmpws.SMTPUseSSL; BingMapsAPIKey = tmpws.BingMapsAPIKey; } } catch { } }
private void FillUsersChart() { DateTime cdt = DateTime.Now.AddDays(1).Date; DateTime lastyearstart = cdt.AddYears(-1).AddDays(-1); long startlastmonth = Convert.ToInt64(lastyearstart.ToString("yyyyMMddHHmmss")); DateTime tmpdt = lastyearstart; long cdtl = Convert.ToInt64(cdt.ToString("yyyyMMddHHmmss")); List <long> day_ranges = new List <long> { startlastmonth }; while (tmpdt < cdt) { tmpdt = tmpdt.AddDays(1); day_ranges.Add(Convert.ToInt64(tmpdt.ToString("yyyyMMddHHmmss"))); } using (VendingModelContainer dc = new VendingModelContainer()) { try { var totalaph = dc.Accounts.Where(x => x.RegistrationDateTime > startlastmonth) .GroupBy(y => day_ranges.FirstOrDefault(day_range => day_range >= y.RegistrationDateTime)) .Select(g => new { regdt = g.Key, count = g.Count() }).ToList(); userschart.ChartAreas[0].AxisX.Minimum = lastyearstart.ToOADate(); userschart.ChartAreas[0].AxisX.Maximum = cdt.AddDays(1).ToOADate(); for (int i = 0; i < totalaph.Count(); i++) { userschart.Series[0].Points.AddXY(DateTime.ParseExact(totalaph[i].regdt.ToString(), "yyyyMMddHHmmss", null).ToOADate(), totalaph[i].count); } } catch { } } }
protected void Page_Load(object sender, EventArgs e) { try { long tmpwvdid = Convert.ToInt64(Request.QueryString["wvdid"]); using (VendingModelContainer dc = new VendingModelContainer()) { Accounts tmpacc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name); WaterDevices tmpdev = dc.WaterDevices.First(x => x.ID == tmpwvdid && x.AccountID == tmpacc.ID); wvdid = tmpdev.ID; wvdidtext.Value = wvdid.ToString(); if (!Page.IsPostBack) { latitude.Value = tmpdev.LocationLatitude.ToString("N6").Replace(',', '.'); longtitude.Value = tmpdev.LocationLongtitude.ToString("N6").Replace(',', '.'); addressbox.Text = tmpdev.LocationAddress; } } Title += wvdid.ToString(); if (!ScriptManager.GetCurrent(Page).IsInAsyncPostBack) { } } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, "Server"); } }
protected void waitingrepeater_ItemCommand(object source, RepeaterCommandEventArgs e) { switch (e.CommandName) { case "Activate": { using (VendingModelContainer dc = new VendingModelContainer()) { try { string tmpuserid = ((Label)(e.Item.FindControl("email"))).Text; Accounts tmpacc = dc.Accounts.First(x => x.UserID == tmpuserid); tmpacc.Suspended = ((CheckBox)(e.Item.FindControl("suspendedcb"))).Checked; tmpacc.Valid = ((CheckBox)(e.Item.FindControl("activecb"))).Checked; tmpacc.DeviceCountLimit = Convert.ToInt32(((TextBox)(e.Item.FindControl("devlimit"))).Text); dc.SaveChanges(); if (tmpacc.DeviceCountLimit > 0) { AccLicense tmplic = new AccLicense(tmpacc.ID); } Logger.AccountLog(Request.UserHostAddress, "Акаунт активирован", "", tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Активация нового акаунта", tmpacc.UserID, User.Identity.Name); } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, "Server"); } } break; } case "DeleteAcc": { using (VendingModelContainer dc = new VendingModelContainer()) { try { string tmpuserid = ((Label)(e.Item.FindControl("email"))).Text; Accounts tmpacc = dc.Accounts.First(x => x.UserID == tmpuserid); dc.Accounts.Remove(tmpacc); dc.SaveChanges(); Logger.AccountLog(Request.UserHostAddress, "Акаунт удален", "", tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Удаление акаунта", tmpacc.UserID, User.Identity.Name); } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, "Server"); } } break; } } waitingrepeater.DataBind(); }
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 { } } }
protected void exitbutton_Click(object sender, EventArgs e) { 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 { } } FormsAuthentication.SignOut(); Response.Redirect("~/Login.aspx"); }
protected void Button1_Click(object sender, EventArgs e) { byte[] HashedPsssword = new byte[] { }; string passhash = ""; using (VendingModelContainer dc = new VendingModelContainer()) { try { var useraccs = dc.Set <Accounts>(); string userid = Request.Form["userid"]; string userpass = Request.Form["userpass"]; SHA512 shaM = new SHA512Managed(); HashedPsssword = shaM.ComputeHash(Encoding.UTF8.GetBytes(Request.Form["userpass"])); passhash = Convert.ToBase64String(HashedPsssword); cp3.ValidateCaptcha(captchatext.Text); captchatext.Text = ""; if (!cp3.UserValidated) { loginmsg.Text = "Введено некорректное значение числа с картинки"; Logger.AccountLog(Request.UserHostAddress, "Введено некорректное значение числа с картинки", "", -1); Logger.SystemLog(Request.UserHostAddress, "Ошибка: неверное значение числа с картинки", userid, "Server"); return; } Accounts useracc = useraccs.First(x => x.UserID == userid && x.PasswordHash == passhash && x.Valid && !x.Suspended); Logger.AccountLog(Request.UserHostAddress, "Введены верные учетные данные", "", useracc.ID); Logger.SystemLog(Request.UserHostAddress, "Введены верные учетные данные", useracc.UserID, "Server"); if (useracc.TOTPSecret != "") { Session["userid"] = userid; loginbox.Visible = false; totpbox.Visible = true; totp.Focus(); } else { FormsAuthentication.RedirectFromLoginPage(useracc.UserID, false); } } catch { loginmsg.Text = "Учетная запись не найдена или неактивна, либо введены неверные данные"; Logger.SystemLog(Request.UserHostAddress, "Ошибка: неверные учетные данные", (string)Session["userid"], "Server"); } } }
public CryptoHelper() { CryptoKeys tmpkeys; using (VendingModelContainer dc = new VendingModelContainer()) { try { tmpkeys = dc.CryptoKeys.FirstOrDefault(); PrivateKey = tmpkeys.PrivateKey; PublicKey = tmpkeys.PublicKey; } catch { } } }
protected void Page_Load(object sender, EventArgs e) { regdonebox.Visible = false; using (VendingModelContainer dc = new VendingModelContainer()) { try { if (dc.Accounts.Count() == 0) { ScriptManager.RegisterClientScriptBlock((sender as Control), this.GetType(), "alert", "alert('Сервер не настроен!')", true); regbox.Visible = false; } } catch { } } }
protected void Button1_Click(object sender, EventArgs e) { tfa = new TwoFactorAuth(WWWVars.SiteName); string totpsecret = ""; Accounts useracc = null; using (VendingModelContainer dc = new VendingModelContainer()) { var useraccs = dc.Set <Accounts>(); useracc = useraccs.First(x => x.UserID == User.Identity.Name); } totpsecret = (string)Session["totps"]; if (totpsecret != "" && (string)Request.Form["totp"] != null) { if (tfa.VerifyCode(totpsecret, (string)Request.Form["totp"])) { using (VendingModelContainer dc = new VendingModelContainer()) { try { var useraccs = dc.Set <Accounts>(); Accounts useracc2 = useraccs.First(x => x.UserID == User.Identity.Name); useracc2.TOTPSecret = (string)Session["totps"]; Session["totps"] = ""; dc.SaveChanges(); twofasetupbox.Visible = false; twofasetupcompletebox.Visible = true; Logger.AccountLog(Request.UserHostAddress, "Завершена настройка двухфакторной авторизации", "", useracc2.ID); Logger.SystemLog(Request.UserHostAddress, "Пользователь настроил двухфакторную авторизацию", useracc2.UserID, "Server"); } catch (Exception ex) { totpmsg.Text = "Произошла ошибка, попробуйте еще раз!"; Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } } } else { totpmsg.Text = "Неверный одноразовый пароль!"; } } }
protected void licdownloadbutton_Click(object sender, EventArgs e) { using (VendingModelContainer dc = new VendingModelContainer()) { try { Accounts tmpacc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name); Response.Clear(); Response.AddHeader("content-disposition", "attachment; filename=wvlicense.lic"); Response.AddHeader("content-type", "text/plain"); Response.Write(tmpacc.LicenseContent); Response.End(); } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } } }
public static void SystemLog(string ip, string eventtext, string description, string userid) { using (VendingModelContainer dc = new VendingModelContainer()) { try { DateTime cdt = DateTime.Now; string cdtstr = cdt.ToString("dd.MM.yyyy HH:mm:ss"); long cdtl = Convert.ToInt64(cdt.ToString("yyyyMMddHHmmss")); SystemLog tmplog = new SystemLog() { UserID = userid, DateTime = cdtl, DateTimeStr = cdtstr, IPAddress = ip, EventText = eventtext, Description = description }; dc.SystemLog.Add(tmplog); dc.SaveChanges(); } catch { } } }
protected void updatercptsettingsbutton_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.AccountID == tmpacc.ID && x.Valid); tmpdev.ProductName = rcptprodnamecell.Text; tmpdev.CustomerServiceContactPhone = phonecell.Text; tmpdev.PRICE_PER_ITEM_MDE = Convert.ToInt32(pricecell.Text); tmpdev.UseKKT = (usekktcell.SelectedValue == "1"); tmpdev.WaterTempSensorAddress = Enumerable.Range(0, watersensoraddresscell.Text.Length).Where(x => x % 2 == 0).Select(x => Convert.ToByte(watersensoraddresscell.Text.Substring(x, 2), 16)).ToArray(); tmpdev.TaxSystemType = Convert.ToInt32(taxsystemcell.Text); tmpdev.SettingsVersion++; dc.SaveChanges(); dbContextTransaction.Commit(); ScriptManager.RegisterClientScriptBlock((sender as Control), this.GetType(), "alert", "alert('Настройки печати чеков успешно обновлены, дождитесь обновления настроек на устройстве.')", true); rcptprodnamecell.Text = tmpdev.ProductName; phonecell.Text = tmpdev.CustomerServiceContactPhone; pricecell.Text = tmpdev.PRICE_PER_ITEM_MDE.ToString(); taxsystemcell.Text = tmpdev.TaxSystemType.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(); Logger.AccountLog(Request.UserHostAddress, "Обновлены настройки устройства №" + tmpdev.ID, "", tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Обновлены настройки устройства №" + tmpdev.ID, "", "Server"); } catch (Exception ex) { dbContextTransaction.Rollback(); Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, User.Identity.Name); } } } FillTablesWithData(); }
private void FillSummary() { using (VendingModelContainer dc = new VendingModelContainer()) { try { long lastcdt = Convert.ToInt64(DateTime.Now.AddMinutes(-5).ToString("yyyyMMddHHmmss")); long hcdt = Convert.ToInt64(DateTime.Now.AddHours(-1).ToString("yyyyMMddHHmmss")); totalaccslink.Text = dc.Accounts.Count().ToString(); suspendedaccslink.Text = dc.Accounts.Count(x => x.Suspended).ToString(); awaitingaccslink.Text = dc.Accounts.Count(x => x.Suspended && !x.Valid).ToString(); totaldevslink.Text = dc.WaterDevices.Count().ToString(); onlinedevslink.Text = dc.WaterDeviceTelemetry.Where(x => x.DateTime > lastcdt).Select(y => y.ID).Distinct().Count().ToString(); qphlink.Text = dc.WaterDeviceTelemetry.Count(x => x.DateTime > hcdt).ToString(); evphlink.Text = dc.SystemLog.Count(x => x.DateTime > hcdt).ToString(); errphlink.Text = dc.SystemLog.Count(x => x.DateTime > hcdt && x.EventText.Contains("ошибка")).ToString(); } catch (Exception ex) { } } }
/// <summary> /// Генерирует новую лицензию для учетной записи пользователя с указанным идентификатором /// </summary> /// <param name="AccID"></param> public AccLicense(long AccID) { using (VendingModelContainer dc = new VendingModelContainer()) { //using (var dbContextTransaction = dc.Database.BeginTransaction()) //{ try { Accounts tmpacc = dc.Accounts.First(x => x.ID == AccID); UserID = tmpacc.UserID; RegistrationDateTime = tmpacc.RegistrationDateTime; RegistrationDateTimeStr = tmpacc.RegistrationDateTimeStr; DeviceCountLimit = tmpacc.DeviceCountLimit; byte[] tmpuseridbytes = Encoding.UTF8.GetBytes(UserID); byte[] tmpregdtbytes = BitConverter.GetBytes(RegistrationDateTime); byte[] tmpregdtstrbytes = Encoding.UTF8.GetBytes(RegistrationDateTimeStr); byte[] tmpdevcountbytes = BitConverter.GetBytes(DeviceCountLimit); byte[] tmpendpointbytes = Encoding.UTF8.GetBytes(ServerEndPoint); byte[] tmpbytes = new byte[tmpuseridbytes.Length + tmpregdtbytes.Length + tmpregdtstrbytes.Length + tmpdevcountbytes.Length + tmpendpointbytes.Length]; Array.Copy(tmpuseridbytes, tmpbytes, tmpuseridbytes.Length); Array.Copy(tmpregdtbytes, 0, tmpbytes, tmpuseridbytes.Length, tmpregdtbytes.Length); Array.Copy(tmpregdtstrbytes, 0, tmpbytes, tmpuseridbytes.Length + tmpregdtbytes.Length, tmpregdtstrbytes.Length); Array.Copy(tmpdevcountbytes, 0, tmpbytes, tmpuseridbytes.Length + tmpregdtbytes.Length + tmpregdtstrbytes.Length, tmpdevcountbytes.Length); Array.Copy(tmpendpointbytes, 0, tmpbytes, tmpuseridbytes.Length + tmpregdtbytes.Length + tmpregdtstrbytes.Length + tmpdevcountbytes.Length, tmpendpointbytes.Length); CryptoHelper ch = new CryptoHelper(); Signature = ch.SignByteArray(tmpbytes); var xs = new XmlSerializer(GetType()); var xml = new Utf8StringWriter(); xs.Serialize(xml, this); tmpacc.LicenseContent = xml.ToString(); dc.SaveChanges(); } catch /*(Exception ex)*/ { } //} } }
protected void devaddressavebutton_Click(object sender, EventArgs e) { try { using (VendingModelContainer dc = new VendingModelContainer()) { Accounts tmpacc = dc.Accounts.First(x => x.UserID == HttpContext.Current.User.Identity.Name); WaterDevices tmpdev = dc.WaterDevices.First(x => x.ID == wvdid && x.AccountID == tmpacc.ID); string oldaddress = tmpdev.LocationAddress; tmpdev.LocationAddress = addressbox.Text; tmpdev.LocationLatitude = Math.Round(Convert.ToDecimal(latitude.Value.Replace('.', ',')), 6); tmpdev.LocationLongtitude = Math.Round(Convert.ToDecimal(longtitude.Value.Replace('.', ',')), 6); tmpdev.SettingsVersion++; dc.SaveChanges(); Response.Clear(); StringBuilder sb = new StringBuilder(); sb.Append("<html>"); sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>"); sb.AppendFormat("<form name='form' action='{0}' method='post'>", "/User/WaterDeviceInfo.aspx?wvdid=" + wvdid.ToString()); sb.AppendFormat("<input type='hidden' name='successheadertext' value='{0}'>", "Команда выполнена"); sb.AppendFormat("<input type='hidden' name='successmsgtext' value='{0}'>", "Адрес устройства успешно изменен"); // Other params go here sb.Append("</form>"); sb.Append("</body>"); sb.Append("</html>"); Response.Write(sb.ToString()); Response.End(); Logger.AccountLog(Request.UserHostAddress, "Изменен адрес устройства №" + wvdid.ToString(), "Старый адрес: " + oldaddress + Environment.NewLine + "Новый адрес: " + tmpdev.LocationAddress, tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Изменен адрес устройства №" + wvdid.ToString(), "", "Server"); //Response.Redirect("/User/WaterDeviceInfo.aspx?wvdid=" + wvdid.ToString()); } } catch (Exception ex) { Logger.SystemLog(Request.UserHostAddress, "Ошибка: " + ex.Message, ex.InnerException?.Message, "Server"); } }
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; } } }
private void FillServerChart() { DateTime cdt = DateTime.Now; cdt = cdt.Date.AddHours(cdt.Hour + 2); DateTime dtrangestart = cdt.AddDays(-3); long startlastmonth = Convert.ToInt64(dtrangestart.ToString("yyyyMMddHHmmss")); DateTime tmpdt = dtrangestart; long cdtl = Convert.ToInt64(cdt.ToString("yyyyMMddHHmmss")); List <long> hour_ranges = new List <long> { startlastmonth }; while (tmpdt < cdt) { tmpdt = tmpdt.AddHours(1); hour_ranges.Add(Convert.ToInt64(tmpdt.ToString("yyyyMMddHHmmss"))); } using (VendingModelContainer dc = new VendingModelContainer()) { try { serverchart.ChartAreas["DevTelemetryChartArea"].AxisX.Minimum = dtrangestart.ToOADate(); serverchart.ChartAreas["DevTelemetryChartArea"].AxisX.Maximum = cdt.ToOADate(); serverchart.ChartAreas["UserActionsChartArea"].AxisX.Minimum = dtrangestart.ToOADate(); serverchart.ChartAreas["UserActionsChartArea"].AxisX.Maximum = cdt.ToOADate(); serverchart.ChartAreas["ServerErrorsChartArea"].AxisX.Minimum = dtrangestart.ToOADate(); serverchart.ChartAreas["ServerErrorsChartArea"].AxisX.Maximum = cdt.ToOADate(); var telemetryph = dc.WaterDeviceTelemetry.Where(x => x.DateTime > startlastmonth) .GroupBy(y => hour_ranges.FirstOrDefault(hour_range => hour_range >= y.DateTime)) .Select(g => new { regdt = g.Key, count = g.Count() }).ToList(); for (int i = 0; i < telemetryph.Count(); i++) { serverchart.Series["telemetry"].Points.AddXY(DateTime.ParseExact(telemetryph[i].regdt.ToString(), "yyyyMMddHHmmss", null).ToOADate(), telemetryph[i].count); } var accounteventsph = dc.AccountLog.Where(x => x.DateTime > startlastmonth) .GroupBy(y => hour_ranges.FirstOrDefault(hour_range => hour_range >= y.DateTime)) .Select(g => new { regdt = g.Key, count = g.Count() }).ToList(); for (int i = 0; i < accounteventsph.Count(); i++) { serverchart.Series["user"].Points.AddXY(DateTime.ParseExact(accounteventsph[i].regdt.ToString(), "yyyyMMddHHmmss", null).ToOADate(), accounteventsph[i].count); } var errorsph = dc.SystemLog.Where(x => x.DateTime > startlastmonth && x.EventText.Contains("ошибка")) .GroupBy(y => hour_ranges.FirstOrDefault(hour_range => hour_range >= y.DateTime)) .Select(g => new { regdt = g.Key, count = g.Count() }).ToList(); for (int i = 0; i < errorsph.Count(); i++) { serverchart.Series["errors"].Points.AddXY(DateTime.ParseExact(errorsph[i].regdt.ToString(), "yyyyMMddHHmmss", null).ToOADate(), errorsph[i].count); } //добавляем по одной нулевой точке на каждый график, чтобы они гарантировано отобразились if (serverchart.Series["telemetry"].Points.Count == 0) { serverchart.Series["telemetry"].Points.AddXY(dtrangestart.AddHours(1).ToOADate(), 0); } if (serverchart.Series["user"].Points.Count == 0) { serverchart.Series["user"].Points.AddXY(dtrangestart.AddHours(1).ToOADate(), 0); } if (serverchart.Series["errors"].Points.Count == 0) { serverchart.Series["errors"].Points.AddXY(dtrangestart.AddHours(1).ToOADate(), 0); } } catch { } } }
protected void Page_Load(object sender, EventArgs e) { int res = 0; using (VendingModelContainer dc = new VendingModelContainer()) { using (var dbContextTransaction = dc.Database.BeginTransaction()) { 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 { memoryStream?.Dispose(); } List <WaterSales> saleslist = Deserialize <List <WaterSales> >(plaintext); var salestable = dc.WaterSales; var devicestable = dc.WaterDevices; //инициализируем криптодвижок для проверки подписи присланных данных rsaProvider = new RSACryptoServiceProvider(); long devregid = saleslist[0].WaterDeviceID; rsaProvider.ImportCspBlob(devicestable.First(x => x.ID == devregid).PublicKey); bool signcorrect = rsaProvider.VerifyData(Encoding.UTF8.GetBytes(plaintext), CryptoConfig.MapNameToOID("SHA512"), signaturebytes); if (signcorrect) { foreach (var item in saleslist) { salestable.Add(item); } dc.SaveChanges(); } //сохраняем изменения в БД dbContextTransaction.Commit(); res = saleslist.Count(); } catch /*(Exception ex)*/ { //что-то пошло не так, откатываем изменения в БД dbContextTransaction.Rollback(); } finally { Response.Write(res.ToString()); } } } }
protected void Page_Load(object sender, EventArgs e) { using (VendingModelContainer dc = new VendingModelContainer()) { using (var dbContextTransaction = dc.Database.BeginTransaction()) { try { long wvdid = Convert.ToInt64(Request.QueryString["wvdid"]); string prg = Request["prg"]; if (prg != null && wvdid != 0) { DateTime dt = DateTime.Now; //убиваем неподтвержденные заявки на регистрацию, которым больше 3 часов. кто не успел - тот опоздал, блять) long regrequestoldestdatetime = Convert.ToInt64(dt.AddHours(-3).ToString("yyyyMMddHHmmss")); dc.WaterDevices.RemoveRange(dc.WaterDevices.Where(x => x.RegistrationRequestDateTime < regrequestoldestdatetime)); long cdt = Convert.ToInt64(dt.ToString("yyyyMMddHHmmss")); string cdtstr = dt.ToString("dd.MM.yyyy HH:mm:ss"); WaterDevices tmpwd = dc.WaterDevices.Where(x => x.PendingRegistration && x.PendingRegistrationGUID == prg && x.ID == wvdid && !x.PendingRegConfirmed).First(); CryptoHelper ch = new CryptoHelper(); SHA512 sha512 = new SHA512Managed(); //вычисляем хеш открытого ключа устройства byte[] hash = sha512.ComputeHash(tmpwd.PublicKey); //подписываем хеш открытого ключа устройства и формируем ответ. В ответе указываем текущее распределение лицензий с учетом текущей Uri url = new Uri(Request.Url.Authority); string output = url.GetLeftPart(UriPartial.Authority); WaterDeviceRegistrationResponse authresp = new WaterDeviceRegistrationResponse { RegID = tmpwd.ID, ServerEndPoint = output }; authresp.Signature = Convert.ToBase64String(ch.SignHashedData(hash)); int activedevicescount = dc.WaterDevices.Where(x => x.AccountID == tmpwd.AccountID && x.Valid && !x.Suspended && !x.PendingRegistration).Count(); int pendingdevicescount = dc.WaterDevices.Where(x => x.AccountID == tmpwd.AccountID && x.Valid && !x.Suspended && x.PendingRegistration).Count(); Accounts tmpacc = dc.Accounts.Where(x => x.ID == tmpwd.AccountID && x.Valid && !x.Suspended).First(); authresp.AuthResponse = "SUCCESS " + (activedevicescount + 1).ToString() + "/" + (pendingdevicescount - 1).ToString() + "/" + tmpacc.DeviceCountLimit.ToString(); //Сериализуем объект авторизации в XML документ var xs = new XmlSerializer(authresp.GetType()); var xml = new Utf8StringWriter(); xs.Serialize(xml, authresp); tmpwd.RegistrationResponse = xml.ToString(); tmpwd.PendingRegistration = false; tmpwd.PendingRegConfirmationIP = Request.UserHostAddress; tmpwd.PendingRegConfirmed = true; tmpwd.PendingRegConfirmationDateTime = cdt; tmpwd.PendingRegConfirmationDateTimeStr = cdtstr; tmpwd.RegistrationDateTime = cdt; tmpwd.RegistrationDateTimeStr = cdtstr; dc.SaveChanges(); dbContextTransaction.Commit(); Logger.AccountLog(Request.UserHostAddress, "Подтверждение регистрации устройства №" + tmpwd.ID + " получено", tmpwd.HardwareID, tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Пользователь подтвердил регистрацию устройства №" + tmpwd.ID, tmpacc.UserID, "Server"); confirmresult.ForeColor = System.Drawing.Color.Lime; confirmresult.Text = "Подтверждение получено"; MailMessage mail = new MailMessage(); mail.To.Add(tmpacc.UserID); mail.From = new MailAddress(WWWVars.MailFromAddress, WWWVars.EMailDisplayName, Encoding.UTF8); mail.Subject = "Регистрация устройства завершена"; mail.SubjectEncoding = Encoding.UTF8; mail.Body = "Добрый день, уважаемый\\ая сэр\\мадам.<br>" + "<p>В системе успешно зарегистрировано новое устройство: <br>" + "Номер: " + tmpwd.ID.ToString() + "<br>" + "Идентификатор: " + tmpwd.PendingRegistrationGUID + "<br>" + "Для завершения регистрации устройство должно быть включено и подключено в Интернету.<br><p>" + "=======================================<br>" + "письмо сгенерировано автоматически, отвечать на него не нужно. Контакты для обратной связи см. на сайте: <br>" + output; mail.BodyEncoding = Encoding.UTF8; mail.IsBodyHtml = true; mail.Priority = MailPriority.High; SmtpClient client = new SmtpClient { UseDefaultCredentials = !WWWVars.MailUseSMTPAuth, Port = WWWVars.SMTPPort, Host = WWWVars.SMTPHost, EnableSsl = WWWVars.SMTPUseSSL, }; if (!client.UseDefaultCredentials) { client.Credentials = new System.Net.NetworkCredential(WWWVars.MailLogin, WWWVars.MailPassword); } client.Send(mail); Logger.AccountLog("Server", "Отправлено письмо с подтверждением регистрации устройства", tmpacc.UserID, tmpacc.ID); Logger.SystemLog("Server", "Отправлено письмо с подтверждением регистрации устройства", tmpacc.UserID, "Server"); } } catch (Exception ex) { confirmresult.ForeColor = System.Drawing.Color.Red; confirmresult.Text = "Ошибка: " + ex.HResult.ToString(); Logger.SystemLog(Request.UserHostAddress, "Ошибка при отправке письма с подтверждением регистрации устройства", ex.Message, "Server"); } } } }
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()) { using (var dbContextTransaction = dc.Database.BeginTransaction()) { Uri url = new Uri(Request.Url.Authority); string output = url.GetLeftPart(UriPartial.Authority); WaterDeviceRegistrationResponse authresp = new WaterDeviceRegistrationResponse { RegID = -1, ServerEndPoint = output }; 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 rawrequest = Request.Form["RegistrationRequest"]; byte[] bytes = Convert.FromBase64String(rawrequest); string requestxml = Encoding.UTF8.GetString(bytes); //создаем объект запроса регистрации WaterDeviceRegistrationRequest tmpreq = Deserialize <WaterDeviceRegistrationRequest>(requestxml); RSACryptoServiceProvider rsaProvider = null; CryptoHelper ch = new CryptoHelper(); //расшифровываем запрос byte[] plaintextbytes = ch.DecryptData(tmpreq.AuthorizationString); byte[] tmphwidbytes = new byte[] { }; byte[] tmpuidbytes = new byte[] { }; //делим массив данных на две части, разделитель byte[3] { 254, 11, 254 } for (int i = 0; i < plaintextbytes.Length; i++) { if (plaintextbytes[i] == 254 && plaintextbytes[i + 1] == 11 && plaintextbytes[i + 2] == 254) { Array.Resize(ref tmphwidbytes, i); Array.Copy(plaintextbytes, 0, tmphwidbytes, 0, tmphwidbytes.Length); Array.Resize(ref tmpuidbytes, plaintextbytes.Length - i - 3); Array.Copy(plaintextbytes, i + 3, tmpuidbytes, 0, tmpuidbytes.Length); break; } } //поля запроса: учетная запись и аппаратный идентификатор устройства string userid = Encoding.UTF8.GetString(tmpuidbytes); string hwid = Encoding.UTF8.GetString(tmphwidbytes); //инициализируем криптодвижок для проверки подписи присланных данных rsaProvider = new RSACryptoServiceProvider(); rsaProvider.ImportCspBlob(tmpreq.PublicKey); SHA512 sha512 = new SHA512Managed(); //вычисляем хеш присланных данных byte[] hash = sha512.ComputeHash(plaintextbytes); int activedevicescount; int pendingdevicescount; Accounts tmpacc; //проверяем подпись bool signcorrect = rsaProvider.VerifyData(plaintextbytes, CryptoConfig.MapNameToOID("SHA512"), tmpreq.AuthSignature); if (signcorrect) { //подпись корректна, ищем акаунт tmpacc = dc.Accounts.First(x => x.UserID == userid && x.Valid && !x.Suspended); activedevicescount = waterdevices.Where(x => x.AccountID == tmpacc.ID && x.Valid && !x.Suspended && !x.PendingRegistration).Count(); pendingdevicescount = waterdevices.Where(x => x.AccountID == tmpacc.ID && x.Valid && !x.Suspended && x.PendingRegistration).Count(); WaterDevices tmpdev = null; //пробуем найти акаунт с таким же аппаратным идентификатором, чтобы исключить дубликаты try { tmpdev = waterdevices.Where(x => x.HardwareID == hwid /* && x.AccountID == tmpacc.ID && x.Valid && !x.Suspended*/).First(); //если устройство нашлось и зарегистрировано, отсылаем содержимое лицензии if (!tmpdev.PendingRegistration) { authresp = Deserialize <WaterDeviceRegistrationResponse>(tmpdev.RegistrationResponse); } else //если устройство нашлось и ожидает регистрации { authresp.Signature = ""; authresp.AuthResponse = "OK_PENDING"; } } catch { } //если в базе нет устройства if (tmpdev == null) { //есть неиспользованные лицензии, формируем запись нового устройства if (activedevicescount < tmpacc.DeviceCountLimit) { WaterDevices newwaterdevice = new WaterDevices() { CustomerServiceContactPhone = tmpacc.DefaultContactPhone, HardwareID = hwid, AccountID = tmpacc.ID, LocationAddress = "", LocationLatitude = 0, LocationLongtitude = 0, ProductName = "Вода питьевая", PendingRegistration = true, PRICE_PER_ITEM_MDE = 500, PublicKey = tmpreq.PublicKey, RegistrationRequest = requestxml, Suspended = false, Valid = true, RegistrationDateTime = 0, RegistrationRequestDateTime = cdt, RegistrationDateTimeStr = "", RegistrationRequestDateTimeStr = cdtstr, RegistrationResponse = "", PendingRegistrationGUID = Guid.NewGuid().ToString(), PendingRegConfirmed = false, PendingRegConfirmationIP = "", PendingRegConfirmationDateTime = 0, PendingRegConfirmationDateTimeStr = "" }; //добавляем запись в БД waterdevices.Add(newwaterdevice); dc.SaveChanges(); Logger.AccountLog(Request.UserHostAddress, "Принята заявка на регистрацию нового устройства", newwaterdevice.HardwareID, tmpacc.ID); Logger.SystemLog(Request.UserHostAddress, "Регистрация нового устройства", tmpacc.UserID, "Server"); MailMessage mail = new MailMessage(); mail.To.Add(tmpacc.UserID); mail.From = new MailAddress(WWWVars.MailFromAddress, WWWVars.EMailDisplayName, Encoding.UTF8); mail.Subject = WWWVars.RegDeviceMailSubject; mail.SubjectEncoding = Encoding.UTF8; string confirmurl = output + "/User/ConfirmRegistration.aspx?wvdid=" + newwaterdevice.ID.ToString() + "&prg=" + newwaterdevice.PendingRegistrationGUID; mail.Body = "Добрый день, уважаемый\\ая сэр\\мадам.<br>" + "<p>В систему добавлена заявка на регистрацию нового устройства. Для подтверждения пройдите по ссылке ниже:<br>" + "<a href=\"" + confirmurl + "\">" + confirmurl + "</a><br>" + "<b><font color=\"red\">Внимание: Ссылка будет активной в течение 3 часов!<br> Если вы не завершите регистрацию до " + DateTime.Now.AddHours(3).ToString("dd.MM.yyyy HH:mm:ss") + ", процедуру регистрации необходимо будет повторить на устройстве с использованием файла лицензии.</font></b><br></p>" + "=======================================<br>" + "письмо сгенерировано автоматически, отвечать на него не нужно. Контакты для обратной связи см. на сайте: <br>" + output; mail.BodyEncoding = Encoding.UTF8; mail.IsBodyHtml = true; mail.Priority = MailPriority.High; SmtpClient client = new SmtpClient { UseDefaultCredentials = !WWWVars.MailUseSMTPAuth, Port = WWWVars.SMTPPort, Host = WWWVars.SMTPHost, EnableSsl = WWWVars.SMTPUseSSL, }; if (!client.UseDefaultCredentials) { client.Credentials = new System.Net.NetworkCredential(WWWVars.MailLogin, WWWVars.MailPassword); } client.Send(mail); authresp.AuthResponse = "OK_PENDING"; Logger.AccountLog("Server", "Отправлено электронное письмо о регистрации нового устройства", tmpacc.UserID, tmpacc.ID); Logger.SystemLog("Server", "Отправлено письмо о регистрации нового устройства", tmpacc.UserID, "Server"); } //превышен лимит лицензий, отказ регистрации else { authresp.Signature = ""; authresp.AuthResponse = "DENY_OVERQUOTA"; } } else //устройство уже есть в БД, ничего не делаем { } } else //подпись некорректна, отказ регистрации { authresp.Signature = ""; authresp.AuthResponse = "DENY_SIGNATURE_MISMATCH"; } //сохраняем изменения в БД dbContextTransaction.Commit(); } catch (Exception ex) { //что-то пошло не так, ошибка на любом этапе, прерываем регистрацию, откатываем изменения в БД if (ex.HResult != -2146233040) { dbContextTransaction.Rollback(); authresp.Signature = ""; authresp.AuthResponse = "ABORT CODE: " + ex.HResult.ToString(); Logger.SystemLog(Request.UserHostAddress, "Ошибка при регистрации устройства: " + ex.Message, "", "Server"); } } finally { //Сериализуем объект авторизации в XML документ var xs = new XmlSerializer(authresp.GetType()); var xml = new Utf8StringWriter(); xs.Serialize(xml, authresp); //переводим в массив байт, кодируем в Base64 для передачи по http byte[] xmlbytes = Encoding.UTF8.GetBytes(xml.ToString()); string xmlbytesbase64 = Convert.ToBase64String(xmlbytes); //отсылаем ответ устройству Response.Clear(); Response.Write(xmlbytesbase64); } } } }
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) { } } } } }