add ProxyJump function

This commit is contained in:
redlineo committed 2026-07-23 12:38:13 +03:00
1 parent 56e20e5464
commit 7f0e0fdb23
48 files changed
+3875 -44

No files matched your search

@@ -0,0 +1,123 @@
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Win32;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace BulkArchiveMailer.AddIn
{
/// <summary>
/// Reads the user's default "new message" Outlook signature HTML from
/// disk. Outlook Interop has no API that exposes "the currently
/// selected default signature" - the only reliable way to get at it
/// is: look up its *name* in the registry
/// (HKCU\Software\Microsoft\Office\&lt;version&gt;\Common\MailSettings,
/// value "NewSignature"), then load the matching .htm file from
/// %APPDATA%\Microsoft\Signatures\&lt;name&gt;.htm ourselves.
///
/// This is the only file in the solution that touches the Windows
/// registry - deliberately kept out of BulkArchiveMailer.Core.
/// </summary>
public static class SignatureReader
{
/// <summary>
/// Best-effort auto-detection. Never throws - returns null if the
/// registry value, the version-specific key, or the .htm file is
/// missing for any reason, so the caller can fall back to letting
/// the operator pick a signature file manually instead of crashing
/// the add-in.
/// </summary>
public static string TryAutoDetectSignatureHtml(Outlook.Application application)
{
try
{
var signatureName = TryReadSignatureName(application);
if (string.IsNullOrEmpty(signatureName))
{
return null;
}
var path = ResolveSignaturePath(signatureName);
return File.Exists(path) ? File.ReadAllText(path) : null;
}
catch
{
return null;
}
}
/// <summary>Same lookup, but returns the resolved .htm path instead of its contents - useful for SettingsForm to show/prefill the path.</summary>
public static string TryAutoDetectSignaturePath(Outlook.Application application)
{
try
{
var signatureName = TryReadSignatureName(application);
if (string.IsNullOrEmpty(signatureName))
{
return null;
}
var path = ResolveSignaturePath(signatureName);
return File.Exists(path) ? path : null;
}
catch
{
return null;
}
}
public static string ResolveSignaturePath(string signatureName)
{
var signaturesFolder = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"Microsoft",
"Signatures");
return Path.Combine(signaturesFolder, signatureName + ".htm");
}
private static string TryReadSignatureName(Outlook.Application application)
{
var candidateVersions = new List<string>();
try
{
// application.Version looks like "16.0" and lines up
// exactly with the Office registry hive layout, so prefer
// it over the fixed fallback list below.
var version = application?.Version;
if (!string.IsNullOrEmpty(version))
{
candidateVersions.Add(version);
}
}
catch
{
// Interop call failed for some reason - fall through to
// the fixed list.
}
foreach (var fallback in new[] { "16.0", "15.0", "14.0" })
{
if (!candidateVersions.Contains(fallback))
{
candidateVersions.Add(fallback);
}
}
foreach (var version in candidateVersions)
{
using (var key = Registry.CurrentUser.OpenSubKey(
$@"Software\Microsoft\Office\{version}\Common\MailSettings"))
{
var value = key?.GetValue("NewSignature") as string;
if (!string.IsNullOrEmpty(value))
{
return value;
}
}
}
return null;
}
}
}