public SIPContactHeader CopyOf() { SIPContactHeader copy = new SIPContactHeader(); copy.RawHeader = RawHeader; copy.m_userField = m_userField.CopyOf(); return copy; }
public SIPHeader(SIPContactHeader contact, SIPFromHeader from, SIPToHeader to, int cseq, string callId) { List<SIPContactHeader> contactList = new List<SIPContactHeader>(); if (contact != null) { contactList.Add(contact); } Initialise(contactList, from, to, cseq, callId); }
public static List<SIPContactHeader> ParseContactHeader(string contactHeaderStr) { try { if (contactHeaderStr == null || contactHeaderStr.Trim().Length == 0) { return null; } //string[] contactHeaders = null; //// Broken User Agent fix (Aastra looking at you!) //if (contactHeaderStr.IndexOf('<') != -1 && contactHeaderStr.IndexOf('>') == -1) //{ // int nonStandardDelimPosn = contactHeaderStr.IndexOfAny(m_nonStandardURIDelimChars); // if (nonStandardDelimPosn != -1) // { // // Add on the missing RQUOT and ignore whatever the rest of the header is. // contactHeaders = new string[] { contactHeaderStr.Substring(0, nonStandardDelimPosn) + ">" }; // } // else // { // // Can't work out what is going on with this header bomb out. // throw new SIPValidationException(SIPValidationFieldsEnum.ContactHeader, "Contact header invalid."); // } //} //else //{ // contactHeaders = SIPParameters.GetKeyValuePairsFromQuoted(contactHeaderStr, ','); //} string[] contactHeaders = SIPParameters.GetKeyValuePairsFromQuoted(contactHeaderStr, ','); List<SIPContactHeader> contactHeaderList = new List<SIPContactHeader>(); foreach (string contactHeaderItemStr in contactHeaders) { SIPContactHeader contactHeader = new SIPContactHeader(); contactHeader.RawHeader = contactHeaderStr; contactHeader.m_userField = SIPUserField.ParseSIPUserField(contactHeaderItemStr); contactHeaderList.Add(contactHeader); } return contactHeaderList; } catch (SIPValidationException sipValidationExcp) { throw sipValidationExcp; } catch (Exception excp) { logger.Error("Exception ParseContactHeader. " + excp.Message); throw new SIPValidationException(SIPValidationFieldsEnum.ContactHeader, "Contact header invalid."); } }
/// <summary> /// Compares two contact headers to determine contact address equality. /// </summary> public static bool AreEqual(SIPContactHeader contact1, SIPContactHeader contact2) { if (!SIPURI.AreEqual(contact1.ContactURI, contact2.ContactURI)) { return false; } else { // Compare invaraiant parameters. string[] contact1Keys = contact1.ContactParameters.GetKeys(); if (contact1Keys != null && contact1Keys.Length > 0) { foreach (string key in contact1Keys) { if (key == EXPIRES_PARAMETER_KEY || key == QVALUE_PARAMETER_KEY) { continue; } else if (contact1.ContactParameters.Get(key) != contact2.ContactParameters.Get(key)) { return false; } } } // Need to do the reverse as well string[] contact2Keys = contact2.ContactParameters.GetKeys(); if (contact2Keys != null && contact2Keys.Length > 0) { foreach (string key in contact2Keys) { if (key == EXPIRES_PARAMETER_KEY || key == QVALUE_PARAMETER_KEY) { continue; } else if (contact2.ContactParameters.Get(key) != contact1.ContactParameters.Get(key)) { return false; } } } } return true; }
public SIPRequest GetRequest(SIPMethodsEnum method, SIPURI uri, SIPToHeader to, SIPEndPoint localSIPEndPoint) { if (localSIPEndPoint == null) { localSIPEndPoint = GetDefaultSIPEndPoint(); } SIPRequest request = new SIPRequest(method, uri); request.LocalSIPEndPoint = localSIPEndPoint; SIPContactHeader contactHeader = new SIPContactHeader(null, new SIPURI(SIPSchemesEnum.sip, localSIPEndPoint)); SIPFromHeader fromHeader = new SIPFromHeader(null, contactHeader.ContactURI, CallProperties.CreateNewTag()); SIPHeader header = new SIPHeader(contactHeader, fromHeader, to, 1, CallProperties.CreateNewCallId()); request.Header = header; header.CSeqMethod = method; header.Allow = ALLOWED_SIP_METHODS; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); header.Vias.PushViaHeader(viaHeader); return request; }
/// <summary> /// Gets a SIP contact header for this address-of-record based on the bindings list. /// </summary> /// <returns></returns> private List<SIPContactHeader> GetContactHeader(List<SIPRegistrarBinding> bindings) { if (bindings != null && bindings.Count > 0) { List<SIPContactHeader> contactHeaderList = new List<SIPContactHeader>(); foreach (SIPRegistrarBinding binding in bindings) { SIPContactHeader bindingContact = new SIPContactHeader(null, binding.ContactSIPURI); bindingContact.Expires = Convert.ToInt32(binding.ExpiryTime.Subtract(DateTime.UtcNow).TotalSeconds % Int32.MaxValue); contactHeaderList.Add(bindingContact); } return contactHeaderList; } else { return null; } }
public SIPRegistrationUserAgent( SIPTransport sipTransport, SIPEndPoint outboundProxy, SIPEndPoint localEndPoint, SIPURI sipAccountAOR, string authUsername, string password, string realm, string registrarHost, SIPContactHeader contactHeader, int expiry, string owner, string adminMemberID, SIPMonitorLogDelegate logDelegate) { m_sipTransport = sipTransport; m_outboundProxy = outboundProxy; m_localEndPoint = localEndPoint; m_sipAccountAOR = sipAccountAOR; m_authUsername = authUsername; m_password = password; m_realm = realm; m_registrarHost = registrarHost; m_contactURI = contactHeader.ContactURI; m_contactParams = contactHeader.ContactParameters; m_expiry = (expiry >= REGISTER_MINIMUM_EXPIRY && expiry <= MAX_EXPIRY) ? expiry : DEFAULT_REGISTER_EXPIRY; m_owner = owner; m_adminMemberID = adminMemberID; m_callID = Guid.NewGuid().ToString(); Log_External = logDelegate; }
private SIPRequest GetRegistrationRequest(SIPProvider sipProvider, SIPProviderBinding binding, SIPEndPoint localSIPEndPoint, int expiry, SIPEndPoint registrarEndPoint) { try { if (!binding.BindingSIPURI.Parameters.Has(m_regAgentContactId)) { binding.BindingSIPURI.Parameters.Set(m_regAgentContactId, Crypto.GetRandomString(6)); } string realm = binding.RegistrarRealm; SIPURI registerURI = SIPURI.ParseSIPURIRelaxed(realm); SIPURI regUserURI = SIPURI.ParseSIPURIRelaxed(sipProvider.ProviderUsername + "@" + realm); SIPFromHeader fromHeader = new SIPFromHeader(null, regUserURI, CallProperties.CreateNewTag()); SIPToHeader toHeader = new SIPToHeader(null, regUserURI, null); SIPContactHeader contactHeader = new SIPContactHeader(null, binding.BindingSIPURI); //contactHeader.Expires = binding.BindingExpiry; string callId = binding.Id.ToString(); int cseq = ++binding.CSeq; SIPRequest registerRequest = new SIPRequest(SIPMethodsEnum.REGISTER, registerURI); registerRequest.LocalSIPEndPoint = localSIPEndPoint; SIPHeader header = new SIPHeader(contactHeader, fromHeader, toHeader, cseq, callId); header.CSeqMethod = SIPMethodsEnum.REGISTER; header.UserAgent = m_userAgentString; header.Expires = binding.BindingExpiry; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); header.Vias.PushViaHeader(viaHeader); SIPRoute registrarRoute = new SIPRoute(new SIPURI(binding.RegistrarServer.Scheme, registrarEndPoint), true); header.Routes.PushRoute(registrarRoute); if (sipProvider != null && !sipProvider.CustomHeaders.IsNullOrBlank()) { string[] customerHeadersList = sipProvider.CustomHeaders.Split(SIPProvider.CUSTOM_HEADERS_SEPARATOR); if (customerHeadersList != null && customerHeadersList.Length > 0) { foreach (string customHeader in customerHeadersList) { if (customHeader.IndexOf(':') == -1) { logger.Debug("Skipping custom header due to missing colon, " + customHeader + "."); continue; } else { string headerName = customHeader.Substring(0, customHeader.IndexOf(':')); if (headerName != null && Regex.Match(headerName.Trim(), "(Via|From|To|Contact|CSeq|Call-ID|Max-Forwards|Content)", RegexOptions.IgnoreCase).Success) { logger.Debug("Skipping custom header due to an non-permitted string in header name, " + customHeader + "."); continue; } else { if (headerName == SIPConstants.SIP_USERAGENT_STRING) { header.UserAgent = customHeader.Substring(customHeader.IndexOf(':') + 1); } else { header.UnknownHeaders.Add(customHeader.Trim()); } } } } } } registerRequest.Header = header; return registerRequest; } catch (Exception excp) { logger.Error("Exception GetRegistrationRequest. " + excp.Message); throw excp; } }
public SIPRequest GetRequest(SIPMethodsEnum method, SIPURI uri, SIPToHeader to, SIPEndPoint localSIPEndPoint) { if (localSIPEndPoint == null) { localSIPEndPoint = GetDefaultSIPEndPoint(); } SIPRequest request = new SIPRequest(method, uri); request.LocalSIPEndPoint = localSIPEndPoint; SIPContactHeader contactHeader = new SIPContactHeader(null, new SIPURI(SIPSchemesEnum.sip, localSIPEndPoint)); if (!String.IsNullOrWhiteSpace(m_contactGruu)) { contactHeader.ContactURI.Parameters.Set("gr", m_contactGruu); } SIPFromHeader fromHeader = new SIPFromHeader(null, contactHeader.ContactURI, CallProperties.CreateNewTag()); SIPHeader header = new SIPHeader(contactHeader, fromHeader, to, 1, CallProperties.CreateNewCallId()); request.Header = header; header.CSeqMethod = method; header.Allow = ALLOWED_SIP_METHODS; if (m_serviceRoute != null) header.Routes.AddBottomRoute(m_serviceRoute); SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); header.Vias.PushViaHeader(viaHeader); return request; }