1 package server
2
3 import (
4 "net/http"
5 "os"
6 "path/filepath"
7 "runtime"
8 "sort"
9 "strings"
10 "time"
11
12 "codeberg.org/tslocum/sriracha/internal/database"
13 . "codeberg.org/tslocum/sriracha/model"
14 . "codeberg.org/tslocum/sriracha/util"
15 )
16
17 func (s *Server) serveSetting(data *templateData, db *database.DB, w http.ResponseWriter, r *http.Request) {
18 if data.forbidden(w, RoleAdmin) {
19 return
20 }
21
22 if r.URL.Path == "/sriracha/setting/reset" {
23 oldOpt := s.opt
24
25 s.opt.SiteName = defaultServerSiteName
26 db.SaveString("sitename", s.opt.SiteName)
27
28 s.opt.SiteHome = defaultServerSiteHome
29 db.SaveString("sitehome", s.opt.SiteHome)
30
31 s.opt.News = NewsDisable
32 db.SaveInt("news", int(s.opt.News))
33
34 s.opt.BoardIndex = true
35 db.SaveBool("boardindex", s.opt.BoardIndex)
36
37 s.opt.CAPTCHA = false
38 db.SaveBool("captcha", s.opt.CAPTCHA)
39
40 s.opt.OekakiWidth = defaultServerOekakiWidth
41 db.SaveInt("oekakiwidth", s.opt.OekakiWidth)
42
43 s.opt.OekakiHeight = defaultServerOekakiHeight
44 db.SaveInt("oekakiheight", s.opt.OekakiHeight)
45
46 s.opt.Refresh = defaultServerRefresh
47 db.SaveInt("refresh", s.opt.Refresh)
48
49 s.opt.Overboard = ""
50 db.SaveString("overboard", s.opt.Overboard)
51
52 s.opt.OverboardType = TypeImageboard
53 db.SaveInt("overboardtype", int(s.opt.OverboardType))
54
55 s.opt.OverboardThreads = DefaultBoardThreads
56 db.SaveInt("overboardthreads", s.opt.OverboardThreads)
57
58 s.opt.OverboardReplies = DefaultBoardReplies
59 db.SaveInt("overboardreplies", s.opt.OverboardReplies)
60
61 s.opt.Embeds = nil
62 var embeds []string
63 for _, info := range defaultServerEmbeds {
64 embedName, embedURL := info[0], info[1]
65 s.opt.Embeds = append(s.opt.Embeds, info)
66 embeds = append(embeds, embedName+" "+embedURL)
67 }
68 db.SaveMultiString("embeds", embeds)
69
70 changes := printChanges(oldOpt, s.opt)
71 if changes != "" {
72 s.log(db, data.Account, nil, "Reset settings", changes)
73 }
74
75 s.rebuildAll(db)
76
77 http.Redirect(w, r, "/sriracha/setting", http.StatusFound)
78 return
79 }
80
81 if r.Method == http.MethodPost {
82 overboard := FormString(r, "overboard")
83 if overboard != "" && overboard != "/" {
84 if !AlphaNumericAndSymbols.MatchString(overboard) {
85 data.ManageError("Invalid overboard directory.")
86 return
87 }
88 }
89
90 oldOpt := s.opt
91
92 siteName := FormString(r, "sitename")
93 if siteName != "" {
94 db.SaveString("sitename", siteName)
95 s.opt.SiteName = siteName
96 }
97
98 siteHome := FormString(r, "sitehome")
99 if siteHome != "" {
100 if !strings.HasSuffix(siteHome, "/") {
101 siteHome += "/"
102 }
103 db.SaveString("sitehome", siteHome)
104 s.opt.SiteHome = siteHome
105 }
106
107 news := FormInt(r, "news")
108 db.SaveInt("news", news)
109 s.opt.News = NewsOption(news)
110
111 boardIndex := FormBool(r, "boardindex")
112 db.SaveBool("boardindex", boardIndex)
113 s.opt.BoardIndex = boardIndex
114
115 enableCAPTCHA := FormBool(r, "captcha")
116 db.SaveBool("captcha", enableCAPTCHA)
117 s.opt.CAPTCHA = enableCAPTCHA
118
119 oekakiWidth := FormInt(r, "oekakiwidth")
120 db.SaveInt("oekakiwidth", oekakiWidth)
121 s.opt.OekakiWidth = oekakiWidth
122
123 oekakiHeight := FormInt(r, "oekakiheight")
124 db.SaveInt("oekakiheight", oekakiHeight)
125 s.opt.OekakiHeight = oekakiHeight
126
127 refresh := FormInt(r, "refresh")
128 db.SaveInt("refresh", refresh)
129 s.opt.Refresh = refresh
130
131 db.SaveString("overboard", overboard)
132 s.opt.Overboard = overboard
133
134 overboardType := FormRange(r, "overboardtype", TypeImageboard, TypeForum)
135 db.SaveInt("overboardtype", int(overboardType))
136 s.opt.OverboardType = overboardType
137
138 overboardThreads := FormInt(r, "overboardthreads")
139 db.SaveInt("overboardthreads", overboardThreads)
140 s.opt.OverboardThreads = overboardThreads
141
142 overboardReplies := FormInt(r, "overboardreplies")
143 db.SaveInt("overboardreplies", overboardReplies)
144 s.opt.OverboardReplies = overboardReplies
145
146 if overboard != "" && overboard != "/" {
147 os.Mkdir(filepath.Join(s.config.Root, overboard), NewDirPermission)
148 }
149
150 s.opt.Embeds = nil
151 r.ParseForm()
152 var embedNames []string
153 for name := range r.Form {
154 if strings.HasPrefix(name, "embeds") {
155 embedNames = append(embedNames, name)
156 }
157 }
158 sort.Strings(embedNames)
159 var embeds []string
160 for _, name := range embedNames {
161 for _, vv := range r.Form[name] {
162 value := strings.TrimSpace(vv)
163 if value == "" {
164 continue
165 }
166 split := strings.SplitN(value, " ", 2)
167 if len(split) != 2 || (!strings.HasPrefix(split[1], "http://") && !strings.HasPrefix(split[1], "https://")) || !strings.Contains(split[1], "SRIRACHA_EMBED") {
168 continue
169 }
170 s.opt.Embeds = append(s.opt.Embeds, [2]string{split[0], split[1]})
171 embeds = append(embeds, vv)
172 }
173 }
174 db.SaveMultiString("embeds", embeds)
175
176 changes := printChanges(oldOpt, s.opt)
177 if changes != "" {
178 s.log(db, data.Account, nil, "Updated settings", changes)
179 }
180
181 s.rebuildAll(db)
182 }
183 data.Template = "manage_setting"
184 data.Extra = SrirachaVersion
185
186 var m runtime.MemStats
187 runtime.ReadMemStats(&m)
188 data.Extra2 = FormatFileSize(int64(m.Sys))
189
190 data.Extra3 = FormatDuration(time.Since(s.config.StartTime))
191 }
192
View as plain text