Skip to content

Commit f96f3d0

Browse files
authored
Merge pull request #208 from atc-net/feature/security
Security fixes and updates for NotFound response types
2 parents b5d4e31 + bbfabff commit f96f3d0

File tree

313 files changed

+651
-1695
lines changed

Some content is hidden

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

313 files changed

+651
-1695
lines changed

src/Atc.Rest.ApiGenerator.Client.CSharp/ContentGenerators/ContentGeneratorClientEndpoint.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ public string Generate()
117117
case HttpStatusCode.OK:
118118
AppendAddSuccessResponseForStatusCodeOk(sb, responseModel);
119119
break;
120+
case HttpStatusCode.NotFound:
121+
if (string.IsNullOrEmpty(customErrorResponseModel))
122+
{
123+
sb.AppendLine(8, $"responseBuilder.AddErrorResponse<string?>(HttpStatusCode.{responseModel.StatusCode});");
124+
}
125+
else
126+
{
127+
sb.AppendLine(8, $"responseBuilder.AddErrorResponse<{customErrorResponseModel}>(HttpStatusCode.{responseModel.StatusCode});");
128+
}
129+
break;
120130
case HttpStatusCode.BadRequest:
121131
if (string.IsNullOrEmpty(customErrorResponseModel))
122132
{
@@ -153,7 +163,6 @@ public string Generate()
153163
case HttpStatusCode.Unauthorized:
154164
case HttpStatusCode.PaymentRequired:
155165
case HttpStatusCode.Forbidden:
156-
case HttpStatusCode.NotFound:
157166
case HttpStatusCode.MethodNotAllowed:
158167
case HttpStatusCode.NotAcceptable:
159168
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Client.CSharp/ContentGenerators/ContentGeneratorClientEndpointResult.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,13 @@ private void AppendContentWithProblemDetails(
236236
sb.AppendLine();
237237
AppendMethodContentStatusCodeOk(sb, responseModel);
238238
break;
239+
case HttpStatusCode.NotFound:
240+
sb.AppendLine();
241+
sb.AppendLine(4, $"public string? {responseModel.StatusCode.ToNormalizedString()}Content");
242+
sb.AppendLine(8, $"=> Is{responseModel.StatusCode.ToNormalizedString()} && ContentObject is string result");
243+
sb.AppendLine(12, "? result");
244+
sb.AppendLine(12, $": throw new InvalidOperationException(\"Content is not the expected type - please use the Is{responseModel.StatusCode.ToNormalizedString()} property first.\");");
245+
break;
239246
case HttpStatusCode.BadRequest:
240247
sb.AppendLine();
241248
sb.AppendLine(4, $"public ValidationProblemDetails {responseModel.StatusCode.ToNormalizedString()}Content");
@@ -270,7 +277,6 @@ private void AppendContentWithProblemDetails(
270277
case HttpStatusCode.Unauthorized:
271278
case HttpStatusCode.PaymentRequired:
272279
case HttpStatusCode.Forbidden:
273-
case HttpStatusCode.NotFound:
274280
case HttpStatusCode.MethodNotAllowed:
275281
case HttpStatusCode.NotAcceptable:
276282
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Client.CSharp/ContentGenerators/ContentGeneratorClientEndpointResultInterface.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ private void AppendContentWithProblemDetails(
211211
sb.AppendLine();
212212
AppendMethodContentStatusCodeOk(sb, responseModel);
213213
break;
214+
case HttpStatusCode.NotFound:
215+
sb.AppendLine();
216+
sb.AppendLine(4, $"string? {responseModel.StatusCode.ToNormalizedString()}Content {{ get; }}");
217+
break;
214218
case HttpStatusCode.BadRequest:
215219
sb.AppendLine();
216220
sb.AppendLine(4, $"ValidationProblemDetails {responseModel.StatusCode.ToNormalizedString()}Content {{ get; }}");
@@ -242,7 +246,6 @@ private void AppendContentWithProblemDetails(
242246
case HttpStatusCode.Unauthorized:
243247
case HttpStatusCode.PaymentRequired:
244248
case HttpStatusCode.Forbidden:
245-
case HttpStatusCode.NotFound:
246249
case HttpStatusCode.MethodNotAllowed:
247250
case HttpStatusCode.NotAcceptable:
248251
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Framework.Minimal/ContentGenerators/ContentGeneratorServerEndpoints.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ private static void AppendProducesWithProblemDetails(
202202
break;
203203
case HttpStatusCode.Accepted:
204204
case HttpStatusCode.Created:
205+
case HttpStatusCode.NotFound:
205206
sb.Append(12, $".Produces<string?>(StatusCodes.{responseModel.StatusCode.ToStatusCodesConstant()})");
206207
break;
207208
case HttpStatusCode.EarlyHints:
@@ -229,7 +230,6 @@ private static void AppendProducesWithProblemDetails(
229230
case HttpStatusCode.Unauthorized:
230231
case HttpStatusCode.PaymentRequired:
231232
case HttpStatusCode.Forbidden:
232-
case HttpStatusCode.NotFound:
233233
case HttpStatusCode.MethodNotAllowed:
234234
case HttpStatusCode.NotAcceptable:
235235
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Framework.Minimal/ContentGenerators/ContentGeneratorServerResult.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,12 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
144144
case HttpStatusCode.Accepted:
145145
case HttpStatusCode.Created:
146146
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? uri = null)");
147-
sb.AppendLine(8, $"=> new(Results.Problem(uri, null, StatusCodes.{item.ResponseModel.StatusCode.ToStatusCodesConstant()}));");
147+
sb.AppendLine(8, $"=> new(TypedResults.{item.ResponseModel.StatusCode}(uri));");
148148
break;
149149
case HttpStatusCode.NotFound:
150+
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
151+
sb.AppendLine(8, $"=> new(TypedResults.{item.ResponseModel.StatusCode}(message));");
152+
break;
150153
case HttpStatusCode.Conflict:
151154
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
152155
sb.AppendLine(8, $"=> new(Results.Problem(message, null, StatusCodes.{item.ResponseModel.StatusCode.ToStatusCodesConstant()}));");

src/Atc.Rest.ApiGenerator.Framework.Minimal/ProjectGenerator/ServerApiGenerator.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,6 @@ public void MaintainGlobalUsings(
351351
requiredUsings.Add("Atc.Rest.MinimalApi.Filters.Endpoints");
352352
}
353353

354-
// TODO: Check for any use ??
355-
requiredUsings.Add("Microsoft.AspNetCore.Authorization");
356-
357354
if (operationSchemaMappings.Any(apiOperation => apiOperation.Model.IsShared))
358355
{
359356
requiredUsings.Add($"{projectName}.{ContentGeneratorConstants.Contracts}");

src/Atc.Rest.ApiGenerator.Framework.Mvc/ContentGenerators/ContentGeneratorServerController.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ private static void AppendProducesWithProblemDetails(
130130
case HttpStatusCode.OK:
131131
AppendProducesForOk(sb, responseModel);
132132
break;
133+
case HttpStatusCode.NotFound:
134+
sb.AppendLine(4, $"[ProducesResponseType(typeof(string), StatusCodes.{responseModel.StatusCode.ToStatusCodesConstant()})]");
135+
break;
133136
case HttpStatusCode.BadRequest:
134137
sb.AppendLine(4, $"[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.{responseModel.StatusCode.ToStatusCodesConstant()})]");
135138
break;
@@ -160,7 +163,6 @@ private static void AppendProducesWithProblemDetails(
160163
case HttpStatusCode.Unauthorized:
161164
case HttpStatusCode.PaymentRequired:
162165
case HttpStatusCode.Forbidden:
163-
case HttpStatusCode.NotFound:
164166
case HttpStatusCode.MethodNotAllowed:
165167
case HttpStatusCode.NotAcceptable:
166168
case HttpStatusCode.ProxyAuthenticationRequired:

src/Atc.Rest.ApiGenerator.Framework.Mvc/ContentGenerators/ContentGeneratorServerResult.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ private void AppendMethodContent(
8383
{
8484
if (useProblemDetailsAsDefaultResponseBody)
8585
{
86-
AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(sb, item, resultName);
86+
AppendMethodContentForOtherStatusCodesThanOkWithProblemDetails(sb, item, resultName);
8787
}
8888
else
8989
{
90-
AppendMethodContentForOtherStatusCodesThenOkWithoutProblemDetails(sb, item, resultName);
90+
AppendMethodContentForOtherStatusCodesThanOkWithoutProblemDetails(sb, item, resultName);
9191
}
9292
}
9393
}
@@ -146,7 +146,7 @@ private void AppendMethodContentStatusCodeOk(
146146
}
147147
}
148148

149-
private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
149+
private void AppendMethodContentForOtherStatusCodesThanOkWithProblemDetails(
150150
StringBuilder sb,
151151
ContentGeneratorServerResultMethodParameters item,
152152
string resultName)
@@ -160,6 +160,10 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
160160
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? uri = null)");
161161
sb.AppendLine(8, $"=> new {resultName}({nameof(Results.ResultFactory)}.{nameof(Results.ResultFactory.CreateContentResult)}({nameof(HttpStatusCode)}.{item.ResponseModel.StatusCode}, uri));");
162162
break;
163+
case HttpStatusCode.NotFound:
164+
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
165+
sb.AppendLine(8, $"=> new {resultName}(new {item.ResponseModel.StatusCode.ToNormalizedString()}ObjectResult(message));");
166+
break;
163167
case HttpStatusCode.BadRequest:
164168
sb.AppendLine(4, $"public static {resultName} {item.ResponseModel.StatusCode.ToNormalizedString()}(string? message = null)");
165169
sb.AppendLine(8, $"=> new {resultName}({nameof(Results.ResultFactory)}.{nameof(Results.ResultFactory.CreateContentResultWithValidationProblemDetails)}({nameof(HttpStatusCode)}.{item.ResponseModel.StatusCode}, message));");
@@ -190,7 +194,6 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
190194
case HttpStatusCode.Unauthorized:
191195
case HttpStatusCode.PaymentRequired:
192196
case HttpStatusCode.Forbidden:
193-
case HttpStatusCode.NotFound:
194197
case HttpStatusCode.MethodNotAllowed:
195198
case HttpStatusCode.NotAcceptable:
196199
case HttpStatusCode.ProxyAuthenticationRequired:
@@ -233,7 +236,7 @@ private void AppendMethodContentForOtherStatusCodesThenOkWithProblemDetails(
233236
}
234237
}
235238

236-
private void AppendMethodContentForOtherStatusCodesThenOkWithoutProblemDetails(
239+
private void AppendMethodContentForOtherStatusCodesThanOkWithoutProblemDetails(
237240
StringBuilder sb,
238241
ContentGeneratorServerResultMethodParameters item,
239242
string resultName)

src/Atc.Rest.ApiGenerator.Framework/Helpers/StringBuilderEndpointHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public static void AppendMethodContentAuthorizationIfNeeded(
3838
var authRoles = authorizationForEndpoint.Roles is null
3939
? null
4040
: string.Join(',', authorizationForEndpoint.Roles);
41+
4142
var authSchemes = authorizationForEndpoint.AuthenticationSchemes is null
4243
? null
4344
: string.Join(',', authorizationForEndpoint.AuthenticationSchemes);

src/Atc.Rest.ApiGenerator.OpenApi/Extensions/OpenApiDocumentExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ public static bool IsUsingRequiredForMicrosoftAspNetCoreAuthorization(
364364
foreach (var openApiPath in openApiDocument.Paths)
365365
{
366366
var isAuthenticationRequired = openApiPath.Value.Extensions.ExtractAuthenticationRequired();
367-
if (isAuthenticationRequired is not null && isAuthenticationRequired.Value)
367+
if (isAuthenticationRequired is not null)
368368
{
369369
return true;
370370
}
@@ -377,7 +377,7 @@ public static bool IsUsingRequiredForMicrosoftAspNetCoreAuthorization(
377377
}
378378

379379
var isOperationAuthenticationRequired = apiOperationPair.Value.Extensions.ExtractAuthenticationRequired();
380-
if (isOperationAuthenticationRequired is not null && isOperationAuthenticationRequired.Value)
380+
if (isOperationAuthenticationRequired is not null)
381381
{
382382
return true;
383383
}

0 commit comments

Comments
 (0)