Ejemplo n.º 1
0
        /// <summary>
        /// Sends the SMS message so the user can be logged in
        /// </summary>
        /// <param name="smsMessage"></param>
        /// <param name="phoneNumber"></param>
        /// <param name="ipAddress"></param>
        /// <param name="delay"></param>
        public async void SendSMS(RockSMSMessage smsMessage, string phoneNumber, string ipAddress, double delay)
        {
            await Task.Delay(( int )delay);

            try
            {
                smsMessage.Send();
            }
            catch (Exception ex)
            {
                ExceptionLogService.LogException(ex);
            }
            SMSRecords.ReleaseItems(ipAddress, phoneNumber);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates the user login for the SMS message and send the text message with the code
        /// </summary>
        /// <param name="phoneNumber"></param>
        /// <returns></returns>
        public bool SendSMSAuthentication(string phoneNumber)
        {
            RockContext rockContext = new RockContext();

            string error;
            var    person = GetNumberOwner(phoneNumber, rockContext, out error);

            if (person == null)
            {
                return(false);
            }

            UserLoginService userLoginService = new UserLoginService(rockContext);
            var userLogin = userLoginService.Queryable()
                            .Where(u => u.UserName == ("SMS_" + person.Id.ToString()))
                            .FirstOrDefault();

            //Create user login if does not exist
            if (userLogin == null)
            {
                var entityTypeId = EntityTypeCache.Get("Rock.Security.ExternalAuthentication.SMSAuthentication").Id;

                userLogin = new UserLogin()
                {
                    UserName     = "******" + person.Id.ToString(),
                    EntityTypeId = entityTypeId,
                };
                userLoginService.Add(userLogin);
            }

            //Update user login
            userLogin.PersonId = person.Id;
            userLogin.LastPasswordChangedDateTime = Rock.RockDateTime.Now;
            userLogin.FailedPasswordAttemptWindowStartDateTime = Rock.RockDateTime.Now;
            userLogin.FailedPasswordAttemptCount = 0;
            userLogin.IsConfirmed = true;
            var password = new Random().Next(100000, 999999).ToString();

            userLogin.Password = EncodeBcrypt(password);
            rockContext.SaveChanges();

            var recipients = new List <RockSMSMessageRecipient>();

            recipients.Add(RockSMSMessageRecipient.CreateAnonymous(phoneNumber, null));

            var smsMessage = new RockSMSMessage
            {
                CreateCommunicationRecord = false
            };

            smsMessage.SetRecipients(recipients);

            // Get the From value
            Guid?fromGuid = GetAttributeValue("From").AsGuidOrNull();

            if (fromGuid.HasValue)
            {
                var fromValue = DefinedValueCache.Get(fromGuid.Value, rockContext);
                if (fromValue != null)
                {
                    smsMessage.FromNumber = DefinedValueCache.Get(fromValue.Id, rockContext);
                }
            }

            smsMessage.AdditionalMergeFields = new Dictionary <string, object> {
                { "password", password }
            };

            smsMessage.Message = GetAttributeValue("Message");

            var ipAddress = GetIpAddress();

            //Reserve items rate limits the text messages
            if (SMSRecords.ReserveItems(ipAddress, phoneNumber))
            {
                var delay = SMSRecords.GetDelay(ipAddress, phoneNumber);
                Task.Run(() => { SendSMS(smsMessage, ipAddress, phoneNumber, delay); });
            }
            else
            {
                ExceptionLogService.LogException(new Exception(string.Format("Rate limiting reached for SMS authentication: IP: {0} PhoneNumber: {1}", ipAddress, phoneNumber)));
            }


            return(true);
        }