218 lines
6.1 KiB
Go
218 lines
6.1 KiB
Go
package matchers
|
|
|
|
var (
|
|
TypeEpub = newType("epub", "application/epub+zip")
|
|
TypeZip = newType("zip", "application/zip")
|
|
TypeTar = newType("tar", "application/x-tar")
|
|
TypeRar = newType("rar", "application/x-rar-compressed")
|
|
TypeGz = newType("gz", "application/gzip")
|
|
TypeBz2 = newType("bz2", "application/x-bzip2")
|
|
Type7z = newType("7z", "application/x-7z-compressed")
|
|
TypeXz = newType("xz", "application/x-xz")
|
|
TypePdf = newType("pdf", "application/pdf")
|
|
TypeExe = newType("exe", "application/x-msdownload")
|
|
TypeSwf = newType("swf", "application/x-shockwave-flash")
|
|
TypeRtf = newType("rtf", "application/rtf")
|
|
TypeEot = newType("eot", "application/octet-stream")
|
|
TypePs = newType("ps", "application/postscript")
|
|
TypeSqlite = newType("sqlite", "application/x-sqlite3")
|
|
TypeNes = newType("nes", "application/x-nintendo-nes-rom")
|
|
TypeCrx = newType("crx", "application/x-google-chrome-extension")
|
|
TypeCab = newType("cab", "application/vnd.ms-cab-compressed")
|
|
TypeDeb = newType("deb", "application/x-deb")
|
|
TypeAr = newType("ar", "application/x-unix-archive")
|
|
TypeZ = newType("Z", "application/x-compress")
|
|
TypeLz = newType("lz", "application/x-lzip")
|
|
TypeRpm = newType("rpm", "application/x-rpm")
|
|
TypeElf = newType("elf", "application/x-executable")
|
|
)
|
|
|
|
var Archive = Map{
|
|
TypeEpub: Epub,
|
|
TypeZip: Zip,
|
|
TypeTar: Tar,
|
|
TypeRar: Rar,
|
|
TypeGz: Gz,
|
|
TypeBz2: Bz2,
|
|
Type7z: SevenZ,
|
|
TypeXz: Xz,
|
|
TypePdf: Pdf,
|
|
TypeExe: Exe,
|
|
TypeSwf: Swf,
|
|
TypeRtf: Rtf,
|
|
TypeEot: Eot,
|
|
TypePs: Ps,
|
|
TypeSqlite: Sqlite,
|
|
TypeNes: Nes,
|
|
TypeCrx: Crx,
|
|
TypeCab: Cab,
|
|
TypeDeb: Deb,
|
|
TypeAr: Ar,
|
|
TypeZ: Z,
|
|
TypeLz: Lz,
|
|
TypeRpm: Rpm,
|
|
TypeElf: Elf,
|
|
}
|
|
|
|
func Epub(buf []byte) bool {
|
|
return len(buf) > 57 &&
|
|
buf[0] == 0x50 && buf[1] == 0x4B && buf[2] == 0x3 && buf[3] == 0x4 &&
|
|
buf[30] == 0x6D && buf[31] == 0x69 && buf[32] == 0x6D && buf[33] == 0x65 &&
|
|
buf[34] == 0x74 && buf[35] == 0x79 && buf[36] == 0x70 && buf[37] == 0x65 &&
|
|
buf[38] == 0x61 && buf[39] == 0x70 && buf[40] == 0x70 && buf[41] == 0x6C &&
|
|
buf[42] == 0x69 && buf[43] == 0x63 && buf[44] == 0x61 && buf[45] == 0x74 &&
|
|
buf[46] == 0x69 && buf[47] == 0x6F && buf[48] == 0x6E && buf[49] == 0x2F &&
|
|
buf[50] == 0x65 && buf[51] == 0x70 && buf[52] == 0x75 && buf[53] == 0x62 &&
|
|
buf[54] == 0x2B && buf[55] == 0x7A && buf[56] == 0x69 && buf[57] == 0x70
|
|
}
|
|
|
|
func Zip(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
buf[0] == 0x50 && buf[1] == 0x4B &&
|
|
(buf[2] == 0x3 || buf[2] == 0x5 || buf[2] == 0x7) &&
|
|
(buf[3] == 0x4 || buf[3] == 0x6 || buf[3] == 0x8)
|
|
}
|
|
|
|
func Tar(buf []byte) bool {
|
|
return len(buf) > 261 &&
|
|
buf[257] == 0x75 && buf[258] == 0x73 &&
|
|
buf[259] == 0x74 && buf[260] == 0x61 &&
|
|
buf[261] == 0x72
|
|
}
|
|
|
|
func Rar(buf []byte) bool {
|
|
return len(buf) > 6 &&
|
|
buf[0] == 0x52 && buf[1] == 0x61 && buf[2] == 0x72 &&
|
|
buf[3] == 0x21 && buf[4] == 0x1A && buf[5] == 0x7 &&
|
|
(buf[6] == 0x0 || buf[6] == 0x1)
|
|
}
|
|
|
|
func Gz(buf []byte) bool {
|
|
return len(buf) > 2 &&
|
|
buf[0] == 0x1F && buf[1] == 0x8B && buf[2] == 0x8
|
|
}
|
|
|
|
func Bz2(buf []byte) bool {
|
|
return len(buf) > 2 &&
|
|
buf[0] == 0x42 && buf[1] == 0x5A && buf[2] == 0x68
|
|
}
|
|
|
|
func SevenZ(buf []byte) bool {
|
|
return len(buf) > 5 &&
|
|
buf[0] == 0x37 && buf[1] == 0x7A && buf[2] == 0xBC &&
|
|
buf[3] == 0xAF && buf[4] == 0x27 && buf[5] == 0x1C
|
|
}
|
|
|
|
func Pdf(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
buf[0] == 0x25 && buf[1] == 0x50 &&
|
|
buf[2] == 0x44 && buf[3] == 0x46
|
|
}
|
|
|
|
func Exe(buf []byte) bool {
|
|
return len(buf) > 1 &&
|
|
buf[0] == 0x4D && buf[1] == 0x5A
|
|
}
|
|
|
|
func Swf(buf []byte) bool {
|
|
return len(buf) > 2 &&
|
|
(buf[0] == 0x43 || buf[0] == 0x46) &&
|
|
buf[1] == 0x57 && buf[2] == 0x53
|
|
}
|
|
|
|
func Rtf(buf []byte) bool {
|
|
return len(buf) > 4 &&
|
|
buf[0] == 0x7B && buf[1] == 0x5C &&
|
|
buf[2] == 0x72 && buf[3] == 0x74 &&
|
|
buf[4] == 0x66
|
|
}
|
|
|
|
func Nes(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
buf[0] == 0x4E && buf[1] == 0x45 &&
|
|
buf[2] == 0x53 && buf[3] == 0x1A
|
|
}
|
|
|
|
func Crx(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
buf[0] == 0x43 && buf[1] == 0x72 &&
|
|
buf[2] == 0x32 && buf[3] == 0x34
|
|
}
|
|
|
|
func Cab(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
((buf[0] == 0x4D && buf[1] == 0x53 && buf[2] == 0x43 && buf[3] == 0x46) ||
|
|
(buf[0] == 0x49 && buf[1] == 0x53 && buf[2] == 0x63 && buf[3] == 0x28))
|
|
}
|
|
|
|
func Eot(buf []byte) bool {
|
|
return len(buf) > 35 &&
|
|
buf[34] == 0x4C && buf[35] == 0x50 &&
|
|
((buf[8] == 0x02 && buf[9] == 0x00 &&
|
|
buf[10] == 0x01) || (buf[8] == 0x01 &&
|
|
buf[9] == 0x00 && buf[10] == 0x00) ||
|
|
(buf[8] == 0x02 && buf[9] == 0x00 &&
|
|
buf[10] == 0x02))
|
|
}
|
|
|
|
func Ps(buf []byte) bool {
|
|
return len(buf) > 1 &&
|
|
buf[0] == 0x25 && buf[1] == 0x21
|
|
}
|
|
|
|
func Xz(buf []byte) bool {
|
|
return len(buf) > 5 &&
|
|
buf[0] == 0xFD && buf[1] == 0x37 &&
|
|
buf[2] == 0x7A && buf[3] == 0x58 &&
|
|
buf[4] == 0x5A && buf[5] == 0x00
|
|
}
|
|
|
|
func Sqlite(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
buf[0] == 0x53 && buf[1] == 0x51 &&
|
|
buf[2] == 0x4C && buf[3] == 0x69
|
|
}
|
|
|
|
func Deb(buf []byte) bool {
|
|
return len(buf) > 20 &&
|
|
buf[0] == 0x21 && buf[1] == 0x3C && buf[2] == 0x61 &&
|
|
buf[3] == 0x72 && buf[4] == 0x63 && buf[5] == 0x68 &&
|
|
buf[6] == 0x3E && buf[7] == 0x0A && buf[8] == 0x64 &&
|
|
buf[9] == 0x65 && buf[10] == 0x62 && buf[11] == 0x69 &&
|
|
buf[12] == 0x61 && buf[13] == 0x6E && buf[14] == 0x2D &&
|
|
buf[15] == 0x62 && buf[16] == 0x69 && buf[17] == 0x6E &&
|
|
buf[18] == 0x61 && buf[19] == 0x72 && buf[20] == 0x79
|
|
}
|
|
|
|
func Ar(buf []byte) bool {
|
|
return len(buf) > 6 &&
|
|
buf[0] == 0x21 && buf[1] == 0x3C &&
|
|
buf[2] == 0x61 && buf[3] == 0x72 &&
|
|
buf[4] == 0x63 && buf[5] == 0x68 &&
|
|
buf[6] == 0x3E
|
|
}
|
|
|
|
func Z(buf []byte) bool {
|
|
return len(buf) > 1 &&
|
|
((buf[0] == 0x1F && buf[1] == 0xA0) ||
|
|
(buf[0] == 0x1F && buf[1] == 0x9D))
|
|
}
|
|
|
|
func Lz(buf []byte) bool {
|
|
return len(buf) > 3 &&
|
|
buf[0] == 0x4C && buf[1] == 0x5A &&
|
|
buf[2] == 0x49 && buf[3] == 0x50
|
|
}
|
|
|
|
func Rpm(buf []byte) bool {
|
|
return len(buf) > 96 &&
|
|
buf[0] == 0xED && buf[1] == 0xAB &&
|
|
buf[2] == 0xEE && buf[3] == 0xDB
|
|
}
|
|
|
|
func Elf(buf []byte) bool {
|
|
return len(buf) > 52 &&
|
|
buf[0] == 0x7F && buf[1] == 0x45 &&
|
|
buf[2] == 0x4C && buf[3] == 0x46
|
|
}
|