LdapSambaAccountsUtils.javaПакет: org.projectforge.business.ldap
Классы: LdapSambaAccountsUtils
Методы (5): getNextFreeSambaSIDNumber, isGivenNumberFree, isGivenNumberFree, setDefaultValues, setDefaultValues
Поля (2): ldapService, userGroupCache
Импорты: 6 пакетов
package org.projectforge.business.ldap;
import org.projectforge.business.user.UserGroupCache;
import org.projectforge.framework.persistence.user.entities.PFUserDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Objects;
/**
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
@Service
public class LdapSambaAccountsUtils {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LdapSambaAccountsUtils.class);
@Autowired
private LdapService ldapService;
@Autowired
private UserGroupCache userGroupCache;
/**
* Получает все заданные uid-номера всех пользователей ProjectForge, включая удалённых, и возвращает следующий
* наибольший свободный номер. Номер равен 1000, если не найдено ни одного uid-номера (со значением больше 999).
*/
public int getNextFreeSambaSIDNumber() {
final Collection<PFUserDO> allUsers = userGroupCache.getAllUsers();
int currentMaxNumber = 999;
for (final PFUserDO user : allUsers) {
final LdapUserValues ldapUserValues = PFUserDOConverter.readLdapUserValues(user.getLdapValues());
if (ldapUserValues == null) {
continue;
}
if (ldapUserValues.getSambaSIDNumber() != null
&& ldapUserValues.getSambaSIDNumber() > currentMaxNumber) {
currentMaxNumber = ldapUserValues.getUidNumber();
}
}
return currentMaxNumber + 1;
}
/**
* Для предотвращения дублирования uidNumber.
*
* @param currentUser
* @param sambaSIDNumber
* @return Возвращает true, если какой-либо пользователь (включая удалённых), кроме указанного, имеет данный uidNumber,
* иначе false.
*/
public boolean isGivenNumberFree(final PFUserDO currentUser, final Integer sambaSIDNumber) {
return isGivenNumberFree(currentUser.getId(), sambaSIDNumber);
}
/**
* Для предотвращения дублирования uidNumber.
*
* @param currentUserId
* @param sambaSIDNumber
* @return Возвращает true, если какой-либо пользователь (включая удалённых), кроме указанного, имеет данный uidNumber,
* иначе false.
*/
public boolean isGivenNumberFree(final Long currentUserId, final Integer sambaSIDNumber) {
if (sambaSIDNumber == null) {
// Нечего проверять.
return true;
}
final Collection<PFUserDO> allUsers = userGroupCache.getAllUsers();
for (final PFUserDO user : allUsers) {
final LdapUserValues ldapUserValues = PFUserDOConverter.readLdapUserValues(user.getLdapValues());
if (Objects.equals(user.getId(), currentUserId)) {
// Текущий пользователь уже может иметь данный sambaSIDNumber, поэтому пропускаем эту запись.
continue;
}
if (ldapUserValues != null
&& ldapUserValues.getSambaSIDNumber() != null
&& ldapUserValues.getSambaSIDNumber().intValue() == sambaSIDNumber) {
// Номер не свободен.
log.info("getSambaSIDNumber (samba account) '" + sambaSIDNumber + "' уже занят пользователем: " + user);
return false;
}
}
return true;
}
/**
* Устанавливает следующий свободный SambaSID или, если свободен и совпадает с posix UID, использует его.
*
* @param ldapUserValues
* @param user
*/
public void setDefaultValues(final LdapUserValues ldapUserValues, final PFUserDO user) {
setDefaultValues(ldapUserValues, user.getId());
}
/**
* Устанавливает следующий свободный SambaSID или, если свободен и совпадает с posix UID, использует его.
*
* @param ldapUserValues
* @param userId
*/
public void setDefaultValues(final LdapUserValues ldapUserValues, final Long userId) {
final LdapConfig ldapConfig = ldapService.getLdapConfig();
LdapSambaAccountsConfig ldapSambaAccountsConfig = ldapConfig != null ? ldapConfig.getSambaAccountsConfig() : null;
if (ldapSambaAccountsConfig == null) {
ldapSambaAccountsConfig = new LdapSambaAccountsConfig();
}
if (ldapUserValues.getUidNumber() != null && isGivenNumberFree(userId, ldapUserValues.getUidNumber())) {
ldapUserValues.setSambaSIDNumber(ldapUserValues.getUidNumber());
} else {
ldapUserValues.setSambaSIDNumber(getNextFreeSambaSIDNumber());
}
if (ldapSambaAccountsConfig.getDefaultSambaPrimaryGroupSID() != null) {
ldapUserValues.setSambaPrimaryGroupSIDNumber(ldapSambaAccountsConfig.getDefaultSambaPrimaryGroupSID());
}
}
}
868d6abb7 2025 → 2026 63081666f Заголовки исходных файлов: 2024 → 2025. 4c04cfd65 КРУПНОЕ ИЗМЕНЕНИЕ! Миграция целочисленных id на Long id (включая внешние ключи и т.д.) b6092df09 Авторские права 2023 → 2024 ab45d51fa Авторские права 2001-2022 → 2001-2023.