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);
     }
 }
Esempio n. 2
0
 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();
 }
Esempio n. 5
0
 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;
         }
     }
 }
Esempio n. 6
0
    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;
        }
    }
Esempio n. 7
0
    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");
            }
        }
    }
Esempio n. 8
0
 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
     {
     }
 }
Esempio n. 9
0
    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
            {
            }
        }
    }
Esempio n. 10
0
 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");
     }
 }
Esempio n. 11
0
    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
         {
         }
     }
 }
Esempio n. 13
0
 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");
 }
Esempio n. 14
0
    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");
            }
        }
    }
Esempio n. 15
0
    public CryptoHelper()
    {
        CryptoKeys tmpkeys;

        using (VendingModelContainer dc = new VendingModelContainer())
        {
            try
            {
                tmpkeys    = dc.CryptoKeys.FirstOrDefault();
                PrivateKey = tmpkeys.PrivateKey;
                PublicKey  = tmpkeys.PublicKey;
            }
            catch
            {
            }
        }
    }
Esempio n. 16
0
 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
         {
         }
     }
 }
Esempio n. 17
0
    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 = "Неверный одноразовый пароль!";
            }
        }
    }
Esempio n. 18
0
 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);
         }
     }
 }
Esempio n. 19
0
 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();
 }
Esempio n. 21
0
 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)
         {
         }
     }
 }
Esempio n. 22
0
 /// <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)*/
         {
         }
         //}
     }
 }
Esempio n. 23
0
 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");
     }
 }
Esempio n. 24
0
    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;
        }
        }
    }
Esempio n. 25
0
    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
            {
            }
        }
    }
Esempio n. 26
0
    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)
                    {
                    }
                }
            }
        }
    }