From 3b753877241838c52fb0f8925f408239d5345739 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" <sora.akatsuki@gmail.com> Date: Tue, 26 Jun 2018 07:22:10 +0900 Subject: [PATCH 1/7] Add `appDescriptionWithNewLines` --- .../openapitools/codegen/CodegenConfig.java | 2 ++ .../openapitools/codegen/DefaultCodegen.java | 19 +++++++++++++++++++ .../codegen/DefaultGenerator.java | 1 + .../codegen/DefaultCodegenTest.java | 15 +++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java index fef5d1f510a..e8bb770fba6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java @@ -75,6 +75,8 @@ public interface CodegenConfig { String escapeText(String text); + String escapeTextWhileAllowingNewLines(String text); + String escapeUnsafeCharacters(String input); String escapeReservedWord(String name); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 2a5a3b7f43e..e060d658806 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -415,6 +415,25 @@ public class DefaultCodegen implements CodegenConfig { .replace("\"", "\\\"")); } + public String escapeTextWhileAllowingNewLines(String input) { + if (input == null) { + return input; + } + + // remove \t + // replace \ with \\ + // replace " with \" + // outter unescape to retain the original multi-byte characters + // finally escalate characters avoiding code injection + return escapeUnsafeCharacters( + StringEscapeUtils.unescapeJava( + StringEscapeUtils.escapeJava(input) + .replace("\\/", "/")) + .replaceAll("[\\t]", " ") + .replace("\\", "\\\\") + .replace("\"", "\\\"")); + } + /** * override with any special text escaping logic to handle unsafe * characters so as to avoid code injection diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 228d1ac59be..606c5077ccf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -219,6 +219,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { config.additionalProperties().put("unescapedAppDescription", "No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)"); } else { config.additionalProperties().put("appDescription", config.escapeText(info.getDescription())); + config.additionalProperties().put("appDescriptionWithNewLines", config.escapeTextWhileAllowingNewLines(info.getDescription())); config.additionalProperties().put("unescapedAppDescription", info.getDescription()); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 104f7ce5d5a..b12791c3d73 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -214,4 +214,19 @@ public class DefaultCodegenTest { Assert.assertNotNull(type); } + + @Test + public void testEscapeTextWhileAllowingNewLines() { + final DefaultCodegen codegen = new DefaultCodegen(); + + // allow new lines + Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\n"), "\n"); + Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\r"), "\r"); + + // escape other special characters + Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\t"), " "); + Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\\"), "\\\\"); + Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\""), "\\\""); + Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\\/"), "/"); + } } -- GitLab From 2aa3fe03d2973aa91677f72aaa39b341ad625fac Mon Sep 17 00:00:00 2001 From: ackintosh <sora.akatsuki@gmail.com> Date: Tue, 26 Jun 2018 12:57:25 +0900 Subject: [PATCH 2/7] Add test case for escapeText as well --- .../org/openapitools/codegen/DefaultCodegenTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index b12791c3d73..c521a584072 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -215,6 +215,18 @@ public class DefaultCodegenTest { Assert.assertNotNull(type); } + @Test + public void testEscapeText() { + final DefaultCodegen codegen = new DefaultCodegen(); + + Assert.assertEquals(codegen.escapeText("\n"), " "); + Assert.assertEquals(codegen.escapeText("\r"), " "); + Assert.assertEquals(codegen.escapeText("\t"), " "); + Assert.assertEquals(codegen.escapeText("\\"), "\\\\"); + Assert.assertEquals(codegen.escapeText("\""), "\\\""); + Assert.assertEquals(codegen.escapeText("\\/"), "/"); + } + @Test public void testEscapeTextWhileAllowingNewLines() { final DefaultCodegen codegen = new DefaultCodegen(); -- GitLab From 056461e524bcc61218bc20fd879e38c178d87b87 Mon Sep 17 00:00:00 2001 From: ackintosh <sora.akatsuki@gmail.com> Date: Tue, 26 Jun 2018 13:34:08 +0900 Subject: [PATCH 3/7] Ruby client allows new lines in README --- .../src/main/resources/ruby/README.mustache | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/ruby/README.mustache b/modules/openapi-generator/src/main/resources/ruby/README.mustache index 42e0f170ccf..8703af147ad 100644 --- a/modules/openapi-generator/src/main/resources/ruby/README.mustache +++ b/modules/openapi-generator/src/main/resources/ruby/README.mustache @@ -2,9 +2,9 @@ {{moduleName}} - the Ruby gem for the {{appName}} -{{#appDescription}} -{{{appDescription}}} -{{/appDescription}} +{{#appDescriptionWithNewLines}} +{{{appDescriptionWithNewLines}}} +{{/appDescriptionWithNewLines}} This SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- GitLab From d8020ab143fa1c9517ffb137100435936ac8ab10 Mon Sep 17 00:00:00 2001 From: ackintosh <sora.akatsuki@gmail.com> Date: Tue, 26 Jun 2018 13:52:52 +0900 Subject: [PATCH 4/7] Add doc comment --- .../main/java/org/openapitools/codegen/DefaultCodegen.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index e060d658806..ad8fa17e653 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -415,6 +415,12 @@ public class DefaultCodegen implements CodegenConfig { .replace("\"", "\\\"")); } + /** + * Escape characters while allowing new lines + * + * @param input String to be escaped + * @return escaped string + */ public String escapeTextWhileAllowingNewLines(String input) { if (input == null) { return input; -- GitLab From a49c898516c0b78f36f18678d4b39fea9b3c2748 Mon Sep 17 00:00:00 2001 From: William Cheng <wing328hk@gmail.com> Date: Sun, 1 Jul 2018 17:41:00 +0800 Subject: [PATCH 5/7] fix issue related to github web gui --- .../test/java/org/openapitools/codegen/DefaultCodegenTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 38960dd755a..7c866dab664 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -260,6 +260,7 @@ public class DefaultCodegenTest { Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\\"), "\\\\"); Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\""), "\\\""); Assert.assertEquals(codegen.escapeTextWhileAllowingNewLines("\\/"), "/"); + } @Test public void updateCodegenPropertyEnum() { -- GitLab From 14b2c10be780ba888cbbcf1dc53acbd38de97ca1 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" <sora.akatsuki@gmail.com> Date: Sun, 1 Jul 2018 19:35:20 +0900 Subject: [PATCH 6/7] the case of no description provided --- .../src/main/java/org/openapitools/codegen/DefaultGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 606c5077ccf..4d9c9bcc385 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -216,6 +216,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { // set a default description if none if provided config.additionalProperties().put("appDescription", "No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)"); + config.additionalProperties().put("appDescriptionWithNewLines", config.additionalProperties().get("appDescription")); config.additionalProperties().put("unescapedAppDescription", "No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)"); } else { config.additionalProperties().put("appDescription", config.escapeText(info.getDescription())); -- GitLab From 5ae80e5edec346d407760fb35eba0d68f51ba0ef Mon Sep 17 00:00:00 2001 From: "akihito.nakano" <sora.akatsuki@gmail.com> Date: Sun, 1 Jul 2018 20:21:16 +0900 Subject: [PATCH 7/7] Run `./bin/utils/ensure-up-to-date` https://app.shippable.com/github/OpenAPITools/openapi-generator/runs/1118/1/console --- .../src/gen/java/org/openapitools/api/PetApi.java | 2 +- .../src/gen/java/org/openapitools/api/PetApi.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/server/petstore/jaxrs/jersey1-useTags/src/gen/java/org/openapitools/api/PetApi.java b/samples/server/petstore/jaxrs/jersey1-useTags/src/gen/java/org/openapitools/api/PetApi.java index 9ad52e5c774..c538b127fc4 100644 --- a/samples/server/petstore/jaxrs/jersey1-useTags/src/gen/java/org/openapitools/api/PetApi.java +++ b/samples/server/petstore/jaxrs/jersey1-useTags/src/gen/java/org/openapitools/api/PetApi.java @@ -190,7 +190,7 @@ public class PetApi { return delegate.uploadFile(petId,additionalMetadata,inputStream, fileDetail,securityContext); } @POST - + @Path("/{petId}/uploadImageWithRequiredFile") @Consumes({ "multipart/form-data" }) @Produces({ "application/json" }) @io.swagger.annotations.ApiOperation(value = "uploads an image", notes = "", response = ModelApiResponse.class, authorizations = { diff --git a/samples/server/petstore/jaxrs/jersey2-useTags/src/gen/java/org/openapitools/api/PetApi.java b/samples/server/petstore/jaxrs/jersey2-useTags/src/gen/java/org/openapitools/api/PetApi.java index 3a8d6f1c2c1..8172cd1ea2f 100644 --- a/samples/server/petstore/jaxrs/jersey2-useTags/src/gen/java/org/openapitools/api/PetApi.java +++ b/samples/server/petstore/jaxrs/jersey2-useTags/src/gen/java/org/openapitools/api/PetApi.java @@ -209,7 +209,7 @@ public class PetApi { return delegate.uploadFile(petId,additionalMetadata,fileInputStream, fileDetail,securityContext); } @POST - + @Path("/{petId}/uploadImageWithRequiredFile") @Consumes({ "multipart/form-data" }) @Produces({ "application/json" }) @io.swagger.annotations.ApiOperation(value = "uploads an image", notes = "", response = ModelApiResponse.class, authorizations = { -- GitLab