|
| 1 | +from __future__ import annotations |
| 2 | + |
1 | 3 | import io |
2 | 4 |
|
3 | 5 | from dissect.target.helpers.nfs.nfs import ( |
|
10 | 12 | MountStat, |
11 | 13 | NfsStat, |
12 | 14 | NfsTime3, |
| 15 | + Read3args, |
| 16 | + Read3resok, |
13 | 17 | ReadDirPlusParams, |
14 | 18 | ReadDirPlusResult3, |
15 | 19 | SpecData3, |
|
25 | 29 |
|
26 | 30 | class MountResultDeserializer(Deserializer[MountOK | MountStat]): |
27 | 31 | def deserialize(self, payload: io.BytesIO) -> MountOK | None: |
28 | | - mountStat = self._read_enum(payload, MountStat) |
29 | | - if mountStat != MountStat.MNT3_OK: |
30 | | - return mountStat |
| 32 | + mount_stat = self._read_enum(payload, MountStat) |
| 33 | + if mount_stat != MountStat.MNT3_OK: |
| 34 | + return mount_stat |
31 | 35 | filehandle_bytes = self._read_var_length_opaque(payload) |
32 | | - authFlavors = self._read_var_length(payload, Int32Serializer()) |
| 36 | + auth_flavors = self._read_var_length(payload, Int32Serializer()) |
33 | 37 |
|
34 | | - return MountOK(FileHandle3(filehandle_bytes), authFlavors) |
| 38 | + return MountOK(FileHandle3(filehandle_bytes), auth_flavors) |
35 | 39 |
|
36 | 40 |
|
37 | 41 | class ReadDirPlusParamsSerializer(Serializer[ReadDirPlusParams]): |
@@ -73,10 +77,10 @@ def deserialize(self, payload: io.BytesIO) -> FileAttributes3: |
73 | 77 | rdev = SpecDataSerializer().deserialize(payload) |
74 | 78 | fsid = self._read_uint64(payload) |
75 | 79 | fileid = self._read_uint64(payload) |
76 | | - timeDeserializer = NfsTimeSerializer() |
77 | | - atime = timeDeserializer.deserialize(payload) |
78 | | - mtime = timeDeserializer.deserialize(payload) |
79 | | - ctime = timeDeserializer.deserialize(payload) |
| 80 | + time_deserializer = NfsTimeSerializer() |
| 81 | + atime = time_deserializer.deserialize(payload) |
| 82 | + mtime = time_deserializer.deserialize(payload) |
| 83 | + ctime = time_deserializer.deserialize(payload) |
80 | 84 |
|
81 | 85 | return FileAttributes3(type, mode, nlink, uid, gid, size, used, rdev, fsid, fileid, atime, mtime, ctime) |
82 | 86 |
|
@@ -110,6 +114,27 @@ def deserialize(self, payload: io.BytesIO) -> ReadDirPlusResult3: |
110 | 114 |
|
111 | 115 | entries.append(entry) |
112 | 116 |
|
113 | | - eof = self._read_enum(payload, Bool) |
| 117 | + eof = self._read_enum(payload, Bool) == Bool.TRUE |
114 | 118 |
|
115 | 119 | return ReadDirPlusResult3(dir_attributes, CookieVerf3(cookieverf), entries, eof) |
| 120 | + |
| 121 | + |
| 122 | +class Read3ArgsSerializer(Serializer[ReadDirPlusParams]): |
| 123 | + def serialize(self, args: Read3args) -> bytes: |
| 124 | + result = self._write_var_length_opaque(args.file.opaque) |
| 125 | + result += self._write_uint64(args.offset) |
| 126 | + result += self._write_uint32(args.count) |
| 127 | + return result |
| 128 | + |
| 129 | + |
| 130 | +class Read3ResultDeserializer(Deserializer[Read3resok]): |
| 131 | + def deserialize(self, payload: io.BytesIO) -> Read3resok: |
| 132 | + stat = self._read_enum(payload, NfsStat) |
| 133 | + if stat != NfsStat.NFS3_OK: |
| 134 | + return stat |
| 135 | + |
| 136 | + file_attributes = self._read_optional(payload, FileAttributesSerializer()) |
| 137 | + count = self._read_uint32(payload) |
| 138 | + eof = self._read_enum(payload, Bool) == Bool.TRUE |
| 139 | + data = self._read_var_length_opaque(payload) |
| 140 | + return Read3resok(file_attributes, count, eof, data) |
0 commit comments