EN · DE · RU · FR · ES

#504: LdapSambaAccountsUtils.java

projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSambaAccountsUtils.java Тип: Java · Роль: Интеграция LDAP · Исходник: projectforge-business/src/main/java/org/projectforge/business/ldap/LdapSambaAccountsUtils.java 141 строка · 70 кода · 60 комментариев · 11 пустых
Статические вспомогательные методы для LdapSambaAccounts. Набор чистых функций без побочных эффектов, предоставляющих общие вспомогательные операции.

Структура кода

Пакет: 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());
    }
  }
}

История Git

868d6abb7 2025 → 2026
63081666f Заголовки исходных файлов: 2024 → 2025.
4c04cfd65 КРУПНОЕ ИЗМЕНЕНИЕ! Миграция целочисленных id на Long id (включая внешние ключи и т.д.)
b6092df09 Авторские права 2023 → 2024
ab45d51fa Авторские права 2001-2022 → 2001-2023.