Skip to content
This repository was archived by the owner on Apr 15, 2026. It is now read-only.

Commit 5bfb2d5

Browse files
committed
Add ApiClient.mustache template and update OpenAPI generation script
- Introduced a new ApiClient.mustache template for API client generation. - Updated the generate-openapi.sh script to clean up generated files and confirm successful generation with a message. - Ensured consistency in model classes by regenerating them with updated timestamps.
1 parent 460f661 commit 5bfb2d5

95 files changed

Lines changed: 2111 additions & 148 deletions

File tree

Some content is hidden

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

scripts/ApiClient.mustache

Lines changed: 1937 additions & 0 deletions
Large diffs are not rendered by default.

scripts/generate-openapi.sh

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/bin/sh
2+
set -euo pipefail
23

34
GENERATED_PACKAGE_NAME="generated"
45
SDK_PACKAGE_NAME="com/corbado"
@@ -10,17 +11,24 @@ cd "$(dirname "$0")"
1011
rm -rf .gen
1112
mkdir -p .gen
1213
cd .gen
13-
rm -rf ../../src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME
14-
mkdir -p ../../src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME
14+
rm -rf "../../src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME"
15+
mkdir -p "../../src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME"
16+
17+
mkdir -p templates
1518

1619
cp ../backend_api.yml backend_api.yml
1720
cp ../common.yml common.yml
21+
cp ../ApiClient.mustache templates/ApiClient.mustache
1822

23+
# --- 1) Generate with our overridden template (force okhttp-gson) ---
1924
docker pull openapitools/openapi-generator-cli
20-
docker run -v ${PWD}:/local --user $(id -u):$(id -g) openapitools/openapi-generator-cli generate \
25+
26+
docker run --rm -v "${PWD}:/local" --user "$(id -u):$(id -g)" \
27+
openapitools/openapi-generator-cli generate \
2128
-i /local/backend_api.yml \
2229
-g java \
2330
-o /local \
31+
-t /local/templates \
2432
--additional-properties=packageName=com.corbado.generated \
2533
--additional-properties=groupId=com.corbado \
2634
--additional-properties=artifactId=corbado-java-generated \
@@ -31,9 +39,29 @@ docker run -v ${PWD}:/local --user $(id -u):$(id -g) openapitools/openapi-genera
3139
--additional-properties=useSwaggerAnnotations=false \
3240
--additional-properties=disallowAdditionalPropertiesIfNotPresent=false
3341

34-
cp -r src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME/* ../../src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME
35-
cd ..
36-
rm -rf .gen
42+
# --- 2) Verify the override actually applied ---
43+
GEN_API_CLIENT="src/main/java/com/corbado/generated/invoker/ApiClient.java"
3744

45+
if [ ! -f "$GEN_API_CLIENT" ]; then
46+
echo "ERROR: Generated ApiClient.java not found at $GEN_API_CLIENT" >&2
47+
echo "Hint: Check the invokerPackage and selected library." >&2
48+
find src -name ApiClient.java || true
49+
exit 1
50+
fi
3851

52+
# Check for our injected exception string
53+
if ! grep -q 'TLS verification disabled (verifyingSsl=false). Refusing to install insecure TrustManager.' "$GEN_API_CLIENT"; then
54+
echo "ERROR: Template override did NOT apply to generated ApiClient.java" >&2
55+
echo "Diagnostics:" >&2
56+
grep -n 'applySslSettings' "$GEN_API_CLIENT" || true
57+
grep -n 'okhttp3' "$GEN_API_CLIENT" || echo "No okhttp3 import found; are you generating jersey instead of okhttp-gson?" >&2
58+
exit 1
59+
fi
60+
61+
# --- 3) Copy generated sources into your project tree ---
62+
cp -r "src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME/"* "../../src/main/java/$SDK_PACKAGE_NAME/$GENERATED_PACKAGE_NAME"
63+
64+
cd ..
65+
rm -rf .gen
3966

67+
echo "✅ Generation complete and secure applySslSettings() injected."

src/main/java/com/corbado/generated/invoker/ApiClient.java

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,61 +1495,59 @@ public Response intercept(Interceptor.Chain chain) throws IOException {
14951495
*/
14961496
protected void applySslSettings() {
14971497
try {
1498-
TrustManager[] trustManagers;
1499-
HostnameVerifier hostnameVerifier;
1498+
// 1) Never allow "trust-all"
15001499
if (!verifyingSsl) {
1501-
trustManagers = new TrustManager[]{
1502-
new X509TrustManager() {
1503-
@Override
1504-
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
1505-
}
1506-
1507-
@Override
1508-
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
1509-
}
1510-
1511-
@Override
1512-
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
1513-
return new java.security.cert.X509Certificate[]{};
1514-
}
1515-
}
1516-
};
1517-
hostnameVerifier = new HostnameVerifier() {
1518-
@Override
1519-
public boolean verify(String hostname, SSLSession session) {
1520-
return true;
1521-
}
1522-
};
1500+
throw new IllegalStateException(
1501+
"TLS verification disabled (verifyingSsl=false). Refusing to install insecure TrustManager."
1502+
);
1503+
}
1504+
1505+
// 2) If no custom CA and no client certs, keep platform defaults (best/simplest)
1506+
boolean hasCustomCa = (sslCaCert != null);
1507+
boolean hasClientCert = (keyManagers != null && keyManagers.length > 0);
1508+
1509+
if (!hasCustomCa && !hasClientCert) {
1510+
// Do NOT override sslSocketFactory/hostnameVerifier: let OkHttp use system trust + default hostname checks
1511+
httpClient = httpClient.newBuilder().build();
1512+
return;
1513+
}
1514+
1515+
// 3) Build TrustManager from system trust or the provided CA(s)
1516+
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
1517+
if (!hasCustomCa) {
1518+
// System/JVM default trust store
1519+
tmf.init((KeyStore) null);
15231520
} else {
1524-
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
1525-
1526-
if (sslCaCert == null) {
1527-
trustManagerFactory.init((KeyStore) null);
1528-
} else {
1529-
char[] password = null; // Any password will work.
1530-
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
1531-
Collection<? extends Certificate> certificates = certificateFactory.generateCertificates(sslCaCert);
1532-
if (certificates.isEmpty()) {
1533-
throw new IllegalArgumentException("expected non-empty set of trusted certificates");
1534-
}
1535-
KeyStore caKeyStore = newEmptyKeyStore(password);
1536-
int index = 0;
1537-
for (Certificate certificate : certificates) {
1538-
String certificateAlias = "ca" + (index++);
1539-
caKeyStore.setCertificateEntry(certificateAlias, certificate);
1540-
}
1541-
trustManagerFactory.init(caKeyStore);
1521+
char[] password = null; // any password works for an empty keystore
1522+
CertificateFactory cf = CertificateFactory.getInstance("X.509");
1523+
Collection<? extends Certificate> certs = cf.generateCertificates(sslCaCert);
1524+
if (certs == null || certs.isEmpty()) {
1525+
throw new IllegalArgumentException("Expected non-empty set of trusted certificates");
15421526
}
1543-
trustManagers = trustManagerFactory.getTrustManagers();
1544-
hostnameVerifier = OkHostnameVerifier.INSTANCE;
1527+
KeyStore caKeyStore = newEmptyKeyStore(password);
1528+
int i = 0;
1529+
for (Certificate c : certs) {
1530+
caKeyStore.setCertificateEntry("ca" + (i++), c);
1531+
}
1532+
tmf.init(caKeyStore);
15451533
}
15461534

1547-
SSLContext sslContext = SSLContext.getInstance("TLS");
1548-
sslContext.init(keyManagers, trustManagers, new SecureRandom());
1535+
TrustManager[] tms = tmf.getTrustManagers();
1536+
if (tms.length == 0 || !(tms[0] instanceof X509TrustManager)) {
1537+
throw new IllegalStateException("No X509TrustManager from TrustManagerFactory");
1538+
}
1539+
X509TrustManager x509Tm = (X509TrustManager) tms[0];
1540+
1541+
// 4) Initialize SSLContext with optional client key managers (for mTLS) + the proper trust manager
1542+
SSLContext sc = SSLContext.getInstance("TLS");
1543+
sc.init(keyManagers, new TrustManager[] { x509Tm }, new SecureRandom());
1544+
1545+
// 5) Wire into OkHttp with strict hostname verification
15491546
httpClient = httpClient.newBuilder()
1550-
.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0])
1551-
.hostnameVerifier(hostnameVerifier)
1552-
.build();
1547+
.sslSocketFactory(sc.getSocketFactory(), x509Tm)
1548+
.hostnameVerifier(OkHostnameVerifier.INSTANCE)
1549+
.build();
1550+
15531551
} catch (GeneralSecurityException e) {
15541552
throw new RuntimeException(e);
15551553
}
@@ -1586,4 +1584,4 @@ protected String requestBodyToString(RequestBody requestBody) throws ApiExceptio
15861584
// empty http request body
15871585
return "";
15881586
}
1589-
}
1587+
}

src/main/java/com/corbado/generated/invoker/ApiException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
* <p>ApiException class.</p>
2323
*/
2424
@SuppressWarnings("serial")
25-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
25+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
2626
public class ApiException extends Exception {
2727
private static final long serialVersionUID = 1L;
2828

src/main/java/com/corbado/generated/invoker/Configuration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import java.util.concurrent.atomic.AtomicReference;
1818
import java.util.function.Supplier;
1919

20-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
20+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
2121
public class Configuration {
2222
public static final String VERSION = "1.0.0";
2323

src/main/java/com/corbado/generated/invoker/Pair.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
package com.corbado.generated.invoker;
1515

16-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
16+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
1717
public class Pair {
1818
private final String name;
1919
private final String value;

src/main/java/com/corbado/generated/invoker/ServerConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/**
1919
* Representing a Server configuration.
2020
*/
21-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
21+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
2222
public class ServerConfiguration {
2323
public String URL;
2424
public String description;

src/main/java/com/corbado/generated/invoker/ServerVariable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/**
1919
* Representing a Server Variable for server URL template substitution.
2020
*/
21-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
21+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
2222
public class ServerVariable {
2323
public String description;
2424
public String defaultValue;

src/main/java/com/corbado/generated/invoker/StringUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.util.Collection;
1717
import java.util.Iterator;
1818

19-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
19+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
2020
public class StringUtil {
2121
/**
2222
* Check if the given array contains the given value (with case-insensitive comparison).

src/main/java/com/corbado/generated/invoker/auth/ApiKeyAuth.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.util.Map;
2121
import java.util.List;
2222

23-
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-10T14:34:06.387838337Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
23+
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-09-11T08:44:44.623070219Z[Etc/UTC]", comments = "Generator version: 7.16.0-SNAPSHOT")
2424
public class ApiKeyAuth implements Authentication {
2525
private final String location;
2626
private final String paramName;

0 commit comments

Comments
 (0)