[kotlin][client] fix Android crash on API level 25 and bellow (#9578)

* [kotlin][client] fix Android crash on API level

* [kotlin][client] update sample project

* Try to fix CI

* [kotlin][client] add flag to control android api level supported

* [kotlin][client] update docs

* [kotlin][client] update docs
This commit is contained in:
Bruno Coelho 2021-05-26 11:24:52 +01:00 committed by GitHub
parent a1f539ce6e
commit 163d13e415
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 38 additions and 26 deletions

View File

@ -6,3 +6,4 @@ additionalProperties:
requestDateConverter: toString
artifactId: kotlin-petstore-json-request-string
parcelizeModels: true
supportAndroidApiLevel25AndBelow: true

View File

@ -25,6 +25,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |null|
|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |null|
|sourceFolder|source folder for generated code| |src/main/kotlin|
|supportAndroidApiLevel25AndBelow|[WARNING] This flag will generate code that has a known security vulnerability. It uses `kotlin.io.createTempFile` instead of `java.nio.file.Files.createTempFile` in oder to support Android API level 25 and bellow. For more info, please check the following links https://github.com/OpenAPITools/openapi-generator/security/advisories/GHSA-23x4-m842-fmwf, https://github.com/OpenAPITools/openapi-generator/pull/9284| |false|
|useCoroutines|Whether to use the Coroutines adapter with the retrofit2 library.| |false|
|useRxJava|Whether to use the RxJava adapter with the retrofit2 library.| |false|
|useRxJava2|Whether to use the RxJava2 adapter with the retrofit2 library.| |false|

View File

@ -63,6 +63,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
public static final String MOSHI_CODE_GEN = "moshiCodeGen";
public static final String SUPPORT_ANDROID_API_LEVEL_25_AND_BELLOW = "supportAndroidApiLevel25AndBelow";
protected static final String VENDOR_EXTENSION_BASE_NAME_LITERAL = "x-base-name-literal";
protected String dateLibrary = DateLibrary.JAVA8.value;
@ -208,6 +210,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
cliOptions.add(CliOption.newBoolean(USE_COROUTINES, "Whether to use the Coroutines adapter with the retrofit2 library."));
cliOptions.add(CliOption.newBoolean(MOSHI_CODE_GEN, "Whether to enable codegen with the Moshi library. Refer to the [official Moshi doc](https://github.com/square/moshi#codegen) for more info."));
cliOptions.add(CliOption.newBoolean(SUPPORT_ANDROID_API_LEVEL_25_AND_BELLOW, "[WARNING] This flag will generate code that has a known security vulnerability. It uses `kotlin.io.createTempFile` instead of `java.nio.file.Files.createTempFile` in oder to support Android API level 25 and bellow. For more info, please check the following links https://github.com/OpenAPITools/openapi-generator/security/advisories/GHSA-23x4-m842-fmwf, https://github.com/OpenAPITools/openapi-generator/pull/9284"));
}
public CodegenType getTag() {

View File

@ -1,5 +1,8 @@
package {{packageName}}.infrastructure
{{#supportAndroidApiLevel25AndBelow}}
import android.os.Build
{{/supportAndroidApiLevel25AndBelow}}
import okhttp3.Credentials
import okhttp3.OkHttpClient
import okhttp3.RequestBody
@ -28,7 +31,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
{{^threetenbp}}
import java.time.LocalDate
@ -176,7 +178,17 @@ import org.threeten.bp.OffsetTime
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.{{packageName}}", null).toFile()
{{^supportAndroidApiLevel25AndBelow}}
val f = java.nio.file.Files.createTempFile("tmp.{{packageName}}", null).toFile()
{{/supportAndroidApiLevel25AndBelow}}
{{#supportAndroidApiLevel25AndBelow}}
val f = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
java.nio.file.Files.createTempFile("tmp.net.medicineone.teleconsultationandroid.openapi.openapicommon", null).toFile()
} else {
@Suppress("DEPRECATION")
createTempFile("tmp.net.medicineone.teleconsultationandroid.openapi.openapicommon", null)
}
{{/supportAndroidApiLevel25AndBelow}}
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -1,5 +1,6 @@
package org.openapitools.client.infrastructure
import android.os.Build
import okhttp3.Credentials
import okhttp3.OkHttpClient
import okhttp3.RequestBody
@ -16,7 +17,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +119,12 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
java.nio.file.Files.createTempFile("tmp.net.medicineone.teleconsultationandroid.openapi.openapicommon", null).toFile()
} else {
@Suppress("DEPRECATION")
createTempFile("tmp.net.medicineone.teleconsultationandroid.openapi.openapicommon", null)
}
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ internal open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -14,7 +14,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -117,7 +116,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import org.threeten.bp.LocalDate
import org.threeten.bp.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)

View File

@ -16,7 +16,6 @@ import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import java.net.URLConnection
import java.nio.file.Files
import java.util.Date
import java.time.LocalDate
import java.time.LocalDateTime
@ -119,7 +118,7 @@ open class ApiClient(val baseUrl: String) {
}
if (T::class.java == File::class.java) {
// return tempfile
val f = Files.createTempFile("tmp.org.openapitools.client", null).toFile()
val f = java.nio.file.Files.createTempFile("tmp.org.openapitools.client", null).toFile()
f.deleteOnExit()
val out = BufferedWriter(FileWriter(f))
out.write(bodyContent)