aboutsummaryrefslogtreecommitdiff
path: root/Timeline/Filters
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-10-31 15:02:03 +0800
committerGitHub <noreply@github.com>2019-10-31 15:02:03 +0800
commit37a2e6340ab20de1f9e847d795c0cbec9846de97 (patch)
treeba42530cf4f13621a7a3a7ff661e383117119883 /Timeline/Filters
parenta175f8328d7a6c36464676d54fc50d03e64be0af (diff)
parent2c3744ab5db476b64a32c19b50153e3e6166b0e6 (diff)
downloadtimeline-37a2e6340ab20de1f9e847d795c0cbec9846de97.tar.gz
timeline-37a2e6340ab20de1f9e847d795c0cbec9846de97.tar.bz2
timeline-37a2e6340ab20de1f9e847d795c0cbec9846de97.zip
Merge pull request #53 from crupest/nickname
Add nickname support.
Diffstat (limited to 'Timeline/Filters')
-rw-r--r--Timeline/Filters/ContentHeaderAttributes.cs52
-rw-r--r--Timeline/Filters/Header.cs99
-rw-r--r--Timeline/Filters/User.cs88
3 files changed, 187 insertions, 52 deletions
diff --git a/Timeline/Filters/ContentHeaderAttributes.cs b/Timeline/Filters/ContentHeaderAttributes.cs
deleted file mode 100644
index 99bd1540..00000000
--- a/Timeline/Filters/ContentHeaderAttributes.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Localization;
-using Timeline.Models.Http;
-
-namespace Timeline.Filters
-{
- public class RequireContentTypeAttribute : ActionFilterAttribute
- {
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
- public override void OnActionExecuting(ActionExecutingContext context)
- {
- if (context.HttpContext.Request.ContentType == null)
- {
- context.Result = new BadRequestObjectResult(HeaderErrorResponse.MissingContentType());
- }
- }
- }
-
- public class RequireContentLengthAttribute : ActionFilterAttribute
- {
- public RequireContentLengthAttribute()
- : this(true)
- {
-
- }
-
- public RequireContentLengthAttribute(bool requireNonZero)
- {
- RequireNonZero = requireNonZero;
- }
-
- public bool RequireNonZero { get; set; }
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
- public override void OnActionExecuting(ActionExecutingContext context)
- {
- if (context.HttpContext.Request.ContentLength == null)
- {
- context.Result = new BadRequestObjectResult(HeaderErrorResponse.MissingContentLength());
- return;
- }
-
- if (RequireNonZero && context.HttpContext.Request.ContentLength.Value == 0)
- {
- context.Result = new BadRequestObjectResult(HeaderErrorResponse.ZeroContentLength());
- return;
- }
- }
- }
-}
diff --git a/Timeline/Filters/Header.cs b/Timeline/Filters/Header.cs
new file mode 100644
index 00000000..f5fb16aa
--- /dev/null
+++ b/Timeline/Filters/Header.cs
@@ -0,0 +1,99 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+using Timeline.Models.Http;
+using static Timeline.Resources.Filters;
+
+namespace Timeline
+{
+ public static partial class ErrorCodes
+ {
+ public static partial class Http
+ {
+ public static partial class Filter // bxx = 1xx
+ {
+ public static partial class Header // bbb = 100
+ {
+ public static class ContentType // cc = 01
+ {
+ public const int Missing = 11000101; // dd = 01
+ }
+
+ public static class ContentLength // cc = 02
+ {
+ public const int Missing = 11000201; // dd = 01
+ public const int Zero = 11000202; // dd = 02
+ }
+ }
+ }
+
+ }
+ }
+}
+
+namespace Timeline.Filters
+{
+ public class RequireContentTypeAttribute : ActionFilterAttribute
+ {
+ internal static CommonResponse CreateResponse()
+ {
+ return new CommonResponse(
+ ErrorCodes.Http.Filter.Header.ContentType.Missing,
+ MessageHeaderContentTypeMissing);
+ }
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
+ public override void OnActionExecuting(ActionExecutingContext context)
+ {
+ if (context.HttpContext.Request.ContentType == null)
+ {
+ context.Result = new BadRequestObjectResult(CreateResponse());
+ }
+ }
+ }
+
+ public class RequireContentLengthAttribute : ActionFilterAttribute
+ {
+ internal static CommonResponse CreateMissingResponse()
+ {
+ return new CommonResponse(
+ ErrorCodes.Http.Filter.Header.ContentLength.Missing,
+ MessageHeaderContentLengthMissing);
+ }
+
+ internal static CommonResponse CreateZeroResponse()
+ {
+ return new CommonResponse(
+ ErrorCodes.Http.Filter.Header.ContentLength.Zero,
+ MessageHeaderContentLengthZero);
+ }
+
+ public RequireContentLengthAttribute()
+ : this(true)
+ {
+
+ }
+
+ public RequireContentLengthAttribute(bool requireNonZero)
+ {
+ RequireNonZero = requireNonZero;
+ }
+
+ public bool RequireNonZero { get; set; }
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
+ public override void OnActionExecuting(ActionExecutingContext context)
+ {
+ if (context.HttpContext.Request.ContentLength == null)
+ {
+ context.Result = new BadRequestObjectResult(CreateMissingResponse());
+ return;
+ }
+
+ if (RequireNonZero && context.HttpContext.Request.ContentLength.Value == 0)
+ {
+ context.Result = new BadRequestObjectResult(CreateZeroResponse());
+ return;
+ }
+ }
+ }
+}
diff --git a/Timeline/Filters/User.cs b/Timeline/Filters/User.cs
new file mode 100644
index 00000000..16c76750
--- /dev/null
+++ b/Timeline/Filters/User.cs
@@ -0,0 +1,88 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using System;
+using Timeline.Auth;
+using Timeline.Models.Http;
+using Timeline.Services;
+using static Timeline.Resources.Filters;
+
+namespace Timeline
+{
+ public static partial class ErrorCodes
+ {
+ public static partial class Http
+ {
+ public static partial class Filter // bxx = 1xx
+ {
+ public static class User // bbb = 101
+ {
+ public const int NotExist = 11010101;
+
+ public const int NotSelfOrAdminForbid = 11010201;
+ }
+ }
+ }
+ }
+}
+
+namespace Timeline.Filters
+{
+ public class SelfOrAdminAttribute : ActionFilterAttribute
+ {
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
+ public override void OnActionExecuting(ActionExecutingContext context)
+ {
+ var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<SelfOrAdminAttribute>>();
+
+ var user = context.HttpContext.User;
+
+ if (user == null)
+ {
+ logger.LogError(LogSelfOrAdminNoUser);
+ return;
+ }
+
+ if (context.ModelState.TryGetValue("username", out var model))
+ {
+ if (model.RawValue is string username)
+ {
+ if (!user.IsAdministrator() && user.Identity.Name != username)
+ {
+ context.Result = new ObjectResult(
+ new CommonResponse(ErrorCodes.Http.Filter.User.NotSelfOrAdminForbid, MessageSelfOrAdminForbid))
+ { StatusCode = StatusCodes.Status403Forbidden };
+ }
+ }
+ else
+ {
+ logger.LogError(LogSelfOrAdminUsernameNotString);
+ }
+ }
+ else
+ {
+ logger.LogError(LogSelfOrAdminNoUsername);
+ }
+ }
+ }
+
+ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
+ public class CatchUserNotExistExceptionAttribute : ExceptionFilterAttribute
+ {
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods", Justification = "ASP.Net already checked.")]
+ public override void OnException(ExceptionContext context)
+ {
+ if (context.Exception is UserNotExistException)
+ {
+ var body = new CommonResponse(ErrorCodes.Http.Filter.User.NotExist, MessageUserNotExist);
+
+ if (context.HttpContext.Request.Method == "GET")
+ context.Result = new NotFoundObjectResult(body);
+ else
+ context.Result = new BadRequestObjectResult(body);
+ }
+ }
+ }
+}