diff options
Diffstat (limited to 'internal/context/notice.go')
-rw-r--r-- | internal/context/notice.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/context/notice.go b/internal/context/notice.go new file mode 100644 index 00000000..16b9440f --- /dev/null +++ b/internal/context/notice.go @@ -0,0 +1,62 @@ +// Copyright 2019 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package context + +import ( + "os" + "path" + + "github.com/unknwon/com" + log "gopkg.in/clog.v1" + + "gogs.io/gogs/internal/markup" + "gogs.io/gogs/internal/setting" + "gogs.io/gogs/internal/tool" +) + +// renderNoticeBanner checks if a notice banner file exists and loads the message to display +// on all pages. +func (c *Context) renderNoticeBanner() { + fpath := path.Join(setting.CustomPath, "notice", "banner.md") + if !com.IsExist(fpath) { + return + } + + f, err := os.Open(fpath) + if err != nil { + log.Error(2, "Failed to open file %q: %v", fpath, err) + return + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + log.Error(2, "Failed to stat file %q: %v", fpath, err) + return + } + + // Limit size to prevent very large messages from breaking pages + var maxSize int64 = 1024 + + if fi.Size() > maxSize { // Refuse to print very long messages + log.Warn("Notice banner file %q size too large [%d > %d]: refusing to render", fpath, fi.Size(), maxSize) + return + } + + buf := make([]byte, maxSize) + n, err := f.Read(buf) + if err != nil { + log.Error(2, "Failed to read file %q: %v", fpath, err) + return + } + buf = buf[:n] + + if !tool.IsTextFile(buf) { + log.Warn("Notice banner file %q does not appear to be a text file: aborting", fpath) + return + } + + c.Data["ServerNotice"] = string(markup.RawMarkdown(buf, "")) +} |