Exemple #1
0
        /// <summary>
        /// Save a refresh token
        /// Returns the refresh token id
        /// </summary>
        /// <param name="refreshToken"></param>
        /// <returns>Refresh token id</returns>
        public async Task <String> SaveRefreshTokenAsync(RefreshTokenModel refreshToken)
        {
            var refreshTokenId = Guid.NewGuid().ToString("n");

            _context.RefreshTokens.Add(new RefreshTokens
            {
                ClientId        = "notneeded",
                ExpiresUtc      = refreshToken.ExpiresUtc,
                IssuedUtc       = refreshToken.IssuedUtc,
                ProtectedTicket = refreshToken.AccessToken,
                Subject         = refreshToken.Subject,
                TokenIdHash     = CryptoMethods.GetSHA512Hash(refreshTokenId)
            });
            await _context.SaveChangesAsync();

            return(refreshTokenId);
        }
Exemple #2
0
        public async Task <IActionResult> UpdateAccount([FromBody] AdminModel model)
        {
            try
            {
                var(firstname, lastname) = Utils.SplitFullname(model.Fullname);
                var admin = await _context.Admins.SingleOrDefaultAsync(o => o.AdminId == Convert.ToInt32(User.Identity.Name));

                admin.Firstname   = firstname;
                admin.Lastname    = lastname;
                admin.Email       = model.EmailAddress;
                admin.Phonenumber = Phonenumber.Parse(model.Phonenumber);
                await _context.SaveChangesAsync();

                return(Ok(admin.AdminId));
            }
            catch (DbUpdateException ex) when(ex.InnerException is SqlException sqlEx && (sqlEx.Number == 2601 || sqlEx.Number == 2627))
            {
                ModelState.AddModelError("EmailAddress", "This email address is already registered");
                return(BadRequest(ModelState));
            }
        }
        /// <summary>
        /// Authenticate an admin
        /// Returns the admin with roles if successful, otherwise null
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public async Task <Admins> AuthenticateAsync(String username, String password)
        {
            var admin = await _context.Admins.Include(m => m.Roles).SingleOrDefaultAsync(o => (o.Username == username || o.Email == username) && o.Status == 1);

            if (admin != null)
            {
                var result = CryptoMethods.VerifyHashedPassword(admin.Password, password);
                if (result == PasswordVerificationResult.Success)
                {
                    return(admin);
                }
                else if (result == PasswordVerificationResult.SuccessRehashNeeded)
                {
                    admin.Password = new PasswordHasher <Admins>().HashPassword(null, password);
                    await _context.SaveChangesAsync();

                    return(admin);
                }
            }
            return(null);
        }
Exemple #4
0
        public async Task <IActionResult> TwilioDeliveryReport(TwilioDeliveryReportModel deliveryReport)
        {
            try
            {
                _log.Debug($"Received delivery report for sms {deliveryReport.MessageSid} with status {deliveryReport.SmsStatus}");
                var message = await _smsGateway.GetSmsReportAsync(deliveryReport.MessageSid);

                _flexinetsContext.SmsLogEntries.Add(new SmsLogEntries
                {
                    EventTimestamp     = DateTime.UtcNow,
                    DestinationAddress = message.To.ToString(),
                    Orgaddr            = message.From.ToString(),
                    Text         = message.Body,
                    Smsid        = message.Sid,
                    Inbound      = false,
                    Status       = deliveryReport.SmsStatus,
                    SmsTimestamp = message.DateSent
                });
                await _flexinetsContext.SaveChangesAsync();

                _log.Debug($"Saved sms with id {message.Sid}");
                if (deliveryReport.SmsStatus == "sent")
                {
                    _log.Info($"Sms with id {message.Sid} from {message.From} to {message.To} : {message.Body}");
                }
            }
            catch (DbUpdateException ex) when(ex.InnerException is SqlException sqlEx && (sqlEx.Number == 2601 || sqlEx.Number == 2627))
            {
                _log.Warn($"Ignoring duplicate sms delivery report for id {deliveryReport.MessageSid}");
            }
            catch (Exception ex)
            {
                _log.Error("Failed receiving delivery report", ex);
                return(BadRequest(ex));
            }

            return(new TwiMLResult());
        }
Exemple #5
0
        public async Task <IActionResult> TwilioIncoming()
        {
            var dictionary           = Request.Form.ToDictionary(o => o.Key, o => o.Value.ToString());
            var messageAuthenticator = Request.Headers.SingleOrDefault(o => o.Key == "X-Twilio-Signature").Value.FirstOrDefault();

            if (!_smsGateway.ValidateMessage(Request.GetDisplayUrl(), dictionary, messageAuthenticator))
            {
                _log.Warn("Invalid message authenticator, check twilio logs");
                return(BadRequest("Invalid message authenticator"));
            }

            // cannot use frombody because then the parameters are not available for validating message authenticator
            var model = new TwilioIncomingSmsModel
            {
                AccountSid = dictionary.SingleOrDefault(o => o.Key == "AccountSid").Value,
                Body       = dictionary.SingleOrDefault(o => o.Key == "Body").Value,
                From       = dictionary.SingleOrDefault(o => o.Key == "From").Value,
                To         = dictionary.SingleOrDefault(o => o.Key == "To").Value,
                MessageSid = dictionary.SingleOrDefault(o => o.Key == "MessageSid").Value,
            };

            _log.Info($"Incoming sms {model.MessageSid} from {model.From} to {model.To}");

            try
            {
                model.From = Phonenumber.Parse(model.From);
                model.To   = Phonenumber.Parse(model.To);

                _flexnetsContext.SmsLogEntries.Add(new SmsLogEntries
                {
                    EventTimestamp     = DateTime.UtcNow,
                    DestinationAddress = model.To,
                    Orgaddr            = model.From,
                    Text         = model.Body,
                    Smsid        = model.MessageSid,
                    Inbound      = true,
                    Status       = "RECEIVED",
                    SmsTimestamp = DateTime.UtcNow
                });
                await _flexnetsContext.SaveChangesAsync();


                _log.Info($"Saved incoming sms with id {model.MessageSid}");
                _log.Info($"Incoming SMS from {model.From} to {model.To} : {model.Body}");

                if (model.Body.ToUpper() == "A" || model.Body.ToUpper() == "\"A\"" || model.Body.ToUpper() == "\'A\'")
                {
                    _log.Info("Handling limit extension");
                    var queueClient = new QueueClient(_serviceBusConnectionString);
                    await queueClient.SendAsync(new Message(Encoding.UTF8.GetBytes(model.From)));
                }
                if (model.Body == "echo?" && model.From == _echoNumber)
                {
                    _log.Info("Sending echo reply");
                    await _smsGateway.SendSmsAsync("echo!", model.From);
                }
            }
            catch (DbUpdateException ex) when(ex.InnerException is SqlException sqlEx && (sqlEx.Number == 2601 || sqlEx.Number == 2627))
            {
                _log.Warn($"Ignoring duplicate sms delivery report for id {model.MessageSid}");
            }
            catch (Exception ex)
            {
                _log.Error("Failed receiving incoming sms", ex);
                return(BadRequest(ex));
            }

            return(new TwiMLResult());
        }