Skip to content

Commit 751b3df

Browse files
Merge pull request #246 from companieshouse/feature/ASM-306-maintain-search-api-ch-gov-uk
Feature/asm 306 maintain search api ch gov uk
2 parents cd35bd2 + ca330c4 commit 751b3df

File tree

55 files changed

+293
-383
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+293
-383
lines changed

pom.xml

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,24 @@
1919

2020
<properties>
2121
<java.version>21</java.version>
22-
<api-sdk-java.version>6.2.9</api-sdk-java.version>
22+
<api-sdk-java.version>6.4.4</api-sdk-java.version>
2323
<maven.compiler.source>${java.version}</maven.compiler.source>
2424
<maven.compiler.target>${java.version}</maven.compiler.target>
2525
<start-class>uk.gov.companieshouse.search.api.SearchApiApplication</start-class>
2626
<api-helper-java.version>3.0.1</api-helper-java.version>
27-
<api-security-java.version>2.0.8</api-security-java.version>
28-
<private-api-sdk-java.version>4.0.291</private-api-sdk-java.version>
27+
<api-security-java.version>2.0.14</api-security-java.version>
28+
<private-api-sdk-java.version>4.0.337</private-api-sdk-java.version>
2929

30+
31+
<commons-lang3.version>3.18.0</commons-lang3.version>
3032
<!-- Elastic Search -->
3133
<elasticsearch.version>7.9.3</elasticsearch.version>
3234

3335
<!-- Docker -->
3436
<jib-maven-plugin.version>3.4.4</jib-maven-plugin.version>
3537

3638
<!-- Structured logging -->
37-
<structured-logging.version>3.0.31</structured-logging.version>
39+
<structured-logging.version>3.0.38</structured-logging.version>
3840
<log4j.version>2.23.1</log4j.version>
3941

4042
<!-- Maven and Surefire plugins -->
@@ -60,10 +62,15 @@
6062
<artifactoryResolveSnapshotRepo>libs-snapshot-local</artifactoryResolveSnapshotRepo>
6163
<artifactoryResolveReleaseRepo>virtual-release</artifactoryResolveReleaseRepo>
6264

63-
<environment-reader-library.version>3.0.1</environment-reader-library.version>
65+
<environment-reader-library.version>3.0.3</environment-reader-library.version>
66+
67+
<spring-boot-dependencies.version>3.5.5</spring-boot-dependencies.version>
68+
<spring-boot-maven-plugin.version>3.5.5</spring-boot-maven-plugin.version>
69+
<!-- version added to resolve CVE-2025-41249-->
70+
<spring-core.version>6.2.11</spring-core.version>
71+
<!-- version added to resolve CVE-2025-41248 -->
72+
<spring-security-core.version>6.5.4</spring-security-core.version>
6473

65-
<spring-boot-dependencies.version>3.4.5</spring-boot-dependencies.version>
66-
<spring-boot-maven-plugin.version>3.4.5</spring-boot-maven-plugin.version>
6774
<skip.unit.tests>false</skip.unit.tests>
6875
<skip.integration.tests>false</skip.integration.tests>
6976
</properties>
@@ -86,6 +93,18 @@
8693
<groupId>org.springframework</groupId>
8794
<artifactId>spring-web</artifactId>
8895
</dependency>
96+
<!-- version added to resolve CVE-2025-41249-->
97+
<dependency>
98+
<groupId>org.springframework.security</groupId>
99+
<artifactId>spring-security-core</artifactId>
100+
<version>${spring-security-core.version}</version>
101+
</dependency>
102+
<!--Added to resolve CVE-2025-41248-->
103+
<dependency>
104+
<groupId>org.springframework</groupId>
105+
<artifactId>spring-core</artifactId>
106+
<version>${spring-core.version}</version>
107+
</dependency>
89108
<dependency>
90109
<groupId>org.springframework.boot</groupId>
91110
<artifactId>spring-boot-starter-security</artifactId>
@@ -97,6 +116,13 @@
97116
</exclusions>
98117
</dependency>
99118

119+
<!-- added to resolve CVE-2025-48924(5.3) transitive dependency of api-security-java needing latest version -->
120+
<dependency>
121+
<groupId>org.apache.commons</groupId>
122+
<artifactId>commons-lang3</artifactId>
123+
<version>${commons-lang3.version}</version>
124+
</dependency>
125+
100126
<dependency>
101127
<groupId>org.springframework.boot</groupId>
102128
<artifactId>spring-boot-starter-validation</artifactId>
@@ -148,6 +174,19 @@
148174
<groupId>org.sonarsource.scanner.maven</groupId>
149175
<artifactId>sonar-maven-plugin</artifactId>
150176
<version>${sonar-maven-plugin.version}</version>
177+
<exclusions>
178+
<exclusion>
179+
<!-- To resolve CVE-2025-48924, excluding commonslang which has no version later than 2.6 -->
180+
<groupId>commons-lang</groupId>
181+
<artifactId>commons-lang</artifactId>
182+
</exclusion>
183+
<exclusion>
184+
<!--To resolve CVE-2023-0833, excluding sonarsource.scanner.api
185+
which has no version later than 2.16.3.1081 -->
186+
<groupId>org.sonarsource.scanner.api</groupId>
187+
<artifactId>sonar-scanner-api</artifactId>
188+
</exclusion>
189+
</exclusions>
151190
</dependency>
152191

153192
<dependency>

src/main/java/uk/gov/companieshouse/search/api/SearchApiApplication.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package uk.gov.companieshouse.search.api;
22

3-
import org.springframework.beans.factory.annotation.Autowired;
43
import org.springframework.boot.SpringApplication;
54
import org.springframework.boot.autoconfigure.SpringBootApplication;
65
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@@ -13,12 +12,15 @@ public class SearchApiApplication implements WebMvcConfigurer {
1312

1413
public static final String APPLICATION_NAME_SPACE = "search.api.ch.gov.uk";
1514

16-
@Autowired
1715
private UserAuthorisationInterceptor authorisationInterceptor;
1816

19-
@Autowired
2017
private LoggingInterceptor loggingInterceptor;
2118

19+
public SearchApiApplication(UserAuthorisationInterceptor authorisationInterceptor, LoggingInterceptor loggingInterceptor) {
20+
this.authorisationInterceptor = authorisationInterceptor;
21+
this.loggingInterceptor = loggingInterceptor;
22+
}
23+
2224
public static void main(String[] args) {
2325
SpringApplication.run(SearchApiApplication.class, args);
2426
}
Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package uk.gov.companieshouse.search.api.config;
22

33
import java.net.MalformedURLException;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
46
import java.net.URL;
57
import org.apache.http.HttpHost;
68
import org.elasticsearch.client.RestClient;
79
import org.elasticsearch.client.RestHighLevelClient;
8-
import org.springframework.beans.factory.annotation.Autowired;
9-
import org.springframework.beans.factory.annotation.Qualifier;
1010
import org.springframework.context.annotation.Bean;
1111
import org.springframework.context.annotation.Configuration;
1212
import uk.gov.companieshouse.environment.EnvironmentReader;
@@ -15,50 +15,53 @@
1515
@Configuration
1616
public class ElasticSearchConfig {
1717

18-
@Autowired
19-
private EnvironmentReader environmentReader;
18+
private final EnvironmentReader environmentReader;
19+
20+
public ElasticSearchConfig(EnvironmentReader environmentReader) {
21+
this.environmentReader = environmentReader;
22+
}
2023

2124
// These are currently pointing at the existing ES instance, will need to be updated in the configs for both
2225
private static final String ALPHABETICAL_SEARCH_URL = "ELASTIC_SEARCH_URL";
2326
private static final String DISSOLVED_SEARCH_URL = "DISSOLVED_SEARCH_URL";
2427
private static final String ADVANCED_SEARCH_URL = "ADVANCED_SEARCH_URL";
2528
private static final String PRIMARY_SEARCH_URL = "PRIMARY_SEARCH_URL";
2629

27-
@Qualifier("alphabeticalClient")
2830
@Bean(destroyMethod = "close")
2931
public RestHighLevelClient alphabeticalRestClient() {
3032
return createClient(ALPHABETICAL_SEARCH_URL);
3133
}
3234

33-
@Qualifier("advancedClient")
3435
@Bean(destroyMethod = "close")
3536
public RestHighLevelClient advancedRestClient() {
3637
return createClient(ADVANCED_SEARCH_URL);
3738
}
3839

39-
@Qualifier("dissolvedClient")
40+
4041
@Bean(destroyMethod = "close")
4142
public RestHighLevelClient dissolvedRestClient() {
4243
return createClient(DISSOLVED_SEARCH_URL);
4344
}
4445

45-
@Qualifier("primaryClient")
4646
@Bean(destroyMethod = "close")
47-
public RestHighLevelClient primaryClient() {
47+
public RestHighLevelClient primaryRestClient() {
4848
return createClient(PRIMARY_SEARCH_URL);
4949
}
5050

5151
public RestHighLevelClient createClient(String url) {
52-
5352
URL endpoint;
5453
try {
55-
endpoint = new URL(environmentReader.getMandatoryString(url));
56-
} catch (MalformedURLException e) {
57-
throw new EndpointException(url + " environment variable is malformed; expected format is <protocol>://<host>[:port]");
54+
String rawUrl = environmentReader.getMandatoryString(url);
55+
URI uri = new URI(rawUrl);
56+
endpoint = uri.toURL();
57+
} catch (URISyntaxException | MalformedURLException e) {
58+
throw new EndpointException(url + "environment variable is malformed; expected format is <protocol>://<host>[:port]");
5859
}
5960

6061
return new RestHighLevelClient(
6162
RestClient.builder(
62-
new HttpHost(endpoint.getHost(), endpoint.getPort(), endpoint.getProtocol())));
63+
new HttpHost(endpoint.getHost(), endpoint.getPort(), endpoint.getProtocol())
64+
)
65+
);
6366
}
6467
}

src/main/java/uk/gov/companieshouse/search/api/controller/AdvancedSearchController.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.springframework.web.bind.annotation.RequestHeader;
2020
import org.springframework.web.bind.annotation.RequestMapping;
2121
import org.springframework.web.bind.annotation.RequestParam;
22-
import org.springframework.web.bind.annotation.ResponseBody;
2322
import org.springframework.web.bind.annotation.RestController;
2423
import uk.gov.companieshouse.api.model.company.CompanyProfileApi;
2524
import uk.gov.companieshouse.logging.util.DataMap;
@@ -75,7 +74,6 @@ public AdvancedSearchController(AdvancedQueryParamMapper queryParamMapper,
7574
}
7675

7776
@GetMapping("/companies")
78-
@ResponseBody
7977
public ResponseEntity<Object> search(@RequestParam(name = START_INDEX_QUERY_PARAM, required = false) Integer startIndex,
8078
@RequestParam(name = COMPANY_NAME_QUERY_PARAM, required = false) String companyName,
8179
@RequestParam(name = LOCATION_QUERY_PARAM, required = false) String location,

src/main/java/uk/gov/companieshouse/search/api/controller/AlphabeticalSearchController.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.springframework.http.MediaType;
88
import org.springframework.http.ResponseEntity;
99
import org.springframework.web.bind.annotation.RequestParam;
10-
import org.springframework.web.bind.annotation.ResponseBody;
1110
import org.springframework.web.bind.annotation.RestController;
1211
import org.springframework.web.bind.annotation.RequestMapping;
1312
import org.springframework.web.bind.annotation.RequestBody;
@@ -63,7 +62,6 @@ public AlphabeticalSearchController(AlphabeticalSearchIndexService searchIndexSe
6362
}
6463

6564
@GetMapping("/companies")
66-
@ResponseBody
6765
public ResponseEntity<Object> searchByCorporateName(@RequestParam(name = COMPANY_NAME_QUERY_PARAM) String companyName,
6866
@RequestParam(name = SEARCH_BEFORE_PARAM, required = false) String searchBefore,
6967
@RequestParam(name = SEARCH_AFTER_PARAM, required = false) String searchAfter,

src/main/java/uk/gov/companieshouse/search/api/controller/DissolvedSearchController.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.springframework.web.bind.annotation.RequestHeader;
1111
import org.springframework.web.bind.annotation.RequestMapping;
1212
import org.springframework.web.bind.annotation.RequestParam;
13-
import org.springframework.web.bind.annotation.ResponseBody;
1413
import org.springframework.web.bind.annotation.RestController;
1514
import uk.gov.companieshouse.environment.EnvironmentReader;
1615
import uk.gov.companieshouse.logging.util.DataMap;
@@ -59,7 +58,6 @@ public DissolvedSearchController(DissolvedSearchIndexService searchIndexService,
5958
}
6059

6160
@GetMapping("/companies")
62-
@ResponseBody
6361
public ResponseEntity<Object> searchCompanies(@RequestParam(name = COMPANY_NAME_QUERY_PARAM) String companyName,
6462
@RequestParam(name = SEARCH_TYPE_QUERY_PARAM) String searchType,
6563
@RequestParam(name = SEARCH_BEFORE_PARAM, required = false) String searchBefore,

src/main/java/uk/gov/companieshouse/search/api/elasticsearch/AbstractSearchRequest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,28 @@
99
import org.elasticsearch.search.SearchHits;
1010
import org.elasticsearch.search.builder.SearchSourceBuilder;
1111
import org.elasticsearch.search.sort.SortOrder;
12-
import org.springframework.beans.factory.annotation.Autowired;
1312

1413
import uk.gov.companieshouse.environment.EnvironmentReader;
1514
import uk.gov.companieshouse.logging.util.DataMap;
1615
import uk.gov.companieshouse.search.api.logging.LoggingUtils;
1716
import uk.gov.companieshouse.search.api.service.rest.RestClientService;
1817

1918
public abstract class AbstractSearchRequest {
20-
2119
abstract String getIndex();
2220

2321
abstract String getResultsSize();
2422

2523
abstract RestClientService getRestClientService();
2624

2725
abstract AbstractSearchQuery getSearchQuery();
28-
29-
@Autowired
26+
3027
private EnvironmentReader environmentReader;
3128

3229
private static final String ORDERED_ALPHA_KEY_WITH_ID = "ordered_alpha_key_with_id";
33-
30+
31+
protected AbstractSearchRequest(EnvironmentReader environmentReader) {
32+
this.environmentReader = environmentReader;
33+
}
3434

3535
public SearchHits getBestMatchResponse(String orderedAlphakey, String requestId) throws IOException {
3636
Map<String, Object> logMap = new DataMap.Builder()

src/main/java/uk/gov/companieshouse/search/api/elasticsearch/AlphabeticalSearchRequests.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,31 @@
33
import org.springframework.beans.factory.annotation.Autowired;
44
import org.springframework.stereotype.Component;
55

6+
import uk.gov.companieshouse.environment.EnvironmentReader;
67
import uk.gov.companieshouse.search.api.service.rest.RestClientService;
78
import uk.gov.companieshouse.search.api.service.rest.impl.AlphabeticalSearchRestClientService;
89

910
@Component
1011
public class AlphabeticalSearchRequests extends AbstractSearchRequest {
1112

12-
@Autowired
1313
private AlphabeticalSearchRestClientService searchRestClient;
1414

15-
@Autowired
1615
private AlphabeticalSearchQueries alphabeticalSearchQueries;
1716

1817
private static final String INDEX = "ALPHABETICAL_SEARCH_INDEX";
1918
private static final String RESULTS_SIZE = "ALPHABETICAL_SEARCH_RESULT_MAX";
20-
19+
20+
@Autowired
21+
public AlphabeticalSearchRequests(
22+
EnvironmentReader environmentReader,
23+
AlphabeticalSearchRestClientService searchRestClient,
24+
AlphabeticalSearchQueries alphabeticalSearchQueries
25+
) {
26+
super(environmentReader);
27+
this.searchRestClient = searchRestClient;
28+
this.alphabeticalSearchQueries = alphabeticalSearchQueries;
29+
}
30+
2131
@Override
2232
String getIndex() {
2333
return INDEX;

src/main/java/uk/gov/companieshouse/search/api/elasticsearch/DisqualifiedSearchUpsertRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.fasterxml.jackson.annotation.JsonInclude;
66
import com.fasterxml.jackson.databind.ObjectMapper;
77

8-
import org.apache.commons.lang.StringUtils;
8+
import org.apache.commons.lang3.StringUtils;
99
import org.apache.commons.lang3.ObjectUtils;
1010
import org.springframework.stereotype.Component;
1111

src/main/java/uk/gov/companieshouse/search/api/elasticsearch/DissolvedSearchRequests.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,26 @@
1919
@Component
2020
public class DissolvedSearchRequests extends AbstractSearchRequest {
2121

22-
@Autowired
2322
private DissolvedSearchRestClientService searchRestClient;
2423

25-
@Autowired
2624
private DissolvedSearchQueries searchQueries;
2725

28-
@Autowired
2926
private EnvironmentReader environmentReader;
3027

3128
private static final String INDEX = "DISSOLVED_SEARCH_INDEX";
3229
private static final String RESULTS_SIZE = "DISSOLVED_SEARCH_RESULT_MAX";
3330
private static final String BEST_MATCH_SEARCH_TYPE = "best-match";
3431

32+
@Autowired
33+
public DissolvedSearchRequests(
34+
EnvironmentReader environmentReader,
35+
DissolvedSearchRestClientService searchRestClient,
36+
DissolvedSearchQueries searchQueries
37+
) {
38+
super(environmentReader);
39+
this.searchRestClient = searchRestClient;
40+
this.searchQueries = searchQueries;
41+
}
3542
@Override
3643
String getIndex() {
3744
return INDEX;

0 commit comments

Comments
 (0)