package com.openkm.plugin.access;
import com.openkm.core.AccessDeniedException;
import com.openkm.core.Config;
import com.openkm.core.DatabaseException;
import com.openkm.core.PathNotFoundException;
import com.openkm.db.bean.NodeBase;
import com.openkm.db.bean.NodeClass;
import com.openkm.db.service.NodeBaseSrv;
import com.openkm.db.service.NodeClassSrv;
import com.openkm.module.common.CommonAuthModule;
import com.openkm.plugin.BasePlugin;
import com.openkm.plugin.fileplan.security.FilePlanAccessManager;
import com.openkm.principal.AuthException;
import com.openkm.principal.PrincipalUtils;
import com.openkm.util.StackTraceUtils;
import net.xeoh.plugins.base.annotations.PluginImplementation;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashSet;
* Check user permissions on documents and folders.
* @see com.openkm.plugin.access.DbRecursiveAccessManager
public class DbSimpleAccessManager extends BasePlugin implements DbAccessManager {
private static final Logger log = LoggerFactory.getLogger(DbSimpleAccessManager.class);
private CommonAuthModule commonAuthModule;
private NodeClassSrv nodeClassSrv;
private NodeBaseSrv nodeBaseSrv;
public void checkPermission(NodeBase node, int permissions) throws AccessDeniedException, PathNotFoundException, DatabaseException {
if (!isGranted(node, permissions)) {
String nodePath = nodeBaseSrv.getPathFromUuid(node.getUuid());
throw new AccessDeniedException(node.getUuid() + " : " + nodePath);
public boolean isGranted(NodeBase node, int permissions) throws DatabaseException {
String userId = PrincipalUtils.getUser();
Set<String> roles = PrincipalUtils.getRoles();
return isGranted(node, userId, roles, permissions);
public boolean isGranted(NodeBase node, String user, int permissions) throws AuthException, DatabaseException {
List<String> roles = commonAuthModule.getRolesByUser(user);
return isGranted(node, user, new HashSet<>(roles), permissions);
public boolean isGranted(NodeBase node, long nodeClass, int permissions) throws DatabaseException {
NodeClass nc = nodeClassSrv.findByPk(nodeClass);
FilePlanAccessManager accessManager = nodeClassSrv.findAccessManagerByClassName(nc.getAccessManagerClassName());
return accessManager.isGranted(node, nodeClass, PrincipalUtils.getUser(), PrincipalUtils.getRoles(), permissions);
private boolean isGranted(NodeBase node, String user, Set<String> roles, int permissions) {
log.debug("isGranted({}, {})", node.getUuid(), permissions);
if (Config.SYSTEM_USER.equals(user) || Config.ADMIN_USER.equals(user)) {
// An okmAdmin user has total access
if (roles.contains(Config.DEFAULT_ADMIN_ROLE)) {
// An user with AdminRole has total access
access = checkProperties(node.getUserPermissions(), node.getRolePermissions(), user, roles, permissions);
log.info("*****************************************************");
StackTraceUtils.logTrace(log);
log.info("*****************************************************");
log.debug("isGranted: {}", access);
* Check access properties
private boolean checkProperties(Map<String, Integer> usersPerms, Map<String, Integer> rolesPerms, String user,
Set<String> roles, int perms) {
log.debug("checkProperties({}, {}, {}, {})", usersPerms, rolesPerms, roles, perms);
// Fist try with user permissions
Integer userPerms = usersPerms.get(user);
if (userPerms != null && (perms & userPerms) != 0) {
log.debug("checkProperties: {}", true);
// If there is no user specific access, try with roles permissions
for (String role : roles) {
Integer rolePerms = rolesPerms.get(role);
if (rolePerms != null && (perms & rolePerms) != 0) {
log.debug("checkProperties: {}", true);
log.debug("checkProperties: {}", access);