/* MastoGem, A Mastodon proxy for Gemini Copyright (C) 2021 Romain de Laage This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package main import ( "html" "regexp" "strings" "os" "io/ioutil" "encoding/json" "log" "time" "net/url" ) func getConfig() Config { configPath := os.Getenv("MASTOGEM_CONFIG_PATH") if configPath == "" { log.Println("MASTOGEM_CONFIG_PATH was not set, using default settings") config := Config{ Listen: "127.0.0.1:1965", CertPath: "certs/cert.pem", KeyPath: "certs/key.rsa", BaseURL: "https://mamot.fr", Title: "MastoGem", HomeMessage: "Welcome on MastoGem, this is a Mastodon proxy for Gemini. You can view the last 20 toots of a Mastodon account by providing its ID.", RateLimit: 45, } return config } configFile, err := ioutil.ReadFile(configPath) if err != nil { log.Fatalln("config file: %s", err) } var config Config err = json.Unmarshal(configFile, &config) if err != nil { log.Fatalln("config file: %s", err) } return config } func removeHTMLTags(content string) string { text := strings.ReplaceAll(content, "

", "") text = strings.ReplaceAll(text, "

", "\n\n") text = strings.ReplaceAll(text, "
", "\n") text = strings.ReplaceAll(text, "
", "\n") text = strings.ReplaceAll(text, "", "") text = strings.ReplaceAll(text, "", "") regexString := "]*)?>" regex, err := regexp.Compile(regexString) if err != nil { log.Println("regex: %s", err) return "" } text = regex.ReplaceAllLiteralString(text, "") regexString = "]*)?>" regex, err = regexp.Compile(regexString) if err != nil { log.Println("regex: %s", err) return "" } text = regex.ReplaceAllLiteralString(text, "") text = html.UnescapeString(text) return text } func formatBlog(toot Blog) string { var content string if toot.Reblog == nil { content = toot.Content } else { content = toot.Reblog.Content } content = removeHTMLTags(content) content = strings.Trim(content, " \n\r") content = strings.ReplaceAll(content, "\n#", "\n[#]") if strings.HasPrefix(content, "#") { content = "[#]" + content[1:] } var author string if toot.Author.DisplayName == "" { author = toot.Author.Name } else { author = toot.Author.DisplayName } var header string if toot.Reblog == nil { header = "### Written by " + author + " on " + toot.Date[0:10] + " at " + toot.Date[11:16] } else { var originalAuthor string if toot.Reblog.Author.DisplayName == "" { originalAuthor = toot.Reblog.Author.Name } else { originalAuthor = toot.Reblog.Author.DisplayName } header = "### Shared by " + author + " on " + toot.Date[0:10] + " at " + toot.Date[11:16] + " (original by " + originalAuthor + ")" } footer := "\n" for _, media := range toot.Medias { mediaURL := url.QueryEscape(media.Url) footer += "=> /media?" + mediaURL + " View attached media\n" } footer += "\n=> /toot/" + toot.Id + " More informations about this toot" return header + "\n" + content + "\n" + footer } func rateIsOk(tab map[string]Rate, remoteIP string, limit int) bool { elmt, ok := tab[remoteIP] if ok == false { tab[remoteIP] = Rate{time.Now(), 1} return true } else { if time.Since(elmt.Date).Minutes() >= 1 { tab[remoteIP] = Rate{time.Now(), 1} return true } else { if elmt.Count < limit { tab[remoteIP] = Rate{elmt.Date, elmt.Count + 1} return true } else { return false } } } }