From 0f4c69ff81cd2d9cd9ad3388937c84bbbc315e51 Mon Sep 17 00:00:00 2001
From: Quietsy <quietsy@gmail.com>
Date: Sat, 3 Oct 2020 17:50:03 +0300
Subject: [PATCH] Added logging of failed login for Fail2Ban

Added logging of failed login for Fail2Ban, supports reverse proxy and direct connection, tested directly and using NGINX
---
 src/Ombi/Controllers/V1/TokenController.cs | 29 +++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/Ombi/Controllers/V1/TokenController.cs b/src/Ombi/Controllers/V1/TokenController.cs
index d706434f8..fcbc5ba43 100644
--- a/src/Ombi/Controllers/V1/TokenController.cs
+++ b/src/Ombi/Controllers/V1/TokenController.cs
@@ -7,6 +7,7 @@ using System.Text;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Logging;
 using Microsoft.IdentityModel.Tokens;
 using Ombi.Core.Authentication;
 using Ombi.Helpers;
@@ -24,18 +25,20 @@ namespace Ombi.Controllers.V1
     public class TokenController : ControllerBase
     {
         public TokenController(OmbiUserManager um, IOptions<TokenAuthentication> ta, ITokenRepository token,
-            IPlexOAuthManager oAuthManager)
+            IPlexOAuthManager oAuthManager, ILogger<TokenController> logger)
         {
             _userManager = um;
             _tokenAuthenticationOptions = ta.Value;
             _token = token;
             _plexOAuthManager = oAuthManager;
+            _log = logger;
         }
 
         private readonly TokenAuthentication _tokenAuthenticationOptions;
         private readonly ITokenRepository _token;
         private readonly OmbiUserManager _userManager;
         private readonly IPlexOAuthManager _plexOAuthManager;
+        private readonly ILogger<TokenController> _log;
 
         /// <summary>
         /// Gets the token.
@@ -57,6 +60,7 @@ namespace Ombi.Controllers.V1
 
                     if (user == null)
                     {
+                        _log.LogWarning(string.Format("Failed login attempt by IP: {0}", GetRequestIP()));
                         return new UnauthorizedResult();
                     }
 
@@ -80,6 +84,7 @@ namespace Ombi.Controllers.V1
                 var url = await _plexOAuthManager.GetOAuthUrl(model.PlexTvPin.code, websiteAddress);
                 if (url == null)
                 {
+                    _log.LogWarning(string.Format("Failed login attempt by IP: {0}", GetRequestIP()));
                     return new JsonResult(new
                     {
                         error = "Application URL has not been set"
@@ -88,6 +93,7 @@ namespace Ombi.Controllers.V1
                 return new JsonResult(new { url = url.ToString(), pinId = model.PlexTvPin.id });
             }
 
+            _log.LogWarning(string.Format("Failed login attempt by IP: {0}", GetRequestIP()));
             return new UnauthorizedResult();
         }
 
@@ -248,5 +254,26 @@ namespace Ombi.Controllers.V1
             public string Userename { get; set; }
         }
 
+        private string GetRequestIP()
+        {
+            string ip = null;
+
+            if (Request.HttpContext?.Request?.Headers != null && Request.HttpContext.Request.Headers.ContainsKey("X-Forwarded-For"))
+            {
+                var forwardedip = Request.HttpContext.Request.Headers["X-Forwarded-For"].ToString();
+                ip = forwardedip.TrimEnd(',').Split(",").Select(s => s.Trim()).FirstOrDefault();
+            }
+
+            if (string.IsNullOrWhiteSpace(ip) && Request.HttpContext?.Connection?.RemoteIpAddress != null)
+                ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
+
+            if (string.IsNullOrWhiteSpace(ip) && Request.HttpContext?.Request?.Headers != null && Request.HttpContext.Request.Headers.ContainsKey("REMOTE_ADDR"))
+            {
+                var remoteip = Request.HttpContext.Request.Headers["REMOTE_ADDR"].ToString();
+                ip = remoteip.TrimEnd(',').Split(",").Select(s => s.Trim()).FirstOrDefault();
+            }
+
+            return ip;
+        }
     }
 }
\ No newline at end of file