...

Source file src/codeberg.org/tslocum/sriracha/internal/server/server_setting.go

Documentation: codeberg.org/tslocum/sriracha/internal/server

     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