From dd09482bd59384e23bfc26253f2af4e346520ef9 Mon Sep 17 00:00:00 2001 From: furu04 Date: Tue, 13 Jan 2026 09:56:50 +0900 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=85=A8=E6=80=A7=E3=82=92=E5=90=91?= =?UTF-8?q?=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/api_handler.go | 11 ++ internal/handler/assignment_handler.go | 22 +++ internal/validation/validation.go | 201 +++++++++++++++++++++++++ web/static/js/app.js | 48 ++++-- 4 files changed, 272 insertions(+), 10 deletions(-) create mode 100644 internal/validation/validation.go diff --git a/internal/handler/api_handler.go b/internal/handler/api_handler.go index 8865c52..cec11bf 100644 --- a/internal/handler/api_handler.go +++ b/internal/handler/api_handler.go @@ -7,6 +7,7 @@ import ( "homework-manager/internal/middleware" "homework-manager/internal/service" + "homework-manager/internal/validation" "github.com/gin-gonic/gin" ) @@ -264,6 +265,11 @@ func (h *APIHandler) CreateAssignment(c *gin.Context) { return } + if err := validation.ValidateAssignmentInput(input.Title, input.Description, input.Subject, input.Priority); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + dueDate, err := parseDateString(input.DueDate) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid due_date format. Use RFC3339 or 2006-01-02T15:04"}) @@ -386,6 +392,11 @@ func (h *APIHandler) UpdateAssignment(c *gin.Context) { return } + if err := validation.ValidateAssignmentInput(input.Title, input.Description, input.Subject, input.Priority); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + title := input.Title if title == "" { title = existing.Title diff --git a/internal/handler/assignment_handler.go b/internal/handler/assignment_handler.go index cfe45b9..e5f865e 100644 --- a/internal/handler/assignment_handler.go +++ b/internal/handler/assignment_handler.go @@ -9,6 +9,7 @@ import ( "homework-manager/internal/middleware" "homework-manager/internal/models" "homework-manager/internal/service" + "homework-manager/internal/validation" "github.com/gin-gonic/gin" ) @@ -126,6 +127,22 @@ func (h *AssignmentHandler) Create(c *gin.Context) { priority := c.PostForm("priority") dueDateStr := c.PostForm("due_date") + if err := validation.ValidateAssignmentInput(title, description, subject, priority); err != nil { + role, _ := c.Get(middleware.UserRoleKey) + name, _ := c.Get(middleware.UserNameKey) + RenderHTML(c, http.StatusOK, "assignments/new.html", gin.H{ + "title": "課題登録", + "error": err.Error(), + "formTitle": title, + "description": description, + "subject": subject, + "priority": priority, + "isAdmin": role == "admin", + "userName": name, + }) + return + } + reminderEnabled := c.PostForm("reminder_enabled") == "on" reminderAtStr := c.PostForm("reminder_at") var reminderAt *time.Time @@ -298,6 +315,11 @@ func (h *AssignmentHandler) Update(c *gin.Context) { priority := c.PostForm("priority") dueDateStr := c.PostForm("due_date") + if err := validation.ValidateAssignmentInput(title, description, subject, priority); err != nil { + c.Redirect(http.StatusFound, "/assignments") + return + } + reminderEnabled := c.PostForm("reminder_enabled") == "on" reminderAtStr := c.PostForm("reminder_at") var reminderAt *time.Time diff --git a/internal/validation/validation.go b/internal/validation/validation.go new file mode 100644 index 0000000..8412fd2 --- /dev/null +++ b/internal/validation/validation.go @@ -0,0 +1,201 @@ +package validation + +import ( + "fmt" + "regexp" + "strings" + "unicode" +) + +var MaxLengths = map[string]int{ + "title": 200, + "description": 5000, + "subject": 100, + "priority": 20, +} + +var xssPatterns = []*regexp.Regexp{ + regexp.MustCompile(`(?i)<\s*script`), //