PoC of kernel.org
proxy
This commit is contained in:
parent
8ed52d1c79
commit
83b2199a99
4 changed files with 242 additions and 0 deletions
112
proxy/domains.go
Normal file
112
proxy/domains.go
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"github.com/vishalkuo/bimap"
|
||||||
|
"golang.org/x/net/idna"
|
||||||
|
)
|
||||||
|
|
||||||
|
var DOMAINS *bimap.BiMap[string, string] = bimap.NewBiMapFromMap(map[string]string {
|
||||||
|
"www.docs.kernel.org": "ввв.доктора.ядро.орг",
|
||||||
|
"www.wiki.kernel.org": "ввв.грешник.ядро.орг",
|
||||||
|
"am.mirrors.kernel.org": "являются.зеркалами.ядро.орг",
|
||||||
|
"ams.source.kernel.org": "источник.амс.ядро.орг",
|
||||||
|
"android.kernel.org": "андроид.ядро.орг",
|
||||||
|
"ap.edge.kernel.org": "край.ап.ядро.орг",
|
||||||
|
"archive.kernel.org": "архив.ядро.орг",
|
||||||
|
"b4.docs.kernel.org": "доктора.б4.ядро.орг",
|
||||||
|
"btrfs.docs.kernel.org": "доктора.битрифс.ядро.орг",
|
||||||
|
"bugzilla.kernel.org": "бугзила.ядро.орг",
|
||||||
|
"cdn.kernel.org": "раздатчик.ядро.орг",
|
||||||
|
"cregit.origin.kernel.org": "происхождение.крегит.ядро.орг",
|
||||||
|
"cxl.docs.kernel.org": "доктора.схл.ядро.орг",
|
||||||
|
"dfw.source.kernel.org": "источник.дфв.ядро.орг",
|
||||||
|
"docs.kernel.org": "доктора.ядро.орг",
|
||||||
|
"erofs.docs.kernel.org": "доктора.эротическаяфс.ядро.орг",
|
||||||
|
"erol.kernel.org": "эротика.ядро.орг",
|
||||||
|
"eu.edge.kernel.org": "край.евросоюза.ядро.орг",
|
||||||
|
"git.kernel.org": "мерзавец.ядро.орг",
|
||||||
|
"ieee1394.docs.kernel.org": "доктора.иеее1394.ядро.орг",
|
||||||
|
"kernel.org": "ядро.орг",
|
||||||
|
"linux-mmp.docs.kernel.org": "доктора.линукс-карта.ядро.орг",
|
||||||
|
"linux.kernel.org": "линукс.ядро.орг",
|
||||||
|
"lkml.kernel.org": "саял.ядро.орг",
|
||||||
|
"lore.kernel.org": "уздечка.ядро.орг",
|
||||||
|
"mail.kernel.org": "почта.ядро.орг",
|
||||||
|
"media.social.kernel.org": "социальные.сми.ядро.орг",
|
||||||
|
"mirrors.edge.kernel.org": "край.зеркал.ядро.орг",
|
||||||
|
"mirrors.kernel.org": "зеркала.ядро.орг",
|
||||||
|
"na.edge.kernel.org": "край.на.ядро.орг",
|
||||||
|
"nntp.lore.kernel.org": "уздечка.сппн.ядро.орг",
|
||||||
|
"ny.mirrors.kernel.org": "нью-йоркские.зеркала.ядро.орг",
|
||||||
|
"nyc.source.kernel.org": "источник.нук.ядро.орг",
|
||||||
|
"pad.kernel.org": "клавиатура.ядро.орг",
|
||||||
|
"parisc.docs.kernel.org": "доктора.париж.ядро.орг",
|
||||||
|
"patchwork.kernel.org": "путаница.ядро.орг",
|
||||||
|
"people.kernel.org": "люди.ядро.орг",
|
||||||
|
"planet.kernel.org": "планета.ядро.орг",
|
||||||
|
"pop.lore.kernel.org": "уздечка.популярности.ядро.орг",
|
||||||
|
"remail.kernel.org": "перепочта.ядро.орг",
|
||||||
|
"sin.source.kernel.org": "источник.греха.ядро.орг",
|
||||||
|
"smtp.kernel.org": "пппп.ядро.орг",
|
||||||
|
"smtp.lore.kernel.org": "уздечка.пппп.ядро.орг",
|
||||||
|
"smtp.subspace.kernel.org": "подместо.пппп.ядро.орг",
|
||||||
|
"smtp1.kernel.org": "пппп1.ядро.орг",
|
||||||
|
"smtp2.kernel.org": "пппп2.ядро.орг",
|
||||||
|
"smtp3.kernel.org": "пппп3.ядро.орг",
|
||||||
|
"social.kernel.org": "социальный.ядро.орг",
|
||||||
|
"sparse.docs.kernel.org": "редкие.доктора.ядро.орг",
|
||||||
|
"subspace.kernel.org": "подместо.ядро.орг",
|
||||||
|
"sv.mirrors.kernel.org": "зеркала.резюме.ядро.орг",
|
||||||
|
"sy.mirrors.kernel.org": "сай.отражает.ядро.орг",
|
||||||
|
"vger.kernel.org": "мпук.ядро.орг",
|
||||||
|
"wiki.kernel.org": "грешник.ядро.орг",
|
||||||
|
"wireless.docs.kernel.org": "беспроводные.доктора.ядро.орг",
|
||||||
|
"wireless.kernel.org": "радио.ядро.орг",
|
||||||
|
"www.kernel.org": "ввв.ядро.орг",
|
||||||
|
"yul.archive.kernel.org": "архив.юл.ядро.орг",
|
||||||
|
});
|
||||||
|
|
||||||
|
var WILDCARD_DOMAINS = [][]string{
|
||||||
|
{".docs.kernel.org", ".доктора.ядро.орг"},
|
||||||
|
{".wiki.kernel.org", ".грешник.ядро.орг"},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
func Kernel2Yadro(str string) (string, bool) {
|
||||||
|
if yadro, found := DOMAINS.Get(str); found {
|
||||||
|
return yadro, true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, kernel_yadro := range WILDCARD_DOMAINS {
|
||||||
|
if stem, found := strings.CutSuffix(str, kernel_yadro[0]); found {
|
||||||
|
return stem + kernel_yadro[1], true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
func Yadro2Kernel(str string, punycode bool) (string, bool) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if punycode {
|
||||||
|
str, err = idna.ToUnicode(str)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if kernel, found := DOMAINS.GetInverse(str); found {
|
||||||
|
return kernel, true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, kernel_yadro := range WILDCARD_DOMAINS {
|
||||||
|
if stem, found := strings.CutSuffix(str, kernel_yadro[1]); found {
|
||||||
|
return stem + kernel_yadro[0], true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", false
|
||||||
|
}
|
9
proxy/go.mod
Normal file
9
proxy/go.mod
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module github.com/wzray/promty/proxy
|
||||||
|
|
||||||
|
go 1.23.3
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/vishalkuo/bimap v0.0.0-20230830142743-a9fb9b52066c // indirect
|
||||||
|
golang.org/x/net v0.31.0 // indirect
|
||||||
|
golang.org/x/text v0.20.0 // indirect
|
||||||
|
)
|
6
proxy/go.sum
Normal file
6
proxy/go.sum
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
github.com/vishalkuo/bimap v0.0.0-20230830142743-a9fb9b52066c h1:KEcyvVSSrD/dq45OZpwFG7/gi608xzyriB8kgquCgPU=
|
||||||
|
github.com/vishalkuo/bimap v0.0.0-20230830142743-a9fb9b52066c/go.mod h1:oVZgsxuZOVCkAVcgSitAfucCKX0Ani+R8bIbfGdqAkg=
|
||||||
|
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||||
|
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||||
|
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||||
|
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
115
proxy/main.go
Normal file
115
proxy/main.go
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"bytes"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"compress/gzip"
|
||||||
|
"net/url"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httputil"
|
||||||
|
"golang.org/x/text/encoding/charmap"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
proxy := &httputil.ReverseProxy{
|
||||||
|
Rewrite: func(r *httputil.ProxyRequest) {
|
||||||
|
host, _ := Yadro2Kernel(r.In.Host, true)
|
||||||
|
url, err := url.Parse("https://" + host)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
// TODO...
|
||||||
|
}
|
||||||
|
|
||||||
|
r.SetURL(url)
|
||||||
|
|
||||||
|
// We only support gzip decoding
|
||||||
|
r.Out.Header.Set("Accept-Encoding", "gzip")
|
||||||
|
},
|
||||||
|
ModifyResponse: func(r *http.Response) error {
|
||||||
|
// Disable security policy because of the domain restrictions.
|
||||||
|
r.Header.Del("Content-Security-Policy")
|
||||||
|
|
||||||
|
// Skip non-html pages.
|
||||||
|
contentType := r.Header.Get("Content-Type")
|
||||||
|
if !strings.HasPrefix(contentType, "text/") {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read response body into data. If body is encoded, decode it.
|
||||||
|
var data []byte
|
||||||
|
|
||||||
|
switch r.Header.Get("Content-Encoding") {
|
||||||
|
case "gzip":
|
||||||
|
reader, _ := gzip.NewReader(r.Body)
|
||||||
|
data, _ = io.ReadAll(reader)
|
||||||
|
r.Body.Close()
|
||||||
|
default:
|
||||||
|
data, _ = io.ReadAll(r.Body)
|
||||||
|
r.Body.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify the response.
|
||||||
|
data = modifyResponse(data)
|
||||||
|
|
||||||
|
// Remove headers that mess with body encoding and set the body.
|
||||||
|
r.Header.Del("Content-Encoding")
|
||||||
|
r.Header.Del("Content-Length")
|
||||||
|
// r.Header.Set("Content-Type", "text/html; charset=windows-1251")
|
||||||
|
|
||||||
|
r.Body = io.NopCloser(bytes.NewReader(data))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
http.ListenAndServe("localhost:8000", proxy)
|
||||||
|
}
|
||||||
|
|
||||||
|
func replaceDomains(response []byte) []byte {
|
||||||
|
re := regexp.MustCompile(`(?i)[A-Za-z\-\.]*\.?kernel\.org`)
|
||||||
|
response = re.ReplaceAllFunc(response, func(original_raw []byte) []byte {
|
||||||
|
kernel := strings.ToLower(string(original_raw))
|
||||||
|
|
||||||
|
// Strip `www.`
|
||||||
|
kernel = strings.TrimPrefix(kernel, "www.")
|
||||||
|
|
||||||
|
yadro, exists := Kernel2Yadro(kernel)
|
||||||
|
|
||||||
|
if !exists {
|
||||||
|
return original_raw
|
||||||
|
}
|
||||||
|
|
||||||
|
return []byte(yadro)
|
||||||
|
})
|
||||||
|
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
func translateWithPromtPuppies(response []byte) []byte {
|
||||||
|
enc := charmap.Windows1251.NewEncoder()
|
||||||
|
cp1521, _ := enc.Bytes(response)
|
||||||
|
|
||||||
|
req, _ := http.NewRequest("POST", "http://localhost:2390/", bytes.NewReader(cp1521)) // TODO
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
fmt.Println(err)
|
||||||
|
fmt.Println(resp.StatusCode)
|
||||||
|
|
||||||
|
response, _ = io.ReadAll(resp.Body)
|
||||||
|
dec, _ := charmap.Windows1251.NewDecoder().Bytes(response)
|
||||||
|
// fmt.Println(len(dec))
|
||||||
|
// fmt.Println(string(dec))
|
||||||
|
|
||||||
|
resp.Body.Close()
|
||||||
|
|
||||||
|
return dec
|
||||||
|
}
|
||||||
|
|
||||||
|
func modifyResponse(response []byte) []byte {
|
||||||
|
response = replaceDomains(response)
|
||||||
|
response = translateWithPromtPuppies(response)
|
||||||
|
return response
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue