From 580dec5b89215310ce34341e11ff17fe38bdb63a Mon Sep 17 00:00:00 2001
From: FChannel <>
Date: Sun, 8 May 2022 14:57:40 -0700
Subject: more cleanup, logging and error logging everywhere things are mostly
in place can work on "features" and polish
---
post/tripcode.go | 106 +++++++++++++++++++++++++---------------------------
post/util.go | 111 +++++++++++++++++++++++++++++--------------------------
2 files changed, 109 insertions(+), 108 deletions(-)
(limited to 'post')
diff --git a/post/tripcode.go b/post/tripcode.go
index 3b7e48b..d5ae2e2 100644
--- a/post/tripcode.go
+++ b/post/tripcode.go
@@ -6,6 +6,7 @@ import (
"strings"
"github.com/FChannel0/FChannel-Server/config"
+ "github.com/FChannel0/FChannel-Server/util"
"github.com/gofiber/fiber/v2"
_ "github.com/lib/pq"
"github.com/simia-tech/crypt"
@@ -23,34 +24,63 @@ const SaltTable = "" +
"................................" +
"................................"
-func TripCode(pass string) (string, error) {
- pass = TripCodeConvert(pass)
+func CreateNameTripCode(ctx *fiber.Ctx) (string, string, error) {
+ input := ctx.FormValue("name")
+ tripSecure := regexp.MustCompile("##(.+)?")
- var salt [2]rune
+ if tripSecure.MatchString(input) {
+ chunck := tripSecure.FindString(input)
+ chunck = strings.Replace(chunck, "##", "", 1)
+ ce := regexp.MustCompile(`(?i)Admin`)
+ admin := ce.MatchString(chunck)
+ board, modcred := util.GetPasswordFromSession(ctx)
- s := []rune(pass + "H..")[1:3]
+ if hasAuth, _ := util.HasAuth(modcred, board); hasAuth && admin {
+ return tripSecure.ReplaceAllString(input, ""), "#Admin", nil
+ }
- for i, r := range s {
- salt[i] = rune(SaltTable[r%256])
+ hash, err := TripCodeSecure(chunck)
+
+ return tripSecure.ReplaceAllString(input, ""), "!!" + hash, util.MakeError(err, "CreateNameTripCode")
}
- enc, err := crypt.Crypt(pass, "$1$"+string(salt[:]))
- if err != nil {
- return "", err
+ trip := regexp.MustCompile("#(.+)?")
+
+ if trip.MatchString(input) {
+ chunck := trip.FindString(input)
+ chunck = strings.Replace(chunck, "#", "", 1)
+ ce := regexp.MustCompile(`(?i)Admin`)
+ admin := ce.MatchString(chunck)
+ board, modcred := util.GetPasswordFromSession(ctx)
+
+ if hasAuth, _ := util.HasAuth(modcred, board); hasAuth && admin {
+ return trip.ReplaceAllString(input, ""), "#Admin", nil
+ }
+
+ hash, err := TripCode(chunck)
+ return trip.ReplaceAllString(input, ""), "!" + hash, util.MakeError(err, "CreateNameTripCode")
}
- // normally i would just return error here but if the encrypt fails, this operation may fail and as a result cause a panic
- return enc[len(enc)-10 : len(enc)], nil
+ return input, "", nil
}
-func TripCodeSecure(pass string) (string, error) {
+func TripCode(pass string) (string, error) {
+ var salt [2]rune
+
pass = TripCodeConvert(pass)
+ s := []rune(pass + "H..")[1:3]
+
+ for i, r := range s {
+ salt[i] = rune(SaltTable[r%256])
+ }
+
+ enc, err := crypt.Crypt(pass, "$1$"+string(salt[:]))
- enc, err := crypt.Crypt(pass, "$1$"+config.Salt)
if err != nil {
- return "", err
+ return "", util.MakeError(err, "TripCode")
}
+ // normally i would just return error here but if the encrypt fails, this operation may fail and as a result cause a panic
return enc[len(enc)-10 : len(enc)], nil
}
@@ -58,7 +88,6 @@ func TripCodeConvert(str string) string {
var s bytes.Buffer
transform.NewWriter(&s, japanese.ShiftJIS.NewEncoder()).Write([]byte(str))
-
re := strings.NewReplacer(
"&", "&",
"\"", """,
@@ -69,48 +98,13 @@ func TripCodeConvert(str string) string {
return re.Replace(s.String())
}
-func CreateNameTripCode(ctx *fiber.Ctx) (string, string, error) {
- // TODO: to allow this to compile, this will fail for the case of the admin
- // this can be easily fixed when the rest of the code gets converted to fiber
-
- input := ctx.FormValue("name")
-
- tripSecure := regexp.MustCompile("##(.+)?")
-
- if tripSecure.MatchString(input) {
- chunck := tripSecure.FindString(input)
- chunck = strings.Replace(chunck, "##", "", 1)
-
- //ce := regexp.MustCompile(`(?i)Admin`)
- //admin := ce.MatchString(chunck)
-
- //board, modcred := GetPasswordFromSession(r)
-
- //if admin && HasAuth(modcred, board) {
- // return tripSecure.ReplaceAllString(input, ""), "#Admin"
- //}
-
- hash, err := TripCodeSecure(chunck)
- return tripSecure.ReplaceAllString(input, ""), "!!" + hash, err
- }
-
- trip := regexp.MustCompile("#(.+)?")
-
- if trip.MatchString(input) {
- chunck := trip.FindString(input)
- chunck = strings.Replace(chunck, "#", "", 1)
-
- //ce := regexp.MustCompile(`(?i)Admin`)
- //admin := ce.MatchString(chunck)
- //board, modcred := GetPasswordFromSession(r)
-
- //if admin && HasAuth(db, modcred, board) {
- // return trip.ReplaceAllString(input, ""), "#Admin"
- //}
+func TripCodeSecure(pass string) (string, error) {
+ pass = TripCodeConvert(pass)
+ enc, err := crypt.Crypt(pass, "$1$"+config.Salt)
- hash, err := TripCode(chunck)
- return trip.ReplaceAllString(input, ""), "!" + hash, err
+ if err != nil {
+ return "", util.MakeError(err, "TripCodeSecure")
}
- return input, "", nil
+ return enc[len(enc)-10 : len(enc)], nil
}
diff --git a/post/util.go b/post/util.go
index 6c3e6a0..67822b0 100644
--- a/post/util.go
+++ b/post/util.go
@@ -15,7 +15,6 @@ import (
"github.com/FChannel0/FChannel-Server/config"
"github.com/FChannel0/FChannel-Server/db"
"github.com/FChannel0/FChannel-Server/util"
- "github.com/FChannel0/FChannel-Server/webfinger"
"github.com/gofiber/fiber/v2"
)
@@ -46,8 +45,9 @@ func ParseCommentForReplies(comment string, op string) ([]activitypub.ObjectBase
str = strings.Replace(str, "https://", "", 1)
str = config.TP + "" + str
_, isReply, err := db.IsReplyToOP(op, str)
+
if err != nil {
- return nil, err
+ return nil, util.MakeError(err, "ParseCommentForReplies")
}
if !util.IsInStringArray(links, str) && isReply {
@@ -57,13 +57,16 @@ func ParseCommentForReplies(comment string, op string) ([]activitypub.ObjectBase
var validLinks []activitypub.ObjectBase
for i := 0; i < len(links); i++ {
- _, isValid, err := webfinger.CheckValidActivity(links[i])
+ reqActivity := activitypub.Activity{Id: links[i]}
+ _, isValid, err := reqActivity.CheckValid()
+
if err != nil {
- return nil, err
+ return nil, util.MakeError(err, "ParseCommentForReplies")
}
if isValid {
var reply activitypub.ObjectBase
+
reply.Id = links[i]
reply.Published = time.Now().UTC()
validLinks = append(validLinks, reply)
@@ -85,9 +88,11 @@ func ParseCommentForReply(comment string) (string, error) {
}
if len(links) > 0 {
- _, isValid, err := webfinger.CheckValidActivity(strings.ReplaceAll(links[0], ">", ""))
+ reqActivity := activitypub.Activity{Id: strings.ReplaceAll(links[0], ">", "")}
+ _, isValid, err := reqActivity.CheckValid()
+
if err != nil {
- return "", err
+ return "", util.MakeError(err, "ParseCommentForReply")
}
if isValid {
@@ -125,11 +130,13 @@ func ParseLinkTitle(actorName string, op string, content string) string {
func ParseOptions(ctx *fiber.Ctx, obj activitypub.ObjectBase) activitypub.ObjectBase {
options := util.EscapeString(ctx.FormValue("options"))
+
if options != "" {
option := strings.Split(options, ";")
email := regexp.MustCompile(".+@.+\\..+")
wallet := regexp.MustCompile("wallet:.+")
delete := regexp.MustCompile("delete:.+")
+
for _, e := range option {
if e == "noko" {
obj.Option = append(obj.Option, "noko")
@@ -163,20 +170,21 @@ func CheckCaptcha(captcha string) (bool, error) {
}
path := "public/" + parts[0] + ".png"
- code, err := db.GetCaptchaCodeDB(path)
+ code, err := util.GetCaptchaCode(path)
+
if err != nil {
- return false, err
+ return false, util.MakeError(err, "ParseOptions")
}
if code != "" {
- err = db.DeleteCaptchaCodeDB(path)
+ err = util.DeleteCaptchaCode(path)
if err != nil {
- return false, err
+ return false, util.MakeError(err, "ParseOptions")
}
- err = db.CreateNewCaptcha()
+ err = util.CreateNewCaptcha()
if err != nil {
- return false, err
+ return false, util.MakeError(err, "ParseOptions")
}
}
@@ -184,19 +192,28 @@ func CheckCaptcha(captcha string) (bool, error) {
return code == strings.ToUpper(parts[1]), nil
}
+func GetCaptchaCode(captcha string) string {
+ re := regexp.MustCompile("\\w+\\.\\w+$")
+ code := re.FindString(captcha)
+
+ re = regexp.MustCompile("\\w+")
+ code = re.FindString(code)
+
+ return code
+}
+
func IsMediaBanned(f multipart.File) (bool, error) {
f.Seek(0, 0)
-
fileBytes := make([]byte, 2048)
-
_, err := f.Read(fileBytes)
+
if err != nil {
- return true, err
+ return true, util.MakeError(err, "IsMediaBanned")
}
hash := util.HashBytes(fileBytes)
-
f.Seek(0, 0)
+
return db.IsHashBanned(hash)
}
@@ -211,30 +228,28 @@ func SupportedMIMEType(mime string) bool {
}
func ObjectFromForm(ctx *fiber.Ctx, obj activitypub.ObjectBase) (activitypub.ObjectBase, error) {
+ var err error
+ var file multipart.File
header, _ := ctx.FormFile("file")
- var file multipart.File
-
if header != nil {
file, _ = header.Open()
}
- var err error
-
if file != nil {
defer file.Close()
-
var tempFile = new(os.File)
+
obj.Attachment, tempFile, err = activitypub.CreateAttachmentObject(file, header)
+
if err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
defer tempFile.Close()
fileBytes, _ := ioutil.ReadAll(file)
-
tempFile.Write(fileBytes)
re := regexp.MustCompile(`image/(jpe?g|png|webp)`)
@@ -244,7 +259,7 @@ func ObjectFromForm(ctx *fiber.Ctx, obj activitypub.ObjectBase) (activitypub.Obj
cmd := exec.Command("exiv2", "rm", "."+fileLoc)
if err := cmd.Run(); err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
}
@@ -256,12 +271,11 @@ func ObjectFromForm(ctx *fiber.Ctx, obj activitypub.ObjectBase) (activitypub.Obj
obj.Name = util.EscapeString(ctx.FormValue("subject"))
obj.Content = util.EscapeString(ctx.FormValue("comment"))
obj.Sensitive = (ctx.FormValue("sensitive") != "")
-
obj = ParseOptions(ctx, obj)
var originalPost activitypub.ObjectBase
- originalPost.Id = util.EscapeString(ctx.FormValue("inReplyTo"))
+ originalPost.Id = util.EscapeString(ctx.FormValue("inReplyTo"))
obj.InReplyTo = append(obj.InReplyTo, originalPost)
var activity activitypub.Activity
@@ -272,23 +286,23 @@ func ObjectFromForm(ctx *fiber.Ctx, obj activitypub.ObjectBase) (activitypub.Obj
if originalPost.Id != "" {
if local, _ := activity.IsLocal(); !local {
- actor, err := webfinger.FingerActor(originalPost.Id)
+ actor, err := activitypub.FingerActor(originalPost.Id)
if err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
if !util.IsInStringArray(obj.To, actor.Id) {
obj.To = append(obj.To, actor.Id)
}
} else if err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
}
replyingTo, err := ParseCommentForReplies(ctx.FormValue("comment"), originalPost.Id)
if err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
for _, e := range replyingTo {
@@ -309,16 +323,16 @@ func ObjectFromForm(ctx *fiber.Ctx, obj activitypub.ObjectBase) (activitypub.Obj
activity.To = append(activity.To, e.Id)
if local, err := activity.IsLocal(); err == nil && !local {
- actor, err := webfinger.FingerActor(e.Id)
+ actor, err := activitypub.FingerActor(e.Id)
if err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
if !util.IsInStringArray(obj.To, actor.Id) {
obj.To = append(obj.To, actor.Id)
}
} else if err != nil {
- return obj, err
+ return obj, util.MakeError(err, "ObjectFromForm")
}
}
}
@@ -329,26 +343,22 @@ func ObjectFromForm(ctx *fiber.Ctx, obj activitypub.ObjectBase) (activitypub.Obj
func ResizeAttachmentToPreview() error {
return activitypub.GetObjectsWithoutPreviewsCallback(func(id, href, mediatype, name string, size int, published time.Time) error {
re := regexp.MustCompile(`^\w+`)
-
_type := re.FindString(mediatype)
if _type == "image" {
-
re = regexp.MustCompile(`.+/`)
-
file := re.ReplaceAllString(mediatype, "")
-
nHref := util.GetUniqueFilename(file)
var nPreview activitypub.NestedObjectBase
re = regexp.MustCompile(`/\w+$`)
actor := re.ReplaceAllString(id, "")
-
nPreview.Type = "Preview"
uid, err := util.CreateUniqueID(actor)
+
if err != nil {
- return err
+ return util.MakeError(err, "ResizeAttachmentToPreview")
}
nPreview.Id = fmt.Sprintf("%s/%s", actor, uid)
@@ -358,25 +368,23 @@ func ResizeAttachmentToPreview() error {
nPreview.Size = int64(size)
nPreview.Published = published
nPreview.Updated = published
-
re = regexp.MustCompile(`/public/.+`)
-
objFile := re.FindString(href)
if id != "" {
cmd := exec.Command("convert", "."+objFile, "-resize", "250x250>", "-strip", "."+nHref)
if err := cmd.Run(); err == nil {
- fmt.Println(objFile + " -> " + nHref)
+ config.Log.Println(objFile + " -> " + nHref)
if err := nPreview.WritePreview(); err != nil {
- return err
+ return util.MakeError(err, "ResizeAttachmentToPreview")
}
obj := activitypub.ObjectBase{Id: id}
if err := obj.UpdatePreview(nPreview.Id); err != nil {
- return err
+ return util.MakeError(err, "ResizeAttachmentToPreview")
}
} else {
- return err
+ return util.MakeError(err, "ResizeAttachmentToPreview")
}
}
}
@@ -394,6 +402,7 @@ func ParseAttachment(obj activitypub.ObjectBase, catalog bool) template.HTML {
}
var media string
+
if regexp.MustCompile(`image\/`).MatchString(obj.Attachment[0].MediaType) {
media = ", should also escape &, ", and '
nContent := strings.ReplaceAll(content, `<`, "<")
-
nContent, err := ParseLinkComments(board, op, nContent, thread)
+
if err != nil {
- return "", err
+ return "", util.MakeError(err, "ParseContent")
}
nContent = ParseCommentQuotes(nContent)
-
nContent = strings.ReplaceAll(nContent, `/\<`, ">")
return template.HTML(nContent), nil
@@ -484,10 +492,9 @@ func ParseLinkComments(board activitypub.Actor, op string, content string, threa
//add url to each matched reply
for i, _ := range match {
- link := strings.Replace(match[i][0], ">>", "", 1)
isOP := ""
-
domain := match[i][2]
+ link := strings.Replace(match[i][0], ">>", "", 1)
if link == op {
isOP = " (OP)"
@@ -514,7 +521,7 @@ func ParseLinkComments(board activitypub.Actor, op string, content string, threa
obj := activitypub.ObjectBase{Id: parsedLink}
col, err := obj.GetCollectionFromPath()
if err != nil {
- return "", err
+ return "", util.MakeError(err, "ParseLinkComments")
}
if len(col.OrderedItems) > 0 {
@@ -537,7 +544,7 @@ func ParseLinkComments(board activitypub.Actor, op string, content string, threa
link = parsedOP + "#" + util.ShortURL(parsedOP, parsedLink)
}
- actor, err := webfinger.FingerActor(parsedLink)
+ actor, err := activitypub.FingerActor(parsedLink)
if err == nil && actor.Id != "" {
content = strings.Replace(content, match[i][0], ">>"+util.ShortURL(board.Outbox, parsedLink)+isOP+" →", -1)
}
--
cgit v1.2.3