2022-05-05 13:23:05 +00:00
|
|
|
|
// (c) Copyright Ascensio System SIA 2010-2022
|
|
|
|
|
//
|
|
|
|
|
// This program is a free software product.
|
|
|
|
|
// You can redistribute it and/or modify it under the terms
|
|
|
|
|
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
|
|
|
|
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
|
|
|
|
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
|
|
|
|
// any third-party rights.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
|
|
|
|
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
|
|
|
|
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
|
|
|
//
|
|
|
|
|
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
|
|
|
|
//
|
|
|
|
|
// The interactive user interfaces in modified source and object code versions of the Program must
|
|
|
|
|
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
|
|
|
|
//
|
|
|
|
|
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
|
|
|
|
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
|
|
|
|
// trademark law for use of our trademarks.
|
|
|
|
|
//
|
|
|
|
|
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
|
|
|
|
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
|
|
|
|
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
|
|
|
|
|
|
|
|
using Constants = ASC.Core.Users.Constants;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
using SecurityContext = ASC.Core.SecurityContext;
|
|
|
|
|
|
|
|
|
|
namespace ASC.ActiveDirectory.ComplexOperations;
|
|
|
|
|
[Transient(Additional = typeof(LdapOperationExtension))]
|
|
|
|
|
public class LdapOperationJob : DistributedTaskProgress
|
|
|
|
|
{
|
|
|
|
|
private string _culture;
|
|
|
|
|
|
|
|
|
|
public LdapSettings LDAPSettings { get; private set; }
|
|
|
|
|
protected string Source { get; private set; }
|
|
|
|
|
protected new string Status { get; set; }
|
|
|
|
|
protected string Error { get; set; }
|
|
|
|
|
protected string Warning { get; set; }
|
|
|
|
|
|
|
|
|
|
private int? _tenantId;
|
|
|
|
|
public int TenantId
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
2022-05-05 13:23:05 +00:00
|
|
|
|
return _tenantId ?? this[nameof(_tenantId)];
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
2022-05-13 09:20:28 +00:00
|
|
|
|
private set
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
|
|
|
|
_tenantId = value;
|
2022-05-05 13:23:05 +00:00
|
|
|
|
this[nameof(_tenantId)] = value;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public LdapOperationType OperationType { get; private set; }
|
|
|
|
|
public static LdapLocalization Resource { get; private set; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private readonly TenantManager _tenantManager;
|
|
|
|
|
private readonly SecurityContext _securityContext;
|
|
|
|
|
private readonly LdapUserManager _lDAPUserManager;
|
|
|
|
|
private readonly NovellLdapHelper _novellLdapHelper;
|
|
|
|
|
private readonly LdapUserImporter _ldapUserImporter;
|
|
|
|
|
private readonly LdapChangeCollection _ldapChanges;
|
|
|
|
|
private readonly UserFormatter _userFormatter;
|
|
|
|
|
private readonly SettingsManager _settingsManager;
|
|
|
|
|
private readonly UserPhotoManager _userPhotoManager;
|
|
|
|
|
private readonly WebItemSecurity _webItemSecurity;
|
|
|
|
|
private readonly UserManager _userManager;
|
|
|
|
|
private readonly DisplayUserSettingsHelper _displayUserSettingsHelper;
|
|
|
|
|
private readonly NovellLdapSettingsChecker _novellLdapSettingsChecker;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
private readonly ILogger<LdapOperationJob> _logger;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
private UserInfo _currentUser;
|
|
|
|
|
|
|
|
|
|
public LdapOperationJob(
|
|
|
|
|
TenantManager tenantManager,
|
|
|
|
|
SecurityContext securityContext,
|
|
|
|
|
LdapUserManager ldapUserManager,
|
|
|
|
|
NovellLdapHelper novellLdapHelper,
|
|
|
|
|
NovellLdapUserImporter novellLdapUserImporter,
|
|
|
|
|
LdapChangeCollection ldapChanges,
|
|
|
|
|
UserFormatter userFormatter,
|
|
|
|
|
SettingsManager settingsManager,
|
|
|
|
|
UserPhotoManager userPhotoManager,
|
|
|
|
|
WebItemSecurity webItemSecurity,
|
|
|
|
|
UserManager userManager,
|
|
|
|
|
DisplayUserSettingsHelper displayUserSettingsHelper,
|
|
|
|
|
NovellLdapSettingsChecker novellLdapSettingsChecker,
|
2022-06-08 09:42:49 +00:00
|
|
|
|
ILogger<LdapOperationJob> logger)
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
|
|
|
|
_tenantManager = tenantManager;
|
|
|
|
|
_securityContext = securityContext;
|
|
|
|
|
_lDAPUserManager = ldapUserManager;
|
|
|
|
|
_novellLdapHelper = novellLdapHelper;
|
|
|
|
|
_ldapUserImporter = novellLdapUserImporter;
|
|
|
|
|
_ldapChanges = ldapChanges;
|
|
|
|
|
_userFormatter = userFormatter;
|
|
|
|
|
_settingsManager = settingsManager;
|
|
|
|
|
_userPhotoManager = userPhotoManager;
|
|
|
|
|
_webItemSecurity = webItemSecurity;
|
|
|
|
|
_userManager = userManager;
|
|
|
|
|
_displayUserSettingsHelper = displayUserSettingsHelper;
|
|
|
|
|
_novellLdapSettingsChecker = novellLdapSettingsChecker;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger = logger;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void InitJob(
|
|
|
|
|
LdapSettings settings,
|
|
|
|
|
Tenant tenant,
|
|
|
|
|
LdapOperationType operationType,
|
|
|
|
|
LdapLocalization resource,
|
|
|
|
|
string userId)
|
|
|
|
|
{
|
|
|
|
|
_currentUser = userId != null ? _userManager.GetUsers(Guid.Parse(userId)) : null;
|
|
|
|
|
|
2022-05-13 09:20:28 +00:00
|
|
|
|
TenantId = tenant.Id;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_tenantManager.SetCurrentTenant(tenant);
|
|
|
|
|
|
|
|
|
|
OperationType = operationType;
|
|
|
|
|
|
|
|
|
|
_culture = Thread.CurrentThread.CurrentCulture.Name;
|
|
|
|
|
|
|
|
|
|
LDAPSettings = settings;
|
|
|
|
|
|
|
|
|
|
Source = "";
|
|
|
|
|
Percentage = 0;
|
|
|
|
|
Status = "";
|
|
|
|
|
Error = "";
|
|
|
|
|
Warning = "";
|
|
|
|
|
|
|
|
|
|
Resource = resource ?? new LdapLocalization();
|
|
|
|
|
_lDAPUserManager.Init(Resource);
|
2022-05-13 09:20:28 +00:00
|
|
|
|
|
|
|
|
|
InitDisturbedTask();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void DoJob()
|
|
|
|
|
{
|
|
|
|
|
try
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_securityContext.AuthenticateMe(Core.Configuration.Constants.CoreSystem);
|
|
|
|
|
|
|
|
|
|
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(_culture);
|
|
|
|
|
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(_culture);
|
|
|
|
|
|
|
|
|
|
if (LDAPSettings == null)
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorSaveDefaultLdapSettings();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.InfoStartOperation(Enum.GetName(typeof(LdapOperationType), OperationType));
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SetProgress(1, Resource.LdapSettingsStatusCheckingLdapSettings);
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugPrepareSettings();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
PrepareSettings(LDAPSettings);
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(Error))
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugPrepareSettingsError(Error);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_ldapUserImporter.Init(LDAPSettings, Resource);
|
|
|
|
|
|
|
|
|
|
if (LDAPSettings.EnableLdapAuthentication)
|
|
|
|
|
{
|
|
|
|
|
_novellLdapSettingsChecker.Init(_ldapUserImporter);
|
|
|
|
|
|
|
|
|
|
SetProgress(5, Resource.LdapSettingsStatusLoadingBaseInfo);
|
|
|
|
|
|
|
|
|
|
var result = _novellLdapSettingsChecker.CheckSettings();
|
|
|
|
|
|
|
|
|
|
if (result != LdapSettingsStatus.Ok)
|
|
|
|
|
{
|
|
|
|
|
if (result == LdapSettingsStatus.CertificateRequest)
|
|
|
|
|
{
|
2022-05-05 13:23:05 +00:00
|
|
|
|
this[LdapTaskProperty.CERT_REQUEST] = _novellLdapSettingsChecker.CertificateConfirmRequest;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Error = GetError(result);
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugCheckSettingsError(Error);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.InfoStartOperation(Enum.GetName(typeof(LdapOperationType), OperationType));
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
_ldapUserImporter.Init(LDAPSettings, Resource);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
Do();
|
|
|
|
|
}
|
|
|
|
|
catch (AuthorizingException authError)
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.ErrorAccessDenied;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorAuthorizing(Error, new SecurityException(Error, authError));
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
catch (AggregateException ae)
|
|
|
|
|
{
|
|
|
|
|
ae.Flatten().Handle(e => e is TaskCanceledException || e is OperationCanceledException);
|
|
|
|
|
}
|
|
|
|
|
catch (TenantQuotaException e)
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsTenantQuotaSettled;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorTenantQuota(e);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
catch (FormatException e)
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsErrorCantCreateUsers;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorFormatException(e);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsInternalServerError;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorInternal(e);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2022-05-05 13:23:05 +00:00
|
|
|
|
this[LdapTaskProperty.FINISHED] = true;
|
2022-05-13 09:20:28 +00:00
|
|
|
|
PublishTaskInfo();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_securityContext.Logout();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorLdapOperationFinalizationlProblem(ex);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Do()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (OperationType == LdapOperationType.Save)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(10, Resource.LdapSettingsStatusSavingSettings);
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
LDAPSettings.IsDefault = LDAPSettings.Equals(LDAPSettings.GetDefault());
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!_settingsManager.Save(LDAPSettings))
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorSaveLdapSettings();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantSaveLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (LDAPSettings.EnableLdapAuthentication)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
if (_logger.IsEnabled(LogLevel.Debug))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
sb.AppendLine("SyncLDAP()");
|
|
|
|
|
sb.AppendLine(string.Format("Server: {0}:{1}", LDAPSettings.Server, LDAPSettings.PortNumber));
|
|
|
|
|
sb.AppendLine("UserDN: " + LDAPSettings.UserDN);
|
|
|
|
|
sb.AppendLine("LoginAttr: " + LDAPSettings.LoginAttribute);
|
|
|
|
|
sb.AppendLine("UserFilter: " + LDAPSettings.UserFilter);
|
|
|
|
|
sb.AppendLine("Groups: " + LDAPSettings.GroupMembership);
|
|
|
|
|
if (LDAPSettings.GroupMembership)
|
|
|
|
|
{
|
|
|
|
|
sb.AppendLine("GroupDN: " + LDAPSettings.GroupDN);
|
|
|
|
|
sb.AppendLine("UserAttr: " + LDAPSettings.UserAttribute);
|
|
|
|
|
sb.AppendLine("GroupFilter: " + LDAPSettings.GroupFilter);
|
|
|
|
|
sb.AppendLine("GroupName: " + LDAPSettings.GroupNameAttribute);
|
|
|
|
|
sb.AppendLine("GroupMember: " + LDAPSettings.GroupAttribute);
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugLdapSettings(sb.ToString());
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SyncLDAP();
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(Error))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugTurnOffLDAP();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
TurnOffLDAP();
|
2022-05-05 13:23:05 +00:00
|
|
|
|
var ldapCurrentUserPhotos = _settingsManager.Load<LdapCurrentUserPhotos>().GetDefault();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_settingsManager.Save(ldapCurrentUserPhotos);
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
var ldapCurrentAcccessSettings = _settingsManager.Load<LdapCurrentAcccessSettings>().GetDefault();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_settingsManager.Save(ldapCurrentAcccessSettings);
|
|
|
|
|
//не снимать права при выключении
|
|
|
|
|
//var rights = new List<LdapSettings.AccessRight>();
|
|
|
|
|
//TakeUsersRights(rights);
|
|
|
|
|
|
|
|
|
|
//if (rights.Count > 0)
|
|
|
|
|
//{
|
|
|
|
|
// Warning = Resource.LdapSettingsErrorLostRights;
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (NovellLdapTlsCertificateRequestedException ex)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorCheckSettings(
|
|
|
|
|
LDAPSettings.AcceptCertificate, LDAPSettings.AcceptCertificateHash, ex);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsStatusCertificateVerification;
|
|
|
|
|
|
|
|
|
|
//TaskInfo.SetProperty(CERT_REQUEST, ex.CertificateConfirmRequest);
|
|
|
|
|
}
|
|
|
|
|
catch (TenantQuotaException e)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorTenantQuota(e);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsTenantQuotaSettled;
|
|
|
|
|
}
|
|
|
|
|
catch (FormatException e)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorFormatException(e);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantCreateUsers;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorInternal(e);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsInternalServerError;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
SetProgress(99, Resource.LdapSettingsStatusDisconnecting, "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetProgress(100, OperationType == LdapOperationType.SaveTest ||
|
|
|
|
|
OperationType == LdapOperationType.SyncTest
|
|
|
|
|
? JsonSerializer.Serialize(_ldapChanges)
|
|
|
|
|
: "", "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void TurnOffLDAP()
|
|
|
|
|
{
|
|
|
|
|
const double percents = 48;
|
|
|
|
|
|
|
|
|
|
SetProgress((int)percents, Resource.LdapSettingsModifyLdapUsers);
|
|
|
|
|
|
|
|
|
|
var existingLDAPUsers = _userManager.GetUsers(EmployeeStatus.All).Where(u => u.Sid != null).ToList();
|
|
|
|
|
|
|
|
|
|
var step = percents / existingLDAPUsers.Count;
|
|
|
|
|
|
|
|
|
|
var percentage = GetProgress();
|
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = existingLDAPUsers.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var existingLDAPUser in existingLDAPUsers)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(Convert.ToInt32(percentage),
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", ++index, count,
|
|
|
|
|
_userFormatter.GetUserName(existingLDAPUser, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
existingLDAPUser.Sid = null;
|
|
|
|
|
existingLDAPUser.ConvertExternalContactsToOrdinary();
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSaveUserInfo(existingLDAPUser.GetUserInfoString());
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
_userManager.SaveUserInfo(existingLDAPUser);
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
_ldapChanges.SetSaveAsPortalUserChange(existingLDAPUser);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
percentage += step;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncLDAP()
|
|
|
|
|
{
|
|
|
|
|
var currentDomainSettings = _settingsManager.Load<LdapCurrentDomain>();
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(currentDomainSettings.CurrentDomain) || currentDomainSettings.CurrentDomain != _ldapUserImporter.LDAPDomain)
|
|
|
|
|
{
|
|
|
|
|
currentDomainSettings.CurrentDomain = _ldapUserImporter.LDAPDomain;
|
|
|
|
|
_settingsManager.Save(currentDomainSettings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!LDAPSettings.GroupMembership)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSyncLDAPUsers();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SyncLDAPUsers();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSyncLDAPUsersInGroups();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SyncLDAPUsersInGroups();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SyncLdapAvatar();
|
|
|
|
|
|
|
|
|
|
SyncLdapAccessRights();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncLdapAvatar()
|
|
|
|
|
{
|
|
|
|
|
SetProgress(90, Resource.LdapSettingsStatusUpdatingUserPhotos);
|
|
|
|
|
|
|
|
|
|
if (!LDAPSettings.LdapMapping.ContainsKey(LdapSettings.MappingFields.AvatarAttribute))
|
|
|
|
|
{
|
|
|
|
|
var ph = _settingsManager.Load<LdapCurrentUserPhotos>();
|
|
|
|
|
|
|
|
|
|
if (ph.CurrentPhotos == null || !ph.CurrentPhotos.Any())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var guid in ph.CurrentPhotos.Keys)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.InfoSyncLdapAvatarsRemovingPhoto(guid);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_userPhotoManager.RemovePhoto(guid);
|
|
|
|
|
_userPhotoManager.ResetThumbnailSettings(guid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ph.CurrentPhotos = null;
|
|
|
|
|
_settingsManager.Save(ph);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var photoSettings = _settingsManager.Load<LdapCurrentUserPhotos>();
|
|
|
|
|
|
|
|
|
|
if (photoSettings.CurrentPhotos == null)
|
|
|
|
|
{
|
|
|
|
|
photoSettings.CurrentPhotos = new Dictionary<Guid, string>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var ldapUsers = _ldapUserImporter.AllDomainUsers.Where(x => !x.IsDisabled);
|
|
|
|
|
var step = 5.0 / ldapUsers.Count();
|
|
|
|
|
var currentPercent = 90.0;
|
|
|
|
|
foreach (var ldapUser in ldapUsers)
|
|
|
|
|
{
|
|
|
|
|
var image = ldapUser.GetValue(LDAPSettings.LdapMapping[LdapSettings.MappingFields.AvatarAttribute], true);
|
|
|
|
|
|
|
|
|
|
if (image == null || image.GetType() != typeof(byte[]))
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string hash;
|
2022-05-23 13:38:05 +00:00
|
|
|
|
using (var md5 = MD5.Create())
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
|
|
|
|
hash = Convert.ToBase64String(md5.ComputeHash((byte[])image));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var user = _userManager.GetUserBySid(ldapUser.Sid);
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSyncLdapAvatarsFoundPhoto(ldapUser.Sid);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
2022-04-28 06:41:09 +00:00
|
|
|
|
if (photoSettings.CurrentPhotos.ContainsKey(user.Id) && photoSettings.CurrentPhotos[user.Id] == hash)
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSyncLdapAvatarsSkipping();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
SetProgress((int)(currentPercent += step),
|
|
|
|
|
string.Format("{0}: {1}", Resource.LdapSettingsStatusSavingUserPhoto, _userFormatter.GetUserName(user, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
2022-04-28 06:41:09 +00:00
|
|
|
|
_userPhotoManager.SyncPhoto(user.Id, (byte[])image);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
2022-04-28 06:41:09 +00:00
|
|
|
|
if (photoSettings.CurrentPhotos.ContainsKey(user.Id))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
2022-04-28 06:41:09 +00:00
|
|
|
|
photoSettings.CurrentPhotos[user.Id] = hash;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-04-28 06:41:09 +00:00
|
|
|
|
photoSettings.CurrentPhotos.Add(user.Id, hash);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSyncLdapAvatarsCouldNotSavePhoto(user.Id);
|
2022-04-28 06:41:09 +00:00
|
|
|
|
if (photoSettings.CurrentPhotos.ContainsKey(user.Id))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
2022-04-28 06:41:09 +00:00
|
|
|
|
photoSettings.CurrentPhotos.Remove(user.Id);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_settingsManager.Save(photoSettings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncLdapAccessRights()
|
|
|
|
|
{
|
|
|
|
|
SetProgress(95, Resource.LdapSettingsStatusUpdatingAccessRights);
|
|
|
|
|
|
|
|
|
|
var currentUserRights = new List<LdapSettings.AccessRight>();
|
|
|
|
|
TakeUsersRights(_currentUser != null ? currentUserRights : null);
|
|
|
|
|
|
|
|
|
|
if (LDAPSettings.GroupMembership && LDAPSettings.AccessRights != null && LDAPSettings.AccessRights.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
GiveUsersRights(LDAPSettings.AccessRights, _currentUser != null ? currentUserRights : null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (currentUserRights.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
Warning = Resource.LdapSettingsErrorLostRights;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_settingsManager.Save(LDAPSettings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void TakeUsersRights(List<LdapSettings.AccessRight> currentUserRights)
|
|
|
|
|
{
|
|
|
|
|
var current = _settingsManager.Load<LdapCurrentAcccessSettings>();
|
|
|
|
|
|
|
|
|
|
if (current.CurrentAccessRights == null || !current.CurrentAccessRights.Any())
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugAccessRightsIsEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetProgress(95, Resource.LdapSettingsStatusRemovingOldRights);
|
|
|
|
|
foreach (var right in current.CurrentAccessRights)
|
|
|
|
|
{
|
|
|
|
|
foreach (var user in right.Value)
|
|
|
|
|
{
|
|
|
|
|
var userId = Guid.Parse(user);
|
2022-04-28 06:41:09 +00:00
|
|
|
|
if (_currentUser != null && _currentUser.Id == userId)
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugAttemptingTakeAdminRights(user);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
if (currentUserRights != null)
|
|
|
|
|
{
|
|
|
|
|
currentUserRights.Add(right.Key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugTakingAdminRights(right.Key, user);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_webItemSecurity.SetProductAdministrator(LdapSettings.AccessRightsGuids[right.Key], userId, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
current.CurrentAccessRights = null;
|
|
|
|
|
_settingsManager.Save(current);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void GiveUsersRights(Dictionary<LdapSettings.AccessRight, string> accessRightsSettings, List<LdapSettings.AccessRight> currentUserRights)
|
|
|
|
|
{
|
|
|
|
|
var current = _settingsManager.Load<LdapCurrentAcccessSettings>();
|
|
|
|
|
var currentAccessRights = new Dictionary<LdapSettings.AccessRight, List<string>>();
|
|
|
|
|
var usersWithRightsFlat = current.CurrentAccessRights == null ? new List<string>() : current.CurrentAccessRights.SelectMany(x => x.Value).Distinct().ToList();
|
|
|
|
|
|
|
|
|
|
var step = 3.0 / accessRightsSettings.Count;
|
|
|
|
|
var currentPercent = 95.0;
|
|
|
|
|
foreach (var access in accessRightsSettings)
|
|
|
|
|
{
|
|
|
|
|
currentPercent += step;
|
|
|
|
|
var ldapGroups = _ldapUserImporter.FindGroupsByAttribute(LDAPSettings.GroupNameAttribute, access.Value.Split(',').Select(x => x.Trim()));
|
|
|
|
|
|
|
|
|
|
if (!ldapGroups.Any())
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGiveUsersRightsNoLdapGroups(access.Key);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var ldapGr in ldapGroups)
|
|
|
|
|
{
|
|
|
|
|
var gr = _userManager.GetGroupInfoBySid(ldapGr.Sid);
|
|
|
|
|
|
|
|
|
|
if (gr == null)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGiveUsersRightsCouldNotFindPortalGroup(ldapGr.Sid);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var users = _userManager.GetUsersByGroup(gr.ID);
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGiveUsersRightsFoundUsersForGroup(users.Count(), gr.Name, gr.ID);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
{
|
|
|
|
|
if (!user.Equals(Constants.LostUser) && !user.IsVisitor(_userManager))
|
|
|
|
|
{
|
2022-05-05 13:23:05 +00:00
|
|
|
|
if (!usersWithRightsFlat.Contains(user.Id.ToString()))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
2022-05-05 13:23:05 +00:00
|
|
|
|
usersWithRightsFlat.Add(user.Id.ToString());
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
var cleared = false;
|
|
|
|
|
|
|
|
|
|
foreach (var r in Enum.GetValues(typeof(LdapSettings.AccessRight)).Cast<LdapSettings.AccessRight>())
|
|
|
|
|
{
|
|
|
|
|
var prodId = LdapSettings.AccessRightsGuids[r];
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
if (_webItemSecurity.IsProductAdministrator(prodId, user.Id))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
|
|
|
|
cleared = true;
|
2022-05-05 13:23:05 +00:00
|
|
|
|
_webItemSecurity.SetProductAdministrator(prodId, user.Id, false);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (cleared)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGiveUsersRightsClearedAndAddedRights(user.DisplayUserName(_displayUserSettingsHelper));
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!currentAccessRights.ContainsKey(access.Key))
|
|
|
|
|
{
|
|
|
|
|
currentAccessRights.Add(access.Key, new List<string>());
|
|
|
|
|
}
|
2022-05-05 13:23:05 +00:00
|
|
|
|
currentAccessRights[access.Key].Add(user.Id.ToString());
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SetProgress((int)currentPercent,
|
|
|
|
|
string.Format(Resource.LdapSettingsStatusGivingRights, _userFormatter.GetUserName(user, DisplayUserNameFormat.Default), access.Key));
|
2022-05-05 13:23:05 +00:00
|
|
|
|
_webItemSecurity.SetProductAdministrator(LdapSettings.AccessRightsGuids[access.Key], user.Id, true);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (currentUserRights != null && currentUserRights.Contains(access.Key))
|
|
|
|
|
{
|
|
|
|
|
currentUserRights.Remove(access.Key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
current.CurrentAccessRights = currentAccessRights;
|
|
|
|
|
_settingsManager.Save(current);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncLDAPUsers()
|
|
|
|
|
{
|
|
|
|
|
SetProgress(15, Resource.LdapSettingsStatusGettingUsersFromLdap);
|
|
|
|
|
|
|
|
|
|
var ldapUsers = _ldapUserImporter.GetDiscoveredUsersByAttributes();
|
|
|
|
|
|
|
|
|
|
if (!ldapUsers.Any())
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsErrorUsersNotFound;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGetDiscoveredUsersByAttributes(_ldapUserImporter.AllDomainUsers.Count);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SetProgress(20, Resource.LdapSettingsStatusRemovingOldUsers, "");
|
|
|
|
|
|
|
|
|
|
ldapUsers = RemoveOldDbUsers(ldapUsers);
|
|
|
|
|
|
|
|
|
|
SetProgress(30,
|
|
|
|
|
OperationType == LdapOperationType.Save || OperationType == LdapOperationType.SaveTest
|
|
|
|
|
? Resource.LdapSettingsStatusSavingUsers
|
|
|
|
|
: Resource.LdapSettingsStatusSyncingUsers,
|
|
|
|
|
"");
|
|
|
|
|
|
|
|
|
|
SyncDbUsers(ldapUsers);
|
|
|
|
|
|
|
|
|
|
SetProgress(70, Resource.LdapSettingsStatusRemovingOldGroups, "");
|
|
|
|
|
|
|
|
|
|
RemoveOldDbGroups(new List<GroupInfo>()); // Remove all db groups with sid
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncLDAPUsersInGroups()
|
|
|
|
|
{
|
|
|
|
|
SetProgress(15, Resource.LdapSettingsStatusGettingGroupsFromLdap);
|
|
|
|
|
|
|
|
|
|
var ldapGroups = _ldapUserImporter.GetDiscoveredGroupsByAttributes();
|
|
|
|
|
|
|
|
|
|
if (!ldapGroups.Any())
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsErrorGroupsNotFound;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGetDiscoveredGroupsByAttributes(_ldapUserImporter.AllDomainGroups.Count);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SetProgress(20, Resource.LdapSettingsStatusGettingUsersFromLdap);
|
|
|
|
|
|
|
|
|
|
//Get All found groups users
|
|
|
|
|
List<UserInfo> uniqueLdapGroupUsers;
|
|
|
|
|
|
|
|
|
|
var ldapGroupsUsers = GetGroupsUsers(ldapGroups, out uniqueLdapGroupUsers);
|
|
|
|
|
|
|
|
|
|
if (!uniqueLdapGroupUsers.Any())
|
|
|
|
|
{
|
|
|
|
|
Error = Resource.LdapSettingsErrorUsersNotFound;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugGetGroupsUsers(_ldapUserImporter.AllDomainUsers.Count);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
SetProgress(30,
|
|
|
|
|
OperationType == LdapOperationType.Save || OperationType == LdapOperationType.SaveTest
|
|
|
|
|
? Resource.LdapSettingsStatusSavingUsers
|
|
|
|
|
: Resource.LdapSettingsStatusSyncingUsers,
|
|
|
|
|
"");
|
|
|
|
|
|
|
|
|
|
var newUniqueLdapGroupUsers = SyncGroupsUsers(uniqueLdapGroupUsers);
|
|
|
|
|
|
|
|
|
|
SetProgress(60, Resource.LdapSettingsStatusSavingGroups, "");
|
|
|
|
|
|
|
|
|
|
SyncDbGroups(ldapGroupsUsers);
|
|
|
|
|
|
|
|
|
|
SetProgress(80, Resource.LdapSettingsStatusRemovingOldGroups, "");
|
|
|
|
|
|
|
|
|
|
RemoveOldDbGroups(ldapGroups);
|
|
|
|
|
|
|
|
|
|
SetProgress(90, Resource.LdapSettingsStatusRemovingOldUsers, "");
|
|
|
|
|
|
|
|
|
|
RemoveOldDbUsers(newUniqueLdapGroupUsers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncDbGroups(Dictionary<GroupInfo, List<UserInfo>> ldapGroupsWithUsers)
|
|
|
|
|
{
|
|
|
|
|
const double percents = 20;
|
|
|
|
|
|
|
|
|
|
var step = percents / ldapGroupsWithUsers.Count;
|
|
|
|
|
|
|
|
|
|
var percentage = GetProgress();
|
|
|
|
|
|
|
|
|
|
if (!ldapGroupsWithUsers.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
var gIndex = 0;
|
|
|
|
|
var gCount = ldapGroupsWithUsers.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var ldapGroupWithUsers in ldapGroupsWithUsers)
|
|
|
|
|
{
|
|
|
|
|
var ldapGroup = ldapGroupWithUsers.Key;
|
|
|
|
|
|
|
|
|
|
var ldapGroupUsers = ldapGroupWithUsers.Value;
|
|
|
|
|
|
|
|
|
|
++gIndex;
|
|
|
|
|
|
|
|
|
|
SetProgress(Convert.ToInt32(percentage),
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", gIndex,
|
|
|
|
|
gCount, ldapGroup.Name));
|
|
|
|
|
|
|
|
|
|
var dbLdapGroup = _userManager.GetGroupInfoBySid(ldapGroup.Sid);
|
|
|
|
|
|
|
|
|
|
if (Equals(dbLdapGroup, Constants.LostGroupInfo))
|
|
|
|
|
{
|
|
|
|
|
AddNewGroup(ldapGroup, ldapGroupUsers, gIndex, gCount);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
UpdateDbGroup(dbLdapGroup, ldapGroup, ldapGroupUsers, gIndex, gCount);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
percentage += step;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddNewGroup(GroupInfo ldapGroup, List<UserInfo> ldapGroupUsers, int gIndex, int gCount)
|
|
|
|
|
{
|
|
|
|
|
if (!ldapGroupUsers.Any()) // Skip empty groups
|
|
|
|
|
{
|
|
|
|
|
if (OperationType == LdapOperationType.SaveTest ||
|
|
|
|
|
OperationType == LdapOperationType.SyncTest)
|
|
|
|
|
{
|
|
|
|
|
_ldapChanges.SetSkipGroupChange(ldapGroup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var groupMembersToAdd =
|
|
|
|
|
ldapGroupUsers.Select(ldapGroupUser => SearchDbUserBySid(ldapGroupUser.Sid))
|
|
|
|
|
.Where(userBySid => !Equals(userBySid, Constants.LostUser))
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
if (groupMembersToAdd.Any())
|
|
|
|
|
{
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
ldapGroup = _userManager.SaveGroupInfo(ldapGroup);
|
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = groupMembersToAdd.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var userBySid in groupMembersToAdd)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}, {3} ({4}/{5}): {6}", gIndex,
|
|
|
|
|
gCount, ldapGroup.Name,
|
|
|
|
|
Resource.LdapSettingsStatusAddingGroupUser,
|
|
|
|
|
++index, count,
|
|
|
|
|
_userFormatter.GetUserName(userBySid, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
_userManager.AddUserIntoGroup(userBySid.Id, ldapGroup.ID);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
_ldapChanges.SetAddGroupChange(ldapGroup);
|
|
|
|
|
_ldapChanges.SetAddGroupMembersChange(ldapGroup, groupMembersToAdd);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (OperationType == LdapOperationType.SaveTest ||
|
|
|
|
|
OperationType == LdapOperationType.SyncTest)
|
|
|
|
|
{
|
|
|
|
|
_ldapChanges.SetSkipGroupChange(ldapGroup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static bool NeedUpdateGroup(GroupInfo portalGroup, GroupInfo ldapGroup)
|
|
|
|
|
{
|
|
|
|
|
var needUpdate =
|
|
|
|
|
!portalGroup.Name.Equals(ldapGroup.Name, StringComparison.InvariantCultureIgnoreCase) ||
|
|
|
|
|
!portalGroup.Sid.Equals(ldapGroup.Sid, StringComparison.InvariantCultureIgnoreCase);
|
|
|
|
|
|
|
|
|
|
return needUpdate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateDbGroup(GroupInfo dbLdapGroup, GroupInfo ldapGroup, List<UserInfo> ldapGroupUsers, int gIndex,
|
|
|
|
|
int gCount)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", gIndex, gCount, ldapGroup.Name));
|
|
|
|
|
|
|
|
|
|
var dbGroupMembers =
|
|
|
|
|
_userManager.GetUsersByGroup(dbLdapGroup.ID, EmployeeStatus.All)
|
|
|
|
|
.Where(u => u.Sid != null)
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
var groupMembersToRemove =
|
|
|
|
|
dbGroupMembers.Where(
|
|
|
|
|
dbUser => ldapGroupUsers.FirstOrDefault(lu => dbUser.Sid.Equals(lu.Sid)) == null).ToList();
|
|
|
|
|
|
|
|
|
|
var groupMembersToAdd = (from ldapGroupUser in ldapGroupUsers
|
|
|
|
|
let dbUser = dbGroupMembers.FirstOrDefault(u => u.Sid.Equals(ldapGroupUser.Sid))
|
|
|
|
|
where dbUser == null
|
|
|
|
|
select SearchDbUserBySid(ldapGroupUser.Sid)
|
|
|
|
|
into userBySid
|
|
|
|
|
where !Equals(userBySid, Constants.LostUser)
|
|
|
|
|
select userBySid)
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
if (NeedUpdateGroup(dbLdapGroup, ldapGroup))
|
|
|
|
|
{
|
|
|
|
|
dbLdapGroup.Name = ldapGroup.Name;
|
|
|
|
|
dbLdapGroup.Sid = ldapGroup.Sid;
|
|
|
|
|
|
|
|
|
|
dbLdapGroup = _userManager.SaveGroupInfo(dbLdapGroup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = groupMembersToRemove.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var dbUser in groupMembersToRemove)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}, {3} ({4}/{5}): {6}", gIndex, gCount,
|
|
|
|
|
dbLdapGroup.Name,
|
|
|
|
|
Resource.LdapSettingsStatusRemovingGroupUser,
|
|
|
|
|
++index, count,
|
|
|
|
|
_userFormatter.GetUserName(dbUser, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
_userManager.RemoveUserFromGroup(dbUser.Id, dbLdapGroup.ID);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
index = 0;
|
|
|
|
|
count = groupMembersToAdd.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var userInfo in groupMembersToAdd)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}, {3} ({4}/{5}): {6}", gIndex, gCount,
|
|
|
|
|
ldapGroup.Name,
|
|
|
|
|
Resource.LdapSettingsStatusAddingGroupUser,
|
|
|
|
|
++index, count,
|
|
|
|
|
_userFormatter.GetUserName(userInfo, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
_userManager.AddUserIntoGroup(userInfo.Id, dbLdapGroup.ID);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
if (dbGroupMembers.All(dbUser => groupMembersToRemove.Exists(u => u.Id.Equals(dbUser.Id)))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
&& !groupMembersToAdd.Any())
|
|
|
|
|
{
|
|
|
|
|
SetProgress(currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", gIndex, gCount, dbLdapGroup.Name));
|
|
|
|
|
|
|
|
|
|
_userManager.DeleteGroup(dbLdapGroup.ID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
if (NeedUpdateGroup(dbLdapGroup, ldapGroup))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_ldapChanges.SetUpdateGroupChange(ldapGroup);
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (groupMembersToRemove.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_ldapChanges.SetRemoveGroupMembersChange(dbLdapGroup, groupMembersToRemove);
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (groupMembersToAdd.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
_ldapChanges.SetAddGroupMembersChange(dbLdapGroup, groupMembersToAdd);
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
if (dbGroupMembers.All(dbUser => groupMembersToRemove.Exists(u => u.Id.Equals(dbUser.Id)))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
&& !groupMembersToAdd.Any())
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_ldapChanges.SetRemoveGroupChange(dbLdapGroup, _logger);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private UserInfo SearchDbUserBySid(string sid)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(sid))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return Constants.LostUser;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
var foundUser = _userManager.GetUserBySid(sid);
|
|
|
|
|
|
|
|
|
|
return foundUser;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SyncDbUsers(List<UserInfo> ldapUsers)
|
|
|
|
|
{
|
|
|
|
|
const double percents = 35;
|
|
|
|
|
|
|
|
|
|
var step = percents / ldapUsers.Count;
|
|
|
|
|
|
|
|
|
|
var percentage = GetProgress();
|
|
|
|
|
|
|
|
|
|
if (!ldapUsers.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = ldapUsers.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var userInfo in ldapUsers)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(Convert.ToInt32(percentage),
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", ++index, count,
|
|
|
|
|
_userFormatter.GetUserName(userInfo, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
_lDAPUserManager.SyncLDAPUser(userInfo, ldapUsers);
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
LdapChangeCollection changes;
|
|
|
|
|
_lDAPUserManager.GetLDAPSyncUserChange(userInfo, ldapUsers, out changes);
|
|
|
|
|
_ldapChanges.AddRange(changes);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
percentage += step;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Remove old LDAP users from db
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="ldapUsers">list of actual LDAP users</param>
|
|
|
|
|
/// <returns>New list of actual LDAP users</returns>
|
|
|
|
|
private List<UserInfo> RemoveOldDbUsers(List<UserInfo> ldapUsers)
|
|
|
|
|
{
|
|
|
|
|
var dbLdapUsers = _userManager.GetUsers(EmployeeStatus.All).Where(u => u.Sid != null).ToList();
|
|
|
|
|
|
|
|
|
|
if (!dbLdapUsers.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return ldapUsers;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
var removedUsers =
|
|
|
|
|
dbLdapUsers.Where(u => ldapUsers.FirstOrDefault(lu => u.Sid.Equals(lu.Sid)) == null).ToList();
|
|
|
|
|
|
|
|
|
|
if (!removedUsers.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return ldapUsers;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
const double percents = 8;
|
|
|
|
|
|
|
|
|
|
var step = percents / removedUsers.Count;
|
|
|
|
|
|
|
|
|
|
var percentage = GetProgress();
|
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = removedUsers.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var removedUser in removedUsers)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(Convert.ToInt32(percentage),
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", ++index, count,
|
|
|
|
|
_userFormatter.GetUserName(removedUser, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
removedUser.Sid = null;
|
2022-05-05 13:23:05 +00:00
|
|
|
|
if (!removedUser.IsOwner(_tenantManager.GetCurrentTenant()) && !(_currentUser != null && _currentUser.Id == removedUser.Id && removedUser.IsAdmin(_userManager)))
|
2022-04-26 14:03:41 +00:00
|
|
|
|
{
|
|
|
|
|
removedUser.Status = EmployeeStatus.Terminated; // Disable user on portal
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Warning = Resource.LdapSettingsErrorRemovedYourself;
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugRemoveOldDbUsersAttemptingExcludeYourself(removedUser.Id);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
removedUser.ConvertExternalContactsToOrdinary();
|
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.DebugSaveUserInfo(removedUser.GetUserInfoString());
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
_userManager.SaveUserInfo(removedUser);
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
_ldapChanges.SetSaveAsPortalUserChange(removedUser);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
percentage += step;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dbLdapUsers.RemoveAll(removedUsers.Contains);
|
|
|
|
|
|
2022-05-05 13:23:05 +00:00
|
|
|
|
var newLdapUsers = ldapUsers.Where(u => !removedUsers.Exists(ru => ru.Id.Equals(u.Id))).ToList();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
return newLdapUsers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RemoveOldDbGroups(List<GroupInfo> ldapGroups)
|
|
|
|
|
{
|
|
|
|
|
var percentage = GetProgress();
|
|
|
|
|
|
|
|
|
|
var removedDbLdapGroups =
|
|
|
|
|
_userManager.GetGroups()
|
|
|
|
|
.Where(g => g.Sid != null && ldapGroups.FirstOrDefault(lg => g.Sid.Equals(lg.Sid)) == null)
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
if (!removedDbLdapGroups.Any())
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
const double percents = 10;
|
|
|
|
|
|
|
|
|
|
var step = percents / removedDbLdapGroups.Count;
|
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = removedDbLdapGroups.Count;
|
|
|
|
|
|
|
|
|
|
foreach (var groupInfo in removedDbLdapGroups)
|
|
|
|
|
{
|
|
|
|
|
SetProgress(Convert.ToInt32(percentage),
|
|
|
|
|
currentSource: string.Format("({0}/{1}): {2}", ++index, count, groupInfo.Name));
|
|
|
|
|
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
_userManager.DeleteGroup(groupInfo.ID);
|
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
_ldapChanges.SetRemoveGroupChange(groupInfo);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
percentage += step;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<UserInfo> SyncGroupsUsers(List<UserInfo> uniqueLdapGroupUsers)
|
|
|
|
|
{
|
|
|
|
|
const double percents = 30;
|
|
|
|
|
|
|
|
|
|
var step = percents / uniqueLdapGroupUsers.Count;
|
|
|
|
|
|
|
|
|
|
var percentage = GetProgress();
|
|
|
|
|
|
|
|
|
|
var newUniqueLdapGroupUsers = new List<UserInfo>();
|
|
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
var count = uniqueLdapGroupUsers.Count;
|
|
|
|
|
|
|
|
|
|
int i, len;
|
|
|
|
|
for (i = 0, len = uniqueLdapGroupUsers.Count; i < len; i++)
|
|
|
|
|
{
|
|
|
|
|
var ldapGroupUser = uniqueLdapGroupUsers[i];
|
|
|
|
|
|
|
|
|
|
SetProgress(Convert.ToInt32(percentage),
|
|
|
|
|
currentSource:
|
|
|
|
|
string.Format("({0}/{1}): {2}", ++index, count,
|
|
|
|
|
_userFormatter.GetUserName(ldapGroupUser, DisplayUserNameFormat.Default)));
|
|
|
|
|
|
|
|
|
|
UserInfo user;
|
|
|
|
|
switch (OperationType)
|
|
|
|
|
{
|
|
|
|
|
case LdapOperationType.Save:
|
|
|
|
|
case LdapOperationType.Sync:
|
|
|
|
|
user = _lDAPUserManager.SyncLDAPUser(ldapGroupUser, uniqueLdapGroupUsers);
|
|
|
|
|
if (!Equals(user, Constants.LostUser))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
newUniqueLdapGroupUsers.Add(user);
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
break;
|
|
|
|
|
case LdapOperationType.SaveTest:
|
|
|
|
|
case LdapOperationType.SyncTest:
|
|
|
|
|
LdapChangeCollection changes;
|
|
|
|
|
user = _lDAPUserManager.GetLDAPSyncUserChange(ldapGroupUser, uniqueLdapGroupUsers, out changes);
|
|
|
|
|
if (!Equals(user, Constants.LostUser))
|
|
|
|
|
{
|
|
|
|
|
newUniqueLdapGroupUsers.Add(user);
|
|
|
|
|
}
|
|
|
|
|
_ldapChanges.AddRange(changes);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
percentage += step;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return newUniqueLdapGroupUsers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Dictionary<GroupInfo, List<UserInfo>> GetGroupsUsers(List<GroupInfo> ldapGroups,
|
|
|
|
|
out List<UserInfo> uniqueLdapGroupUsers)
|
|
|
|
|
{
|
|
|
|
|
uniqueLdapGroupUsers = new List<UserInfo>();
|
|
|
|
|
|
|
|
|
|
var listGroupsUsers = new Dictionary<GroupInfo, List<UserInfo>>();
|
|
|
|
|
|
|
|
|
|
foreach (var ldapGroup in ldapGroups)
|
|
|
|
|
{
|
|
|
|
|
var ldapGroupUsers = _ldapUserImporter.GetGroupUsers(ldapGroup);
|
|
|
|
|
|
|
|
|
|
listGroupsUsers.Add(ldapGroup, ldapGroupUsers);
|
|
|
|
|
|
|
|
|
|
foreach (var ldapGroupUser in ldapGroupUsers)
|
|
|
|
|
{
|
|
|
|
|
if (!uniqueLdapGroupUsers.Any(u => u.Sid.Equals(ldapGroupUser.Sid)))
|
|
|
|
|
{
|
|
|
|
|
uniqueLdapGroupUsers.Add(ldapGroupUser);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return listGroupsUsers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private double GetProgress()
|
|
|
|
|
{
|
|
|
|
|
return Percentage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SetProgress(int? currentPercent = null, string currentStatus = null, string currentSource = null)
|
|
|
|
|
{
|
|
|
|
|
if (!currentPercent.HasValue && currentStatus == null && currentSource == null)
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
return;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (currentPercent.HasValue)
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Percentage = currentPercent.Value;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (currentStatus != null)
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Status = currentStatus;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (currentSource != null)
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Source = currentSource;
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.InfoProgress(Percentage, Status, Source);
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
2022-05-13 09:20:28 +00:00
|
|
|
|
PublishTaskInfo();
|
|
|
|
|
}
|
|
|
|
|
private void PublishTaskInfo()
|
|
|
|
|
{
|
|
|
|
|
FillDistributedTask();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
PublishChanges();
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-13 09:20:28 +00:00
|
|
|
|
private void InitDisturbedTask()
|
|
|
|
|
{
|
|
|
|
|
this[LdapTaskProperty.FINISHED] = false;
|
|
|
|
|
this[LdapTaskProperty.CERT_REQUEST] = null;
|
|
|
|
|
FillDistributedTask();
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-26 14:03:41 +00:00
|
|
|
|
private void FillDistributedTask()
|
|
|
|
|
{
|
2022-05-05 13:23:05 +00:00
|
|
|
|
this[LdapTaskProperty.SOURCE] = Source;
|
|
|
|
|
this[LdapTaskProperty.OPERATION_TYPE] = OperationType;
|
|
|
|
|
this[LdapTaskProperty.OWNER] = _tenantId;
|
|
|
|
|
this[LdapTaskProperty.PROGRESS] = Percentage < 100 ? Percentage : 100;
|
|
|
|
|
this[LdapTaskProperty.RESULT] = Status;
|
|
|
|
|
this[LdapTaskProperty.ERROR] = Error;
|
|
|
|
|
this[LdapTaskProperty.WARNING] = Warning;
|
2022-04-26 14:03:41 +00:00
|
|
|
|
//SetProperty(PROCESSED, successProcessed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PrepareSettings(LdapSettings settings)
|
|
|
|
|
{
|
|
|
|
|
if (settings == null)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorWrongLdapSettings();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!settings.EnableLdapAuthentication)
|
|
|
|
|
{
|
|
|
|
|
settings.Password = string.Empty;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.Server))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.Server = settings.Server.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorServerIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!settings.Server.StartsWith("LDAP://"))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.Server = "LDAP://" + settings.Server.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.UserDN))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.UserDN = settings.UserDN.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorUserDnIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.LoginAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.LoginAttribute = settings.LoginAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorLoginAttributeIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.UserFilter))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.UserFilter = settings.UserFilter.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.FirstNameAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.FirstNameAttribute = settings.FirstNameAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.SecondNameAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.SecondNameAttribute = settings.SecondNameAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.MailAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.MailAttribute = settings.MailAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.TitleAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.TitleAttribute = settings.TitleAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.MobilePhoneAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.MobilePhoneAttribute = settings.MobilePhoneAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (settings.GroupMembership)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.GroupDN))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.GroupDN = settings.GroupDN.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorGroupDnIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.GroupFilter))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.GroupFilter = settings.GroupFilter.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.GroupAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.GroupAttribute = settings.GroupAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorGroupAttributeIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.UserAttribute))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.UserAttribute = settings.UserAttribute.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorUserAttributeIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!settings.Authentication)
|
|
|
|
|
{
|
|
|
|
|
settings.Password = string.Empty;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(settings.Login))
|
2022-06-15 12:39:37 +00:00
|
|
|
|
{
|
2022-04-26 14:03:41 +00:00
|
|
|
|
settings.Login = settings.Login.Trim();
|
2022-06-15 12:39:37 +00:00
|
|
|
|
}
|
2022-04-26 14:03:41 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorloginIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (settings.PasswordBytes == null || !settings.PasswordBytes.Any())
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(settings.Password))
|
|
|
|
|
{
|
|
|
|
|
settings.PasswordBytes = _novellLdapHelper.GetPasswordBytes(settings.Password);
|
|
|
|
|
|
|
|
|
|
if (settings.PasswordBytes == null)
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorPasswordBytesIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-06-08 09:42:49 +00:00
|
|
|
|
_logger.ErrorPasswordIsNullOrEmpty();
|
2022-04-26 14:03:41 +00:00
|
|
|
|
Error = Resource.LdapSettingsErrorCantGetLdapSettings;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
settings.Password = string.Empty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string GetError(LdapSettingsStatus result)
|
|
|
|
|
{
|
|
|
|
|
switch (result)
|
|
|
|
|
{
|
|
|
|
|
case LdapSettingsStatus.Ok:
|
|
|
|
|
return string.Empty;
|
|
|
|
|
case LdapSettingsStatus.WrongServerOrPort:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongServerOrPort;
|
|
|
|
|
case LdapSettingsStatus.WrongUserDn:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongUserDn;
|
|
|
|
|
case LdapSettingsStatus.IncorrectLDAPFilter:
|
|
|
|
|
return Resource.LdapSettingsErrorIncorrectLdapFilter;
|
|
|
|
|
case LdapSettingsStatus.UsersNotFound:
|
|
|
|
|
return Resource.LdapSettingsErrorUsersNotFound;
|
|
|
|
|
case LdapSettingsStatus.WrongLoginAttribute:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongLoginAttribute;
|
|
|
|
|
case LdapSettingsStatus.WrongGroupDn:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongGroupDn;
|
|
|
|
|
case LdapSettingsStatus.IncorrectGroupLDAPFilter:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongGroupFilter;
|
|
|
|
|
case LdapSettingsStatus.GroupsNotFound:
|
|
|
|
|
return Resource.LdapSettingsErrorGroupsNotFound;
|
|
|
|
|
case LdapSettingsStatus.WrongGroupAttribute:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongGroupAttribute;
|
|
|
|
|
case LdapSettingsStatus.WrongUserAttribute:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongUserAttribute;
|
|
|
|
|
case LdapSettingsStatus.WrongGroupNameAttribute:
|
|
|
|
|
return Resource.LdapSettingsErrorWrongGroupNameAttribute;
|
|
|
|
|
case LdapSettingsStatus.CredentialsNotValid:
|
|
|
|
|
return Resource.LdapSettingsErrorCredentialsNotValid;
|
|
|
|
|
case LdapSettingsStatus.ConnectError:
|
|
|
|
|
return Resource.LdapSettingsConnectError;
|
|
|
|
|
case LdapSettingsStatus.StrongAuthRequired:
|
|
|
|
|
return Resource.LdapSettingsStrongAuthRequired;
|
|
|
|
|
case LdapSettingsStatus.WrongSidAttribute:
|
|
|
|
|
return Resource.LdapSettingsWrongSidAttribute;
|
|
|
|
|
case LdapSettingsStatus.TlsNotSupported:
|
|
|
|
|
return Resource.LdapSettingsTlsNotSupported;
|
|
|
|
|
case LdapSettingsStatus.DomainNotFound:
|
|
|
|
|
return Resource.LdapSettingsErrorDomainNotFound;
|
|
|
|
|
case LdapSettingsStatus.CertificateRequest:
|
|
|
|
|
return Resource.LdapSettingsStatusCertificateVerification;
|
|
|
|
|
default:
|
|
|
|
|
return Resource.LdapSettingsErrorUnknownError;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class LdapOperationExtension
|
|
|
|
|
{
|
|
|
|
|
public static void Register(DIHelper services)
|
|
|
|
|
{
|
|
|
|
|
services.TryAdd<NovellLdapSettingsChecker>();
|
|
|
|
|
services.TryAdd<LdapChangeCollection>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|