diff options
-rw-r--r-- | main.go | 1 | ||||
-rw-r--r-- | route/routes/boardmgmt.go | 129 | ||||
-rw-r--r-- | route/util.go | 3 |
3 files changed, 113 insertions, 20 deletions
@@ -77,7 +77,6 @@ func main() { app.Get("/deleteattach", routes.BoardDeleteAttach) app.Get("/marksensitive", routes.BoardMarkSensitive) app.Get("/remove", routes.BoardRemove) - app.Get("/removeattach", routes.BoardRemoveAttach) app.Get("/addtoindex", routes.BoardAddToIndex) app.Get("/poparchive", routes.BoardPopArchive) app.Get("/autosubscribe", routes.BoardAutoSubscribe) diff --git a/route/routes/boardmgmt.go b/route/routes/boardmgmt.go index 9269034..cd09c4f 100644 --- a/route/routes/boardmgmt.go +++ b/route/routes/boardmgmt.go @@ -3,15 +3,118 @@ package routes import ( "errors" "net/http" + "os" + "regexp" "github.com/FChannel0/FChannel-Server/activitypub" "github.com/FChannel0/FChannel-Server/config" + "github.com/FChannel0/FChannel-Server/post" "github.com/FChannel0/FChannel-Server/util" "github.com/gofiber/fiber/v2" ) func BoardBanMedia(ctx *fiber.Ctx) error { - return ctx.SendString("board ban media") + var err error + + postID := ctx.Query("id") + board := ctx.Query("board") + + _, auth := util.GetPasswordFromSession(ctx) + + if postID == "" || auth == "" { + err = errors.New("missing postID or auth") + return util.MakeError(err, "BoardBanMedia") + } + + var col activitypub.Collection + activity := activitypub.Activity{Id: postID} + + if col, err = activity.GetCollection(); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + + if len(col.OrderedItems) == 0 { + err = errors.New("no collection") + return util.MakeError(err, "BoardBanMedia") + } + + if len(col.OrderedItems[0].Attachment) == 0 { + err = errors.New("no attachment") + return util.MakeError(err, "BoardBanMedia") + } + + var actor activitypub.Actor + actor.Id = col.OrderedItems[0].Actor + + if has, _ := util.HasAuth(auth, actor.Id); !has { + err = errors.New("actor does not have auth") + return util.MakeError(err, "BoardBanMedia") + } + + re := regexp.MustCompile(config.Domain) + file := re.ReplaceAllString(col.OrderedItems[0].Attachment[0].Href, "") + + f, err := os.Open("." + file) + + if err != nil { + return util.MakeError(err, "BoardBanMedia") + } + + defer f.Close() + + bytes := make([]byte, 2048) + + if _, err = f.Read(bytes); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + + if banned, err := post.IsMediaBanned(f); err == nil && !banned { + query := `insert into bannedmedia (hash) values ($1)` + if _, err := config.DB.Exec(query, util.HashBytes(bytes)); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + } + + var isOP bool + var local bool + var obj activitypub.ObjectBase + obj.Id = postID + obj.Actor = actor.Id + + if isOP, _ = obj.CheckIfOP(); !isOP { + if err := obj.Tombstone(); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + } else { + if err := obj.TombstoneReplies(); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + } + + if local, _ = obj.IsLocal(); local { + if err := obj.DeleteRequest(); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + } + + if err := actor.UnArchiveLast(); err != nil { + return util.MakeError(err, "BoardBanMedia") + } + + var OP string + if len(col.OrderedItems[0].InReplyTo) > 0 { + OP = col.OrderedItems[0].InReplyTo[0].Id + } + + if !isOP { + if !local && OP != "" { + return ctx.Redirect("/"+board+"/"+util.RemoteShort(OP), http.StatusSeeOther) + } else if OP != "" { + return ctx.Redirect(OP, http.StatusSeeOther) + } + } + + return ctx.Redirect("/"+board, http.StatusSeeOther) } func BoardDelete(ctx *fiber.Ctx) error { @@ -54,9 +157,7 @@ func BoardDelete(ctx *fiber.Ctx) error { } if has, _ := util.HasAuth(auth, actor.Id); !has { - ctx.Response().Header.SetStatusCode(http.StatusBadRequest) - - _, err := ctx.Write([]byte("does not have auth")) + err = errors.New("actor does not have auth") return util.MakeError(err, "BoardDelete") } @@ -75,7 +176,7 @@ func BoardDelete(ctx *fiber.Ctx) error { var local bool - if local, _ = obj.IsLocal(); !local { + if local, _ = obj.IsLocal(); local { if err := obj.DeleteRequest(); err != nil { return util.MakeError(err, "BoardDelete") } @@ -178,14 +279,14 @@ func BoardMarkSensitive(ctx *fiber.Ctx) error { if postID == "" || auth == "" { err = errors.New("missing postID or auth") - return util.MakeError(err, "BoardDelete") + return util.MakeError(err, "BoardMarkSensitive") } var col activitypub.Collection activity := activitypub.Activity{Id: postID} if col, err = activity.GetCollection(); err != nil { - return util.MakeError(err, "BoardDelete") + return util.MakeError(err, "BoardMarkSensitive") } var OP string @@ -195,7 +296,7 @@ func BoardMarkSensitive(ctx *fiber.Ctx) error { actor, err = activitypub.GetActorByNameFromDB(board) if err != nil { - return util.MakeError(err, "BoardDelete") + return util.MakeError(err, "BoardMarkSensitive") } } else { if len(col.OrderedItems[0].InReplyTo) > 0 { @@ -208,16 +309,14 @@ func BoardMarkSensitive(ctx *fiber.Ctx) error { } if has, _ := util.HasAuth(auth, actor.Id); !has { - ctx.Response().Header.SetStatusCode(http.StatusBadRequest) - - _, err := ctx.Write([]byte("does not have auth")) - return util.MakeError(err, "BoardDelete") + err = errors.New("actor does not have auth") + return util.MakeError(err, "BoardMarkSensitive") } obj := activitypub.ObjectBase{Id: postID} if err = obj.MarkSensitive(true); err != nil { - return util.MakeError(err, "BoardDelete") + return util.MakeError(err, "BoardMarkSensitive") } if isOP, _ := obj.CheckIfOP(); !isOP && OP != "" { @@ -235,10 +334,6 @@ func BoardRemove(ctx *fiber.Ctx) error { return ctx.SendString("board remove") } -func BoardRemoveAttach(ctx *fiber.Ctx) error { - return ctx.SendString("board remove attach") -} - func BoardAddToIndex(ctx *fiber.Ctx) error { return ctx.SendString("board add to index") } diff --git a/route/util.go b/route/util.go index 5bd15d6..838961e 100644 --- a/route/util.go +++ b/route/util.go @@ -114,10 +114,9 @@ func ParseOutboxRequest(ctx *fiber.Ctx, actor activitypub.Actor) error { _, err := ctx.Write([]byte("7MB max file size")) return util.MakeError(err, "ParseOutboxRequest") } else if isBanned, err := post.IsMediaBanned(f); err == nil && isBanned { - //Todo add logging config.Log.Println("media banned") ctx.Response().Header.SetStatusCode(403) - _, err := ctx.Write([]byte("media banned")) + _, err := ctx.Write([]byte("")) return util.MakeError(err, "ParseOutboxRequest") } else if err != nil { return util.MakeError(err, "ParseOutboxRequest") |