private void ProcessDirectories(SearchManager smgr, Scanner.ScanEngine s, string outFile, string errFile, bool imageScan, string[] files) { var starttime = DateTime.Now; // Print header PrintHeader(outFile, imageScan); // Process files var processedfiles = 0; foreach (var file in files) { try { // If there is a file processor for a give file extension, process the file.. foreach (var fm in from fm in smgr.FileReaders where smgr.SupportFileExtension(fm, Path.GetExtension(file)) select fm) { // Only count if we have a file processor ++processedfiles; // Read the text var fc = fm.ReadAllText(file, imageScan); // Scan the text for patterns s.Scan(fc.Text); // Output start PrintProcessingStart(outFile, s, file, fc, imageScan); foreach (var match in s.PatternsFound.OrderBy(idx => idx.Index)) { PrintMatch(outFile, match, imageScan); } } } catch (Exception err) { File.AppendAllText(errFile, $"An error occured while processing: {file} => {err.Message}\n"); } } if (processedfiles > 0) { PrintFooter(outFile, starttime, processedfiles, s.GetPatternNames()); } }
/// <summary> /// Main processor /// </summary> /// <param name="args"></param> static void Main(string[] args) { // Parse command line cmdline = (Parsed <Options>)Parser.Default.ParseArguments <Options>(args) .WithParsed <Options>(o => { bool dir = string.IsNullOrEmpty(o.Directory); bool fil = string.IsNullOrEmpty(o.File); if (dir == true && fil == true) { Console.Error.WriteLine("You must provide either a directory or file to process"); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); Environment.Exit(-1); } // Make sure it is a valid directory before we do anything if (dir == false && Directory.Exists(o.Directory) == false) { Console.Error.WriteLine($"Invalid directory: '{o.Directory}'"); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); Environment.Exit(-1); } if (fil == false && File.Exists(o.File) == false) { Console.Error.WriteLine($"Invalid file: '{o.File}'"); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); Environment.Exit(-1); } }) .WithNotParsed <Options>(e => { Console.WriteLine("Press any key to continue..."); Console.ReadKey(); Environment.Exit(-2); }); if (cmdline.Value.Recursive == false) { CreateOutfiles(); } else { CreateOutDir(); } // Load the FileManagers smgr.ImportFileReaders(); if (smgr.FileReaders.Count() == 0) { File.AppendAllText(GetFileName(false, cmdline.Value.Directory ?? cmdline.Value.File), "No file readers found\n"); Environment.Exit(-3); } // Load the Scan engine and the patterns if (scanner.LoadPatterns() == 0) { File.AppendAllText(GetFileName(false, cmdline.Value.Directory ?? cmdline.Value.File), "No patterns found\n"); Environment.Exit(-4); } timeoutValue = int.Parse(ConfigurationManager.AppSettings["Timeout"] ?? "60"); //Process if (string.IsNullOrEmpty(cmdline.Value.Directory) == false) { Console.WriteLine($"Scanning {cmdline.Value.Directory} for files that contain sensitive information. Results will be stored in {cmdline.Value.OutFile}..."); ProcessDir(cmdline.Value.Directory, cmdline.Value.Recursive); } if (string.IsNullOrEmpty(cmdline.Value.File) == false) { // Print header PrintHeader(DateTime.Now, cmdline.Value.OutFile); // Process single file int processedfiles = ProcessFiles(new string[] { cmdline.Value.File }); // Print footer PrintFooter(DateTime.Now, cmdline.Value.OutFile, processedfiles, scanner.GetPatternNames()); } }