diff --git a/sfge/src/main/java/com/salesforce/graph/symbols/apex/system/SObjectAccessDecision.java b/sfge/src/main/java/com/salesforce/graph/symbols/apex/system/SObjectAccessDecision.java index d4404b277..f15de87c5 100644 --- a/sfge/src/main/java/com/salesforce/graph/symbols/apex/system/SObjectAccessDecision.java +++ b/sfge/src/main/java/com/salesforce/graph/symbols/apex/system/SObjectAccessDecision.java @@ -2,7 +2,6 @@ import com.salesforce.exception.UnexpectedException; import com.salesforce.exception.UnimplementedMethodException; -import com.salesforce.exception.UserActionException; import com.salesforce.graph.DeepCloneable; import com.salesforce.graph.ops.ApexStandardLibraryUtil; import com.salesforce.graph.ops.CloneUtil; @@ -171,14 +170,12 @@ private static AbstractSanitizableValue buildSanitizedValue( } else if (sanitizableValue instanceof ApexSoqlValue) { sanitizedValue = buildSanitizedValue(builder, (SoqlExpressionVertex) sanitizableValueVertex); - } else if (sanitizableValue instanceof ApexSingleValue) { + } else if (sanitizableValue instanceof ApexSingleValue + || sanitizableValue instanceof ApexCustomValue) { sanitizedValue = builder.declarationVertex(SyntheticTypedVertex.get("List")) .withStatus(ValueStatus.INDETERMINANT) .buildList(); - } else if (sanitizableValue instanceof ApexCustomValue) { - throw new UserActionException( - "Action needed: Do not use stripInaccessible() check on custom settings since custom settings expect only CRUD"); } else { throw new UnexpectedException( "ApexValue type not handled for stripInaccessible call: " + sanitizableValue); diff --git a/sfge/src/test/java/com/salesforce/graph/symbols/apex/SObjectAccessDecisionTest.java b/sfge/src/test/java/com/salesforce/graph/symbols/apex/SObjectAccessDecisionTest.java index 45ad90dc9..e339bb315 100644 --- a/sfge/src/test/java/com/salesforce/graph/symbols/apex/SObjectAccessDecisionTest.java +++ b/sfge/src/test/java/com/salesforce/graph/symbols/apex/SObjectAccessDecisionTest.java @@ -58,6 +58,30 @@ public void testAccessDecisionValueCreation() { firstItem.getTypeVertex().get().getCanonicalType(), equalToIgnoringCase("Account")); } + @Test + public void testCustomSettings() { + String[] sourceCode = { + "public class MyClass {\n" + + " public static void doSomething() {\n" + + " MySettings__c ms = MySettings__c.getOrgDefaults();\n" + + " SObjectAccessDecision sd = Security.stripInaccessible(AccessType.UPDATABLE, ms);\n" + + " System.debug(sd.getRecords());\n" + + " }\n" + + "}\n" + }; + + TestRunner.Result result = TestRunner.walkPath(g, sourceCode); + SystemDebugAccumulator visitor = result.getVisitor(); + + final ApexListValue outputListValue = visitor.getSingletonResult(); + assertThat( + outputListValue.isSanitized( + MethodBasedSanitization.SanitizerMechanism.STRIP_INACCESSIBLE, + FlsConstants.StripInaccessibleAccessType.UPDATABLE), + equalTo(true)); + assertThat(outputListValue.isIndeterminant(), equalTo(true)); + } + @Test public void testAccessDecisionValueIncorrectAccessType() { String[] sourceCode = { diff --git a/sfge/src/test/java/com/salesforce/rules/fls/apex/StripInaccessibleCommonScenariosTest.java b/sfge/src/test/java/com/salesforce/rules/fls/apex/StripInaccessibleCommonScenariosTest.java index 7b645146a..4c296f321 100644 --- a/sfge/src/test/java/com/salesforce/rules/fls/apex/StripInaccessibleCommonScenariosTest.java +++ b/sfge/src/test/java/com/salesforce/rules/fls/apex/StripInaccessibleCommonScenariosTest.java @@ -1,9 +1,7 @@ package com.salesforce.rules.fls.apex; -import com.salesforce.exception.UserActionException; import com.salesforce.rules.ApexFlsViolationRule; import com.salesforce.testutils.BaseFlsTest; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -32,20 +30,4 @@ public void testValidCase() { assertNoViolation(rule, sourceCode); } - - @Test - public void testRejectCustomSettingFlsCheck() { - String[] sourceCode = { - "public class MyClass {\n" - + " public static void foo() {\n" - + " MySettings__c ms = MySettings__c.getOrgDefaults();\n" - + " SObjectAccessDecision sd = Security.stripInaccessible(AccessType.UPDATABLE, ms);\n" - + " update sd.getRecords();\n" - + " }\n" - + "}\n" - }; - - Assertions.assertThrows( - UserActionException.class, () -> assertNoViolation(rule, sourceCode)); - } }