@@ -67,6 +67,7 @@ impl Event {
6767 FileData :: Open ( data) => & data. inode ,
6868 FileData :: Creation ( data) => & data. inode ,
6969 FileData :: Unlink ( data) => & data. inode ,
70+ FileData :: Chmod ( data) => & data. file . inode ,
7071 }
7172 }
7273
@@ -75,6 +76,7 @@ impl Event {
7576 FileData :: Open ( data) => data. host_file = host_path,
7677 FileData :: Creation ( data) => data. host_file = host_path,
7778 FileData :: Unlink ( data) => data. host_file = host_path,
79+ FileData :: Chmod ( data) => data. file . host_file = host_path,
7880 }
7981 }
8082}
@@ -85,7 +87,12 @@ impl TryFrom<&event_t> for Event {
8587 fn try_from ( value : & event_t ) -> Result < Self , Self :: Error > {
8688 let process = Process :: try_from ( value. process ) ?;
8789 let timestamp = host_info:: get_boot_time ( ) + value. timestamp ;
88- let file = FileData :: new ( value. type_ , value. filename , value. inode ) ?;
90+ let file = FileData :: new (
91+ value. type_ ,
92+ value. filename ,
93+ value. inode ,
94+ value. __bindgen_anon_1 ,
95+ ) ?;
8996
9097 Ok ( Event {
9198 timestamp,
@@ -123,19 +130,29 @@ pub enum FileData {
123130 Open ( BaseFileData ) ,
124131 Creation ( BaseFileData ) ,
125132 Unlink ( BaseFileData ) ,
133+ Chmod ( ChmodFileData ) ,
126134}
127135
128136impl FileData {
129137 pub fn new (
130138 event_type : file_activity_type_t ,
131139 filename : [ c_char ; PATH_MAX as usize ] ,
132140 inode : inode_key_t ,
141+ extra_data : fact_ebpf:: event_t__bindgen_ty_1 ,
133142 ) -> anyhow:: Result < Self > {
134143 let inner = BaseFileData :: new ( filename, inode) ?;
135144 let file = match event_type {
136145 file_activity_type_t:: FILE_ACTIVITY_OPEN => FileData :: Open ( inner) ,
137146 file_activity_type_t:: FILE_ACTIVITY_CREATION => FileData :: Creation ( inner) ,
138147 file_activity_type_t:: FILE_ACTIVITY_UNLINK => FileData :: Unlink ( inner) ,
148+ file_activity_type_t:: FILE_ACTIVITY_CHMOD => {
149+ let data = ChmodFileData {
150+ file : inner,
151+ new_mode : unsafe { extra_data. chmod . new } ,
152+ old_mode : unsafe { extra_data. chmod . old } ,
153+ } ;
154+ FileData :: Chmod ( data)
155+ }
139156 invalid => unreachable ! ( "Invalid event type: {invalid:?}" ) ,
140157 } ;
141158
@@ -161,6 +178,10 @@ impl From<FileData> for fact_api::file_activity::File {
161178 let f_act = fact_api:: FileUnlink { activity } ;
162179 fact_api:: file_activity:: File :: Unlink ( f_act)
163180 }
181+ FileData :: Chmod ( event) => {
182+ let f_act = fact_api:: FilePermissionChange :: from ( event) ;
183+ fact_api:: file_activity:: File :: Permission ( f_act)
184+ }
164185 }
165186 }
166187}
@@ -211,3 +232,42 @@ impl From<BaseFileData> for fact_api::FileActivityBase {
211232 }
212233 }
213234}
235+
236+ #[ derive( Debug , Clone , Serialize ) ]
237+ pub struct ChmodFileData {
238+ file : BaseFileData ,
239+ new_mode : u16 ,
240+ old_mode : u16 ,
241+ }
242+
243+ impl ChmodFileData {
244+ pub fn new (
245+ filename : [ c_char ; PATH_MAX as usize ] ,
246+ inode : inode_key_t ,
247+ new_mode : u16 ,
248+ old_mode : u16 ,
249+ ) -> anyhow:: Result < Self > {
250+ let file = BaseFileData :: new ( filename, inode) ?;
251+
252+ Ok ( ChmodFileData {
253+ file,
254+ new_mode,
255+ old_mode,
256+ } )
257+ }
258+ }
259+
260+ impl From < ChmodFileData > for fact_api:: FilePermissionChange {
261+ fn from ( value : ChmodFileData ) -> Self {
262+ let ChmodFileData {
263+ file,
264+ new_mode,
265+ old_mode : _,
266+ } = value;
267+ let activity = fact_api:: FileActivityBase :: from ( file) ;
268+ fact_api:: FilePermissionChange {
269+ activity : Some ( activity) ,
270+ mode : new_mode as u32 ,
271+ }
272+ }
273+ }
0 commit comments