Example #1
0
        public void GenerateCancel(SipMessageWriter writer, SipMessageReader reader)
        {
            trunk.RemoveDialog1(tag);
            trunk.RemoveDialog2(tag);

            GenerateRequest(writer, reader, Methods.Cancelm);
        }
Example #2
0
        public SipMessageWriter DetachBestResponse()
        {
            var response = bestResponse;

            bestResponse = null;
            return(response);
        }
Example #3
0
        private void GenerateRequest(SipMessageWriter writer, SipMessageReader reader, Methods method)
        {
            writer.WriteRequestLine(method, trunk.Uri);

            writer.WriteVia(ToConnectionAddresses.Transport, ToConnectionAddresses.LocalEndPoint, TransactionId);

            for (int i = 0; i < reader.Count.HeaderCount; i++)
            {
                switch (reader.Headers[i].HeaderName)
                {
                case HeaderNames.From:
                case HeaderNames.To:
                case HeaderNames.CallId:
                    writer.WriteHeader(reader, i);
                    break;
                }
            }

            writer.WriteMaxForwards(70);
            writer.WriteCseq(reader.CSeq.Value, method);
            writer.WriteContentLength(0);

            writer.WriteCustomHeaders();
            writer.WriteCRLF();
        }
Example #4
0
        public void GenerateForwardedResponse(SipMessageWriter writer, SipMessageReader response, ArraySegment <byte> content, ConnectionAddresses ca)
        {
            //if (response.StatusCode.Is2xx && response.To.Tag.IsValid)
            //    trunk.AddDialogs(tag, new Dialog(response, ca), dialog2);

            if (response.CSeq.Method == Methods.Byem)
            {
                trunk.RemoveDialog1(tag);
                trunk.RemoveDialog2(tag);
            }


            writer.WriteStatusLine(response.StatusCode);

            for (int i = 0; i < response.Count.HeaderCount; i++)
            {
                switch (response.Headers[i].HeaderName)
                {
                case HeaderNames.Via:
                    writer.Write(SipMessageWriter.C.Via, SipMessageWriter.C.HCOLON, via);
                    writer.WriteCRLF();
                    break;

                case HeaderNames.WwwAuthenticate:
                case HeaderNames.ProxyAuthenticate:
                    break;

                case HeaderNames.To:
                    writer.WriteTo(dialog2.LocalUri, dialog2.LocalTag);
                    break;

                case HeaderNames.From:
                    writer.WriteFrom(dialog2.RemoteUri, dialog2.RemoteTag);
                    break;

                case HeaderNames.CSeq:
                    writer.WriteCseq(dialog2.RemoteCseq, response.CSeq.Method);
                    break;

                case HeaderNames.Contact:
                    writer.WriteContact(ca.LocalEndPoint, ca.Transport);
                    break;

                default:
                    writer.WriteHeader(response, i);
                    break;
                }
            }

            if (response.ContentLength == int.MinValue)
            {
                writer.WriteContentLength(content.Count);
            }

            writer.WriteCustomHeaders();
            writer.WriteCRLF();
            writer.Write(content);
        }
Example #5
0
        public void GenerateForwardedRequest(SipMessageWriter writer, SipMessageReader reader, ArraySegment <byte> content, ConnectionAddresses fromConnectionAddress, int serverTransactionId)
        {
            dialog2 = new Dialog(reader, tag, fromConnectionAddress);
            //trunk.AddDialog2(tag, dialog2);

            /////////////////////////////////////////////////////////////////////////////////

            writer.WriteRequestLine(reader.Method, dialog1.RemoteUri);

            //var msReceivedCid = fromConnectionAddress.ToLowerHexChars(serverTransactionId);
            //writer.WriteVia(dialog1.Transport, dialog1.LocalEndPoint, TransactionId, msReceivedCid);
            writer.WriteVia(dialog1.Transport, dialog1.LocalEndPoint, TransactionId);

            for (int i = 0; i < reader.Count.HeaderCount; i++)
            {
                switch (reader.Headers[i].HeaderName)
                {
                case HeaderNames.MaxForwards:
                    writer.WriteMaxForwards((reader.MaxForwards == int.MinValue) ? 69 : reader.MaxForwards - 1);
                    break;

                case HeaderNames.Contact:
                    writer.WriteContact(dialog1.LocalEndPoint, dialog1.Transport);
                    break;

                case HeaderNames.To:
                    writer.WriteTo(dialog1.RemoteUri, dialog1.RemoteTag);
                    break;

                case HeaderNames.From:
                    writer.WriteFrom(reader.From.AddrSpec.Value, tag);
                    break;

                case HeaderNames.Authorization:
                    break;

                default:
                    writer.WriteHeader(reader, i);
                    break;

                case HeaderNames.Via:
                    via = reader.Headers[i].Value.DeepCopy();
                    break;
                }
            }

            if (reader.ContentLength == int.MinValue)
            {
                writer.WriteContentLength(content.Count);
            }

            writer.WriteCustomHeaders();
            writer.WriteCRLF();

            writer.Write(content);
        }
Example #6
0
        public void Dispose()
        {
            bufferHandle.Free();

            if (bestResponse != null)
            {
                bestResponse.Dispose();
                bestResponse = null;
            }
        }
Example #7
0
        public void SetBestResponseStatusCode(int statusCode)
        {
            bestResponseStatusCode = statusCode;

            if (bestResponse != null)
            {
                bestResponse.Dispose();
                bestResponse = null;
            }
        }
        private string CreateForwardedResponse(string message, string content)
        {
            var reader = Parse(message);

            using (var writer = new SipMessageWriter())
            {
                proxie.GenerateForwardedResponse(writer, reader, new ArraySegment <byte>(Encoding.UTF8.GetBytes(content)), srcAddr);
                return(Encoding.UTF8.GetString(writer.Buffer, writer.Offset, writer.Count));
            }
        }
        private string CreateForwardedRequest(string message, string content)
        {
            var reader       = Parse(message);
            var contentBytes = Encoding.UTF8.GetBytes(content);

            using (var writer = new SipMessageWriter())
            {
                proxie.GenerateForwardedRequest(writer, reader, new ArraySegment <byte>(contentBytes), destAddr, 0x1000);
                return(Encoding.UTF8.GetString(writer.Buffer, writer.Offset, writer.Count));
            }
        }
Example #10
0
        public void WriteLenghtAndContent(SipMessageWriter writer)
        {
            lock (tuples)
            {
                int length = CountLength();

                writer.WriteContentLength(length);
                writer.WriteCRLF();

                WriteContent(writer, length);
            }
        }
Example #11
0
        /// Что с этой функцией делать?! Как отсюда убрать? Убрать в Helpers?
        private void WriteAuthorization(SipMessageWriter writer, Methods method, ArraySegment <byte> content)
        {
            if (trunk.Nonce.IsValid)
            {
                int nc     = trunk.GetNextNonceCount();
                int cnonce = Environment.TickCount;

                var response = SipDigestAuthentication.GetResponseHexChars(trunk.AuthenticationId, trunk.Realm, AuthAlgorithms.Md5, trunk.Nonce,
                                                                           cnonce, nc, trunk.Password, trunk.Qop, trunk.Uri, method.ToByteArrayPart(), content);

                writer.WriteDigestAuthorization(trunk.AuthHeader, trunk.AuthenticationId, trunk.Realm, trunk.Qop, AuthAlgorithms.Md5, trunk.Uri,
                                                trunk.Nonce, nc, cnonce, trunk.Opaque, response);
            }
        }
Example #12
0
        public void SetBestResponse(SipMessageWriter response)
        {
            if (bestResponse != response)
            {
                if (bestResponse != null)
                {
                    bestResponse.Dispose();
                    bestResponse = null;
                }

                bestResponse           = response;
                bestResponseStatusCode = response.StatusCode;
            }
        }
Example #13
0
        private void AreEqual(string expected, PresenceDocument doc)
        {
            var writer = new SipMessageWriter();

            expected = expected.Replace('\'', '"');

            //byte[] actualBytes = null;
            //int copied = doc.CopyTo(
            //    (length) => { return new ArraySegment<byte>(actualBytes = new byte[length], 0, length); });
            doc.WriteContent(writer);

            //string actual = Encoding.UTF8.GetString(actualBytes);

            var actual = Encoding.UTF8.GetString(writer.Buffer, writer.Offset, writer.Count);

            Assert.AreEqual(openPresence + expected + closePresence, actual);
        }
            public void SignMessage(SipMessageWriter writer)
            {
                outSnum++;
                int srand2 = Environment.TickCount;

                InitializeThreadStaticVars();

                int length = SignatureBuffer.Generate(scheme, srand2, outSnum, targetname, writer, ref bytes1);

                if (bytes2.Length < maxSignatureSize)
                {
                    bytes2 = new byte[maxSignatureSize];
                }

                secBufferDesc1.Buffers[0].SetBuffer(BufferType.SECBUFFER_DATA, bytes1, 0, length);
                secBufferDesc1.Buffers[1].SetBuffer(BufferType.SECBUFFER_TOKEN, bytes2);

                var result = Sspi.SafeMakeSignature(contextHandle, ref secBufferDesc1, 100);

                Tracer.WriteInformation("Signature: " + result.ToString());

                if (Sspi.Succeeded(result))
                {
                    writer.WriteAuthenticationInfo(true, scheme, targetname, realm, Opaque, outSnum, srand2,
                                                   new ArraySegment <byte>(bytes2, 0, secBufferDesc1.Buffers[1].Size));

                    if (writer.IsResponse && writer.StatusCode >= 200 && writer.StatusCode <= 299)
                    {
                        if (writer.Method == Methods.Registerm && writer.Expires != int.MinValue)
                        {
                            idleTime = DateTime.UtcNow.AddSeconds(writer.Expires + 30);
                            idleTimeUpdatedByExpires = true;
                        }
                    }
                    else
                    {
                        // TODO: INVITE Session-Expires
                    }
                }
            }
Example #15
0
        private void SendNotify(Dialog dialog, int expires, PresenceDocument document)
        {
            int transactionId = GetTransactionId(Methods.Notifym);

            var writer = new SipMessageWriter();

            writer.WriteRequestLine(Methods.Notifym, dialog.RemoteUri);
            writer.WriteVia(dialog.Transport, dialog.LocalEndPoint, transactionId);
            writer.WriteFrom(dialog.LocalUri, dialog.LocalTag);
            writer.WriteTo(dialog.RemoteUri, dialog.RemoteTag);
            writer.WriteCallId(dialog.CallId);
            writer.WriteEventPresence();
            writer.WriteSubscriptionState(expires);
            writer.WriteMaxForwards(70);
            writer.WriteCseq(dialog.GetNextLocalCseq(), Methods.Notifym);
            writer.WriteContact(dialog.LocalEndPoint, dialog.Transport);

            if (document != null)
            {
                writer.WriteContentType(application, pidfXml);
                //writer.WriteContentLength();
                //writer.WriteCRLF();

                //writer.RewriteContentLength(
                //    document.CopyTo((length) => writer.GetBytesForCustomWrite(length)));

                document.WriteLenghtAndContent(writer);
            }
            else
            {
                writer.WriteContentLength(0);
                writer.WriteCRLF();
            }

            notifyProducer.SendRequest(dialog.Transport, dialog.LocalEndPoint,
                                       dialog.RemoteEndPoint, ServerAsyncEventArgs.AnyConnectionId, writer, transactionId);
        }
Example #16
0
        private static ServerAsyncEventArgs CreateOutgoingMessage(ConnectionAddresses ca, SipMessageWriter writer, int transactionKId)
        {
            try
            {
                var e = EventArgsManager.Get();

                e.LocalEndPoint       = new ServerEndPoint(ca.Transport.ToServerProtocol(), ca.LocalEndPoint);
                e.RemoteEndPoint      = ca.RemoteEndPoint;
                e.ConnectionId        = ca.ConnectionId;
                e.UserTokenForSending = transactionKId;

                e.OffsetOffset = 128;
                e.Count        = writer.Count;
                e.AllocateBuffer();
                Buffer.BlockCopy(writer.Buffer, writer.Offset, e.Buffer, e.Offset, e.Count);

                return(e);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Example #17
0
 public void GenerateAck(SipMessageWriter writer, SipMessageReader reader)
 {
     GenerateRequest(writer, reader, Methods.Ackm);
 }
                public static int Generate(AuthSchemes scheme, int srand, int snum, ByteArrayPart targetname, SipMessageWriter writer, ref byte[] bytes)
                {
                    int length = 0;

                    Write(scheme.ToUtf8Bytes(), ref bytes, ref length);
                    WriteAsHex8(srand, ref bytes, ref length);
                    Write(snum, ref bytes, ref length);
                    Write(SipMicrosoftAuthentication.realm, ref bytes, ref length);

                    if (scheme == AuthSchemes.Kerberos)
                    {
                        Write(sip_, targetname, ref bytes, ref length);
                    }
                    else
                    {
                        Write(targetname, ref bytes, ref length);
                    }

                    Write(writer.CallId, ref bytes, ref length);
                    Write(writer.CSeq, ref bytes, ref length);
                    Write(writer.Method.ToByteArrayPart(), ref bytes, ref length);
                    Write(writer.FromAddrspec, ref bytes, ref length);
                    Write(writer.FromTag, ref bytes, ref length);
                    Write(writer.ToAddrspec, ref bytes, ref length);
                    Write(writer.ToTag, ref bytes, ref length);
                    // TODO: sip P-Asserted-Identity
                    WriteEmpty(ref bytes, ref length);
                    // TODO: tel P-Asserted-Identity
                    WriteEmpty(ref bytes, ref length);

                    if (writer.Expires != int.MinValue)
                    {
                        Write(writer.Expires, ref bytes, ref length);
                    }
                    else
                    {
                        WriteEmpty(ref bytes, ref length);
                    }

                    if (writer.IsResponse)
                    {
                        Write(writer.StatusCode, ref bytes, ref length);
                    }

                    //SIPServer.Tracer.Info("SignatureBuffer:" + Encoding.UTF8.GetString(bytes, 0, length));

                    return(length);
                }
Example #19
0
 public void WriteSignature(SipMessageWriter writer)
 {
 }
Example #20
0
 public bool IsAuthorized(SipMessageReader reader, ArraySegment <byte> content, ByteArrayPart realm, int param, out SipMessageWriter writer)
 {
     writer = null;
     return(true);
 }
Example #21
0
 public void SendRequest(ConnectionAddresses connectionAddresses, SipMessageWriter writer, int transactionId)
 {
     TransactionUser.SendRequest(Index, connectionAddresses, transactionId, writer, 0);
 }
Example #22
0
 private void SendRequest(int router, ConnectionAddresses connectionAddresses, int transactionKId, SipMessageWriter writer, int userData)
 {
     sendRequestes.Add(new Request()
     {
         ConnectionAddresses = connectionAddresses, TransactionKId = transactionKId, Writer = writer,
     });
     sendRequestCount[(int)writer.Method]++;
 }
Example #23
0
 private void SendNonTransactionMessage(Transports transport, IPEndPoint localEndPoint, IPEndPoint remoteEndpoint, int connectionId, SipMessageWriter writer)
 {
 }
 protected void SendAck(ConnectionAddresses connectionAddresses, SipMessageWriter writer)
 {
     SendNonTransactionMessage(connectionAddresses.Transport, connectionAddresses.LocalEndPoint,
                               connectionAddresses.RemoteEndPoint, connectionAddresses.ConnectionId, writer);
 }
 public void SendResponse(ConnectionAddresses connectionAddresses, int transactionId, SipMessageWriter writer)
 {
     SendResponseExternal(connectionAddresses, transactionId, writer);
 }
 protected void SendResponse(IncomingMessageEx to, SipMessageWriter writer)
 {
     SendResponseExternal(to.ConnectionAddresses, to.TransactionId, writer);
 }
Example #27
0
        public void GenerateForwardedRequest(SipMessageWriter writer, SipMessageReader reader, ArraySegment <byte> content, ConnectionAddresses fromConnectionAddress, int serverTransactionId)
        {
            //int? tag = HexEncoding.ParseHex8(reader.To.Tag);
            //var dialog2 = trunk.GetExternalDialog(tag);

            //if (dialog2 != null)
            //{
            //    this.tag = tag.Value;
            //    //this.dialog1 = dialog1;
            //    this.dialog2 = dialog2;
            //}

            Dialog dialog2 = null;

            if (HexEncoding.TryParseHex8(reader.To.Tag, out tag))
            {
                dialog2 = trunk.GetDialog2(tag);
            }
            else
            {
                tag = DialogManager.NewLocalTag();
            }

            dialog1 = new Dialog(reader, tag, fromConnectionAddress);
            trunk.AddDialog1(tag, dialog1);


            writer.WriteRequestLine(reader.Method, trunk.Transport.ToScheme(), reader.To.AddrSpec.User, trunk.Domain);

            //var msReceivedCid = fromConnectionAddress.ToLowerHexChars(serverTransactionId);
            //writer.WriteVia(trunk.ConnectionAddresses.Transport, trunk.ConnectionAddresses.LocalEndPoint, TransactionId, msReceivedCid);
            writer.WriteVia(trunk.ConnectionAddresses.Transport, trunk.ConnectionAddresses.LocalEndPoint, TransactionId);

            for (int i = 0; i < reader.Count.HeaderCount; i++)
            {
                switch (reader.Headers[i].HeaderName)
                {
                case HeaderNames.MaxForwards:
                    writer.WriteMaxForwards((reader.MaxForwards == int.MinValue) ? 69 : reader.MaxForwards - 1);
                    break;

                case HeaderNames.Contact:
                    writer.WriteContact(trunk.LocalEndPoint, trunk.Transport, reader.Contact[0].SipInstance);
                    break;

                case HeaderNames.Via:
                    via = reader.Headers[i].Value.DeepCopy();
                    break;

                case HeaderNames.To:
                    writer.WriteTo2(reader.To.AddrSpec.User, trunk.Domain, (dialog2 != null) ? dialog2.RemoteTag : ByteArrayPart.Invalid);
                    break;

                case HeaderNames.From:
                    writer.WriteFrom(trunk.Uri, tag);
                    break;

                case HeaderNames.CSeq:
                    writer.WriteCseq(trunk.GetCSeq(reader.CSeq.Method, reader.CallId, reader.CSeq.Value), reader.CSeq.Method);
                    break;

                case HeaderNames.Authorization:
                case HeaderNames.ContentLength:
                case HeaderNames.Extension:
                    break;

                default:
                    writer.WriteHeader(reader, i);
                    break;
                }
            }

            WriteAuthorization(writer, reader.Method, content);

            if (reader.Method == Methods.Invitem && reader.ContentType.Subtype.Equals(sdp))             // temp
            {
                content = Sip.Sdp.Helpers.CutCandidates(content);
            }

            writer.WriteContentLength(content.Count);
            writer.WriteCRLF();

            writer.Write(content);
        }
Example #28
0
 private void SendResponse(ConnectionAddresses connectionAddresses, int transactionKId, SipMessageWriter writer)
 {
     sentResponses.Add(writer);
 }
Example #29
0
 public void SendRequest(Transports transport, IPEndPoint localEndPoint, IPEndPoint remoteEndPoint, int connectionId, SipMessageWriter writer, int transactionId)
 {
     TransactionUser.SendRequest(Index,
                                 new ConnectionAddresses(transport, localEndPoint, remoteEndPoint, connectionId), transactionId, writer, 0);
 }
Example #30
0
 /// <summary>
 /// !!! DEPRECATED !!!
 /// </summary>
 public void SendResponse(IncomingMessageEx to, SipMessageWriter writer)
 {
     TransactionUser.SendResponse(to.ConnectionAddresses, to.TransactionId, writer);
 }