...

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.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