1package matchers 2 3var ( 4 TypeEpub = newType("epub", "application/epub+zip") 5 TypeZip = newType("zip", "application/zip") 6 TypeTar = newType("tar", "application/x-tar") 7 TypeRar = newType("rar", "application/x-rar-compressed") 8 TypeGz = newType("gz", "application/gzip") 9 TypeBz2 = newType("bz2", "application/x-bzip2") 10 Type7z = newType("7z", "application/x-7z-compressed") 11 TypeXz = newType("xz", "application/x-xz") 12 TypePdf = newType("pdf", "application/pdf") 13 TypeExe = newType("exe", "application/x-msdownload") 14 TypeSwf = newType("swf", "application/x-shockwave-flash") 15 TypeRtf = newType("rtf", "application/rtf") 16 TypeEot = newType("eot", "application/octet-stream") 17 TypePs = newType("ps", "application/postscript") 18 TypeSqlite = newType("sqlite", "application/x-sqlite3") 19 TypeNes = newType("nes", "application/x-nintendo-nes-rom") 20 TypeCrx = newType("crx", "application/x-google-chrome-extension") 21 TypeCab = newType("cab", "application/vnd.ms-cab-compressed") 22 TypeDeb = newType("deb", "application/x-deb") 23 TypeAr = newType("ar", "application/x-unix-archive") 24 TypeZ = newType("Z", "application/x-compress") 25 TypeLz = newType("lz", "application/x-lzip") 26 TypeRpm = newType("rpm", "application/x-rpm") 27 TypeElf = newType("elf", "application/x-executable") 28) 29 30var Archive = Map{ 31 TypeEpub: Epub, 32 TypeZip: Zip, 33 TypeTar: Tar, 34 TypeRar: Rar, 35 TypeGz: Gz, 36 TypeBz2: Bz2, 37 Type7z: SevenZ, 38 TypeXz: Xz, 39 TypePdf: Pdf, 40 TypeExe: Exe, 41 TypeSwf: Swf, 42 TypeRtf: Rtf, 43 TypeEot: Eot, 44 TypePs: Ps, 45 TypeSqlite: Sqlite, 46 TypeNes: Nes, 47 TypeCrx: Crx, 48 TypeCab: Cab, 49 TypeDeb: Deb, 50 TypeAr: Ar, 51 TypeZ: Z, 52 TypeLz: Lz, 53 TypeRpm: Rpm, 54 TypeElf: Elf, 55} 56 57func Epub(buf []byte) bool { 58 return len(buf) > 57 && 59 buf[0] == 0x50 && buf[1] == 0x4B && buf[2] == 0x3 && buf[3] == 0x4 && 60 buf[30] == 0x6D && buf[31] == 0x69 && buf[32] == 0x6D && buf[33] == 0x65 && 61 buf[34] == 0x74 && buf[35] == 0x79 && buf[36] == 0x70 && buf[37] == 0x65 && 62 buf[38] == 0x61 && buf[39] == 0x70 && buf[40] == 0x70 && buf[41] == 0x6C && 63 buf[42] == 0x69 && buf[43] == 0x63 && buf[44] == 0x61 && buf[45] == 0x74 && 64 buf[46] == 0x69 && buf[47] == 0x6F && buf[48] == 0x6E && buf[49] == 0x2F && 65 buf[50] == 0x65 && buf[51] == 0x70 && buf[52] == 0x75 && buf[53] == 0x62 && 66 buf[54] == 0x2B && buf[55] == 0x7A && buf[56] == 0x69 && buf[57] == 0x70 67} 68 69func Zip(buf []byte) bool { 70 return len(buf) > 3 && 71 buf[0] == 0x50 && buf[1] == 0x4B && 72 (buf[2] == 0x3 || buf[2] == 0x5 || buf[2] == 0x7) && 73 (buf[3] == 0x4 || buf[3] == 0x6 || buf[3] == 0x8) 74} 75 76func Tar(buf []byte) bool { 77 return len(buf) > 261 && 78 buf[257] == 0x75 && buf[258] == 0x73 && 79 buf[259] == 0x74 && buf[260] == 0x61 && 80 buf[261] == 0x72 81} 82 83func Rar(buf []byte) bool { 84 return len(buf) > 6 && 85 buf[0] == 0x52 && buf[1] == 0x61 && buf[2] == 0x72 && 86 buf[3] == 0x21 && buf[4] == 0x1A && buf[5] == 0x7 && 87 (buf[6] == 0x0 || buf[6] == 0x1) 88} 89 90func Gz(buf []byte) bool { 91 return len(buf) > 2 && 92 buf[0] == 0x1F && buf[1] == 0x8B && buf[2] == 0x8 93} 94 95func Bz2(buf []byte) bool { 96 return len(buf) > 2 && 97 buf[0] == 0x42 && buf[1] == 0x5A && buf[2] == 0x68 98} 99 100func SevenZ(buf []byte) bool { 101 return len(buf) > 5 && 102 buf[0] == 0x37 && buf[1] == 0x7A && buf[2] == 0xBC && 103 buf[3] == 0xAF && buf[4] == 0x27 && buf[5] == 0x1C 104} 105 106func Pdf(buf []byte) bool { 107 return len(buf) > 3 && 108 buf[0] == 0x25 && buf[1] == 0x50 && 109 buf[2] == 0x44 && buf[3] == 0x46 110} 111 112func Exe(buf []byte) bool { 113 return len(buf) > 1 && 114 buf[0] == 0x4D && buf[1] == 0x5A 115} 116 117func Swf(buf []byte) bool { 118 return len(buf) > 2 && 119 (buf[0] == 0x43 || buf[0] == 0x46) && 120 buf[1] == 0x57 && buf[2] == 0x53 121} 122 123func Rtf(buf []byte) bool { 124 return len(buf) > 4 && 125 buf[0] == 0x7B && buf[1] == 0x5C && 126 buf[2] == 0x72 && buf[3] == 0x74 && 127 buf[4] == 0x66 128} 129 130func Nes(buf []byte) bool { 131 return len(buf) > 3 && 132 buf[0] == 0x4E && buf[1] == 0x45 && 133 buf[2] == 0x53 && buf[3] == 0x1A 134} 135 136func Crx(buf []byte) bool { 137 return len(buf) > 3 && 138 buf[0] == 0x43 && buf[1] == 0x72 && 139 buf[2] == 0x32 && buf[3] == 0x34 140} 141 142func Cab(buf []byte) bool { 143 return len(buf) > 3 && 144 ((buf[0] == 0x4D && buf[1] == 0x53 && buf[2] == 0x43 && buf[3] == 0x46) || 145 (buf[0] == 0x49 && buf[1] == 0x53 && buf[2] == 0x63 && buf[3] == 0x28)) 146} 147 148func Eot(buf []byte) bool { 149 return len(buf) > 35 && 150 buf[34] == 0x4C && buf[35] == 0x50 && 151 ((buf[8] == 0x02 && buf[9] == 0x00 && 152 buf[10] == 0x01) || (buf[8] == 0x01 && 153 buf[9] == 0x00 && buf[10] == 0x00) || 154 (buf[8] == 0x02 && buf[9] == 0x00 && 155 buf[10] == 0x02)) 156} 157 158func Ps(buf []byte) bool { 159 return len(buf) > 1 && 160 buf[0] == 0x25 && buf[1] == 0x21 161} 162 163func Xz(buf []byte) bool { 164 return len(buf) > 5 && 165 buf[0] == 0xFD && buf[1] == 0x37 && 166 buf[2] == 0x7A && buf[3] == 0x58 && 167 buf[4] == 0x5A && buf[5] == 0x00 168} 169 170func Sqlite(buf []byte) bool { 171 return len(buf) > 3 && 172 buf[0] == 0x53 && buf[1] == 0x51 && 173 buf[2] == 0x4C && buf[3] == 0x69 174} 175 176func Deb(buf []byte) bool { 177 return len(buf) > 20 && 178 buf[0] == 0x21 && buf[1] == 0x3C && buf[2] == 0x61 && 179 buf[3] == 0x72 && buf[4] == 0x63 && buf[5] == 0x68 && 180 buf[6] == 0x3E && buf[7] == 0x0A && buf[8] == 0x64 && 181 buf[9] == 0x65 && buf[10] == 0x62 && buf[11] == 0x69 && 182 buf[12] == 0x61 && buf[13] == 0x6E && buf[14] == 0x2D && 183 buf[15] == 0x62 && buf[16] == 0x69 && buf[17] == 0x6E && 184 buf[18] == 0x61 && buf[19] == 0x72 && buf[20] == 0x79 185} 186 187func Ar(buf []byte) bool { 188 return len(buf) > 6 && 189 buf[0] == 0x21 && buf[1] == 0x3C && 190 buf[2] == 0x61 && buf[3] == 0x72 && 191 buf[4] == 0x63 && buf[5] == 0x68 && 192 buf[6] == 0x3E 193} 194 195func Z(buf []byte) bool { 196 return len(buf) > 1 && 197 ((buf[0] == 0x1F && buf[1] == 0xA0) || 198 (buf[0] == 0x1F && buf[1] == 0x9D)) 199} 200 201func Lz(buf []byte) bool { 202 return len(buf) > 3 && 203 buf[0] == 0x4C && buf[1] == 0x5A && 204 buf[2] == 0x49 && buf[3] == 0x50 205} 206 207func Rpm(buf []byte) bool { 208 return len(buf) > 96 && 209 buf[0] == 0xED && buf[1] == 0xAB && 210 buf[2] == 0xEE && buf[3] == 0xDB 211} 212 213func Elf(buf []byte) bool { 214 return len(buf) > 52 && 215 buf[0] == 0x7F && buf[1] == 0x45 && 216 buf[2] == 0x4C && buf[3] == 0x46 217} 218