1
0
mirror of https://github.com/bitwarden/server.git synced 2024-11-27 13:05:23 +01:00

[PM-12630] support for ping identity SCIM provisioning (#4804)

* support for ping identity SCIM provisioning

* mark ping ip list static
This commit is contained in:
Kyle Spearrin 2024-09-26 16:04:27 -04:00 committed by GitHub
parent 226f26a715
commit 8c8956da37
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 42 additions and 4 deletions

View File

@ -4,6 +4,7 @@ using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Core.Utilities;
namespace Bit.Scim.Context; namespace Bit.Scim.Context;
@ -11,6 +12,32 @@ public class ScimContext : IScimContext
{ {
private bool _builtHttpContext; private bool _builtHttpContext;
// See IP list from Ping in docs: https://support.pingidentity.com/s/article/PingOne-IP-Addresses
private static readonly HashSet<string> _pingIpAddresses =
[
"18.217.152.87",
"52.14.10.143",
"13.58.49.148",
"34.211.92.81",
"54.214.158.219",
"34.218.98.164",
"15.223.133.47",
"3.97.84.38",
"15.223.19.71",
"3.97.98.120",
"52.60.115.173",
"3.97.202.223",
"18.184.65.93",
"52.57.244.92",
"18.195.7.252",
"108.128.67.71",
"34.246.158.102",
"108.128.250.27",
"52.63.103.92",
"13.54.131.18",
"52.62.204.36"
];
public ScimProviderType RequestScimProvider { get; set; } = ScimProviderType.Default; public ScimProviderType RequestScimProvider { get; set; } = ScimProviderType.Default;
public ScimConfig ScimConfiguration { get; set; } public ScimConfig ScimConfiguration { get; set; }
public Guid? OrganizationId { get; set; } public Guid? OrganizationId { get; set; }
@ -55,10 +82,18 @@ public class ScimContext : IScimContext
RequestScimProvider = ScimProviderType.Okta; RequestScimProvider = ScimProviderType.Okta;
} }
} }
if (RequestScimProvider == ScimProviderType.Default && if (RequestScimProvider == ScimProviderType.Default &&
httpContext.Request.Headers.ContainsKey("Adscimversion")) httpContext.Request.Headers.ContainsKey("Adscimversion"))
{ {
RequestScimProvider = ScimProviderType.AzureAd; RequestScimProvider = ScimProviderType.AzureAd;
} }
var ipAddress = CoreHelpers.GetIpAddress(httpContext, globalSettings);
if (RequestScimProvider == ScimProviderType.Default &&
_pingIpAddresses.Contains(ipAddress))
{
RequestScimProvider = ScimProviderType.Ping;
}
} }
} }

View File

@ -43,7 +43,8 @@ public class PutGroupCommand : IPutGroupCommand
private async Task UpdateGroupMembersAsync(Group group, ScimGroupRequestModel model) private async Task UpdateGroupMembersAsync(Group group, ScimGroupRequestModel model)
{ {
if (_scimContext.RequestScimProvider != ScimProviderType.Okta) if (_scimContext.RequestScimProvider != ScimProviderType.Okta &&
_scimContext.RequestScimProvider != ScimProviderType.Ping)
{ {
return; return;
} }

View File

@ -20,15 +20,16 @@ public class GetUsersListQuery : IGetUsersListQuery
string externalIdFilter = null; string externalIdFilter = null;
if (!string.IsNullOrWhiteSpace(filter)) if (!string.IsNullOrWhiteSpace(filter))
{ {
if (filter.StartsWith("userName eq ")) var filterLower = filter.ToLowerInvariant();
if (filterLower.StartsWith("username eq "))
{ {
usernameFilter = filter.Substring(12).Trim('"').ToLowerInvariant(); usernameFilter = filterLower.Substring(12).Trim('"');
if (usernameFilter.Contains("@")) if (usernameFilter.Contains("@"))
{ {
emailFilter = usernameFilter; emailFilter = usernameFilter;
} }
} }
else if (filter.StartsWith("externalId eq ")) else if (filterLower.StartsWith("externalid eq "))
{ {
externalIdFilter = filter.Substring(14).Trim('"'); externalIdFilter = filter.Substring(14).Trim('"');
} }

View File

@ -9,4 +9,5 @@ public enum ScimProviderType : byte
JumpCloud = 4, JumpCloud = 4,
GoogleWorkspace = 5, GoogleWorkspace = 5,
Rippling = 6, Rippling = 6,
Ping = 7,
} }