1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.owasp.dependencycheck.data.ossindex;
19
20 import com.google.common.annotations.VisibleForTesting;
21 import org.joda.time.Duration;
22 import org.jspecify.annotations.NonNull;
23 import org.owasp.dependencycheck.utils.Settings;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26 import org.sonatype.ossindex.service.client.OssindexClient;
27 import org.sonatype.ossindex.service.client.OssindexClientConfiguration;
28 import org.sonatype.ossindex.service.client.cache.DirectoryCache;
29 import org.sonatype.ossindex.service.client.internal.OssindexClientImpl;
30 import org.sonatype.ossindex.service.client.marshal.GsonMarshaller;
31 import org.sonatype.ossindex.service.client.marshal.Marshaller;
32 import org.sonatype.ossindex.service.client.transport.AuthConfiguration;
33 import org.sonatype.ossindex.service.client.transport.Transport;
34 import org.sonatype.ossindex.service.client.transport.UserAgentSupplier;
35
36 import java.io.File;
37 import java.io.IOException;
38
39
40
41
42
43
44
45 public final class OssIndexClientProvider {
46
47
48
49
50 public static final String DEFAULT_BASE_URL = "https://api.guide.sonatype.com";
51
52
53
54
55 public static final int DEFAULT_CACHE_VALID_FOR_HOURS = 24;
56
57
58
59
60 private static final Logger LOGGER = LoggerFactory.getLogger(OssIndexClientProvider.class);
61
62
63
64
65 private OssIndexClientProvider() {
66
67 }
68
69
70
71
72
73
74
75 public static OssindexClient create(final Settings settings) {
76 final OssindexClientConfiguration config = new OssindexClientConfiguration();
77
78 config.setBaseUrl(settings.getString(Settings.KEYS.ANALYZER_OSSINDEX_URL, DEFAULT_BASE_URL));
79 config.setAuthConfiguration(new AuthConfiguration(
80 settings.getString(Settings.KEYS.ANALYZER_OSSINDEX_USER, ""),
81 settings.getString(Settings.KEYS.ANALYZER_OSSINDEX_PASSWORD))
82 );
83
84 final int batchSize = settings.getInt(Settings.KEYS.ANALYZER_OSSINDEX_BATCH_SIZE, OssindexClientConfiguration.DEFAULT_BATCH_SIZE);
85 config.setBatchSize(batchSize);
86
87 if (settings.getBoolean(Settings.KEYS.ANALYZER_OSSINDEX_USE_CACHE, true)) {
88 final DirectoryCache.Configuration cache = new DirectoryCache.Configuration();
89 final File data;
90 try {
91 data = settings.getDataDirectory();
92 final File cacheDir = new File(data, "oss_cache");
93 if (cacheDir.isDirectory() || cacheDir.mkdirs()) {
94 cache.setBaseDir(cacheDir.toPath());
95 cache.setExpireAfter(Duration.standardHours(settings.getInt(Settings.KEYS.ANALYZER_OSSINDEX_CACHE_VALID_FOR_HOURS, DEFAULT_CACHE_VALID_FOR_HOURS)));
96 config.setCacheConfiguration(cache);
97 LOGGER.debug("OSS Index Cache: {}", cache);
98 } else {
99 LOGGER.warn("Unable to use a cache for the OSS Index");
100 }
101 } catch (IOException ex) {
102 LOGGER.warn("Unable to use a cache for the OSS Index", ex);
103 }
104 }
105
106 final UserAgentSupplier userAgent = new UserAgentSupplier(
107 "dependency-check",
108 settings.getString(Settings.KEYS.APPLICATION_VERSION, "unknown")
109 );
110
111 final Transport transport = new ODCConnectionTransport(config, userAgent);
112
113 final Marshaller marshaller = new GsonMarshaller();
114
115 return newClientFor(config, transport, marshaller);
116 }
117
118 @VisibleForTesting
119 static @NonNull OssindexClientImpl newClientFor(OssindexClientConfiguration config, Transport transport, Marshaller marshaller) {
120 return new OssindexClientImpl(config, transport, marshaller);
121 }
122 }