From 0716d0931aa4ee1acd72e0e97d723bd2fb87a290 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Tue, 5 May 2020 20:14:07 +0200 Subject: [PATCH] Added UserAgent to api request trace log --- .../Authentication/AuthenticationService.cs | 53 ++----------------- .../Pipelines/RequestLoggingPipeline.cs | 16 +++++- .../Extensions/RequestExtensions.cs | 46 ++++++++++++++++ 3 files changed, 65 insertions(+), 50 deletions(-) diff --git a/src/Sonarr.Http/Authentication/AuthenticationService.cs b/src/Sonarr.Http/Authentication/AuthenticationService.cs index 930b982e7..08b1cf03a 100644 --- a/src/Sonarr.Http/Authentication/AuthenticationService.cs +++ b/src/Sonarr.Http/Authentication/AuthenticationService.cs @@ -203,70 +203,27 @@ namespace Sonarr.Http.Authentication public void LogUnauthorized(NancyContext context) { - _authLogger.Info("Auth-Unauthorized ip {0} url '{1}'", GetRemoteIP(context), context.Request.Url.ToString()); + _authLogger.Info("Auth-Unauthorized ip {0} url '{1}'", context.GetRemoteIP(), context.Request.Url.ToString()); } private void LogInvalidated(NancyContext context) { - _authLogger.Info("Auth-Invalidated ip {0}", GetRemoteIP(context)); + _authLogger.Info("Auth-Invalidated ip {0}", context.GetRemoteIP()); } private void LogFailure(NancyContext context, string username) { - _authLogger.Warn("Auth-Failure ip {0} username '{1}'", GetRemoteIP(context), username); + _authLogger.Warn("Auth-Failure ip {0} username '{1}'", context.GetRemoteIP(), username); } private void LogSuccess(NancyContext context, string username) { - _authLogger.Info("Auth-Success ip {0} username '{1}'", GetRemoteIP(context), username); + _authLogger.Info("Auth-Success ip {0} username '{1}'", context.GetRemoteIP(), username); } private void LogLogout(NancyContext context, string username) { - _authLogger.Info("Auth-Logout ip {0} username '{1}'", GetRemoteIP(context), username); - } - - private string GetRemoteIP(NancyContext context) - { - if (context == null || context.Request == null) - { - return "Unknown"; - } - - var remoteAddress = context.Request.UserHostAddress; - IPAddress remoteIP; - - // Only check if forwarded by a local network reverse proxy - if (IPAddress.TryParse(remoteAddress, out remoteIP) && remoteIP.IsLocalAddress()) - { - var realIPHeader = context.Request.Headers["X-Real-IP"]; - if (realIPHeader.Any()) - { - return realIPHeader.First().ToString(); - } - - var forwardedForHeader = context.Request.Headers["X-Forwarded-For"]; - if (forwardedForHeader.Any()) - { - // Get the first address that was forwarded by a local IP to prevent remote clients faking another proxy - foreach (var forwardedForAddress in forwardedForHeader.SelectMany(v => v.Split(',')).Select(v => v.Trim()).Reverse()) - { - if (!IPAddress.TryParse(forwardedForAddress, out remoteIP)) - { - return remoteAddress; - } - - if (!remoteIP.IsLocalAddress()) - { - return forwardedForAddress; - } - - remoteAddress = forwardedForAddress; - } - } - } - - return remoteAddress; + _authLogger.Info("Auth-Logout ip {0} username '{1}'", context.GetRemoteIP(), username); } } } diff --git a/src/Sonarr.Http/Extensions/Pipelines/RequestLoggingPipeline.cs b/src/Sonarr.Http/Extensions/Pipelines/RequestLoggingPipeline.cs index 067bc45e6..3a16d1046 100644 --- a/src/Sonarr.Http/Extensions/Pipelines/RequestLoggingPipeline.cs +++ b/src/Sonarr.Http/Extensions/Pipelines/RequestLoggingPipeline.cs @@ -42,7 +42,7 @@ namespace NzbDrone.Api.Extensions.Pipelines var reqPath = GetRequestPathAndQuery(context.Request); - _loggerHttp.Trace("Req: {0} [{1}] {2}", id, context.Request.Method, reqPath); + _loggerHttp.Trace("Req: {0} [{1}] {2} (from {3})", id, context.Request.Method, reqPath, GetOrigin(context)); return null; } @@ -89,5 +89,17 @@ namespace NzbDrone.Api.Extensions.Pipelines return request.Url.Path; } } + + private static string GetOrigin(NancyContext context) + { + if (context.Request.Headers.UserAgent.IsNullOrWhiteSpace()) + { + return context.GetRemoteIP(); + } + else + { + return $"{context.GetRemoteIP()} {context.Request.Headers.UserAgent}"; + } + } } -} +} \ No newline at end of file diff --git a/src/Sonarr.Http/Extensions/RequestExtensions.cs b/src/Sonarr.Http/Extensions/RequestExtensions.cs index 77ef4a15e..87a3d4c0f 100644 --- a/src/Sonarr.Http/Extensions/RequestExtensions.cs +++ b/src/Sonarr.Http/Extensions/RequestExtensions.cs @@ -1,5 +1,8 @@ using System; +using System.Linq; +using System.Net; using Nancy; +using NzbDrone.Common.Extensions; namespace Sonarr.Http.Extensions { @@ -78,5 +81,48 @@ namespace Sonarr.Http.Extensions return defaultValue; } + + public static string GetRemoteIP(this NancyContext context) + { + if (context == null || context.Request == null) + { + return "Unknown"; + } + + var remoteAddress = context.Request.UserHostAddress; + IPAddress remoteIP; + + // Only check if forwarded by a local network reverse proxy + if (IPAddress.TryParse(remoteAddress, out remoteIP) && remoteIP.IsLocalAddress()) + { + var realIPHeader = context.Request.Headers["X-Real-IP"]; + if (realIPHeader.Any()) + { + return realIPHeader.First().ToString(); + } + + var forwardedForHeader = context.Request.Headers["X-Forwarded-For"]; + if (forwardedForHeader.Any()) + { + // Get the first address that was forwarded by a local IP to prevent remote clients faking another proxy + foreach (var forwardedForAddress in forwardedForHeader.SelectMany(v => v.Split(',')).Select(v => v.Trim()).Reverse()) + { + if (!IPAddress.TryParse(forwardedForAddress, out remoteIP)) + { + return remoteAddress; + } + + if (!remoteIP.IsLocalAddress()) + { + return forwardedForAddress; + } + + remoteAddress = forwardedForAddress; + } + } + } + + return remoteAddress; + } } }