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