diff options
Diffstat (limited to 'scripts/suspicious-source')
-rwxr-xr-x | scripts/suspicious-source | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/scripts/suspicious-source b/scripts/suspicious-source new file mode 100755 index 0000000..24cdf1c --- /dev/null +++ b/scripts/suspicious-source @@ -0,0 +1,177 @@ +#!/usr/bin/python3 + +# Copyright (c) 2010-2018, Benjamin Drung <bdrung@debian.org> +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# pylint: disable=invalid-name +# pylint: enable=invalid-name + +import argparse +import os +import sys + +from devscripts.logger import Logger + +try: + import magic +except ImportError: + Logger.error("Please install 'python3-magic' in order to use this utility.") + sys.exit(1) + +DEFAULT_WHITELISTED_MIMETYPES = [ + "application/pgp-keys", + "application/vnd.font-fontforge-sfd", # font source: fontforge + "application/x-elc", + "application/x-empty", + "application/x-font-otf", # font object and source + "application/x-font-ttf", # font object and source + "application/x-font-woff", # font object and source + "application/x-symlink", + "application/xml", + "audio/x-wav", + "font/otf", # font object and source + "font/ttf", # font object and source + "image/gif", + "image/jpeg", + "image/png", + "image/svg+xml", + "image/tiff", + "image/vnd.adobe.photoshop", + "image/x-icns", + "image/x-ico", + "image/x-icon", + "image/x-ms-bmp", + "image/x-portable-pixmap", + "image/x-xpmi", + "inode/symlink", + "inode/x-empty", + "message/rfc822", + "text/html", + "text/plain", + "text/rtf", + "text/troff", + "text/x-asm", + "text/x-c", + "text/x-c++", + "text/x-diff", + "text/x-fortran", + "text/x-java", + "text/x-lisp", + "text/x-m4", + "text/x-makefile", + "text/x-msdos-batch", + "text/x-pascal", + "text/x-perl", + "text/x-php", + "text/x-po", + "text/x-ruby", + "text/x-script.python", + "text/x-shellscript", + "text/x-tex", + "text/x-texinfo", + "text/xml", +] + +DEFAULT_WHITELISTED_EXTENSIONS = [ + ".el", # elisp source files + ".fea", # font source format: Adobe Font Development Kit for OpenType + ".fog", # font source format: Fontographer + ".g2n", # font source format: fontforge + ".gdh", # font source format: Graphite (headers) + ".gdl", # font source format: Graphite + ".glyph", # font source format: cross-toolkit UFO + ".gmo", # GNU Machine Object File (for translations with gettext) + ".icns", # Apple Icon Image format + ".java", # Java source files + ".plate", # font source format: Spiro + ".rsa", + ".sfd", # font source format: fontforge + ".sfdir", # font source format: fontforge + ".ttx", # font source format: fonttools + ".ufo", # font source format: cross-toolkit UFO + ".vfb", # font source format: FontLab + ".vtp", # font source format: OpenType (VOLT) + ".xgf", # font source format: Xgridfit +] + + +def suspicious_source( + whitelisted_mimetypes, whitelisted_extensions, directory, verbose=False +): + magic_cookie = magic.open(magic.MAGIC_MIME_TYPE) + magic_cookie.load() + + for root, dirs, files in os.walk(directory): + for _file in files: + mimetype = magic_cookie.file(os.path.join(root, _file)) + if mimetype not in whitelisted_mimetypes: + if not [x for x in whitelisted_extensions if _file.lower().endswith(x)]: + output = os.path.join(root, _file) + if verbose: + output += " (" + mimetype + ")" + print(output) + for vcs_dir in (".bzr", "CVS", ".git", ".svn", ".hg", "_darcs"): + if vcs_dir in dirs: + dirs.remove(vcs_dir) + + +def main(): + script_name = os.path.basename(sys.argv[0]) + epilog = f"See {script_name}(1) for more info." + parser = argparse.ArgumentParser(epilog=epilog) + + parser.add_argument( + "-v", + "--verbose", + help="print more information", + dest="verbose", + action="store_true", + default=False, + ) + parser.add_argument( + "-d", + "--directory", + help="check the files in the specified directory", + dest="directory", + default=".", + ) + parser.add_argument( + "-m", + "--mimetype", + metavar="MIMETYPE", + help="Add MIMETYPE to list of whitelisted mimetypes.", + dest="whitelisted_mimetypes", + action="append", + default=DEFAULT_WHITELISTED_MIMETYPES, + ) + parser.add_argument( + "-e", + "--extension", + metavar="EXTENSION", + help="Add EXTENSION to list of whitelisted extensions.", + dest="whitelisted_extensions", + action="append", + default=DEFAULT_WHITELISTED_EXTENSIONS, + ) + + args = parser.parse_args() + + whitelisted_extensions = [x.lower() for x in args.whitelisted_extensions] + suspicious_source( + args.whitelisted_mimetypes, whitelisted_extensions, args.directory, args.verbose + ) + + +if __name__ == "__main__": + main() |