Repository navigation
feat: add VirusTotal scan results sidebar card to plugin detail page - #19
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
0xliam627
approved these changes
May 21, 2026
Collaborator
Author
4 of 8 tasks
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds VirusTotal API v3 scanning for plugin artifacts when a version is submitted for review. After a build is submitted, a
vt-scansBullMQ job is enqueued and consumed by a new Worker in the API server. The worker downloads artifacts from storage, uploads them to VT, polls until analysis completes, and stores per-version results (malicious/suspicious/undetected counts, engine total, permalink, scan date).Supports both plugin types:
.whlartifact → 1 scan.so+.dllartifacts → 2 scans with a 15s rate-limit gap, worst-case result storedResults are surfaced via the existing
getBySlugAPI endpoint (8 new fields on each version object) and consumed by a newVirusTotalCardsidebar component on the frontend (separate PR onendgit-web).Type of change
Changes
Versionmodel (vtScanId,vtStatus,vtMalicious,vtSuspicious,vtUndetected,vtTotal,vtPermalink,vtScanDate)virustotal.service.ts(new): VT API v3 client — file upload, analysis polling (30s interval, 20 retries / 10 min timeout),scanVersionorchestrator with multi-artifact supportsrc/index.ts: BullMQWorker("vt-scans")consumer withconcurrency: 1and Redis TLS detectionsubmit.service.ts: SetsvtStatus: "queued"on version create/update; enqueues scan job after transaction with artifact keys parsed per plugin typeplugins.service.ts: VT fields added togetBySlugversion select.env.example:VT_API_KEYaddedChecklist:
Notes
concurrency: 1and 15s gap between C++ artifactsvtStatusis set to"failed"— the worker logs and continues without crashingpnpm db:pushmust be run against the database after merging to apply the schema migration