1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-09-17 00:36:23 -07:00

Make zerolog error Event usage more consistent (Caller on the same line as Err)

This commit is contained in:
Eggbertx 2024-03-18 12:41:03 -07:00
parent c2d834c712
commit bd6992cb87
13 changed files with 129 additions and 163 deletions

View file

@ -107,7 +107,7 @@ func editPost(checkedPosts []int, editBtn string, doEdit string, writer http.Res
} }
post, err := gcsql.GetPostFromID(postid, true) post, err := gcsql.GetPostFromID(postid, true)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("postid", postid). Int("postid", postid).
Msg("Unable to find post") Msg("Unable to find post")
server.ServeError(writer, "Unable to find post: "+err.Error(), wantsJSON, map[string]interface{}{ server.ServeError(writer, "Unable to find post: "+err.Error(), wantsJSON, map[string]interface{}{

View file

@ -150,11 +150,10 @@ func parseCommandLine() {
fmt.Printf("Creating new staff: %q, with password: %q and rank: %d from command line", arr[0], arr[1], rank) fmt.Printf("Creating new staff: %q, with password: %q and rank: %d from command line", arr[0], arr[1], rank)
if _, err = gcsql.NewStaff(arr[0], arr[1], rank); err != nil { if _, err = gcsql.NewStaff(arr[0], arr[1], rank); err != nil {
fmt.Printf("Failed creating new staff account for %q: %s\n", arr[0], err.Error()) fmt.Printf("Failed creating new staff account for %q: %s\n", arr[0], err.Error())
gcutil.LogFatal(). gcutil.LogFatal().Err(err).Caller().
Str("staff", "add"). Str("staff", "add").
Str("source", "commandLine"). Str("source", "commandLine").
Str("username", arr[0]). Str("username", arr[0]).
Err(err).
Msg("Failed creating new staff account") Msg("Failed creating new staff account")
} }
gcutil.LogInfo(). gcutil.LogInfo().

View file

@ -65,8 +65,8 @@ func BuildBoardPages(board *gcsql.Board) error {
threads, err := board.GetThreads(true, true, true) threads, err := board.GetThreads(true, true, true)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Caller().Msg("Failed getting board threads") Msg("Failed getting board threads")
return fmt.Errorf("error getting threads for /%s/: %s", board.Dir, err.Error()) return fmt.Errorf("error getting threads for /%s/: %s", board.Dir, err.Error())
} }
topPosts, err := getBoardTopPosts(board.ID) topPosts, err := getBoardTopPosts(board.ID)
@ -89,8 +89,8 @@ func BuildBoardPages(board *gcsql.Board) error {
} }
errEv.Int("threadID", thread.ID) errEv.Int("threadID", thread.ID)
if catalogThread.Images, err = thread.GetReplyFileCount(); err != nil { if catalogThread.Images, err = thread.GetReplyFileCount(); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Caller().Msg("Failed getting file count") Msg("Failed getting file count")
return err return err
} }
@ -105,15 +105,13 @@ func BuildBoardPages(board *gcsql.Board) error {
} }
catalogThread.Replies, err = thread.GetReplyCount() catalogThread.Replies, err = thread.GetReplyCount()
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Msg("Failed getting reply count")
Caller().Msg("Failed getting reply count")
return errors.New("Error getting reply count: " + err.Error()) return errors.New("Error getting reply count: " + err.Error())
} }
catalogThread.Posts, err = getThreadPosts(&thread) catalogThread.Posts, err = getThreadPosts(&thread)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Msg("Failed getting replies")
Caller().Msg("Failed getting replies")
return errors.New("Failed getting replies: " + err.Error()) return errors.New("Failed getting replies: " + err.Error())
} }
if len(catalogThread.Posts) == 0 { if len(catalogThread.Posts) == 0 {
@ -127,8 +125,7 @@ func BuildBoardPages(board *gcsql.Board) error {
} }
catalogThread.uploads, err = thread.GetUploads() catalogThread.uploads, err = thread.GetUploads()
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Msg("Failed getting thread uploads")
Caller().Msg("Failed getting thread uploads")
return errors.New("Failed getting thread uploads: " + err.Error()) return errors.New("Failed getting thread uploads: " + err.Error())
} }
@ -186,9 +183,9 @@ func BuildBoardPages(board *gcsql.Board) error {
"useCaptcha": captchaCfg.UseCaptcha(), "useCaptcha": captchaCfg.UseCaptcha(),
"captcha": captchaCfg, "captcha": captchaCfg,
}, boardPageFile, "text/html"); err != nil { }, boardPageFile, "text/html"); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("page", "board.html"). Str("page", "board.html").
Caller().Msg("Failed building board") Msg("Failed building board")
return fmt.Errorf("failed building /%s/: %s", board.Dir, err.Error()) return fmt.Errorf("failed building /%s/: %s", board.Dir, err.Error())
} }
return boardPageFile.Close() return boardPageFile.Close()
@ -272,16 +269,9 @@ func BuildBoardPages(board *gcsql.Board) error {
catalogPages.pages = append(catalogPages.pages, page) catalogPages.pages = append(catalogPages.pages, page)
} }
var catalogJSON []byte if err = json.NewEncoder(catalogJSONFile).Encode(catalog.pages); err != nil {
if catalogJSON, err = json.Marshal(catalog.pages); err != nil { errEv.Err(err).Caller().Msg("Unable to write catalog JSON to file")
errEv.Err(err). return errors.New("failed to marshal to catalog JSON")
Caller().Send()
return errors.New("failed to marshal to JSON: " + err.Error())
}
if _, err = catalogJSONFile.Write(catalogJSON); err != nil {
errEv.Err(err).
Caller().Msg("Failed writing catalog.json")
return fmt.Errorf("failed writing /%s/catalog.json: %s", board.Dir, err.Error())
} }
return catalogJSONFile.Close() return catalogJSONFile.Close()
} }
@ -415,21 +405,18 @@ func buildBoard(board *gcsql.Board, force bool) error {
thumbInfo, _ := os.Stat(thumbPath) thumbInfo, _ := os.Stat(thumbPath)
if dirInfo != nil { if dirInfo != nil {
if !force { if !force {
errEv.Err(os.ErrExist). errEv.Err(os.ErrExist).Caller().
Str("dirPath", dirPath). Str("dirPath", dirPath).Send()
Caller().Send()
return fmt.Errorf(pathExistsStr, dirPath) return fmt.Errorf(pathExistsStr, dirPath)
} }
if !dirInfo.IsDir() { if !dirInfo.IsDir() {
errEv.Err(os.ErrExist). errEv.Err(os.ErrExist).Caller().
Str("dirPath", dirPath). Str("dirPath", dirPath).Send()
Caller().Send()
return fmt.Errorf(dirIsAFileStr, dirPath) return fmt.Errorf(dirIsAFileStr, dirPath)
} }
} else if err = os.Mkdir(dirPath, config.GC_DIR_MODE); err != nil { } else if err = os.Mkdir(dirPath, config.GC_DIR_MODE); err != nil {
errEv.Err(os.ErrExist). errEv.Err(os.ErrExist).Caller().
Str("dirPath", dirPath). Str("dirPath", dirPath).Send()
Caller().Send()
return fmt.Errorf(genericErrStr, dirPath, err.Error()) return fmt.Errorf(genericErrStr, dirPath, err.Error())
} }
if err = config.TakeOwnership(dirPath); err != nil { if err = config.TakeOwnership(dirPath); err != nil {
@ -441,23 +428,20 @@ func buildBoard(board *gcsql.Board, force bool) error {
if resInfo != nil { if resInfo != nil {
if !force { if !force {
err = fmt.Errorf(pathExistsStr, resPath) err = fmt.Errorf(pathExistsStr, resPath)
errEv.Err(err). errEv.Err(err).Caller().
Str("resPath", resPath). Str("resPath", resPath).Send()
Caller().Send()
return err return err
} }
if !resInfo.IsDir() { if !resInfo.IsDir() {
err = fmt.Errorf(dirIsAFileStr, resPath) err = fmt.Errorf(dirIsAFileStr, resPath)
errEv.Err(err). errEv.Err(err).Caller().
Str("resPath", resPath). Str("resPath", resPath).Send()
Caller().Send()
return err return err
} }
} else if err = os.Mkdir(resPath, config.GC_DIR_MODE); err != nil { } else if err = os.Mkdir(resPath, config.GC_DIR_MODE); err != nil {
err = fmt.Errorf(genericErrStr, resPath, err.Error()) err = fmt.Errorf(genericErrStr, resPath, err.Error())
errEv.Err(err). errEv.Err(err).Caller().
Str("resPath", resPath). Str("resPath", resPath).Send()
Caller().Send()
return fmt.Errorf(genericErrStr, resPath, err.Error()) return fmt.Errorf(genericErrStr, resPath, err.Error())
} }
if err = config.TakeOwnership(resPath); err != nil { if err = config.TakeOwnership(resPath); err != nil {
@ -469,23 +453,20 @@ func buildBoard(board *gcsql.Board, force bool) error {
if srcInfo != nil { if srcInfo != nil {
if !force { if !force {
err = fmt.Errorf(pathExistsStr, srcPath) err = fmt.Errorf(pathExistsStr, srcPath)
errEv.Err(err). errEv.Err(err).Caller().
Str("srcPath", srcPath). Str("srcPath", srcPath).Send()
Caller().Send()
return err return err
} }
if !srcInfo.IsDir() { if !srcInfo.IsDir() {
err = fmt.Errorf(dirIsAFileStr, srcPath) err = fmt.Errorf(dirIsAFileStr, srcPath)
errEv.Err(err). errEv.Err(err).Caller().
Str("srcPath", srcPath). Str("srcPath", srcPath).Send()
Caller().Send()
return err return err
} }
} else if err = os.Mkdir(srcPath, config.GC_DIR_MODE); err != nil { } else if err = os.Mkdir(srcPath, config.GC_DIR_MODE); err != nil {
err = fmt.Errorf(genericErrStr, srcPath, err.Error()) err = fmt.Errorf(genericErrStr, srcPath, err.Error())
errEv.Err(err). errEv.Err(err).Caller().
Str("srcPath", srcPath). Str("srcPath", srcPath).Send()
Caller().Send()
return err return err
} }
if config.TakeOwnership(srcPath); err != nil { if config.TakeOwnership(srcPath); err != nil {

View file

@ -86,8 +86,7 @@ func BuildCatalog(boardID int) error {
board, err := gcsql.GetBoardFromID(boardID) board, err := gcsql.GetBoardFromID(boardID)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Msg("Unable to get board information")
Caller().Msg("Unable to get board information")
return err return err
} }
errEv.Str("boardDir", board.Dir) errEv.Str("boardDir", board.Dir)
@ -101,13 +100,13 @@ func BuildCatalog(boardID int) error {
if err = config.TakeOwnershipOfFile(catalogFile); err != nil { if err = config.TakeOwnershipOfFile(catalogFile); err != nil {
errEv.Err(err).Caller().Send() errEv.Err(err).Caller().Send()
return fmt.Errorf("failed taking ownership of /%s/catalog.html: %s", board.Dir, err.Error()) return fmt.Errorf("failed taking ownership of /%s/catalog.html", board.Dir)
} }
threadOPs, err := getBoardTopPosts(boardID) threadOPs, err := getBoardTopPosts(boardID)
if err != nil { if err != nil {
errEv.Err(err).Caller().Send() errEv.Err(err).Caller().Send()
return fmt.Errorf("failed building catalog for /%s/: %s", board.Dir, err.Error()) return fmt.Errorf("failed building catalog for /%s/", board.Dir)
} }
boardConfig := config.GetBoardConfig(board.Dir) boardConfig := config.GetBoardConfig(board.Dir)
@ -119,7 +118,7 @@ func BuildCatalog(boardID int) error {
"threads": threadOPs, "threads": threadOPs,
}, catalogFile, "text/html"); err != nil { }, catalogFile, "text/html"); err != nil {
errEv.Err(err).Caller().Send() errEv.Err(err).Caller().Send()
return fmt.Errorf("failed building catalog for /%s/: %s", board.Dir, err.Error()) return fmt.Errorf("failed building catalog for /%s/", board.Dir)
} }
return catalogFile.Close() return catalogFile.Close()
} }

View file

@ -61,22 +61,20 @@ func BuildThreadPages(op *gcsql.Post) error {
board, err := op.GetBoard() board, err := op.GetBoard()
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Msg("failed building thread")
Caller().Msg("failed building thread") return errors.New("failed building thread")
return errors.New("failed building thread: " + err.Error())
} }
errEv.Str("boardDir", board.Dir) errEv.Str("boardDir", board.Dir)
thread, err := gcsql.GetThread(op.ThreadID) thread, err := gcsql.GetThread(op.ThreadID)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Msg("Unable to get thread info")
Caller().Msg("Unable to get thread info") return errors.New("unable to get thread info")
return errors.New("unable to get thread info: " + err.Error())
} }
posts, err := getThreadPosts(thread) posts, err := getThreadPosts(thread)
if err != nil { if err != nil {
errEv.Err(err).Caller().Send() errEv.Err(err).Caller().Send()
return errors.New("failed building thread: " + err.Error()) return errors.New("failed getting thread posts")
} }
criticalCfg := config.GetSystemCriticalConfig() criticalCfg := config.GetSystemCriticalConfig()
os.Remove(path.Join(criticalCfg.DocumentRoot, board.Dir, "res", strconv.Itoa(op.ID)+".html")) os.Remove(path.Join(criticalCfg.DocumentRoot, board.Dir, "res", strconv.Itoa(op.ID)+".html"))
@ -122,26 +120,21 @@ func BuildThreadPages(op *gcsql.Post) error {
os.O_CREATE|os.O_RDWR|os.O_TRUNC, config.GC_FILE_MODE) os.O_CREATE|os.O_RDWR|os.O_TRUNC, config.GC_FILE_MODE)
if err != nil { if err != nil {
errEv.Err(err).Caller().Send() errEv.Err(err).Caller().Send()
return fmt.Errorf("failed opening /%s/res/%d.json: %s", board.Dir, posts[0].ID, err.Error()) return fmt.Errorf("failed opening /%s/res/%d.json", board.Dir, posts[0].ID)
} }
if err = config.TakeOwnershipOfFile(threadJSONFile); err != nil { if err = config.TakeOwnershipOfFile(threadJSONFile); err != nil {
errEv.Err(err).Caller().Send() errEv.Err(err).Caller().Send()
return fmt.Errorf("failed setting file permissions for /%s/res/%d.json: %s", board.Dir, posts[0].ID, err.Error()) return fmt.Errorf("failed setting file permissions for /%s/res/%d.json", board.Dir, posts[0].ID)
} }
threadMap := make(map[string][]Post) threadMap := make(map[string][]Post)
threadMap["posts"] = posts threadMap["posts"] = posts
threadJSON, err := json.Marshal(threadMap) if err = json.NewEncoder(threadJSONFile).Encode(threadMap); err != nil {
if err != nil { errEv.Err(err).Caller().
gcutil.LogError(err).Send() Msg("Unable to write thread JSON file")
return errors.New("failed to marshal to JSON: " + err.Error()) return fmt.Errorf("failed writing /%s/res/%d.json", board.Dir, posts[0].ID)
}
if _, err = threadJSONFile.Write(threadJSON); err != nil {
errEv.Err(err).
Caller().Send()
return fmt.Errorf("failed writing /%s/res/%d.json: %s", board.Dir, posts[0].ID, err.Error())
} }
return threadJSONFile.Close() return threadJSONFile.Close()
} }

View file

@ -178,9 +178,9 @@ func boardsCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql.S
return "", err return "", err
} }
if board, err = gcsql.GetBoardFromID(boardID); err != nil { if board, err = gcsql.GetBoardFromID(boardID); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("boardID", boardID). Int("boardID", boardID).
Caller().Msg("Unable to get board info") Msg("Unable to get board info")
return "", err return "", err
} }
case "modify": case "modify":
@ -330,25 +330,24 @@ func cleanupCallback(_ http.ResponseWriter, request *http.Request, _ *gcsql.Staf
if request.FormValue("run") == "Run Cleanup" { if request.FormValue("run") == "Run Cleanup" {
outputStr += "Removing deleted posts from the database.<hr />" outputStr += "Removing deleted posts from the database.<hr />"
if err = gcsql.PermanentlyRemoveDeletedPosts(); err != nil { if err = gcsql.PermanentlyRemoveDeletedPosts(); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("cleanup", "removeDeletedPosts"). Str("cleanup", "removeDeletedPosts").Send()
Caller().Send() err = errors.New("unable to remove deleted posts from database")
err = errors.New("Error removing deleted posts from database: " + err.Error())
return outputStr + "<tr><td>" + err.Error() + "</td></tr></table>", err return outputStr + "<tr><td>" + err.Error() + "</td></tr></table>", err
} }
outputStr += "Optimizing all tables in database.<hr />" outputStr += "Optimizing all tables in database.<hr />"
err = gcsql.OptimizeDatabase() err = gcsql.OptimizeDatabase()
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("sql", "optimization"). Str("sql", "optimization").Send()
Caller().Send()
err = errors.New("Error optimizing SQL tables: " + err.Error()) err = errors.New("Error optimizing SQL tables: " + err.Error())
return outputStr + "<tr><td>" + err.Error() + "</td></tr></table>", err return outputStr + "<tr><td>" + err.Error() + "</td></tr></table>", err
} }
outputStr += "Cleanup finished" outputStr += "Cleanup finished"
} else { } else {
outputStr += `<form action="` + config.GetSystemCriticalConfig().WebRoot + `manage/cleanup" method="post">` +
outputStr += `<form action="` + config.WebPath("manage/cleanup") + `" method="post">` +
`<input name="run" id="run" type="submit" value="Run Cleanup" />` + `<input name="run" id="run" type="submit" value="Run Cleanup" />` +
`</form>` `</form>`
} }

View file

@ -141,13 +141,12 @@ func appealsCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql.
// approving an appeal // approving an appeal
approveID, err := strconv.Atoi(approveStr) approveID, err := strconv.Atoi(approveStr)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("approveStr", approveStr).Caller().Send() Str("approveStr", approveStr).Send()
} }
if err = gcsql.ApproveAppeal(approveID, staff.ID); err != nil { if err = gcsql.ApproveAppeal(approveID, staff.ID); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("approveAppeal", approveID). Int("approveAppeal", approveID).Send()
Caller().Send()
return "", err return "", err
} }
} }
@ -182,9 +181,8 @@ func fileBansCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql
if boardidStr != "" { if boardidStr != "" {
boardid, err = strconv.Atoi(boardidStr) boardid, err = strconv.Atoi(boardidStr)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("boardid", boardidStr). Str("boardid", boardidStr).Send()
Caller().Send()
return "", err return "", err
} }
} }
@ -199,9 +197,8 @@ func fileBansCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql
_, err = regexp.Compile(filename) _, err = regexp.Compile(filename)
if err != nil { if err != nil {
// invalid regular expression // invalid regular expression
errEv.Err(err). errEv.Err(err).Caller().
Str("regex", filename). Str("regex", filename).Send()
Caller().Send()
return "", err return "", err
} }
} }
@ -273,15 +270,13 @@ func fileBansCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql
// user requested a checksum ban ID to delete // user requested a checksum ban ID to delete
delChecksumBanID, err := strconv.Atoi(delChecksumBanIDStr) delChecksumBanID, err := strconv.Atoi(delChecksumBanIDStr)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("deleteChecksumBanIDStr", delChecksumBanIDStr). Str("deleteChecksumBanIDStr", delChecksumBanIDStr).Send()
Caller().Send()
return "", err return "", err
} }
if err = (gcsql.FileBan{ID: delChecksumBanID}).Deactivate(staff.ID); err != nil { if err = (gcsql.FileBan{ID: delChecksumBanID}).Deactivate(staff.ID); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("deleteChecksumBanID", delChecksumBanID). Int("deleteChecksumBanID", delChecksumBanID).Send()
Caller().Send()
return "", err return "", err
} }
infoEv.Int("deleteChecksumBanID", delChecksumBanID).Msg("File checksum ban deleted") infoEv.Int("deleteChecksumBanID", delChecksumBanID).Msg("File checksum ban deleted")
@ -293,8 +288,8 @@ func fileBansCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql
var filterBoardID int var filterBoardID int
if filterBoardIDstr != "" { if filterBoardIDstr != "" {
if filterBoardID, err = strconv.Atoi(filterBoardIDstr); err != nil { if filterBoardID, err = strconv.Atoi(filterBoardIDstr); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("filterboardid", filterBoardIDstr).Caller().Send() Str("filterboardid", filterBoardIDstr).Send()
return "", err return "", err
} }
} }
@ -337,15 +332,14 @@ func nameBansCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql
if deleteIDstr != "" { if deleteIDstr != "" {
deleteID, err := strconv.Atoi(deleteIDstr) deleteID, err := strconv.Atoi(deleteIDstr)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("delStr", deleteIDstr). Str("delStr", deleteIDstr).Send()
Caller().Send()
return "", err return "", err
} }
if err = gcsql.DeleteNameBan(deleteID); err != nil { if err = gcsql.DeleteNameBan(deleteID); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("deleteID", deleteID). Int("deleteID", deleteID).
Caller().Msg("Unable to delete name ban") Msg("Unable to delete name ban")
return "", errors.New("Unable to delete name ban: " + err.Error()) return "", errors.New("Unable to delete name ban: " + err.Error())
} }
} }
@ -367,9 +361,9 @@ func nameBansCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql
} }
isRegex := request.FormValue("isregex") == "on" isRegex := request.FormValue("isregex") == "on"
if _, err = gcsql.NewNameBan(name, isRegex, boardID, staff.ID, request.FormValue("staffnote")); err != nil { if _, err = gcsql.NewNameBan(name, isRegex, boardID, staff.ID, request.FormValue("staffnote")); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("name", name). Str("name", name).
Int("boardID", boardID) Int("boardID", boardID).Send()
return "", err return "", err
} }
} }
@ -439,9 +433,8 @@ func reportsCallback(_ http.ResponseWriter, request *http.Request, staff *gcsql.
} }
found, err := gcsql.ClearReport(dismissID, staff.ID, block != "" && staff.Rank == 3) found, err := gcsql.ClearReport(dismissID, staff.ID, block != "" && staff.Rank == 3)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("postID", dismissID). Int("postID", dismissID).Send()
Caller().Send()
return nil, err return nil, err
} }
if !found { if !found {

View file

@ -49,9 +49,9 @@ func ipBanFromRequest(ban *gcsql.IPBan, request *http.Request, infoEv *zerolog.E
durationStr := request.FormValue("duration") durationStr := request.FormValue("duration")
duration, err := durationutil.ParseLongerDuration(durationStr) duration, err := durationutil.ParseLongerDuration(durationStr)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("duration", durationStr). Str("duration", durationStr).
Caller().Msg("Invalid duration") Msg("Invalid duration")
return err return err
} }
ban.ExpiresAt = now.Add(duration) ban.ExpiresAt = now.Add(duration)

View file

@ -60,9 +60,8 @@ func CallManageFunction(writer http.ResponseWriter, request *http.Request) {
staff = &gcsql.Staff{} staff = &gcsql.Staff{}
err = nil err = nil
} else if err != nil && err != sql.ErrNoRows { } else if err != nil && err != sql.ErrNoRows {
errEv.Err(err). errEv.Err(err).Caller().
Str("request", "getCurrentFullStaff"). Str("request", "getCurrentFullStaff").Send()
Caller().Send()
server.ServeError(writer, "Error getting staff info from request: "+err.Error(), wantsJSON, nil) server.ServeError(writer, "Error getting staff info from request: "+err.Error(), wantsJSON, nil)
return return
} }

View file

@ -46,9 +46,9 @@ func createSession(key, username, password string, request *http.Request, writer
staff, err := gcsql.GetStaffByUsername(username, true) staff, err := gcsql.GetStaffByUsername(username, true)
if err != nil { if err != nil {
if err != sql.ErrNoRows { if err != sql.ErrNoRows {
errEv.Err(err). errEv.Err(err).Caller().
Str("remoteAddr", request.RemoteAddr). Str("remoteAddr", request.RemoteAddr).
Caller().Msg("Unrecognized username") Msg("Unrecognized username")
} }
return ErrBadCredentials return ErrBadCredentials
} }
@ -56,8 +56,7 @@ func createSession(key, username, password string, request *http.Request, writer
err = bcrypt.CompareHashAndPassword([]byte(staff.PasswordChecksum), []byte(password)) err = bcrypt.CompareHashAndPassword([]byte(staff.PasswordChecksum), []byte(password))
if err == bcrypt.ErrMismatchedHashAndPassword { if err == bcrypt.ErrMismatchedHashAndPassword {
// password mismatch // password mismatch
errEv.Caller(). errEv.Caller().Msg("Invalid password")
Msg("Invalid password")
return ErrBadCredentials return ErrBadCredentials
} }

View file

@ -110,8 +110,8 @@ func handleAppeal(writer http.ResponseWriter, request *http.Request, infoEv *zer
} }
banID, err := strconv.Atoi(banIDstr) banID, err := strconv.Atoi(banIDstr)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("banIDstr", banIDstr).Caller().Send() Str("banIDstr", banIDstr).Send()
server.ServeErrorPage(writer, fmt.Sprintf("Invalid banid value %q", banIDstr)) server.ServeErrorPage(writer, fmt.Sprintf("Invalid banid value %q", banIDstr))
return return
} }
@ -158,9 +158,9 @@ func handleAppeal(writer http.ResponseWriter, request *http.Request, infoEv *zer
server.ServeErrorPage(writer, "You are not able to appeal this ban until "+ban.AppealAt.Format(config.GetBoardConfig("").DateTimeFormat)) server.ServeErrorPage(writer, "You are not able to appeal this ban until "+ban.AppealAt.Format(config.GetBoardConfig("").DateTimeFormat))
} }
if err = ban.Appeal(appealMsg); err != nil { if err = ban.Appeal(appealMsg); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("appealMsg", appealMsg). Str("appealMsg", appealMsg).
Caller().Msg("Unable to submit appeal") Msg("Unable to submit appeal")
server.ServeErrorPage(writer, "Unable to submit appeal") server.ServeErrorPage(writer, "Unable to submit appeal")
return return
} }

View file

@ -81,6 +81,22 @@ func attachFlag(request *http.Request, post *gcsql.Post, board string, errEv *ze
return nil return nil
} }
func handleRecover(writer http.ResponseWriter, wantsJSON bool, infoEv *zerolog.Event, errEv *zerolog.Event) {
if a := recover(); a != nil {
if writer != nil {
writer.WriteHeader(http.StatusInternalServerError)
server.ServeError(writer, "Internal server error", wantsJSON, nil)
}
errEv.Caller().
Str("recover", fmt.Sprintf("%v", a)).
Bytes("stack", debug.Stack()).
Msg("Recovered from panic")
debug.PrintStack()
}
errEv.Discard()
infoEv.Discard()
}
// MakePost is called when a user accesses /post. Parse form data, then insert and build // MakePost is called when a user accesses /post. Parse form data, then insert and build
func MakePost(writer http.ResponseWriter, request *http.Request) { func MakePost(writer http.ResponseWriter, request *http.Request) {
request.ParseMultipartForm(maxFormBytes) request.ParseMultipartForm(maxFormBytes)
@ -91,19 +107,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
Str("IP", ip) Str("IP", ip)
infoEv := gcutil.LogInfo(). infoEv := gcutil.LogInfo().
Str("IP", ip) Str("IP", ip)
defer func() { defer handleRecover(writer, wantsJSON, infoEv, errEv)
if a := recover(); a != nil {
writer.WriteHeader(http.StatusInternalServerError)
server.ServeError(writer, "Internal server error", wantsJSON, nil)
errEv.Caller().
Str("recover", fmt.Sprintf("%v", a)).
Bytes("stack", debug.Stack()).
Msg("Recovered from panic")
debug.PrintStack()
}
errEv.Discard()
infoEv.Discard()
}()
var formName string var formName string
var formEmail string var formEmail string
@ -132,20 +136,19 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
if threadidStr != "" { if threadidStr != "" {
// post is a reply // post is a reply
if opID, err = strconv.Atoi(threadidStr); err != nil { if opID, err = strconv.Atoi(threadidStr); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Str("opIDstr", threadidStr). Str("opIDstr", threadidStr).
Caller().Msg("Invalid threadid value") Msg("Invalid threadid value")
server.ServeError(writer, "Invalid form data (invalid threadid)", wantsJSON, map[string]interface{}{ server.ServeError(writer, "Invalid form data (invalid threadid)", wantsJSON, map[string]any{
"threadid": threadidStr, "threadid": threadidStr,
}) })
return return
} }
if opID > 0 { if opID > 0 {
if post.ThreadID, err = gcsql.GetTopPostThreadID(opID); err != nil { if post.ThreadID, err = gcsql.GetTopPostThreadID(opID); err != nil {
errEv.Err(err). errEv.Err(err).Caller().
Int("opID", opID). Int("opID", opID).Send()
Caller().Send() server.ServeError(writer, err.Error(), wantsJSON, map[string]any{
server.ServeError(writer, err.Error(), wantsJSON, map[string]interface{}{
"opID": opID, "opID": opID,
}) })
} }
@ -156,7 +159,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
boardID, err := strconv.Atoi(boardidStr) boardID, err := strconv.Atoi(boardidStr)
if err != nil { if err != nil {
errEv.Str("boardid", boardidStr).Caller().Msg("Invalid boardid value") errEv.Str("boardid", boardidStr).Caller().Msg("Invalid boardid value")
server.ServeError(writer, "Invalid form data (invalid boardid)", wantsJSON, map[string]interface{}{ server.ServeError(writer, "Invalid form data (invalid boardid)", wantsJSON, map[string]any{
"boardid": boardidStr, "boardid": boardidStr,
}) })
return return
@ -166,7 +169,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
errEv.Err(err).Caller(). errEv.Err(err).Caller().
Int("boardid", boardID). Int("boardid", boardID).
Msg("Unable to get board info") Msg("Unable to get board info")
server.ServeError(writer, "Unable to get board info", wantsJSON, map[string]interface{}{ server.ServeError(writer, "Unable to get board info", wantsJSON, map[string]any{
"boardid": boardID, "boardid": boardID,
}) })
return return
@ -202,7 +205,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
errEv. errEv.
Int("messageLength", len(post.MessageRaw)). Int("messageLength", len(post.MessageRaw)).
Int("maxMessageLength", postBoard.MaxMessageLength).Send() Int("maxMessageLength", postBoard.MaxMessageLength).Send()
server.ServeError(writer, "Message is too long", wantsJSON, map[string]interface{}{ server.ServeError(writer, "Message is too long", wantsJSON, map[string]any{
"messageLength": len(post.MessageRaw), "messageLength": len(post.MessageRaw),
"boardid": boardID, "boardid": boardID,
}) })
@ -211,7 +214,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
if post.MessageRaw, err = ApplyWordFilters(post.MessageRaw, postBoard.Dir); err != nil { if post.MessageRaw, err = ApplyWordFilters(post.MessageRaw, postBoard.Dir); err != nil {
errEv.Err(err).Caller().Msg("Error formatting post") errEv.Err(err).Caller().Msg("Error formatting post")
server.ServeError(writer, "Error formatting post: "+err.Error(), wantsJSON, map[string]interface{}{ server.ServeError(writer, "Error formatting post: "+err.Error(), wantsJSON, map[string]any{
"boardDir": postBoard.Dir, "boardDir": postBoard.Dir,
}) })
return return
@ -278,7 +281,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
} }
if err != nil { if err != nil {
errEv.Err(err).Caller().Str("boardDir", postBoard.Dir).Msg("Unable to check post cooldown") errEv.Err(err).Caller().Str("boardDir", postBoard.Dir).Msg("Unable to check post cooldown")
server.ServeError(writer, "Error checking post cooldown: "+err.Error(), wantsJSON, map[string]interface{}{ server.ServeError(writer, "Error checking post cooldown: "+err.Error(), wantsJSON, map[string]any{
"boardDir": postBoard.Dir, "boardDir": postBoard.Dir,
}) })
return return
@ -298,8 +301,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
captchaSuccess, err := submitCaptchaResponse(request) captchaSuccess, err := submitCaptchaResponse(request)
if err != nil { if err != nil {
errEv.Err(err). errEv.Err(err).Caller().Send()
Caller().Send()
server.ServeError(writer, "Error submitting captcha response:"+err.Error(), wantsJSON, nil) server.ServeError(writer, "Error submitting captcha response:"+err.Error(), wantsJSON, nil)
return return
} }
@ -379,7 +381,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
os.Remove(thumbPath) os.Remove(thumbPath)
os.Remove(catalogThumbPath) os.Remove(catalogThumbPath)
post.Delete() post.Delete()
server.ServeError(writer, "Unable to attach upload", wantsJSON, map[string]interface{}{ server.ServeError(writer, "Unable to attach upload", wantsJSON, map[string]any{
"filename": upload.OriginalFilename, "filename": upload.OriginalFilename,
}) })
return return
@ -416,7 +418,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
topPost, _ = post.TopPostID() topPost, _ = post.TopPostID()
} }
writer.Header().Set("Content-Type", "application/json") writer.Header().Set("Content-Type", "application/json")
json.NewEncoder(writer).Encode(map[string]interface{}{ json.NewEncoder(writer).Encode(map[string]any{
"time": post.CreatedOn, "time": post.CreatedOn,
"id": post.ID, "id": post.ID,
"thread": config.WebPath(postBoard.Dir, "/res/", strconv.Itoa(topPost)+".html"), "thread": config.WebPath(postBoard.Dir, "/res/", strconv.Itoa(topPost)+".html"),

View file

@ -7,19 +7,21 @@ import (
"github.com/gochan-org/gochan/pkg/config" "github.com/gochan-org/gochan/pkg/config"
"github.com/gochan-org/gochan/pkg/gcutil" "github.com/gochan-org/gochan/pkg/gcutil"
"github.com/rs/zerolog"
) )
// ValidReferer checks to make sure that the incoming request is from the same domain (or if debug mode is enabled) // ValidReferer checks to make sure that the incoming request is from the same domain (or if debug mode is enabled)
func ValidReferer(request *http.Request) bool { func ValidReferer(request *http.Request, errEv ...*zerolog.Event) bool {
if config.VerboseMode() {
return true
}
referer := request.Referer() referer := request.Referer()
rURL, err := url.ParseRequestURI(referer) rURL, err := url.ParseRequestURI(referer)
if err != nil { if err != nil {
gcutil.Logger().Err(err). var ev *zerolog.Event
Str("referer", referer). if len(errEv) == 1 {
Msg("Error parsing referer URL") ev = gcutil.LogError(err).Caller()
} else {
ev = errEv[0].Err(err).Caller()
}
ev.Str("referer", referer).Msg("Error parsing referer URL")
return false return false
} }
return strings.Index(rURL.Path, config.GetSystemCriticalConfig().WebRoot) == 0 return strings.Index(rURL.Path, config.GetSystemCriticalConfig().WebRoot) == 0