< Summary - Estud

Line coverage
87%
Covered lines: 34
Uncovered lines: 5
Coverable lines: 39
Total lines: 112
Line coverage: 87.1%
Branch coverage
33%
Covered branches: 6
Total branches: 18
Branch coverage: 33.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/_/Back/obj/Release/net10.0/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs

File '/_/Back/obj/Release/net10.0/System.Text.RegularExpressions.Generator/System.Text.RegularExpressions.Generator.RegexGenerator/RegexGenerator.g.cs' does not exist (any more).

/home/runner/work/syki/syki/Back/Extensions/HttpExtensions.cs

#LineLine coverage
 1using Estud.Back.Auth.Schemes;
 2using System.Security.Claims;
 3using System.Text.RegularExpressions;
 4using Microsoft.AspNetCore.Authentication;
 5using Microsoft.AspNetCore.Mvc.Controllers;
 6
 7namespace Estud.Back.Extensions;
 8
 9public static partial class HttpExtensions
 10{
 11    extension(HttpResponse response)
 12    {
 13        public void AppendJWTCookie(string token, AuthSettings settings)
 14        {
 85415            response.Cookies.Append(
 85416                JwtBearerScheme.Cookie,
 85417                token,
 85418                new CookieOptions
 85419                {
 85420                    Path = "/",
 85421                    HttpOnly = true,
 85422                    Secure = settings.CookieSecure,
 85423                    SameSite = settings.CookieSameSite,
 85424                    MaxAge = TimeSpan.FromMinutes(settings.ExpirationTimeInMinutes),
 85425                }
 85426            );
 85427        }
 28
 29        public void DeleteJWTCookie(AuthSettings settings)
 30        {
 2431            response.Cookies.Delete(
 2432                JwtBearerScheme.Cookie,
 2433                new CookieOptions
 2434                {
 2435                    Path = "/",
 2436                    HttpOnly = true,
 2437                    SameSite = settings.CookieSameSite,
 2438                    Secure = settings.CookieSecure,
 2439                }
 2440            );
 2441        }
 42    }
 43
 44    [GeneratedRegex(@"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", RegexOptions.IgnoreCase)]
 45    private static partial Regex GuidPattern();
 46
 047    private static string NormalizePath(string path) => GuidPattern().Replace(path, "{id}");
 48
 49    extension(HttpContext context)
 50    {
 51        public string GetTargetControllerName()
 52        {
 330453            var endpoint = context.GetEndpoint();
 330454            if (endpoint == null) return NormalizePath(context.Request.Path.ToString());
 55
 330456            var action = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
 660657            if (action != null) return $"{action.ControllerName}Controller";
 58
 259            if (endpoint is RouteEndpoint routeEndpoint)
 260                return routeEndpoint.RoutePattern.RawText ?? endpoint.DisplayName ?? NormalizePath(context.Request.Path.
 61
 062            return endpoint.DisplayName ?? NormalizePath(context.Request.Path.ToString());
 63        }
 64
 65        public string GetIpAddress()
 66        {
 067            return context.Connection.RemoteIpAddress?.ToString() ?? "-";
 68        }
 69
 70        public string GetUserAgent()
 71        {
 072            return context.Request.Headers.UserAgent.FirstOrDefault() ?? "-";
 73        }
 74
 75        public async Task SignInTwoFactorUserIdSchemeAsync(int userId)
 76        {
 77            // Store user ID in Identity cookie for 2FA verification step
 2078            var identity = new ClaimsIdentity(IdentityConstants.TwoFactorUserIdScheme);
 2079            identity.AddClaim(new Claim(ClaimTypes.Name, userId.ToString()));
 2080            await context!.SignInAsync(IdentityConstants.TwoFactorUserIdScheme, new ClaimsPrincipal(identity));
 2081        }
 82    }
 83}