test_tar.c (5809B)
1 /* 2 This file is part of libextractor. 3 Copyright (C) 2026 Vidyut Samanta and Christian Grothoff 4 5 libextractor is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published 7 by the Free Software Foundation; either version 3, or (at your 8 option) any later version. 9 10 libextractor is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with libextractor; see the file COPYING. If not, write to the 17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 Boston, MA 02110-1301, USA. 19 */ 20 /** 21 * @file plugins/test_tar.c 22 * @brief testcase for the tar plugin 23 * @author Christian Grothoff 24 */ 25 #include "platform.h" 26 #include "test_lib.h" 27 28 29 /** 30 * Shorthand for a plain UTF-8 text solution. 31 */ 32 #define TEXT_SOLUTION(type, value) \ 33 { (type), EXTRACTOR_METAFORMAT_UTF8, "text/plain", \ 34 (value), strlen (value) + 1, 0, 0, NULL } 35 36 37 /** 38 * Main function for the tar testcase. 39 * 40 * @param argc number of arguments (ignored) 41 * @param argv arguments (ignored) 42 * @return 0 on success 43 */ 44 int 45 main (int argc, char *argv[]) 46 { 47 struct SolutionData tar_test_sol[] = { 48 TEXT_SOLUTION (EXTRACTOR_METATYPE_MIMETYPE, 49 "application/x-tar"), 50 TEXT_SOLUTION (EXTRACTOR_METATYPE_FORMAT, 51 "ustar"), 52 /* seven members; the directory and the links count too */ 53 TEXT_SOLUTION (EXTRACTOR_METATYPE_ENTRY_COUNT, 54 "7"), 55 /* four regular files of 44 bytes each */ 56 TEXT_SOLUTION (EXTRACTOR_METATYPE_UNCOMPRESSED_SIZE, 57 "176"), 58 /* the newest member mtime, 1710506096 */ 59 TEXT_SOLUTION (EXTRACTOR_METATYPE_MODIFICATION_DATE, 60 "2024-03-15T12:34:56Z"), 61 /* -- ownership, the point of the plugin -- */ 62 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_USER, 63 "forensic"), 64 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_USER, 65 "root"), 66 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_GROUP, 67 "analysts"), 68 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_GROUP, 69 "root"), 70 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_UID, 71 "1000"), 72 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_UID, 73 "0"), 74 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_GID, 75 "100"), 76 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_GID, 77 "0"), 78 /* -- the distinct permission bits -- */ 79 TEXT_SOLUTION (EXTRACTOR_METATYPE_PERMISSIONS, 80 "0755"), 81 TEXT_SOLUTION (EXTRACTOR_METATYPE_PERMISSIONS, 82 "0644"), 83 TEXT_SOLUTION (EXTRACTOR_METATYPE_PERMISSIONS, 84 "0777"), 85 TEXT_SOLUTION (EXTRACTOR_METATYPE_PERMISSIONS, 86 "0600"), 87 TEXT_SOLUTION (EXTRACTOR_METATYPE_PERMISSIONS, 88 "0640"), 89 /* -- member names, including one reassembled from the ustar 90 prefix field -- */ 91 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 92 "evidence/"), 93 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 94 "evidence/notes.txt"), 95 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 96 "evidence/script.sh"), 97 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 98 "evidence/latest.txt"), 99 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 100 "evidence/hardlink.txt"), 101 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 102 "evidence/root-owned.txt"), 103 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 104 "evidence/dir00/dir01/dir02/dir03/dir04/dir05/dir06/dir07" 105 "/dir08/dir09/dir10/dir11/dir12/dir13/dir14/deep.txt"), 106 /* -- link targets -- */ 107 TEXT_SOLUTION (EXTRACTOR_METATYPE_TARGET_PATH, 108 "notes.txt"), 109 TEXT_SOLUTION (EXTRACTOR_METATYPE_TARGET_PATH, 110 "evidence/notes.txt"), 111 { 0, 0, NULL, NULL, 0, -1, 0, NULL } 112 }; 113 /* The archive plugin's sample doubles as a second, independently 114 produced input: it is a GNU-format tar made in 2002, so it checks 115 the magic discrimination and the ownership fields against a file 116 this plugin's generator never touched. */ 117 struct SolutionData archive_test_sol[] = { 118 TEXT_SOLUTION (EXTRACTOR_METATYPE_MIMETYPE, 119 "application/x-tar"), 120 TEXT_SOLUTION (EXTRACTOR_METATYPE_FORMAT, 121 "gnu"), 122 TEXT_SOLUTION (EXTRACTOR_METATYPE_ENTRY_COUNT, 123 "2"), 124 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_USER, 125 "grothoff"), 126 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_GROUP, 127 "grothoff"), 128 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_UID, 129 "1000"), 130 TEXT_SOLUTION (EXTRACTOR_METATYPE_OWNER_GID, 131 "1000"), 132 TEXT_SOLUTION (EXTRACTOR_METATYPE_PERMISSIONS, 133 "0644"), 134 TEXT_SOLUTION (EXTRACTOR_METATYPE_UNCOMPRESSED_SIZE, 135 "1980"), 136 TEXT_SOLUTION (EXTRACTOR_METATYPE_MODIFICATION_DATE, 137 "2002-06-05T22:29:14Z"), 138 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 139 "test.html"), 140 TEXT_SOLUTION (EXTRACTOR_METATYPE_FILENAME, 141 "test.jpg"), 142 { 0, 0, NULL, NULL, 0, -1, 0, NULL } 143 }; 144 struct ProblemSet ps[] = { 145 { "testdata/tar_test.tar", 146 tar_test_sol }, 147 { "testdata/archive_test.tar", 148 archive_test_sol }, 149 { NULL, NULL } 150 }; 151 152 (void) argc; 153 (void) argv; 154 return ET_main ("tar", ps); 155 } 156 157 158 /* end of test_tar.c */