1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Diagnostics ;
3
4
using System . IO ;
4
5
using System . Linq ;
5
6
using System . Text ;
@@ -55,16 +56,19 @@ public class Scanner
55
56
public int Scan ( ScanOptions options )
56
57
{
57
58
int exitCode ;
59
+ NumberOfVulnerabilities = 0 ;
60
+ _projects = [ ] ;
58
61
try
59
62
{
60
63
LoadSettings ( options ) ;
61
64
ConfigureLogging ( ) ;
62
65
ScanVulnerabilities ( options ) ;
63
66
exitCode = _settings . WarnOnly ? 0 : NumberOfVulnerabilities ;
64
67
}
65
- catch ( Exception )
68
+ catch ( Exception e )
66
69
{
67
70
exitCode = - 1 ;
71
+ Debug . WriteLine ( e ) ;
68
72
}
69
73
70
74
return exitCode ;
@@ -187,11 +191,20 @@ private void ScanVulnerabilities(ScanOptions options)
187
191
var nonSensitivePackageIDs = nonSensitivePackages . SelectMany ( p => p . Value ) . ToArray ( ) ;
188
192
if ( _settings . OssIndex . Enabled )
189
193
{
190
- const string OssIndexSourceID = "OSSIndex" ;
191
- var uncachedPkgs = options . Cache . GetUncachedPackages ( nonSensitivePackageIDs , TimeSpan . FromDays ( 1 ) , OssIndexSourceID , out var cachedPackages ) ;
192
-
194
+ const string ossIndexSourceId = "OSSIndex" ;
195
+ var uncachedPkgs = options . Cache . GetUncachedPackages ( nonSensitivePackageIDs , TimeSpan . FromDays ( 1 ) , ossIndexSourceId , out var cachedPackages ) ;
196
+ var modUncached = uncachedPkgs . Count % 128 ;
197
+ if ( modUncached > 0 )
198
+ {
199
+ for ( var i = cachedPackages . Length - 1 ; i >= cachedPackages . Length - modUncached ; i -- )
200
+ {
201
+ uncachedPkgs . Add ( cachedPackages [ i ] ) ;
202
+ }
203
+
204
+ cachedPackages = cachedPackages [ ..^ modUncached ] ;
205
+ }
193
206
// Round out the calls to have a full set of packages each to refresh oldest cached packages
194
- if ( uncachedPkgs . Count > 0 ) uncachedPkgs . AddRange ( cachedPackages . Take ( 128 - uncachedPkgs . Count % 128 ) ) ;
207
+ if ( uncachedPkgs . Count > 0 ) uncachedPkgs . AddRange ( cachedPackages . Take ( uncachedPkgs . Count % 128 ) ) ;
195
208
196
209
Log . Logger . Verbose ( "Checking with OSSIndex for Vulnerabilities" ) ;
197
210
vulnDict =
@@ -201,10 +214,10 @@ private void ScanVulnerabilities(ScanOptions options)
201
214
// If we failed to update the OSS Index data don't clear out old cached data as that will
202
215
// increase the number of requests next time, increasing the liklihood of further
203
216
// TooManyRequeusts responses.
204
- options . Cache . UpdateCache ( vulnDict , uncachedPkgs , OssIndexSourceID ) ;
217
+ options . Cache . UpdateCache ( vulnDict , uncachedPkgs , ossIndexSourceId ) ;
205
218
206
219
// Skipping the packages we refreshed
207
- options . Cache . GetPackagesCachedVulnerabilitiesForSource ( cachedPackages . Skip ( 128 - uncachedPkgs . Count % 128 ) , OssIndexSourceID , ref vulnDict ) ;
220
+ options . Cache . GetPackagesCachedVulnerabilitiesForSource ( cachedPackages . Skip ( uncachedPkgs . Count % 128 ) , ossIndexSourceId , ref vulnDict ) ;
208
221
}
209
222
210
223
if ( _settings . GitHubAdvisoryDatabase . Enabled )
@@ -218,20 +231,29 @@ private void ScanVulnerabilities(ScanOptions options)
218
231
}
219
232
else
220
233
{
221
- const string GitHubAdvisoryDatabaseSourceId = "GitHubSecurityAdvisoryDatabase" ;
222
- var uncachedPkgs = options . Cache . GetUncachedPackages ( nonSensitivePackageIDs , TimeSpan . FromDays ( 1 ) , GitHubAdvisoryDatabaseSourceId , out var cachedPackages ) ;
223
-
234
+ const string gitHubAdvisoryDatabaseSourceId = "GitHubSecurityAdvisoryDatabase" ;
235
+ var uncachedPkgs = options . Cache . GetUncachedPackages ( nonSensitivePackageIDs , TimeSpan . FromDays ( 1 ) , gitHubAdvisoryDatabaseSourceId , out var cachedPackages ) ;
236
+ var modUncached = uncachedPkgs . Count % 128 ;
237
+ if ( modUncached > 0 )
238
+ {
239
+ for ( var i = cachedPackages . Length - 1 ; i >= cachedPackages . Length - modUncached ; i -- )
240
+ {
241
+ uncachedPkgs . Add ( cachedPackages [ i ] ) ;
242
+ }
243
+
244
+ cachedPackages = cachedPackages [ ..^ modUncached ] ;
245
+ }
224
246
Log . Logger . Verbose ( "Checking the GitHub Security Advisory Database for Vulnerabilities" ) ;
225
247
var ghsaVulnDict =
226
248
new GitHubAdvisoryDatabase . Scanner ( _nuGetFile , _settings . GitHubAdvisoryDatabase . ApiToken , _settings . GitHubAdvisoryDatabase . BreakIfCannotRun )
227
249
. GetVulnerabilitiesForPackages ( uncachedPkgs . ToArray ( ) ) ;
228
- options . Cache . UpdateCache ( ghsaVulnDict , uncachedPkgs , GitHubAdvisoryDatabaseSourceId ) ;
250
+ options . Cache . UpdateCache ( ghsaVulnDict , uncachedPkgs , gitHubAdvisoryDatabaseSourceId ) ;
229
251
230
252
if ( vulnDict == null )
231
253
vulnDict = ghsaVulnDict ;
232
254
else
233
255
MergeVulnDict ( ref vulnDict , ref ghsaVulnDict ) ;
234
- options . Cache . GetPackagesCachedVulnerabilitiesForSource ( cachedPackages , GitHubAdvisoryDatabaseSourceId , ref vulnDict ) ;
256
+ options . Cache . GetPackagesCachedVulnerabilitiesForSource ( cachedPackages , gitHubAdvisoryDatabaseSourceId , ref vulnDict ) ;
235
257
}
236
258
}
237
259
0 commit comments