All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.arbeitsagentur.opdt.keycloak.cassandra.role.CassandraRoleAdapter Maven / Gradle / Ivy

/*
 * Copyright 2022 IT-Systemhaus der Bundesagentur fuer Arbeit
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.arbeitsagentur.opdt.keycloak.cassandra.role;

import de.arbeitsagentur.opdt.keycloak.cassandra.role.persistence.entities.RoleValue;
import de.arbeitsagentur.opdt.keycloak.cassandra.role.persistence.entities.Roles;
import java.util.*;
import java.util.stream.Stream;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.jbosslog.JBossLog;
import org.keycloak.models.RealmModel;
import org.keycloak.models.RoleContainerModel;
import org.keycloak.models.RoleModel;
import org.keycloak.models.utils.KeycloakModelUtils;

@EqualsAndHashCode(of = "roleId")
@JBossLog
@RequiredArgsConstructor
public class CassandraRoleAdapter implements RoleModel {
  private final String roleId;
  private final RealmModel realm;
  private final RoleValue role;
  private final Roles roles;
  private final CassandraRoleProvider provider;

  public RoleValue getRole() {
    return role;
  }

  @Override
  public String getName() {
    return role.getName();
  }

  @Override
  public String getDescription() {
    return role.getDescription();
  }

  @Override
  public void setDescription(String description) {
    role.setDescription(description);
    provider.markChanged(realm.getId());
  }

  @Override
  public String getId() {
    return role.getId();
  }

  @Override
  public void setName(String name) {
    role.setName(name);
    provider.markChanged(realm.getId());
  }

  @Override
  public boolean isComposite() {
    return !this.role.getChildRoles().isEmpty();
  }

  @Override
  public void addCompositeRole(RoleModel roleToAdd) {
    log.debugv(
        "add composite Role: roleNameOrigin={0} roleNameTarget={1}",
        this.role.getName(), roleToAdd.getName());

    if (roles.getRoleById(roleToAdd.getId()) == null) {
      RoleValue toAdd =
          RoleValue.builder()
              .id(roleToAdd.getId())
              .realmId(realm.getId())
              .clientId(roleToAdd.isClientRole() ? roleToAdd.getContainerId() : null)
              .name(roleToAdd.getName())
              .attributes(roleToAdd.getAttributes())
              .description(roleToAdd.getDescription())
              .build();

      if (roleToAdd.isClientRole()) {
        roles.addClientRole(roleToAdd.getContainerId(), toAdd);
      } else {
        roles.addRealmRole(toAdd);
      }
    }

    if (!this.role.getChildRoles().contains(roleToAdd.getId())) {
      List newRoles = new ArrayList<>(this.role.getChildRoles());
      newRoles.add(roleToAdd.getId());
      this.role.setChildRoles(newRoles);
    }

    provider.markChanged(realm.getId());
  }

  @Override
  public void removeCompositeRole(RoleModel roleToDelete) {
    log.debugv(
        "remove composite Role: roleNameOrigin={0} roleNameTarget={1}",
        this.role.getName(), roleToDelete.getName());
    role.getChildRoles().remove(roleToDelete.getId());
    provider.markChanged(realm.getId());
  }

  @Override
  public Stream getCompositesStream() {
    return getCompositesStream(null, 0, -1);
  }

  @Override
  public Stream getCompositesStream(String search, Integer first, Integer max) {
    log.debugv(
        "get composites: roleId={0} search={1} first={2} max={3}",
        role.getId(), search, first, max);

    return role.getChildRoles().stream()
        .map(roles::getRoleById)
        .filter(
            role ->
                search == null
                    || search.isEmpty()
                    || role.getName().toLowerCase().contains(search.toLowerCase())
                    || role.getDescription().toLowerCase().contains(search.toLowerCase()))
        .filter(Objects::nonNull)
        .map(r -> new CassandraRoleAdapter(r.getId(), realm, r, roles, provider))
        .map(RoleModel.class::cast)
        .sorted(Comparator.comparing(RoleModel::getName))
        .skip(first == null || first < 0 ? 0 : first)
        .limit(max == null || max < 0 ? Long.MAX_VALUE : max);
  }

  @Override
  public boolean isClientRole() {
    return role.getClientId() != null;
  }

  @Override
  public String getContainerId() {
    return role.getClientId() != null ? role.getClientId() : realm.getId();
  }

  @Override
  public RoleContainerModel getContainer() {
    return this.isClientRole() ? this.realm.getClientById(this.role.getClientId()) : this.realm;
  }

  @Override
  public boolean hasRole(RoleModel role) {
    return this.getId().equals(role.getId())
        || KeycloakModelUtils.searchFor(role, this, new HashSet<>());
  }

  @Override
  public void setSingleAttribute(String name, String value) {
    log.debugv("set attribute: roleId={0} name={1} value={2}", role.getId(), name, value);

    role.getAttributes().put(name, Collections.singletonList(value));
    provider.markChanged(realm.getId());
  }

  @Override
  public void setAttribute(String name, List values) {
    log.debugv("set attribute: roleId={0} name={1} value={2}", role.getId(), name, values);

    role.getAttributes().put(name, values);
    provider.markChanged(realm.getId());
  }

  @Override
  public void removeAttribute(String name) {
    log.debugv("remove attribute: roleId={0} name={1}", role.getId(), name);
    role.getAttributes().remove(name);
    provider.markChanged(realm.getId());
  }

  @Override
  public String getFirstAttribute(String name) {
    return getAttributeStream(name).findFirst().orElse(null);
  }

  @Override
  public Stream getAttributeStream(String name) {
    log.debugv("get attribute: roleId={0} name={1}", role.getId(), name);

    return role.getAttributes().getOrDefault(name, Collections.emptyList()).stream();
  }

  @Override
  public Map> getAttributes() {
    log.debugv("get all attributes: roleId={0", role.getId());

    return role.getAttributes();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy