예제 #1
0
        public async Task <StartTlsResult> TryStartTls(Stream networkStream)
        {
            try
            {
                using (IStreamReader streamReader =
                           new StreamReaderWrapper(networkStream, Encoding.ASCII, true, 1024, true))
                {
                    using (IStreamWriter streamWriter =
                               new StreamWriterWrapper(networkStream, Encoding.ASCII, 1024, true)
                    {
                        AutoFlush = true,
                        NewLine = LineEnding
                    })
                    {
                        SmtpResponse response1 = await _smtpDeserializer.Deserialize(streamReader);

                        _log.Debug($"<: {response1}");

                        if (response1.Responses.FirstOrDefault()?.ResponseCode != ResponseCode.ServiceReady)
                        {
                            return(new StartTlsResult(false, response1.Responses.Select(_ => _.ToString()).ToList(),
                                                      "The server did not present a service ready response code (220)."));
                        }

                        EhloCommand ehloCommand = new EhloCommand(_mxSecurityTesterConfig.SmtpHostName);
                        _log.Debug($">: {ehloCommand.CommandString}");
                        await _smtpSerializer.Serialize(ehloCommand, streamWriter);

                        SmtpResponse response2 = await _smtpDeserializer.Deserialize(streamReader);

                        _log.Debug($"<: {response2}");
                        if (!response2.Responses.Any(_ =>
                                                     _.Value.ToLower() == Starttls && _.ResponseCode == ResponseCode.Ok))
                        {
                            return(new StartTlsResult(false, response2.Responses.Select(_ => _.ToString()).ToList(),
                                                      "The server did not present a STARTTLS command with a response code (250)."));
                        }

                        StartTlsCommand startTlsCommand = new StartTlsCommand();
                        _log.Debug($">: {startTlsCommand.CommandString}");
                        await _smtpSerializer.Serialize(startTlsCommand, streamWriter);

                        SmtpResponse response3 = await _smtpDeserializer.Deserialize(streamReader);

                        _log.Debug($"<: {response3}");

                        return(new StartTlsResult(
                                   response3.Responses.FirstOrDefault()?.ResponseCode == ResponseCode.ServiceReady,
                                   response3.Responses.Select(_ => _.Value).ToList(), string.Empty));
                    }
                }
            }
            catch (Exception e)
            {
                _log.Error(
                    $"SMTP session initalization failed with error: {e.Message} {Environment.NewLine} {e.StackTrace}");
                return(new StartTlsResult(false, null, e.Message));
            }
        }
예제 #2
0
        private async Task WriteLoop()
        {
            try
            {
                ulong cycle = 0;
                while (true)
                {
                    if (linequeue.IsEmpty)
                    {
                        await addedEvent.WaitAsync(cts.Token);

                        cts.Token.ThrowIfCancellationRequested();
                    }
                    cycle++;
                    if (linequeue.TryDequeue(out string line))
                    {
                        string directory = GetDirectory(basePath, line, layers); //describes the dir in which the file belongs
                        string path      = GetFilePath(basePath, line, layers);

                        if (fileStreams.TryGetValue(path, out StreamWriterWrapper streamWriterW))
                        {
                            await streamWriterW.streamWriter.WriteLineAsync(line);
                        }
                        else
                        {
                            CreateDirectory(directory);

                            StreamWriterWrapper sww = new StreamWriterWrapper(
                                new StreamWriter(new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)),
                                cycle);

                            fileStreams.Add(path, sww);
                            await sww.streamWriter.WriteLineAsync(line);
                        }

                        //prune the fileStreams if we have to many
                        if (fileStreams.Count > 5000)
                        {
                            KeyValuePair <string, StreamWriterWrapper>[] ar = fileStreams.ToArray();

                            Array.Sort(ar, Compare);

                            await AsyncParallelForEach(ar.Take(750), async (kv) =>
                            {
                                await kv.Value.streamWriter.FlushAsync();
                                await kv.Value.streamWriter.DisposeAsync();
                                lock (fileStreams)
                                {
                                    fileStreams.Remove(kv.Key);
                                }
                            });
                        }
                    }
                }
            }
            catch (OperationCanceledException) { }
            catch (Exception e) { Debugger.Break(); throw e; }
        }
예제 #3
0
 private static void Write <T>(StreamWriterWrapper writer, in T[] value)
예제 #4
0
 private static void Write <T>(StreamWriterWrapper writer, in List <T> value)
예제 #5
0
 private static void Write <TKey, TValue>(StreamWriterWrapper writer, in Dictionary <TKey, TValue> value)
예제 #6
0
 private static void Write(StreamWriterWrapper writer, in Type value) => writer.WriteLine(TypeNames.Get(value));
예제 #7
0
 private static void Write(StreamWriterWrapper writer, in string value) => writer.WriteLine(value);
예제 #8
0
 public NonBlockingFileWriter(string filename)
 {
     logOutput = new StreamWriterWrapper(filename);
 }
예제 #9
0
 private static void Write(StreamWriterWrapper writer, in string value)