/// <summary> /// Process a transmitted message to import any signing certificates for subsequent S/MIME encryption. /// </summary> /// <param name="o">A ProcessMessageArguments object containing message parameters.</param> private void ProcessMessage(object o) { ProcessMessageArguments arguments = (ProcessMessageArguments)o; // Export the message to a local directory. if (!string.IsNullOrEmpty(arguments.ExportDirectory)) { string messageId = Functions.ReturnBetween(arguments.MessageText.ToLower(), "message-id: <", ">"); if (string.IsNullOrEmpty(messageId)) { messageId = Guid.NewGuid().ToString(); } string fileName = ProxyFunctions.GetExportFileName(arguments.ExportDirectory, messageId, arguments.InstanceId, arguments.UserName); File.WriteAllText(fileName, arguments.MessageText); } // Only parse the message if it contains a known S/MIME content type. string canonicalMessageText = arguments.MessageText.ToLower(); if (canonicalMessageText.IndexOf("application/x-pkcs7-signature") > -1 || canonicalMessageText.IndexOf("application/pkcs7-mime") > -1) { try { // Parse the message. MailMessage message = new MailMessage(arguments.MessageText); // If the message contains a signing certificate that we haven't processed on this session, import it. foreach (X509Certificate2 cert in message.SmimeSigningCertificateChain) { if (cert != null && !SmimeCertificatesReceived.Contains(cert)) { // Import the certificate to the Local Machine store. ProxyFunctions.Log(LogWriter, SessionId, arguments.ConnectionId, "Importing certificate with Serial Number {" + cert.SerialNumber + "}.", Proxy.LogLevel.Information, LogLevel); CertHelper.InstallWindowsCertificate(cert, StoreLocation.LocalMachine); // Remember this ceriticate to avoid importing it again this session. SmimeCertificatesReceived.Add(cert); } } } catch (Exception ex) { if (arguments.DebugMode || System.Diagnostics.Debugger.IsAttached) { ProxyFunctions.Log(LogWriter, SessionId, "Exception while processing message: " + ex.ToString(), Proxy.LogLevel.Error, LogLevel); } else { ProxyFunctions.Log(LogWriter, SessionId, "Exception while processing message: " + ex.Message, Proxy.LogLevel.Error, LogLevel); } } } }