Some checks failed
		
		
	
	Build Test Deploy / build-test (push) Has been cancelled
				
			Build Test Deploy / authority-container (push) Has been cancelled
				
			Build Test Deploy / docs (push) Has been cancelled
				
			Build Test Deploy / deploy (push) Has been cancelled
				
			Docs CI / lint-and-preview (push) Has been cancelled
				
			
		
			
				
	
	
		
			55 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Microsoft.AspNetCore.Http;
 | |
| using NetTools;
 | |
| using System;
 | |
| using System.Linq;
 | |
| using System.Net;
 | |
| using System.Collections.Generic;
 | |
| using Ablera.Serdica.Authentication.Utilities;
 | |
| using Ablera.Serdica.Authentication.Models.Oidc;
 | |
| using Ablera.Serdica.Common.Tools.Utilities;
 | |
| 
 | |
| namespace Ablera.Serdica.Authority.Extensions;
 | |
| 
 | |
| public static class AllowedMaskExtensions
 | |
| {
 | |
|     // Lazily built the first time AllowedMaskExtensions is referenced.
 | |
|     private static readonly IReadOnlyCollection<IPAddressRange> AssociatedNetworks = ListeningNetworksRetriever.Retrieve();
 | |
| 
 | |
|     public static AllowedMask? MergeWith(this AllowedMask? client, AllowedMask? global)
 | |
|         => (client, global) switch
 | |
|         {
 | |
|             (null, null) => null,
 | |
|             (null, _) => global,
 | |
|             _ => new()
 | |
|             {
 | |
|                 SameNetworks = client.SameNetworks ?? global?.SameNetworks,
 | |
|                 Networks = client.Networks ?? global?.Networks,
 | |
|                 Hosts = client.Hosts ?? global?.Hosts,
 | |
|                 Ports = client.Ports ?? global?.Ports
 | |
|             }
 | |
|         };
 | |
| 
 | |
|     public static bool MatchesRemote(this AllowedMask allow, HttpContext http)
 | |
|     {
 | |
|         var remoteIp = http.Connection.RemoteIpAddress ?? IPAddress.None;
 | |
|         var host = http.Request.Host.Host;
 | |
|         var port = http.Request.Host.Port ?? 0;
 | |
| 
 | |
|         bool ipOk = allow.Networks == null ||
 | |
|                       allow.Networks.Any(net => IPAddressRange.Parse(net).Contains(remoteIp));
 | |
| 
 | |
|         bool hostOk = allow.Hosts == null ||
 | |
|                       allow.Hosts.Any(h => StringComparer.OrdinalIgnoreCase.Equals(h, host));
 | |
| 
 | |
|         bool portOk = allow.Ports == null || allow.Ports.Contains(port);
 | |
| 
 | |
|         // Same-network rule: only enforced when SameNetwork == true
 | |
|         bool sameNetworkOk =
 | |
|             allow.SameNetworks != true ||         // Flag not enabled → no restriction
 | |
|             AssociatedNetworks == null ||         // Could not determine our own network
 | |
|             AssociatedNetworks.Any(network => network.Contains(remoteIp));
 | |
| 
 | |
|         return ipOk && hostOk && portOk && sameNetworkOk;
 | |
|     }
 | |
| }
 |