@@ -9,7 +9,9 @@ use std::{
99use globset:: GlobSet ;
1010use serde:: Serialize ;
1111
12- use fact_ebpf:: { PATH_MAX , event_t, file_activity_type_t, inode_key_t, monitored_t} ;
12+ use fact_ebpf:: {
13+ PATH_MAX , XATTR_NAME_MAX_LEN , event_t, file_activity_type_t, inode_key_t, monitored_t,
14+ } ;
1315
1416use crate :: host_info;
1517use process:: Process ;
@@ -131,6 +133,10 @@ impl Event {
131133 matches ! ( self . file, FileData :: Creation ( _) | FileData :: MkDir ( _) )
132134 }
133135
136+ pub fn is_xattr ( & self ) -> bool {
137+ matches ! ( self . file, FileData :: SetXattr ( _) | FileData :: RemoveXattr ( _) )
138+ }
139+
134140 pub fn is_mkdir ( & self ) -> bool {
135141 matches ! ( self . file, FileData :: MkDir ( _) )
136142 }
@@ -162,6 +168,8 @@ impl Event {
162168 FileData :: Chmod ( data) => & data. inner . inode ,
163169 FileData :: Chown ( data) => & data. inner . inode ,
164170 FileData :: Rename ( data) => & data. new . inode ,
171+ FileData :: SetXattr ( data) => & data. inner . inode ,
172+ FileData :: RemoveXattr ( data) => & data. inner . inode ,
165173 }
166174 }
167175
@@ -176,6 +184,8 @@ impl Event {
176184 FileData :: Chmod ( data) => & data. inner . parent_inode ,
177185 FileData :: Chown ( data) => & data. inner . parent_inode ,
178186 FileData :: Rename ( data) => & data. new . parent_inode ,
187+ FileData :: SetXattr ( data) => & data. inner . parent_inode ,
188+ FileData :: RemoveXattr ( data) => & data. inner . parent_inode ,
179189 }
180190 }
181191
@@ -199,6 +209,8 @@ impl Event {
199209 FileData :: Chmod ( data) => & data. inner . filename ,
200210 FileData :: Chown ( data) => & data. inner . filename ,
201211 FileData :: Rename ( data) => & data. new . filename ,
212+ FileData :: SetXattr ( data) => & data. inner . filename ,
213+ FileData :: RemoveXattr ( data) => & data. inner . filename ,
202214 }
203215 }
204216
@@ -219,6 +231,8 @@ impl Event {
219231 FileData :: Chmod ( data) => & data. inner . host_file ,
220232 FileData :: Chown ( data) => & data. inner . host_file ,
221233 FileData :: Rename ( data) => & data. new . host_file ,
234+ FileData :: SetXattr ( data) => & data. inner . host_file ,
235+ FileData :: RemoveXattr ( data) => & data. inner . host_file ,
222236 }
223237 }
224238
@@ -243,6 +257,8 @@ impl Event {
243257 FileData :: Chmod ( data) => data. inner . host_file = host_path,
244258 FileData :: Chown ( data) => data. inner . host_file = host_path,
245259 FileData :: Rename ( data) => data. new . host_file = host_path,
260+ FileData :: SetXattr ( data) => data. inner . host_file = host_path,
261+ FileData :: RemoveXattr ( data) => data. inner . host_file = host_path,
246262 }
247263 }
248264
@@ -264,6 +280,8 @@ impl Event {
264280 FileData :: Chmod ( data) => data. inner . monitored ,
265281 FileData :: Chown ( data) => data. inner . monitored ,
266282 FileData :: Rename ( data) => data. new . monitored ,
283+ FileData :: SetXattr ( data) => data. inner . monitored ,
284+ FileData :: RemoveXattr ( data) => data. inner . monitored ,
267285 }
268286 }
269287
@@ -356,6 +374,8 @@ pub enum FileData {
356374 Chmod ( ChmodFileData ) ,
357375 Chown ( ChownFileData ) ,
358376 Rename ( RenameFileData ) ,
377+ SetXattr ( XattrFileData ) ,
378+ RemoveXattr ( XattrFileData ) ,
359379}
360380
361381impl FileData {
@@ -407,6 +427,18 @@ impl FileData {
407427 } ;
408428 FileData :: Rename ( data)
409429 }
430+ file_activity_type_t:: FILE_ACTIVITY_SETXATTR => {
431+ let xattr_name = slice_to_string (
432+ & unsafe { extra_data. xattr } . name [ ..XATTR_NAME_MAX_LEN as usize ] ,
433+ ) ?;
434+ FileData :: SetXattr ( XattrFileData { inner, xattr_name } )
435+ }
436+ file_activity_type_t:: FILE_ACTIVITY_REMOVEXATTR => {
437+ let xattr_name = slice_to_string (
438+ & unsafe { extra_data. xattr } . name [ ..XATTR_NAME_MAX_LEN as usize ] ,
439+ ) ?;
440+ FileData :: RemoveXattr ( XattrFileData { inner, xattr_name } )
441+ }
410442 invalid => unreachable ! ( "Invalid event type: {invalid:?}" ) ,
411443 } ;
412444
@@ -433,6 +465,14 @@ impl From<FileData> for fact_api::file_activity::File {
433465 FileData :: RmDir ( _) => {
434466 unreachable ! ( "RmDir event reached protobuf conversion" ) ;
435467 }
468+ FileData :: SetXattr ( event) => {
469+ let f_act = fact_api:: FileXattrChange :: from ( event) ;
470+ fact_api:: file_activity:: File :: XattrSet ( f_act)
471+ }
472+ FileData :: RemoveXattr ( event) => {
473+ let f_act = fact_api:: FileXattrChange :: from ( event) ;
474+ fact_api:: file_activity:: File :: XattrRemove ( f_act)
475+ }
436476 FileData :: Unlink ( event) => {
437477 let activity = Some ( fact_api:: FileActivityBase :: from ( event) ) ;
438478 let f_act = fact_api:: FileUnlink { activity } ;
@@ -465,6 +505,8 @@ impl PartialEq for FileData {
465505 ( FileData :: Unlink ( this) , FileData :: Unlink ( other) ) => this == other,
466506 ( FileData :: Chmod ( this) , FileData :: Chmod ( other) ) => this == other,
467507 ( FileData :: Rename ( this) , FileData :: Rename ( other) ) => this == other,
508+ ( FileData :: SetXattr ( this) , FileData :: SetXattr ( other) ) => this == other,
509+ ( FileData :: RemoveXattr ( this) , FileData :: RemoveXattr ( other) ) => this == other,
468510 _ => false ,
469511 }
470512 }
@@ -595,6 +637,29 @@ impl PartialEq for RenameFileData {
595637 }
596638}
597639
640+ #[ derive( Debug , Clone , Serialize ) ]
641+ pub struct XattrFileData {
642+ inner : BaseFileData ,
643+ xattr_name : String ,
644+ }
645+
646+ impl From < XattrFileData > for fact_api:: FileXattrChange {
647+ fn from ( value : XattrFileData ) -> Self {
648+ let activity = fact_api:: FileActivityBase :: from ( value. inner ) ;
649+ fact_api:: FileXattrChange {
650+ activity : Some ( activity) ,
651+ xattr_name : value. xattr_name ,
652+ }
653+ }
654+ }
655+
656+ #[ cfg( test) ]
657+ impl PartialEq for XattrFileData {
658+ fn eq ( & self , other : & Self ) -> bool {
659+ self . xattr_name == other. xattr_name && self . inner == other. inner
660+ }
661+ }
662+
598663#[ cfg( test) ]
599664mod test_utils {
600665 use std:: os:: raw:: c_char;
0 commit comments