diff --git a/docs/generators/java.md b/docs/generators/java.md index 68305bdbaa9..f89b43aea16 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -183,7 +183,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |examples|✗|OAS3 |requestBodies|✗|OAS3 |headers|✗|OAS3 -|securitySchemes|✗|OAS3 +|securitySchemes|✓|OAS3 |links|✗|OAS3 |callbacks|✗|OAS3 |pathItems|✗|OAS3 @@ -320,10 +320,10 @@ These options may be applied as additional-properties (cli) or configOptions (pl ### Security Feature | Name | Supported | Defined By | | ---- | --------- | ---------- | -|HTTP_Basic|✗|OAS2,OAS3 -|ApiKey|✗|OAS2,OAS3 +|HTTP_Basic|✓|OAS2,OAS3 +|ApiKey|✓|OAS2,OAS3 |OpenIDConnect|✗|OAS3 -|HTTP_Bearer|✗|OAS2,OAS3 +|HTTP_Bearer|✓|OAS2,OAS3 |OAuth2_Implicit|✗|OAS2,OAS3 |OAuth2_Password|✗|OAS2,OAS3 |OAuth2_ClientCredentials|✗|OAS2,OAS3 diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 47f55d4319b..10c50e03123 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -156,6 +156,13 @@ docs/components/schemas/UUIDString.md docs/components/schemas/User.md docs/components/schemas/Whale.md docs/components/schemas/Zebra.md +docs/components/securityschemes/ApiKey.md +docs/components/securityschemes/ApiKeyQuery.md +docs/components/securityschemes/BearerTest.md +docs/components/securityschemes/HttpBasicTest.md +docs/components/securityschemes/HttpSignatureTest.md +docs/components/securityschemes/OpenIdConnectTest.md +docs/components/securityschemes/PetstoreAuth.md docs/paths/anotherfakedummy/patch/responses/response200/content/applicationjson/Schema.md docs/paths/commonparamsubdir/delete/parameters/parameter0/Schema0.md docs/paths/commonparamsubdir/delete/parameters/parameter1/Schema1.md @@ -466,6 +473,13 @@ src/main/java/org/openapijsonschematools/client/components/schemas/UUIDString.ja src/main/java/org/openapijsonschematools/client/components/schemas/User.java src/main/java/org/openapijsonschematools/client/components/schemas/Whale.java src/main/java/org/openapijsonschematools/client/components/schemas/Zebra.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKey.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKeyQuery.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/BearerTest.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpBasicTest.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpSignatureTest.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/OpenIdConnectTest.java +src/main/java/org/openapijsonschematools/client/components/securityschemes/PetstoreAuth.java src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java @@ -759,6 +773,16 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsVa src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java +src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeyInLocation.java +src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeySecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/HttpBasicSecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/HttpBearerSecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/HttpDigestSecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/HttpSignatureSecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/MutualTlsSecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/OAuth2SecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/OpenIdConnectSecurityScheme.java +src/main/java/org/openapijsonschematools/client/securityschemes/SecurityScheme.java src/main/java/org/openapijsonschematools/client/servers/Server.java src/main/java/org/openapijsonschematools/client/servers/Server0.java src/main/java/org/openapijsonschematools/client/servers/Server1.java diff --git a/samples/client/petstore/java/README.md b/samples/client/petstore/java/README.md index 02018cd771c..461fa0f14fb 100644 --- a/samples/client/petstore/java/README.md +++ b/samples/client/petstore/java/README.md @@ -298,3 +298,15 @@ allowed input and output types. | [Mammal.Mammal1](docs/components/schemas/Mammal.md#mammal1) | | | [Whale.Whale1](docs/components/schemas/Whale.md#whale1) | | | [Zebra.Zebra1](docs/components/schemas/Zebra.md#zebra1) | | + +## Component SecuritySchemes + +| Class | Description | +| ----- | ----------- | +| [ApiKey](docs/components/securityschemes/ApiKey.md) | apiKey in header | +| [ApiKeyQuery](docs/components/securityschemes/ApiKeyQuery.md) | apiKey in query | +| [BearerTest](docs/components/securityschemes/BearerTest.md) | http bearer with JWT bearer format | +| [HttpBasicTest](docs/components/securityschemes/HttpBasicTest.md) | http basic | +| [HttpSignatureTest](docs/components/securityschemes/HttpSignatureTest.md) | http + signature | +| [OpenIdConnectTest](docs/components/securityschemes/OpenIdConnectTest.md) | openIdConnect | +| [PetstoreAuth](docs/components/securityschemes/PetstoreAuth.md) | oauth2 implicit flow with two scopes | diff --git a/samples/client/petstore/java/docs/components/securityschemes/ApiKey.md b/samples/client/petstore/java/docs/components/securityschemes/ApiKey.md new file mode 100644 index 00000000000..538c889758d --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/ApiKey.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.ApiKey +# SecurityScheme ApiKey + +public class ApiKey +extends ApiKeySecurityScheme + +A class that is used to apply auth to a request + +### Description +apiKey in header + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| ApiKey(String apiKey)
for header apiKey auth | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/securityschemes/ApiKeyQuery.md b/samples/client/petstore/java/docs/components/securityschemes/ApiKeyQuery.md new file mode 100644 index 00000000000..84abfb73118 --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/ApiKeyQuery.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.ApiKeyQuery +# SecurityScheme ApiKeyQuery + +public class ApiKeyQuery +extends ApiKeySecurityScheme + +A class that is used to apply auth to a request + +### Description +apiKey in query + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| ApiKeyQuery(String apiKey)
for query apiKey auth | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/securityschemes/BearerTest.md b/samples/client/petstore/java/docs/components/securityschemes/BearerTest.md new file mode 100644 index 00000000000..9ef82278136 --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/BearerTest.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.BearerTest +# SecurityScheme BearerTest + +public class BearerTest +extends HttpBearerSecurityScheme + +A class that is used to apply auth to a request + +### Description +http bearer with JWT bearer format + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| BearerTest(String accessToken) | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/securityschemes/HttpBasicTest.md b/samples/client/petstore/java/docs/components/securityschemes/HttpBasicTest.md new file mode 100644 index 00000000000..7e269daf174 --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/HttpBasicTest.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.HttpBasicTest +# SecurityScheme HttpBasicTest + +public class HttpBasicTest +extends HttpBasicSecurityScheme + +A class that is used to apply auth to a request + +### Description +http basic + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| HttpBasicTest(String userId, String password) | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/securityschemes/HttpSignatureTest.md b/samples/client/petstore/java/docs/components/securityschemes/HttpSignatureTest.md new file mode 100644 index 00000000000..3cb84ab41be --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/HttpSignatureTest.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.HttpSignatureTest +# SecurityScheme HttpSignatureTest + +public class HttpSignatureTest +extends HttpSignatureSecurityScheme + +A class that is used to apply auth to a request + +### Description +http + signature + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| todo | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/securityschemes/OpenIdConnectTest.md b/samples/client/petstore/java/docs/components/securityschemes/OpenIdConnectTest.md new file mode 100644 index 00000000000..4221999cfc5 --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/OpenIdConnectTest.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.OpenIdConnectTest +# SecurityScheme OpenIdConnectTest + +public class OpenIdConnectTest +extends OpenIdConnectSecurityScheme + +A class that is used to apply auth to a request + +### Description +openIdConnect + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| todo | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/securityschemes/PetstoreAuth.md b/samples/client/petstore/java/docs/components/securityschemes/PetstoreAuth.md new file mode 100644 index 00000000000..f50a6617361 --- /dev/null +++ b/samples/client/petstore/java/docs/components/securityschemes/PetstoreAuth.md @@ -0,0 +1,22 @@ +org.openapijsonschematools.client.components.securityschemes.PetstoreAuth +# SecurityScheme PetstoreAuth + +public class PetstoreAuth +extends Oauth2SecurityScheme + +A class that is used to apply auth to a request + +### Description +oauth2 implicit flow with two scopes + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| todo | + +[[Back to top]](#top) [[Back to Component Security Schemes]](../../../README.md#Component-SecuritySchemes) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKey.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKey.java new file mode 100644 index 00000000000..510266fdbda --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKey.java @@ -0,0 +1,13 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.ApiKeySecurityScheme; +import org.openapijsonschematools.client.securityschemes.ApiKeyInLocation; + +public class ApiKey extends ApiKeySecurityScheme { + /* + apiKey in header + */ + public ApiKey(String apiKey) { + super(apiKey, "api_key", ApiKeyInLocation.HEADER); + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKeyQuery.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKeyQuery.java new file mode 100644 index 00000000000..c75c1f59841 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/ApiKeyQuery.java @@ -0,0 +1,13 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.ApiKeySecurityScheme; +import org.openapijsonschematools.client.securityschemes.ApiKeyInLocation; + +public class ApiKeyQuery extends ApiKeySecurityScheme { + /* + apiKey in query + */ + public ApiKeyQuery(String apiKey) { + super(apiKey, "api_key_query", ApiKeyInLocation.QUERY); + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/BearerTest.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/BearerTest.java new file mode 100644 index 00000000000..9ed5b4700b4 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/BearerTest.java @@ -0,0 +1,12 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.HttpBearerSecurityScheme; + +public class BearerTest extends HttpBearerSecurityScheme { + /* + http bearer with JWT bearer format + */ + public BearerTest(String accessToken) { + super(accessToken, "JWT"); + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpBasicTest.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpBasicTest.java new file mode 100644 index 00000000000..2e01c07d4a7 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpBasicTest.java @@ -0,0 +1,12 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.HttpBasicSecurityScheme; + +public class HttpBasicTest extends HttpBasicSecurityScheme { + /* + http basic + */ + public HttpBasicTest(String userId, String password) { + super(userId, password); + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpSignatureTest.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpSignatureTest.java new file mode 100644 index 00000000000..07e6c3ab676 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/HttpSignatureTest.java @@ -0,0 +1,9 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.HttpSignatureSecurityScheme; + +public class HttpSignatureTest extends HttpSignatureSecurityScheme { + /* + http + signature + */ +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/OpenIdConnectTest.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/OpenIdConnectTest.java new file mode 100644 index 00000000000..204c2c47cab --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/OpenIdConnectTest.java @@ -0,0 +1,9 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.OpenIdConnectSecurityScheme; + +public class OpenIdConnectTest extends OpenIdConnectSecurityScheme { + /* + openIdConnect + */ +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/PetstoreAuth.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/PetstoreAuth.java new file mode 100644 index 00000000000..ad84bd017f6 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/securityschemes/PetstoreAuth.java @@ -0,0 +1,10 @@ +package org.openapijsonschematools.client.components.securityschemes; + +import org.openapijsonschematools.client.securityschemes.OAuth2SecurityScheme; + +public class PetstoreAuth extends OAuth2SecurityScheme { + /* + oauth2 implicit flow with two scopes + */ + // todo add flows info +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeyInLocation.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeyInLocation.java new file mode 100644 index 00000000000..0cd2e69d617 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeyInLocation.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.securityschemes; + +public enum ApiKeyInLocation{ + QUERY, + HEADER, + COOKIE +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeySecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeySecurityScheme.java new file mode 100644 index 00000000000..5f9f7dee73c --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/ApiKeySecurityScheme.java @@ -0,0 +1,35 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ApiKeySecurityScheme implements SecurityScheme { + private final String apiKey; + private final @Nullable String name; + private final ApiKeyInLocation inLocation; + + protected ApiKeySecurityScheme(String apiKey, @Nullable String name, ApiKeyInLocation inLocation) { + this.apiKey = apiKey; + this.name = name; + this.inLocation = inLocation; + } + + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + switch (inLocation) { + case COOKIE -> { + List cookieValue = headers.getOrDefault("Cookie", new ArrayList<>()); + cookieValue.add(apiKey); + } + case HEADER -> { + List headerValue = headers.getOrDefault(name, new ArrayList<>()); + headerValue.add(apiKey); + } + case QUERY -> throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpBasicSecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpBasicSecurityScheme.java new file mode 100644 index 00000000000..58ca37133e0 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpBasicSecurityScheme.java @@ -0,0 +1,32 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; + +public class HttpBasicSecurityScheme implements SecurityScheme { + private final String userId; + private final String password; + /* + scheme = BASIC, type = HTTP + https://www.rfc-editor.org/rfc/rfc7617.html + */ + + public HttpBasicSecurityScheme(String userId, String password) { + this.userId = userId; + this.password = password; + } + + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + String userPass = userId + ":" + password; + String b64UserPass = Base64.getEncoder().encodeToString(userPass.getBytes(StandardCharsets.UTF_8)); + List headerValue = headers.getOrDefault("Authorization", new ArrayList<>()); + headerValue.add("Basic " + b64UserPass); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpBearerSecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpBearerSecurityScheme.java new file mode 100644 index 00000000000..17ff7f595a9 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpBearerSecurityScheme.java @@ -0,0 +1,34 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; + +public class HttpBearerSecurityScheme implements SecurityScheme { + private final String accessToken; + private final @Nullable String bearerFormat; + /* + scheme = BEARER, type = HTTP + https://www.rfc-editor.org/rfc/rfc7617.html + */ + + protected HttpBearerSecurityScheme(String accessToken, @Nullable String bearerFormat) { + this.accessToken = accessToken; + this.bearerFormat = bearerFormat; + } + + protected HttpBearerSecurityScheme(String accessToken) { + this.accessToken = accessToken; + this.bearerFormat = null; + } + + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + List headerValue = headers.getOrDefault("Authorization", new ArrayList<>()); + headerValue.add("Bearer " + accessToken); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpDigestSecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpDigestSecurityScheme.java new file mode 100644 index 00000000000..8e96ab0a0c0 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpDigestSecurityScheme.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class HttpDigestSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpSignatureSecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpSignatureSecurityScheme.java new file mode 100644 index 00000000000..39374217373 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/HttpSignatureSecurityScheme.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class HttpSignatureSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/MutualTlsSecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/MutualTlsSecurityScheme.java new file mode 100644 index 00000000000..c5de4857e43 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/MutualTlsSecurityScheme.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class MutualTlsSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/OAuth2SecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/OAuth2SecurityScheme.java new file mode 100644 index 00000000000..331a2de41d3 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/OAuth2SecurityScheme.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class OAuth2SecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/OpenIdConnectSecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/OpenIdConnectSecurityScheme.java new file mode 100644 index 00000000000..40d20af483b --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/OpenIdConnectSecurityScheme.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class OpenIdConnectSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/SecurityScheme.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/SecurityScheme.java new file mode 100644 index 00000000000..a10949dd0f6 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/securityschemes/SecurityScheme.java @@ -0,0 +1,19 @@ +package org.openapijsonschematools.client.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public interface SecurityScheme { + void applyAuth( + Map> headers, + String resourcePath, + String method, + HttpRequest.BodyPublisher bodyPublisher, + @Nullable String queryParamsSuffix, + List scopeNames + ); +} + diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index bf18ca47ca8..5e4cd6b7c23 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -19,6 +19,7 @@ import com.google.common.base.Strings; import com.google.common.collect.Sets; +import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.examples.Example; import io.swagger.v3.oas.models.media.Schema; @@ -34,6 +35,7 @@ import org.openapijsonschematools.codegen.generators.generatormetadata.features.SchemaFeature; import org.openapijsonschematools.codegen.common.CodegenConstants; import org.openapijsonschematools.codegen.generators.generatormetadata.GeneratorType; +import org.openapijsonschematools.codegen.generators.generatormetadata.features.SecurityFeature; import org.openapijsonschematools.codegen.generators.models.CliOption; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenHeader; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenKey; @@ -280,7 +282,13 @@ public JavaClientGenerator() { GlobalFeature.Servers ) .includeComponentsFeatures( - ComponentsFeature.schemas + ComponentsFeature.schemas, + ComponentsFeature.securitySchemes + ) + .includeSecurityFeatures( + SecurityFeature.ApiKey, + SecurityFeature.HTTP_Basic, + SecurityFeature.HTTP_Bearer ) .includeSchemaFeatures( SchemaFeature.AdditionalProperties, @@ -784,6 +792,11 @@ public String toModelFilename(String name, String jsonPath) { return toModelName(name, jsonPath); } + @Override + public String toSecuritySchemeFilename(String basename, String jsonPath) { + return toModelName(basename, jsonPath); + } + @Override public String toResponseModuleName(String componentName, String jsonPath) { if (jsonPath.startsWith("#/components/responses/")) { @@ -2358,6 +2371,62 @@ public String toExampleValue(Schema p) { @Override public void setOpenAPI(OpenAPI openAPI) { super.setOpenAPI(openAPI); + Components components = openAPI.getComponents(); + if (components != null && components.getSecuritySchemes() != null) { + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/SecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "SecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/ApiKeyInLocation.hbs", + packagePath() + File.separatorChar + "securityschemes", + "ApiKeyInLocation.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/ApiKeySecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "ApiKeySecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/HttpBasicSecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "HttpBasicSecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/HttpBearerSecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "HttpBearerSecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/HttpSignatureSecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "HttpSignatureSecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/HttpDigestSecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "HttpDigestSecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/MutualTlsSecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "MutualTlsSecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/OAuth2SecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "OAuth2SecurityScheme.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/securityschemes/OpenIdConnectSecurityScheme.hbs", + packagePath() + File.separatorChar + "securityschemes", + "OpenIdConnectSecurityScheme.java")); + + jsonPathTemplateFiles.put( + CodegenConstants.JSON_PATH_LOCATION_TYPE.SECURITY_SCHEME, + new HashMap<>() {{ + put("src/main/java/packagename/components/securityschemes/SecurityScheme.hbs", ".java"); + }} + ); + jsonPathDocTemplateFiles.put( + CodegenConstants.JSON_PATH_LOCATION_TYPE.SECURITY_SCHEME, + new HashMap<>() {{ + put("src/main/java/packagename/components/securityschemes/SecurityScheme_doc.hbs", ".md"); + }} + ); + } List servers = openAPI.getServers(); if (servers != null && !servers.isEmpty()) { supportingFiles.add(new SupportingFile( diff --git a/src/main/resources/java/README.hbs b/src/main/resources/java/README.hbs index 8dbee186824..5ecb8415274 100644 --- a/src/main/resources/java/README.hbs +++ b/src/main/resources/java/README.hbs @@ -173,6 +173,18 @@ allowed input and output types. {{/with}} {{/each}} {{/if}} +{{#if securitySchemes}} + +## Component SecuritySchemes + +| Class | Description | +| ----- | ----------- | + {{#each securitySchemes}} + {{#with this}} +| [{{jsonPathPiece.pascalCase}}](docs/components/securityschemes/{{jsonPathPiece.snakeCase}}.md) |{{#if description}} {{description.originalWithBr}}{{/if}} | + {{/with}} + {{/each}} +{{/if}} {{#if infoEmail}} ## Author diff --git a/src/main/resources/java/src/main/java/packagename/components/securityschemes/SecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/components/securityschemes/SecurityScheme.hbs new file mode 100644 index 00000000000..19f3403c9ea --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/securityschemes/SecurityScheme.hbs @@ -0,0 +1,119 @@ +package {{packageName}}.components.securityschemes; + +{{#with securityScheme}} + {{#if refInfo}} + {{! todo handle this}} +// todo handle refed security schemes + + {{else}} + {{#eq type "apiKey"}} +import {{packageName}}.securityschemes.ApiKeySecurityScheme; +import {{packageName}}.securityschemes.ApiKeyInLocation; + {{else}} + {{#eq type "http"}} + {{#eq scheme "basic"}} +import {{packageName}}.securityschemes.HttpBasicSecurityScheme; + {{else}} + {{#eq scheme "bearer"}} +import {{packageName}}.securityschemes.HttpBearerSecurityScheme; + {{else}} + {{#eq scheme "signature"}} +import {{packageName}}.securityschemes.HttpSignatureSecurityScheme; + {{/eq}} + {{/eq}} + {{/eq}} + {{else}} + {{#eq type "mutualTLS"}} +import {{packageName}}.securityschemes.MutualTlsSecurityScheme; + {{else}} + {{#eq type "oauth2"}} +import {{packageName}}.securityschemes.OAuth2SecurityScheme; + {{else}} + {{#eq type "openIdConnect"}} +import {{packageName}}.securityschemes.OpenIdConnectSecurityScheme; + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + + {{#eq type "apiKey"}} +public class {{jsonPathPiece.pascalCase}} extends ApiKeySecurityScheme { + {{#if description}} + /* + {{description.original}} + */ + {{/if}} + {{#eq in "query"}} + public {{jsonPathPiece.pascalCase}}(String apiKey) { + super(apiKey, "{{{name}}}", ApiKeyInLocation.QUERY); + } + {{else}} + {{#eq in "header"}} + public {{jsonPathPiece.pascalCase}}(String apiKey) { + super(apiKey, "{{{name}}}", ApiKeyInLocation.HEADER); + } + {{else}} + {{#eq in "cookie"}} + public {{jsonPathPiece.pascalCase}}(String apiKey) { + super(apiKey, null, ApiKeyInLocation.COOKIE); + } + {{/eq}} + {{/eq}} + {{/eq}} +} + {{else}} + {{#eq type "http"}} +public class {{jsonPathPiece.pascalCase}} extends Http{{#eq scheme "basic"}}Basic{{/eq}}{{#eq scheme "bearer"}}Bearer{{/eq}}{{#eq scheme "signature"}}Signature{{/eq}}{{#eq scheme "digest"}}Digest{{/eq}}SecurityScheme { + {{#if description}} + /* + {{description.original}} + */ + {{/if}} + {{#eq scheme "basic"}} + public {{jsonPathPiece.pascalCase}}(String userId, String password) { + super(userId, password); + } + {{else}} + {{#eq scheme "bearer"}} + public {{jsonPathPiece.pascalCase}}(String accessToken) { + super(accessToken, "{{{bearerFormat}}}"); + } + {{/eq}} + {{/eq}} +} + {{else}} + {{#eq type "mutualTLS"}} +public class {{jsonPathPiece.pascalCase}} extends MutualTlsSecurityScheme { + {{#if description}} + /* + {{description.original}} + */ + {{/if}} +} + {{else}} + {{#eq type "oauth2"}} +public class {{jsonPathPiece.pascalCase}} extends OAuth2SecurityScheme { + {{#if description}} + /* + {{description.original}} + */ + {{/if}} + // todo add flows info +} + {{else}} + {{#eq type "openIdConnect"}} +public class {{jsonPathPiece.pascalCase}} extends OpenIdConnectSecurityScheme { + {{#if description}} + /* + {{description.original}} + */ + {{/if}} +} + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + {{/if}} +{{/with}} diff --git a/src/main/resources/java/src/main/java/packagename/components/securityschemes/SecurityScheme_doc.hbs b/src/main/resources/java/src/main/java/packagename/components/securityschemes/SecurityScheme_doc.hbs new file mode 100644 index 00000000000..e64665d75f8 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/securityschemes/SecurityScheme_doc.hbs @@ -0,0 +1,112 @@ +{{#with securityScheme}} + {{#if componentModule}} +{{packageName}}.components.securityschemes.{{jsonPathPiece.snakeCase}} + {{/if}} + {{#eq identifierPieces.size 0}} +{{> src/main/java/packagename/components/_helper_header_from_identifier_pieces identifierPieces=(append identifierPieces "SecurityScheme" jsonPathPiece) }} + {{/eq}} + {{#if refInfo}} +| Ref Class | Description | +| --------- | ----------- | +| [{{refInfo.refClass}}](../../components/security_schemes/{{refInfo.refModule}}.{{refInfo.refClass}}.md#) |{{#with getDeepestRef}}{{#if description}} {{description.originalWithBr}}{{/if}}{{/with}} + {{else}} + +public class {{containerJsonPathPiece.pascalCase}} {{jsonPathPiece.pascalCase}} + {{#eq type "apiKey"}} +extends ApiKeySecurityScheme + +{{> src/main/java/packagename/components/securityschemes/_doc_descMethods }} + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | + {{#eq in "query"}} +| {{jsonPathPiece.pascalCase}}(String apiKey)
for query apiKey auth | + {{else}} + {{#eq in "header"}} +| {{jsonPathPiece.pascalCase}}(String apiKey)
for header apiKey auth | + {{else}} + {{#eq in "cookie"}} +| {{jsonPathPiece.pascalCase}}(String apiKey)
for cookie apiKey auth | + {{/eq}} + {{/eq}} + {{/eq}} + {{else}} + {{#eq type "http"}} + {{#eq scheme "basic"}} +extends HttpBasicSecurityScheme + {{else}} + {{#eq scheme "bearer"}} +extends HttpBearerSecurityScheme + {{else}} + {{#eq scheme "digest"}} +extends HttpDigestSecurityScheme + {{else}} + {{#eq scheme "signature"}} +extends HttpSignatureSecurityScheme + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + +{{> src/main/java/packagename/components/securityschemes/_doc_descMethods }} + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | + {{#eq scheme "basic"}} +| {{jsonPathPiece.pascalCase}}(String userId, String password) | + {{else}} + {{#eq scheme "bearer"}} +| {{jsonPathPiece.pascalCase}}(String accessToken) | + {{else}} + {{#eq scheme "digest"}} +| todo | + {{else}} + {{#eq scheme "signature"}} +| todo | + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + {{else}} + {{#eq type "mutualTLS"}} +extends MutualTlsSecurityScheme + +{{> src/main/java/packagename/components/securityschemes/_doc_descMethods }} + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | +| todo | + {{else}} + {{#eq type "oauth2"}} +extends Oauth2SecurityScheme + +{{> src/main/java/packagename/components/securityschemes/_doc_descMethods }} + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | +| todo | + {{else}} + {{#eq type "openIdConnect"}} +extends OpenIdConnectSecurityScheme + +{{> src/main/java/packagename/components/securityschemes/_doc_descMethods }} + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | +| todo | + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + {{/eq}} + {{#if componentModule}} + +[[Back to top]](#top) {{> _helper_footer_links readmePath="../../../" securitySchemesLink=true}} + {{/if}} + {{/if}} +{{/with}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/components/securityschemes/_doc_descMethods.hbs b/src/main/resources/java/src/main/java/packagename/components/securityschemes/_doc_descMethods.hbs new file mode 100644 index 00000000000..1c8e6fdae62 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/securityschemes/_doc_descMethods.hbs @@ -0,0 +1,11 @@ +A class that is used to apply auth to a request +{{#if description}} + +{{headerSize}}## Description +{{description.originalWithBr}} +{{/if}} + +{{headerSize}}## Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| void | applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) | diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/ApiKeyInLocation.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/ApiKeyInLocation.hbs new file mode 100644 index 00000000000..5b6a521161b --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/ApiKeyInLocation.hbs @@ -0,0 +1,7 @@ +package {{{packageName}}}.securityschemes; + +public enum ApiKeyInLocation{ + QUERY, + HEADER, + COOKIE +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/ApiKeySecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/ApiKeySecurityScheme.hbs new file mode 100644 index 00000000000..9cca2f661fa --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/ApiKeySecurityScheme.hbs @@ -0,0 +1,35 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ApiKeySecurityScheme implements SecurityScheme { + private final String apiKey; + private final @Nullable String name; + private final ApiKeyInLocation inLocation; + + protected ApiKeySecurityScheme(String apiKey, @Nullable String name, ApiKeyInLocation inLocation) { + this.apiKey = apiKey; + this.name = name; + this.inLocation = inLocation; + } + + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + switch (inLocation) { + case COOKIE -> { + List cookieValue = headers.getOrDefault("Cookie", new ArrayList<>()); + cookieValue.add(apiKey); + } + case HEADER -> { + List headerValue = headers.getOrDefault(name, new ArrayList<>()); + headerValue.add(apiKey); + } + case QUERY -> throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/HttpBasicSecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpBasicSecurityScheme.hbs new file mode 100644 index 00000000000..d8c4ca8c5e5 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpBasicSecurityScheme.hbs @@ -0,0 +1,32 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; + +public class HttpBasicSecurityScheme implements SecurityScheme { + private final String userId; + private final String password; + /* + scheme = BASIC, type = HTTP + https://www.rfc-editor.org/rfc/rfc7617.html + */ + + public HttpBasicSecurityScheme(String userId, String password) { + this.userId = userId; + this.password = password; + } + + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + String userPass = userId + ":" + password; + String b64UserPass = Base64.getEncoder().encodeToString(userPass.getBytes(StandardCharsets.UTF_8)); + List headerValue = headers.getOrDefault("Authorization", new ArrayList<>()); + headerValue.add("Basic " + b64UserPass); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/HttpBearerSecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpBearerSecurityScheme.hbs new file mode 100644 index 00000000000..1144b5d2a91 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpBearerSecurityScheme.hbs @@ -0,0 +1,34 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Map; + +public class HttpBearerSecurityScheme implements SecurityScheme { + private final String accessToken; + private final @Nullable String bearerFormat; + /* + scheme = BEARER, type = HTTP + https://www.rfc-editor.org/rfc/rfc7617.html + */ + + protected HttpBearerSecurityScheme(String accessToken, @Nullable String bearerFormat) { + this.accessToken = accessToken; + this.bearerFormat = bearerFormat; + } + + protected HttpBearerSecurityScheme(String accessToken) { + this.accessToken = accessToken; + this.bearerFormat = null; + } + + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + List headerValue = headers.getOrDefault("Authorization", new ArrayList<>()); + headerValue.add("Bearer " + accessToken); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/HttpDigestSecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpDigestSecurityScheme.hbs new file mode 100644 index 00000000000..9eb3fa4738e --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpDigestSecurityScheme.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class HttpDigestSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/HttpSignatureSecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpSignatureSecurityScheme.hbs new file mode 100644 index 00000000000..3df20315d38 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/HttpSignatureSecurityScheme.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class HttpSignatureSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/MutualTlsSecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/MutualTlsSecurityScheme.hbs new file mode 100644 index 00000000000..6d864807363 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/MutualTlsSecurityScheme.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class MutualTlsSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/OAuth2SecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/OAuth2SecurityScheme.hbs new file mode 100644 index 00000000000..9b4c4501648 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/OAuth2SecurityScheme.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class OAuth2SecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/OpenIdConnectSecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/OpenIdConnectSecurityScheme.hbs new file mode 100644 index 00000000000..9eca2e03703 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/OpenIdConnectSecurityScheme.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public class OpenIdConnectSecurityScheme implements SecurityScheme { + @Override + public void applyAuth(Map> headers, String resourcePath, String method, HttpRequest.BodyPublisher bodyPublisher, @Nullable String queryParamsSuffix, List scopeNames) { + throw new UnsupportedOperationException("If you need this, submit a PR adding this feature"); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/securityschemes/SecurityScheme.hbs b/src/main/resources/java/src/main/java/packagename/securityschemes/SecurityScheme.hbs new file mode 100644 index 00000000000..78d57c6ce85 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/securityschemes/SecurityScheme.hbs @@ -0,0 +1,19 @@ +package {{{packageName}}}.securityschemes; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.http.HttpRequest; +import java.util.List; +import java.util.Map; + +public interface SecurityScheme { + void applyAuth( + Map> headers, + String resourcePath, + String method, + HttpRequest.BodyPublisher bodyPublisher, + @Nullable String queryParamsSuffix, + List scopeNames + ); +} +