From 59be28cc8a4018e4790a11473cbe4ff3fd28ddde Mon Sep 17 00:00:00 2001 From: Romain Bioteau Date: Mon, 13 Mar 2023 16:23:48 +0100 Subject: [PATCH] feat(password): add `isPassword` codegen property (#13982) Expose `isPassword` codegen property. This property can be used in the mustache templates to handle specific generation use case. _e.g._: * hiding the string value of password fields in generated toString() methods * use more specific types like `char[]` instead of `String` in [Java](https://stackoverflow.com/a/8881376) Closes https://github.com/OpenAPITools/openapi-generator/issues/9124 --- .../org/openapitools/codegen/CodegenParameter.java | 7 +++++-- .../org/openapitools/codegen/CodegenProperty.java | 5 ++++- .../org/openapitools/codegen/CodegenResponse.java | 5 ++++- .../java/org/openapitools/codegen/DefaultCodegen.java | 8 ++++++++ .../codegen/IJsonSchemaValidationProperties.java | 2 ++ .../org/openapitools/codegen/DefaultCodegenTest.java | 4 ++++ .../org/openapitools/codegen/java/JavaModelTest.java | 11 +++++++++++ 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java index ae723856989..53495455009 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenParameter.java @@ -35,7 +35,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { public String example; // example value (x-example) public String jsonSchema; public boolean isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, - isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isShort, isUnboundedInteger; + isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isPassword, isFreeFormObject, isAnyType, isShort, isUnboundedInteger; public boolean isArray, isMap; public boolean isFile; public boolean isEnum; @@ -229,6 +229,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { output.isUuid = this.isUuid; output.isUri = this.isUri; output.isEmail = this.isEmail; + output.isPassword = this.isPassword; output.isFreeFormObject = this.isFreeFormObject; output.isAnyType = this.isAnyType; output.isArray = this.isArray; @@ -244,7 +245,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { @Override public int hashCode() { - return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumDefaultValue, enumName, style, isDeepObject, isAllowEmptyValue, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content, requiredVarsMap, ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties); + return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumDefaultValue, enumName, style, isDeepObject, isAllowEmptyValue, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isPassword, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping, composedSchemas, hasMultipleTypes, schema, content, requiredVarsMap, ref, uniqueItemsBoolean, schemaIsFromAdditionalProperties); } @Override @@ -281,6 +282,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { isUuid == that.isUuid && isUri == that.isUri && isEmail == that.isEmail && + isPassword == that.isPassword && isFreeFormObject == that.isFreeFormObject && isAnyType == that.isAnyType && isArray == that.isArray && @@ -394,6 +396,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties { sb.append(", isUuid=").append(isUuid); sb.append(", isUri=").append(isUri); sb.append(", isEmail=").append(isEmail); + sb.append(", isPassword=").append(isPassword); sb.append(", isFreeFormObject=").append(isFreeFormObject); sb.append(", isAnyType=").append(isAnyType); sb.append(", isArray=").append(isArray); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java index 6362fb93d80..0c7e171850e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java @@ -134,6 +134,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti public boolean isUuid; public boolean isUri; public boolean isEmail; + public boolean isPassword; public boolean isNull; /** * The type is a free-form object, i.e. it is a map of string to values with no declared properties. @@ -1051,6 +1052,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti sb.append(", isUuid=").append(isUuid); sb.append(", isUri=").append(isUri); sb.append(", isEmail=").append(isEmail); + sb.append(", isPassword=").append(isPassword); sb.append(", isFreeFormObject=").append(isFreeFormObject); sb.append(", isArray=").append(isArray); sb.append(", isMap=").append(isMap); @@ -1142,6 +1144,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti isUuid == that.isUuid && isUri == that.isUri && isEmail == that.isEmail && + isPassword == that.isPassword && isFreeFormObject == that.isFreeFormObject && isArray == that.isArray && isMap == that.isMap && @@ -1231,7 +1234,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti exclusiveMinimum, exclusiveMaximum, required, deprecated, hasMoreNonReadOnly, isPrimitiveType, isModel, isContainer, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isFile, - isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, + isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isPassword, isFreeFormObject, isArray, isMap, isEnum, isInnerEnum, isEnumRef, isAnyType, isReadOnly, isWriteOnly, isNullable, isShort, isUnboundedInteger, isSelfReference, isCircularReference, isDiscriminator, isNew, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java index aa6b103b77c..edef0c709a3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java @@ -50,6 +50,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { public boolean isDateTime; public boolean isUuid; public boolean isEmail; + public boolean isPassword; public boolean isModel; public boolean isFreeFormObject; public boolean isAnyType; @@ -98,7 +99,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { public int hashCode() { return Objects.hash(headers, code, message, examples, dataType, baseType, containerType, hasHeaders, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBoolean, isDate, - isDateTime, isUuid, isEmail, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType, + isDateTime, isUuid, isEmail, isPassword, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType, isMap, isArray, isBinary, isFile, schema, jsonSchema, vendorExtensions, items, additionalProperties, vars, requiredVars, isNull, hasValidation, isShort, isUnboundedInteger, getMaxProperties(), getMinProperties(), uniqueItems, getMaxItems(), getMinItems(), getMaxLength(), @@ -130,6 +131,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { isDateTime == that.isDateTime && isUuid == that.isUuid && isEmail == that.isEmail && + isPassword == that.isPassword && isModel == that.isModel && isFreeFormObject == that.isFreeFormObject && isAnyType == that.isAnyType && @@ -568,6 +570,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { sb.append(", isDateTime=").append(isDateTime); sb.append(", isUuid=").append(isUuid); sb.append(", isEmail=").append(isEmail); + sb.append(", isPassword=").append(isPassword); sb.append(", isModel=").append(isModel); sb.append(", isFreeFormObject=").append(isFreeFormObject); sb.append(", isAnyType=").append(isAnyType); 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 42d80759838..b4c77fffd37 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 @@ -3680,6 +3680,8 @@ public class DefaultCodegen implements CodegenConfig { property.isUri = true; } else if (ModelUtils.isEmailSchema(p)) { property.isEmail = true; + } else if (ModelUtils.isPasswordSchema(p)) { + property.isPassword = true; } else if (ModelUtils.isDateSchema(p)) { // date format property.setIsString(false); // for backward compatibility with 2.x property.isDate = true; @@ -4738,6 +4740,8 @@ public class DefaultCodegen implements CodegenConfig { } else if (ModelUtils.isStringSchema(responseSchema)) { if (ModelUtils.isEmailSchema(responseSchema)) { r.isEmail = true; + } else if (ModelUtils.isPasswordSchema(responseSchema)) { + r.isPassword = true; } else if (ModelUtils.isUUIDSchema(responseSchema)) { r.isUuid = true; } else if (ModelUtils.isByteArraySchema(responseSchema)) { @@ -6286,6 +6290,8 @@ public class DefaultCodegen implements CodegenConfig { } if (Boolean.TRUE.equals(property.isEmail) && Boolean.TRUE.equals(property.isString)) { parameter.isEmail = true; + } else if (Boolean.TRUE.equals(property.isPassword) && Boolean.TRUE.equals(property.isPassword)) { + parameter.isPassword = true; } else if (Boolean.TRUE.equals(property.isUuid) && Boolean.TRUE.equals(property.isString)) { parameter.isUuid = true; } else if (Boolean.TRUE.equals(property.isByteArray)) { @@ -6801,6 +6807,8 @@ public class DefaultCodegen implements CodegenConfig { } else if (ModelUtils.isStringSchema(ps)) { if (ModelUtils.isEmailSchema(ps)) { codegenParameter.isEmail = true; + } else if (ModelUtils.isPasswordSchema(ps)) { + codegenParameter.isPassword = true; } else if (ModelUtils.isUUIDSchema(ps)) { codegenParameter.isUuid = true; } else if (ModelUtils.isByteArraySchema(ps)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java index d5e8f7faa1f..55dbcbac3d5 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java @@ -247,6 +247,8 @@ public interface IJsonSchemaValidationProperties { ; } else if (ModelUtils.isEmailSchema(p)) { ; + } else if (ModelUtils.isPasswordSchema(p)) { + ; } else if (ModelUtils.isDateSchema(p)) { ; } else if (ModelUtils.isDateTimeSchema(p)) { 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 cd4a82d15f0..369b99f2c38 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 @@ -2473,6 +2473,10 @@ public class DefaultCodegenTest { assertTrue(names.contains("password")); assertTrue(names.contains("passwordConfirmation")); assertTrue(names.contains("oldPassword")); + + Optional passwordParameter = operation.formParams.stream().filter(p -> "password".equals(p.paramName)).findFirst(); + assertTrue(passwordParameter.isPresent()); + assertTrue(passwordParameter.get().isPassword); } @Test diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java index 224d10975fd..e0b97f867df 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaModelTest.java @@ -1125,6 +1125,17 @@ public class JavaModelTest { Assert.assertEquals(cp.maxLength, Integer.valueOf(10)); Assert.assertEquals(cp.pattern, "^[A-Z]+$"); } + + @Test(description = "convert string property with password format") + public void stringPropertyPasswordFormatTest() { + OpenAPI openAPI = TestUtils.createOpenAPI(); + final Schema property = new StringSchema().format("password"); + final DefaultCodegen codegen = new JavaClientCodegen(); + codegen.setOpenAPI(openAPI); + + final CodegenProperty cp = codegen.fromProperty("somePropertyWithPasswordFormat", property); + Assert.assertEquals(cp.isPassword, true); + } @Test(description = "convert string property in an object") public void stringPropertyInObjectTest() {