diff options
| author | lost+skunk <[email protected]> | 2024-09-23 09:38:32 +0300 |
|---|---|---|
| committer | lost+skunk <[email protected]> | 2024-09-23 09:38:32 +0300 |
| commit | 191984b31ef228c4077904a2831a2af593352670 (patch) | |
| tree | 33d8dd464d525ce2ad8c92a749436f1c12442800 /app | |
| parent | c39399403e031a8c1ad53969770e4261d2c9e7aa (diff) | |
| download | skunky-art-191984b31ef228c4077904a2831a2af593352670.tar.gz skunky-art-191984b31ef228c4077904a2831a2af593352670.tar.bz2 skunky-art-191984b31ef228c4077904a2831a2af593352670.zip | |
v1.3.2v1.3.2
Diffstat (limited to 'app')
| -rw-r--r-- | app/api.go | 91 | ||||
| -rw-r--r-- | app/cache.go | 8 | ||||
| -rw-r--r-- | app/config.go | 9 | ||||
| -rw-r--r-- | app/router.go | 31 | ||||
| -rw-r--r-- | app/util.go | 23 | ||||
| -rw-r--r-- | app/wrapper.go | 27 |
6 files changed, 101 insertions, 88 deletions
@@ -9,69 +9,68 @@ import ( ) type API struct { - main *skunkyart + main *skunkyart } type info struct { - Version string `json:"version"` - Settings settingsParams `json:"settings"` + Version string `json:"version"` + Settings settingsParams `json:"settings"` } func (a API) Info() { - json, err := json.Marshal(info{ - Version: a.main.Version, - Settings: settingsParams{ - Nsfw: CFG.Nsfw, - Proxy: CFG.Proxy, - }, - }) - try(err) - a.main.Writer.Write(json) - return + json, err := json.Marshal(info{ + Version: a.main.Version, + Settings: settingsParams{ + Nsfw: CFG.Nsfw, + Proxy: CFG.Proxy, + }, + }) + try(err) + a.main.Writer.Write(json) } func (a API) Error(description string, status int) { - a.main.Writer.WriteHeader(status) - var response strings.Builder - response.WriteString(`{"error":"`) - response.WriteString(description) - response.WriteString(`"}`) - wr(a.main.Writer, response.String()) + a.main.Writer.WriteHeader(status) + var response strings.Builder + response.WriteString(`{"error":"`) + response.WriteString(description) + response.WriteString(`"}`) + wr(a.main.Writer, response.String()) } func (a API) sendMedia(d *devianter.Deviation) { - mediaUrl, name := devianter.UrlFromMedia(d.Media) + mediaUrl, name := devianter.UrlFromMedia(d.Media) a.main.SetFilename(name) - - if len(mediaUrl) != 0 { - mediaUrl = mediaUrl[21:] + + if len(mediaUrl) != 0 { + mediaUrl = mediaUrl[21:] dot := strings.Index(mediaUrl, ".") a.main.Writer.Header().Del("Content-Type") - a.main.DownloadAndSendMedia(mediaUrl[:dot], mediaUrl[dot+11:]) - } + a.main.DownloadAndSendMedia(mediaUrl[:dot], mediaUrl[dot+11:]) + } } // TODO: сделать фильтры func (a API) Random() { - for attempt := 1;; { - if attempt > 3 { - a.Error("Sorry, butt NSFW on this are disabled, and the instance failed to find a random art without NSFW", 500) - } - - s, err, daErr := devianter.PerformSearch(string(rand.Intn(999)), rand.Intn(30), 'a') - try(err) - if daErr.RAW != nil { - continue - } - - deviation := &s.Results[rand.Intn(len(s.Results))] - - if deviation.NSFW && !CFG.Nsfw { - attempt++ - continue - } - - a.sendMedia(deviation) - return - } + for attempt := 1; ; { + if attempt > 3 { + a.Error("Sorry, butt NSFW on this are disabled, and the instance failed to find a random art without NSFW", 500) + } + + s, err, daErr := devianter.PerformSearch(string(rand.Intn(999)), rand.Intn(30), 'a') + try(err) + if daErr.RAW != nil { + continue + } + + deviation := &s.Results[rand.Intn(len(s.Results))] + + if deviation.NSFW && !CFG.Nsfw { + attempt++ + continue + } + + a.sendMedia(deviation) + return + } } diff --git a/app/cache.go b/app/cache.go index 975fa0a..f9225be 100644 --- a/app/cache.go +++ b/app/cache.go @@ -27,10 +27,10 @@ func (s skunkyart) DownloadAndSendMedia(subdomain, path string) { url.WriteString(".wixmp.com/") url.WriteString(path) if t := s.Args.Get("token"); t != "" { - url.WriteString("?token=") - url.WriteString(t) + url.WriteString("?token=") + url.WriteString(t) } - + var response []byte switch { @@ -127,7 +127,7 @@ func InitCacheSystem() { try(os.RemoveAll(fileName)) } } - + if c.MaxSize != 0 && fileInfo.Size() > c.MaxSize { try(os.RemoveAll(fileName)) } diff --git a/app/config.go b/app/config.go index 745d2f4..2ba39a9 100644 --- a/app/config.go +++ b/app/config.go @@ -56,13 +56,11 @@ func ExecuteConfig() { if CFG.cfg != "" { f, err := os.ReadFile(CFG.cfg) tryWithExitStatus(err, 1) - tryWithExitStatus(json.Unmarshal(f, &CFG), 1) if CFG.Cache.Enabled && !CFG.Proxy { exit("Incompatible settings detected: cannot use caching media content without proxy", 1) } - static.StaticPath = CFG.StaticPath if CFG.Cache.Enabled { if CFG.Cache.Lifetime != "" { var duration int64 @@ -92,6 +90,13 @@ func ExecuteConfig() { CFG.Cache.MaxSize *= 1024 ^ 2 go InitCacheSystem() } + + About = instanceAbout{ + Proxy: CFG.Proxy, + Nsfw: CFG.Nsfw, + } + + static.StaticPath = CFG.StaticPath devianter.UserAgent = CFG.UserAgent } } diff --git a/app/router.go b/app/router.go index 32488cb..eddf0a9 100644 --- a/app/router.go +++ b/app/router.go @@ -3,7 +3,7 @@ package app import ( "io" "net/http" - u "net/url" + url "net/url" "skunkyart/static" "strconv" "strings" @@ -57,7 +57,7 @@ func Router() { Path = r.URL.Path path := parsepath(Path) Host = "http://" + r.Host - + if h := r.Header["X-Forwarded-Proto"]; len(h) != 0 && h[0] == "https" { Host = "https://" + r.Host } @@ -67,13 +67,13 @@ func Router() { skunky.Args = r.URL.Query() arg := skunky.Args.Get p, _ := strconv.Atoi(arg("p")) - + skunky.Endpoint = path[1] skunky.API.main = &skunky skunky.Writer = w skunky.BasePath = CFG.URI skunky.QueryRaw = arg("q") - skunky.Query = u.QueryEscape(skunky.QueryRaw) + skunky.Query = url.QueryEscape(skunky.QueryRaw) skunky.Page = p if t := arg("type"); len(t) > 0 { @@ -84,12 +84,21 @@ func Router() { skunky.Atom = true } + if CFG.Proxy { + w.Header().Add("Content-Security-Policy", "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'") + } else { + w.Header().Add("Content-Security-Policy", "default-src 'self'; img-src 'self' *.wixmp.com; script-src 'none'; style-src 'self' 'unsafe-inline'") + } + + w.Header().Add("X-Frame-Options", "DENY") + switch skunky.Endpoint { // main case "": skunky.ExecuteTemplate("index.htm", "html", &CFG.URI) case "about": - skunky.About() + skunky.Templates.About = About + skunky.ExecuteTemplate("about.htm", "html", &skunky) case "post": skunky.Deviation(path[2], path[3]) case "search": @@ -120,12 +129,12 @@ func Router() { case "api": w.Header().Add("Content-Type", "application/json") switch path[2] { - case "instance": - skunky.API.Info() - case "random": - skunky.API.Random() - default: - skunky.API.Error("Not Found", 404) + case "instance": + skunky.API.Info() + case "random": + skunky.API.Random() + default: + skunky.API.Error("Not Found", 404) } // 404 diff --git a/app/util.go b/app/util.go index c698090..9c8d400 100644 --- a/app/util.go +++ b/app/util.go @@ -1,6 +1,7 @@ package app import ( + "encoding/json" "io" "net/http" "net/url" @@ -40,18 +41,26 @@ func restore() { } var instances []byte +var About instanceAbout func RefreshInstances() { for { func() { defer restore() instances = Download("https://git.macaw.me/skunky/SkunkyArt/raw/branch/master/instances.json").Body + try(json.Unmarshal(instances, &About)) }() time.Sleep(1 * time.Hour) } } // some crap for frontend +type instanceAbout struct { + Proxy bool + Nsfw bool + Instances []settings +} + type skunkyart struct { Writer http.ResponseWriter @@ -63,15 +72,11 @@ type skunkyart struct { BasePath, Endpoint string Query, QueryRaw string - API API - Version string + API API + Version string Templates struct { - About struct { - Proxy bool - Nsfw bool - Instances []settings - } + About instanceAbout SomeList string DDStrips string @@ -132,7 +137,7 @@ func UrlBuilder(strs ...string) string { str.WriteString(CFG.URI) for n, x := range strs { str.WriteString(x) - if n := n+1; n < l && len(strs[n]) != 0 && !(strs[n][0] == '?' || strs[n][0] == '&') && !(x[0] == '?' || x[0] == '&') { + if n := n + 1; n < l && len(strs[n]) != 0 && !(strs[n][0] == '?' || strs[n][0] == '&') && !(x[0] == '?' || x[0] == '&') { str.WriteString("/") } } @@ -215,6 +220,8 @@ func ParseMedia(media devianter.Media, thumb ...int) string { filename = "image.gif" } return UrlBuilder("media", "file", mediaUrl[:dot], mediaUrl[dot+11:], "&filename=", filename) + } else if !CFG.Proxy { + return mediaUrl } return "" } diff --git a/app/wrapper.go b/app/wrapper.go index a2e0fa4..5cac175 100644 --- a/app/wrapper.go +++ b/app/wrapper.go @@ -1,7 +1,6 @@ package app import ( - "encoding/json" "regexp" "strconv" "strings" @@ -24,8 +23,8 @@ func (s skunkyart) GRUser() { s.Templates.GroupUser.GR, err, daError = g.Get() try(err) if daError.RAW != nil { - s.Error(daError) - return + s.Error(daError) + return } group := &s.Templates.GroupUser @@ -68,7 +67,7 @@ func (s skunkyart) GRUser() { group.About.Interests += interest.String() } } - group.About.Comments = s.ParseComments(devianter.GetComments(strconv.Itoa(group.GR.Gruser.ID),"",s.Page,4)) + group.About.Comments = s.ParseComments(devianter.GetComments(strconv.Itoa(group.GR.Gruser.ID), "", s.Page, 4)) case "cover_deviation": group.About.BGMeta = x.ModuleData.CoverDeviation.Deviation @@ -225,8 +224,8 @@ func (s skunkyart) Deviation(author, postname string) { func (s skunkyart) DD() { dd, err := devianter.GetDailyDeviations(s.Page) if err.RAW != nil { - s.Error(err) - return + s.Error(err) + return } var strips strings.Builder for _, x := range dd.Strips { @@ -312,12 +311,13 @@ func (s skunkyart) Search() { return } try(err) - if daError.RAW != nil { - s.Error(daError) - return - } if s.Type != 'r' { + if daError.RAW != nil { + s.Error(daError) + return + } + ss.List = s.DeviationList(ss.Content.Results, false, DeviationList{ Pages: ss.Content.Pages, More: ss.Content.HasMore, @@ -339,10 +339,3 @@ func (s skunkyart) Emojitar(name string) { } wr(s.Writer, ae) } - -func (s skunkyart) About() { - s.Templates.About.Nsfw = CFG.Nsfw - s.Templates.About.Proxy = CFG.Proxy - try(json.Unmarshal(instances, &s.Templates.About)) - s.ExecuteTemplate("about.htm", "html", &s) -} |
