diff options
-rw-r--r-- | activitypub/object.go | 30 | ||||
-rw-r--r-- | main.go | 3 | ||||
-rw-r--r-- | route/routes/actor.go | 8 | ||||
-rw-r--r-- | route/routes/boardmgmt.go | 124 |
4 files changed, 144 insertions, 21 deletions
diff --git a/activitypub/object.go b/activitypub/object.go index 59ea904..f2241b7 100644 --- a/activitypub/object.go +++ b/activitypub/object.go @@ -44,10 +44,10 @@ func (obj ObjectBase) CreateActivity(activityType string) (Activity, error) { } func (obj ObjectBase) CheckIfOP() (bool, error) { - var count int + var id string query := `select id from replies where inreplyto='' and id=$1 ` - if err := config.DB.QueryRow(query, obj.Id).Scan(&count); err != nil { + if err := config.DB.QueryRow(query, obj.Id).Scan(&id); err != nil { return false, nil } @@ -144,13 +144,13 @@ func (obj ObjectBase) DeleteAttachmentFromFile() error { query := `select href from activitystream where id in (select attachment from activitystream where id=$1)` if err := config.DB.QueryRow(query, obj.Id).Scan(&href); err != nil { - return util.MakeError(err, "DeleteAttachmentFromFile") + return nil } href = strings.Replace(href, config.Domain+"/", "", 1) if href != "static/notfound.png" { if _, err := os.Stat(href); err != nil { - return util.MakeError(err, "DeleteAttachmentFromFile") + return nil } return os.Remove(href) } @@ -177,13 +177,13 @@ func (obj ObjectBase) DeletePreviewFromFile() error { query := `select href from activitystream where id in (select preview from activitystream where id=$1)` if err := config.DB.QueryRow(query, obj.Id).Scan(&href); err != nil { - return util.MakeError(err, "DeletePreviewFromFile") + return nil } href = strings.Replace(href, config.Domain+"/", "", 1) if href != "static/notfound.png" { if _, err := os.Stat(href); err != nil { - return util.MakeError(err, "DeletePreviewFromFile") + return nil } return os.Remove(href) } @@ -261,9 +261,11 @@ func (obj ObjectBase) DeleteRequest() error { if err != nil { return util.MakeError(err, "DeleteRequest") } + activity.Actor = &actor objActor, _ := GetActor(nObj.Actor) followers, err := objActor.GetFollower() + if err != nil { return util.MakeError(err, "DeleteRequest") } @@ -418,9 +420,11 @@ func (obj ObjectBase) GetCollectionFromPath() (Collection, error) { post.Actor = actor.Id - post.Replies, post.Replies.TotalItems, post.Replies.TotalImgs, err = post.GetReplies() + if post.InReplyTo, err = post.GetInReplyTo(); err != nil { + return nColl, util.MakeError(err, "GetCollectionFromPath") + } - if err != nil { + if post.Replies, post.Replies.TotalItems, post.Replies.TotalImgs, err = post.GetReplies(); err != nil { return nColl, util.MakeError(err, "GetCollectionFromPath") } @@ -505,7 +509,7 @@ func (obj ObjectBase) GetRepliesCount() (int, int, error) { query := `select count(x.id) over(), sum(case when RTRIM(x.attachment) = '' then 0 else 1 end) over() from (select id, attachment from activitystream where id in (select id from replies where inreplyto=$1) and type='Note' union select id, attachment from cacheactivitystream where id in (select id from replies where inreplyto=$1) and type='Note') as x` if err := config.DB.QueryRow(query, obj.Id).Scan(&countId, &countImg); err != nil { - return 0, 0, util.MakeError(err, "GetRepliesCount") + return 0, 0, nil } return countId, countImg, nil @@ -887,7 +891,7 @@ func (obj ObjectBase) TombstoneAttachmentReplies() error { query := `select id from activitystream where id in (select id from replies where inreplyto=$1)` if err := config.DB.QueryRow(query, obj.Id).Scan(&attachment.Id); err != nil { - return util.MakeError(err, "TombstoneAttachmentReplies") + return nil } if err := attachment.DeleteAttachmentFromFile(); err != nil { @@ -918,8 +922,8 @@ func (obj ObjectBase) TombstonePreviewReplies() error { var attachment ObjectBase query := `select id from activitystream where id in (select id from replies where inreplyto=$1)` - if err := config.DB.QueryRow(query, obj.Id).Scan(&attachment); err != nil { - return util.MakeError(err, "TombstonePreviewReplies") + if err := config.DB.QueryRow(query, obj.Id).Scan(&attachment.Id); err != nil { + return nil } if err := attachment.DeletePreviewFromFile(); err != nil { @@ -1005,7 +1009,7 @@ func (obj ObjectBase) TombstoneReplies() error { return util.MakeError(err, "TombstoneReplies") } - return nil + return obj.Tombstone() } func (obj ObjectBase) _TombstoneReplies() error { @@ -15,8 +15,6 @@ import ( "github.com/gofiber/fiber/v2/middleware/encryptcookie" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/template/html" - - _ "github.com/lib/pq" ) func main() { @@ -156,5 +154,4 @@ func Init() { go util.MakeCaptchas(100) go db.CheckInactive() - } diff --git a/route/routes/actor.go b/route/routes/actor.go index e27133b..e1372ee 100644 --- a/route/routes/actor.go +++ b/route/routes/actor.go @@ -21,6 +21,7 @@ import ( func ActorInbox(ctx *fiber.Ctx) error { activity, err := activitypub.GetActivityFromJson(ctx) + if err != nil { return util.MakeError(err, "ActorInbox") } @@ -380,8 +381,8 @@ func ActorPost(ctx *fiber.Ctx) error { } func ActorPostGet(ctx *fiber.Ctx) error { - actor, err := activitypub.GetActorByNameFromDB(ctx.Params("actor")) + if err != nil { return nil } @@ -428,8 +429,9 @@ func ActorPostGet(ctx *fiber.Ctx) error { } else { obj := activitypub.ObjectBase{Id: inReplyTo} collection, err := obj.GetCollectionFromPath() + if err != nil { - return util.MakeError(err, "PostGet") + return ctx.Status(404).Render("404", fiber.Map{}) } if collection.Actor.Id != "" { @@ -560,7 +562,7 @@ func ActorOutboxGet(ctx *fiber.Ctx) error { actor, err := activitypub.GetActorByNameFromDB(ctx.Params("actor")) if err != nil { - return nil + return ctx.Status(404).Render("404", fiber.Map{}) } if activitypub.AcceptActivity(ctx.Get("Accept")) { diff --git a/route/routes/boardmgmt.go b/route/routes/boardmgmt.go index 15b2686..fb577f3 100644 --- a/route/routes/boardmgmt.go +++ b/route/routes/boardmgmt.go @@ -1,13 +1,133 @@ package routes -import "github.com/gofiber/fiber/v2" +import ( + "net/http" + + "github.com/FChannel0/FChannel-Server/activitypub" + "github.com/FChannel0/FChannel-Server/config" + "github.com/FChannel0/FChannel-Server/util" + "github.com/gofiber/fiber/v2" +) func BoardBanMedia(ctx *fiber.Ctx) error { return ctx.SendString("board ban media") } func BoardDelete(ctx *fiber.Ctx) error { - return ctx.SendString("board delete") + id := ctx.Query("id") + board := ctx.Query("board") + + _, auth := util.GetPasswordFromSession(ctx) + + if id == "" || auth == "" { + ctx.Response().Header.SetStatusCode(http.StatusBadRequest) + + _, err := ctx.Write([]byte("id or auth empty")) + return util.MakeError(err, "BoardDelete") + } + + activity := activitypub.Activity{Id: id} + col, err := activity.GetCollection() + + if err != nil { + return util.MakeError(err, "BoardDelete") + } + + if len(col.OrderedItems) < 1 { + actor, err := activitypub.GetActorByNameFromDB(board) + + if err != nil { + return util.MakeError(err, "BoardDelete") + } + + 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") + } + + obj := activitypub.ObjectBase{Id: id} + isOP, _ := obj.CheckIfOP() + + if !isOP { + if err := obj.Tombstone(); err != nil { + return util.MakeError(err, "BoardDelete") + } + } else { + if err := obj.TombstoneReplies(); err != nil { + return util.MakeError(err, "BoardDelete") + } + } + + if err := actor.UnArchiveLast(); err != nil { + return util.MakeError(err, "BoardDelete") + } + + if ctx.Query("manage") == "t" { + return ctx.Redirect("/"+config.Key+"/"+board, http.StatusSeeOther) + } + + return ctx.Redirect("/"+board, http.StatusSeeOther) + } + + actorID := col.OrderedItems[0].Actor + + if has, _ := util.HasAuth(auth, actorID); !has { + ctx.Response().Header.SetStatusCode(http.StatusBadRequest) + + _, err := ctx.Write([]byte("does not have auth")) + return util.MakeError(err, "BoardDelete") + } + + var obj activitypub.ObjectBase + obj.Id = id + obj.Actor = actorID + + isOP, _ := obj.CheckIfOP() + + var OP string + + if len(col.OrderedItems[0].InReplyTo) > 0 { + OP = col.OrderedItems[0].InReplyTo[0].Id + } + + if !isOP { + if err := obj.Tombstone(); err != nil { + return util.MakeError(err, "BoardDelete") + } + } else { + if err := obj.TombstoneReplies(); err != nil { + return util.MakeError(err, "BoardDelete") + } + } + + if local, _ := obj.IsLocal(); !local { + if err := obj.DeleteRequest(); err != nil { + return util.MakeError(err, "BoardDelete") + } + } + + actor := activitypub.Actor{Id: actorID} + err = actor.UnArchiveLast() + + if err != nil { + return util.MakeError(err, "BoardDelete") + } + + if ctx.Query("manage") == "t" { + return ctx.Redirect("/"+config.Key+"/"+board, http.StatusSeeOther) + } + + if !isOP { + if local, _ := obj.IsLocal(); !local { + return ctx.Redirect("/"+board+"/"+util.RemoteShort(OP), http.StatusSeeOther) + } else { + return ctx.Redirect(OP, http.StatusSeeOther) + } + } + + return ctx.Redirect("/"+board, http.StatusSeeOther) } func BoardDeleteAttach(ctx *fiber.Ctx) error { |