/// <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); }
/// <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); }