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