@@ -39,6 +39,8 @@ - (void)testBasic {
3939
4040 auto f = std::make_unique<ExecutableFileT>();
4141 f->mutable_signing_time ()->set_seconds (1748436989 );
42+ f->set_is_platform_binary (false );
43+ f->set_team_id (" EQHXZ8M8AV" );
4244 santa::cel::Activation<true > activation (
4345 std::move (f),
4446 ^std::vector<std::string>() {
@@ -53,6 +55,9 @@ - (void)testBasic {
5355 ^std::string () {
5456 return " /" ;
5557 },
58+ ^std::string () {
59+ return " /usr/bin/test" ;
60+ },
5661 ^std::vector<AncestorT>() {
5762 return {};
5863 },
@@ -92,6 +97,37 @@ - (void)testBasic {
9297 XCTAssertEqual (result.value ().cacheable , true );
9398 }
9499 }
100+ {
101+ // Static - is_platform_binary on target
102+ auto result = sut.value ()->CompileAndEvaluate (" target.is_platform_binary == false" , activation);
103+ if (!result.ok ()) {
104+ XCTFail (" Failed to evaluate: %s" , result.status ().message ().data ());
105+ } else {
106+ XCTAssertEqual (result.value ().value , ReturnValue::ALLOWLIST);
107+ XCTAssertEqual (result.value ().cacheable , true );
108+ }
109+ }
110+ {
111+ // Static - team_id on target
112+ auto result = sut.value ()->CompileAndEvaluate (" target.team_id == 'EQHXZ8M8AV'" , activation);
113+ if (!result.ok ()) {
114+ XCTFail (" Failed to evaluate: %s" , result.status ().message ().data ());
115+ } else {
116+ XCTAssertEqual (result.value ().value , ReturnValue::ALLOWLIST);
117+ XCTAssertEqual (result.value ().cacheable , true );
118+ }
119+ }
120+ {
121+ // Combined - is_platform_binary and team_id
122+ auto result = sut.value ()->CompileAndEvaluate (
123+ " !target.is_platform_binary && target.team_id == 'EQHXZ8M8AV'" , activation);
124+ if (!result.ok ()) {
125+ XCTFail (" Failed to evaluate: %s" , result.status ().message ().data ());
126+ } else {
127+ XCTAssertEqual (result.value ().value , ReturnValue::ALLOWLIST);
128+ XCTAssertEqual (result.value ().cacheable , true );
129+ }
130+ }
95131 {
96132 // Re-use of a compiled expression.
97133 google::protobuf::Arena arena;
@@ -125,6 +161,9 @@ - (void)testBasic {
125161 ^std::string () {
126162 return " /Users/foo" ;
127163 },
164+ ^std::string () {
165+ return " /usr/bin/test" ;
166+ },
128167 ^std::vector<santa::cel::v2::Ancestor>() {
129168 return {};
130169 },
@@ -179,6 +218,9 @@ - (void)testBasic {
179218 ^std::string {
180219 return " /" ;
181220 },
221+ ^std::string () {
222+ return " /usr/bin/test" ;
223+ },
182224 ^std::vector<santa::cel::v2::Ancestor>() {
183225 return {};
184226 },
@@ -206,6 +248,26 @@ - (void)testBasic {
206248 XCTAssertEqual (result.value ().cacheable , false );
207249 }
208250 }
251+ {
252+ // Dynamic - filepath via path field
253+ auto result = sut.value ()->CompileAndEvaluate (" path == '/usr/bin/test'" , activation);
254+ if (!result.ok ()) {
255+ XCTFail (" Failed to evaluate: %s" , result.status ().message ().data ());
256+ } else {
257+ XCTAssertEqual (result.value ().value , ReturnValue::ALLOWLIST);
258+ XCTAssertEqual (result.value ().cacheable , false );
259+ }
260+ }
261+ {
262+ // Dynamic - path with startsWith
263+ auto result = sut.value ()->CompileAndEvaluate (" path.startsWith('/usr/bin')" , activation);
264+ if (!result.ok ()) {
265+ XCTFail (" Failed to evaluate: %s" , result.status ().message ().data ());
266+ } else {
267+ XCTAssertEqual (result.value ().value , ReturnValue::ALLOWLIST);
268+ XCTAssertEqual (result.value ().cacheable , false );
269+ }
270+ }
209271}
210272
211273- (void )testV2Only {
@@ -221,6 +283,9 @@ - (void)testV2Only {
221283 auto cwdFn = ^std::string () {
222284 return " /" ;
223285 };
286+ auto pathFn = ^std::string () {
287+ return " /usr/bin/test" ;
288+ };
224289 auto ancestorsV1Fn = ^std::vector<santa::cel::CELProtoTraits<false >::AncestorT>() {
225290 return {};
226291 };
@@ -238,7 +303,7 @@ - (void)testV2Only {
238303 // V1
239304 auto f = std::make_unique<santa::cel::CELProtoTraits<false >::ExecutableFileT>();
240305 f->mutable_signing_time ()->set_seconds (1748436989 );
241- santa::cel::Activation<false > activation (std::move (f), argsFn, envsFn, euidFn, cwdFn,
306+ santa::cel::Activation<false > activation (std::move (f), argsFn, envsFn, euidFn, cwdFn, pathFn,
242307 ancestorsV1Fn, fdsV1Fn);
243308 auto sut = santa::cel::Evaluator<false >::Create ();
244309 XCTAssertTrue (sut.ok ());
@@ -254,7 +319,7 @@ - (void)testV2Only {
254319 using ReturnValue = santa::cel::CELProtoTraits<true >::ReturnValue;
255320 auto f = std::make_unique<santa::cel::CELProtoTraits<true >::ExecutableFileT>();
256321 f->mutable_signing_time ()->set_seconds (1748436989 );
257- santa::cel::Activation<true > activation (std::move (f), argsFn, envsFn, euidFn, cwdFn,
322+ santa::cel::Activation<true > activation (std::move (f), argsFn, envsFn, euidFn, cwdFn, pathFn,
258323 ancestorsV2Fn, fdsV2Fn);
259324 auto sut = santa::cel::Evaluator<true >::Create ();
260325 XCTAssertTrue (sut.ok ());
@@ -292,6 +357,9 @@ - (void)testFds {
292357 ^std::string () {
293358 return " /" ;
294359 },
360+ ^std::string () {
361+ return " /usr/bin/test" ;
362+ },
295363 ^std::vector<AncestorT>() {
296364 return {};
297365 },
@@ -387,6 +455,9 @@ - (void)testTouchIDCooldownFunctions {
387455 ^std::string () {
388456 return " /" ;
389457 },
458+ ^std::string () {
459+ return " /usr/bin/test" ;
460+ },
390461 ^std::vector<AncestorT>() {
391462 return {};
392463 },
@@ -490,6 +561,9 @@ - (void)testTouchIDCooldownNotAvailableInV1 {
490561 ^std::string () {
491562 return " /" ;
492563 },
564+ ^std::string () {
565+ return " /usr/bin/test" ;
566+ },
493567 ^std::vector<AncestorT>() {
494568 return {};
495569 },
0 commit comments