Merge pull request #1495 from ONLYOFFICE/feature/ipsecurity-fixes

Feature/ipsecurity fixes
This commit is contained in:
Pavel Bannov 2023-07-03 03:27:09 -07:00 committed by GitHub
commit 2a80673ba4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 23 deletions

View File

@ -73,8 +73,16 @@ internal class IPAddressRange
{ {
var parts = CIDRmask.Split('/'); var parts = CIDRmask.Split('/');
var IP_addr = BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0); var requestIP = IPAddress.Parse(ipAddress);
var CIDR_addr = BitConverter.ToInt32(IPAddress.Parse(parts[0]).GetAddressBytes(), 0); var restrictionIP = IPAddress.Parse(parts[0]);
if (requestIP.AddressFamily != restrictionIP.AddressFamily)
{
return false;
}
var IP_addr = BitConverter.ToInt32(requestIP.GetAddressBytes(), 0);
var CIDR_addr = BitConverter.ToInt32(restrictionIP.GetAddressBytes(), 0);
var CIDR_mask = IPAddress.HostToNetworkOrder(-1 << (32 - int.Parse(parts[1]))); var CIDR_mask = IPAddress.HostToNetworkOrder(-1 << (32 - int.Parse(parts[1])));
return (IP_addr & CIDR_mask) == (CIDR_addr & CIDR_mask); return (IP_addr & CIDR_mask) == (CIDR_addr & CIDR_mask);

View File

@ -38,7 +38,6 @@ public class IPSecurity
private readonly IPRestrictionsService _ipRestrictionsService; private readonly IPRestrictionsService _ipRestrictionsService;
private readonly string _currentIpForTest; private readonly string _currentIpForTest;
private readonly string _myNetworks; private readonly string _myNetworks;
private readonly SecurityContext _securityContext;
private readonly UserManager _userManager; private readonly UserManager _userManager;
public IPSecurity( public IPSecurity(
@ -47,7 +46,6 @@ public class IPSecurity
AuthContext authContext, AuthContext authContext,
TenantManager tenantManager, TenantManager tenantManager,
IPRestrictionsService iPRestrictionsService, IPRestrictionsService iPRestrictionsService,
SecurityContext securityContext,
UserManager userManager, UserManager userManager,
ILogger<IPSecurity> logger) ILogger<IPSecurity> logger)
{ {
@ -56,7 +54,6 @@ public class IPSecurity
_authContext = authContext; _authContext = authContext;
_tenantManager = tenantManager; _tenantManager = tenantManager;
_ipRestrictionsService = iPRestrictionsService; _ipRestrictionsService = iPRestrictionsService;
_securityContext = securityContext;
_userManager = userManager; _userManager = userManager;
_currentIpForTest = configuration["ipsecurity:test"]; _currentIpForTest = configuration["ipsecurity:test"];
_myNetworks = configuration["ipsecurity:mynetworks"]; _myNetworks = configuration["ipsecurity:mynetworks"];
@ -97,7 +94,6 @@ public class IPSecurity
if (string.IsNullOrWhiteSpace(requestIps)) if (string.IsNullOrWhiteSpace(requestIps))
{ {
var request = _httpContextAccessor.HttpContext.Request;
requestIps = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); requestIps = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
} }
@ -105,7 +101,7 @@ public class IPSecurity
? Array.Empty<string>() ? Array.Empty<string>()
: requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries); : requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
var isDocSpaceAdmin = await _userManager.IsUserInGroupAsync(_securityContext.CurrentAccount.ID, Core.Users.Constants.GroupAdmin.ID); var isDocSpaceAdmin = await _userManager.IsUserInGroupAsync(_authContext.CurrentAccount.ID, Core.Users.Constants.GroupAdmin.ID);
if (ips.Any(requestIp => restrictions.Any(restriction => (restriction.ForAdmin ? isDocSpaceAdmin : true) && MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip)))) if (ips.Any(requestIp => restrictions.Any(restriction => (restriction.ForAdmin ? isDocSpaceAdmin : true) && MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip))))
{ {
@ -131,7 +127,7 @@ public class IPSecurity
public static bool MatchIPs(string requestIp, string restrictionIp) public static bool MatchIPs(string requestIp, string restrictionIp)
{ {
var dividerIdx = restrictionIp.IndexOf('-'); var dividerIdx = restrictionIp.IndexOf('-');
if (dividerIdx > -1) if (dividerIdx > 0)
{ {
var lower = IPAddress.Parse(restrictionIp.Substring(0, dividerIdx).Trim()); var lower = IPAddress.Parse(restrictionIp.Substring(0, dividerIdx).Trim());
var upper = IPAddress.Parse(restrictionIp.Substring(dividerIdx + 1).Trim()); var upper = IPAddress.Parse(restrictionIp.Substring(dividerIdx + 1).Trim());
@ -141,7 +137,7 @@ public class IPSecurity
return range.IsInRange(IPAddress.Parse(requestIp)); return range.IsInRange(IPAddress.Parse(requestIp));
} }
if (restrictionIp.IndexOf('/') > -1) if (restrictionIp.IndexOf('/') > 0)
{ {
return IPAddressRange.IsInRange(requestIp, restrictionIp); return IPAddressRange.IsInRange(requestIp, restrictionIp);
} }

View File

@ -170,13 +170,6 @@ public class MessageSettingsController : BaseSettingsController
throw new Exception(_customNamingPeople.Substitute<Resource>("ErrorEmailAlreadyExists")); throw new Exception(_customNamingPeople.Substitute<Resource>("ErrorEmailAlreadyExists"));
} }
var settings = await _settingsManager.LoadAsync<IPRestrictionsSettings>();
if (settings.Enable && !await _ipSecurity.VerifyAsync())
{
throw new Exception(Resource.ErrorAccessRestricted);
}
var trustedDomainSettings = await _settingsManager.LoadAsync<StudioTrustedDomainSettings>(); var trustedDomainSettings = await _settingsManager.LoadAsync<StudioTrustedDomainSettings>();
var emplType = trustedDomainSettings.InviteAsUsers ? EmployeeType.User : EmployeeType.RoomAdmin; var emplType = trustedDomainSettings.InviteAsUsers ? EmployeeType.User : EmployeeType.RoomAdmin;
if (!_coreBaseSettings.Personal) if (!_coreBaseSettings.Personal)

View File

@ -380,13 +380,6 @@ public sealed class UserManagerWrapper
throw new ArgumentNullException(nameof(email), Resource.ErrorNotCorrectEmail); throw new ArgumentNullException(nameof(email), Resource.ErrorNotCorrectEmail);
} }
var settings = await _settingsManager.LoadAsync<IPRestrictionsSettings>();
if (settings.Enable && !await _iPSecurity.VerifyAsync())
{
throw new Exception(Resource.ErrorAccessRestricted);
}
var userInfo = await _userManager.GetUserByEmailAsync(email); var userInfo = await _userManager.GetUserByEmailAsync(email);
if (!_userManager.UserExists(userInfo) || string.IsNullOrEmpty(userInfo.Email)) if (!_userManager.UserExists(userInfo) || string.IsNullOrEmpty(userInfo.Email))
{ {