Exemple #1
0
        public async Task <IEnumerable <LoginEntry> > GetLoginEntriesAsync(string username)
        {
            await Context.LogDebugAsync($"Attempting login for {username}");

            return(await DatabaseInstance.GetInstance().RunInTransactionAsync(db =>
                                                                              db
                                                                              // Find the users
                                                                              .Select <Database.User>(x =>
                                                                                                      !x.Disabled
                                                                                                      &&
                                                                                                      string.Equals(x.Email, username, StringComparison.OrdinalIgnoreCase)
                                                                                                      )
                                                                              // Convert to authentication format
                                                                              .Select(x => new LoginEntry()
            {
                UserID = x.ID,
                Username = x.Name,
                Token = x.Password
            })
                                                                              // Force in-memory serialization
                                                                              .ToArray()
                                                                              // Return as enumerable (backed by array)
                                                                              .AsEnumerable()
                                                                              ));
        }
 private void UpdateParametersOID()
 {
     AlgParSetOIDComboBox.DataSource = DatabaseInstance.GetInstance().AlgParSets
                                       .Where(elm => elm.Len_AlgParSet.Value_Len == GetParametersLen())
                                       .Select(elm => elm.OID_AlgParSet)
                                       .ToList();
 }
 private void UpdateUserRegion()
 {
     SubjRegionComboBox.DataSource = DatabaseInstance.GetInstance().Regions
                                     .Include(elm => elm.Country_Region)
                                     .Where(elm => elm.Country_Region.Name_Country == GetUserCountry())
                                     .Select(elm => elm.Name_Region)
                                     .ToList();
 }
 private void UpdateUserCity()
 {
     SubjCityComboBox.DataSource = DatabaseInstance.GetInstance().Cities
                                   .Include(elm => elm.Region_City)
                                   .Where(elm => elm.Region_City.Name_Region == GetUserRegion())
                                   .Select(elm => elm.Name_City)
                                   .ToList();
 }
Exemple #5
0
        /// <summary>
        /// Activates a user
        /// </summary>
        /// <param name="id">The signup request ID</param>
        /// <returns>An awaitable task</returns>
        internal static async Task ActivateUser(string id)
        {
            // Create the activation request
            var req = await DatabaseInstance.GetInstance().RunInTransactionAsync(db => {
                var sr = db.SelectItemById <Database.Signup.SignupEntry>(id);
                if (sr == null)
                {
                    throw new ArgumentException($"No such signup request: {id}");
                }

                var ar = db.SelectSingle <Database.ActivationRequest>(x => x.SignupID == id);
                if (ar != null)
                {
                    if (DateTime.Now - ar.LastSent < TimeSpan.FromMinutes(15))
                    {
                        Ceen.Context.LogInformationAsync($"Not sending new activation email to {id} as the previous one was sent {ar.LastSent}");
                        return(null);
                    }
                    else
                    {
                        ar.LastSent = DateTime.Now;
                        db.UpdateItem(ar);
                    }
                }
                else
                {
                    ar = db.InsertItem(new Database.ActivationRequest()
                    {
                        SignupID = id,
                        Token    = Services.PasswordPolicy.GenerateActivationCode(),
                        LastSent = DateTime.Now
                    });
                }

                return(new {
                    Name = sr.Name,
                    Email = sr.Email,
                    ID = ar.ID,
                    Locale = sr.Locale
                });
            });

            if (req == null)
            {
                return;
            }

            await Queues.SendActivationEmailAsync(req.Name, req.Email, req.ID, req.Locale);
        }
Exemple #6
0
        /// <summary>
        /// Gets the number of signup emails sent by the current requester within the given period
        /// </summary>
        /// <returns>The count</returns>
        private static async Task <long> GetSignupEmailsSentByIPAsync()
        {
            if (DatabaseInstance.Current == null)
            {
                return(await DatabaseInstance.GetInstance().RunInTransactionAsync(db => GetSignupEmailsSentByIPAsync()));
            }

            var requestIP = ExtensionUtility.RemoteIP;

            return(DatabaseInstance.Current.SelectCount <Database.SentEmailLog>(
                       x =>
                       (x.When > DateTime.Now - LOOKBACK_PERIOD) &&
                       (x.Type == Database.EmailType.SignupConfirmation) &&
                       (x.Delivered == true) &&
                       (x.RequestIP == requestIP)
                       ));
        }
        private static bool UpdateByValidTime(Cert certificate)
        {
            var time = DateTime.Now;

            if (certificate.ValidBy_Cert < time)
            {
                DatabaseInstance.GetInstance().Certs.Remove(certificate);
                DatabaseInstance.GetInstance().CancelledCerts.Add(new CancelledCert(certificate));
                foreach (var cert in DatabaseInstance.GetInstance().Certs.Where(elm => elm.SignSerialNumber_Cert == certificate.SerialNumber_Cert).AsEnumerable())
                {
                    DatabaseInstance.GetInstance().Certs.Remove(cert);
                    DatabaseInstance.GetInstance().CancelledCerts.Add(new CancelledCert(cert));
                }
                DatabaseInstance.GetInstance().SaveChanges();
                return(true);
            }
            return(false);
        }
        public static byte[] GetSignedCertificate(AlgParSet parameters, Subj subj)
        {
            X509Certificate root = new X509CertificateParser().ReadCertificate(GetRootCertificate());
            Cert            data = CreateDatabaseInfoFromCertificate(root);

            var    keys   = GenerateKeyPair(parameters);
            string serial = string.Empty;

            do
            {
                serial = BigIntegers.CreateRandomBigInteger(512, new SecureRandom()).ToString();
            }while (DatabaseInstance.GetInstance().Certs.FirstOrDefault(elm => elm.SerialNumber_Cert == serial) != null);

            Cert certificate = new Cert
            {
                Ver_Cert     = DatabaseInstance.GetInstance().Vers.FirstOrDefault(),
                SignAlg_Cert = new SignAlg
                {
                    AlgParSet_SignAlg  = parameters,
                    PrivateKey_SignAlg = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keys.Private).ToAsn1Object().GetEncoded(),
                    PublicKey_SignAlg  = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keys.Public).ToAsn1Object().GetEncoded()
                },
                Issuer_Cert           = data.Issuer_Cert,
                Subj_Cert             = subj,
                SerialNumber_Cert     = serial,
                ValidFrom_Cert        = DateTime.Now,
                ValidBy_Cert          = DateTimeOffset.Now.AddYears(5).UtcDateTime,
                SignSerialNumber_Cert = data.SerialNumber_Cert
            };

            var cert = CreateCertificateFromDatabaseInfo(certificate);

            certificate.SignValue_Cert = string.Join("", BitConverter.ToString(cert.GetSignature()).Split('-'));

            DatabaseInstance.GetInstance().Certs.Add(certificate);
            DatabaseInstance.GetInstance().SaveChanges();

            return(cert.GetEncoded());
        }
 private void CountryViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().Countries.Load();
     CountriesDataGrid.DataSource = DatabaseInstance.GetInstance().Countries.Local.ToBindingList();
 }
 private void SaveButton_Click(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().SaveChanges();
     CountriesDataGrid.Refresh();
 }
        private void CreateButton_Click(object sender, EventArgs e)
        {
            bool hasError = false;

            DebugRichTextBox.Text = "";


            m_Subject.Surname_Subj = GetUserSurname();
            if (m_Subject.Surname_Subj.Length == 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user name!" + Environment.NewLine;
            }

            m_Subject.Name_Subj = GetUserName();
            if (m_Subject.Name_Subj.Length == 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user name!" + Environment.NewLine;
            }

            m_Subject.BirthDate_Subj = GetUserBirthDate();

            m_Subject.Phone_Subj = GetUserPhone();
            if (m_Subject.Phone_Subj.Length == 0 || m_Subject.Phone_Subj.Count(elm => elm < '0' || elm > '9') > 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user phone!" + Environment.NewLine;
            }

            m_Subject.EMail_Subj = GetUserEMail();
            if (m_Subject.EMail_Subj.Length == 0 ||
                m_Subject.EMail_Subj.Count(elm => elm == '@') == 0 || m_Subject.EMail_Subj.Count(elm => elm == '@') > 1 ||
                m_Subject.EMail_Subj.Count(elm => elm == '.') == 0 || m_Subject.EMail_Subj.Count(elm => elm == '.') > 1 ||
                m_Subject.EMail_Subj.IndexOf('.') - m_Subject.EMail_Subj.IndexOf('@') < 2 ||
                m_Subject.EMail_Subj.IndexOf('.') == m_Subject.EMail_Subj.Length - 1)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user email!" + Environment.NewLine;
            }

            m_Subject.Gender_Subj = DatabaseInstance.GetInstance().Genders.FirstOrDefault(elm => elm.Name_Gender == GetUserGender());
            if (m_Subject.Gender_Subj == null)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user gender!" + Environment.NewLine;
            }

            m_Subject.Citizen_Subj = DatabaseInstance.GetInstance().Citizens.FirstOrDefault(elm => elm.Name_Citizen == GetUserCitizenship());
            if (m_Subject.Citizen_Subj == null)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user citizenship!" + Environment.NewLine;
            }

            m_Subject.City_Subj = DatabaseInstance.GetInstance().Cities.FirstOrDefault(elm => elm.Name_City == GetUserCity());
            if (m_Subject.City_Subj == null)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user city!" + Environment.NewLine;
            }

            m_Subject.PassportSerias_Subj = GetUserPassportSerials();
            if (m_Subject.PassportSerias_Subj.Length != 4 || m_Subject.PassportSerias_Subj.Count(elm => elm < '0' || elm > '9') > 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user passport serias!" + Environment.NewLine;
            }

            m_Subject.PassportNumber_Subj = GetUserPassportNumber();
            if (m_Subject.PassportNumber_Subj.Length != 6 || m_Subject.PassportNumber_Subj.Count(elm => elm < '0' || elm > '9') > 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user passport number!" + Environment.NewLine;
            }

            m_Subject.INN_Subj = GetUserINN();
            if (m_Subject.INN_Subj.Length != 12 || m_Subject.INN_Subj.Count(elm => elm < '0' || elm > '9') > 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user INN!" + Environment.NewLine;
            }

            m_Subject.SNILS_Subj = GetUserSNILS();
            if (m_Subject.SNILS_Subj.Length != 11 || m_Subject.SNILS_Subj.Count(elm => elm < '0' || elm > '9') > 0)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in user SNILS!" + Environment.NewLine;
            }

            m_AlgParSet = DatabaseInstance.GetInstance().AlgParSets
                          .Include(elm => elm.AlgName_AlgParSet)
                          .Include(elm => elm.HashType_AlgParSet)
                          .Include(elm => elm.Len_AlgParSet)
                          .FirstOrDefault(elm => elm.OID_AlgParSet == GetParametersOID());
            if (m_AlgParSet == null)
            {
                hasError = true;
                DebugRichTextBox.Text += "Error occured in parameters OID!" + Environment.NewLine;
            }

            if (!hasError)
            {
                var certificate = X509CertificateController.GetSignedCertificate(m_AlgParSet, m_Subject);

                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter           = "X509 Certificate|*.crt";
                saveFileDialog.FilterIndex      = 1;
                saveFileDialog.Title            = "Save a Certificate File";
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    Stream dataStream;
                    if ((dataStream = saveFileDialog.OpenFile()) != null)
                    {
                        dataStream.Write(certificate, 0, certificate.Length);
                        dataStream.Close();
                    }

                    X509CertificateParser parser = new X509CertificateParser();
                    DebugRichTextBox.Text = parser.ReadCertificate(certificate).ToString();
                }
            }
        }
 private void HashTypeViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().HashTypes.Load();
     HashTypeGridView.DataSource = DatabaseInstance.GetInstance().HashTypes.Local.ToBindingList();
 }
 private void RegionViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().Regions.Load();
     RegionsDataGrid.DataSource = DatabaseInstance.GetInstance().Regions.Local.ToBindingList();
 }
 private void CancelledCertViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().CancelledCerts.Load();
     CancelldCertGridView.DataSource = DatabaseInstance.GetInstance().CancelledCerts.Local.ToBindingList();
 }
 private void UpdateParametersSignatureAlgorithm()
 {
     AlgParSetSignatureComboBox.DataSource = DatabaseInstance.GetInstance().AlgNames
                                             .Select(elm => elm.Name_AlgName)
                                             .ToList();
 }
 private void UpdateParametersHashName()
 {
     AlgParSetHashComboBox.DataSource = DatabaseInstance.GetInstance().HashTypes
                                        .Select(elm => elm.Name_HashType)
                                        .ToList();
 }
 private void UpdateParametersKeyLength()
 {
     AlgParSetLenComboBox.DataSource = DatabaseInstance.GetInstance().Lens
                                       .Select(elm => elm.Value_Len.ToString())
                                       .ToList();
 }
 private void CityViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().Cities.Load();
     CityGridView.DataSource = DatabaseInstance.GetInstance().Cities.Local.ToBindingList();
 }
        /// <summary>
        /// Sends an activation request
        /// </summary>
        /// <param name="name">The recipient name</param>
        /// <param name="email">The recipient email</param>
        /// <param name="activationcode">The activation code</param>
        /// <param name="language">The language the message is sent in</param>
        /// <param name="requestIP">The IP requesting the signup email</param>
        /// <returns>An awaitable task</returns>
        public static async Task SendAsync(string name, string email, string activationcode, string language, string requestIP)
        {
            if (DatabaseInstance.Current != null)
            {
                throw new InvalidOperationException("Cannot send email from within a transaction scope");
            }

            var logEntry = new Database.SentEmailLog()
            {
                From      = EmailSignupSettings.FromEmail,
                To        = email,
                When      = DateTime.Now,
                Type      = Database.EmailType.ActivationEmail,
                Delivered = false,
                RequestIP = requestIP
            };

            var markdown = string.Empty;
            var subject  = string.Empty;

            // Insert the email log record
            await DatabaseInstance.GetInstance().RunInTransactionAsync(db =>
            {
                // Grab the subject and body at the same time
                markdown = Services.TextHelper.GetTextFromDb(db, TextConstants.ChangeEmailRequestBody, language);
                subject  = Services.TextHelper.GetTextFromDb(db, TextConstants.ChangeEmailRequestSubject, language);

                if (string.IsNullOrWhiteSpace(markdown))
                {
                    throw new DataException("Database is missing a template for the email body");
                }
                if (string.IsNullOrWhiteSpace(subject))
                {
                    throw new DataException("Database is missing a template for the email subject");
                }

                markdown = BasicTemplating.ReplaceInTemplate(markdown, new {
                    activationcode,
                    username = name
                });

                subject = BasicTemplating.ReplaceInTemplate(subject, new {
                    activationcode,
                    username = name
                });

                logEntry.Subject = subject;
                db.InsertItem(logEntry);
            });

            var text = MarkdownRenderer.RenderAsText(markdown);

            markdown = MarkdownRenderer.RenderAsHtml(markdown);

            // Deliver the email to the server
            await SparkPost.SendEmailAsync(SparkPost.Transmission.Create(
                                               EmailSignupSettings.FromName,
                                               EmailSignupSettings.FromEmail,
                                               name,
                                               email,
                                               subject,
                                               markdown,
                                               text,
                                               true
                                               ));

            // Record that we succeeded delivering the email to the server
            logEntry.Delivered = true;
            await DatabaseInstance.GetInstance().RunInTransactionAsync(db => db.UpdateItem(logEntry));
        }
 private void SaveButton_Click(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().SaveChanges();
     AlgParSetGridView.Refresh();
 }
 private void SubjectViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().Subjs.Load();
     SubjectsGridView.DataSource = DatabaseInstance.GetInstance().Subjs.Local.ToBindingList();
 }
Exemple #22
0
 /// <summary>
 /// Checks if the user is an admin
 /// </summary>
 /// <param name="userid">The ID of the user to check</param>
 /// <returns>A flag indicating if the user is admin</returns>
 public static Task <bool> IsAdminAsync(string userid)
 {
     return(DatabaseInstance.GetInstance().RunInTransactionAsync(db => db.IsAdmin(userid)));
 }
 private static Issuer GetCurrentCertificationAuthority()
 {
     return(DatabaseInstance.GetInstance().Issuers
            .Include(elm => elm.City_Issuer).ThenInclude(elm => elm.Region_City).ThenInclude(elm => elm.Country_Region)
            .FirstOrDefault());
 }
 private void UpdateUserGender()
 {
     SubjGenderComboBox.DataSource = DatabaseInstance.GetInstance().Genders
                                     .Select(elm => elm.Name_Gender)
                                     .ToList();
 }
        public static byte[] GetRootCertificate()
        {
            Issuer certificationAuthority = GetCurrentCertificationAuthority();

            if (certificationAuthority == null)
            {
                throw new Exception("Cannot find certification authority!");
            }

            var certificate = DatabaseInstance.GetInstance().Certs
                              .Include(elm => elm.Ver_Cert)
                              .Include(elm => elm.SignAlg_Cert).ThenInclude(elm => elm.AlgParSet_SignAlg).ThenInclude(elm => elm.AlgName_AlgParSet)
                              .Include(elm => elm.SignAlg_Cert).ThenInclude(elm => elm.AlgParSet_SignAlg).ThenInclude(elm => elm.HashType_AlgParSet)
                              .Include(elm => elm.SignAlg_Cert).ThenInclude(elm => elm.AlgParSet_SignAlg).ThenInclude(elm => elm.Len_AlgParSet)
                              .Include(elm => elm.Subj_Cert).ThenInclude(elm => elm.Gender_Subj)
                              .Include(elm => elm.Subj_Cert).ThenInclude(elm => elm.Citizen_Subj)
                              .Include(elm => elm.Subj_Cert).ThenInclude(elm => elm.City_Subj).ThenInclude(elm => elm.Region_City).ThenInclude(elm => elm.Country_Region)
                              .Include(elm => elm.Issuer_Cert).ThenInclude(elm => elm.City_Issuer).ThenInclude(elm => elm.Region_City).ThenInclude(elm => elm.Country_Region)
                              .FirstOrDefault(elm => elm.SerialNumber_Cert == elm.SignSerialNumber_Cert);

            if (certificate == null || !IsValid(CreateCertificateFromDatabaseInfo(certificate).GetEncoded()))
            {
                var par = DatabaseInstance.GetInstance().AlgParSets
                          .Include(elm => elm.Len_AlgParSet)
                          .Include(elm => elm.AlgName_AlgParSet)
                          .Include(elm => elm.HashType_AlgParSet)
                          .FirstOrDefault(elm => elm.Len_AlgParSet.Value_Len == 256);
                var    keys   = GenerateKeyPair(par);
                string serial = string.Empty;
                do
                {
                    serial = BigIntegers.CreateRandomBigInteger(512, new SecureRandom()).ToString();
                }while (DatabaseInstance.GetInstance().Certs.FirstOrDefault(elm => elm.SerialNumber_Cert == serial) != null);

                certificate = new Cert
                {
                    Ver_Cert     = DatabaseInstance.GetInstance().Vers.FirstOrDefault(),
                    SignAlg_Cert = new SignAlg
                    {
                        AlgParSet_SignAlg  = par,
                        PrivateKey_SignAlg = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keys.Private).ToAsn1Object().GetEncoded(),
                        PublicKey_SignAlg  = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keys.Public).ToAsn1Object().GetEncoded()
                    },
                    Issuer_Cert = certificationAuthority,
                    Subj_Cert   = new Subj
                    {
                        Surname_Subj        = "",
                        Name_Subj           = certificationAuthority.Name_Issuer,
                        BirthDate_Subj      = DateTime.Now,
                        Gender_Subj         = DatabaseInstance.GetInstance().Genders.FirstOrDefault(),
                        Citizen_Subj        = DatabaseInstance.GetInstance().Citizens.FirstOrDefault(),
                        City_Subj           = certificationAuthority.City_Issuer,
                        Phone_Subj          = certificationAuthority.Phone_Issuer,
                        EMail_Subj          = certificationAuthority.EMail_Issuer,
                        PassportSerias_Subj = "",
                        PassportNumber_Subj = "",
                        INN_Subj            = certificationAuthority.INN_Issuer,
                        SNILS_Subj          = ""
                    },
                    SerialNumber_Cert     = serial,
                    ValidFrom_Cert        = DateTime.Now,
                    ValidBy_Cert          = DateTimeOffset.Now.AddYears(5).UtcDateTime,
                    SignSerialNumber_Cert = serial
                };

                var cert = CreateCertificateFromDatabaseInfo(certificate);
                certificate.SignValue_Cert = string.Join("", BitConverter.ToString(cert.GetSignature()).Split('-'));

                DatabaseInstance.GetInstance().Certs.Add(certificate);
                DatabaseInstance.GetInstance().SaveChanges();

                return(cert.GetEncoded());
            }

            return(CreateCertificateFromDatabaseInfo(certificate).GetEncoded());
        }
 private void UpdateUserCitizenship()
 {
     SubjCitizenshipComboBox.DataSource = DatabaseInstance.GetInstance().Citizens
                                          .Select(elm => elm.Name_Citizen)
                                          .ToList();
 }
 private void AlgParSetViewForm_Load(object sender, EventArgs e)
 {
     DatabaseInstance.GetInstance().AlgParSets.Load();
     AlgParSetGridView.DataSource = DatabaseInstance.GetInstance().AlgParSets.Local.ToBindingList();
 }
 private void UpdateUserCountry()
 {
     SubjCountryComboBox.DataSource = DatabaseInstance.GetInstance().Countries
                                      .Select(elm => elm.Name_Country)
                                      .ToList();
 }