def review(ctx, full_report, output, file): """ Show an output from a previous exported JSON report. """ LOG.info('Running check command') announcements = safety.get_announcements(key=None, proxy=None, telemetry=ctx.parent.telemetry) report = {} try: report = read_vulnerabilities(file) except SafetyError as e: LOG.exception('Expected SafetyError happened: %s', e) output_exception(e, exit_code_output=True) except Exception as e: LOG.exception('Unexpected Exception happened: %s', e) exception = e if isinstance(e, SafetyException) else SafetyException( info=e) output_exception(exception, exit_code_output=True) params = {'file': file} vulns, remediations, packages = safety.review(report, params=params) output_report = SafetyFormatter(output=output).render_vulnerabilities( announcements, vulns, remediations, full_report, packages) found_vulns = list(filter(lambda v: not v.ignored, vulns)) click.secho(output_report, nl=should_add_nl(output, found_vulns), file=sys.stdout) sys.exit(EXIT_CODE_OK)
def test_review_from_file(self): dirname = os.path.dirname(__file__) path_to_report = os.path.join(dirname, "test_db", "example_report.json") with open(path_to_report) as insecure: input_vulns = read_vulnerabilities(insecure) vulns = safety.review(input_vulns) self.assertEqual(len(vulns), 3)
def review(full_report, bare, file): if full_report and bare: click.secho("Can't choose both --bare and --full-report/--short-report", fg="red") sys.exit(-1) try: input_vulns = read_vulnerabilities(file) except JSONDecodeError: click.secho("Not a valid JSON file", fg="red") sys.exit(-1) vulns = safety.review(input_vulns) output_report = report(vulns=vulns, full=full_report, bare_report=bare) click.secho(output_report, nl=False if bare and not vulns else True)
def test_report_with_recommended_fix(self): REMEDIATIONS_WITH_FIX = { 'django': { 'version': '4.0.1', 'vulns_found': 4, 'secure_versions': ['2.2.28', '3.2.13', '4.0.4'], 'closest_secure_version': { 'major': parse('4.0.4'), 'minor': None }, 'more_info_url': 'https://pyup.io/packages/pypi/django/' } } with open( os.path.join(self.dirname, "test_db", "report_with_recommended_fix.json")) as f: vulns, remediations, packages = safety.review( read_vulnerabilities(f)) self.assertDictEqual(remediations, REMEDIATIONS_WITH_FIX)
def test_review_without_recommended_fix(self): vulns, remediations, packages = safety.review(self.report) self.assertListEqual(packages, list(self.report_packages.values())) self.assertDictEqual(remediations, self.report_remediations) self.assertListEqual(vulns, self.report_vulns)