From 18ef13b93aef852af533fdf01e281e1d3fa644ed Mon Sep 17 00:00:00 2001 From: JSCU-CNI <121175071+JSCU-CNI@users.noreply.github.com> Date: Mon, 11 May 2026 14:59:49 +0200 Subject: [PATCH] Remove Berkley DB RPM parser in favor of dissect.target implementation --- README.md | 1 - dissect/database/bsd/tools/__init__.py | 0 dissect/database/bsd/tools/c_rpm.py | 465 ------------------------- dissect/database/bsd/tools/c_rpm.pyi | 460 ------------------------ dissect/database/bsd/tools/rpm.py | 243 ------------- pyproject.toml | 1 - tests/_data/bsd/rpm/Packages.gz | 3 - tests/bsd/conftest.py | 5 - tests/bsd/test_rpm.py | 52 --- 9 files changed, 1230 deletions(-) delete mode 100644 dissect/database/bsd/tools/__init__.py delete mode 100644 dissect/database/bsd/tools/c_rpm.py delete mode 100644 dissect/database/bsd/tools/c_rpm.pyi delete mode 100644 dissect/database/bsd/tools/rpm.py delete mode 100644 tests/_data/bsd/rpm/Packages.gz delete mode 100644 tests/bsd/test_rpm.py diff --git a/README.md b/README.md index 5af021b..6b2e29c 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,6 @@ Some CLI tools related to specific databases exists. These tools allow you to du | `dissect-ual` | Windows [User Access Logging](https://learn.microsoft.com/en-us/windows-server/administration/user-access-logging/get-started-with-user-access-logging) database. | | `dissect-sru` | Windows System Resources And Usage Monitor database. | | `dissect-certlog` | Windows [AD CS database](https://learn.microsoft.com/en-us/windows-server/identity/ad-cs/active-directory-certificate-services-overview) database. | -| `dissect-rpm` | [Red Hat Package Manager](https://rpm.org/) database. | | `dissect-impacket` | Impacket compatibility shim for `secretsdump.py`. | ### Impacket compatibility shim for secretsdump.py diff --git a/dissect/database/bsd/tools/__init__.py b/dissect/database/bsd/tools/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dissect/database/bsd/tools/c_rpm.py b/dissect/database/bsd/tools/c_rpm.py deleted file mode 100644 index 4a10761..0000000 --- a/dissect/database/bsd/tools/c_rpm.py +++ /dev/null @@ -1,465 +0,0 @@ -from __future__ import annotations - -from dissect.cstruct import cstruct - -rpm_def = """ -typedef uint32 rpm_tag_t; -typedef uint32 rpm_tagtype_t; -typedef uint32 rpm_count_t; - -/** - * Header private tags. - * @note General use tags should start at 1000 (RPM's tag space starts there). - */ -#define HEADER_IMAGE 61 -#define HEADER_SIGNATURES 62 -#define HEADER_IMMUTABLE 63 -#define HEADER_REGIONS 64 -#define HEADER_I18NTABLE 100 -#define HEADER_SIGBASE 256 -#define HEADER_TAGBASE 1000 - -/** - * Tags identify data in package headers. - * @note tags should not have value 0! - * @note all new tags should be added above 5000 - */ -enum rpmTag { - RPMTAG_NOT_FOUND = -1, /*!< Unknown tag */ - - RPMTAG_HEADERIMAGE = HEADER_IMAGE, /*!< Current image. */ - RPMTAG_HEADERSIGNATURES = HEADER_SIGNATURES, /*!< Signatures. */ - RPMTAG_HEADERIMMUTABLE = HEADER_IMMUTABLE, /*!< Original image. */ - RPMTAG_HEADERREGIONS = HEADER_REGIONS, /*!< Regions. */ - - RPMTAG_HEADERI18NTABLE = HEADER_I18NTABLE, /* s[] !< I18N string locales. */ - - RPMTAG_SIG_BASE = HEADER_SIGBASE, - RPMTAG_SIGSIZE = RPMTAG_SIG_BASE+1, /* i */ - RPMTAG_SIGLEMD5_1 = RPMTAG_SIG_BASE+2, /* internal - obsolete */ - RPMTAG_SIGPGP = RPMTAG_SIG_BASE+3, /* x */ - RPMTAG_SIGLEMD5_2 = RPMTAG_SIG_BASE+4, /* x internal - obsolete */ - RPMTAG_SIGMD5 = RPMTAG_SIG_BASE+5, /* x */ - RPMTAG_PKGID = RPMTAG_SIGMD5, /* x */ - RPMTAG_SIGGPG = RPMTAG_SIG_BASE+6, /* x */ - RPMTAG_SIGPGP5 = RPMTAG_SIG_BASE+7, /* internal - obsolete */ - - RPMTAG_BADSHA1_1 = RPMTAG_SIG_BASE+8, /* internal - obsolete */ - RPMTAG_BADSHA1_2 = RPMTAG_SIG_BASE+9, /* internal - obsolete */ - RPMTAG_PUBKEYS = RPMTAG_SIG_BASE+10, /* s[] */ - RPMTAG_DSAHEADER = RPMTAG_SIG_BASE+11, /* x */ - RPMTAG_RSAHEADER = RPMTAG_SIG_BASE+12, /* x */ - RPMTAG_SHA1HEADER = RPMTAG_SIG_BASE+13, /* s */ - RPMTAG_HDRID = RPMTAG_SHA1HEADER, /* s */ - RPMTAG_LONGSIGSIZE = RPMTAG_SIG_BASE+14, /* l */ - RPMTAG_LONGARCHIVESIZE = RPMTAG_SIG_BASE+15, /* l */ - /* RPMTAG_SIG_BASE+16 reserved */ - RPMTAG_SHA256HEADER = RPMTAG_SIG_BASE+17, /* s */ - /* RPMTAG_SIG_BASE+18 reserved for RPMSIGTAG_FILESIGNATURES */ - /* RPMTAG_SIG_BASE+19 reserved for RPMSIGTAG_FILESIGNATURELENGTH */ - - RPMTAG_NAME = 1000, /* s */ - RPMTAG_N = RPMTAG_NAME, /* s */ - RPMTAG_VERSION = 1001, /* s */ - RPMTAG_V = RPMTAG_VERSION, /* s */ - RPMTAG_RELEASE = 1002, /* s */ - RPMTAG_R = RPMTAG_RELEASE, /* s */ - RPMTAG_EPOCH = 1003, /* i */ - RPMTAG_E = RPMTAG_EPOCH, /* i */ - RPMTAG_SUMMARY = 1004, /* s{} */ - RPMTAG_DESCRIPTION = 1005, /* s{} */ - RPMTAG_BUILDTIME = 1006, /* i */ - RPMTAG_BUILDHOST = 1007, /* s */ - RPMTAG_INSTALLTIME = 1008, /* i */ - RPMTAG_SIZE = 1009, /* i */ - RPMTAG_DISTRIBUTION = 1010, /* s */ - RPMTAG_VENDOR = 1011, /* s */ - RPMTAG_GIF = 1012, /* x */ - RPMTAG_XPM = 1013, /* x */ - RPMTAG_LICENSE = 1014, /* s */ - RPMTAG_PACKAGER = 1015, /* s */ - RPMTAG_GROUP = 1016, /* s{} */ - RPMTAG_CHANGELOG = 1017, /* s[] internal */ - RPMTAG_SOURCE = 1018, /* s[] */ - RPMTAG_PATCH = 1019, /* s[] */ - RPMTAG_URL = 1020, /* s */ - RPMTAG_OS = 1021, /* s legacy used int */ - RPMTAG_ARCH = 1022, /* s legacy used int */ - RPMTAG_PREIN = 1023, /* s */ - RPMTAG_POSTIN = 1024, /* s */ - RPMTAG_PREUN = 1025, /* s */ - RPMTAG_POSTUN = 1026, /* s */ - RPMTAG_OLDFILENAMES = 1027, /* s[] obsolete */ - RPMTAG_FILESIZES = 1028, /* i[] */ - RPMTAG_FILESTATES = 1029, /* c[] */ - RPMTAG_FILEMODES = 1030, /* h[] */ - RPMTAG_FILEUIDS = 1031, /* i[] internal - obsolete */ - RPMTAG_FILEGIDS = 1032, /* i[] internal - obsolete */ - RPMTAG_FILERDEVS = 1033, /* h[] */ - RPMTAG_FILEMTIMES = 1034, /* i[] */ - RPMTAG_FILEDIGESTS = 1035, /* s[] */ - RPMTAG_FILEMD5S = RPMTAG_FILEDIGESTS, /* s[] */ - RPMTAG_FILELINKTOS = 1036, /* s[] */ - RPMTAG_FILEFLAGS = 1037, /* i[] */ - RPMTAG_ROOT = 1038, /* internal - obsolete */ - RPMTAG_FILEUSERNAME = 1039, /* s[] */ - RPMTAG_FILEGROUPNAME = 1040, /* s[] */ - RPMTAG_EXCLUDE = 1041, /* internal - obsolete */ - RPMTAG_EXCLUSIVE = 1042, /* internal - obsolete */ - RPMTAG_ICON = 1043, /* x */ - RPMTAG_SOURCERPM = 1044, /* s */ - RPMTAG_FILEVERIFYFLAGS = 1045, /* i[] */ - RPMTAG_ARCHIVESIZE = 1046, /* i */ - RPMTAG_PROVIDENAME = 1047, /* s[] */ - RPMTAG_PROVIDES = RPMTAG_PROVIDENAME, /* s[] */ - RPMTAG_P = RPMTAG_PROVIDENAME, /* s[] */ - RPMTAG_REQUIREFLAGS = 1048, /* i[] */ - RPMTAG_REQUIRENAME = 1049, /* s[] */ - RPMTAG_REQUIRES = RPMTAG_REQUIRENAME, /* s[] */ - RPMTAG_REQUIREVERSION = 1050, /* s[] */ - RPMTAG_NOSOURCE = 1051, /* i[] */ - RPMTAG_NOPATCH = 1052, /* i[] */ - RPMTAG_CONFLICTFLAGS = 1053, /* i[] */ - RPMTAG_CONFLICTNAME = 1054, /* s[] */ - RPMTAG_CONFLICTS = RPMTAG_CONFLICTNAME, /* s[] */ - RPMTAG_C = RPMTAG_CONFLICTNAME, /* s[] */ - RPMTAG_CONFLICTVERSION = 1055, /* s[] */ - RPMTAG_DEFAULTPREFIX = 1056, /* s internal - deprecated */ - RPMTAG_BUILDROOT = 1057, /* s internal - obsolete */ - RPMTAG_INSTALLPREFIX = 1058, /* s internal - deprecated */ - RPMTAG_EXCLUDEARCH = 1059, /* s[] */ - RPMTAG_EXCLUDEOS = 1060, /* s[] */ - RPMTAG_EXCLUSIVEARCH = 1061, /* s[] */ - RPMTAG_EXCLUSIVEOS = 1062, /* s[] */ - RPMTAG_AUTOREQPROV = 1063, /* s internal */ - RPMTAG_RPMVERSION = 1064, /* s */ - RPMTAG_TRIGGERSCRIPTS = 1065, /* s[] */ - RPMTAG_TRIGGERNAME = 1066, /* s[] */ - RPMTAG_TRIGGERVERSION = 1067, /* s[] */ - RPMTAG_TRIGGERFLAGS = 1068, /* i[] */ - RPMTAG_TRIGGERINDEX = 1069, /* i[] */ - RPMTAG_VERIFYSCRIPT = 1079, /* s */ - RPMTAG_CHANGELOGTIME = 1080, /* i[] */ - RPMTAG_CHANGELOGNAME = 1081, /* s[] */ - RPMTAG_CHANGELOGTEXT = 1082, /* s[] */ - RPMTAG_BROKENMD5 = 1083, /* internal - obsolete */ - RPMTAG_PREREQ = 1084, /* internal */ - RPMTAG_PREINPROG = 1085, /* s[] */ - RPMTAG_POSTINPROG = 1086, /* s[] */ - RPMTAG_PREUNPROG = 1087, /* s[] */ - RPMTAG_POSTUNPROG = 1088, /* s[] */ - RPMTAG_BUILDARCHS = 1089, /* s[] */ - RPMTAG_OBSOLETENAME = 1090, /* s[] */ - RPMTAG_OBSOLETES = RPMTAG_OBSOLETENAME, /* s[] */ - RPMTAG_O = RPMTAG_OBSOLETENAME, /* s[] */ - RPMTAG_VERIFYSCRIPTPROG = 1091, /* s[] */ - RPMTAG_TRIGGERSCRIPTPROG = 1092, /* s[] */ - RPMTAG_DOCDIR = 1093, /* internal */ - RPMTAG_COOKIE = 1094, /* s */ - RPMTAG_FILEDEVICES = 1095, /* i[] */ - RPMTAG_FILEINODES = 1096, /* i[] */ - RPMTAG_FILELANGS = 1097, /* s[] */ - RPMTAG_PREFIXES = 1098, /* s[] */ - RPMTAG_INSTPREFIXES = 1099, /* s[] */ - RPMTAG_TRIGGERIN = 1100, /* internal */ - RPMTAG_TRIGGERUN = 1101, /* internal */ - RPMTAG_TRIGGERPOSTUN = 1102, /* internal */ - RPMTAG_AUTOREQ = 1103, /* internal */ - RPMTAG_AUTOPROV = 1104, /* internal */ - RPMTAG_CAPABILITY = 1105, /* i internal - obsolete */ - RPMTAG_SOURCEPACKAGE = 1106, /* i */ - RPMTAG_OLDORIGFILENAMES = 1107, /* internal - obsolete */ - RPMTAG_BUILDPREREQ = 1108, /* internal */ - RPMTAG_BUILDREQUIRES = 1109, /* internal */ - RPMTAG_BUILDCONFLICTS = 1110, /* internal */ - RPMTAG_BUILDMACROS = 1111, /* internal - unused */ - RPMTAG_PROVIDEFLAGS = 1112, /* i[] */ - RPMTAG_PROVIDEVERSION = 1113, /* s[] */ - RPMTAG_OBSOLETEFLAGS = 1114, /* i[] */ - RPMTAG_OBSOLETEVERSION = 1115, /* s[] */ - RPMTAG_DIRINDEXES = 1116, /* i[] */ - RPMTAG_BASENAMES = 1117, /* s[] */ - RPMTAG_DIRNAMES = 1118, /* s[] */ - RPMTAG_ORIGDIRINDEXES = 1119, /* i[] relocation */ - RPMTAG_ORIGBASENAMES = 1120, /* s[] relocation */ - RPMTAG_ORIGDIRNAMES = 1121, /* s[] relocation */ - RPMTAG_OPTFLAGS = 1122, /* s */ - RPMTAG_DISTURL = 1123, /* s */ - RPMTAG_PAYLOADFORMAT = 1124, /* s */ - RPMTAG_PAYLOADCOMPRESSOR = 1125, /* s */ - RPMTAG_PAYLOADFLAGS = 1126, /* s */ - RPMTAG_INSTALLCOLOR = 1127, /* i transaction color when installed */ - RPMTAG_INSTALLTID = 1128, /* i */ - RPMTAG_REMOVETID = 1129, /* i */ - RPMTAG_SHA1RHN = 1130, /* internal - obsolete */ - RPMTAG_RHNPLATFORM = 1131, /* s internal - obsolete */ - RPMTAG_PLATFORM = 1132, /* s */ - RPMTAG_PATCHESNAME = 1133, /* s[] deprecated placeholder (SuSE) */ - RPMTAG_PATCHESFLAGS = 1134, /* i[] deprecated placeholder (SuSE) */ - RPMTAG_PATCHESVERSION = 1135, /* s[] deprecated placeholder (SuSE) */ - RPMTAG_CACHECTIME = 1136, /* i internal - obsolete */ - RPMTAG_CACHEPKGPATH = 1137, /* s internal - obsolete */ - RPMTAG_CACHEPKGSIZE = 1138, /* i internal - obsolete */ - RPMTAG_CACHEPKGMTIME = 1139, /* i internal - obsolete */ - RPMTAG_FILECOLORS = 1140, /* i[] */ - RPMTAG_FILECLASS = 1141, /* i[] */ - RPMTAG_CLASSDICT = 1142, /* s[] */ - RPMTAG_FILEDEPENDSX = 1143, /* i[] */ - RPMTAG_FILEDEPENDSN = 1144, /* i[] */ - RPMTAG_DEPENDSDICT = 1145, /* i[] */ - RPMTAG_SOURCEPKGID = 1146, /* x */ - RPMTAG_FILECONTEXTS = 1147, /* s[] - obsolete */ - RPMTAG_FSCONTEXTS = 1148, /* s[] extension */ - RPMTAG_RECONTEXTS = 1149, /* s[] extension */ - RPMTAG_POLICIES = 1150, /* s[] selinux *.te policy file. */ - RPMTAG_PRETRANS = 1151, /* s */ - RPMTAG_POSTTRANS = 1152, /* s */ - RPMTAG_PRETRANSPROG = 1153, /* s[] */ - RPMTAG_POSTTRANSPROG = 1154, /* s[] */ - RPMTAG_DISTTAG = 1155, /* s */ - RPMTAG_OLDSUGGESTSNAME = 1156, /* s[] - obsolete */ - RPMTAG_OLDSUGGESTS = RPMTAG_OLDSUGGESTSNAME, /* s[] - obsolete */ - RPMTAG_OLDSUGGESTSVERSION = 1157, /* s[] - obsolete */ - RPMTAG_OLDSUGGESTSFLAGS = 1158, /* i[] - obsolete */ - RPMTAG_OLDENHANCESNAME = 1159, /* s[] - obsolete */ - RPMTAG_OLDENHANCES = RPMTAG_OLDENHANCESNAME, /* s[] - obsolete */ - RPMTAG_OLDENHANCESVERSION = 1160, /* s[] - obsolete */ - RPMTAG_OLDENHANCESFLAGS = 1161, /* i[] - obsolete */ - RPMTAG_PRIORITY = 1162, /* i[] extension placeholder (unimplemented) */ - RPMTAG_CVSID = 1163, /* s (unimplemented) */ - RPMTAG_SVNID = RPMTAG_CVSID, /* s (unimplemented) */ - RPMTAG_BLINKPKGID = 1164, /* s[] (unimplemented) */ - RPMTAG_BLINKHDRID = 1165, /* s[] (unimplemented) */ - RPMTAG_BLINKNEVRA = 1166, /* s[] (unimplemented) */ - RPMTAG_FLINKPKGID = 1167, /* s[] (unimplemented) */ - RPMTAG_FLINKHDRID = 1168, /* s[] (unimplemented) */ - RPMTAG_FLINKNEVRA = 1169, /* s[] (unimplemented) */ - RPMTAG_PACKAGEORIGIN = 1170, /* s (unimplemented) */ - RPMTAG_TRIGGERPREIN = 1171, /* internal */ - RPMTAG_BUILDSUGGESTS = 1172, /* internal (unimplemented) */ - RPMTAG_BUILDENHANCES = 1173, /* internal (unimplemented) */ - RPMTAG_SCRIPTSTATES = 1174, /* i[] scriptlet exit codes (unimplemented) */ - RPMTAG_SCRIPTMETRICS = 1175, /* i[] scriptlet execution times (unimplemented) */ - RPMTAG_BUILDCPUCLOCK = 1176, /* i (unimplemented) */ - RPMTAG_FILEDIGESTALGOS = 1177, /* i[] (unimplemented) */ - RPMTAG_VARIANTS = 1178, /* s[] (unimplemented) */ - RPMTAG_XMAJOR = 1179, /* i (unimplemented) */ - RPMTAG_XMINOR = 1180, /* i (unimplemented) */ - RPMTAG_REPOTAG = 1181, /* s (unimplemented) */ - RPMTAG_KEYWORDS = 1182, /* s[] (unimplemented) */ - RPMTAG_BUILDPLATFORMS = 1183, /* s[] (unimplemented) */ - RPMTAG_PACKAGECOLOR = 1184, /* i (unimplemented) */ - RPMTAG_PACKAGEPREFCOLOR = 1185, /* i (unimplemented) */ - RPMTAG_XATTRSDICT = 1186, /* s[] (unimplemented) */ - RPMTAG_FILEXATTRSX = 1187, /* i[] (unimplemented) */ - RPMTAG_DEPATTRSDICT = 1188, /* s[] (unimplemented) */ - RPMTAG_CONFLICTATTRSX = 1189, /* i[] (unimplemented) */ - RPMTAG_OBSOLETEATTRSX = 1190, /* i[] (unimplemented) */ - RPMTAG_PROVIDEATTRSX = 1191, /* i[] (unimplemented) */ - RPMTAG_REQUIREATTRSX = 1192, /* i[] (unimplemented) */ - RPMTAG_BUILDPROVIDES = 1193, /* internal (unimplemented) */ - RPMTAG_BUILDOBSOLETES = 1194, /* internal (unimplemented) */ - RPMTAG_DBINSTANCE = 1195, /* i extension */ - RPMTAG_NVRA = 1196, /* s extension */ - - /* tags 1997-4999 reserved */ - RPMTAG_FILENAMES = 5000, /* s[] extension */ - RPMTAG_FILEPROVIDE = 5001, /* s[] extension */ - RPMTAG_FILEREQUIRE = 5002, /* s[] extension */ - RPMTAG_FSNAMES = 5003, /* s[] (unimplemented) */ - RPMTAG_FSSIZES = 5004, /* l[] (unimplemented) */ - RPMTAG_TRIGGERCONDS = 5005, /* s[] extension */ - RPMTAG_TRIGGERTYPE = 5006, /* s[] extension */ - RPMTAG_ORIGFILENAMES = 5007, /* s[] extension */ - RPMTAG_LONGFILESIZES = 5008, /* l[] */ - RPMTAG_LONGSIZE = 5009, /* l */ - RPMTAG_FILECAPS = 5010, /* s[] */ - RPMTAG_FILEDIGESTALGO = 5011, /* i file digest algorithm */ - RPMTAG_BUGURL = 5012, /* s */ - RPMTAG_EVR = 5013, /* s extension */ - RPMTAG_NVR = 5014, /* s extension */ - RPMTAG_NEVR = 5015, /* s extension */ - RPMTAG_NEVRA = 5016, /* s extension */ - RPMTAG_HEADERCOLOR = 5017, /* i extension */ - RPMTAG_VERBOSE = 5018, /* i extension */ - RPMTAG_EPOCHNUM = 5019, /* i extension */ - RPMTAG_PREINFLAGS = 5020, /* i */ - RPMTAG_POSTINFLAGS = 5021, /* i */ - RPMTAG_PREUNFLAGS = 5022, /* i */ - RPMTAG_POSTUNFLAGS = 5023, /* i */ - RPMTAG_PRETRANSFLAGS = 5024, /* i */ - RPMTAG_POSTTRANSFLAGS = 5025, /* i */ - RPMTAG_VERIFYSCRIPTFLAGS = 5026, /* i */ - RPMTAG_TRIGGERSCRIPTFLAGS = 5027, /* i[] */ - RPMTAG_COLLECTIONS = 5029, /* s[] list of collections (unimplemented) */ - RPMTAG_POLICYNAMES = 5030, /* s[] */ - RPMTAG_POLICYTYPES = 5031, /* s[] */ - RPMTAG_POLICYTYPESINDEXES = 5032, /* i[] */ - RPMTAG_POLICYFLAGS = 5033, /* i[] */ - RPMTAG_VCS = 5034, /* s */ - RPMTAG_ORDERNAME = 5035, /* s[] */ - RPMTAG_ORDERVERSION = 5036, /* s[] */ - RPMTAG_ORDERFLAGS = 5037, /* i[] */ - RPMTAG_MSSFMANIFEST = 5038, /* s[] reservation (unimplemented) */ - RPMTAG_MSSFDOMAIN = 5039, /* s[] reservation (unimplemented) */ - RPMTAG_INSTFILENAMES = 5040, /* s[] extension */ - RPMTAG_REQUIRENEVRS = 5041, /* s[] extension */ - RPMTAG_PROVIDENEVRS = 5042, /* s[] extension */ - RPMTAG_OBSOLETENEVRS = 5043, /* s[] extension */ - RPMTAG_CONFLICTNEVRS = 5044, /* s[] extension */ - RPMTAG_FILENLINKS = 5045, /* i[] extension */ - RPMTAG_RECOMMENDNAME = 5046, /* s[] */ - RPMTAG_RECOMMENDS = RPMTAG_RECOMMENDNAME, /* s[] */ - RPMTAG_RECOMMENDVERSION = 5047, /* s[] */ - RPMTAG_RECOMMENDFLAGS = 5048, /* i[] */ - RPMTAG_SUGGESTNAME = 5049, /* s[] */ - RPMTAG_SUGGESTS = RPMTAG_SUGGESTNAME, /* s[] */ - RPMTAG_SUGGESTVERSION = 5050, /* s[] extension */ - RPMTAG_SUGGESTFLAGS = 5051, /* i[] extension */ - RPMTAG_SUPPLEMENTNAME = 5052, /* s[] */ - RPMTAG_SUPPLEMENTS = RPMTAG_SUPPLEMENTNAME, /* s[] */ - RPMTAG_SUPPLEMENTVERSION = 5053, /* s[] */ - RPMTAG_SUPPLEMENTFLAGS = 5054, /* i[] */ - RPMTAG_ENHANCENAME = 5055, /* s[] */ - RPMTAG_ENHANCES = RPMTAG_ENHANCENAME, /* s[] */ - RPMTAG_ENHANCEVERSION = 5056, /* s[] */ - RPMTAG_ENHANCEFLAGS = 5057, /* i[] */ - RPMTAG_RECOMMENDNEVRS = 5058, /* s[] extension */ - RPMTAG_SUGGESTNEVRS = 5059, /* s[] extension */ - RPMTAG_SUPPLEMENTNEVRS = 5060, /* s[] extension */ - RPMTAG_ENHANCENEVRS = 5061, /* s[] extension */ - RPMTAG_ENCODING = 5062, /* s */ - RPMTAG_FILETRIGGERIN = 5063, /* internal */ - RPMTAG_FILETRIGGERUN = 5064, /* internal */ - RPMTAG_FILETRIGGERPOSTUN = 5065, /* internal */ - RPMTAG_FILETRIGGERSCRIPTS = 5066, /* s[] */ - RPMTAG_FILETRIGGERSCRIPTPROG = 5067, /* s[] */ - RPMTAG_FILETRIGGERSCRIPTFLAGS = 5068, /* i[] */ - RPMTAG_FILETRIGGERNAME = 5069, /* s[] */ - RPMTAG_FILETRIGGERINDEX = 5070, /* i[] */ - RPMTAG_FILETRIGGERVERSION = 5071, /* s[] */ - RPMTAG_FILETRIGGERFLAGS = 5072, /* i[] */ - RPMTAG_TRANSFILETRIGGERIN = 5073, /* internal */ - RPMTAG_TRANSFILETRIGGERUN = 5074, /* internal */ - RPMTAG_TRANSFILETRIGGERPOSTUN = 5075, /* internal */ - RPMTAG_TRANSFILETRIGGERSCRIPTS = 5076, /* s[] */ - RPMTAG_TRANSFILETRIGGERSCRIPTPROG = 5077, /* s[] */ - RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS = 5078, /* i[] */ - RPMTAG_TRANSFILETRIGGERNAME = 5079, /* s[] */ - RPMTAG_TRANSFILETRIGGERINDEX = 5080, /* i[] */ - RPMTAG_TRANSFILETRIGGERVERSION = 5081, /* s[] */ - RPMTAG_TRANSFILETRIGGERFLAGS = 5082, /* i[] */ - RPMTAG_REMOVEPATHPOSTFIXES = 5083, /* s internal */ - RPMTAG_FILETRIGGERPRIORITIES = 5084, /* i[] */ - RPMTAG_TRANSFILETRIGGERPRIORITIES = 5085, /* i[] */ - RPMTAG_FILETRIGGERCONDS = 5086, /* s[] extension */ - RPMTAG_FILETRIGGERTYPE = 5087, /* s[] extension */ - RPMTAG_TRANSFILETRIGGERCONDS = 5088, /* s[] extension */ - RPMTAG_TRANSFILETRIGGERTYPE = 5089, /* s[] extension */ - RPMTAG_FILESIGNATURES = 5090, /* s[] */ - RPMTAG_FILESIGNATURELENGTH = 5091, /* i */ - RPMTAG_PAYLOADDIGEST = 5092, /* s[] */ - RPMTAG_PAYLOADDIGESTALGO = 5093, /* i */ - RPMTAG_AUTOINSTALLED = 5094, /* i reservation (unimplemented) */ - RPMTAG_IDENTITY = 5095, /* s reservation (unimplemented) */ - RPMTAG_MODULARITYLABEL = 5096, /* s */ - RPMTAG_PAYLOADDIGESTALT = 5097, /* s[] */ - - RPMTAG_FIRSTFREE_TAG, /*!< internal */ - RPMTAG_EXTERNAL_TAG = 1000000, -}; - -/** - * Rpm database index tags. - */ -enum rpmDbiTag { - RPMDBI_PACKAGES = 0, /* Installed package headers. */ - RPMDBI_LABEL = 2, /* NEVRA label pseudo index */ - RPMDBI_NAME = 1000, /* RPMTAG_NAME */ - RPMDBI_BASENAMES = 1117, /* RPMTAG_BASENAMES */ - RPMDBI_GROUP = 1016, /* RPMTAG_GROUP */ - RPMDBI_REQUIRENAME = 1049, /* RPMTAG_REQUIRENAME */ - RPMDBI_PROVIDENAME = 1047, /* RPMTAG_PROVIDENAME */ - RPMDBI_CONFLICTNAME = 1054, /* RPMTAG_CONFLICTNAME */ - RPMDBI_OBSOLETENAME = 1090, /* RPMTAG_OBSOLETENAME */ - RPMDBI_TRIGGERNAME = 1066, /* RPMTAG_TRIGGERNAME */ - RPMDBI_DIRNAMES = 1118, /* RPMTAG_DIRNAMES */ - RPMDBI_INSTALLTID = 1128, /* RPMTAG_INSTALLTID */ - RPMDBI_SIGMD5 = HEADER_SIGBASE+5, /* RPMTAG_SIGMD5 */ - RPMDBI_SHA1HEADER = HEADER_SIGBASE+13, /* RPMTAG_SHA1HEADER */ - RPMDBI_INSTFILENAMES = 5040, /* RPMTAG_INSTFILENAMES */ - RPMDBI_FILETRIGGERNAME = 5069, /* RPMTAG_FILETRIGGERNAME */ - RPMDBI_TRANSFILETRIGGERNAME = 5079, /* RPMTAG_TRANSFILETRIGGERNAME */ - RPMDBI_RECOMMENDNAME = 5046, /* RPMTAG_RECOMMENDNAME */ - RPMDBI_SUGGESTNAME = 5049, /* RPMTAG_SUGGESTNAME */ - RPMDBI_SUPPLEMENTNAME = 5052, /* RPMTAG_SUPPLEMENTNAME */ - RPMDBI_ENHANCENAME = 5055, /* RPMTAG_ENHANCENAME */ -}; - -/** - * Tags found in signature header from package. - */ -enum rpmSigTag { - RPMSIGTAG_SIZE = 1000, /*!< internal Header+Payload size (32bit) in bytes. */ - RPMSIGTAG_LEMD5_1 = 1001, /*!< internal Broken MD5, take 1 @deprecated legacy. */ - RPMSIGTAG_PGP = 1002, /*!< internal PGP 2.6.3 signature. */ - RPMSIGTAG_LEMD5_2 = 1003, /*!< internal Broken MD5, take 2 @deprecated legacy. */ - RPMSIGTAG_MD5 = 1004, /*!< internal MD5 signature. */ - RPMSIGTAG_GPG = 1005, /*!< internal GnuPG signature. */ - RPMSIGTAG_PGP5 = 1006, /*!< internal PGP5 signature @deprecated legacy. */ - RPMSIGTAG_PAYLOADSIZE = 1007, /*!< internal uncompressed payload size (32bit) in bytes. */ - RPMSIGTAG_RESERVEDSPACE = 1008, /*!< internal space reserved for signatures */ - RPMSIGTAG_BADSHA1_1 = HEADER_SIGBASE+8, /*!< internal Broken SHA1, take 1. // RPMTAG_BADSHA1_1 */ - RPMSIGTAG_BADSHA1_2 = HEADER_SIGBASE+9, /*!< internal Broken SHA1, take 2. // RPMTAG_BADSHA1_2 */ - RPMSIGTAG_DSA = HEADER_SIGBASE+11, /*!< internal DSA header signature. // RPMTAG_DSAHEADER */ - RPMSIGTAG_RSA = HEADER_SIGBASE+12, /*!< internal RSA header signature. // RPMTAG_RSAHEADER */ - RPMSIGTAG_SHA1 = HEADER_SIGBASE+13, /*!< internal sha1 header digest. // RPMTAG_SHA1HEADER */ - RPMSIGTAG_LONGSIZE = HEADER_SIGBASE+14, /*!< internal Header+Payload size (64bit) in bytes. // RPMTAG_LONGSIGSIZE */ - RPMSIGTAG_LONGARCHIVESIZE = HEADER_SIGBASE+15, /*!< internal uncompressed payload size (64bit) in bytes. // RPMTAG_LONGARCHIVESIZE */ - RPMSIGTAG_SHA256 = HEADER_SIGBASE+17, /* RPMTAG_SHA256HEADER */ - RPMSIGTAG_FILESIGNATURES = HEADER_SIGBASE + 18, - RPMSIGTAG_FILESIGNATURELENGTH = HEADER_SIGBASE + 19, -}; - -/** - * The basic types of data in tags from headers. - */ -enum rpmTagType { - RPM_NULL_TYPE = 0, - RPM_CHAR_TYPE = 1, - RPM_INT8_TYPE = 2, - RPM_INT16_TYPE = 3, - RPM_INT32_TYPE = 4, - RPM_INT64_TYPE = 5, - RPM_STRING_TYPE = 6, - RPM_BIN_TYPE = 7, - RPM_STRING_ARRAY_TYPE = 8, - RPM_I18NSTRING_TYPE = 9, -}; - -/** - * The classes of data in tags from headers. - */ -enum rpmTagClass { - RPM_NULL_CLASS = 0, - RPM_NUMERIC_CLASS = 1, - RPM_STRING_CLASS = 2, - RPM_BINARY_CLASS = 3, -}; - -struct entryInfo { - rpm_tag_t tag; /*!< Tag identifier. */ - rpm_tagtype_t type; /*!< Tag data type. */ - int32_t offset; /*!< Offset into data segment (ondisk only). */ - rpm_count_t count; /*!< Number of tag elements. */ -}; - -#define REGION_TAG_TYPE 7 - -struct header_intro { - uint32_t index_length; - uint32_t data_length; - entryInfo entries[index_length]; -}; -""" # noqa: E501 -c_rpm = cstruct(endian=">").load(rpm_def) diff --git a/dissect/database/bsd/tools/c_rpm.pyi b/dissect/database/bsd/tools/c_rpm.pyi deleted file mode 100644 index f888f08..0000000 --- a/dissect/database/bsd/tools/c_rpm.pyi +++ /dev/null @@ -1,460 +0,0 @@ -# Generated by cstruct-stubgen -from typing import BinaryIO, Literal, TypeAlias, overload - -import dissect.cstruct as __cs__ - -class _c_rpm(__cs__.cstruct): - HEADER_IMAGE: Literal[61] = ... - HEADER_SIGNATURES: Literal[62] = ... - HEADER_IMMUTABLE: Literal[63] = ... - HEADER_REGIONS: Literal[64] = ... - HEADER_I18NTABLE: Literal[100] = ... - HEADER_SIGBASE: Literal[256] = ... - HEADER_TAGBASE: Literal[1000] = ... - REGION_TAG_TYPE: Literal[7] = ... - rpm_tag_t: TypeAlias = _c_rpm.uint32 - rpm_tagtype_t: TypeAlias = _c_rpm.uint32 - rpm_count_t: TypeAlias = _c_rpm.uint32 - class rpmTag(__cs__.Enum): - RPMTAG_NOT_FOUND = ... - RPMTAG_HEADERIMAGE = ... - RPMTAG_HEADERSIGNATURES = ... - RPMTAG_HEADERIMMUTABLE = ... - RPMTAG_HEADERREGIONS = ... - RPMTAG_HEADERI18NTABLE = ... - RPMTAG_SIG_BASE = ... - RPMTAG_SIGSIZE = ... - RPMTAG_SIGLEMD5_1 = ... - RPMTAG_SIGPGP = ... - RPMTAG_SIGLEMD5_2 = ... - RPMTAG_SIGMD5 = ... - RPMTAG_PKGID = ... - RPMTAG_SIGGPG = ... - RPMTAG_SIGPGP5 = ... - RPMTAG_BADSHA1_1 = ... - RPMTAG_BADSHA1_2 = ... - RPMTAG_PUBKEYS = ... - RPMTAG_DSAHEADER = ... - RPMTAG_RSAHEADER = ... - RPMTAG_SHA1HEADER = ... - RPMTAG_HDRID = ... - RPMTAG_LONGSIGSIZE = ... - RPMTAG_LONGARCHIVESIZE = ... - RPMTAG_SHA256HEADER = ... - RPMTAG_NAME = ... - RPMTAG_N = ... - RPMTAG_VERSION = ... - RPMTAG_V = ... - RPMTAG_RELEASE = ... - RPMTAG_R = ... - RPMTAG_EPOCH = ... - RPMTAG_E = ... - RPMTAG_SUMMARY = ... - RPMTAG_DESCRIPTION = ... - RPMTAG_BUILDTIME = ... - RPMTAG_BUILDHOST = ... - RPMTAG_INSTALLTIME = ... - RPMTAG_SIZE = ... - RPMTAG_DISTRIBUTION = ... - RPMTAG_VENDOR = ... - RPMTAG_GIF = ... - RPMTAG_XPM = ... - RPMTAG_LICENSE = ... - RPMTAG_PACKAGER = ... - RPMTAG_GROUP = ... - RPMTAG_CHANGELOG = ... - RPMTAG_SOURCE = ... - RPMTAG_PATCH = ... - RPMTAG_URL = ... - RPMTAG_OS = ... - RPMTAG_ARCH = ... - RPMTAG_PREIN = ... - RPMTAG_POSTIN = ... - RPMTAG_PREUN = ... - RPMTAG_POSTUN = ... - RPMTAG_OLDFILENAMES = ... - RPMTAG_FILESIZES = ... - RPMTAG_FILESTATES = ... - RPMTAG_FILEMODES = ... - RPMTAG_FILEUIDS = ... - RPMTAG_FILEGIDS = ... - RPMTAG_FILERDEVS = ... - RPMTAG_FILEMTIMES = ... - RPMTAG_FILEDIGESTS = ... - RPMTAG_FILEMD5S = ... - RPMTAG_FILELINKTOS = ... - RPMTAG_FILEFLAGS = ... - RPMTAG_ROOT = ... - RPMTAG_FILEUSERNAME = ... - RPMTAG_FILEGROUPNAME = ... - RPMTAG_EXCLUDE = ... - RPMTAG_EXCLUSIVE = ... - RPMTAG_ICON = ... - RPMTAG_SOURCERPM = ... - RPMTAG_FILEVERIFYFLAGS = ... - RPMTAG_ARCHIVESIZE = ... - RPMTAG_PROVIDENAME = ... - RPMTAG_PROVIDES = ... - RPMTAG_P = ... - RPMTAG_REQUIREFLAGS = ... - RPMTAG_REQUIRENAME = ... - RPMTAG_REQUIRES = ... - RPMTAG_REQUIREVERSION = ... - RPMTAG_NOSOURCE = ... - RPMTAG_NOPATCH = ... - RPMTAG_CONFLICTFLAGS = ... - RPMTAG_CONFLICTNAME = ... - RPMTAG_CONFLICTS = ... - RPMTAG_C = ... - RPMTAG_CONFLICTVERSION = ... - RPMTAG_DEFAULTPREFIX = ... - RPMTAG_BUILDROOT = ... - RPMTAG_INSTALLPREFIX = ... - RPMTAG_EXCLUDEARCH = ... - RPMTAG_EXCLUDEOS = ... - RPMTAG_EXCLUSIVEARCH = ... - RPMTAG_EXCLUSIVEOS = ... - RPMTAG_AUTOREQPROV = ... - RPMTAG_RPMVERSION = ... - RPMTAG_TRIGGERSCRIPTS = ... - RPMTAG_TRIGGERNAME = ... - RPMTAG_TRIGGERVERSION = ... - RPMTAG_TRIGGERFLAGS = ... - RPMTAG_TRIGGERINDEX = ... - RPMTAG_VERIFYSCRIPT = ... - RPMTAG_CHANGELOGTIME = ... - RPMTAG_CHANGELOGNAME = ... - RPMTAG_CHANGELOGTEXT = ... - RPMTAG_BROKENMD5 = ... - RPMTAG_PREREQ = ... - RPMTAG_PREINPROG = ... - RPMTAG_POSTINPROG = ... - RPMTAG_PREUNPROG = ... - RPMTAG_POSTUNPROG = ... - RPMTAG_BUILDARCHS = ... - RPMTAG_OBSOLETENAME = ... - RPMTAG_OBSOLETES = ... - RPMTAG_O = ... - RPMTAG_VERIFYSCRIPTPROG = ... - RPMTAG_TRIGGERSCRIPTPROG = ... - RPMTAG_DOCDIR = ... - RPMTAG_COOKIE = ... - RPMTAG_FILEDEVICES = ... - RPMTAG_FILEINODES = ... - RPMTAG_FILELANGS = ... - RPMTAG_PREFIXES = ... - RPMTAG_INSTPREFIXES = ... - RPMTAG_TRIGGERIN = ... - RPMTAG_TRIGGERUN = ... - RPMTAG_TRIGGERPOSTUN = ... - RPMTAG_AUTOREQ = ... - RPMTAG_AUTOPROV = ... - RPMTAG_CAPABILITY = ... - RPMTAG_SOURCEPACKAGE = ... - RPMTAG_OLDORIGFILENAMES = ... - RPMTAG_BUILDPREREQ = ... - RPMTAG_BUILDREQUIRES = ... - RPMTAG_BUILDCONFLICTS = ... - RPMTAG_BUILDMACROS = ... - RPMTAG_PROVIDEFLAGS = ... - RPMTAG_PROVIDEVERSION = ... - RPMTAG_OBSOLETEFLAGS = ... - RPMTAG_OBSOLETEVERSION = ... - RPMTAG_DIRINDEXES = ... - RPMTAG_BASENAMES = ... - RPMTAG_DIRNAMES = ... - RPMTAG_ORIGDIRINDEXES = ... - RPMTAG_ORIGBASENAMES = ... - RPMTAG_ORIGDIRNAMES = ... - RPMTAG_OPTFLAGS = ... - RPMTAG_DISTURL = ... - RPMTAG_PAYLOADFORMAT = ... - RPMTAG_PAYLOADCOMPRESSOR = ... - RPMTAG_PAYLOADFLAGS = ... - RPMTAG_INSTALLCOLOR = ... - RPMTAG_INSTALLTID = ... - RPMTAG_REMOVETID = ... - RPMTAG_SHA1RHN = ... - RPMTAG_RHNPLATFORM = ... - RPMTAG_PLATFORM = ... - RPMTAG_PATCHESNAME = ... - RPMTAG_PATCHESFLAGS = ... - RPMTAG_PATCHESVERSION = ... - RPMTAG_CACHECTIME = ... - RPMTAG_CACHEPKGPATH = ... - RPMTAG_CACHEPKGSIZE = ... - RPMTAG_CACHEPKGMTIME = ... - RPMTAG_FILECOLORS = ... - RPMTAG_FILECLASS = ... - RPMTAG_CLASSDICT = ... - RPMTAG_FILEDEPENDSX = ... - RPMTAG_FILEDEPENDSN = ... - RPMTAG_DEPENDSDICT = ... - RPMTAG_SOURCEPKGID = ... - RPMTAG_FILECONTEXTS = ... - RPMTAG_FSCONTEXTS = ... - RPMTAG_RECONTEXTS = ... - RPMTAG_POLICIES = ... - RPMTAG_PRETRANS = ... - RPMTAG_POSTTRANS = ... - RPMTAG_PRETRANSPROG = ... - RPMTAG_POSTTRANSPROG = ... - RPMTAG_DISTTAG = ... - RPMTAG_OLDSUGGESTSNAME = ... - RPMTAG_OLDSUGGESTS = ... - RPMTAG_OLDSUGGESTSVERSION = ... - RPMTAG_OLDSUGGESTSFLAGS = ... - RPMTAG_OLDENHANCESNAME = ... - RPMTAG_OLDENHANCES = ... - RPMTAG_OLDENHANCESVERSION = ... - RPMTAG_OLDENHANCESFLAGS = ... - RPMTAG_PRIORITY = ... - RPMTAG_CVSID = ... - RPMTAG_SVNID = ... - RPMTAG_BLINKPKGID = ... - RPMTAG_BLINKHDRID = ... - RPMTAG_BLINKNEVRA = ... - RPMTAG_FLINKPKGID = ... - RPMTAG_FLINKHDRID = ... - RPMTAG_FLINKNEVRA = ... - RPMTAG_PACKAGEORIGIN = ... - RPMTAG_TRIGGERPREIN = ... - RPMTAG_BUILDSUGGESTS = ... - RPMTAG_BUILDENHANCES = ... - RPMTAG_SCRIPTSTATES = ... - RPMTAG_SCRIPTMETRICS = ... - RPMTAG_BUILDCPUCLOCK = ... - RPMTAG_FILEDIGESTALGOS = ... - RPMTAG_VARIANTS = ... - RPMTAG_XMAJOR = ... - RPMTAG_XMINOR = ... - RPMTAG_REPOTAG = ... - RPMTAG_KEYWORDS = ... - RPMTAG_BUILDPLATFORMS = ... - RPMTAG_PACKAGECOLOR = ... - RPMTAG_PACKAGEPREFCOLOR = ... - RPMTAG_XATTRSDICT = ... - RPMTAG_FILEXATTRSX = ... - RPMTAG_DEPATTRSDICT = ... - RPMTAG_CONFLICTATTRSX = ... - RPMTAG_OBSOLETEATTRSX = ... - RPMTAG_PROVIDEATTRSX = ... - RPMTAG_REQUIREATTRSX = ... - RPMTAG_BUILDPROVIDES = ... - RPMTAG_BUILDOBSOLETES = ... - RPMTAG_DBINSTANCE = ... - RPMTAG_NVRA = ... - RPMTAG_FILENAMES = ... - RPMTAG_FILEPROVIDE = ... - RPMTAG_FILEREQUIRE = ... - RPMTAG_FSNAMES = ... - RPMTAG_FSSIZES = ... - RPMTAG_TRIGGERCONDS = ... - RPMTAG_TRIGGERTYPE = ... - RPMTAG_ORIGFILENAMES = ... - RPMTAG_LONGFILESIZES = ... - RPMTAG_LONGSIZE = ... - RPMTAG_FILECAPS = ... - RPMTAG_FILEDIGESTALGO = ... - RPMTAG_BUGURL = ... - RPMTAG_EVR = ... - RPMTAG_NVR = ... - RPMTAG_NEVR = ... - RPMTAG_NEVRA = ... - RPMTAG_HEADERCOLOR = ... - RPMTAG_VERBOSE = ... - RPMTAG_EPOCHNUM = ... - RPMTAG_PREINFLAGS = ... - RPMTAG_POSTINFLAGS = ... - RPMTAG_PREUNFLAGS = ... - RPMTAG_POSTUNFLAGS = ... - RPMTAG_PRETRANSFLAGS = ... - RPMTAG_POSTTRANSFLAGS = ... - RPMTAG_VERIFYSCRIPTFLAGS = ... - RPMTAG_TRIGGERSCRIPTFLAGS = ... - RPMTAG_COLLECTIONS = ... - RPMTAG_POLICYNAMES = ... - RPMTAG_POLICYTYPES = ... - RPMTAG_POLICYTYPESINDEXES = ... - RPMTAG_POLICYFLAGS = ... - RPMTAG_VCS = ... - RPMTAG_ORDERNAME = ... - RPMTAG_ORDERVERSION = ... - RPMTAG_ORDERFLAGS = ... - RPMTAG_MSSFMANIFEST = ... - RPMTAG_MSSFDOMAIN = ... - RPMTAG_INSTFILENAMES = ... - RPMTAG_REQUIRENEVRS = ... - RPMTAG_PROVIDENEVRS = ... - RPMTAG_OBSOLETENEVRS = ... - RPMTAG_CONFLICTNEVRS = ... - RPMTAG_FILENLINKS = ... - RPMTAG_RECOMMENDNAME = ... - RPMTAG_RECOMMENDS = ... - RPMTAG_RECOMMENDVERSION = ... - RPMTAG_RECOMMENDFLAGS = ... - RPMTAG_SUGGESTNAME = ... - RPMTAG_SUGGESTS = ... - RPMTAG_SUGGESTVERSION = ... - RPMTAG_SUGGESTFLAGS = ... - RPMTAG_SUPPLEMENTNAME = ... - RPMTAG_SUPPLEMENTS = ... - RPMTAG_SUPPLEMENTVERSION = ... - RPMTAG_SUPPLEMENTFLAGS = ... - RPMTAG_ENHANCENAME = ... - RPMTAG_ENHANCES = ... - RPMTAG_ENHANCEVERSION = ... - RPMTAG_ENHANCEFLAGS = ... - RPMTAG_RECOMMENDNEVRS = ... - RPMTAG_SUGGESTNEVRS = ... - RPMTAG_SUPPLEMENTNEVRS = ... - RPMTAG_ENHANCENEVRS = ... - RPMTAG_ENCODING = ... - RPMTAG_FILETRIGGERIN = ... - RPMTAG_FILETRIGGERUN = ... - RPMTAG_FILETRIGGERPOSTUN = ... - RPMTAG_FILETRIGGERSCRIPTS = ... - RPMTAG_FILETRIGGERSCRIPTPROG = ... - RPMTAG_FILETRIGGERSCRIPTFLAGS = ... - RPMTAG_FILETRIGGERNAME = ... - RPMTAG_FILETRIGGERINDEX = ... - RPMTAG_FILETRIGGERVERSION = ... - RPMTAG_FILETRIGGERFLAGS = ... - RPMTAG_TRANSFILETRIGGERIN = ... - RPMTAG_TRANSFILETRIGGERUN = ... - RPMTAG_TRANSFILETRIGGERPOSTUN = ... - RPMTAG_TRANSFILETRIGGERSCRIPTS = ... - RPMTAG_TRANSFILETRIGGERSCRIPTPROG = ... - RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS = ... - RPMTAG_TRANSFILETRIGGERNAME = ... - RPMTAG_TRANSFILETRIGGERINDEX = ... - RPMTAG_TRANSFILETRIGGERVERSION = ... - RPMTAG_TRANSFILETRIGGERFLAGS = ... - RPMTAG_REMOVEPATHPOSTFIXES = ... - RPMTAG_FILETRIGGERPRIORITIES = ... - RPMTAG_TRANSFILETRIGGERPRIORITIES = ... - RPMTAG_FILETRIGGERCONDS = ... - RPMTAG_FILETRIGGERTYPE = ... - RPMTAG_TRANSFILETRIGGERCONDS = ... - RPMTAG_TRANSFILETRIGGERTYPE = ... - RPMTAG_FILESIGNATURES = ... - RPMTAG_FILESIGNATURELENGTH = ... - RPMTAG_PAYLOADDIGEST = ... - RPMTAG_PAYLOADDIGESTALGO = ... - RPMTAG_AUTOINSTALLED = ... - RPMTAG_IDENTITY = ... - RPMTAG_MODULARITYLABEL = ... - RPMTAG_PAYLOADDIGESTALT = ... - RPMTAG_FIRSTFREE_TAG = ... - RPMTAG_EXTERNAL_TAG = ... - - class rpmDbiTag(__cs__.Enum): - RPMDBI_PACKAGES = ... - RPMDBI_LABEL = ... - RPMDBI_NAME = ... - RPMDBI_BASENAMES = ... - RPMDBI_GROUP = ... - RPMDBI_REQUIRENAME = ... - RPMDBI_PROVIDENAME = ... - RPMDBI_CONFLICTNAME = ... - RPMDBI_OBSOLETENAME = ... - RPMDBI_TRIGGERNAME = ... - RPMDBI_DIRNAMES = ... - RPMDBI_INSTALLTID = ... - RPMDBI_SIGMD5 = ... - RPMDBI_SHA1HEADER = ... - RPMDBI_INSTFILENAMES = ... - RPMDBI_FILETRIGGERNAME = ... - RPMDBI_TRANSFILETRIGGERNAME = ... - RPMDBI_RECOMMENDNAME = ... - RPMDBI_SUGGESTNAME = ... - RPMDBI_SUPPLEMENTNAME = ... - RPMDBI_ENHANCENAME = ... - - class rpmSigTag(__cs__.Enum): - RPMSIGTAG_SIZE = ... - RPMSIGTAG_LEMD5_1 = ... - RPMSIGTAG_PGP = ... - RPMSIGTAG_LEMD5_2 = ... - RPMSIGTAG_MD5 = ... - RPMSIGTAG_GPG = ... - RPMSIGTAG_PGP5 = ... - RPMSIGTAG_PAYLOADSIZE = ... - RPMSIGTAG_RESERVEDSPACE = ... - RPMSIGTAG_BADSHA1_1 = ... - RPMSIGTAG_BADSHA1_2 = ... - RPMSIGTAG_DSA = ... - RPMSIGTAG_RSA = ... - RPMSIGTAG_SHA1 = ... - RPMSIGTAG_LONGSIZE = ... - RPMSIGTAG_LONGARCHIVESIZE = ... - RPMSIGTAG_SHA256 = ... - RPMSIGTAG_FILESIGNATURES = ... - RPMSIGTAG_FILESIGNATURELENGTH = ... - - class rpmTagType(__cs__.Enum): - RPM_NULL_TYPE = ... - RPM_CHAR_TYPE = ... - RPM_INT8_TYPE = ... - RPM_INT16_TYPE = ... - RPM_INT32_TYPE = ... - RPM_INT64_TYPE = ... - RPM_STRING_TYPE = ... - RPM_BIN_TYPE = ... - RPM_STRING_ARRAY_TYPE = ... - RPM_I18NSTRING_TYPE = ... - - class rpmTagClass(__cs__.Enum): - RPM_NULL_CLASS = ... - RPM_NUMERIC_CLASS = ... - RPM_STRING_CLASS = ... - RPM_BINARY_CLASS = ... - - class entryInfo(__cs__.Structure): - tag: _c_rpm.uint32 - type: _c_rpm.uint32 - offset: _c_rpm.int32 - count: _c_rpm.uint32 - @overload - def __init__( - self, - tag: _c_rpm.uint32 | None = ..., - type: _c_rpm.uint32 | None = ..., - offset: _c_rpm.int32 | None = ..., - count: _c_rpm.uint32 | None = ..., - ): ... - @overload - def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ... - - class header_intro(__cs__.Structure): - index_length: _c_rpm.uint32 - data_length: _c_rpm.uint32 - class entryInfo(__cs__.Structure): - tag: _c_rpm.uint32 - type: _c_rpm.uint32 - offset: _c_rpm.int32 - count: _c_rpm.uint32 - @overload - def __init__( - self, - tag: _c_rpm.uint32 | None = ..., - type: _c_rpm.uint32 | None = ..., - offset: _c_rpm.int32 | None = ..., - count: _c_rpm.uint32 | None = ..., - ): ... - @overload - def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ... - - entries: __cs__.Array[entryInfo] - @overload - def __init__( - self, - index_length: _c_rpm.uint32 | None = ..., - data_length: _c_rpm.uint32 | None = ..., - entries: __cs__.Array[entryInfo] | None = ..., - ): ... - @overload - def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ... - -# Technically `c_rpm` is an instance of `_c_rpm`, but then we can't use it in type hints -c_rpm: TypeAlias = _c_rpm diff --git a/dissect/database/bsd/tools/rpm.py b/dissect/database/bsd/tools/rpm.py deleted file mode 100644 index ddc7836..0000000 --- a/dissect/database/bsd/tools/rpm.py +++ /dev/null @@ -1,243 +0,0 @@ -# References: -# - https://rpm.org/docs/ -from __future__ import annotations - -import argparse -import posixpath -import stat -from pathlib import Path -from typing import TYPE_CHECKING, Any, BinaryIO, NamedTuple - -from dissect.database.bsd import db -from dissect.database.bsd.tools.c_rpm import c_rpm - -if TYPE_CHECKING: - from collections.abc import Iterator - - -TYPE_SIZE_MAP = { - c_rpm.rpmTagType.RPM_NULL_TYPE: 0, - c_rpm.rpmTagType.RPM_CHAR_TYPE: 1, - c_rpm.rpmTagType.RPM_INT8_TYPE: 2, - c_rpm.rpmTagType.RPM_INT16_TYPE: 2, - c_rpm.rpmTagType.RPM_INT32_TYPE: 4, - c_rpm.rpmTagType.RPM_INT64_TYPE: 8, - c_rpm.rpmTagType.RPM_STRING_TYPE: -1, - c_rpm.rpmTagType.RPM_BIN_TYPE: 1, - c_rpm.rpmTagType.RPM_STRING_ARRAY_TYPE: -1, - c_rpm.rpmTagType.RPM_I18NSTRING_TYPE: -1, -} - - -TYPE_PARSERS = { - c_rpm.rpmTagType.RPM_NULL_TYPE: lambda _: None, - c_rpm.rpmTagType.RPM_CHAR_TYPE: c_rpm.char, - c_rpm.rpmTagType.RPM_INT8_TYPE: c_rpm.uint8, - c_rpm.rpmTagType.RPM_INT16_TYPE: c_rpm.uint16, - c_rpm.rpmTagType.RPM_INT32_TYPE: c_rpm.uint32, - c_rpm.rpmTagType.RPM_INT64_TYPE: c_rpm.uint64, - c_rpm.rpmTagType.RPM_STRING_TYPE: lambda v: v.split(b"\x00")[0].decode(), - c_rpm.rpmTagType.RPM_BIN_TYPE: lambda v: v, - c_rpm.rpmTagType.RPM_STRING_ARRAY_TYPE: lambda v, c: [s.decode() for s in v.split(b"\x00")[:c]], - c_rpm.rpmTagType.RPM_I18NSTRING_TYPE: lambda v: v.split(b"\x00")[0].decode(), -} - -ARRAY_TYPES = ( - c_rpm.rpmTagType.RPM_CHAR_TYPE, - c_rpm.rpmTagType.RPM_INT8_TYPE, - c_rpm.rpmTagType.RPM_INT16_TYPE, - c_rpm.rpmTagType.RPM_INT32_TYPE, - c_rpm.rpmTagType.RPM_INT64_TYPE, -) - - -class PackageEntry(NamedTuple): - path: str - size: int - mode: int - mtime: int - user: str - group: str - digest: bytes - - -class File(PackageEntry): - pass - - -class Directory(PackageEntry): - pass - - -class Package: - """RPM Package. - - Args: - buf: Bytes containing the RPM Package header blob. - """ - - def __init__(self, buf: bytes): - self.blob = HeaderBlob(buf) - - def __repr__(self) -> str: - return f"" - - def __iter__(self) -> Iterator[File | Directory]: - return self.entries() - - @property - def name(self) -> str: - """Package name.""" - return self.blob.value(c_rpm.rpmTag.RPMTAG_NAME) - - @property - def version(self) -> str: - """Package version.""" - return self.blob.value(c_rpm.rpmTag.RPMTAG_VERSION) - - @property - def release(self) -> str: - """Package release.""" - return self.blob.value(c_rpm.rpmTag.RPMTAG_RELEASE) - - @property - def summary(self) -> str: - """Package summary.""" - return self.blob.value(c_rpm.rpmTag.RPMTAG_SUMMARY) - - @property - def description(self) -> str: - """Package description.""" - return self.blob.value(c_rpm.rpmTag.RPMTAG_DESCRIPTION) - - def entries(self) -> Iterator[File | Directory]: - """Iterate over all files and directories in the package.""" - if c_rpm.rpmTag.RPMTAG_FILESIZES not in self.blob: - return - - sizes = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_FILESIZES)) - modes = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_FILEMODES)) - mtimes = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_FILEMTIMES)) - users = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_FILEUSERNAME)) - groups = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_FILEGROUPNAME)) - digests = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_FILEDIGESTS)) - - basenames = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_BASENAMES)) - dirnames = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_DIRNAMES)) - dirindex = _as_list(self.blob.value(c_rpm.rpmTag.RPMTAG_DIRINDEXES)) - - for i, name in enumerate(basenames): - dirname = dirnames[dirindex[i]] - klass = Directory if stat.S_ISDIR(modes[i]) else File - yield klass( - posixpath.join(dirname, name), - sizes[i], - modes[i], - mtimes[i], - users[i], - groups[i], - digests[i], - ) - - -def _as_list(value: Any) -> list[Any]: - return [value] if not isinstance(value, list) else value - - -class HeaderBlob: - """RPM Header Blob. - - Args: - buf: Bytes containing the RPM Header Blob. - """ - - def __init__(self, buf: bytes): - self.buf = buf - self.header = c_rpm.header_intro(self.buf) - - # sizeof(il) + sizeof(dl) + (il * sizeof(pe)) + dl - self.pvlen = 4 + 4 + (self.header.index_length * len(c_rpm.entryInfo)) + self.header.data_length - self.data_start = 4 + 4 + (self.header.index_length * len(c_rpm.entryInfo)) - self.data_end = self.data_start + self.header.data_length - - self.tag_map = {e.tag: idx for idx, e in enumerate(self.header.entries)} - - def __contains__(self, tag: c_rpm.rpmTag) -> bool: - return tag.value in self.tag_map - - def entry(self, idx: int) -> tuple[c_rpm.rpmTag, int | str | bytes | list[int] | list[str] | None]: - """Get the ``(tag, value)`` for the given index.""" - entry = self.header.entries[idx] - - tag = c_rpm.rpmTag(entry.tag) - type = c_rpm.rpmTagType(entry.type) - - type_size = TYPE_SIZE_MAP[type] - if type_size == -1: - next_entry = self.header.entries[idx + 1] if idx + 1 < self.header.index_length else None - data_size = (next_entry.offset if next_entry else len(self.buf)) - entry.offset - else: - data_size = entry.count * type_size - - data = self.buf[self.data_start + entry.offset : self.data_start + entry.offset + data_size] - - parser = TYPE_PARSERS[type] - if type in ARRAY_TYPES and entry.count > 1: - parser = parser[entry.count] - - value = parser(data, entry.count) if type == c_rpm.rpmTagType.RPM_STRING_ARRAY_TYPE else parser(data) - return tag, value - - def entries(self) -> Iterator[tuple[c_rpm.rpmTag, int | str | bytes | list[int] | list[str] | None]]: - """Iterate over all ``(tag, value)`` entries in the header.""" - for idx in range(self.header.index_length): - yield self.entry(idx) - - def value(self, tag: c_rpm.rpmTag) -> int | str | bytes | list[int] | list[str] | None: - """Get the value for the given tag.""" - if (idx := self.tag_map.get(tag.value)) is None: - raise IndexError(f"Tag not found: {tag}") - return self.entry(idx)[1] - - -class Packages: - """RPMDB Packages database. - - Args: - fh: File-like object containing the RPMDB Packages database (a Berkeley DB). - """ - - def __init__(self, fh: BinaryIO): - self.db = db.DB(fh) - - def __iter__(self) -> Iterator[Package]: - return self.entries() - - def entries(self) -> Iterator[Package]: - """Iterate over all packages in the database.""" - for _, data in self.db.records(): - if len(data) > 4: - yield Package(data) - - -def main() -> int: - parser = argparse.ArgumentParser() - parser.add_argument("input", type=Path, help="input RPMDB Packages file") - args = parser.parse_args() - - with args.input.open("rb") as fh: - db = Packages(fh) - for package in db.entries(): - print(package) - for entry in package.entries(): - if isinstance(entry, File): - print(f" FILE {entry.path} {entry.size} bytes") - elif isinstance(entry, Directory): - print(f" DIR {entry.path}") - print() - - return 0 - - -if __name__ == "__main__": - main() diff --git a/pyproject.toml b/pyproject.toml index bd75c47..d1caae9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,6 @@ dissect-ntds = "dissect.database.ese.ntds.tools.ntds:main" dissect-ual = "dissect.database.ese.tools.ual:main" dissect-sru = "dissect.database.ese.tools.sru:main" dissect-certlog = "dissect.database.ese.tools.certlog:main" -dissect-rpm = "dissect.database.bsd.tools.rpm:main" dissect-impacket = "dissect.database.ese.tools.impacket:main" [tool.ruff] diff --git a/tests/_data/bsd/rpm/Packages.gz b/tests/_data/bsd/rpm/Packages.gz deleted file mode 100644 index 271b15c..0000000 --- a/tests/_data/bsd/rpm/Packages.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca0cdb6054eaf7aef9da05f516a0c1972b1f722d512c0c2e2a7524d83108b01f -size 4643305 diff --git a/tests/bsd/conftest.py b/tests/bsd/conftest.py index f056129..c697293 100644 --- a/tests/bsd/conftest.py +++ b/tests/bsd/conftest.py @@ -23,8 +23,3 @@ def hash_db() -> Iterator[BinaryIO]: @pytest.fixture def recno_db() -> Iterator[BinaryIO]: yield from open_file_gz("_data/bsd/recno.db.gz") - - -@pytest.fixture -def rpm_packages() -> Iterator[BinaryIO]: - yield from open_file_gz("_data/bsd/rpm/Packages.gz") diff --git a/tests/bsd/test_rpm.py b/tests/bsd/test_rpm.py deleted file mode 100644 index 45ab7b0..0000000 --- a/tests/bsd/test_rpm.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -import textwrap -from typing import BinaryIO - -from dissect.database.bsd.tools.rpm import Packages - - -def test_rpm(rpm_packages: BinaryIO) -> None: - """Test parsing RPM Packages file.""" - db = Packages(rpm_packages) - - entries = list(db) - assert len(entries) == 239 - - entry = entries[27] - assert entry.name == "python" - assert entry.version == "2.6.6" - assert entry.release == "68.el6_10" - assert entry.summary == "An interpreted, interactive, object-oriented programming language" - - desc = """ - Python is an interpreted, interactive, object-oriented programming - language often compared to Tcl, Perl, Scheme or Java. Python includes - modules, classes, exceptions, very high level dynamic data types and - dynamic typing. Python supports interfaces to many system calls and - libraries, as well as to various windowing systems (X11, Motif, Tk, - Mac and MFC). - - Programmers can write new built-in modules for Python in C or C++. - Python can be used as an extension language for applications that need - a programmable interface. - - Note that documentation for Python is provided in the python-docs - package. - - This package provides the "python" executable; most of the actual - implementation is within the "python-libs" package.""" - assert entry.description == textwrap.dedent(desc).strip() - - files = list(entry) - assert len(files) == 8 - assert [f.path for f in files] == [ - "/usr/bin/pydoc", - "/usr/bin/python", - "/usr/bin/python2", - "/usr/bin/python2.6", - "/usr/share/doc/python-2.6.6", - "/usr/share/doc/python-2.6.6/LICENSE", - "/usr/share/doc/python-2.6.6/README", - "/usr/share/man/man1/python.1.gz", - ]