From d32207fbf75ac8ee574add81c9c3e327693593b3 Mon Sep 17 00:00:00 2001 From: Kevin Kai Berthold Date: Wed, 3 Dec 2025 18:19:06 +0100 Subject: [PATCH] refactor --- src/smtprelay/Graph/GraphSender.cs | 4 +- src/smtprelay/Graph/GraphSmtpSession.cs | 3 +- src/smtprelay/Program.cs | 2 +- src/smtprelay/Smtp/SmtpServer.cs | 6 ++- src/smtprelay/Smtp/SmtpSession.cs | 64 ++++++++----------------- src/smtprelay/appsettings.json | 2 +- 6 files changed, 30 insertions(+), 51 deletions(-) diff --git a/src/smtprelay/Graph/GraphSender.cs b/src/smtprelay/Graph/GraphSender.cs index 1d957ff..52649a0 100644 --- a/src/smtprelay/Graph/GraphSender.cs +++ b/src/smtprelay/Graph/GraphSender.cs @@ -32,6 +32,7 @@ public class GraphSender(GraphConfig config, ILogger logger) if (_cachedAccessToken == null || InvalidToken(_cachedAccessToken.Value)) { _cachedAccessToken = _cachedCredentials.GetToken(_tokenRequestContext, cancellationToken); + _logger.LogInformation("Requested new Azure Access Token"); // convert token => jwt @@ -69,7 +70,8 @@ public class GraphSender(GraphConfig config, ILogger logger) var sentFile = new FileInfo(Path.Combine(Common.SentDir.FullName, spoolFile.Name)); spoolFile.MoveTo(sentFile.FullName); - _logger.LogInformation("Sent: {Path}", sentFile.FullName); + if (_logger.IsEnabled(LogLevel.Information)) + _logger.LogInformation("Sent: {Path}", sentFile.FullName); return resp; } diff --git a/src/smtprelay/Graph/GraphSmtpSession.cs b/src/smtprelay/Graph/GraphSmtpSession.cs index 0e420e2..8c663b1 100644 --- a/src/smtprelay/Graph/GraphSmtpSession.cs +++ b/src/smtprelay/Graph/GraphSmtpSession.cs @@ -24,7 +24,8 @@ public partial class GraphSmtpSession(GraphSender graphSender, ILogger(IServiceScopeFactory scopeFactory, ILogger(IServiceScopeFactory scopeFactory, ILogger logger) // set tcp options socket.NoDelay = true; - _logger.LogInformation("[{REP}] Connected", socket.RemoteEndPoint); + if (_logger.IsEnabled(LogLevel.Information)) + _logger.LogInformation("[{REP}] Connected", socket.RemoteEndPoint); try { @@ -49,7 +49,9 @@ public abstract partial class SmtpSessionBase(ILogger logger) break; var line = Encoding.ASCII.GetString(rawLine); - _logger.LogInformation("[{REP}] > {LINE}", socket.RemoteEndPoint, line); + + if (_logger.IsEnabled(LogLevel.Debug)) + _logger.LogDebug("[{REP}] > {LINE}", socket.RemoteEndPoint, line); if (string.IsNullOrWhiteSpace(line)) { @@ -77,10 +79,12 @@ public abstract partial class SmtpSessionBase(ILogger logger) } catch (Exception ex) { - _logger.LogError("[{REP}] Error: {MSG}", socket.RemoteEndPoint, ex.ToString()); + if (_logger.IsEnabled(LogLevel.Error)) + _logger.LogError("[{REP}] Error: {MSG}", socket.RemoteEndPoint, ex.ToString()); } - _logger.LogInformation("[{REP}] Disconnected", socket.RemoteEndPoint); + if (_logger.IsEnabled(LogLevel.Information)) + _logger.LogInformation("[{REP}] Disconnected", socket.RemoteEndPoint); } protected abstract Task OnProcessDataAsync(ReadOnlyMemory dataBytes, CancellationToken cancellationToken); @@ -354,17 +358,12 @@ public abstract partial class SmtpSessionBase(ILogger logger) var rawData = await ReadToSpanAsync(socket, DataDelimiterSpan, true, cancellationToken); await OnProcessDataAsync(rawData, cancellationToken); - - // dot unstuff - //if (response.StartsWith("..")) - // response = response[1..]; - - //var response = Encoding.ASCII.GetString(rawData); - //Console.WriteLine(JsonSerializer.Serialize(response)); } catch (Exception ex) { - _logger.LogError(ex.ToString()); + if (_logger.IsEnabled(LogLevel.Error)) + _logger.LogError("[{REP}] Error: {MSG}", socket.RemoteEndPoint, ex.ToString()); + throw new InvalidOperationException(ex.ToString()); } @@ -379,8 +378,6 @@ public abstract partial class SmtpSessionBase(ILogger logger) private async Task HandleAuthPlainAsync(Socket socket, SmtpConfig config, string? raw, CancellationToken cancellationToken) { - _logger.LogCritical("AUTH PLAIN"); - // PLAIN == base64 string payloadB64 = raw ?? string.Empty; @@ -393,7 +390,8 @@ public abstract partial class SmtpSessionBase(ILogger logger) var rawLine = await ReadToSpanAsync(socket, CrlnSpan, true, cancellationToken); payloadB64 = Encoding.ASCII.GetString(rawLine ?? throw new InvalidDataException("null")).Trim() ?? ""; - _logger.LogInformation("[{REP}] > {LINE}", socket.RemoteEndPoint, rawLine); + if (_logger.IsEnabled(LogLevel.Information)) + _logger.LogInformation("[{REP}] > {LINE}", socket.RemoteEndPoint, rawLine); } if (!SmtpHelper.TryBase64(payloadB64, out var bytes)) @@ -411,13 +409,10 @@ public abstract partial class SmtpSessionBase(ILogger logger) return; } - var authzid = parts[0]; + //var authzid = parts[0]; var user = parts[1]; var pass = parts[2]; - _logger.LogCritical(user); - _logger.LogCritical(pass); - if (ValidateUser(config, user, pass)) { _authenticated = true; @@ -432,8 +427,6 @@ public abstract partial class SmtpSessionBase(ILogger logger) private async Task HandleAuthLoginAsync(Socket socket, SmtpConfig config, string? raw, CancellationToken cancellationToken) { - _logger.LogCritical("AUTH LOGIN"); - string? user; string? pass; @@ -454,7 +447,8 @@ public abstract partial class SmtpSessionBase(ILogger logger) var rawLine = await ReadToSpanAsync(socket, CrlnSpan, true, cancellationToken); var response = Encoding.ASCII.GetString(rawLine ?? throw new InvalidDataException("null")).Trim() ?? ""; - _logger.LogInformation("[{REP}] > {LINE}", socket.RemoteEndPoint, rawLine); + if (_logger.IsEnabled(LogLevel.Information)) + _logger.LogInformation("[{REP}] > {LINE}", socket.RemoteEndPoint, rawLine); if (!SmtpHelper.TryBase64(response, out var ub)) { @@ -509,13 +503,6 @@ public abstract partial class SmtpSessionBase(ILogger logger) // cut out unsed buffer var unusedBuffer = bufferMemory.Slice(_dataOffset, _bufferOffset - _dataOffset); - // DEBUG ONLY (no aot) - //_logger.LogTrace(_dataOffset.ToString()); - //_logger.LogTrace(_bufferOffset.ToString()); - - //var dbgLine = Encoding.ASCII.GetString(unusedBuffer.Span); - //_logger.LogTrace(JsonSerializer.Serialize(dbgLine)); - // find escape sequence if theres more left, before fetching new data var escapeIndex = unusedBuffer.Span.IndexOf(until.Span); if (escapeIndex == -1) @@ -595,7 +582,8 @@ public abstract partial class SmtpSessionBase(ILogger logger) { _writeLock.Release(); - _logger.LogInformation("[{REP}] < {LINE}", socket.RemoteEndPoint, line); + if (_logger.IsEnabled(LogLevel.Information)) + _logger.LogInformation("[{REP}] < {LINE}", socket.RemoteEndPoint, line); } } @@ -612,20 +600,6 @@ public abstract partial class SmtpSessionBase(ILogger logger) private static bool ValidateReceiver(SmtpConfig config, string receiver) => SmtpHelper.MatchesAny(receiver, config.AllowedReceivers); - private async Task SpoolToFileAsync(ReadOnlyMemory data, CancellationToken cancellationToken) - { - Directory.CreateDirectory(Common.SpoolDir.FullName); - - var path = Path.Combine(Common.SpoolDir.FullName, $"{Guid.NewGuid()}.eml"); - var spoolFile = new FileInfo(path); - - await File.WriteAllBytesAsync(spoolFile.FullName, data, cancellationToken); - - _logger.LogInformation("Spooled: {Path}", spoolFile.FullName); - - return spoolFile; - } - [GeneratedRegex(@"^MAIL\s+FROM:\s*<([^>]+)>(?:\s+(.*))?$", RegexOptions.IgnoreCase)] public static partial Regex MailFromRegex(); diff --git a/src/smtprelay/appsettings.json b/src/smtprelay/appsettings.json index 3e270ad..387c2ef 100644 --- a/src/smtprelay/appsettings.json +++ b/src/smtprelay/appsettings.json @@ -12,7 +12,7 @@ }, "Whitelist": { "Senders": [ - "me2@example.local" + "me@example.local" ], "Receivers": [ "noreply@example.local",