dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit ea5318ae9b2a8642a4786496fa5a9f6b46314942
parent 53946d961463268336a1ed8ad53114076e26b186
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Sat, 10 Jun 2023 21:49:28 -0700

dynamic external links

Diffstat:
Mpkg/database/utils/processMessage.go | 84++++++++++++++++++++++++++++++++++++++-----------------------------------------
Mpkg/web/handlers/handlers.go | 20++++++++++++++++++++
Mpkg/web/web.go | 1+
3 files changed, 61 insertions(+), 44 deletions(-)

diff --git a/pkg/database/utils/processMessage.go b/pkg/database/utils/processMessage.go @@ -14,6 +14,7 @@ import ( "github.com/microcosm-cc/bluemonday" html2 "html" "math" + "net/url" "regexp" "strings" "time" @@ -421,6 +422,34 @@ func splitQuote(in string) (string, string) { return in[:idx], in[idx:] } +var LibredditURLs = []string{ + "http://spjmllawtheisznfs7uryhxumin26ssv2draj7oope3ok3wuhy43eoyd.onion", + "http://fwhhsbrbltmrct5hshrnqlqygqvcgmnek3cnka55zj4y7nuus5muwyyd.onion", + "http://kphht2jcflojtqte4b4kyx7p2ahagv4debjj32nre67dxz7y57seqwyd.onion", + "http://inytumdgnri7xsqtvpntjevaelxtgbjqkuqhtf6txxhwbll2fwqtakqd.onion", + "http://liredejj74h5xjqr2dylnl5howb2bpikfowqoveub55ru27x43357iid.onion", + "http://kzhfp3nvb4qp575vy23ccbrgfocezjtl5dx66uthgrhu7nscu6rcwjyd.onion", + "http://ecue64ybzvn6vjzl37kcsnwt4ycmbsyf74nbttyg7rkc3t3qwnj7mcyd.onion", + "http://ledditqo2mxfvlgobxnlhrkq4dh34jss6evfkdkb2thlvy6dn4f4gpyd.onion", + "http://ol5begilptoou34emq2sshf3may3hlblvipdjtybbovpb7c7zodxmtqd.onion", + "http://lbrdtjaj7567ptdd4rv74lv27qhxfkraabnyphgcvptl64ijx2tijwid.onion", +} + +var InvidiousURLs = []string{ + "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion", + "http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion", + "http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion"} + +var WikilessURLs = []string{ + "http://c2pesewpalbi6lbfc5hf53q4g3ovnxe4s7tfa6k2aqkf7jd7a7dlz5ad.onion", + "http://dj2tbh2nqfxyfmvq33cjmhuw7nb6am7thzd3zsjvizeqf374fixbrxyd.onion"} + +var NitterURLs = []string{ + "http://nitraeju2mipeziu2wtcrqsxg7h62v5y4eqgwi75uprynkj74gevvuqd.onion"} + +var RimgoURLs = []string{ + "http://be7udfhmnzqyt7cxysg6c4pbawarvaofjjywp35nhd5qamewdfxl6sid.onion"} + func convertLinks(in string, roomID database.RoomID, getUserByUsername func(database.Username) (database.User, error), @@ -428,34 +457,6 @@ func convertLinks(in string, getChatMessageByUUID func(string) (database.ChatMessage, error)) string { quote, rest := splitQuote(in) - libredditURLs := []string{ - "http://spjmllawtheisznfs7uryhxumin26ssv2draj7oope3ok3wuhy43eoyd.onion", - "http://fwhhsbrbltmrct5hshrnqlqygqvcgmnek3cnka55zj4y7nuus5muwyyd.onion", - "http://kphht2jcflojtqte4b4kyx7p2ahagv4debjj32nre67dxz7y57seqwyd.onion", - "http://inytumdgnri7xsqtvpntjevaelxtgbjqkuqhtf6txxhwbll2fwqtakqd.onion", - "http://liredejj74h5xjqr2dylnl5howb2bpikfowqoveub55ru27x43357iid.onion", - "http://kzhfp3nvb4qp575vy23ccbrgfocezjtl5dx66uthgrhu7nscu6rcwjyd.onion", - "http://ecue64ybzvn6vjzl37kcsnwt4ycmbsyf74nbttyg7rkc3t3qwnj7mcyd.onion", - "http://ledditqo2mxfvlgobxnlhrkq4dh34jss6evfkdkb2thlvy6dn4f4gpyd.onion", - "http://ol5begilptoou34emq2sshf3may3hlblvipdjtybbovpb7c7zodxmtqd.onion", - "http://lbrdtjaj7567ptdd4rv74lv27qhxfkraabnyphgcvptl64ijx2tijwid.onion", - } - - invidiousURLs := []string{ - "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion", - "http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion", - "http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion"} - - wikilessURLs := []string{ - "http://c2pesewpalbi6lbfc5hf53q4g3ovnxe4s7tfa6k2aqkf7jd7a7dlz5ad.onion", - "http://dj2tbh2nqfxyfmvq33cjmhuw7nb6am7thzd3zsjvizeqf374fixbrxyd.onion"} - - nitterURLs := []string{ - "http://nitraeju2mipeziu2wtcrqsxg7h62v5y4eqgwi75uprynkj74gevvuqd.onion"} - - rimgoURLs := []string{ - "http://be7udfhmnzqyt7cxysg6c4pbawarvaofjjywp35nhd5qamewdfxl6sid.onion"} - knownOnions := [][]string{ {"http://dkfgit.onion", config.DkfGitOnion}, {"http://dread.onion", config.DreadOnion}, @@ -491,20 +492,18 @@ func convertLinks(in string, // Handle reddit links if strings.HasPrefix(link, "https://www.reddit.com/") { old := strings.Replace(link, "https://www.reddit.com/", "https://old.reddit.com/", 1) - libredditLink := utils.RandChoice(libredditURLs) - libredditLink = strings.Replace(link, "https://www.reddit.com", libredditLink, 1) + libredditLink := "/external-link/libreddit/" + url.PathEscape(strings.TrimPrefix(link, "https://www.reddit.com/")) oldHtmlLink := makeHtmlLink("old", old) libredditHtmlLink := makeHtmlLink("libredditLink", libredditLink) htmlLink := makeHtmlLink(link, link) return htmlLink + ` (` + oldHtmlLink + ` | ` + libredditHtmlLink + `)` } else if strings.HasPrefix(link, "https://old.reddit.com/") { - libredditLink := utils.RandChoice(libredditURLs) - libredditLink = strings.Replace(link, "https://old.reddit.com", libredditLink, 1) + libredditLink := "/external-link/libreddit/" + url.PathEscape(strings.TrimPrefix(link, "https://old.reddit.com/")) libredditHtmlLink := makeHtmlLink("libredditLink", libredditLink) htmlLink := makeHtmlLink(link, link) return htmlLink + ` (` + libredditHtmlLink + `)` } - for _, libredditURL := range libredditURLs { + for _, libredditURL := range LibredditURLs { if strings.HasPrefix(link, libredditURL) { newPrefix := strings.Replace(link, libredditURL, "http://reddit.onion", 1) old := strings.Replace(link, libredditURL, "https://old.reddit.com", 1) @@ -515,7 +514,7 @@ func convertLinks(in string, } // Append YouTube link to invidious link - for _, invidiousURL := range invidiousURLs { + for _, invidiousURL := range InvidiousURLs { if strings.HasPrefix(link, invidiousURL) { if strings.Contains(link, ".onion/watch?v=") { newPrefix := strings.Replace(link, invidiousURL, "http://invidious.onion", 1) @@ -544,13 +543,12 @@ func convertLinks(in string, // Append wikiless link to wikipedia link if strings.HasPrefix(link, "https://en.wikipedia.org/") { - wikilessLink := utils.RandChoice(wikilessURLs) - wikilessLink = strings.Replace(link, "https://en.wikipedia.org", wikilessLink, 1) + wikilessLink := "/external-link/nitter/" + url.PathEscape(strings.TrimPrefix(link, "https://en.wikipedia.org/")) wikilessHtmlLink := makeHtmlLink("Wikiless", wikilessLink) htmlLink := makeHtmlLink(link, link) return htmlLink + ` (` + wikilessHtmlLink + `)` } - for _, wikilessURL := range wikilessURLs { + for _, wikilessURL := range WikilessURLs { if strings.HasPrefix(link, wikilessURL) { newPrefix := strings.Replace(link, wikilessURL, "http://wikiless.onion", 1) wikipediaPrefix := strings.Replace(link, wikilessURL, "https://en.wikipedia.org", 1) @@ -562,13 +560,12 @@ func convertLinks(in string, // Append nitter link to twitter link if strings.HasPrefix(link, "https://twitter.com/") { - nitterLink := utils.RandChoice(nitterURLs) - nitterLink = strings.Replace(link, "https://twitter.com", nitterLink, 1) + nitterLink := "/external-link/nitter/" + url.PathEscape(strings.TrimPrefix(link, "https://twitter.com/")) nitterHtmlLink := makeHtmlLink("Nitter", nitterLink) htmlLink := makeHtmlLink(link, link) return htmlLink + ` (` + nitterHtmlLink + `)` } - for _, nitterURL := range nitterURLs { + for _, nitterURL := range NitterURLs { if strings.HasPrefix(link, nitterURL) { newPrefix := strings.Replace(link, nitterURL, "http://nitter.onion", 1) twitterPrefix := strings.Replace(link, nitterURL, "https://twitter.com", 1) @@ -580,13 +577,12 @@ func convertLinks(in string, // Append rimgo link to imgur link if strings.HasPrefix(link, "https://imgur.com/") { - rimgoLink := utils.RandChoice(rimgoURLs) - rimgoLink = strings.Replace(link, "https://imgur.com", rimgoLink, 1) + rimgoLink := "/external-link/rimgo/" + url.PathEscape(strings.TrimPrefix(link, "https://imgur.com/")) rimgoHtmlLink := makeHtmlLink("Rimgo", rimgoLink) htmlLink := makeHtmlLink(link, link) return htmlLink + ` (` + rimgoHtmlLink + `)` } - for _, rimgoURL := range rimgoURLs { + for _, rimgoURL := range RimgoURLs { if strings.HasPrefix(link, rimgoURL) { newPrefix := strings.Replace(link, rimgoURL, "http://rimgo.onion", 1) imgurPrefix := strings.Replace(link, rimgoURL, "https://imgur.com", 1) @@ -615,7 +611,7 @@ func convertLinks(in string, videoID = m[1] } if videoID != "" { - invidiousLink := utils.RandChoice(invidiousURLs) + "/watch?v=" + videoID + "&local=true" + invidiousLink := "/external-link/invidious/" + url.PathEscape("watch?v="+videoID+"&local=true") invidiousHtmlLink := makeHtmlLink("Invidious", invidiousLink) htmlLink := makeHtmlLink(link, link) youtubeLink := "https://www.youtube.com/watch?v=" + videoID diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -2448,6 +2448,26 @@ func RoomChatSettingsHandler(c echo.Context) error { return c.Render(http.StatusOK, "chat-room-settings", data) } +func ExternalLinkHandler(c echo.Context) error { + service := c.Param("service") + original, _ := url.PathUnescape(c.Param("original")) + baseURL := "/" + if service == "invidious" { + baseURL = utils.RandChoice(dutils.InvidiousURLs) + } else if service == "libreddit" { + baseURL = utils.RandChoice(dutils.LibredditURLs) + } else if service == "wikiless" { + baseURL = utils.RandChoice(dutils.WikilessURLs) + } else if service == "nitter" { + baseURL = utils.RandChoice(dutils.NitterURLs) + } else if service == "rimgo" { + baseURL = utils.RandChoice(dutils.RimgoURLs) + } else { + return c.String(http.StatusNotFound, "Not found") + } + return c.Redirect(http.StatusFound, baseURL+"/"+original) +} + func ChatCreateRoomHandler(c echo.Context) error { authUser := c.Get("authUser").(*database.User) db := c.Get("database").(*database.DkfDB) diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -229,6 +229,7 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te authGroup.POST("/chat/:roomName/delete", handlers.ChatDeleteHandler) authGroup.GET("/chat/:roomName/settings", handlers.RoomChatSettingsHandler) authGroup.POST("/chat/:roomName/settings", handlers.RoomChatSettingsHandler) + authGroup.GET("/external-link/:service/:original", handlers.ExternalLinkHandler) moderatorGroup := e.Group("", middlewares.IsModeratorMiddleware) moderatorGroup.POST("/api/v1/users/:userID/hellban", v1.UserHellbanHandler) moderatorGroup.POST("/api/v1/users/:userID/unhellban", v1.UserUnHellbanHandler)