Find() public method

public Find ( SipUri uri ) : RegistrationContact
uri SipUri
return RegistrationContact
Ejemplo n.º 1
0
        /// <summary>
        /// Update all contacts (registration bindings) for a user.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="registration"></param>
        /// <returns></returns>
        /// <remarks>
        /// Should be done after a successful authentication.
        /// </remarks>
        private List<RegistrationContact> UpdateContacts(RequestContext context, Registration registration)
        {
            var contactHeader = context.Request.Headers[ContactHeader.LNAME] as ContactHeader;
            if (contactHeader == null)
            {
                _logger.Warning("Contact header was not specified.");
                context.Response.ReasonPhrase = "Missing/Invalid contact header.";
                context.Response.StatusCode = StatusCode.BadRequest;
                return null;
            }

            var newContacts = new List<RegistrationContact>();
            foreach (Contact contact in contactHeader.Contacts)
            {
                int expires = MinExpires;
                if (contact.Parameters.Contains("expires"))
                {
                    if (!int.TryParse(contact.Parameters["expires"], out expires))
                    {
                        _logger.Warning("Invalid expires value: " + contact.Parameters["expires"]);
                        context.Response.ReasonPhrase = "Invalid expires value on contact header.";
                        context.Response.StatusCode = StatusCode.BadRequest;
                        return null;
                    }

                    if (expires > 0 && expires < MinExpires)
                    {
                        _logger.Warning("Too small expires value: " + expires);
                        context.Response.ReasonPhrase = "Increase expires value.";
                        context.Response.StatusCode = StatusCode.IntervalTooBrief;
                        context.Response.Headers.Add("MinExpires", new NumericHeader("MinExpires", MinExpires));
                        return null;
                    }
                }
                RegistrationContact oldContact = registration.Find(contact.Uri);
                if (oldContact != null && oldContact.CallId == context.Request.CallId
                    && context.Request.CSeq.Number < oldContact.SequenceNumber)
                {
                    context.Response.StatusCode = StatusCode.BadRequest;
                    context.Response.ReasonPhrase = "CSeq value in contact is out of order.";
                    return null;
                }
                // Add new contact
                newContacts.Add(new RegistrationContact(contact.Name, contact.Uri)
                                    {
                                        CallId = context.Request.CallId,
                                        Expires = expires,
                                        ExpiresAt = DateTime.Now.AddSeconds(expires),
                                        Quality = context.Request.Contact.Quality,
                                        SequenceNumber = context.Request.CSeq.Number,
                                        UpdatedAt = DateTime.Now,
                                    });
            }

            // Now replace contacts.
            // We do it in two steps since no contacts should be updated
            // if someone fails.
            _repository.UpdateContacts(registration, newContacts);
            return newContacts;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Update all contacts (registration bindings) for a user.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="registration"></param>
        /// <returns></returns>
        /// <remarks>
        /// Should be done after a successful authentication.
        /// </remarks>
        private List <RegistrationContact> UpdateContacts(RequestContext context, Registration registration)
        {
            var contactHeader = context.Request.Headers[ContactHeader.LNAME] as ContactHeader;

            if (contactHeader == null)
            {
                _logger.Warning("Contact header was not specified.");
                context.Response.ReasonPhrase = "Missing/Invalid contact header.";
                context.Response.StatusCode   = StatusCode.BadRequest;
                return(null);
            }

            var newContacts = new List <RegistrationContact>();

            foreach (Contact contact in contactHeader.Contacts)
            {
                int expires = MinExpires;
                if (contact.Parameters.Contains("expires"))
                {
                    if (!int.TryParse(contact.Parameters["expires"], out expires))
                    {
                        _logger.Warning("Invalid expires value: " + contact.Parameters["expires"]);
                        context.Response.ReasonPhrase = "Invalid expires value on contact header.";
                        context.Response.StatusCode   = StatusCode.BadRequest;
                        return(null);
                    }

                    if (expires > 0 && expires < MinExpires)
                    {
                        _logger.Warning("Too small expires value: " + expires);
                        context.Response.ReasonPhrase = "Increase expires value.";
                        context.Response.StatusCode   = StatusCode.IntervalTooBrief;
                        context.Response.Headers.Add("MinExpires", new NumericHeader("MinExpires", MinExpires));
                        return(null);
                    }
                }
                RegistrationContact oldContact = registration.Find(contact.Uri);
                if (oldContact != null && oldContact.CallId == context.Request.CallId &&
                    context.Request.CSeq.Number < oldContact.SequenceNumber)
                {
                    context.Response.StatusCode   = StatusCode.BadRequest;
                    context.Response.ReasonPhrase = "CSeq value in contact is out of order.";
                    return(null);
                }
                // Add new contact
                newContacts.Add(new RegistrationContact(contact.Name, contact.Uri)
                {
                    CallId         = context.Request.CallId,
                    Expires        = expires,
                    ExpiresAt      = DateTime.Now.AddSeconds(expires),
                    Quality        = context.Request.Contact.Quality,
                    SequenceNumber = context.Request.CSeq.Number,
                    UpdatedAt      = DateTime.Now,
                });
            }


            // Now replace contacts.
            // We do it in two steps since no contacts should be updated
            // if someone fails.
            _repository.UpdateContacts(registration, newContacts);
            return(newContacts);
        }