diff --git a/Program.cs b/Program.cs index e7fbfbc..e1d576f 100644 --- a/Program.cs +++ b/Program.cs @@ -71,6 +71,7 @@ static IServiceProvider CreateIOC() .AddSingleton(aliExpressSettings) .AddSingleton(loggerSettings) .AddSingleton() + .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() diff --git a/Service/EmailWorker.cs b/Service/EmailWorker.cs index 576df80..bf35b60 100644 --- a/Service/EmailWorker.cs +++ b/Service/EmailWorker.cs @@ -12,6 +12,7 @@ namespace PersonalDataLogger.Service { public class EmailWorker( IAliExpressProcessor aliExpressProcessor, + IGandiProcessor gandiProcessor, IOpsGenieEmailProcessor opsGenieEmailProcessor, IEmailProcessor emailProcessor, ImapSettings imapSettings, @@ -90,6 +91,11 @@ EmailCheckpoint ProcessAvailableEmails(EmailCheckpoint checkpoint) { aliExpressProcessor.ProcessEmail(email); } + else if (email.Sender.Contains("gandi.net") || + email.Sender.Contains("gandi_net")) + { + gandiProcessor.ProcessEmail(email); + } else if (email.Sender.Contains("opsgenie")) { opsGenieEmailProcessor.ProcessEmail(email); diff --git a/Service/Processors/GandiProcessor.cs b/Service/Processors/GandiProcessor.cs new file mode 100644 index 0000000..8881371 --- /dev/null +++ b/Service/Processors/GandiProcessor.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; +using PersonalDataLogger.Client; +using PersonalDataLogger.Service.Models; + +namespace PersonalDataLogger.Service.Processors +{ + public class GandiProcessor( + IPersonalLogManagerService personalLogManagerService) + : IGandiProcessor + { + const string PlatformName = "Gandi"; + + public void ProcessEmail(AvailableEmail email) + { + if (email.Subject.Contains("connection on a new device")) + { + // Username (inside ...) + Match usernameMatch = Regex.Match( + email.Body, + @"username\s*(?[^<]+)", + RegexOptions.IgnoreCase); + + string username = usernameMatch.Success + ? usernameMatch.Groups["username"].Value + : string.Empty; + + // IP Address + Match ipMatch = Regex.Match( + email.Body, + @"IP address:\s*(?\d{1,3}(\.\d{1,3}){3})", + RegexOptions.IgnoreCase); + + string ipAddress = ipMatch.Success + ? ipMatch.Groups["ip"].Value + : string.Empty; + + personalLogManagerService.SendPersonalLogToManager( + email.Timestamp, + "AccountLogin", + new Dictionary() + { + ["platform"] = PlatformName, + ["username"] = username, + ["ip_address"] = ipAddress + }); + } + } + } +} diff --git a/Service/Processors/IGandiProcessor.cs b/Service/Processors/IGandiProcessor.cs new file mode 100644 index 0000000..93da483 --- /dev/null +++ b/Service/Processors/IGandiProcessor.cs @@ -0,0 +1,9 @@ +using PersonalDataLogger.Service.Models; + +namespace PersonalDataLogger.Service.Processors +{ + public interface IGandiProcessor + { + void ProcessEmail(AvailableEmail email); + } +}