Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/support-4.0' into support-4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Mar 16, 2020
2 parents f943044 + 63e8481 commit 3ae6466
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 46 deletions.
Expand Up @@ -1326,7 +1326,10 @@ private <F extends ObjectType> void finishLoadOfProjectionContext(LensContext<F>
//Determine refined schema and password policies for account type
RefinedObjectClassDefinition structuralObjectClassDef = projContext.getStructuralObjectClassDefinition();
if (structuralObjectClassDef != null) {
loadProjectionSecurityPolicy(context, projContext, task, result);
LOGGER.trace("Finishing loading of projection context: security policy");
SecurityPolicyType projectionSecurityPolicy = securityHelper.locateProjectionSecurityPolicy(projContext.getStructuralObjectClassDefinition(), task, result);
LOGGER.trace("Located security policy for: {},\n {}", projContext, projectionSecurityPolicy);
projContext.setProjectionSecurityPolicy(projectionSecurityPolicy);
} else {
LOGGER.trace("No structural object class definition, skipping determining security policy");
}
Expand All @@ -1343,51 +1346,6 @@ private <F extends ObjectType> void finishLoadOfProjectionContext(LensContext<F>
setPrimaryDeltaOldValue(projContext);
}

private <F extends ObjectType> void loadProjectionSecurityPolicy(LensContext<F> context,
LensProjectionContext projContext, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException {
LOGGER.trace("Finishing loading of projection context: security policy");
ObjectReferenceType securityPolicyRef = projContext.getStructuralObjectClassDefinition().getSecurityPolicyRef();
if (securityPolicyRef == null || securityPolicyRef.getOid() == null) {
LOGGER.trace("Security policy not defined for the projection context.");
loadProjectionLegacyPasswordPolicy(context, projContext, task, result);
return;
}
LOGGER.trace("Loading security policy {} for projection context: {}", securityPolicyRef, projContext);
PrismObject<SecurityPolicyType> securityPolicy = cacheRepositoryService.getObject(SecurityPolicyType.class, securityPolicyRef.getOid(), null, result);
if (securityPolicy == null) {
LOGGER.debug("Security policy {} defined for the projection does not exist", securityPolicyRef);
return;
}
LOGGER.trace("Found legacy password policy: {}", securityPolicy);
projContext.setProjectionSecurityPolicy(securityPolicy.asObjectable());
}


private <F extends ObjectType> void loadProjectionLegacyPasswordPolicy(LensContext<F> context,
LensProjectionContext projContext, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException {
ObjectReferenceType passwordPolicyRef = projContext.getStructuralObjectClassDefinition().getPasswordPolicy();
if (passwordPolicyRef == null || passwordPolicyRef.getOid() == null) {
LOGGER.trace("Legacy password policy not defined for the projection context.");
return;
}
LOGGER.trace("Loading legacy password policy {} for projection context: {}", passwordPolicyRef, projContext);
PrismObject<ValuePolicyType> passwordPolicy = cacheRepositoryService.getObject(
ValuePolicyType.class, passwordPolicyRef.getOid(), null, result);
if (passwordPolicy == null) {
LOGGER.debug("Legacy password policy {} defined for the projection does not exist", passwordPolicyRef);
return;
}
ObjectReferenceType dummyPasswordPolicyRef = new ObjectReferenceType();
dummyPasswordPolicyRef.asReferenceValue().setObject(passwordPolicy);
PrismObject<SecurityPolicyType> securityPolicy = prismContext.createObject(SecurityPolicyType.class);
securityPolicy.asObjectable()
.beginCredentials()
.beginPassword()
.valuePolicyRef(dummyPasswordPolicyRef);
projContext.setProjectionSecurityPolicy(securityPolicy.asObjectable());
}


private <F extends ObjectType> boolean needToReload(LensContext<F> context,
LensProjectionContext projContext) {
ResourceShadowDiscriminator discr = projContext.getResourceShadowDiscriminator();
Expand Down
Expand Up @@ -9,8 +9,10 @@
import javax.xml.datatype.Duration;
import javax.xml.soap.SOAPMessage;

import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
import com.evolveum.midpoint.model.api.ModelAuditRecorder;
import com.evolveum.midpoint.model.impl.util.AuditHelper;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.security.api.HttpConnectionInformation;
import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer;

Expand Down Expand Up @@ -74,6 +76,7 @@ public class SecurityHelper implements ModelAuditRecorder {
@Autowired private AuditHelper auditHelper;
@Autowired private ModelObjectResolver objectResolver;
@Autowired private SecurityEnforcer securityEnforcer;
@Autowired private PrismContext prismContext;

@Override
public void auditLoginSuccess(@NotNull UserType user, @NotNull ConnectionEnvironment connEnv) {
Expand Down Expand Up @@ -223,6 +226,46 @@ public <F extends FocusType> SecurityPolicyType locateGlobalSecurityPolicy(Prism
return null;
}

public SecurityPolicyType locateProjectionSecurityPolicy(RefinedObjectClassDefinition structuralObjectClassDefinition, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException {
LOGGER.trace("Finishing loading of projection context: security policy");
ObjectReferenceType securityPolicyRef = structuralObjectClassDefinition.getSecurityPolicyRef();
if (securityPolicyRef == null || securityPolicyRef.getOid() == null) {
LOGGER.trace("Security policy not defined for the projection context.");
return loadProjectionLegacyPasswordPolicy(structuralObjectClassDefinition, task, result);
}
LOGGER.trace("Loading security policy {} from: {}", securityPolicyRef, structuralObjectClassDefinition);
SecurityPolicyType securityPolicy = objectResolver.resolve(securityPolicyRef, SecurityPolicyType.class, null, " projection security policy", task, result);
if (securityPolicy == null) {
LOGGER.debug("Security policy {} defined for the projection does not exist", securityPolicyRef);
return null;
}
postProcessSecurityPolicy(securityPolicy, task, result);
return securityPolicy;
}

private SecurityPolicyType loadProjectionLegacyPasswordPolicy(RefinedObjectClassDefinition structuralObjectClassDefinition, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException {
ObjectReferenceType passwordPolicyRef = structuralObjectClassDefinition.getPasswordPolicy();
if (passwordPolicyRef == null || passwordPolicyRef.getOid() == null) {
LOGGER.trace("Legacy password policy not defined for the projection context.");
return null;
}
LOGGER.trace("Loading legacy password policy {} from: {}", passwordPolicyRef, structuralObjectClassDefinition);
ValuePolicyType passwordPolicy = objectResolver.resolve(passwordPolicyRef,
ValuePolicyType.class, null, " projection legacy password policy ", task, result);
if (passwordPolicy == null) {
LOGGER.debug("Legacy password policy {} defined for the projection does not exist", passwordPolicyRef);
return null;
}
ObjectReferenceType dummyPasswordPolicyRef = new ObjectReferenceType();
dummyPasswordPolicyRef.asReferenceValue().setObject(passwordPolicy.asPrismObject());
PrismObject<SecurityPolicyType> securityPolicy = prismContext.createObject(SecurityPolicyType.class);
securityPolicy.asObjectable()
.beginCredentials()
.beginPassword()
.valuePolicyRef(dummyPasswordPolicyRef);
return securityPolicy.asObjectable();
}

private <F extends FocusType> SecurityPolicyType resolveGlobalSecurityPolicy(PrismObject<F> user, SystemConfigurationType systemConfiguration, Task task, OperationResult result) throws CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException {
ObjectReferenceType globalSecurityPolicyRef = systemConfiguration.getGlobalSecurityPolicyRef();
if (globalSecurityPolicyRef != null) {
Expand Down
Expand Up @@ -1112,6 +1112,7 @@ private <F extends FocusType> void executeActions(SynchronizationContext<F> sync
String handlerUri = actionDef.getHandlerUri();
if (handlerUri == null) {
LOGGER.error("Action definition in resource {} doesn't contain handler URI", syncCtx.getResource());
parentResult.recordFatalError("Action definition in resource " + syncCtx.getResource() + "doesn't contain handler URI.");
throw new ConfigurationException(
"Action definition in resource " + syncCtx.getResource() + " doesn't contain handler URI");
}
Expand Down

0 comments on commit 3ae6466

Please sign in to comment.