Skip to content

Commit

Permalink
some fixes for rpc generate/validate value... adding more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Feb 12, 2018
1 parent 205569e commit 1ce99a9
Show file tree
Hide file tree
Showing 15 changed files with 197 additions and 49 deletions.
Expand Up @@ -172,7 +172,10 @@ public <O extends ObjectType> Response generateValue(PolicyItemsDefinitionType p
Task task = RestServiceUtil.initRequest(mc);
OperationResult parentResult = task.getResult().createSubresult(OPERATION_GENERATE_VALUE_RPC);

return generateValue(null, policyItemsDefinition, task, parentResult);
Response response = generateValue(null, policyItemsDefinition, task, parentResult);
finishRequest(task);

return response;
}

private <O extends ObjectType> Response generateValue(PrismObject<O> object, PolicyItemsDefinitionType policyItemsDefinition, Task task, OperationResult parentResult){
Expand All @@ -183,15 +186,14 @@ private <O extends ObjectType> Response generateValue(PrismObject<O> object, Pol
try {
modelInteraction.generateValue(object, policyItemsDefinition, task, parentResult);
parentResult.computeStatusIfUnknown();

if (parentResult.isSuccess()) {
response = RestServiceUtil.createResponse(Response.Status.OK, policyItemsDefinition, parentResult, true);
} else {
response = RestServiceUtil.createResponse(Response.Status.BAD_REQUEST, parentResult, parentResult);
}

} catch (Exception ex) {
parentResult.computeStatus();
parentResult.recordFatalError("Failed to generate value, " + ex.getMessage(), ex);
response = RestServiceUtil.handleException(parentResult, ex);
}
}
Expand Down
Expand Up @@ -874,10 +874,10 @@ public <O extends ObjectType> String generateValue(ValuePolicyType policy, int d
public <O extends ObjectType> void generateValue(PrismObject<O> object, PolicyItemsDefinitionType policyItemsDefinition,
Task task, OperationResult parentResult) throws ObjectAlreadyExistsException, ExpressionEvaluationException, SchemaException, ObjectNotFoundException,
CommunicationException, ConfigurationException, SecurityViolationException, PolicyViolationException {
String oid = object.getOid();

OperationResult result = parentResult.createSubresult(OPERATION_GENERATE_VALUE);

Class<O> clazz = (Class<O>) object.asObjectable().getClass();

ValuePolicyType valuePolicy = null;
try {
valuePolicy = getValuePolicy(object, task, result);
Expand All @@ -892,23 +892,7 @@ public <O extends ObjectType> void generateValue(PrismObject<O> object, PolicyIt
Collection<PropertyDelta<?>> deltasToExecute = new ArrayList<>();
for (PolicyItemDefinitionType policyItemDefinition : policyItemsDefinition.getPolicyItemDefinition()) {
OperationResult generateValueResult = parentResult.createSubresult(OPERATION_GENERATE_VALUE);

ItemPath path = getPath(policyItemDefinition);
if (path == null) {
LOGGER.error("No item path defined in the target for policy item definition. Cannot generate value");
generateValueResult.recordFatalError("No item path defined in the target for policy item definition. Cannot generate value");
continue;
}

result.addArbitraryObjectAsParam("policyItemPath", path);

PrismPropertyDefinition<?> propertyDef = getItemDefinition(object, path);
if (propertyDef == null) {
LOGGER.error("No definition for property {} in object. Is the path referencing prism property?" + path, object);
generateValueResult.recordFatalError("No definition for property " + path + " in object " + object + ". Is the path referencing prism property?");
continue;
}


LOGGER.trace("Default value policy: {}" , valuePolicy);
try {
generateValue(object, valuePolicy, policyItemDefinition, task, generateValueResult);
Expand All @@ -919,7 +903,37 @@ public <O extends ObjectType> void generateValue(PrismObject<O> object, PolicyIt
policyItemDefinition.setResult(generateValueResult.createOperationResultType());
continue;
}
collectDeltasForGeneratedValuesIfNeeded(object, policyItemDefinition, deltasToExecute, path, propertyDef);

//TODO: not sure about the bulk actions here
ItemPath path = getPath(policyItemDefinition);
if (path == null) {
if (isExecute(policyItemDefinition)) {
LOGGER.error("No item path defined in the target for policy item definition. Cannot generate value");
generateValueResult.recordFatalError(
"No item path defined in the target for policy item definition. Cannot generate value");
continue;
}
}

PrismPropertyDefinition<?> propertyDef = null;
if (path != null) {
result.addArbitraryObjectAsParam("policyItemPath", path);

propertyDef = getItemDefinition(object, path);
if (propertyDef == null) {
if (isExecute(policyItemDefinition)) {
LOGGER.error("No definition for property {} in object. Is the path referencing prism property?" + path,
object);
generateValueResult.recordFatalError("No definition for property " + path + " in object " + object
+ ". Is the path referencing prism property?");
continue;
}

}
}
// end of not sure

collectDeltasForGeneratedValuesIfNeeded(object, policyItemDefinition, deltasToExecute, path, propertyDef, generateValueResult);
generateValueResult.computeStatusIfUnknown();
}
result.computeStatus();
Expand All @@ -928,8 +942,15 @@ public <O extends ObjectType> void generateValue(PrismObject<O> object, PolicyIt
}
try {
if (!deltasToExecute.isEmpty()) {

modelCrudService.modifyObject(clazz, oid, deltasToExecute, null, task, result);
if (object == null) {
LOGGER.error("Cannot execute changes for generated values, no object specified in request.");
result.recordFatalError("Cannot execute changes for generated values, no object specified in request.");
throw new SchemaException("Cannot execute changes for generated values, no object specified in request.");
}
String oid = object.getOid();
Class<O> clazz = (Class<O>) object.asObjectable().getClass();
modelCrudService.modifyObject(clazz, oid, deltasToExecute, null, task, result);

}
} catch (ObjectNotFoundException | SchemaException | ExpressionEvaluationException
| CommunicationException | ConfigurationException | ObjectAlreadyExistsException
Expand All @@ -942,6 +963,13 @@ public <O extends ObjectType> void generateValue(PrismObject<O> object, PolicyIt

}

private boolean isExecute(PolicyItemDefinitionType policyItemDefinition) {
if (policyItemDefinition.isExecute() == null) {
return false;
}

return policyItemDefinition.isExecute().booleanValue();
}
private ItemPath getPath(PolicyItemDefinitionType policyItemDefinition){
PolicyItemTargetType target = policyItemDefinition.getTarget();

Expand Down Expand Up @@ -970,22 +998,32 @@ private <O extends ObjectType> PrismPropertyDefinition<?> getItemDefinition(Pris

private <O extends ObjectType> void collectDeltasForGeneratedValuesIfNeeded(PrismObject<O> object,
PolicyItemDefinitionType policyItemDefinition, Collection<PropertyDelta<?>> deltasToExecute, ItemPath path,
PrismPropertyDefinition<?> itemDef) throws SchemaException {
PrismPropertyDefinition<?> itemDef, OperationResult result) throws SchemaException {

Object value = policyItemDefinition.getValue();

if (ProtectedStringType.COMPLEX_TYPE.equals(itemDef.getTypeName())) {
ProtectedStringType pst = new ProtectedStringType();
pst.setClearValue((String) value);
value = pst;
} else if (PolyStringType.COMPLEX_TYPE.equals(itemDef.getTypeName())) {
value = new PolyString((String) value);
if (itemDef != null){
if (ProtectedStringType.COMPLEX_TYPE.equals(itemDef.getTypeName())) {
ProtectedStringType pst = new ProtectedStringType();
pst.setClearValue((String) value);
value = pst;
} else if (PolyStringType.COMPLEX_TYPE.equals(itemDef.getTypeName())) {
value = new PolyString((String) value);
}
}
if (object == null && isExecute(policyItemDefinition)) {
LOGGER.warn("Cannot apply generated changes and cannot execute them becasue there is no target object specified.");
result.recordFatalError("Cannot apply generated changes and cannot execute them becasue there is no target object specified.");
return;
}
PropertyDelta<?> propertyDelta = PropertyDelta.createModificationReplaceProperty(path, object.getDefinition(), value);
propertyDelta.applyTo(object); // in bulk actions we need to modify original objects - hope that REST is OK with this
if (BooleanUtils.isTrue(policyItemDefinition.isExecute())) {
deltasToExecute.add(propertyDelta);
if (object != null) {
PropertyDelta<?> propertyDelta = PropertyDelta.createModificationReplaceProperty(path, object.getDefinition(), value);
propertyDelta.applyTo(object); // in bulk actions we need to modify original objects - hope that REST is OK with this
if (BooleanUtils.isTrue(policyItemDefinition.isExecute())) {
deltasToExecute.add(propertyDelta);
}
}

}

private <O extends ObjectType> void generateValue(PrismObject<O> object, ValuePolicyType defaultPolicy,
Expand All @@ -994,11 +1032,15 @@ private <O extends ObjectType> void generateValue(PrismObject<O> object, ValuePo
ConfigurationException, SecurityViolationException {

PolicyItemTargetType target = policyItemDefinition.getTarget();
if (target == null || ItemPath.isNullOrEmpty(target.getPath())) {
if ((target == null || ItemPath.isNullOrEmpty(target.getPath())) && isExecute(policyItemDefinition)) {
LOGGER.error("Target item path must be defined");
throw new SchemaException("Target item path must be defined");
}
ItemPath targetPath = target.getPath().getItemPath();
ItemPath targetPath = null;

if (target != null) {
targetPath = target.getPath().getItemPath();
}

ValuePolicyType valuePolicy = resolveValuePolicy(policyItemDefinition, defaultPolicy, task, result);
LOGGER.trace("Value policy used for generating new value : {}", valuePolicy);
Expand Down
Expand Up @@ -89,7 +89,10 @@ public abstract class TestAbstractRestService extends RestServiceInitializer{
public static final String POLICY_ITEM_DEFINITION_GENERATE_EXECUTE = "policy-generate-execute";
public static final String POLICY_ITEM_DEFINITION_GENERATE_PASSWORD_EXECUTE = "policy-generate-password-execute";
public static final String POLICY_ITEM_DEFINITION_GENERATE_HONORIFIC_PREFIX_EXECUTE = "policy-generate-honorific-prefix-execute";
public static final String POLICY_ITEM_DEFINITION_GENERATE_EXPLICIT = "policy-generate-explicit";
public static final String POLICY_ITEM_DEFINITION_GENERATE_EXPLICIT_NO_VALUE_POLICY = "policy-generate-explicit-no-value-policy";
public static final String POLICY_ITEM_DEFINITION_VALIDATE_EXPLICIT = "policy-validate-explicit";
public static final String POLICY_ITEM_DEFINITION_VALIDATE_EXPLICIT_NO_VALUE_POLICY = "policy-validate-explicit-no-value-policy";
public static final String POLICY_ITEM_DEFINITION_VALIDATE_EXPLICIT_CONFLICT = "policy-validate-explicit-conflict";
public static final String POLICY_ITEM_DEFINITION_VALIDATE_IMPLICIT_SINGLE = "policy-validate-implicit-single";
public static final String POLICY_ITEM_DEFINITION_VALIDATE_IMPLICIT_PASSWORD = "policy-validate-implicit-password";
Expand Down Expand Up @@ -1133,7 +1136,59 @@ public void test515validateValueImplicitPassword() throws Exception {
getDummyAuditService().assertLoginLogout(SchemaConstants.CHANNEL_REST_URI);
}

@Test
public void test516validateValueExplicitNoValuePolicy() throws Exception {
final String TEST_NAME = "test516validateValueExplicitNoValuePolicy";
displayTestTitle(this, TEST_NAME);

WebClient client = prepareClient();
client.path("/rpc/validate");

getDummyAuditService().clear();

TestUtil.displayWhen(TEST_NAME);
Response response = client.post(getRepoFile(POLICY_ITEM_DEFINITION_VALIDATE_EXPLICIT_NO_VALUE_POLICY));

TestUtil.displayThen(TEST_NAME);
displayResponse(response);

traceResponse(response);

assertEquals("Expected 200 but got " + response.getStatus(), 200, response.getStatus());

IntegrationTestTools.display("Audit", getDummyAuditService());
getDummyAuditService().assertRecords(2);
getDummyAuditService().assertLoginLogout(SchemaConstants.CHANNEL_REST_URI);


}


@Test
public void test517generateValueExplicit() throws Exception {
final String TEST_NAME = "test517generateValueExplicit";
displayTestTitle(this, TEST_NAME);

WebClient client = prepareClient();
client.path("/rpc/generate");

getDummyAuditService().clear();

TestUtil.displayWhen(TEST_NAME);
Response response = client.post(getRepoFile(POLICY_ITEM_DEFINITION_GENERATE_EXPLICIT));

TestUtil.displayThen(TEST_NAME);
displayResponse(response);

traceResponse(response);

assertEquals("Expected 200 but got " + response.getStatus(), 200, response.getStatus());

IntegrationTestTools.display("Audit", getDummyAuditService());
getDummyAuditService().assertRecords(2);
getDummyAuditService().assertLoginLogout(SchemaConstants.CHANNEL_REST_URI);
}

@Test
public void test600modifySecurityQuestionAnswer() throws Exception {
final String TEST_NAME = "test600modifySecurityQuestionAnswer";
Expand Down
Expand Up @@ -9,7 +9,8 @@
"valuePolicyRef": {
"type": "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ValuePolicyType",
"oid": "00000000-0000-0000-1111-000000000003"
}
},
"execute" : "true"
}
]
}
Expand Down
@@ -0,0 +1,11 @@
{
"@ns": "http://midpoint.evolveum.com/xml/ns/public/common/api-types-3",
"policyItemsDefinition": {
"policyItemDefinition": [{
"valuePolicyRef": {
"type": "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ValuePolicyType",
"oid": "00000000-0000-0000-1111-000000000003"
}
}]
}
}
@@ -0,0 +1,10 @@
{
"@ns": "http://midpoint.evolveum.com/xml/ns/public/common/api-types-3",
"policyItemsDefinition": {
"policyItemDefinition": [
{
"value": "Ad123456"
}
]
}
}
Expand Up @@ -3,9 +3,6 @@
"policyItemsDefinition": {
"policyItemDefinition": [
{
"target": {
"path": "employeeNumber"
},
"valuePolicyRef": {
"type": "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ValuePolicyType",
"oid": "00000000-0000-0000-1111-000000000003"
Expand Down
Expand Up @@ -10,5 +10,6 @@
<path>parentOrgRef</path>
</target>
<valuePolicyRef oid="00000000-0000-0000-1111-000000000003" type="c:ValuePolicyType"/>
<execute>true</execute>
</policyItemDefinition>
</policyItemsDefinition>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<policyItemsDefinition xmlns="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3">
<policyItemDefinition>
<valuePolicyRef oid="00000000-0000-0000-1111-000000000003" type="c:ValuePolicyType"/>
</policyItemDefinition>
</policyItemsDefinition>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<policyItemsDefinition xmlns="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3">
<policyItemDefinition>
<value>Ad123456</value>
</policyItemDefinition>

</policyItemsDefinition>
Expand Up @@ -6,9 +6,6 @@
xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3">
<policyItemDefinition>
<target>
<path>employeeNumber</path>
</target>
<valuePolicyRef oid="00000000-0000-0000-1111-000000000003" type="c:ValuePolicyType"/>
<value>123456</value>
</policyItemDefinition>
Expand Down
Expand Up @@ -5,4 +5,5 @@ policyItemsDefinition:
path: "parentOrgRef"
valuePolicyRef:
type: "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ValuePolicyType"
oid: "00000000-0000-0000-1111-000000000003"
oid: "00000000-0000-0000-1111-000000000003"
execute: true
@@ -0,0 +1,6 @@
'@ns': "http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
policyItemsDefinition:
policyItemDefinition:
- valuePolicyRef:
type: "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ValuePolicyType"
oid: "00000000-0000-0000-1111-000000000003"
@@ -0,0 +1,4 @@
'@ns': "http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
policyItemsDefinition:
policyItemDefinition:
- value: "Ad123456"
@@ -1,9 +1,7 @@
'@ns': "http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
policyItemsDefinition:
policyItemDefinition:
- target:
path: "employeeNumber"
valuePolicyRef:
- valuePolicyRef:
type: "http://midpoint.evolveum.com/xml/ns/public/common/common-3#ValuePolicyType"
oid: "00000000-0000-0000-1111-000000000003"
value: "123456"

0 comments on commit 1ce99a9

Please sign in to comment.