Compare commits
41 Commits
31484dd44a
...
v0.13.0
Author | SHA1 | Date | |
---|---|---|---|
d62d71b5d1 | |||
07e1983fcc | |||
878f57af08 | |||
d86b9027bf | |||
b36e0ea503 | |||
bc4d8fa37e | |||
d2b21e7405 | |||
e3c192359f | |||
46532e4c85 | |||
c722135a56 | |||
887fa863bc | |||
74d71cfb6a | |||
ca7e7cddd3 | |||
94431a2aa9 | |||
5b1f20c5bc | |||
d0c566f8df | |||
5e586aa49a | |||
66b2743d3d | |||
3723b2b5e6 | |||
ce788bfd50 | |||
230a6278cc | |||
42d6e0c198 | |||
e1af2979af | |||
f6dedc6f10 | |||
cdf0a49550 | |||
c3c0650210 | |||
d077f700d8 | |||
ec752b1c66 | |||
46aef4f12f | |||
1b29e328cf | |||
e50cb819f3 | |||
c32e38ca10 | |||
d7c8c7a43a | |||
1cd3edc90c | |||
0e768c9f61 | |||
1fcd775cc5 | |||
203a1ed147 | |||
ef1914ee5c | |||
084b101e31 | |||
b2db128aa9 | |||
081e880fb6 |
@ -6,12 +6,14 @@ tmp_dir = "tmp"
|
|||||||
args_bin = [
|
args_bin = [
|
||||||
"-aes tmp/cpolis.aes",
|
"-aes tmp/cpolis.aes",
|
||||||
"-articles tmp/articles",
|
"-articles tmp/articles",
|
||||||
|
"-banner-width 512",
|
||||||
"-config tmp/config.toml",
|
"-config tmp/config.toml",
|
||||||
"-desc 'Freiheit, Gleichheit, Brüderlichkeit, Toleranz und Humanität'",
|
"-desc 'Freiheit, Gleichheit, Brüderlichkeit, Toleranz und Humanität'",
|
||||||
"-domain localhost",
|
"-domain localhost",
|
||||||
"-feed tmp/cpolis.atom",
|
"-feed tmp/cpolis.atom",
|
||||||
"-firebase tmp/firebase.json",
|
"-firebase tmp/firebase.json",
|
||||||
"-gob tmp/cpolis.gob",
|
"-gob tmp/cpolis.gob",
|
||||||
|
"-img-width 256",
|
||||||
"-link https://distrikt-ni-st.de",
|
"-link https://distrikt-ni-st.de",
|
||||||
"-log tmp/cpolis.log",
|
"-log tmp/cpolis.log",
|
||||||
"-pdfs tmp/pdfs",
|
"-pdfs tmp/pdfs",
|
||||||
@ -19,7 +21,6 @@ args_bin = [
|
|||||||
"-port 8080",
|
"-port 8080",
|
||||||
"-title 'Freimaurer Distrikt Niedersachsen und Sachsen-Anhalt'",
|
"-title 'Freimaurer Distrikt Niedersachsen und Sachsen-Anhalt'",
|
||||||
"-web web",
|
"-web web",
|
||||||
"-width 1024",
|
|
||||||
]
|
]
|
||||||
bin = "./tmp/main"
|
bin = "./tmp/main"
|
||||||
cmd = "go build -o ./tmp/main ./cmd/main.go"
|
cmd = "go build -o ./tmp/main ./cmd/main.go"
|
||||||
|
@ -12,44 +12,48 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
AESKeyFile string
|
AESKeyFile string
|
||||||
ArticleDir string
|
ArticleDir string
|
||||||
ConfigFile string
|
ConfigFile string
|
||||||
DBName string
|
DBName string
|
||||||
Description string
|
Description string
|
||||||
Domain string
|
Domain string
|
||||||
AtomFeed string
|
AtomFeed string
|
||||||
FirebaseKey string
|
FirebaseKey string
|
||||||
GOBKeyFile string
|
GOBKeyFile string
|
||||||
Link string
|
Link string
|
||||||
LogFile string
|
LogFile string
|
||||||
PDFDir string
|
PDFDir string
|
||||||
PicsDir string
|
PicsDir string
|
||||||
Port string
|
Port string
|
||||||
Title string
|
Title string
|
||||||
Version string
|
Version string
|
||||||
WebDir string
|
WebDir string
|
||||||
MaxImgHeight int
|
MaxBannerHeight int
|
||||||
MaxImgWidth int
|
MaxBannerWidth int
|
||||||
|
MaxImgHeight int
|
||||||
|
MaxImgWidth int
|
||||||
}
|
}
|
||||||
|
|
||||||
func newConfig() *Config {
|
func newConfig() *Config {
|
||||||
return &Config{
|
return &Config{
|
||||||
AESKeyFile: "/var/www/cpolis/aes.key",
|
AESKeyFile: "/var/www/cpolis/aes.key",
|
||||||
ArticleDir: "/var/www/cpolis/articles",
|
ArticleDir: "/var/www/cpolis/articles",
|
||||||
ConfigFile: "/etc/cpolis/config.toml",
|
AtomFeed: "/var/www/cpolis/cpolis.atom",
|
||||||
DBName: "cpolis",
|
ConfigFile: "/etc/cpolis/config.toml",
|
||||||
AtomFeed: "/var/www/cpolis/cpolis.atom",
|
DBName: "cpolis",
|
||||||
FirebaseKey: "/var/www/cpolis/serviceAccountKey.json",
|
FirebaseKey: "/var/www/cpolis/serviceAccountKey.json",
|
||||||
GOBKeyFile: "/var/www/cpolis/gob.key",
|
GOBKeyFile: "/var/www/cpolis/gob.key",
|
||||||
LogFile: "/var/log/cpolis.log",
|
LogFile: "/var/log/cpolis.log",
|
||||||
MaxImgHeight: 1080,
|
MaxBannerHeight: 1080,
|
||||||
MaxImgWidth: 1920,
|
MaxBannerWidth: 1920,
|
||||||
PDFDir: "/var/www/cpolis/pdfs",
|
MaxImgHeight: 1080,
|
||||||
PicsDir: "/var/www/cpolis/pics",
|
MaxImgWidth: 1920,
|
||||||
Port: ":8080",
|
PDFDir: "/var/www/cpolis/pdfs",
|
||||||
Version: "v0.13.0",
|
PicsDir: "/var/www/cpolis/pics",
|
||||||
WebDir: "/var/www/cpolis/web",
|
Port: ":8080",
|
||||||
|
Version: "v0.13.0",
|
||||||
|
WebDir: "/var/www/cpolis/web",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,8 +123,10 @@ func (c *Config) handleCliArgs() error {
|
|||||||
flag.StringVar(&c.PicsDir, "pics", c.PicsDir, "pictures directory")
|
flag.StringVar(&c.PicsDir, "pics", c.PicsDir, "pictures directory")
|
||||||
flag.StringVar(&c.Title, "title", c.Title, "channel title")
|
flag.StringVar(&c.Title, "title", c.Title, "channel title")
|
||||||
flag.StringVar(&c.WebDir, "web", c.WebDir, "web directory")
|
flag.StringVar(&c.WebDir, "web", c.WebDir, "web directory")
|
||||||
flag.IntVar(&c.MaxImgHeight, "height", c.MaxImgHeight, "maximum image height")
|
flag.IntVar(&c.MaxBannerHeight, "banner-height", c.MaxBannerHeight, "maximum banner height")
|
||||||
flag.IntVar(&c.MaxImgWidth, "width", c.MaxImgWidth, "maximum image width")
|
flag.IntVar(&c.MaxBannerWidth, "banner-width", c.MaxBannerWidth, "maximum banner width")
|
||||||
|
flag.IntVar(&c.MaxImgHeight, "img-height", c.MaxImgHeight, "maximum image height")
|
||||||
|
flag.IntVar(&c.MaxImgWidth, "img-width", c.MaxImgWidth, "maximum image width")
|
||||||
flag.IntVar(&port, "port", port, "port")
|
flag.IntVar(&port, "port", port, "port")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
@ -217,6 +223,14 @@ func (c *Config) setupConfig(cliConfig *Config) error {
|
|||||||
return fmt.Errorf("error setting up file: %v", err)
|
return fmt.Errorf("error setting up file: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cliConfig.MaxBannerHeight != defaultConfig.MaxBannerHeight {
|
||||||
|
c.MaxBannerHeight = cliConfig.MaxBannerHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
if cliConfig.MaxBannerWidth != defaultConfig.MaxBannerWidth {
|
||||||
|
c.MaxBannerWidth = cliConfig.MaxBannerWidth
|
||||||
|
}
|
||||||
|
|
||||||
if cliConfig.MaxImgHeight != defaultConfig.MaxImgHeight {
|
if cliConfig.MaxImgHeight != defaultConfig.MaxImgHeight {
|
||||||
c.MaxImgHeight = cliConfig.MaxImgHeight
|
c.MaxImgHeight = cliConfig.MaxImgHeight
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package backend
|
package backend
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"io"
|
"io"
|
||||||
@ -13,7 +14,7 @@ import (
|
|||||||
|
|
||||||
var ErrUnsupportedFormat error = image.ErrFormat // used internally by imaging
|
var ErrUnsupportedFormat error = image.ErrFormat // used internally by imaging
|
||||||
|
|
||||||
func SaveImage(c *Config, src io.Reader) (string, error) {
|
func SaveImage(src io.Reader, maxHeight, maxWidth int, path string) (string, error) {
|
||||||
img, err := imaging.Decode(src, imaging.AutoOrientation(true))
|
img, err := imaging.Decode(src, imaging.AutoOrientation(true))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == ErrUnsupportedFormat {
|
if err == ErrUnsupportedFormat {
|
||||||
@ -22,15 +23,15 @@ func SaveImage(c *Config, src io.Reader) (string, error) {
|
|||||||
return "", fmt.Errorf("error decoding image: %v", err)
|
return "", fmt.Errorf("error decoding image: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if img.Bounds().Dy() > c.MaxImgHeight {
|
if img.Bounds().Dy() > maxHeight {
|
||||||
img = imaging.Resize(img, 0, c.MaxImgHeight, imaging.Lanczos)
|
img = imaging.Resize(img, 0, maxHeight, imaging.Lanczos)
|
||||||
}
|
}
|
||||||
if img.Bounds().Dx() > c.MaxImgWidth {
|
if img.Bounds().Dx() > maxWidth {
|
||||||
img = imaging.Resize(img, c.MaxImgWidth, 0, imaging.Lanczos)
|
img = imaging.Resize(img, maxWidth, 0, imaging.Lanczos)
|
||||||
}
|
}
|
||||||
|
|
||||||
filename := fmt.Sprint(uuid.New(), ".webp")
|
filename := fmt.Sprint(uuid.New(), ".webp")
|
||||||
file, err := os.Create(c.PicsDir + "/" + filename)
|
file, err := os.Create(path + filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("error creating new image file: %v", err)
|
return "", fmt.Errorf("error creating new image file: %v", err)
|
||||||
}
|
}
|
||||||
@ -42,3 +43,20 @@ func SaveImage(c *Config, src io.Reader) (string, error) {
|
|||||||
|
|
||||||
return filename, nil
|
return filename, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ServeBase64Image(c *Config, filename string) (string, error) {
|
||||||
|
file := c.PicsDir + "/" + filename
|
||||||
|
|
||||||
|
img, err := os.Open(file)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("error opening file %v: %v", file, err)
|
||||||
|
}
|
||||||
|
defer img.Close()
|
||||||
|
|
||||||
|
imgBytes, err := io.ReadAll(img)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("error turning %v into bytes: %v", file, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return base64.StdEncoding.EncodeToString(imgBytes), nil
|
||||||
|
}
|
||||||
|
26
cmd/calls/atom.go
Normal file
26
cmd/calls/atom.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package calls
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
b "streifling.com/jason/cpolis/cmd/backend"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ServeAtomFeed(c *b.Config) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if !tokenIsVerified(w, r, c) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
absFilepath, err := filepath.Abs(c.AtomFeed)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
http.ServeFile(w, r, absFilepath)
|
||||||
|
}
|
||||||
|
}
|
@ -8,7 +8,7 @@ import (
|
|||||||
b "streifling.com/jason/cpolis/cmd/backend"
|
b "streifling.com/jason/cpolis/cmd/backend"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ServeImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
func ServeImage(c *b.Config) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
if !tokenIsVerified(w, r, c) {
|
if !tokenIsVerified(w, r, c) {
|
||||||
return
|
return
|
||||||
|
@ -348,7 +348,7 @@ func ReviewRejectedArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.Handler
|
|||||||
|
|
||||||
imgURL := strings.Split(data.Article.BannerLink, "/")
|
imgURL := strings.Split(data.Article.BannerLink, "/")
|
||||||
imgFileName := imgURL[len(imgURL)-1]
|
imgFileName := imgURL[len(imgURL)-1]
|
||||||
data.BannerImage, err = serveBase64Image(c, imgFileName)
|
data.BannerImage, err = b.ServeBase64Image(c, imgFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
@ -625,7 +625,7 @@ func ReviewArticle(c *b.Config, db *b.DB, s *b.CookieStore, action, title, butto
|
|||||||
|
|
||||||
imgURL := strings.Split(article.BannerLink, "/")
|
imgURL := strings.Split(article.BannerLink, "/")
|
||||||
imgFileName := imgURL[len(imgURL)-1]
|
imgFileName := imgURL[len(imgURL)-1]
|
||||||
data.BannerImage, err = serveBase64Image(c, imgFileName)
|
data.BannerImage, err = b.ServeBase64Image(c, imgFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
@ -808,7 +808,7 @@ func EditArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc {
|
|||||||
|
|
||||||
imgURL := strings.Split(data.Article.BannerLink, "/")
|
imgURL := strings.Split(data.Article.BannerLink, "/")
|
||||||
imgFileName := imgURL[len(imgURL)-1]
|
imgFileName := imgURL[len(imgURL)-1]
|
||||||
data.BannerImage, err = serveBase64Image(c, imgFileName)
|
data.BannerImage, err = b.ServeBase64Image(c, imgFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
@ -1,35 +1,14 @@
|
|||||||
package frontend
|
package frontend
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"html/template"
|
"html/template"
|
||||||
"io"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
|
||||||
|
|
||||||
b "streifling.com/jason/cpolis/cmd/backend"
|
b "streifling.com/jason/cpolis/cmd/backend"
|
||||||
)
|
)
|
||||||
|
|
||||||
func serveBase64Image(c *b.Config, filename string) (string, error) {
|
|
||||||
file := c.PicsDir + "/" + filename
|
|
||||||
|
|
||||||
img, err := os.Open(file)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("error opening file %v: %v", file, err)
|
|
||||||
}
|
|
||||||
defer img.Close()
|
|
||||||
|
|
||||||
imgBytes, err := io.ReadAll(img)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("error turning %v into bytes: %v", file, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return base64.StdEncoding.EncodeToString(imgBytes), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
if _, err := getSession(w, r, c, s); err != nil {
|
if _, err := getSession(w, r, c, s); err != nil {
|
||||||
@ -52,7 +31,7 @@ func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
filename, err := b.SaveImage(c, file)
|
filename, err := b.SaveImage(file, c.MaxImgHeight, c.MaxImgWidth, c.PicsDir+"/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == b.ErrUnsupportedFormat {
|
if err == b.ErrUnsupportedFormat {
|
||||||
http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest)
|
http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest)
|
||||||
@ -69,51 +48,6 @@ func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func UploadIssueImage(c *b.Config, s *b.CookieStore) http.HandlerFunc {
|
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
session, err := getSession(w, r, c, s)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := r.ParseMultipartForm(10 << 20); err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
file, _, err := r.FormFile("issue-image")
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
filename, err := b.SaveImage(c, file)
|
|
||||||
if err != nil {
|
|
||||||
if err == b.ErrUnsupportedFormat {
|
|
||||||
http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Println(err)
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
session.Values["issue-image"] = filename
|
|
||||||
if err = session.Save(r, w); err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate string) http.HandlerFunc {
|
func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate string) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
if _, err := getSession(w, r, c, s); err != nil {
|
if _, err := getSession(w, r, c, s); err != nil {
|
||||||
@ -130,7 +64,7 @@ func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate
|
|||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
filename, err := b.SaveImage(c, file)
|
filename, err := b.SaveImage(file, c.MaxBannerHeight, c.MaxBannerWidth, c.PicsDir+"/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == b.ErrUnsupportedFormat {
|
if err == b.ErrUnsupportedFormat {
|
||||||
http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest)
|
http.Error(w, "Das Dateiformat wird nicht unterstützt.", http.StatusBadRequest)
|
||||||
@ -141,7 +75,7 @@ func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
base64Img, err := serveBase64Image(c, filename)
|
base64Img, err := b.ServeBase64Image(c, filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
@ -11,8 +11,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func checkUserStrings(user *b.User) (string, int, bool) {
|
func checkUserStrings(user *b.User) (string, int, bool) {
|
||||||
userLen := 255
|
userLen := 63 // max value for utf-8 at 255 bytes
|
||||||
nameLen := 56 // max value when aes encrypting up to 255 bytes
|
nameLen := 56 // max value when aes encrypting utf-8 at up to 255 bytes
|
||||||
|
|
||||||
if len(user.UserName) > userLen {
|
if len(user.UserName) > userLen {
|
||||||
return "Benutzername", userLen, false
|
return "Benutzername", userLen, false
|
||||||
|
@ -66,8 +66,9 @@ func main() {
|
|||||||
mux.HandleFunc("GET /article/review-unpublished/{id}", f.ReviewArticle(config, db, store, "publish", "Artikel veröffentlichen", "Veröffentlichen"))
|
mux.HandleFunc("GET /article/review-unpublished/{id}", f.ReviewArticle(config, db, store, "publish", "Artikel veröffentlichen", "Veröffentlichen"))
|
||||||
mux.HandleFunc("GET /article/serve/{id}", c.ServeArticle(config, db))
|
mux.HandleFunc("GET /article/serve/{id}", c.ServeArticle(config, db))
|
||||||
mux.HandleFunc("GET /article/write", f.WriteArticle(config, db, store))
|
mux.HandleFunc("GET /article/write", f.WriteArticle(config, db, store))
|
||||||
|
mux.HandleFunc("GET /atom/serve", c.ServeAtomFeed(config))
|
||||||
mux.HandleFunc("GET /hub", f.ShowHub(config, db, store))
|
mux.HandleFunc("GET /hub", f.ShowHub(config, db, store))
|
||||||
mux.HandleFunc("GET /image/serve/{pic}", c.ServeImage(config, store))
|
mux.HandleFunc("GET /image/serve/{pic}", c.ServeImage(config))
|
||||||
mux.HandleFunc("GET /issue/this", f.ShowCurrentIssue(config, db, store))
|
mux.HandleFunc("GET /issue/this", f.ShowCurrentIssue(config, db, store))
|
||||||
mux.HandleFunc("GET /logout", f.Logout(config, store))
|
mux.HandleFunc("GET /logout", f.Logout(config, store))
|
||||||
mux.HandleFunc("GET /pdf/get-list", c.ServePDFList(config))
|
mux.HandleFunc("GET /pdf/get-list", c.ServePDFList(config))
|
||||||
|
Reference in New Issue
Block a user