package fi.otavanopisto.pyramus.security.impl;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import fi.otavanopisto.pyramus.dao.security.EnvironmentRolePermissionDAO;
import fi.otavanopisto.pyramus.dao.security.PermissionDAO;
import fi.otavanopisto.pyramus.domainmodel.security.Permission;
import fi.otavanopisto.pyramus.domainmodel.users.Role;
import fi.otavanopisto.security.ContextReference;
import fi.otavanopisto.security.PermissionFeature;
import fi.otavanopisto.security.PermissionFeatureHandler;
import fi.otavanopisto.security.PermissionFeatureLiteral;
import fi.otavanopisto.security.PermissionResolver;
import fi.otavanopisto.security.User;
@Stateless
public class EnvironmentPermissionResolver extends AbstractPermissionResolver implements PermissionResolver {
@Inject
private Logger logger;
@Inject
private PermissionDAO permissionDAO;
@Inject
private EnvironmentRolePermissionDAO environmentUserRolePermissionDAO;
@Inject
@Any
private Instance<PermissionFeatureHandler> featureHandlers;
@Override
public boolean handlesPermission(String permission) {
Permission perm = permissionDAO.findByName(permission);
if (perm != null)
return (PermissionScope.ENVIRONMENT.equals(perm.getScope()));
else
return false;
}
@Override
public boolean hasPermission(String permission, ContextReference contextReference, User user) {
Permission perm = permissionDAO.findByName(permission);
fi.otavanopisto.pyramus.domainmodel.users.User userEntity = getUser(user);
boolean allowed = environmentUserRolePermissionDAO.hasEnvironmentPermissionAccess(userEntity.getRole(), perm);
if (!allowed) {
allowed = hasEveryonePermission(permission, contextReference);
}
PyramusPermissionCollection collection = findCollection(permission);
try {
PermissionFeature[] features = collection.listPermissionFeatures(permission);
if (features != null) {
for (PermissionFeature feature : features) {
Instance<PermissionFeatureHandler> instance = featureHandlers.select(new PermissionFeatureLiteral(feature.value()));
if (!instance.isUnsatisfied()) {
PermissionFeatureHandler permissionFeatureHandler = instance.get();
allowed = permissionFeatureHandler.hasPermission(permission, userEntity, contextReference, allowed);
} else
logger.log(Level.SEVERE, String.format("Unsatisfied permission feature %s", feature.value()));
}
}
} catch (Exception e) {
logger.log(Level.SEVERE, String.format("Could not list permission features for permission %s", permission), e);
}
return allowed;
}
@Override
public boolean hasEveryonePermission(String permission, ContextReference contextReference) {
Role everyoneRole = getEveryoneRole();
Permission perm = permissionDAO.findByName(permission);
return environmentUserRolePermissionDAO.hasEnvironmentPermissionAccess(everyoneRole, perm);
}
}