notice.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package context
  2. import (
  3. "os"
  4. "path/filepath"
  5. "github.com/unknwon/com"
  6. log "unknwon.dev/clog/v2"
  7. "gogs.io/gogs/internal/conf"
  8. "gogs.io/gogs/internal/markup"
  9. "gogs.io/gogs/internal/tool"
  10. )
  11. // renderNoticeBanner checks if a notice banner file exists and loads the message to display
  12. // on all pages.
  13. func (c *Context) renderNoticeBanner() {
  14. fpath := filepath.Join(conf.CustomDir(), "notice", "banner.md")
  15. if !com.IsExist(fpath) {
  16. return
  17. }
  18. f, err := os.Open(fpath)
  19. if err != nil {
  20. log.Error("Failed to open file %q: %v", fpath, err)
  21. return
  22. }
  23. defer f.Close()
  24. fi, err := f.Stat()
  25. if err != nil {
  26. log.Error("Failed to stat file %q: %v", fpath, err)
  27. return
  28. }
  29. // Limit size to prevent very large messages from breaking pages
  30. var maxSize int64 = 1024
  31. if fi.Size() > maxSize { // Refuse to print very long messages
  32. log.Warn("Notice banner file %q size too large [%d > %d]: refusing to render", fpath, fi.Size(), maxSize)
  33. return
  34. }
  35. buf := make([]byte, maxSize)
  36. n, err := f.Read(buf)
  37. if err != nil {
  38. log.Error("Failed to read file %q: %v", fpath, err)
  39. return
  40. }
  41. buf = buf[:n]
  42. if !tool.IsTextFile(buf) {
  43. log.Warn("Notice banner file %q does not appear to be a text file: aborting", fpath)
  44. return
  45. }
  46. c.Data["ServerNotice"] = string(markup.RawMarkdown(buf, ""))
  47. }