コード例 #1
0
 public Stream GetStream()
 {
     (Stream a, Stream b) = PairedStream.Create();
     HalfStream           = a;
     ActiveStream         = b;
     return(b);
 }
コード例 #2
0
        public async Task ReceiveNoData_Uncancellable()
        {
            (Stream a, Stream b) = PairedStream.Create();
            var buffer = new byte[s_bytes.Length * 2];
            await TaskHelpers.AssertNotTriggered(a.ReadAsync(buffer, 0, buffer.Length, CancellationToken.None));

            await TaskHelpers.AssertNotTriggered(b.ReadAsync(buffer, 0, buffer.Length, CancellationToken.None));
        }
コード例 #3
0
        public async Task ReceiveNoData()
        {
            (Stream a, Stream b) = PairedStream.Create();
            var buffer = new byte[s_bytes.Length * 2];
            await TaskHelpers.AssertNotTriggered(a.ReadAsync(buffer, 0, buffer.Length));

            await TaskHelpers.AssertNotTriggered(b.ReadAsync(buffer, 0, buffer.Length));
        }
コード例 #4
0
        /// <summary>
        /// Creates a pair of streams that can be passed to two parties
        /// to allow for interaction with each other.
        /// </summary>
        /// <returns>A pair of streams.</returns>
        public static Tuple <Stream, Stream> CreatePair()
        {
            var stream1 = new PairedStream();
            var stream2 = new PairedStream();

            stream1.SetOtherStream(stream2);
            stream2.SetOtherStream(stream1);
            return(Tuple.Create <Stream, Stream>(stream1, stream2));
        }
コード例 #5
0
        public async Task SendRecieveOneWay_WithToken()
        {
            (Stream a, Stream b) = PairedStream.Create();
            await a.WriteAsync(s_bytes, 0, s_bytes.Length);

            var buffer = new byte[s_bytes.Length * 2];
            int read   = await b.ReadAsync(buffer, 0, buffer.Length, CancellationToken.None);

            Assert.Equal(s_bytes.Length, read);
            Assert.Equal(s_bytes, new ArraySegment <byte>(buffer, 0, read));
        }
コード例 #6
0
        public async Task ProcessAll_EhloStartTlsTest_NotTrusted()
        {
            var responseMessagesPreEncrypt = @"220-STARTTLS
220 example.com greets test.example.com (EHLO)
250 Ok, begin encryption (STARTTLS)
";
            var mockMailReference          = new MockMailReference(
                "mock-1",
                "*****@*****.**",
                new[] { "*****@*****.**" }.ToImmutableList(),
                true,
                "Some text",
                _queue);

            _queue.References.Add(mockMailReference);
            _dns.AddMx("external.example.com", "test.example.com", 10);
            _dns.AddIp("test.example.com", IPAddress.Parse("10.20.30.40"));

            (Stream keep, Stream give) = PairedStream.Create();

            using (var recieveStream = new RedirectableStream(keep))
                using (var reader = new StreamReader(recieveStream))
                {
                    Task <IReadOnlyList <IMailReference> > sendMailsTask = Task.Run(
                        () => _transfer.TrySendMailsToStream(
                            "external.example.com",
                            new[] { mockMailReference },
                            // ReSharper disable once AccessToDisposedClosure
                            new UnclosableStream(give),
                            CancellationToken.None));

                    _transfer.RemoteCertificateValidationCallback = (sender, certificate, chain, errors) => false;

                    byte[] responseBytes = Encoding.ASCII.GetBytes(responseMessagesPreEncrypt);
                    await keep.WriteAsync(responseBytes, 0, responseBytes.Length);

                    await AssertCommandRecieved(reader, "EHLO");
                    await AssertCommandRecieved(reader, "STARTTLS");

                    var encrypted = new SslStream(keep);

                    await encrypted.AuthenticateAsServerAsync(TestHelpers.GetSelfSigned());

                    Assert.NotEmpty(await sendMailsTask);

                    Assert.Equal(1, _queue.References.Count);
                    Assert.Equal(0, _queue.DeletedReferences.Count);

                    encrypted.Dispose();
                    keep.Dispose();
                    give.Dispose();
                }
        }
コード例 #7
0
            public TestConnection(ITestOutputHelper output)
            {
                (Stream a, Stream b) = PairedStream.Create();
                LocalStream          = new RedirectableStream(a);
                Reader = new StreamReader(LocalStream);
                Writer = new StreamWriter(LocalStream)
                {
                    AutoFlush = true
                };


                var builder = new ContainerBuilder();

                builder.RegisterAssemblyTypes(typeof(SmtpSession).GetTypeInfo().Assembly)
                .Where(t => t.GetTypeInfo().GetCustomAttribute <SmtpCommandAttribute>() != null)
                .Keyed <ISmtpCommand>(t => t.GetTypeInfo().GetCustomAttribute <SmtpCommandAttribute>().Name);
                builder.RegisterInstance(TestHelpers.MakeSettings("test.vaettir.net"))
                .As <AgentSettings>()
                .As <AgentSettings>();

                builder.RegisterType <SmtpSession>()
                .As <SmtpSession>()
                .As <ISmtpMessageChannel>()
                .As <IMailBuilder>()
                .As <IProtocolSession>();
                builder.RegisterType <SmtpAuthenticationTransport>()
                .As <IAuthenticationTransport>();

                builder.RegisterInstance(new SecurableConnection(b, PrivateKeyHolder.Fixed(s_serverCert)))
                .As <IConnectionSecurity>()
                .As <SecurableConnection>();

                builder.RegisterInstance(new TestOutputLogger(output))
                .As <ILogger>();

                builder.RegisterInstance(new ConnectionInformation("127.0.0.1", "128.0.0.1"));

                Container = builder.Build();

                Connection = Container.Resolve <SecurableConnection>();
                Session    = Container.Resolve <SmtpSession>();

                CancellationTokenSource = new CancellationTokenSource();
                CancellationToken token = CancellationTokenSource.Token;

                SessionTask = Task.Run(() => Session.RunAsync(token), token);
            }
コード例 #8
0
        public async Task ProcessAll_NoEhloTest()
        {
            var responseMessages  = @"554 No clue (EHLO)
220 example.com greets test.example.com (HELO)
250 Ok (MAIL)
250 Ok (RCPT)
354 End data with <CR><LF>.<CR><LF> (DATA)
250 Ok (DATA with .)
250 Bye (QUIT)
";
            var mockMailReference = new MockMailReference(
                "mock-1",
                "*****@*****.**",
                new[] { "*****@*****.**" }.ToImmutableList(),
                true,
                "Some text",
                _queue);

            _queue.References.Add(mockMailReference);
            _dns.AddMx("external.example.com", "mx.external.example.com", 10);
            _dns.AddIp("mx.external.example.com", IPAddress.Parse("10.20.30.40"));

            (Stream keep, Stream give) = PairedStream.Create();
            using (var reader = new StreamReader(keep))
            {
                byte[] responseBytes = Encoding.ASCII.GetBytes(responseMessages);
                await keep.WriteAsync(responseBytes, 0, responseBytes.Length);

                Assert.Empty(
                    await _transfer.TrySendMailsToStream(
                        "external.example.com",
                        new[] { mockMailReference },
                        new UnclosableStream(give),
                        CancellationToken.None));

                Assert.Equal(0, _queue.References.Count);
                Assert.Equal(1, _queue.DeletedReferences.Count);
                await AssertCommandRecieved(reader, "EHLO");
                await AssertCommandRecieved(reader, "HELO");
                await AssertCommandRecieved(reader, "MAIL");
                await AssertCommandRecieved(reader, "RCPT");
                await AssertCommandRecieved(reader, "DATA");

                give.Dispose();
            }
        }
コード例 #9
0
        public async Task SendPartialOneWay()
        {
            (Stream a, Stream b) = PairedStream.Create();
            await a.WriteAsync(s_bytes, 0, s_bytes.Length);

            var buffer = new byte[s_bytes.Length / 2];
            int read   = await b.ReadAsync(buffer, 0, buffer.Length);

            Assert.InRange(read, 0, buffer.Length);
            Assert.Equal(s_bytes.Take(read), new ArraySegment <byte>(buffer, 0, read));

            buffer = new byte[s_bytes.Length - read];
            int secondRead = await b.ReadAsync(buffer, 0, buffer.Length);

            Assert.Equal(secondRead, buffer.Length);
            Assert.Equal(s_bytes.Skip(secondRead), new ArraySegment <byte>(buffer, 0, secondRead));
        }
コード例 #10
0
        public async Task SendBothRecieveBoth()
        {
            (Stream a, Stream b) = PairedStream.Create();
            await a.WriteAsync(s_bytes, 0, s_bytes.Length);

            await b.WriteAsync(s_bytes, 0, s_bytes.Length);

            var buffer = new byte[s_bytes.Length * 2];

            int read = await b.ReadAsync(buffer, 0, buffer.Length);

            Assert.Equal(s_bytes.Length, read);
            Assert.Equal(s_bytes, new ArraySegment <byte>(buffer, 0, read));

            read = await a.ReadAsync(buffer, 0, buffer.Length);

            Assert.Equal(s_bytes.Length, read);
            Assert.Equal(s_bytes, new ArraySegment <byte>(buffer, 0, read));
        }
コード例 #11
0
        public async Task ReceiveNoData_Cancelled()
        {
            (Stream a, Stream b) = PairedStream.Create();
            var buffer = new byte[s_bytes.Length * 2];
            var cts    = new CancellationTokenSource();

            Task[] tasks =
            {
                a.ReadAsync(buffer, 0, buffer.Length, cts.Token),
                b.ReadAsync(buffer, 0, buffer.Length, cts.Token)
            };
            await TaskHelpers.AssertNotTriggered(tasks[0]);

            await TaskHelpers.AssertNotTriggered(tasks[1]);

            cts.Cancel();

            await TaskHelpers.AssertCancelled(tasks[0]);

            await TaskHelpers.AssertCancelled(tasks[1]);
        }