Contains a registration for a user.
 public void Add(SipUri uri, string authenticationUserName)
 {
     // using unique user names.
     var reg = new Registration();
     reg.Uri = uri;
     _authenticationIndex.Add(authenticationUserName, reg);
     _registrations.Add(uri.ToString(), reg);
 }
Beispiel #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;
        }
 /// <summary>
 /// Update all contacts in a registration.
 /// </summary>
 /// <param name="registration"></param>
 /// <param name="contacts"></param>
 /// <exception cref="InvalidOperationException"></exception>
 public void UpdateContacts(Registration registration, IEnumerable<RegistrationContact> contacts)
 {
     registration.ReplaceContacts(contacts);
 }
 /// <summary>
 /// Update uri used when registering.
 /// </summary>
 /// <param name="uri"></param>
 /// <remarks>
 /// User might use a different domain than the one
 /// added to the database. Update it so that we can find the user.
 /// </remarks>
 public void UpdateUri(Registration registration, SipUri uri)
 {
     if (uri.Equals(registration.Uri))
         return;
     _registrations.Add(uri.ToString(), registration);
     _registrations.Remove(registration.Uri.ToString());
     registration.Uri = uri;
 }