Skip to content

Commit f1ee3aa

Browse files
committed
Header are not forwarded so just use a query param to choose the authentication mode
1 parent 1e686b8 commit f1ee3aa

File tree

7 files changed

+48
-91
lines changed

7 files changed

+48
-91
lines changed

docs/_docs/guides/002-install.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ source <(curl -L -N -s http://localhost:8080/cli/install.sh?installDirectory=myd
7070
# When Cloudflare Zero Trust protects the endpoint, set the headers:
7171
export L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID=<client-id>
7272
export L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET=<client-secret>
73-
source /dev/stdin <<< "$(curl -L -N -s -H \"CF-Access-Client-Id: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID}\" -H \"CF-Access-Client-Secret: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET}\" http://localhost:8080/cli/install.sh)"
73+
source /dev/stdin <<< "$(curl -L -N -s -H \"CF-Access-Client-Id: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID}\" -H \"CF-Access-Client-Secret: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET}\" http://localhost:8080/cli/install.sh?authMode=CF_SERVICE_TOKEN)"
7474
7575
The install script automatically exports `L10N_RESTTEMPLATE_AUTHENTICATION_MODE=HEADER` when these
7676
headers are present.

docs/_docs/guides/002-install_springboot3.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ source <(curl -L -N -s http://localhost:8080/cli/install.sh?installDirectory=myd
5353
# When Cloudflare Zero Trust protects the endpoint, set the headers:
5454
export L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID=<client-id>
5555
export L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET=<client-secret>
56-
source /dev/stdin <<< "$(curl -L -N -s -H \"CF-Access-Client-Id: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID}\" -H \"CF-Access-Client-Secret: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET}\" http://localhost:8080/cli/install.sh)"
56+
source /dev/stdin <<< "$(curl -L -N -s -H \"CF-Access-Client-Id: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID}\" -H \"CF-Access-Client-Secret: ${L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET}\" http://localhost:8080/cli/install.sh?authMode=CF_SERVICE_TOKEN)"
5757
5858
The install script automatically exports `L10N_RESTTEMPLATE_AUTHENTICATION_MODE=HEADER` when these
5959
headers are present.

restclient/src/main/java/com/box/l10n/mojito/rest/resttemplate/HeaderAuthenticationInterceptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public ClientHttpResponse intercept(
2121
headers.forEach(
2222
(name, value) -> {
2323
if (name != null && value != null) {
24+
name = name.replace(".", "-");
25+
2426
request.getHeaders().set(name, value);
2527
}
2628
});

webapp/src/main/java/com/box/l10n/mojito/rest/cli/CliWS.java

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
import jakarta.servlet.http.HttpServletRequest;
55
import jakarta.servlet.http.HttpServletResponse;
66
import java.io.IOException;
7-
import java.util.Collections;
8-
import java.util.LinkedHashMap;
9-
import java.util.Map;
107
import java.util.Optional;
118
import org.slf4j.Logger;
129
import org.slf4j.LoggerFactory;
@@ -29,20 +26,6 @@ public class CliWS {
2926

3027
@Autowired CliService cliService;
3128

32-
public static final String CF_ACCESS_HEADER_CLIENT_ID = "CF-Access-Client-Id";
33-
public static final String CF_ACCESS_HEADER_CLIENT_SECRET = "CF-Access-Client-Secret";
34-
35-
static final Map<String, String> SUPPORTED_HEADER_TO_ENV_VAR;
36-
37-
static {
38-
Map<String, String> headerToEnvVar = new LinkedHashMap<>();
39-
headerToEnvVar.put(
40-
CF_ACCESS_HEADER_CLIENT_ID, "L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID");
41-
headerToEnvVar.put(
42-
CF_ACCESS_HEADER_CLIENT_SECRET, "L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET");
43-
SUPPORTED_HEADER_TO_ENV_VAR = Collections.unmodifiableMap(headerToEnvVar);
44-
}
45-
4629
/**
4730
* Entry point do download the CLI that corresponds to this server version.
4831
*
@@ -89,25 +72,11 @@ void unsafeSendRedirect(HttpServletResponse httpServletResponse, String cliUrl)
8972
public String getInstallCliScript(
9073
HttpServletRequest httpServletRequest,
9174
@RequestParam(value = "installDirectory", defaultValue = "#{'$'}{PWD}/.mojito")
92-
String installDirectory)
75+
String installDirectory,
76+
@RequestParam(value = "authMode", required = false) String authenticationMode)
9377
throws IOException {
9478
String requestUrl = httpServletRequest.getRequestURL().toString();
95-
Map<String, String> authenticationHeaders = getAuthenticationHeaders(httpServletRequest);
96-
97-
return cliService.generateInstallCliScript(requestUrl, installDirectory, authenticationHeaders);
98-
}
99-
100-
Map<String, String> getAuthenticationHeaders(HttpServletRequest httpServletRequest) {
101-
Map<String, String> headers = new LinkedHashMap<>();
102-
103-
SUPPORTED_HEADER_TO_ENV_VAR.forEach(
104-
(headerName, envVar) -> {
105-
if (httpServletRequest.getHeader(headerName) != null) {
106-
headers.put(headerName, envVar);
107-
}
108-
});
109-
110-
return headers;
79+
return cliService.generateInstallCliScript(requestUrl, installDirectory, authenticationMode);
11180
}
11281

11382
/**

webapp/src/main/java/com/box/l10n/mojito/service/cli/CliService.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.nio.file.Paths;
1212
import java.util.Collections;
1313
import java.util.HashMap;
14+
import java.util.LinkedHashMap;
1415
import java.util.List;
1516
import java.util.Map;
1617
import java.util.Optional;
@@ -31,6 +32,9 @@ public class CliService {
3132

3233
static final String INSTALL_CLI_TEMPLATE = "cli/install.sh";
3334
static Logger logger = LoggerFactory.getLogger(CliService.class);
35+
public static final String AUTHENTICATION_MODE_CF_SERVICE_TOKEN = "CF_SERVICE_TOKEN";
36+
37+
static final Map<String, String> CF_SERVICE_TOKEN_HEADER_TO_ENV_VAR = cfServiceTokenHeaders();
3438

3539
@Value("${info.build.version}")
3640
String version;
@@ -87,28 +91,37 @@ public String getCliUrl() {
8791
* @throws IOException
8892
*/
8993
public String generateInstallCliScript(
90-
String requestUrl, String installDirectory, Map<String, String> headerNameToEnvVar) {
94+
String requestUrl, String installDirectory, String authenticationMode) {
95+
Map<String, String> headersToUse = resolveHeaders(authenticationMode);
96+
String effectiveAuthenticationMode = headersToUse.isEmpty() ? null : "HEADER";
97+
9198
InstallCliContext installCliContext =
92-
getInstallCliContext(requestUrl, installDirectory, headerNameToEnvVar);
99+
getInstallCliContext(
100+
requestUrl, installDirectory, effectiveAuthenticationMode, headersToUse);
93101

94102
return mustacheTemplateEngine.render(INSTALL_CLI_TEMPLATE, installCliContext);
95103
}
96104

97105
InstallCliContext getInstallCliContext(
98-
String requestUrl, String installDirectory, Map<String, String> headerNameToEnvVar) {
106+
String requestUrl,
107+
String installDirectory,
108+
String authenticationMode,
109+
Map<String, String> headerNameToEnvVar) {
99110
try {
100111
URL url = new URL(requestUrl);
101112
InstallCliContext installCliContext =
102113
new InstallCliContext(installDirectory, url.getProtocol(), url.getHost(), getPort(url));
103114

104-
if (headerNameToEnvVar != null && !headerNameToEnvVar.isEmpty()) {
115+
if (authenticationMode != null
116+
&& headerNameToEnvVar != null
117+
&& !headerNameToEnvVar.isEmpty()) {
105118
List<InstallCliContext.Header> headers =
106119
headerNameToEnvVar.entrySet().stream()
107120
.map(entry -> new InstallCliContext.Header(entry.getKey(), entry.getValue()))
108121
.collect(Collectors.toList());
109122
installCliContext.headers = headers;
110123
installCliContext.hasHeaders = true;
111-
installCliContext.authenticationMode = "HEADER";
124+
installCliContext.authenticationMode = authenticationMode;
112125
} else {
113126
installCliContext.headers = Collections.emptyList();
114127
installCliContext.hasHeaders = false;
@@ -121,6 +134,23 @@ InstallCliContext getInstallCliContext(
121134
}
122135
}
123136

137+
Map<String, String> resolveHeaders(String authenticationMode) {
138+
if (authenticationMode != null
139+
&& AUTHENTICATION_MODE_CF_SERVICE_TOKEN.equalsIgnoreCase(authenticationMode)) {
140+
return CF_SERVICE_TOKEN_HEADER_TO_ENV_VAR;
141+
}
142+
return Collections.emptyMap();
143+
}
144+
145+
private static Map<String, String> cfServiceTokenHeaders() {
146+
Map<String, String> headerToEnvVar = new LinkedHashMap<>();
147+
headerToEnvVar.put(
148+
"CF-Access-Client-Id", "L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID");
149+
headerToEnvVar.put(
150+
"CF-Access-Client-Secret", "L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET");
151+
return Collections.unmodifiableMap(headerToEnvVar);
152+
}
153+
124154
String getPort(URL url) {
125155
int port = url.getPort();
126156

webapp/src/test/java/com/box/l10n/mojito/rest/cli/CliWSTest.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

webapp/src/test/java/com/box/l10n/mojito/service/cli/CliServiceTest.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertFalse;
55

6-
import com.box.l10n.mojito.rest.cli.CliWS;
76
import com.box.l10n.mojito.rest.cli.GitInfo;
87
import com.box.l10n.mojito.service.assetExtraction.ServiceTestBase;
98
import com.box.l10n.mojito.service.repository.RepositoryNameAlreadyUsedException;
@@ -12,8 +11,6 @@
1211
import java.net.URL;
1312
import java.nio.charset.StandardCharsets;
1413
import java.util.Collections;
15-
import java.util.LinkedHashMap;
16-
import java.util.Map;
1714
import java.util.Optional;
1815
import org.junit.Assert;
1916
import org.junit.Test;
@@ -55,6 +52,7 @@ public void testGetCliUrl() {
5552

5653
@Test
5754
public void getLocalCliFileDefaultNoFile() {
55+
cliService.cliConfig.setFile("target/nonexistent-" + System.nanoTime() + ".jar");
5856
Optional<FileSystemResource> localCliFile = cliService.getLocalCliFile();
5957
assertFalse(localCliFile.isPresent());
6058
}
@@ -63,7 +61,7 @@ public void getLocalCliFileDefaultNoFile() {
6361
public void generateInstallCliScript() throws IOException {
6462
String installScript =
6563
cliService.generateInstallCliScript(
66-
"http://localhost:8080/cli/install.sh", "${PWD}/.mojito", Collections.emptyMap());
64+
"http://localhost:8080/cli/install.sh", "${PWD}/.mojito", null);
6765
// Files.write(installScript, new
6866
// File("src/test/resources/com/box/l10n/mojito/service/cli/install.sh"),
6967
// StandardCharsets.UTF_8);
@@ -76,16 +74,11 @@ public void generateInstallCliScript() throws IOException {
7674

7775
@Test
7876
public void generateInstallCliScriptWithHeaders() throws IOException {
79-
Map<String, String> headers = new LinkedHashMap<>();
80-
headers.put(
81-
CliWS.CF_ACCESS_HEADER_CLIENT_ID, "L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_ID");
82-
headers.put(
83-
CliWS.CF_ACCESS_HEADER_CLIENT_SECRET,
84-
"L10N_RESTTEMPLATE_HEADER_HEADERS_CF_ACCESS_CLIENT_SECRET");
85-
8677
String installScript =
8778
cliService.generateInstallCliScript(
88-
"http://localhost:8080/cli/install.sh", "${PWD}/.mojito", headers);
79+
"http://localhost:8080/cli/install.sh",
80+
"${PWD}/.mojito",
81+
CliService.AUTHENTICATION_MODE_CF_SERVICE_TOKEN);
8982

9083
String expected =
9184
Resources.toString(
@@ -98,7 +91,7 @@ public void generateInstallCliScriptWithHeaders() throws IOException {
9891
public void getInstallCliContext() {
9992
InstallCliContext installCliContext =
10093
cliService.getInstallCliContext(
101-
"https://someinstall.org/cli/install.sh", "someplace", Collections.emptyMap());
94+
"https://someinstall.org/cli/install.sh", "someplace", null, Collections.emptyMap());
10295
assertEquals("https", installCliContext.scheme);
10396
assertEquals("someinstall.org", installCliContext.host);
10497
assertEquals("443", installCliContext.port);

0 commit comments

Comments
 (0)