From: seantywork Date: Fri, 21 Nov 2025 03:38:31 +0000 (+0000) Subject: move go X-Git-Url: https://git.feebdaed.xyz/?a=commitdiff_plain;h=5dcfc23dcbe355413340b673d17d526859cca021;p=linuxyz.git move go --- diff --git a/0xetc/0xgo/automation/main.go b/0xetc/0xgo/automation/main.go new file mode 100644 index 0000000..77c0f96 --- /dev/null +++ b/0xetc/0xgo/automation/main.go @@ -0,0 +1,107 @@ +package main + +import ( + "fmt" + "strconv" + + "github.com/go-vgo/robotgo" + "github.com/vcaesar/imgo" +) + +func Wheel() { + + robotgo.MouseSleep = 100 + + robotgo.ScrollDir(10, "up") + robotgo.ScrollDir(20, "right") + + robotgo.Scroll(0, -10) + robotgo.Scroll(100, 0) + + robotgo.MilliSleep(100) + robotgo.ScrollSmooth(-10, 6) + // robotgo.ScrollRelative(10, -100) + + robotgo.Move(10, 20) + robotgo.MoveRelative(0, -10) + robotgo.DragSmooth(10, 10) + + robotgo.Click("wheelRight") + robotgo.Click("left", true) + robotgo.MoveSmooth(100, 200, 1.0, 10.0) + + robotgo.Toggle("left") + robotgo.Toggle("left", "up") + +} + +func Keyboard() { + + robotgo.TypeStr("Hello World") + robotgo.TypeStr("だんしゃり", 0, 1) + // robotgo.TypeStr("テストする") + + robotgo.TypeStr("Hi, Seattle space needle, Golden gate bridge, One world trade center.") + robotgo.TypeStr("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.") + robotgo.Sleep(1) + + // ustr := uint32(robotgo.CharCodeAt("Test", 0)) + // robotgo.UnicodeType(ustr) + + robotgo.KeySleep = 100 + robotgo.KeyTap("enter") + // robotgo.TypeStr("en") + robotgo.KeyTap("i", "alt", "cmd") + + arr := []string{"alt", "cmd"} + robotgo.KeyTap("i", arr) + + robotgo.MilliSleep(100) + robotgo.KeyToggle("a") + robotgo.KeyToggle("a", "up") + + robotgo.WriteAll("Test") + text, err := robotgo.ReadAll() + if err == nil { + fmt.Println(text) + } + +} + +func Screenshot() { + x, y := robotgo.Location() + fmt.Println("pos: ", x, y) + + color := robotgo.GetPixelColor(100, 200) + fmt.Println("color---- ", color) + + sx, sy := robotgo.GetScreenSize() + fmt.Println("get screen size: ", sx, sy) + + bit := robotgo.CaptureScreen(10, 10, 30, 30) + defer robotgo.FreeBitmap(bit) + + img := robotgo.ToImage(bit) + imgo.Save("test.png", img) + + num := robotgo.DisplaysNum() + for i := 0; i < num; i++ { + robotgo.DisplayID = i + img1, _ := robotgo.CaptureImg() + path1 := "save_" + strconv.Itoa(i) + robotgo.Save(img1, path1+".png") + robotgo.SaveJpeg(img1, path1+".jpeg", 50) + + img2, _ := robotgo.CaptureImg(10, 10, 20, 20) + robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png") + } +} + +func main() { + + //Wheel() + + Keyboard() + + //Screenshot() +} diff --git a/0xetc/0xgo/binary/Makefile b/0xetc/0xgo/binary/Makefile new file mode 100644 index 0000000..021938f --- /dev/null +++ b/0xetc/0xgo/binary/Makefile @@ -0,0 +1,2 @@ +all: + go build -o test.out . \ No newline at end of file diff --git a/0xetc/0xgo/binary/main.go b/0xetc/0xgo/binary/main.go new file mode 100644 index 0000000..1e9566c --- /dev/null +++ b/0xetc/0xgo/binary/main.go @@ -0,0 +1,136 @@ +package main + +import ( + "encoding/binary" + "fmt" + "net" + "unsafe" +) + +/* + +#define _GNU_SOURCE +#include +#include +#include +#include + +void print_raw_uint32(int value){ + + uint32_t uval = (uint32_t)value; + + printf("uval: %u\n", uval); + + uint8_t arr[4] = {0}; + + memcpy(arr, &uval, 4); + + for(int i = 0; i < 4; i++){ + + printf("%x ", arr[i]); + + } + + printf("\n"); + +} + +*/ +import "C" + +func main() { + + var i uint32 = 0x0100 + ptr := unsafe.Pointer(&i) + if 0x01 == *(*byte)(ptr) { + fmt.Println("Big Endian") + } else if 0x00 == *(*byte)(ptr) { + fmt.Println("Little Endian") + } + + ipstring := "10.1.10.2" + + ipbytes := net.ParseIP(ipstring).To4() + + fmt.Println(ipbytes) + + testle := binary.LittleEndian.Uint32(ipbytes) + + testbe := binary.BigEndian.Uint32(ipbytes) + + testne := binary.NativeEndian.Uint32(ipbytes) + + fmt.Println("le==========") + + C.print_raw_uint32(C.int(testle)) + + fmt.Println("be==========") + + C.print_raw_uint32(C.int(testbe)) + + fmt.Println("ne==========") + + C.print_raw_uint32(C.int(testne)) + + fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne) + + lebytes := make([]byte, 4) + bebytes := make([]byte, 4) + nebytes := make([]byte, 4) + + binary.LittleEndian.PutUint32(lebytes, testle) + + binary.BigEndian.PutUint32(bebytes, testbe) + + binary.NativeEndian.PutUint32(nebytes, testne) + + fmt.Printf("%d %d %d %d\n", lebytes[0], lebytes[1], lebytes[2], lebytes[3]) + + fmt.Printf("%d %d %d %d\n", bebytes[0], bebytes[1], bebytes[2], bebytes[3]) + + fmt.Printf("%d %d %d %d\n", nebytes[0], nebytes[1], nebytes[2], nebytes[3]) + + testle = binary.LittleEndian.Uint32(lebytes) + + testbe = binary.BigEndian.Uint32(bebytes) + + testne = binary.NativeEndian.Uint32(nebytes) + + fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne) + + fmt.Println("ntohl") + + in := testbe + + fmt.Printf("in: %d\n", in) + + C.print_raw_uint32(C.int(in)) + + tmp := make([]byte, 4) + + binary.BigEndian.PutUint32(tmp, in) + + out := binary.LittleEndian.Uint32(tmp) + + fmt.Printf("out: %d\n", out) + + C.print_raw_uint32(C.int(out)) + + fmt.Println("htonl") + + in = out + + fmt.Printf("in: %d\n", in) + + C.print_raw_uint32(C.int(in)) + + tmp = make([]byte, 4) + + binary.LittleEndian.PutUint32(tmp, in) + + out = binary.BigEndian.Uint32(tmp) + + fmt.Printf("out: %d\n", out) + + C.print_raw_uint32(C.int(out)) +} diff --git a/0xetc/0xgo/c-lib/Makefile b/0xetc/0xgo/c-lib/Makefile new file mode 100644 index 0000000..691f558 --- /dev/null +++ b/0xetc/0xgo/c-lib/Makefile @@ -0,0 +1,8 @@ +all: + + go build -o c2go.out . + + +clean: + + rm -r *.out \ No newline at end of file diff --git a/0xetc/0xgo/c-lib/go2c/Makefile b/0xetc/0xgo/c-lib/go2c/Makefile new file mode 100644 index 0000000..143088c --- /dev/null +++ b/0xetc/0xgo/c-lib/go2c/Makefile @@ -0,0 +1,7 @@ +all: + + go build -buildmode=c-shared -o go2c.so . + +clean: + + rm -r *.h *.so \ No newline at end of file diff --git a/0xetc/0xgo/c-lib/go2c/go2c.h b/0xetc/0xgo/c-lib/go2c/go2c.h new file mode 100644 index 0000000..49ec1d9 --- /dev/null +++ b/0xetc/0xgo/c-lib/go2c/go2c.h @@ -0,0 +1,84 @@ +/* Code generated by cmd/cgo; DO NOT EDIT. */ + +/* package github.com/seantywork/go/c-lib/go2c */ + + +#line 1 "cgo-builtin-export-prolog" + +#include + +#ifndef GO_CGO_EXPORT_PROLOGUE_H +#define GO_CGO_EXPORT_PROLOGUE_H + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef struct { const char *p; ptrdiff_t n; } _GoString_; +#endif + +#endif + +/* Start of preamble from import "C" comments. */ + + + + +/* End of preamble from import "C" comments. */ + + +/* Start of boilerplate cgo prologue. */ +#line 1 "cgo-gcc-export-header-prolog" + +#ifndef GO_CGO_PROLOGUE_H +#define GO_CGO_PROLOGUE_H + +typedef signed char GoInt8; +typedef unsigned char GoUint8; +typedef short GoInt16; +typedef unsigned short GoUint16; +typedef int GoInt32; +typedef unsigned int GoUint32; +typedef long long GoInt64; +typedef unsigned long long GoUint64; +typedef GoInt64 GoInt; +typedef GoUint64 GoUint; +typedef size_t GoUintptr; +typedef float GoFloat32; +typedef double GoFloat64; +#ifdef _MSC_VER +#include +typedef _Fcomplex GoComplex64; +typedef _Dcomplex GoComplex128; +#else +typedef float _Complex GoComplex64; +typedef double _Complex GoComplex128; +#endif + +/* + static assertion to make sure the file is being used on architecture + at least with matching size of GoInt. +*/ +typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef _GoString_ GoString; +#endif +typedef void *GoMap; +typedef void *GoChan; +typedef struct { void *t; void *v; } GoInterface; +typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; + +#endif + +/* End of boilerplate cgo prologue. */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern GoInt Add(GoInt a, GoInt b); +extern GoFloat64 Cosine(GoFloat64 x); +extern void Sort(GoSlice vals); +extern GoInt Log(GoString msg); + +#ifdef __cplusplus +} +#endif diff --git a/0xetc/0xgo/c-lib/go2c/main.go b/0xetc/0xgo/c-lib/go2c/main.go new file mode 100644 index 0000000..974b1dc --- /dev/null +++ b/0xetc/0xgo/c-lib/go2c/main.go @@ -0,0 +1,39 @@ +package main + +import "C" + +import ( + "fmt" + "math" + "sort" + "sync" +) + +var count int +var mtx sync.Mutex + +//export Add +func Add(a, b int) int { + return a + b +} + +//export Cosine +func Cosine(x float64) float64 { + return math.Cos(x) +} + +//export Sort +func Sort(vals []int) { + sort.Ints(vals) +} + +//export Log +func Log(msg string) int { + mtx.Lock() + defer mtx.Unlock() + fmt.Println(msg) + count++ + return count +} + +func main() {} diff --git a/0xetc/0xgo/c-lib/main.go b/0xetc/0xgo/c-lib/main.go new file mode 100644 index 0000000..0205bc2 --- /dev/null +++ b/0xetc/0xgo/c-lib/main.go @@ -0,0 +1,35 @@ +package main + +/* +#cgo CFLAGS: -g -Wall -I../../go-c-lib/c2go +#cgo LDFLAGS: -L../../go-c-lib/c2go -Wl,-rpath=../../go-c-lib/c2go -lc2go +#include "c2go.h" +*/ +import "C" +import ( + "fmt" +) + +type ( + Person C.struct_APerson +) + +func (p *Person) Name() string { + return C.GoString(p.name) +} + +func (p *Person) LongName() string { + return C.GoString(p.long_name) +} + +func GetPerson(name string, long_name string) *Person { + return (*Person)(C.get_person(C.CString(name), C.CString(long_name))) +} + +func main() { + var f *Person + f = GetPerson("seanty", "work") + fmt.Printf("Hello Go world: My name is %s, %s.\n", C.GoString(f.name), C.GoString(f.long_name)) + + fmt.Printf("Hello Go world: My name is %s, %s.\n", f.Name(), f.LongName()) +} diff --git a/0xetc/0xgo/crawler/main.go b/0xetc/0xgo/crawler/main.go new file mode 100644 index 0000000..a0bad0e --- /dev/null +++ b/0xetc/0xgo/crawler/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "fmt" + + colly "github.com/gocolly/colly/v2" +) + +func main() { + c := colly.NewCollector() + + c.OnHTML("a[href]", func(e *colly.HTMLElement) { + e.Request.Visit(e.Attr("href")) + }) + + c.OnRequest(func(r *colly.Request) { + fmt.Println("Visiting", r.URL) + }) + + c.Visit("http://go-colly.org/") +} diff --git a/0xetc/0xgo/crypt/Makefile b/0xetc/0xgo/crypt/Makefile new file mode 100644 index 0000000..b92a1b7 --- /dev/null +++ b/0xetc/0xgo/crypt/Makefile @@ -0,0 +1,8 @@ +all: + + go build -o test.out . + + +clean: + + rm -rf *.out \ No newline at end of file diff --git a/0xetc/0xgo/crypt/asym/asym.go b/0xetc/0xgo/crypt/asym/asym.go new file mode 100644 index 0000000..f1041d8 --- /dev/null +++ b/0xetc/0xgo/crypt/asym/asym.go @@ -0,0 +1,357 @@ +package pki + +import ( + "crypto/rand" + "crypto/sha512" + "crypto/x509/pkix" + "errors" + "fmt" + "log" + "math/big" + mathrand "math/rand" + "time" + + "crypto/rsa" + "crypto/x509" + "encoding/pem" +) + +type CertSet struct { + RootCertPEM []byte + RootKeyPEM []byte + RootPubPEM []byte + ClientCertPEM []byte + ClientKeyPEM []byte + ClientPubPEM []byte + ServCertPEM []byte + ServKeyPEM []byte + ServPubPEM []byte +} + +func GenerateKeyPair(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) { + + var pubkey *rsa.PublicKey + + privkey, err := rsa.GenerateKey(rand.Reader, bits) + if err != nil { + return privkey, pubkey, fmt.Errorf("failed to gen key pair: %s", err.Error()) + } + + pubkey = &privkey.PublicKey + + return privkey, pubkey, nil +} + +func PrivateKeyToBytes(priv *rsa.PrivateKey) ([]byte, error) { + var ret_byte []byte + privBytes := pem.EncodeToMemory( + &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: x509.MarshalPKCS1PrivateKey(priv), + }, + ) + + if privBytes == nil { + return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid") + } + + return privBytes, nil +} + +func PublicKeyToBytes(pub *rsa.PublicKey) ([]byte, error) { + + var ret_byte []byte + + pubASN1, err := x509.MarshalPKIXPublicKey(pub) + if err != nil { + return pubASN1, fmt.Errorf("failed to encode pub key to bytes: %s", err.Error()) + } + + pubBytes := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PUBLIC KEY", + Bytes: pubASN1, + }) + + if pubBytes == nil { + return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid") + } + + return pubBytes, nil +} + +func CertToBytes(crt *x509.Certificate) ([]byte, error) { + + cert_b := crt.Raw + + certBytes := pem.EncodeToMemory(&pem.Block{ + Type: "CERTIFICATE", + Bytes: cert_b, + }) + + if certBytes == nil { + + return nil, fmt.Errorf("failed to encode cert to bytes: %s", "invalid") + } + + return certBytes, nil + +} + +func BytesToPrivateKey(priv []byte) (*rsa.PrivateKey, error) { + + var privkey *rsa.PrivateKey + + block, _ := pem.Decode(priv) + enc := x509.IsEncryptedPEMBlock(block) + b := block.Bytes + var err error + if enc { + fmt.Println("is encrypted pem block") + b, err = x509.DecryptPEMBlock(block, nil) + if err != nil { + return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error()) + } + } + key, err := x509.ParsePKCS1PrivateKey(b) + if err != nil { + return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error()) + } + return key, nil +} + +func BytesToPublicKey(pub []byte) (*rsa.PublicKey, error) { + + var pubkey *rsa.PublicKey + + block, _ := pem.Decode(pub) + enc := x509.IsEncryptedPEMBlock(block) + b := block.Bytes + var err error + if enc { + fmt.Println("is encrypted pem block") + b, err = x509.DecryptPEMBlock(block, nil) + if err != nil { + return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error()) + } + } + ifc, err := x509.ParsePKIXPublicKey(b) + if err != nil { + return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error()) + } + key, ok := ifc.(*rsa.PublicKey) + if !ok { + return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error()) + } + return key, nil +} + +func BytesToCert(cert []byte) (*x509.Certificate, error) { + + var ret_crt *x509.Certificate + + block, _ := pem.Decode(cert) + + ifc, err := x509.ParseCertificate(block.Bytes) + + if err != nil { + + return ret_crt, fmt.Errorf("failed to decode bytes to certificate: %s", err.Error()) + } + + ret_crt = ifc + + return ret_crt, nil +} + +func EncryptWithPublicKey(msg []byte, pub *rsa.PublicKey) ([]byte, error) { + hash := sha512.New() + ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil) + if err != nil { + return ciphertext, fmt.Errorf("failed to encrypt with public key: %s", err.Error()) + } + return ciphertext, nil +} + +func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) ([]byte, error) { + hash := sha512.New() + plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil) + if err != nil { + return plaintext, fmt.Errorf("failed to decrypt with private key: %s", err.Error()) + } + return plaintext, nil +} + +func GetRandIntInRange(min int, max int) int { + + mathrand.Seed(time.Now().UnixNano()) + + return mathrand.Intn(max-min+1) + min +} + +func GenKeyPair(keylen int) (*rsa.PrivateKey, *rsa.PublicKey) { + + bitSize := keylen + + key, err := rsa.GenerateKey(rand.Reader, bitSize) + if err != nil { + panic(err) + } + + pub := key.Public() + + return key, pub.(*rsa.PublicKey) +} + +func CertTemplate(cn string, validYear int) (*x509.Certificate, error) { + // generate a random serial number (a real cert authority would have some logic behind this) + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, errors.New("failed to generate serial number: " + err.Error()) + } + + if err != nil { + + return nil, fmt.Errorf("failed to gen cert tmpl: %s", err.Error()) + } + + tmpl := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{CommonName: cn}, + SignatureAlgorithm: x509.SHA256WithRSA, + NotBefore: time.Now(), + NotAfter: time.Now().Add(time.Hour * 24 * 30 * 12 * time.Duration(validYear)), + BasicConstraintsValid: true, + DNSNames: []string{ + cn, + }, + } + return &tmpl, nil +} + +func CreateCert(template, parent *x509.Certificate, pub interface{}, parentPriv interface{}) (cert *x509.Certificate, certPEM []byte, err error) { + + certDER, err := x509.CreateCertificate(rand.Reader, template, parent, pub, parentPriv) + if err != nil { + return + } + // parse the resulting certificate so we can use it again + cert, err = x509.ParseCertificate(certDER) + if err != nil { + return + } + // PEM encode the certificate (this is a standard TLS encoding) + b := pem.Block{Type: "CERTIFICATE", Bytes: certDER} + certPEM = pem.EncodeToMemory(&b) + + return +} + +func NewCertsPipeline(server_name string, client_name string) *CertSet { + // generate a new key-pair + rootKey, rootPub := GenKeyPair(4096) + + rootCertTmpl, err := CertTemplate("ca", 10) + if err != nil { + log.Fatalf("creating cert template: %v", err) + } + + // this cert will be the CA that we will use to sign the server cert + rootCertTmpl.IsCA = true + // describe what the certificate will be used for + rootCertTmpl.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature + rootCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth} + + log.Println("----------ca cert") + + rootCert, rootCertPEM, err := CreateCert(rootCertTmpl, rootCertTmpl, rootPub, rootKey) + if err != nil { + log.Fatalf("error creating cert: %v", err) + } + + // provide the private key and the cert + rootKeyPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rootKey), + }) + + rootPubPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(rootPub), + }) + + /******************************************************************* + Server Cert + *******************************************************************/ + + // create a key-pair for the server + servKey, servPub := GenKeyPair(4096) + + log.Println("----------server cert") + // create a template for the server + servCertTmpl, err := CertTemplate(server_name, 1) + if err != nil { + log.Fatalf("creating cert template: %v", err) + } + servCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature + servCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth} + + // create a certificate which wraps the server's public key, sign it with the root private key + _, servCertPEM, err := CreateCert(servCertTmpl, rootCert, servPub, rootKey) + if err != nil { + log.Fatalf("error creating cert: %v", err) + } + + // provide the private key and the cert + servKeyPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(servKey), + }) + + servPubPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(servPub), + }) + + /******************************************************************* + Client Cert + *******************************************************************/ + + // create a key-pair for the client + clientKey, clientPub := GenKeyPair(4096) + + log.Println("----------client cert") + + // create a template for the client + clientCertTmpl, err := CertTemplate(client_name, 1) + if err != nil { + log.Fatalf("creating cert template: %v", err) + } + clientCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature + clientCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth} + + // the root cert signs the cert by again providing its private key + _, clientCertPEM, err := CreateCert(clientCertTmpl, rootCert, clientPub, rootKey) + if err != nil { + log.Fatalf("error creating cert: %v", err) + } + + // encode and load the cert and private key for the client + clientKeyPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(clientKey), + }) + + clientPubPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(clientPub), + }) + + cs := CertSet{ + RootCertPEM: rootCertPEM, + RootKeyPEM: rootKeyPEM, + RootPubPEM: rootPubPEM, + ClientCertPEM: clientCertPEM, + ClientKeyPEM: clientKeyPEM, + ClientPubPEM: clientPubPEM, + ServCertPEM: servCertPEM, + ServKeyPEM: servKeyPEM, + ServPubPEM: servPubPEM, + } + + return &cs +} diff --git a/0xetc/0xgo/crypt/main.go b/0xetc/0xgo/crypt/main.go new file mode 100644 index 0000000..1a02763 --- /dev/null +++ b/0xetc/0xgo/crypt/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "log" + + pkgsym "github.com/seantywork/go/crypt/sym" +) + +func main() { + + /* + key := "12345678123456781234567812345678" + + ciphertext := "7c1c5afe5fc1d2cda983019029a65490c3f2fc7fb752fff310406549ea52350edbe40cb8448b9a9a15e0bb02ed0a97244387c396125a6636ed3e9ee74517ab29" + + dap, err := pkgsym.DecryptAES256CBC(ciphertext, []byte(key)) + + if err != nil { + + log.Fatalf("err: %v\n", err) + } else { + log.Printf("success: %v\n", dap) + } + */ + + key := []byte("12345678123456781234567812345678") + + data := "Scroll through the sentence list to see the sentence that best meets the context you’re looking for." + + cipher := pkgsym.EncryptAES256CBC(data, key) + + decipher, err := pkgsym.DecryptAES256CBC(cipher, key) + + if err != nil { + + log.Fatalf("error: %v\n", err) + } else { + + log.Printf("success: %s\n", decipher) + } + + cipherb, err := pkgsym.EncryptAESGCM(key, []byte(data)) + + if err != nil { + log.Fatalf("error: %v\n", err) + } + + decipherb, err := pkgsym.DecryptAESGCM(key, cipherb) + if err != nil { + + log.Fatalf("error: %v\n", err) + } else { + + log.Printf("success: %s\n", string(decipherb)) + } +} diff --git a/0xetc/0xgo/crypt/sym/sym.go b/0xetc/0xgo/crypt/sym/sym.go new file mode 100644 index 0000000..0039f7c --- /dev/null +++ b/0xetc/0xgo/crypt/sym/sym.go @@ -0,0 +1,164 @@ +package aes + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/hex" + "fmt" + "io" +) + +func RandomHex(n int) (string, error) { + bytes := make([]byte, n) + if _, err := rand.Read(bytes); err != nil { + return "", err + } + return hex.EncodeToString(bytes), nil +} + +func RandomBytes(n int) ([]byte, error) { + bytes := make([]byte, n) + if _, err := rand.Read(bytes); err != nil { + return nil, err + } + + return bytes, nil + +} + +func EncryptAES256CBC(plaintext string, key []byte) string { + bKey := key + bIV, _ := RandomBytes(aes.BlockSize) + + blockSize := aes.BlockSize + + bPlaintext := PKCS5Padding([]byte(plaintext), blockSize, len(plaintext)) + block, err := aes.NewCipher(bKey) + if err != nil { + panic(err) + } + ciphertext := make([]byte, len(bPlaintext)+aes.BlockSize) + mode := cipher.NewCBCEncrypter(block, bIV) + mode.CryptBlocks(ciphertext[aes.BlockSize:], bPlaintext) + + copy(ciphertext, bIV) + + return hex.EncodeToString(ciphertext) +} + +func DecryptAES256CBC(ciphertext string, key []byte) (string, error) { + + if len(key) != 32 { + return "", fmt.Errorf("key must be 32 bytes for AES-256") + } + + cipherData, err := hex.DecodeString(ciphertext) + if err != nil { + + return "", err + } + + if len(cipherData) < aes.BlockSize { + fmt.Printf("cipherText too short\r\n") + return "", fmt.Errorf("cipherText too short") + } + + iv := cipherData[:aes.BlockSize] + cipherText := cipherData[aes.BlockSize:] + + block, err := aes.NewCipher(key) + if err != nil { + + return "", err + } + + if len(cipherText)%aes.BlockSize != 0 { + + return "", fmt.Errorf("cipherText is not a multiple of the block size") + } + + mode := cipher.NewCBCDecrypter(block, iv) + + plainText := make([]byte, len(cipherText)*2) + mode.CryptBlocks(plainText, cipherText) + + return string(plainText), nil +} + +func EncryptAESGCM(key []byte, file_byte []byte) ([]byte, error) { + + var ret_byte []byte = make([]byte, 0) + + c, err := aes.NewCipher(key) + + if err != nil { + return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) + + } + + gcm, err := cipher.NewGCM(c) + + if err != nil { + return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) + + } + + nonce := make([]byte, gcm.NonceSize()) + + if _, err = io.ReadFull(rand.Reader, nonce); err != nil { + return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) + } + + nonceSize := gcm.NonceSize() + if len(file_byte) < nonceSize { + return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) + } + ciphertext := gcm.Seal(nil, nonce, file_byte, nil) + + ret_byte = append(ret_byte, nonce...) + + ret_byte = append(ret_byte, ciphertext...) + + return ret_byte, nil + +} + +func DecryptAESGCM(key []byte, file_byte []byte) ([]byte, error) { + + var ret_byte []byte + + c, err := aes.NewCipher(key) + if err != nil { + return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) + } + + gcm, err := cipher.NewGCM(c) + if err != nil { + return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) + } + + nonceSize := gcm.NonceSize() + + if len(file_byte) < nonceSize { + return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) + } + + nonce, ciphertext := file_byte[:nonceSize], file_byte[nonceSize:] + + plainfile, err := gcm.Open(nil, nonce, ciphertext, nil) + if err != nil { + return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) + } + + ret_byte = plainfile + + return ret_byte, nil +} + +func PKCS5Padding(ciphertext []byte, blockSize int, after int) []byte { + padding := (blockSize - len(ciphertext)%blockSize) + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + return append(ciphertext, padtext...) +} diff --git a/0xetc/0xgo/etcd-query/.gitignore b/0xetc/0xgo/etcd-query/.gitignore new file mode 100644 index 0000000..546b462 --- /dev/null +++ b/0xetc/0xgo/etcd-query/.gitignore @@ -0,0 +1,3 @@ +etcd1_data +etcd2_data +etcd3_data \ No newline at end of file diff --git a/0xetc/0xgo/etcd-query/core/modules.go b/0xetc/0xgo/etcd-query/core/modules.go new file mode 100644 index 0000000..bf67c63 --- /dev/null +++ b/0xetc/0xgo/etcd-query/core/modules.go @@ -0,0 +1,77 @@ +package core + +import ( + "context" + "log" + "strconv" + "time" + + clientv3 "go.etcd.io/etcd/client/v3" +) + +func ConnectEtcd() (*clientv3.Client, error) { + + _, err := clientv3.New(clientv3.Config{ + Endpoints: []string{"localhost:2379"}, + DialTimeout: 2 * time.Second, + }) + + if err == context.DeadlineExceeded { + log.Println("deadline execeeded") + return nil, err + } + + cli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{"localhost:2379"}, + DialTimeout: 5 * time.Second, + }) + if err != nil { + log.Println("failed to get new clien") + return nil, err + } + + log.Println("connection success!") + + return cli, nil + +} + +func PutKey(cli *clientv3.Client, key string, val string) error { + + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*1000*10) + + _, err := cli.Put(ctx, key, val) + + cancel() + + if err != nil { + + return err + + } + + log.Println("put successful") + + return nil +} + +func GetKey(cli *clientv3.Client, key string) error { + + resp, err := cli.Get(context.TODO(), key) + + if err != nil { + log.Println("failed to get") + return err + } + + match_len := len(resp.Kvs) + + match_len_str := strconv.Itoa(match_len) + + log.Println("matched count: " + match_len_str) + + log.Println("match: key: " + string(resp.Kvs[0].Key) + " val: " + string(resp.Kvs[0].Value)) + + return nil + +} diff --git a/0xetc/0xgo/etcd-query/docker-compose.yaml b/0xetc/0xgo/etcd-query/docker-compose.yaml new file mode 100644 index 0000000..8b3b95a --- /dev/null +++ b/0xetc/0xgo/etcd-query/docker-compose.yaml @@ -0,0 +1,54 @@ +version: "3" +services: + etcd-1: + image: quay.io/coreos/etcd:v3.5.9 + entrypoint: /usr/local/bin/etcd + ports: + - "2379:2379" + command: + - '--name=etcd-1' + - '--initial-advertise-peer-urls=http://etcd-1:2380' + - '--listen-peer-urls=http://0.0.0.0:2380' + - '--listen-client-urls=http://0.0.0.0:2379' + - '--advertise-client-urls=http://etcd-1:2379' + - '--heartbeat-interval=250' + - '--election-timeout=1250' + - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380' + - '--initial-cluster-state=new' + - '--initial-cluster-token=etcdbogustoken1234' + volumes: + - ./etcd1_data:/etcd_data + + etcd-2: + image: quay.io/coreos/etcd:v3.5.9 + entrypoint: /usr/local/bin/etcd + command: + - '--name=etcd-2' + - '--initial-advertise-peer-urls=http://etcd-2:2380' + - '--listen-peer-urls=http://0.0.0.0:2380' + - '--listen-client-urls=http://0.0.0.0:2379' + - '--advertise-client-urls=http://etcd-2:2379' + - '--heartbeat-interval=250' + - '--election-timeout=1250' + - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380' + - '--initial-cluster-state=new' + - '--initial-cluster-token=etcdbogustoken1234' + volumes: + - ./etcd2_data:/etcd_data + + etcd-3: + image: quay.io/coreos/etcd:v3.5.9 + entrypoint: /usr/local/bin/etcd + command: + - '--name=etcd-3' + - '--initial-advertise-peer-urls=http://etcd-3:2380' + - '--listen-peer-urls=http://0.0.0.0:2380' + - '--listen-client-urls=http://0.0.0.0:2379' + - '--advertise-client-urls=http://etcd-3:2379' + - '--heartbeat-interval=250' + - '--election-timeout=1250' + - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380' + - '--initial-cluster-state=new' + - '--initial-cluster-token=etcdbogustoken1234' + volumes: + - ./etcd3_data:/etcd_data diff --git a/0xetc/0xgo/etcd-query/main.go b/0xetc/0xgo/etcd-query/main.go new file mode 100644 index 0000000..b43d831 --- /dev/null +++ b/0xetc/0xgo/etcd-query/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "log" + + etcqcore "github.com/seantywork/go/etcd-query/core" +) + +func main() { + + cli, err := etcqcore.ConnectEtcd() + + defer cli.Close() + + if err != nil { + + log.Fatalln(err.Error()) + } + + test_key := "my_little_key" + + test_val := "myLittleValue" + + err = etcqcore.PutKey(cli, test_key, test_val) + + if err != nil { + log.Fatalln(err.Error()) + } + + err = etcqcore.GetKey(cli, test_key) + + if err != nil { + log.Fatalln(err.Error()) + } + +} diff --git a/0xetc/0xgo/fault/.gitignore b/0xetc/0xgo/fault/.gitignore new file mode 100644 index 0000000..1c0ec3f --- /dev/null +++ b/0xetc/0xgo/fault/.gitignore @@ -0,0 +1,2 @@ +*.prof +*.png \ No newline at end of file diff --git a/0xetc/0xgo/fault/2504-03.xyz.md b/0xetc/0xgo/fault/2504-03.xyz.md new file mode 100644 index 0000000..3ed8c93 --- /dev/null +++ b/0xetc/0xgo/fault/2504-03.xyz.md @@ -0,0 +1,83 @@ +# 21 + + +```shell + 62 runtime.GC() + 63 + 64 cpuProfileBuff := &bytes.Buffer{} + 65 + 66 err := pprof.StartCPUProfile(cpuProfileBuff) + 67 + 68 if err != nil { + 69 + 70 panic(err) + 71 } + 72 + 73 time.Sleep(time.Second * time.Duration(waits)) + 74 + 75 pprof.StopCPUProfile() + 76 + 77 runtime.GC() + 78 + 79 profileBytes := cpuProfileBuff.Bytes() + 80 + 81 f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644) + 82 + + +``` + +# 22 + +```shell + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 13784 seantyw+ 20 0 1226856 4568 1536 S 107.3 0.1 0:22.65 test.out + 2903 seantyw+ 20 0 11.1g 75580 45056 S 9.3 0.9 0:04.94 node + 2797 seantyw+ 20 0 11.3g 102748 47872 R 6.0 1.3 0:05.74 node + 3718 seantyw+ 20 0 31.3g 142516 55296 S 3.3 1.8 0:10.09 node +``` + +# 23 + +```shell +$ ls +2504-03.xyz.md go.prof main.go Makefile test.out + + +$ sudo apt update && sudo apt install graphviz + + +$ go tool pprof -png go.prof +Generating report in profile001.png +``` + +# 24 + +```shell +94 type NullStruct struct { +95 Value int +96 Field *NullStruct +97 } + + +121 +122 null := NullStruct{} +123 +124 fmt.Printf("val: %d\n", null.Field.Value) +125 + +``` + +# 25 + +```shell +$ ./test.out 2 +panic: runtime error: invalid memory address or nil pointer dereference +[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b7593] + +goroutine 1 [running]: +main.main() + /home/seantywork/hack/linux/linuxyz/0xgo/fault/main.go:124 +0xb3 + +``` \ No newline at end of file diff --git a/0xetc/0xgo/fault/Makefile b/0xetc/0xgo/fault/Makefile new file mode 100644 index 0000000..731062c --- /dev/null +++ b/0xetc/0xgo/fault/Makefile @@ -0,0 +1,3 @@ +all: + go build -o test.out . + diff --git a/0xetc/0xgo/fault/main.go b/0xetc/0xgo/fault/main.go new file mode 100644 index 0000000..092bcd0 --- /dev/null +++ b/0xetc/0xgo/fault/main.go @@ -0,0 +1,128 @@ +package main + +import ( + "bytes" + "fmt" + "os" + "runtime" + "runtime/pprof" + "time" +) + +var TLEN = 10 + +func busy() { + + val := 1 + str := "" + for { + + str = fmt.Sprintf("%d", val) + + _ = str + } + +} + +func notbusy(idx int) { + + val := 1 + str := "" + for { + + time.Sleep(time.Millisecond * 1) + + str = fmt.Sprintf("%d", val) + + fmt.Printf("i'm not busy: %d: %s\n", idx, str) + + } +} + +func threadFunc() { + + for i := 0; i < TLEN; i++ { + + if i == 5 { + + go busy() + + } else { + + go notbusy(i) + + } + + } + +} + +func profiler(waits int) { + + runtime.GC() + + cpuProfileBuff := &bytes.Buffer{} + + err := pprof.StartCPUProfile(cpuProfileBuff) + + if err != nil { + + panic(err) + } + + time.Sleep(time.Second * time.Duration(waits)) + + pprof.StopCPUProfile() + + runtime.GC() + + profileBytes := cpuProfileBuff.Bytes() + + f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644) + + if err != nil { + + panic(err) + } + + f.Write(profileBytes) + + f.Close() + +} + +type NullStruct struct { + Value int + Field *NullStruct +} + +func main() { + + argc := len(os.Args) + + if argc != 2 { + fmt.Printf("feed case\n") + os.Exit(-1) + } + + if os.Args[1] == "1" { + + go threadFunc() + + go profiler(10) + + for { + + time.Sleep(time.Millisecond * 1000) + + } + + } else if os.Args[1] == "2" { + + null := NullStruct{} + + fmt.Printf("val: %d\n", null.Field.Value) + + } + +} diff --git a/0xetc/0xgo/file-updownload/.gitignore b/0xetc/0xgo/file-updownload/.gitignore new file mode 100644 index 0000000..6320cd2 --- /dev/null +++ b/0xetc/0xgo/file-updownload/.gitignore @@ -0,0 +1 @@ +data \ No newline at end of file diff --git a/0xetc/0xgo/file-updownload/Makefile b/0xetc/0xgo/file-updownload/Makefile new file mode 100644 index 0000000..a1070ec --- /dev/null +++ b/0xetc/0xgo/file-updownload/Makefile @@ -0,0 +1,5 @@ +all: + go build -o client/c.out ./client + + go build -o server/s.out ./server + diff --git a/0xetc/0xgo/file-updownload/client/main.go b/0xetc/0xgo/file-updownload/client/main.go new file mode 100644 index 0000000..0f0bdd2 --- /dev/null +++ b/0xetc/0xgo/file-updownload/client/main.go @@ -0,0 +1,121 @@ +package main + +import ( + "bytes" + "fmt" + "io" + "log" + "mime/multipart" + "net/http" + "os" + "strings" +) + +func Upload(client *http.Client, url string, values map[string]io.Reader) (err error) { + + var b bytes.Buffer + w := multipart.NewWriter(&b) + for key, r := range values { + var fw io.Writer + if x, ok := r.(io.Closer); ok { + defer x.Close() + } + + if x, ok := r.(*os.File); ok { + if fw, err = w.CreateFormFile(key, x.Name()); err != nil { + return + } + } else { + // Add other fields + if fw, err = w.CreateFormField(key); err != nil { + return + } + } + if _, err = io.Copy(fw, r); err != nil { + return err + } + + } + + w.Close() + + req, err := http.NewRequest("POST", url, &b) + if err != nil { + return + } + + req.Header.Set("Content-Type", w.FormDataContentType()) + + res, err := client.Do(req) + if err != nil { + return + } + + if res.StatusCode != http.StatusOK { + err = fmt.Errorf("bad status: %s", res.Status) + } + return +} + +func Download(filepath string, url string) (err error) { + + out, err := os.Create(filepath) + if err != nil { + return err + } + defer out.Close() + + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("bad status: %s", resp.Status) + } + + _, err = io.Copy(out, resp.Body) + if err != nil { + return err + } + + return nil +} + +func main() { + + v, err := os.Open("./data/test.mp4") + + if err != nil { + log.Printf("failed to read data: %v\n", err) + os.Exit(-1) + } + + values := map[string]io.Reader{ + "file": v, + "other": strings.NewReader("hello world!"), + } + + client := &http.Client{} + + err = Upload(client, "http://localhost:8080/upload", values) + + if err != nil { + + log.Printf("failed to upload file: %v\n", err) + + os.Exit(-1) + } + + err = Download("./data/return.mp4", "http://localhost:8080/download/test.mp4") + + if err != nil { + log.Printf("failed to download file: %v\n", err) + + os.Exit(-1) + } + + os.Exit(0) + +} diff --git a/0xetc/0xgo/file-updownload/server/main.go b/0xetc/0xgo/file-updownload/server/main.go new file mode 100644 index 0000000..e8cfcca --- /dev/null +++ b/0xetc/0xgo/file-updownload/server/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "log" + "net/http" + + "github.com/gin-gonic/contrib/sessions" + "github.com/gin-gonic/gin" +) + +func BinaryUpload(c *gin.Context) { + + file, _ := c.FormFile("file") + + rawMediaType := file.Header.Get("Content-Type") + + log.Printf("content type: %s\n", rawMediaType) + + f_name := file.Filename + + this_video_path := "./data/" + f_name + + err := c.SaveUploadedFile(file, this_video_path) + + if err != nil { + + c.String(http.StatusBadRequest, "failed") + + return + } + + c.String(http.StatusOK, "success") + +} + +func BinaryDownload(c *gin.Context) { + + binName := c.Param("binName") + + this_video_path := "./data/" + binName + + //c.Header("Content-Type", "video/mp4") + + c.File(this_video_path) + +} + +func setRoutes(e *gin.Engine) { + + e.POST("/upload", BinaryUpload) + + e.GET("/download/:binName", BinaryDownload) + +} + +func main() { + + server := gin.Default() + + store := sessions.NewCookieStore([]byte("FILEUPDOWN")) + + server.Use(sessions.Sessions("FILEUPDOWN", store)) + + setRoutes(server) + + server.Run("0.0.0.0:8080") + +} diff --git a/0xetc/0xgo/go.sum b/0xetc/0xgo/go.sum new file mode 100644 index 0000000..9cbd7ff --- /dev/null +++ b/0xetc/0xgo/go.sum @@ -0,0 +1,1033 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo= +cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +fyne.io/fyne/v2 v2.5.2 h1:eSyGTmSkv10yAdAeHpDet6u2KkKxOGFc14kQu81We7Q= +fyne.io/fyne/v2 v2.5.2/go.mod h1:26gqPDvtaxHeyct+C0BBjuGd2zwAJlPkUGSBrb+d7Ug= +fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= +fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= +github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= +github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= +github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= +github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= +github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= +github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0= +github.com/antchfx/htmlquery v1.3.3 h1:x6tVzrRhVNfECDaVxnZi1mEGrQg3mjE/rxbH2Pe6dNE= +github.com/antchfx/htmlquery v1.3.3/go.mod h1:WeU3N7/rL6mb6dCwtE30dURBnBieKDC/fR8t6X+cKjU= +github.com/antchfx/xmlquery v1.2.4/go.mod h1:KQQuESaxSlqugE2ZBcM/qn+ebIpt+d+4Xx7YcSGAIrM= +github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= +github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= +github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= +github.com/antchfx/xpath v1.1.8/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= +github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff h1:RmdPFa+slIr4SCBg4st/l/vZWVe9QJKMXGO60Bxbe04= +github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U= +github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU= +github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= +github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.2.0 h1:cj6GCiwJDH7l3tMHLjZDo0QqPtrXJiWSI9JgpeQKw+Q= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8= +github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934 h1:dZC5aKobSN07hf71oMivxUmAofFja5GrfPK2rBlttX4= +github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg= +github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW79bLiBiJwVL4jVeyGQRZMgImoeWs= +github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY= +github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964 h1:0pTELtjlVAVGSazfwRNcqTVzqmkWb1GsNozCmmZfdZA= +github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964/go.mod h1:J9Uunu842kOcTjzQj4Eq8XIDmF55szvT1PTS1cUb1UE= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ= +github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0 h1:EUFmvQ8ffefnSAmaUZd9HZYZSw9w/bFjp3FiNaJ5WmE= +github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= +github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA= +github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc= +github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU= +github.com/go-text/typesetting v0.2.0 h1:fbzsgbmk04KiWtE+c3ZD4W2nmCRzBqrqQOvYlwAOdho= +github.com/go-text/typesetting v0.2.0/go.mod h1:2+owI/sxa73XA581LAzVuEBZ3WEEV2pXeDswCH/3i1I= +github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66 h1:GUrm65PQPlhFSKjLPGOZNPNxLCybjzjYBzjfoBGaDUY= +github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= +github.com/go-vgo/robotgo v0.110.5 h1:F3meroJVBPvxncoHX9ZoD1Gal+pYywu1MLPcJkN5oEw= +github.com/go-vgo/robotgo v0.110.5/go.mod h1:MzgZR4XAnlhBAe4ExLcJebisDUfbYoh3ekaP/s/XRqQ= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA= +github.com/gocolly/colly/v2 v2.1.0 h1:k0DuZkDoCsx51bKpRJNEmcxcp+W5N8ziuwGaSDuFoGs= +github.com/gocolly/colly/v2 v2.1.0/go.mod h1:I2MuhsLjQ+Ex+IzK3afNS8/1qP3AedHOusRPcRdC5o0= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= +github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o= +github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= +github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY= +github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= +github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= +github.com/graphql-go/handler v0.2.4 h1:gz9q11TUHPNUpqzV8LMa+rkqM5NUuH/nkE3oF2LS3rI= +github.com/graphql-go/handler v0.2.4/go.mod h1:gsQlb4gDvURR0bgN8vWQEh+s5vJALM2lYL3n3cf6OxQ= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg= +github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8= +github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg= +github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= +github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= +github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 h1:5UHVWNX1qrIbNw7OpKbxe5bHkhHRk3xRKztMjERuCsU= +github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ= +github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= +github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0= +github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/nicksnyder/go-i18n/v2 v2.4.1 h1:zwzjtX4uYyiaU02K5Ia3zSkpJZrByARkRB4V3YPrr0g= +github.com/nicksnyder/go-i18n/v2 v2.4.1/go.mod h1:++Pl70FR6Cki7hdzZRnEEqdc2dJt+SAGotyFg/SvZMk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= +github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= +github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= +github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= +github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= +github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg= +github.com/pion/ice/v3 v3.0.16 h1:YoPlNg3jU1UT/DDTa9v/g1vH6A2/pAzehevI1o66H8E= +github.com/pion/ice/v3 v3.0.16/go.mod h1:SdmubtIsCcvdb1ZInrTUz7Iaqi90/rYd1pzbzlMxsZg= +github.com/pion/ice/v4 v4.0.3 h1:9s5rI1WKzF5DRqhJ+Id8bls/8PzM7mau0mj1WZb4IXE= +github.com/pion/ice/v4 v4.0.3/go.mod h1:VfHy0beAZ5loDT7BmJ2LtMtC4dbawIkkkejHPRZNB3Y= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= +github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= +github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= +github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= +github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= +github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ= +github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= +github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= +github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v3 v3.0.3 h1:1e3GVk8gHZLPBA5LqadWYV60lmaKUaHCkm9DX9CkGcE= +github.com/pion/turn/v3 v3.0.3/go.mod h1:vw0Dz420q7VYAF3J4wJKzReLHIo2LGp4ev8nXQexYsc= +github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= +github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= +github.com/pion/webrtc/v4 v4.0.7 h1:aeq78uVnFZd2umXW0O9A2VFQYuS7+BZxWetQvSp2jPo= +github.com/pion/webrtc/v4 v4.0.7/go.mod h1:oFVBBVSHU3vAEwSgnk3BuKCwAUwpDwQhko1EDwyZWbU= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA= +github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= +github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM= +github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= +github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw= +github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/rymdport/portal v0.2.6 h1:HWmU3gORu7vWcpr7VSwUS2Xx1HtJXVcUuTqEZcMEsIg= +github.com/rymdport/portal v0.2.6/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= +github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= +github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= +github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= +github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= +github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= +github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= +github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f h1:13CyO8FO3blZH04ewuT9DDgm9V7G0CfjDzw8kLKx+s8= +github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8= +github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= +github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= +github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= +github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg= +github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= +github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo= +github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/vcaesar/gops v0.40.0 h1:I+1RCGiV+LkZJUYNzAd373xs0uM2UyeFdZBmow8HfCM= +github.com/vcaesar/gops v0.40.0/go.mod h1:3u/USW7JovqUK6i13VOD3qWfvXXd2TIIKE4PYIv4TOM= +github.com/vcaesar/imgo v0.40.2 h1:5GWScRLdBCMtO1v2I1bs+ZmDLZFINxYSMZ+mtUw5qPM= +github.com/vcaesar/imgo v0.40.2/go.mod h1:MVCl+FxHI2gTgmiHoi0n5xNCbYcfv9SVtdEOUC92+eo= +github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw= +github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= +github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4= +github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yutopp/go-amf0 v0.1.0 h1:a3UeBZG7nRF0zfvmPn2iAfNo1RGzUpHz1VyJD2oGrik= +github.com/yutopp/go-amf0 v0.1.0/go.mod h1:QzDOBr9RV6sQh6E5GFEJROZbU0iQKijORBmprkb3FIk= +github.com/yutopp/go-flv v0.3.1 h1:4ILK6OgCJgUNm2WOjaucWM5lUHE0+sLNPdjq3L0Xtjk= +github.com/yutopp/go-flv v0.3.1/go.mod h1:pAlHPSVRMv5aCUKmGOS/dZn/ooTgnc09qOPmiUNMubs= +github.com/yutopp/go-rtmp v0.0.7 h1:sKKm1MVV3ANbJHZlf3Kq8ecq99y5U7XnDUDxSjuK7KU= +github.com/yutopp/go-rtmp v0.0.7/go.mod h1:KSwrC9Xj5Kf18EUlk1g7CScecjXfIqc0J5q+S0u6Irc= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= +go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= +go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= +go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= +golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= +golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= +golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c h1:zuNS/LWsEpPTLfrmBkis6Xofw3nieAqB4hYLn8+uswk= +golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c/go.mod h1:snk1Mn2ZpdKCt90JPEsDh4sL3ReK520U2t0d7RHBnSU= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +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= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4= +google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= +google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/0xetc/0xgo/graphql/Makefile b/0xetc/0xgo/graphql/Makefile new file mode 100644 index 0000000..5f9b263 --- /dev/null +++ b/0xetc/0xgo/graphql/Makefile @@ -0,0 +1,3 @@ +all: + + go build -o gql.out . \ No newline at end of file diff --git a/0xetc/0xgo/graphql/data.json b/0xetc/0xgo/graphql/data.json new file mode 100644 index 0000000..142e599 --- /dev/null +++ b/0xetc/0xgo/graphql/data.json @@ -0,0 +1,13 @@ +[ + { + "id": 1, + "name" : "one", + "description": "number one guy", + "otherNames": [ + "uno", + "ei", + "il" + ], + "imageUrl" :"none" + } +] \ No newline at end of file diff --git a/0xetc/0xgo/graphql/main.go b/0xetc/0xgo/graphql/main.go new file mode 100644 index 0000000..b835535 --- /dev/null +++ b/0xetc/0xgo/graphql/main.go @@ -0,0 +1,127 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + + "net/http" + + "github.com/graphql-go/graphql" + "github.com/graphql-go/handler" +) + +func importJSONDataFromFile(fileName string, result interface{}) (isOK bool) { + isOK = true + content, err := os.ReadFile(fileName) + if err != nil { + fmt.Print("Error:", err) + isOK = false + } + err = json.Unmarshal(content, result) + if err != nil { + isOK = false + fmt.Print("Error:", err) + } + return +} + +var BeastList []Beast +var _ = importJSONDataFromFile("./data.json", &BeastList) + +var beastType = graphql.NewObject(graphql.ObjectConfig{ + Name: "Beast", + Fields: graphql.Fields{ + "name": &graphql.Field{ + Type: graphql.String, + }, + "description": &graphql.Field{ + Type: graphql.String, + }, + "id": &graphql.Field{ + Type: graphql.Int, + }, + "otherNames": &graphql.Field{ + Type: graphql.NewList(graphql.String), + }, + "imageUrl": &graphql.Field{ + Type: graphql.String, + }, + }, +}) + +var rootQuery = graphql.NewObject(graphql.ObjectConfig{ + Name: "RootQuery", + Fields: graphql.Fields{ + "beast": &graphql.Field{ + Type: beastType, + Description: "Get single beast", + Args: graphql.FieldConfigArgument{ + "name": &graphql.ArgumentConfig{ + Type: graphql.String, + }, + }, + Resolve: func(params graphql.ResolveParams) (interface{}, error) { + nameQuery, isOK := params.Args["name"].(string) + if isOK { + // Search for el with name + for _, beast := range BeastList { + if beast.Name == nameQuery { + return beast, nil + } + } + } + + return Beast{}, nil + }, + }, + + "beastList": &graphql.Field{ + Type: graphql.NewList(beastType), + Description: "List of beasts", + Resolve: func(p graphql.ResolveParams) (interface{}, error) { + return BeastList, nil + }, + }, + }, +}) + +var BeastSchema, _ = graphql.NewSchema(graphql.SchemaConfig{ + Query: rootQuery, +}) + +var sandboxHTML = []byte(` + + + +
+ + + + +`) + +func main() { + + h := handler.New(&handler.Config{ + Schema: &BeastSchema, + Pretty: true, + GraphiQL: false, + }) + + http.Handle("/graphql", h) + + http.Handle("/sandbox", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write(sandboxHTML) + })) + + http.ListenAndServe(":8080", nil) +} diff --git a/0xetc/0xgo/graphql/types.go b/0xetc/0xgo/graphql/types.go new file mode 100644 index 0000000..9b7c3ee --- /dev/null +++ b/0xetc/0xgo/graphql/types.go @@ -0,0 +1,9 @@ +package main + +type Beast struct { + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + OtherNames []string `json:"otherNames"` + ImageURL string `json:"imageUrl"` +} diff --git a/0xetc/0xgo/grpc/Makefile b/0xetc/0xgo/grpc/Makefile new file mode 100644 index 0000000..9e56181 --- /dev/null +++ b/0xetc/0xgo/grpc/Makefile @@ -0,0 +1,31 @@ + + +all: + + @echo "go grpc" + + +dep: + + apt install -y protobuf-compiler + +dep-go: + + go install google.golang.org/protobuf/cmd/protoc-gen-go + + go install google.golang.org/grpc/cmd/protoc-gen-go-grpc + +proto: + + cd chatpb && ./protoc.sh + +build: + + go build -o server/server.out ./server + + go build -o client/client.out ./client + + + + + diff --git a/0xetc/0xgo/grpc/certgen.sh b/0xetc/0xgo/grpc/certgen.sh new file mode 100755 index 0000000..493976f --- /dev/null +++ b/0xetc/0xgo/grpc/certgen.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/grpc/chatpb/chat.pb.go b/0xetc/0xgo/grpc/chatpb/chat.pb.go new file mode 100644 index 0000000..630514c --- /dev/null +++ b/0xetc/0xgo/grpc/chatpb/chat.pb.go @@ -0,0 +1,551 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.0 +// protoc v4.25.0 +// source: chat.proto + +package chatpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type HelloRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *HelloRequest) Reset() { + *x = HelloRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HelloRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HelloRequest) ProtoMessage() {} + +func (x *HelloRequest) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead. +func (*HelloRequest) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{0} +} + +func (x *HelloRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type HelloReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *HelloReply) Reset() { + *x = HelloReply{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HelloReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HelloReply) ProtoMessage() {} + +func (x *HelloReply) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HelloReply.ProtoReflect.Descriptor instead. +func (*HelloReply) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{1} +} + +func (x *HelloReply) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type TalkRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *TalkRequest) Reset() { + *x = TalkRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalkRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalkRequest) ProtoMessage() {} + +func (x *TalkRequest) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalkRequest.ProtoReflect.Descriptor instead. +func (*TalkRequest) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{2} +} + +func (x *TalkRequest) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type TalkResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TalkContent *TalkContent `protobuf:"bytes,1,opt,name=talk_content,json=talkContent,proto3" json:"talk_content,omitempty"` +} + +func (x *TalkResponse) Reset() { + *x = TalkResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalkResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalkResponse) ProtoMessage() {} + +func (x *TalkResponse) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalkResponse.ProtoReflect.Descriptor instead. +func (*TalkResponse) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{3} +} + +func (x *TalkResponse) GetTalkContent() *TalkContent { + if x != nil { + return x.TalkContent + } + return nil +} + +type TalkContent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *TalkContent) Reset() { + *x = TalkContent{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TalkContent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TalkContent) ProtoMessage() {} + +func (x *TalkContent) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TalkContent.ProtoReflect.Descriptor instead. +func (*TalkContent) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{4} +} + +func (x *TalkContent) GetIndex() int64 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *TalkContent) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type HistoryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *HistoryRequest) Reset() { + *x = HistoryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequest) ProtoMessage() {} + +func (x *HistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. +func (*HistoryRequest) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{5} +} + +func (x *HistoryRequest) GetIndex() int64 { + if x != nil { + return x.Index + } + return 0 +} + +type HistoryResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + History []*TalkContent `protobuf:"bytes,1,rep,name=history,proto3" json:"history,omitempty"` +} + +func (x *HistoryResponse) Reset() { + *x = HistoryResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_chat_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryResponse) ProtoMessage() {} + +func (x *HistoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_chat_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead. +func (*HistoryResponse) Descriptor() ([]byte, []int) { + return file_chat_proto_rawDescGZIP(), []int{6} +} + +func (x *HistoryResponse) GetHistory() []*TalkContent { + if x != nil { + return x.History + } + return nil +} + +var File_chat_proto protoreflect.FileDescriptor + +var file_chat_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x68, + 0x61, 0x74, 0x70, 0x62, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x27, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x46, 0x0a, 0x0c, 0x54, 0x61, 0x6c, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x74, 0x61, 0x6c, + 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3d, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x26, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x40, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, + 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x32, 0xba, 0x01, 0x0a, 0x07, 0x43, + 0x68, 0x61, 0x74, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x08, + 0x54, 0x61, 0x6c, 0x6b, 0x54, 0x6f, 0x4d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, + 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x57, 0x68, 0x61, 0x74, 0x44, 0x69, 0x64, + 0x59, 0x6f, 0x75, 0x53, 0x61, 0x79, 0x12, 0x16, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x6e, 0x74, 0x79, 0x77, 0x6f, 0x72, 0x6b, + 0x2f, 0x30, 0x78, 0x67, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_chat_proto_rawDescOnce sync.Once + file_chat_proto_rawDescData = file_chat_proto_rawDesc +) + +func file_chat_proto_rawDescGZIP() []byte { + file_chat_proto_rawDescOnce.Do(func() { + file_chat_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_proto_rawDescData) + }) + return file_chat_proto_rawDescData +} + +var file_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_chat_proto_goTypes = []interface{}{ + (*HelloRequest)(nil), // 0: chatpb.HelloRequest + (*HelloReply)(nil), // 1: chatpb.HelloReply + (*TalkRequest)(nil), // 2: chatpb.TalkRequest + (*TalkResponse)(nil), // 3: chatpb.TalkResponse + (*TalkContent)(nil), // 4: chatpb.TalkContent + (*HistoryRequest)(nil), // 5: chatpb.HistoryRequest + (*HistoryResponse)(nil), // 6: chatpb.HistoryResponse +} +var file_chat_proto_depIdxs = []int32{ + 4, // 0: chatpb.TalkResponse.talk_content:type_name -> chatpb.TalkContent + 4, // 1: chatpb.HistoryResponse.history:type_name -> chatpb.TalkContent + 0, // 2: chatpb.Chatter.SayHello:input_type -> chatpb.HelloRequest + 2, // 3: chatpb.Chatter.TalkToMe:input_type -> chatpb.TalkRequest + 5, // 4: chatpb.Chatter.WhatDidYouSay:input_type -> chatpb.HistoryRequest + 1, // 5: chatpb.Chatter.SayHello:output_type -> chatpb.HelloReply + 3, // 6: chatpb.Chatter.TalkToMe:output_type -> chatpb.TalkResponse + 6, // 7: chatpb.Chatter.WhatDidYouSay:output_type -> chatpb.HistoryResponse + 5, // [5:8] is the sub-list for method output_type + 2, // [2:5] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_chat_proto_init() } +func file_chat_proto_init() { + if File_chat_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_chat_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HelloRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_chat_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HelloReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_chat_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalkRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_chat_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalkResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_chat_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TalkContent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_chat_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HistoryRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_chat_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HistoryResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_chat_proto_rawDesc, + NumEnums: 0, + NumMessages: 7, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_chat_proto_goTypes, + DependencyIndexes: file_chat_proto_depIdxs, + MessageInfos: file_chat_proto_msgTypes, + }.Build() + File_chat_proto = out.File + file_chat_proto_rawDesc = nil + file_chat_proto_goTypes = nil + file_chat_proto_depIdxs = nil +} diff --git a/0xetc/0xgo/grpc/chatpb/chat.proto b/0xetc/0xgo/grpc/chatpb/chat.proto new file mode 100644 index 0000000..2174a91 --- /dev/null +++ b/0xetc/0xgo/grpc/chatpb/chat.proto @@ -0,0 +1,59 @@ +syntax = "proto3"; + +option go_package = "github.com/seantywork/go/grpc/chatpb"; + + +package chatpb; + + +service Chatter { + + rpc SayHello (HelloRequest) returns (HelloReply); + + rpc TalkToMe (TalkRequest) returns (stream TalkResponse); + + rpc WhatDidYouSay (HistoryRequest) returns (HistoryResponse); + +} + +message HelloRequest { + string name = 1; +} + +message HelloReply { + string message = 1; +} + +message TalkRequest { + + string message = 1; + +} + +message TalkResponse { + + TalkContent talk_content = 1; + +} + + +message TalkContent{ + + int64 index = 1; + string content = 2; + +} + +message HistoryRequest { + + int64 index = 1; + +} + +message HistoryResponse{ + + repeated TalkContent history = 1; + +} + + diff --git a/0xetc/0xgo/grpc/chatpb/chat_grpc.pb.go b/0xetc/0xgo/grpc/chatpb/chat_grpc.pb.go new file mode 100644 index 0000000..1335b34 --- /dev/null +++ b/0xetc/0xgo/grpc/chatpb/chat_grpc.pb.go @@ -0,0 +1,201 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package chatpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// ChatterClient is the client API for Chatter service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ChatterClient interface { + SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) + TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error) + WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) +} + +type chatterClient struct { + cc grpc.ClientConnInterface +} + +func NewChatterClient(cc grpc.ClientConnInterface) ChatterClient { + return &chatterClient{cc} +} + +func (c *chatterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) { + out := new(HelloReply) + err := c.cc.Invoke(ctx, "/chatpb.Chatter/SayHello", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *chatterClient) TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error) { + stream, err := c.cc.NewStream(ctx, &Chatter_ServiceDesc.Streams[0], "/chatpb.Chatter/TalkToMe", opts...) + if err != nil { + return nil, err + } + x := &chatterTalkToMeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Chatter_TalkToMeClient interface { + Recv() (*TalkResponse, error) + grpc.ClientStream +} + +type chatterTalkToMeClient struct { + grpc.ClientStream +} + +func (x *chatterTalkToMeClient) Recv() (*TalkResponse, error) { + m := new(TalkResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *chatterClient) WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) { + out := new(HistoryResponse) + err := c.cc.Invoke(ctx, "/chatpb.Chatter/WhatDidYouSay", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ChatterServer is the server API for Chatter service. +// All implementations must embed UnimplementedChatterServer +// for forward compatibility +type ChatterServer interface { + SayHello(context.Context, *HelloRequest) (*HelloReply, error) + TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error + WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error) + mustEmbedUnimplementedChatterServer() +} + +// UnimplementedChatterServer must be embedded to have forward compatible implementations. +type UnimplementedChatterServer struct { +} + +func (UnimplementedChatterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (UnimplementedChatterServer) TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error { + return status.Errorf(codes.Unimplemented, "method TalkToMe not implemented") +} +func (UnimplementedChatterServer) WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WhatDidYouSay not implemented") +} +func (UnimplementedChatterServer) mustEmbedUnimplementedChatterServer() {} + +// UnsafeChatterServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ChatterServer will +// result in compilation errors. +type UnsafeChatterServer interface { + mustEmbedUnimplementedChatterServer() +} + +func RegisterChatterServer(s grpc.ServiceRegistrar, srv ChatterServer) { + s.RegisterService(&Chatter_ServiceDesc, srv) +} + +func _Chatter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HelloRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ChatterServer).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/chatpb.Chatter/SayHello", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ChatterServer).SayHello(ctx, req.(*HelloRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Chatter_TalkToMe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TalkRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ChatterServer).TalkToMe(m, &chatterTalkToMeServer{stream}) +} + +type Chatter_TalkToMeServer interface { + Send(*TalkResponse) error + grpc.ServerStream +} + +type chatterTalkToMeServer struct { + grpc.ServerStream +} + +func (x *chatterTalkToMeServer) Send(m *TalkResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _Chatter_WhatDidYouSay_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HistoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ChatterServer).WhatDidYouSay(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/chatpb.Chatter/WhatDidYouSay", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ChatterServer).WhatDidYouSay(ctx, req.(*HistoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Chatter_ServiceDesc is the grpc.ServiceDesc for Chatter service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Chatter_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "chatpb.Chatter", + HandlerType: (*ChatterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SayHello", + Handler: _Chatter_SayHello_Handler, + }, + { + MethodName: "WhatDidYouSay", + Handler: _Chatter_WhatDidYouSay_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TalkToMe", + Handler: _Chatter_TalkToMe_Handler, + ServerStreams: true, + }, + }, + Metadata: "chat.proto", +} diff --git a/0xetc/0xgo/grpc/chatpb/protoc.sh b/0xetc/0xgo/grpc/chatpb/protoc.sh new file mode 100755 index 0000000..98dc947 --- /dev/null +++ b/0xetc/0xgo/grpc/chatpb/protoc.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +export PATH="$PATH:$(go env GOPATH)/bin" + +protoc --go_out=. --go_opt=paths=source_relative \ + --go-grpc_out=. --go-grpc_opt=paths=source_relative \ + ./chat.proto \ No newline at end of file diff --git a/0xetc/0xgo/grpc/client/certs/ca.pem b/0xetc/0xgo/grpc/client/certs/ca.pem new file mode 100644 index 0000000..bce9d76 --- /dev/null +++ b/0xetc/0xgo/grpc/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUfHY1zHmm3s9LbMImhCYdyb5bCwYwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDJaFw0zNDA1MDkwNzA1 +NDJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCmEElAsjMBtS3yHcp6j3HOU0QGfGL8j5AacRqw8mt6xAtgWqZmwDD/Bkn8 +9tYV+quRY8ZgQM2imtV78NtVQedsrNJlCnAi1krJquTEv6UMf6k91h2pEMghvP05 +Lenr6EpKPlHvpWoO6cfZa3N9cogwn5WaApQYvX9O9cGbN6dSjd/mwSddqo+LBy27 +BQEfDIieeVVc4Kcb61ZY16tYWqB9GybtaNoElZE1lsrBVJOnX2hDSKj+yoR46DgI +BsDkofCKCUrTI4YcUOSYS1sd/JbEeRkPvwXg/2BtUR9W29vV1pYVFBmzqFiC0sbf +9XQhy30fnQjJrGrWJA6RDVLYnSykNOoYNuLkGgm1ZlGlipwrbBz1kIP99554dXGN +4lnXk7js7l5lEsOo/c3lDtmjYRQlmPepyD2KCEbbbkK/u3DcMnS+AKL5m2VQuwvw +LTTDTvvXF+9yV69c6pRHh/w3JSPVh3HgMSe6dKc5S0CDunXh+cBNk9iIvKT7WKqJ +m5NuHITVVxOWlbBH2Wl1AOjzFjiYVLMvFNRAT3Cwh6h0ewWRYxm9bdLspZsEHhQK +Gz10f8KiK+Z9wNCRCKp1TMEsgXw7Q5jdzQNwFjaAu0uxTl4x5syCWI2zW2cPPwCg +SLSsozxbeson2Zj5/9ZDQngrbwCq0tEZPgHZaujW7igKQfwXdwIDAQABo1MwUTAd +BgNVHQ4EFgQUIm4H+A+/zncV06Pm4qSUetmIUBswHwYDVR0jBBgwFoAUIm4H+A+/ +zncV06Pm4qSUetmIUBswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAJ12ZZyIvb0LQgsZuct0u54/23K0aula1B6vIZ/XxPmdb3wk87hL1D87Es2MU +MbM/5ZXVIK9SWB4pYqP2hxJq4Pcm/4HPxUrw3Cl3lh2uMnnYikX2IfofypwOaFUY +e5HMjO9r4AnosbxS85gVHRIcPKfQJdSEYUb/gPX9tpycWKse6FzE69p9dvh4oSBe +LTDAkNrkn5GC4Y/RqCfbhFytytEaUG/GN9e3P1Ye9Q6mxYXgkDC51+F4/EMzR1sp +rrR1mvP2y43JLV4WsUAhvNJfkIhd2IcKo7IYol4wYSb8HVt9h47KpTUzEIG/SS3+ +FuO/oc2Am27jKsj36IREA8gN0rQdIP8S3JQYy0Tp5+RYuk+l4p8uKzu+NCabKEh9 +ypINTKyyYRAWaQ5ns+xKuIEcIEroakL0fRvcivYBoea9Tk/P2cSYE8MBkjwfgsFp +8AQIF5AZhXV/428orAMUYj0OvDD3mx5mBwiD/6iV8PFpp0VWMsyF6e6KRV7PXJWV +r9GMfdMDaqg9+2Hf5ezBkvh2T50xJpc9BHoN6s5h4s+IE6nXzksc9OSXhfbSDlDZ +G/FNuIEV4rAZv1lAa3qa+JmZKYi+Ex66IS4FyGLFHAYDfGPyJKOwrLvu6FDDzDLP +jpkR2jP/4Duhyy0xX9UdMo3s88cuAMJG/GbaA3hjbibmw84= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/grpc/client/certs/ca_priv.pem b/0xetc/0xgo/grpc/client/certs/ca_priv.pem new file mode 100644 index 0000000..2dd7175 --- /dev/null +++ b/0xetc/0xgo/grpc/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +29CM/6ulbLzZRmRhZ6iH2H+MVH/6WA== +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/grpc/client/certs/ca_pub.pem b/0xetc/0xgo/grpc/client/certs/ca_pub.pem new file mode 100644 index 0000000..64c7019 --- /dev/null +++ b/0xetc/0xgo/grpc/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAphBJQLIzAbUt8h3Keo9x +zlNEBnxi/I+QGnEasPJresQLYFqmZsAw/wZJ/PbWFfqrkWPGYEDNoprVe/DbVUHn +bKzSZQpwItZKyarkxL+lDH+pPdYdqRDIIbz9OS3p6+hKSj5R76VqDunH2WtzfXKI +MJ+VmgKUGL1/TvXBmzenUo3f5sEnXaqPiwctuwUBHwyInnlVXOCnG+tWWNerWFqg +fRsm7WjaBJWRNZbKwVSTp19oQ0io/sqEeOg4CAbA5KHwiglK0yOGHFDkmEtbHfyW +xHkZD78F4P9gbVEfVtvb1daWFRQZs6hYgtLG3/V0Ict9H50Iyaxq1iQOkQ1S2J0s +pDTqGDbi5BoJtWZRpYqcK2wc9ZCD/feeeHVxjeJZ15O47O5eZRLDqP3N5Q7Zo2EU +JZj3qcg9ighG225Cv7tw3DJ0vgCi+ZtlULsL8C00w0771xfvclevXOqUR4f8NyUj +1Ydx4DEnunSnOUtAg7p14fnATZPYiLyk+1iqiZuTbhyE1VcTlpWwR9lpdQDo8xY4 +mFSzLxTUQE9wsIeodHsFkWMZvW3S7KWbBB4UChs9dH/CoivmfcDQkQiqdUzBLIF8 +O0OY3c0DcBY2gLtLsU5eMebMgliNs1tnDz8AoEi0rKM8W3rKJ9mY+f/WQ0J4K28A +qtLRGT4B2Wro1u4oCkH8F3cCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/grpc/client/main.go b/0xetc/0xgo/grpc/client/main.go new file mode 100644 index 0000000..e3c81d7 --- /dev/null +++ b/0xetc/0xgo/grpc/client/main.go @@ -0,0 +1,113 @@ +package main + +import ( + "context" + "crypto/tls" + "crypto/x509" + "flag" + "io" + "log" + "os" + "time" + + pb "github.com/seantywork/go/grpc/chatpb" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +const ( + defaultName = "world" +) + +var ( + addr = flag.String("addr", "localhost:50051", "the address to connect to") + name = flag.String("name", defaultName, "Name to greet") +) + +func main() { + flag.Parse() + + pemServerCA, err := os.ReadFile("certs/ca.pem") + if err != nil { + log.Fatalf("failed to load cert") + } + + certPool := x509.NewCertPool() + if !certPool.AppendCertsFromPEM(pemServerCA) { + log.Fatalf("failed to add server CA's certificate") + } + + config := &tls.Config{ + RootCAs: certPool, + } + + newTLSconfig := credentials.NewTLS(config) + + conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(newTLSconfig)) + if err != nil { + log.Fatalf("did not connect: %v", err) + } + defer conn.Close() + c := pb.NewChatterClient(conn) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name}) + if err != nil { + log.Fatalf("could not greet: %v", err) + } + + my_id := r.GetMessage() + + log.Printf("Greeting: %s", r.GetMessage()) + + r_stream, err := c.TalkToMe(ctx, &pb.TalkRequest{Message: my_id}) + + if err != nil { + log.Fatalf("could not get to talk to: %v", err) + } + + done := make(chan bool) + + recent_id := 0 + + go func() { + for { + resp, err := r_stream.Recv() + if err == io.EOF { + done <- true + return + } + if err != nil { + log.Fatalf("cannot receive %v", err) + } + + tc := resp.GetTalkContent() + + recent_id = int(tc.GetIndex()) + + log.Printf("Resp received: %s", tc.GetContent()) + } + }() + + <-done + + r2, err := c.WhatDidYouSay(ctx, &pb.HistoryRequest{Index: int64(recent_id)}) + + if err != nil { + log.Fatalf("could not ask: %v", err) + } + + it_said := r2.GetHistory() + + for i := 0; i < len(it_said); i++ { + + at := it_said[i].GetIndex() + + word := it_said[i].GetContent() + + log.Printf("it said [%d]: %s", at, word) + + } + +} diff --git a/0xetc/0xgo/grpc/server/certs/server.csr b/0xetc/0xgo/grpc/server/certs/server.csr new file mode 100644 index 0000000..aecbae8 --- /dev/null +++ b/0xetc/0xgo/grpc/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hCjGUVhpfyWPfOs2siwkYh +0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMIim9JET8rhOhxUMURgNJn +CT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJlujJFvp6mnfsZv/bjmcPddt +F+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfqoekwdumzc0zPaBtPNw7o +g+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9QWji/M+vnX00bnqoG6gE +HlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3zY4pPFPJNileetswLMlO +2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcRv0AgerWoXVYZ0sECi28v +P+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2Qk+q+qctzwcjosRL3VtV +vrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMeavrfuP5/osUo55bnMetw +PvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5kzv/FOKVjCcUqL/WJchS +AlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnPIiphWxhL28ae6okVabMh +T9ECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBjyokE3Sg/SWmcHRB95xJAW7rX +pFEatk+jC7kcChCltyqJjqsHrrv3xhLNO7oZ06uwYVgxSwVpLmEXSaIwvLdjdSQm +oOdXAOfyJNyqbzzNf8jBOq6g8tpM6mMCOS/qGM2dvH6lUTi4Rb3Zo08ArStMyFbI +GMh411ldy3lN2qAzascCrthtnMCqckEgs53hy8GEybb8qsqFC26GNUWFddab1lnj +1OZv+oNXD7iw+KB99wQm57Mj6ag1mp6sCbBgQefNGF0FCTVmquubNEyo0LV0u7PT +hVNG9dsVEoNQJiulJrLwZ0NxH/Do40Mdmmr677WWG2SL00kD/cADgA6TnXk5UeK9 +WeCec8uigp+rCHDyQV8SgsPiM92OZnFHuXGuqwuyvcSdb6oRSl0AJ0AigSmIA8m0 +1kwytUoh910wP4Bv2HIk+R8XnSxuqQzPeooV3swuiNSA0HHP2OR8mGZU4rLokgOQ +/rX1Oznqm7Vt6YYvh1EzdnPvYDv0e3XR5LtzUGhVF9VFAx8oIJ+UFnqHeTYEVbPr +qanZ6YCJj2F5lUYUz7ks/INVSDIOBiYnnmzOtUAbnphB9enNdhEGlcLLPpATFyhS +sriGg+hPeBEXL8QTmO2s96mcT7A9wDR5VgF9FcdmIKZWy+oXmM0hp+TIOdT3KkkX +YO6XW8nXYfog/hv98w== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/grpc/server/certs/server.key b/0xetc/0xgo/grpc/server/certs/server.key new file mode 100644 index 0000000..8e0c7d1 --- /dev/null +++ b/0xetc/0xgo/grpc/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +/6TjB2rKRjS0oMT76Qj95oAiG1IR +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/grpc/server/certs/server.pem b/0xetc/0xgo/grpc/server/certs/server.pem new file mode 100644 index 0000000..0329993 --- /dev/null +++ b/0xetc/0xgo/grpc/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUK0kjySLAqJHUbhc5Q0upk/b6HhQwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDRaFw0yNTA1MTEwNzA1 +NDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMJxvD4pJTEqytOVJsuoQoxlFYaX8lj3zrNrIsJGIdMrI2WdLGMr +qcxoU5rEEAyOtU1Y59eB/3yuiXDQh5nzCIpvSRE/K4TocVDFEYDSZwk+0zOUmMPG +vxDOCp7ORkwKnwPfi1Gzwrq1k93DZiZboyRb6epp37Gb/245nD3XbRfr4/4WPUYj +649nrL5l3Ez7YZA/rJYrB5otJsnlfPTX6qHpMHbps3NMz2gbTzcO6IPgLii+TLMY +9NfFhVXtezFf7mm8VyFiu5ANz1HU9naF/UFo4vzPr519NG56qBuoBB5XytSIKx01 +y7KdKhPkTMiIXIC0ksvi/GMblOstLVYSN82OKTxTyTYpXnrbMCzJTtozjJ3RCo5O +Pc404mqZhs6CuCJ8IX24kJQMrFqArpCHEb9AIHq1qF1WGdLBAotvLz/mbimpZYdW +JfsNIPGcihG/NinDfgZXnsUk6hGKDF8ctkJPqvqnLc8HI6LES91bVb68HU33M8gF +9RQjwdvpQ62xzQbeDWBGoRjRzfsq1lETHmr637j+f6LFKOeW5zHrcD7zG0O9+yGk +u25aILyryjVBIH7p4kA1zJkziP8Clki7eZM7/xTilYwnFKi/1iXIUgJRPzaQEwDf +qWSAWZH56sRF+REQHejHpZ4Mr+ePZBMZzyIqYVsYS9vGnuqJFWmzIU/RAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUKDVEnh6vH1beZ6r4 +aF2jgcXZTLUwHwYDVR0jBBgwFoAUIm4H+A+/zncV06Pm4qSUetmIUBswDQYJKoZI +hvcNAQELBQADggIBAC6pDuSa+lUxW0cbf7Tzvo5NbB7tix4/XY6fNviSzwdpjAh+ +c9VqHoTT24j35bMx76Tlg7aGJbKKFsjk++njM3u/Digb7A95FQ/0Ly5myMpkjK8D +TedhTx2vEPbUY+nG2Au4yRvAN0WU7vDypTYPZ0AQVRokq2zeUmP60BE7xnb6+NdL +fJwTis4QX653S0D68aoV0w4RtiB9VhitODeEhwvsWGGqa+I20XqX3eI0KI3JkMCz +9fJtLRKn70Gnidh1TCfvlnfmWqoSTZz5/UGEBKa7bbNXIgW1S0EZYD+D583XOA9o +NKv8Ektw/lhwRzsfN0j1SNzPhBXX7TQt8eZCdGopw9UlXzF1+BZlQuG+MVh9JTzP +xXW/Uo7CmPMT5jZSQsfQb0mvG5JRQQ4x+4TlmA67OxBMM8+ko9W/4TJf9yxAmRIu +GLVS5xjgvG5yo9ckcexy/OEY9qXFWgWXn8pfbbNWW8CoL1Mk1hLICdxrUL6pyrFC +fdHhPJcDJPFaILqSRhT77UKpm4Y29V97ikb6sIjKWj1d2Z49yZN4yjtNQFeWlkVm +CuOFzHAHpI7SnFz9AzH1vwaM4XI+v6pTulrkXlCVt4+6GLJAXHUKBDiuFnEqqp0J +Mkx65S017e8WFTxLcmTbcKX/w15+2pi0kiCbm2IDiTEDJFzAjUhL7OJvceGg +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/grpc/server/certs/server.pub b/0xetc/0xgo/grpc/server/certs/server.pub new file mode 100644 index 0000000..28a26b8 --- /dev/null +++ b/0xetc/0xgo/grpc/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hC +jGUVhpfyWPfOs2siwkYh0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMI +im9JET8rhOhxUMURgNJnCT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJluj +JFvp6mnfsZv/bjmcPddtF+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfq +oekwdumzc0zPaBtPNw7og+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9 +QWji/M+vnX00bnqoG6gEHlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3 +zY4pPFPJNileetswLMlO2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcR +v0AgerWoXVYZ0sECi28vP+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2 +Qk+q+qctzwcjosRL3VtVvrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMe +avrfuP5/osUo55bnMetwPvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5 +kzv/FOKVjCcUqL/WJchSAlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnP +IiphWxhL28ae6okVabMhT9ECAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/grpc/server/main.go b/0xetc/0xgo/grpc/server/main.go new file mode 100644 index 0000000..31a4d85 --- /dev/null +++ b/0xetc/0xgo/grpc/server/main.go @@ -0,0 +1,202 @@ +package main + +import ( + "context" + "crypto/tls" + "flag" + "fmt" + "log" + "net" + "strconv" + "time" + + pb "github.com/seantywork/go/grpc/chatpb" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +var allowed_names []string + +var user_idx int = 0 + +var loop_idx int = 0 + +var word_idx int = 0 + +var words = []string{ + "hello", + "my", + "name", + "is", + "test", + "program", +} + +var history pb.HistoryResponse + +var ( + port = flag.Int("port", 50051, "The server port") +) + +type server struct { + pb.UnimplementedChatterServer +} + +func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { + log.Printf("Received: %v", in.GetName()) + + allowing := in.GetName() + "-" + strconv.FormatInt(int64(user_idx), 10) + + user_idx += 1 + + allowed_names = append(allowed_names, allowing) + + return &pb.HelloReply{Message: allowing}, nil +} + +func (s *server) TalkToMe(in *pb.TalkRequest, srv pb.Chatter_TalkToMeServer) error { + + log.Printf("Received: %v", "talk") + + if len(allowed_names) == 0 { + + return fmt.Errorf("no allowed user") + } + + hit := 0 + name := "" + + for i := 0; i < len(allowed_names); i++ { + + name = in.GetMessage() + + if name == allowed_names[i] { + + log.Printf("found: %v", name) + + hit = 1 + + break + + } + + } + + if hit != 1 { + + return fmt.Errorf("failed to retrieve user") + + } + + max_idx := len(words) - 1 + + for { + + if loop_idx > max_idx { + + loop_idx = 0 + + break + + } + + tc := pb.TalkContent{ + Index: int64(word_idx), + Content: words[word_idx], + } + + history.History = append(history.History, &tc) + + resp := pb.TalkResponse{ + TalkContent: &tc, + } + + if err := srv.Send(&resp); err != nil { + + log.Printf("send error %v", err) + + } + + loop_idx += 1 + + word_idx += 1 + + time.Sleep(time.Second * 1) + + } + + return nil +} + +func (s *server) WhatDidYouSay(ctx context.Context, in *pb.HistoryRequest) (*pb.HistoryResponse, error) { + + log.Printf("Received: %v", in.GetIndex()) + + if len(history.History) < 3 { + + null_array := []*pb.TalkContent{} + + hr := pb.HistoryResponse{ + History: null_array, + } + + return &hr, fmt.Errorf("not enough has been said") + + } + + idx_from := in.GetIndex() + + i := 0 + + resp_array := []*pb.TalkContent{} + + for { + + if i > 2 { + break + } + + target_idx := int(idx_from) - i + + history_el := history.History[target_idx] + + resp_array = append(resp_array, history_el) + + i += 1 + } + + resp := pb.HistoryResponse{ + History: resp_array, + } + + return &resp, nil +} + +func main() { + flag.Parse() + + serverCert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") + if err != nil { + log.Fatalf("failed to load cert and key") + } + + config := &tls.Config{ + Certificates: []tls.Certificate{serverCert}, + } + + newTLSconfig := credentials.NewTLS(config) + + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + s := grpc.NewServer( + grpc.Creds(newTLSconfig), + ) + + pb.RegisterChatterServer(s, &server{}) + log.Printf("server listening at %v", lis.Addr()) + if err := s.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/0xetc/0xgo/gsheet/.gitignore b/0xetc/0xgo/gsheet/.gitignore new file mode 100644 index 0000000..1eb0597 --- /dev/null +++ b/0xetc/0xgo/gsheet/.gitignore @@ -0,0 +1,2 @@ +config.yaml +token.json \ No newline at end of file diff --git a/0xetc/0xgo/gsheet/Makefile b/0xetc/0xgo/gsheet/Makefile new file mode 100644 index 0000000..8cc72f9 --- /dev/null +++ b/0xetc/0xgo/gsheet/Makefile @@ -0,0 +1,7 @@ +all: + + go build -o gsheet.out . + +clean: + + rm -r *.out \ No newline at end of file diff --git a/0xetc/0xgo/gsheet/core/modules.go b/0xetc/0xgo/gsheet/core/modules.go new file mode 100644 index 0000000..c3a2b61 --- /dev/null +++ b/0xetc/0xgo/gsheet/core/modules.go @@ -0,0 +1,111 @@ +package core + +import ( + "context" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + + "golang.org/x/oauth2" + "gopkg.in/yaml.v3" +) + +type GsheetConfig struct { + CRED_PATH string `yaml:"CRED_PATH"` + SHEET_ID string `yaml:"SHEET_ID"` + SHEETS []string `yaml:"SHEETS"` +} + +func GetGsheetConfig() (GsheetConfig, error) { + + var gsh_conf GsheetConfig + + file_b, err := os.ReadFile("./config.yaml") + + if err != nil { + + return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error()) + + } + + err = yaml.Unmarshal(file_b, &gsh_conf) + + if err != nil { + + return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error()) + + } + + return gsh_conf, nil +} + +func GetGsheetClient(config *oauth2.Config) (*http.Client, error) { + + var http_client *http.Client + + tokFile := "token.json" + tok, err := GetGsheetTokenFromFile(tokFile) + if err != nil { + tok, err = GetGsheetTokenFromWeb(config) + + if err != nil { + + return http_client, fmt.Errorf("failed to get gsheet client: %s", err.Error()) + + } + + SaveGsheetToken(tokFile, tok) + } + + http_client = config.Client(context.Background(), tok) + + return http_client, nil +} + +func GetGsheetTokenFromWeb(config *oauth2.Config) (*oauth2.Token, error) { + + var tok *oauth2.Token + + authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) + + fmt.Printf("Go to the following link in your browser then type the "+ + "authorization code: \n%v\n", authURL) + + var authCode string + + if _, err := fmt.Scan(&authCode); err != nil { + + return tok, fmt.Errorf("failed to get web token: %s", err.Error()) + } + + tok, err := config.Exchange(context.TODO(), authCode) + + if err != nil { + return tok, fmt.Errorf("unable to retrive token from web: %s", err.Error()) + } + + return tok, nil +} + +func GetGsheetTokenFromFile(file string) (*oauth2.Token, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + tok := &oauth2.Token{} + err = json.NewDecoder(f).Decode(tok) + return tok, err +} + +func SaveGsheetToken(path string, token *oauth2.Token) { + fmt.Printf("Saving credential file to: %s\n", path) + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + log.Fatalf("Unable to cache oauth token: %v", err) + } + defer f.Close() + json.NewEncoder(f).Encode(token) +} diff --git a/0xetc/0xgo/gsheet/main.go b/0xetc/0xgo/gsheet/main.go new file mode 100644 index 0000000..40b9d7b --- /dev/null +++ b/0xetc/0xgo/gsheet/main.go @@ -0,0 +1,110 @@ +package main + +import ( + "context" + "fmt" + "os" + + "golang.org/x/oauth2/google" + "google.golang.org/api/option" + "google.golang.org/api/sheets/v4" + + gshcore "github.com/seantywork/go/gsheet/core" +) + +func main() { + + ctx := context.Background() + + gsh_conf, err := gshcore.GetGsheetConfig() + + if err != nil { + + fmt.Println(err.Error()) + + return + + } + + cred_path := gsh_conf.CRED_PATH + + cred_b, err := os.ReadFile(cred_path) + + if err != nil { + + fmt.Println(err.Error()) + + return + } + + client_config, err := google.ConfigFromJSON(cred_b, "https://www.googleapis.com/auth/spreadsheets.readonly") + + if err != nil { + + fmt.Println(err.Error()) + + return + } + + client, err := gshcore.GetGsheetClient(client_config) + + if err != nil { + + fmt.Println(err.Error()) + + return + + } + + srv, err := sheets.NewService(ctx, option.WithHTTPClient(client)) + + if err != nil { + + fmt.Println(err.Error()) + + return + + } + + sheet_id := gsh_conf.SHEET_ID + + sheets_len := len(gsh_conf.SHEETS) + + for i := 0; i < sheets_len; i++ { + + target_sheet := gsh_conf.SHEETS[i] + + resp, err := srv.Spreadsheets.Values.Get(sheet_id, target_sheet).Do() + + if err != nil { + + fmt.Printf("failed to get values from: %s: %s\n", target_sheet, err.Error()) + + return + + } + + if len(resp.Values) == 0 { + + fmt.Printf("no data found for: %s\n", target_sheet) + + } else { + + for _, row := range resp.Values { + + col_len := len(row) + + for j := 0; j < col_len; j++ { + + fmt.Printf("%s ", row[j]) + + } + + fmt.Printf("\n") + + } + } + + } + +} diff --git a/0xetc/0xgo/gui/main.go b/0xetc/0xgo/gui/main.go new file mode 100644 index 0000000..7dc372a --- /dev/null +++ b/0xetc/0xgo/gui/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "fyne.io/fyne/v2/app" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" +) + +func main() { + a := app.New() + w := a.NewWindow("Hello") + + hello := widget.NewLabel("Hello Fyne!") + w.SetContent(container.NewVBox( + hello, + widget.NewButton("Hi!", func() { + hello.SetText("Welcome :)") + }), + )) + + w.ShowAndRun() +} diff --git a/0xetc/0xgo/http/Makefile b/0xetc/0xgo/http/Makefile new file mode 100644 index 0000000..804008c --- /dev/null +++ b/0xetc/0xgo/http/Makefile @@ -0,0 +1,9 @@ +all: + + go build -o client/client.out ./client + + go build -o server/server.out ./server + + + + diff --git a/0xetc/0xgo/http/certgen.sh b/0xetc/0xgo/http/certgen.sh new file mode 100755 index 0000000..bdb69b5 --- /dev/null +++ b/0xetc/0xgo/http/certgen.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + + +mkdir -p ./client/certs + +mkdir -p ./server/certs + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/http/client/certs/ca.pem b/0xetc/0xgo/http/client/certs/ca.pem new file mode 100644 index 0000000..4468555 --- /dev/null +++ b/0xetc/0xgo/http/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUTe8SZnDGd5n9bMbehALXP2GGBeEwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM2NThaFw0zNDEwMzEwODM2 +NThaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDTv+CZXgDHH7Vh9wqa63EwW7suKDOaKsL94Hcf6wu2LccF5mlouuWbB2U1 +Ji1SoFrsZ1apqR5x/1xk99UN5vagP8zJSvAIRok46xbab+Ci2L7CbKofENm9VhS5 +qAZuGb824pcoKCsywoectrGRrGvL+2dCJvmvSTimqz+/Pb8b5ur22y9zze3l67RB +ggkQZTFKL8URNP1LJWosnI5h6l8+3tAa78Bm6lLVmb3A6eP/DP1f8A7A5iO7z/EP +qoCPP5yf3/9+nWhZIJEEO5CKQFiRdo/RSAaGK+eY0tfvT5hFq89PIR6PHvggAwgB +sTpBFeuSuEgdcTQ7v6yChB3t+0jh1YtiuSmjOQ+4Uix8TYlGMf0vaIVPKzUEFYB9 +BYLXWN9BvQmyMLeqxOXgGvGUmUtXKfesQZIJ1ro8jl0h+Isjv61dQGgs01DDvBV8 +pKzs+vB0tcHP6+V7XSu98SCdM6i4w2aerXZO7KVfj3gRpb+IRcvGXvK0j2al4h23 +HTf2lVNBKHIQYPSZAr+wKo4oLJqWrVKdI34qB0GBprz8bYTxWM7UZJtu6MnJhyFT +O0fS6hbD266HyrQILpURRmc/8AL+I/U5oVAK1U+6ViGKNcyqpN/d6rwNYFyKLnab +T5VcsyLFPoutizjGo4wFTab83ddkwLOR14TdLP+Xq0d0DZ6w6QIDAQABo1MwUTAd +BgNVHQ4EFgQUCI7gGU1vOV0ENPD/eujH47lzH6kwHwYDVR0jBBgwFoAUCI7gGU1v +OV0ENPD/eujH47lzH6kwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAnF2DWc+A6P85ND6T4yqQ6Xr+S5qTYl2d5AUKDaU1IEg6z6eMUxnu5DZRukD5 +HLSUJa13qRR935oth/EG+r78td3BFmbS9eMjlp+FA3Bkh9PIxtfj0IaUoitiSV1c +kg6FGE7XYfSYh6TkCK5WN8fJ0Qtr40PyI2Uz9UfMIbMEtGtsJZ5enG5H6IGp5cCo +5+pKRwdMBObeiceh28nloiktJJQrIbOWF/SaiL5U2+zmeEpNO0w041BwObBttBE7 +lB1MtgSsPuDgKjOVrWOjYTWg7eA5arZ1Ush8p8POYtJiWV5mmOK/ancKjvj05Ouv +HTZvfDNBpMWG7DsMgJINvuqLXSbBfDk5UGw8VCdhtqW/3wuR9Wspt6eIgxst/JPD +pXP3ddxJ3xeNE3cujZTQWASNIcXRbEU0AF/leqydOdtDWLQCI4jWKpGx+ZtZ3c96 +8uJwmI3V8ILZF75H1z3JyCqdmFHHQw+n3Q6CFMqOFXucKsHK8aEH8h48yMhS90wN +VXJ9pbI2TYi5bBn+XmImcRv0kd7mASF/1n9s1hK5r/dNHbEhyCNNl8kBnIoQak4g +EcLIma7XPZJg4g00JnR+w8Zx4YG5oeNIFii+OxCHwNSWYYNE/mHrzeJvGi2NQuHW +vIVlZgebDgPxkxd+jvcnxMm6Dn9TOqWHiTUiPxkQu05rgXg= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/http/client/certs/ca_priv.pem b/0xetc/0xgo/http/client/certs/ca_priv.pem new file mode 100644 index 0000000..ad15298 --- /dev/null +++ b/0xetc/0xgo/http/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +22FUN0cT9cuPJkirjHxJ6UA+whMp +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/http/client/certs/ca_pub.pem b/0xetc/0xgo/http/client/certs/ca_pub.pem new file mode 100644 index 0000000..0027ba9 --- /dev/null +++ b/0xetc/0xgo/http/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA07/gmV4Axx+1YfcKmutx +MFu7LigzmirC/eB3H+sLti3HBeZpaLrlmwdlNSYtUqBa7GdWqakecf9cZPfVDeb2 +oD/MyUrwCEaJOOsW2m/goti+wmyqHxDZvVYUuagGbhm/NuKXKCgrMsKHnLaxkaxr +y/tnQib5r0k4pqs/vz2/G+bq9tsvc83t5eu0QYIJEGUxSi/FETT9SyVqLJyOYepf +Pt7QGu/AZupS1Zm9wOnj/wz9X/AOwOYju8/xD6qAjz+cn9//fp1oWSCRBDuQikBY +kXaP0UgGhivnmNLX70+YRavPTyEejx74IAMIAbE6QRXrkrhIHXE0O7+sgoQd7ftI +4dWLYrkpozkPuFIsfE2JRjH9L2iFTys1BBWAfQWC11jfQb0JsjC3qsTl4BrxlJlL +Vyn3rEGSCda6PI5dIfiLI7+tXUBoLNNQw7wVfKSs7PrwdLXBz+vle10rvfEgnTOo +uMNmnq12TuylX494EaW/iEXLxl7ytI9mpeIdtx039pVTQShyEGD0mQK/sCqOKCya +lq1SnSN+KgdBgaa8/G2E8VjO1GSbbujJyYchUztH0uoWw9uuh8q0CC6VEUZnP/AC +/iP1OaFQCtVPulYhijXMqqTf3eq8DWBcii52m0+VXLMixT6LrYs4xqOMBU2m/N3X +ZMCzkdeE3Sz/l6tHdA2esOkCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/http/client/main.go b/0xetc/0xgo/http/client/main.go new file mode 100644 index 0000000..0590ec3 --- /dev/null +++ b/0xetc/0xgo/http/client/main.go @@ -0,0 +1,74 @@ +package main + +import ( + "bytes" + "crypto/tls" + "crypto/x509" + "encoding/json" + "log" + "net/http" + "os" +) + +type CommJSON struct { + Data string `json:"data"` +} + +func main() { + + certpool := x509.NewCertPool() + + file_b, err := os.ReadFile("certs/ca.pem") + + certpool.AppendCertsFromPEM(file_b) + + tlsConfig := &tls.Config{ + RootCAs: certpool, + } + + transport := &http.Transport{TLSClientConfig: tlsConfig} + client := &http.Client{Transport: transport} + + req := CommJSON{ + Data: "hello", + } + + respjson := CommJSON{} + + jb, err := json.Marshal(req) + + if err != nil { + log.Println(err) + return + } + + r, err := http.NewRequest("POST", "https://localhost:8888/hello", bytes.NewBuffer(jb)) + + if err != nil { + log.Println(err) + return + } + + r.Header.Add("Content-Type", "application/json") + + resp, err := client.Do(r) + + if err != nil { + log.Println(err) + return + } + defer resp.Body.Close() + + log.Printf("is HTTP 1: %v (%s)\n\n", resp.ProtoAtLeast(1, 0), resp.Proto) + + derr := json.NewDecoder(resp.Body).Decode(&respjson) + + if derr != nil { + log.Println(err) + return + + } + + log.Printf("server data: %s\n", respjson.Data) + +} diff --git a/0xetc/0xgo/http/server/certs/server.csr b/0xetc/0xgo/http/server/certs/server.csr new file mode 100644 index 0000000..6ddb8f2 --- /dev/null +++ b/0xetc/0xgo/http/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQA9Y1FbEGElToEt033eTv +dlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9eRGMDJFu04Xzk7Btb8Q7 +gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03dKvGe2riOmcbQtLl46MDY +RTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NNgztjvN6o+C3sjl/GLSkM +5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5BdhwX8tlWlZcAiW29lKAr9MF +zOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnLW2SNWC1mDL0qqC/UlOle +YjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN5ftcECCPHp2pZYSnLyuq +CsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDrune+AIhz6TyglXA5YN1az +WEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8EDIR2qkDu/Y/b/C5u1kM6 +EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7ON77gOPrVIE+Bb5KwDR7 +FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXklbFR0RPzUNMFoOgAJ0/EJ +w+MCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBN7eYXm1UbAP4poWU3z6GxBZKY +yhFu2QBky1ONenyDk6mvZHmQItzSycx/bpV0MwRdyH/w4FriVJcuuEm5DiLYyvEm +nIdxb/4zl728ZLQg/9o+mR9gN/wE8nSHg0B2reB5/aeDcRxGi3x9eBXyblG56nuO +Gte5jsCn0vqjLbbTNAQakk/YKzekpME1fMbEKxd4xP9r3rlK0ZFd9hs7WRld3zWX +pG+bw+U5MS/IPfm4Rar/l0eGc7D5H2hpzuJCClukdFWvn1Vco3c1Owv4JYGG6lJs +JS2hy2yNFBzJlhXyF1v51TDCLVisyEPm8lkRfMx5EUFPesbmd2t5VIw9A88gnUIK +b8Wn+kmV1TkCdOswwPC5IbUrKejyrCn4a49pXPfdpXyI0uhwkrWoUz91EZgUnqcO +UMdvxjZuWXx25I+rhMFeR4qHLyMfm5vbnS0+HwTLNuy2qpd5xIUCwtCVOgcUONez +5Ax/HMmPUdpCCpKaDRjp/xl8B76eY5ex/YSCCeKaKy42vZ0qoUvXKM6fsg7HRQHr +p551Gv+xIv2ikdbg/p2xLGQPAsVVRLeBhcTvQJokgPNsY/RcaSy5cprSE7ux0Rpd +VDuPPLSM5fe3pfGBUXxbCNsULdAL6bLQcrwe1OCV9GMZ7sVdmvgFoDtGT1yc34tF +xa7gfed6079H5p6Bfg== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/http/server/certs/server.key b/0xetc/0xgo/http/server/certs/server.key new file mode 100644 index 0000000..c2eb360 --- /dev/null +++ b/0xetc/0xgo/http/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCn45AToULP6TQp +ckSxUVAD1jUVsQYSVOgS3Tfd5O92VASeWW8VMsi2kMdZDbeYK/YjvLjjOePF0W3T +/HWkS715EYwMkW7ThfOTsG1vxDuBfh/X+gnHTbSt8rx4V82Zl72fHsURCX3Imr+6 +M2h/Td0q8Z7auI6ZxtC0uXjowNhFOUB6ZTINd7cELQ2Z/+Vshz9q4NUaPQXoO/+p +89o7c02DO2O83qj4LeyOX8YtKQzmE/JVuR0Ds7x9kR0kJtGI0gcuxRGc4bAJlOMC +SbkF2HBfy2VaVlwCJbb2UoCv0wXM4YNPEr+4j5beJFzMXZ15gngGtB4LRBDo2PsI +aUeAmctbZI1YLWYMvSqoL9SU6V5iNiRMjDX/dkgQQLjKnrCHf2XZGNic9TnOISrl +6VzBok3l+1wQII8enallhKcvK6oKwZHNTyGzR0KTfpuO1ERJUEtrelAZv2J9TjaX +CqzMOu6d74AiHPpPKCVcDlg3VrNYSmD84fE9I4VaZljYQUaPT7WhwvLWNptpHQNx ++379nwQMhHaqQO79j9v8Lm7WQzoRTmkpdLd2VY6S7tc7Gch0og5PC7zcvOgICeF+ +ADanlbs43vuA4+tUgT4FvkrANHsUricQfOVdzlS/haiDZmxww7Moj0pWj9zLAHyo +Y9GVeSVsVHRE/NQ0wWg6AAnT8QnD4wIDAQABAoICAA3JOGv8OnXDIwbiPLTIxgbC +oLJKyoJX2YSvCKbeZTF0vbpZAq+db3DaW5w67Z//wCL4HMB/4O2+AEQ/f1OB6qmV +4Mepa43P+ovemWXrma1M84VzITlt7o+4FnTVVOsvVCFMUAdRnbQKzQKXtRV7CdW8 +aHxyWjdTZZDph/2o1Dl+9YX3aFBFy8/6eRrzsd2jD3iRxL32U9VZk+lbPkjSc4N6 +rXp1WC+k6b9ZKvdLXyVHbwdN/41txWUUNO3iiCMxh+h1wzf8Kk3nHWrzLc/GkZe0 +JnrwC3cbrLX2WV3WuKu1uugT1I1tsQhFuR8I8uTm6z81rB/ls3PDWX2702TCfDm/ +bmZOS2JzQSXhxY5AHs9YULJpUA9OdCDeu0TJkJB62b7SrskupFtab9eQ82/7XcLF +7eu7FV76arrYk54Hn/P1Fbrm/D3jHb6QRqUlIkzEItVagtBIS3X1bVLriFzUrjIJ +4iwWA7Zz8S0RObMRS6RGgOBWkhIt4LMYSoElkSCv55gKyfCn/esf077W/KfMql01 +ovzTQf6LkyH/WN0l4fWs5cOEZJDiy6CmYSKjgghCBdWmNpcczLGpAsjwwLZBYiSz +vUoCFWgtc3hW55Idp2mrEb7qrOpB8M6V4vy220rbCH7njOxxwegOzUDicr/gr5WM +RQe/l59wvmTW1Y4Mtu75AoIBAQDTw1/urndJlAisAxOAaK1HnDgIpEpDEzKPjqai +6JqrKAQ3bM5taPLbn1gmn5c4D+kA/Lt+lxm3+j84kZhsAZgQ08Lr6W9rqdjhnR5J +OcfUojl4UdUTLbclgwXqT2O+tz4CaFvOBUPlsmfMqW4lXie3bJ91s/QBp6DIUwaa +uUelSAZisVPQh9nr4jkfW0BVBCX6ww5esfvAubRbrLwNqSH+hUVujAw1VNj9ed+H +1+1fL4DKTrio2Ou8pgz29PbtQxOAfMh610Gy9PObK9TmwFCnlx6jPNgV2ICSo/cD +Yz1FOEc4YWAmQj6c3Shs0CqEoz53Wxsi+Tw10QQE311YuBfJAoIBAQDK9ePBt4ZL +MkpqUtkrQhUpIuMclKbJGpd8HfYuYQ1S3PhS6zr+ks0bAgcTNDzPb8OTRzRtZhH9 +OLwCqUQbflIOKWI9ZPy/MNm5K1+kcjzdprLJx+e3CmaMQLcqb7SYhPmxkoH29inX +B2u7+Tg44vIzznuPqOzxfihQYhWsP0zNQpUB1FybeHlwyP6xruquAjCa3XkAw2cb +YXlwrLhABsmko8UYjTS8FtYIZiIxgZr5/PUF7pzvpzHppW5AYigOIc06DnddMJpv +isBw5xIQE7T+hugyeu3oGaewp1RVJSN+s33wYVbyr1JX5+q6G+w7DqSzkM1YNVph +Tvim7HwNgmxLAoIBAAj9PC9HnKy06gFTSBqlVuW5Te+f+b8LK5RIe+5ibV5innsz +1TdzwwtrojRRhfvNQRjXoaXoCCF1MAXYuF2tW6UrOBUHncE2PoylPMni+AagtEvV +PXRI9oNTIoclw5gu8yTrBSqjspQnlJxtfM19R7ZTmBlJAEyprvuR+q/Kua3cdtjt +qh8qBSgsPDyGhR6WxH32lb+TUpqFx5A0ru7thRHm2mGs9D+3UFbCO6jqk5r8yzzL +Rq90Nd2WNuqsz2aW+Fb19RSx2oocN9MYczswYrwagCRxysJypFKVP0EXj1xG3U8Z +Yxl8qmfCQ5sK4yMqQtaSOX6skc+/BaqnSLEhb3ECggEBAKM7ByXxWAx6Mec5Infr ++eDPsiB2XX036cVkw22hmHmgRgdKMHQ11Md35gDH7nBWztBQYBXsFWO2kV8Ci0gh +XBUPq3b9FVkfDLwj6hPz3IfXXcty/yTzNG5wTd/PX0ubBsaNsgDREe1ihn7zfQgj +Xe/UjQOJNKc0c2/SsuOJNVePyQ9jn+daCTFwNYbpysyP7k9e98ZpYS9gQa8g+j5k +NyA2pnmMd3EeXJz8p1txhRaxHs7ajVUg/r+O0RDu4JAdF1Ut9Un5oPs8eHFVJe3Q +K6zZCz4uJ9CXcYpdyTGBYP6xlQQTBT7BSlRwrRNpCaClskjImJ3sqve/77MwVsT2 +s+kCggEAVd8FywUi+H6Ez/Sw+zSaPpA2CyfmfDIrvp+SqFLcnOkjQHdlVNHoFco0 +qWaXNmgyDuF8orfW4efXGU4MS/WTd0HsfeLCZ7MEfDK+5xWdkQaRJpiBZKW91OIB +mJ2/jyxQJCCZgaWXsgKz1y/dfZ0h4AbeqoZUmNq2uOV0UvAM0fehm7Fye8b//J5n +ZuKrPVgFigptX28jTdbZFUpuIcBtMvSdG1+D7YKqOnAbbJDn1G9lt8uPP2z3pckg +t0ns+Poea6uUjelCZz70LxHTe/EOxBp1y7QHdmJvR0D9tW2qe+pWpea3hVSjgFfr +GnWPPl7p4Kc8fCTK1vZnmhI4kAK+Lw== +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/http/server/certs/server.pem b/0xetc/0xgo/http/server/certs/server.pem new file mode 100644 index 0000000..d5ba7bc --- /dev/null +++ b/0xetc/0xgo/http/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUKXjjSj2aCl9FGUjbp8HZlPjABAswDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM3MDBaFw0yNTExMDIwODM3 +MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKfjkBOhQs/pNClyRLFRUAPWNRWxBhJU6BLdN93k73ZUBJ5ZbxUy +yLaQx1kNt5gr9iO8uOM548XRbdP8daRLvXkRjAyRbtOF85OwbW/EO4F+H9f6CcdN +tK3yvHhXzZmXvZ8exREJfciav7ozaH9N3Srxntq4jpnG0LS5eOjA2EU5QHplMg13 +twQtDZn/5WyHP2rg1Ro9Beg7/6nz2jtzTYM7Y7zeqPgt7I5fxi0pDOYT8lW5HQOz +vH2RHSQm0YjSBy7FEZzhsAmU4wJJuQXYcF/LZVpWXAIltvZSgK/TBczhg08Sv7iP +lt4kXMxdnXmCeAa0HgtEEOjY+whpR4CZy1tkjVgtZgy9Kqgv1JTpXmI2JEyMNf92 +SBBAuMqesId/ZdkY2Jz1Oc4hKuXpXMGiTeX7XBAgjx6dqWWEpy8rqgrBkc1PIbNH +QpN+m47URElQS2t6UBm/Yn1ONpcKrMw67p3vgCIc+k8oJVwOWDdWs1hKYPzh8T0j +hVpmWNhBRo9PtaHC8tY2m2kdA3H7fv2fBAyEdqpA7v2P2/wubtZDOhFOaSl0t3ZV +jpLu1zsZyHSiDk8LvNy86AgJ4X4ANqeVuzje+4Dj61SBPgW+SsA0exSuJxB85V3O +VL+FqINmbHDDsyiPSlaP3MsAfKhj0ZV5JWxUdET81DTBaDoACdPxCcPjAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUJUhYdx2t7K6kqubV +e4Ls3gzjbecwHwYDVR0jBBgwFoAUCI7gGU1vOV0ENPD/eujH47lzH6kwDQYJKoZI +hvcNAQELBQADggIBAIzZatOoI8fvzRiqOEQp+wJ2nErevSbNijJZta0aWOAWNuaj +cikA4nlRCKbUiIlo1iIBUwf6VE2nSNHn7Z5Cbe4UMcAKBYbGe/eUWj4UOYAsrGfT +Ueg6Tr9sfVZ2ipllX576RNHXkBM/z2whOmdVbDslIe0Z/4bQ0RKbj+V/qq5N2GQ3 +6mjDWsuuHgv0aGoOUYIe3NU5oB51ZPQySUFr7uk6Qkd+oz/3OID+RYOivuIk8u1Q +fryGdEwjmhPDHwX1w7ibUlzfiJpV65u7Iv9qg4e3clvPy7CLUqzOb0m+zpefYwb8 +ED+Gm4SKRDJZb8Uu4gNvKIZwyWtuPhVla97xdviOxI/uyY+1rNQqr5/bQHVGjr6M +iop1D3aEL+DWFqoZ5FM2lPx3ced/b4qHKA6uFk0/U4NusmMEWWhE6djfmTupWx+H +nntYCyDk2y7qxMLI6Ft3LeQCbrfcM0e7XT9dfbIHM4R/cGrUOfCChoKlnsvt8SaJ +6ZYO0qH90VLdJ3m4dYD3wZqYRUwgqQaYkJlpeGsrDMaiqJwK/OIARhbckRsBamop +JOILc0T1TzAuQIUFdjFTdefzVymwcI6uOVcEui1OF7WMzS8A35MKEXKRqhXtNTX0 +8RRFNwRKcufvd1SAvWR/MWCAN6U19vcz/I4JmkMv6oj9uFE5A9cMswRAnJDV +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/http/server/certs/server.pub b/0xetc/0xgo/http/server/certs/server.pub new file mode 100644 index 0000000..e0c2b96 --- /dev/null +++ b/0xetc/0xgo/http/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQ +A9Y1FbEGElToEt033eTvdlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9 +eRGMDJFu04Xzk7Btb8Q7gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03d +KvGe2riOmcbQtLl46MDYRTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NN +gztjvN6o+C3sjl/GLSkM5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5Bdhw +X8tlWlZcAiW29lKAr9MFzOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnL +W2SNWC1mDL0qqC/UlOleYjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN +5ftcECCPHp2pZYSnLyuqCsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDru +ne+AIhz6TyglXA5YN1azWEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8E +DIR2qkDu/Y/b/C5u1kM6EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7 +ON77gOPrVIE+Bb5KwDR7FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXkl +bFR0RPzUNMFoOgAJ0/EJw+MCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/http/server/main.go b/0xetc/0xgo/http/server/main.go new file mode 100644 index 0000000..31a047f --- /dev/null +++ b/0xetc/0xgo/http/server/main.go @@ -0,0 +1,59 @@ +package main + +import ( + "log" + "net/http" + + "github.com/gin-gonic/contrib/sessions" + "github.com/gin-gonic/gin" +) + +type CommJSON struct { + Data string `json:"data"` +} + +func handlePostHello(c *gin.Context) { + + req := CommJSON{} + resp := CommJSON{} + + if err := c.BindJSON(&req); err != nil { + + log.Printf("failed to bind json: %s\n", err.Error()) + + c.JSON(http.StatusBadRequest, resp) + + return + } + + resp.Data = req.Data + + c.JSON(http.StatusOK, resp) + +} + +func createServer() *gin.Engine { + + genserver := gin.Default() + + store := sessions.NewCookieStore([]byte("SOLIAGAIN")) + + genserver.Use(sessions.Sessions("SOLIAGAIN", store)) + + // genserver.LoadHTMLGlob("view/**/*") + + // genserver.Static("/public", "./public") + + genserver.POST("/hello", handlePostHello) + + return genserver + +} + +func main() { + + e := createServer() + + e.RunTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key") + +} diff --git a/0xetc/0xgo/http2/Makefile b/0xetc/0xgo/http2/Makefile new file mode 100644 index 0000000..804008c --- /dev/null +++ b/0xetc/0xgo/http2/Makefile @@ -0,0 +1,9 @@ +all: + + go build -o client/client.out ./client + + go build -o server/server.out ./server + + + + diff --git a/0xetc/0xgo/http2/certgen.sh b/0xetc/0xgo/http2/certgen.sh new file mode 100755 index 0000000..81dd186 --- /dev/null +++ b/0xetc/0xgo/http2/certgen.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + +mkdir -p ./client/certs + +mkdir -p ./server/certs + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/http2/client/certs/ca.pem b/0xetc/0xgo/http2/client/certs/ca.pem new file mode 100644 index 0000000..6d56e87 --- /dev/null +++ b/0xetc/0xgo/http2/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUMm3y7oQMKrW33ouncVunNZJAqGUwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDFaFw0zNDEwMzEwNzQx +NDFaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnQRtxoldMAoPUKy1JbSX1r3FGTs9nLKidsl8vpFKplWpCvjLRYCAfFlhY +hltMAEYihnsPWJBEqp/UKHMATJeLY/d0iiEdJIntc5O3HGnXgbaH0wB6dvJRpwxR +sW8b4f9cHguQbbNqCk84ZTnX3xPajzAdUlt6eQwGwwI3OIfUJqXPO6X5AuZQlNt/ +stG6ZVCXj8/H0/u5SiEfTT2uW3DKmugoswy9fgNguIFWTOstz1RrW6Oxe0CinAtw +f40VsBG4bwhWlGFHOdVGLBHe/FVv4LFQo9C5pn05H4gxRa/Oly+G0v2+fHwbK/vb +6B2Evxn0IODT6wL+owujdvxztd9f0OjBAiA/0+6wc9AyOvdiOfmqXGoM8vADU1RF +ZFx8ZWCAHs5jbglzvwWzHHyc0y9jijc2y72aEl1jWDJTPXGRQpYD95cgyOlVHnx/ +qSzLpGZmnls40JPUP5fCcyj+mXIV+KF5JO4HV2fTvFme5xZJCjujbXTAn24ELtkN +LTiyx9iOZkXYEa1I+Pvjiv5sNgI8tNwpZAKSgwQJ1Le4eqPzP0YSLrfDbNJdnGFQ +PAZGXzCk3JARM8PPo+/s8T+i0kGMwee2p5rI5593joKTLM6lLO3ou+R34CAFe9Ae +OOkHjWQ93JiONo5EgHCes8RBgzfRn8rmOVRxB0FnxrqvS1tSmwIDAQABo1MwUTAd +BgNVHQ4EFgQUgoQLRoUoITdNuR2EcO1+gCnNHrwwHwYDVR0jBBgwFoAUgoQLRoUo +ITdNuR2EcO1+gCnNHrwwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAFaZv4LRlap5v8chyeme3MOEZh+SexQPcD/E5ZLuYxTT5fDa6oSDz1Sa8zyYj +g5bqOqoGOvUjpY2stdZyQKJOGSLQk+Qs2atAPSz1n+MuyAVh/IgEk13/kA9R6dXc +IBTDDAZT2zwGFfz0K2cL1NlD4KZlC+POhYNWQfaR7vk3hjt3d7kbq2wBPkenVNVu +HA05vYpVhoZ/bZDwR7V5hwDOR6JvPLoe48gBE7AV3F+ZWEnv/E2qum0pTWpmIy0k +wIXES0g4ItVIlHj+BZF8rWPFW155S8yHHCvNw7FY9VJFfoG6JnZokxkUQR/M6L4w +dIrkcmdfL7QPXMecWiX6sFV6MHP/5ulNYi05jwbi+F0yrUIi2m/AmMyFp8LO5jbW +5uGL+9JDuVLFmrdOO9s5zv5upCKwPeZ1XVMlK5w/uS7uJ5+CfrjFooTv/+4RRrvS +udKRwvXz2Q25yo5GiwgSBQCKI56DIlmUyHI9WcxjBvG91Kpj6jkRgcHbtJrDMc+f +LaQEOoSvZQbi0YUP72YDYCspijlJ8QR4g/MM+HNOetOwTNTRlb7wsTURzWDn6VVo +1ZyJS/a9Snd8f24fUXSlpajTbTa+Ya/A7Qzkgk4Ck+CSwCWzyT2EXMQerljdMyhc +6sheDhGn9f5X038dyaewL0in36QhNqKxEwon4TO9VWV5ll4= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/http2/client/certs/ca_priv.pem b/0xetc/0xgo/http2/client/certs/ca_priv.pem new file mode 100644 index 0000000..d0dc859 --- /dev/null +++ b/0xetc/0xgo/http2/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +lIYAoKcwoRG7WlexQm7SRnHWMGGW9Q== +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/http2/client/certs/ca_pub.pem b/0xetc/0xgo/http2/client/certs/ca_pub.pem new file mode 100644 index 0000000..13b36e2 --- /dev/null +++ b/0xetc/0xgo/http2/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp0EbcaJXTAKD1CstSW0l +9a9xRk7PZyyonbJfL6RSqZVqQr4y0WAgHxZYWIZbTABGIoZ7D1iQRKqf1ChzAEyX +i2P3dIohHSSJ7XOTtxxp14G2h9MAenbyUacMUbFvG+H/XB4LkG2zagpPOGU5198T +2o8wHVJbenkMBsMCNziH1Calzzul+QLmUJTbf7LRumVQl4/Px9P7uUohH009rltw +yproKLMMvX4DYLiBVkzrLc9Ua1ujsXtAopwLcH+NFbARuG8IVpRhRznVRiwR3vxV +b+CxUKPQuaZ9OR+IMUWvzpcvhtL9vnx8Gyv72+gdhL8Z9CDg0+sC/qMLo3b8c7Xf +X9DowQIgP9PusHPQMjr3Yjn5qlxqDPLwA1NURWRcfGVggB7OY24Jc78Fsxx8nNMv +Y4o3Nsu9mhJdY1gyUz1xkUKWA/eXIMjpVR58f6ksy6RmZp5bONCT1D+XwnMo/ply +FfiheSTuB1dn07xZnucWSQo7o210wJ9uBC7ZDS04ssfYjmZF2BGtSPj744r+bDYC +PLTcKWQCkoMECdS3uHqj8z9GEi63w2zSXZxhUDwGRl8wpNyQETPDz6Pv7PE/otJB +jMHntqeayOefd46CkyzOpSzt6Lvkd+AgBXvQHjjpB41kPdyYjjaORIBwnrPEQYM3 +0Z/K5jlUcQdBZ8a6r0tbUpsCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/http2/client/main.go b/0xetc/0xgo/http2/client/main.go new file mode 100644 index 0000000..402a613 --- /dev/null +++ b/0xetc/0xgo/http2/client/main.go @@ -0,0 +1,41 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io" + "log" + "net/http" + "os" + + "golang.org/x/net/http2" +) + +func main() { + + certpool := x509.NewCertPool() + + file_b, err := os.ReadFile("certs/ca.pem") + + certpool.AppendCertsFromPEM(file_b) + + tlsConfig := &tls.Config{ + RootCAs: certpool, + } + + transport := &http2.Transport{TLSClientConfig: tlsConfig} + client := &http.Client{Transport: transport} + + resp, err := client.Get("https://localhost:8888/hello") + + if err != nil { + log.Println(err) + return + } + defer resp.Body.Close() + + fmt.Printf("is HTTP2: %v (%s)\n\n", resp.ProtoAtLeast(2, 0), resp.Proto) + + io.Copy(os.Stdout, resp.Body) +} diff --git a/0xetc/0xgo/http2/server/certs/server.csr b/0xetc/0xgo/http2/server/certs/server.csr new file mode 100644 index 0000000..a8ff909 --- /dev/null +++ b/0xetc/0xgo/http2/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv60l4QTOtec1ilSs6vaVGz +iLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldGhrhQmHcpj7uGodZ0SMQU +n228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqtxzEaN1GdnxLjjigG9hAE +k8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH29Ql/NV79cHEFzoWJX831 +EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0ZbjSw5MrkMk7mToJOfnKuHY +NYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDIguCJtvxavM7iY8XFhZj2 +SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUTH1Zgoz8LF0AXN37pl2nq +SwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4dZjvBePK8UUG6F3lltJu0 +DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYSi02RRq0HDn/ApH9uwT+f +L8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7MppHLvfAJdF3SusbDgoU +vZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9n9DQEnIhdNu9jD3bGQhx +Aw8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCOsJn45TZzgno61B+3G6vB3N/2 +ZTfOSDef/HQyc0JVZbR5uoxw/4ac1GV/iDIFKiwBvC8siG5sNb1xvQTHm5MQPuqY +Avs/JCsO9FTfoo9GG8DeobtxC01PV4gNk5/BCtwNhr7ztjltdzA/hosX2b1D4iXC +DCnHm/NlMjohyPFWsleET6H1aGqY4sprunHAvj3nvM5kIHAy347ZKGBkSousGZs9 ++ysgq1N42cpmVMp9TZe4WOdpDrkTxXAxpRZhPnKU1uyPDv5tcI/d7DtNgmdiH4Hm +lwIw27Vkt3x7ZbQDYMbsoKY2wGzNgIjQOHjHS5eQZEtdneH6BDNkRTmkwnXG06q1 +Qdw/MSY667tJyKtdQlBSHWTMcYCSe01amkWPsYH1Ud9L05c0WuKHV2I4nhKAc6vZ +H3RX/Pj2WoWIikr7D6C1w6G47qTieCIh+N85AWEizjnlQKkaf8zzwMoiOJOjB/bQ +DYreYbC9sV9JZDHFzBiuou+WDB0nTkUnRxi4fVac2hU8xcg5hLrbVobSug2yqccv +s+qTgf2rQBcHDtYBS+ORPp6l1uE6bRpe3eUP6e20sjYmv5XPd5tSgoMcCo9IYi3b +9L25fFY9oCLAUjyE7spjknrfBfYUUaZV1u+ssQ/l+1AMWmp2JNEt0kCZnyzTMDtY +bsT3KS3zgcyxrcjwqg== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/http2/server/certs/server.key b/0xetc/0xgo/http2/server/certs/server.key new file mode 100644 index 0000000..5052679 --- /dev/null +++ b/0xetc/0xgo/http2/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +Z73kid71Rbb2DAbXN9OXUmSDNTC1 +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/http2/server/certs/server.pem b/0xetc/0xgo/http2/server/certs/server.pem new file mode 100644 index 0000000..cf3b1aa --- /dev/null +++ b/0xetc/0xgo/http2/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUNiH3wgbZ2sa232ix2HMRSTX/p9YwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDJaFw0yNTExMDIwNzQx +NDJaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKMSN2tksm/BNFgvc81L+tJeEEzrXnNYpUrOr2lRs4i2SUncPBfM +ND9yxssNE/vB8bG/HMksV1/9gcX2lApXRoa4UJh3KY+7hqHWdEjEFJ9tvMSxcb04 +546y9ZiiADfaNqycqLsHExYk6SeJz6MKrccxGjdRnZ8S444oBvYQBJPHdTvFhuCT +JdxtwnqcVd/EF2nIzELnltIKc3q3ekoR9vUJfzVe/XBxBc6FiV/N9RHYSlS9uFY5 +/Nlp92pzcTjv5niE0h/SaP6fFKcO0tGW40sOTK5DJO5k6CTn5yrh2DWMGt8jTYU5 +CoIia7uYi3qSQF2Tety4UXEpj93BrdkAyILgibb8WrzO4mPFxYWY9kmeIlkp/i8X +W+BxAbfZVc5eQLEIe95UktjEcXI6L1Y1Ex9WYKM/CxdAFzd+6Zdp6ksJGiGO3nax +usTFSJ9Jt5oJByZMxduh7KryC9+okosOHWY7wXjyvFFBuhd5ZbSbtA2pGEsf61sJ +gQIA5bmJmp+nmXC/C2av+1RGbe2H1j72EotNkUatBw5/wKR/bsE/ny/Ak21U5tTs +6SJn/z70EI+MiSx9ZKEx3ag38lCgEhEbuzKaRy73wCXRd0rrGw4KFL2d9hQqc5y9 +MjHA7vNe8Fe8uz0E8AF6ePqnqNpKzVgZfZ/Q0BJyIXTbvYw92xkIcQMPAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUI53WKowOvtTqI4Pm +h2Ak+AVURfQwHwYDVR0jBBgwFoAUgoQLRoUoITdNuR2EcO1+gCnNHrwwDQYJKoZI +hvcNAQELBQADggIBABEiS9WRtkMIgEfhwIl2Vrb12BHKcveGs+iJuzNKCEYE40R7 +j3c5FpPZ3X2rxvU/U4TTGCSQ8/ZtjcL/oRM6nVNw4pf3y3CvXsNVHd0QMnLGc2NZ +swkmvE4CKCzmHOTAHVcPefyMC1fG7xf6IzLGH0P36QQw3M6Qcv4462ZGY07iZGwV +qzEBYbOCVL1aawuz3Mu1+3Z/xTRlp3kaNjjkAM4xMvu8kxdfH2iCMu/6ExVwE+vu +qZ6B9sRXvfvoZQsfKlXSnqPMOAVfgbi0iqQmr+s00azI/2G9oVt632KPtRgWFsZx +yNPuiljo8DrhszSkwbZtGV0xkwTatz28scpO97OZfD3NaEdeCsc+oQgGC6ZYgDWD +e+hU4B9e9gnLK5T+uRaklBrFFMXjftP2wOmOWLsu+iizJOU9OGnbQmFJ/zPehUYb +Y4+5XifC0+UkR1/gwCsqb1VKRtqP2frLmyqe+3XXKHUDPcLE1OPmghMemc88UuxR +sAClRxD24xjasPf0CJHRlq9rpWnqHxdVWqcKt5eVzao+42xK0o9hYmfMtzbaFJ1O +UperlRXOfPHfDXhoEuOjmiVzz7pf3JtsVUjt01/3pl6oUZjvnDJGm5B7ipqvHYUV +FRlIf7ltL/wvHAxYzlploypqr8oQN9fadIQ3IfdtqhM+0EMRyMRqKHQVspdq +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/http2/server/certs/server.pub b/0xetc/0xgo/http2/server/certs/server.pub new file mode 100644 index 0000000..6889ab0 --- /dev/null +++ b/0xetc/0xgo/http2/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv6 +0l4QTOtec1ilSs6vaVGziLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldG +hrhQmHcpj7uGodZ0SMQUn228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqt +xzEaN1GdnxLjjigG9hAEk8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH2 +9Ql/NV79cHEFzoWJX831EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0Zbj +Sw5MrkMk7mToJOfnKuHYNYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDI +guCJtvxavM7iY8XFhZj2SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUT +H1Zgoz8LF0AXN37pl2nqSwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4d +ZjvBePK8UUG6F3lltJu0DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYS +i02RRq0HDn/ApH9uwT+fL8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7 +MppHLvfAJdF3SusbDgoUvZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9 +n9DQEnIhdNu9jD3bGQhxAw8CAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/http2/server/main.go b/0xetc/0xgo/http2/server/main.go new file mode 100644 index 0000000..5dde53d --- /dev/null +++ b/0xetc/0xgo/http2/server/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "log" + "net/http" + + "golang.org/x/net/http2" +) + +func helloHandler(w http.ResponseWriter, r *http.Request) { + + w.Write([]byte("hello")) +} + +func main() { + + http.HandleFunc("/hello", helloHandler) + + var srv http.Server + srv.Addr = "0.0.0.0:8888" + http2.ConfigureServer(&srv, &http2.Server{}) + + err := srv.ListenAndServeTLS("certs/server.pem", "certs/server.key") + if err != nil { + log.Fatal("ListenAndServe: ", err) + } +} diff --git a/0xetc/0xgo/http3/Makefile b/0xetc/0xgo/http3/Makefile new file mode 100644 index 0000000..804008c --- /dev/null +++ b/0xetc/0xgo/http3/Makefile @@ -0,0 +1,9 @@ +all: + + go build -o client/client.out ./client + + go build -o server/server.out ./server + + + + diff --git a/0xetc/0xgo/http3/certgen.sh b/0xetc/0xgo/http3/certgen.sh new file mode 100755 index 0000000..bdb69b5 --- /dev/null +++ b/0xetc/0xgo/http3/certgen.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + + +mkdir -p ./client/certs + +mkdir -p ./server/certs + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/http3/client/certs/ca.pem b/0xetc/0xgo/http3/client/certs/ca.pem new file mode 100644 index 0000000..f889c44 --- /dev/null +++ b/0xetc/0xgo/http3/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUS2Xr3/K1AiMYppcYEqVyQ8BB39IwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzJaFw0zNDA1MDEwNzI1 +MzJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDCdLeyc2+abS9AcrDwlqyVAuACxnVsR14+P77krZobHCcXOTtNF3YHB4f9 +3hpXRMaQiLlO8ZxtFXbw8IPT+x0vZ+imFA+IqWT7/J9hXIU6QIdO+MXAG4DwzvVL +krCuVypp+Gvu7/V00hPJIne/w8lCKp86BPm4LsJE3pVf7RuMgJa7bzt1p/bvzOlZ +7yMSE4hp8fyoiHUSedjA4VO2ycg3kDnts9Ldqg4GguwGQ5QDfAluDymwoLwpPwAs +sDyDObmsdo/clGVWT6MUsjwm8j76Of3FZ5yu6yywXqSsSXybNYpAkw/a0wapH31d +ONZ6qAvdmcJYaZJoQReJXkfaJtGRNV5I7NbZeoAekSJK40nM/vG2LWAcJJo2G6uV +aRbhB7AkN59zTduLFn06VmEJuWNcOyOWwcWZ8Fbp8TlV4kELXO/MX0wTkwpAHj9E +WxOOH5qmncyHOESyzou1wbMpyEOSSA0J8ySoBZob06hVqbtJoDj/uiGg1SIcy14s +gofdKJ++NwK6e1ZGoy5b6S4X/JgNnbdq4gS0M3A3KAGYA6PeU1ymS22YdXqTtatf +NVm1jaAGGkMyOZm6W92YKZdzQksMHLuLz2CkS4BuF9CFowrDNMCgk/CUsi4BFp27 +zvqXYWCIYOhS4BUZTuscAQpeI/Oo9BcCtZSgb0CqcpVGf+efVQIDAQABo1MwUTAd +BgNVHQ4EFgQUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wHwYDVR0jBBgwFoAUFQ+swYvY +beIM6DFpxjVYVJ0G4G0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEANqPpKGUIxjCuKEjDeCo8iQVg/VQSsbyygmh4S3oX92rtxfL0STbyGHcN2uOo +V2x6NAoZJS96Pr782e99TYbEmMDSowFeWQKslytJJgR00XkiCXRC49Rev62LkJe/ +tb30i9TmbEFNzGYhcIqU0kmLr/gP0uZmWthBU2D2XKErNTsEYMsQGGVDbK0xblC2 +dSda/XoBG9FRSpalG30PZkg1adBCJgIUa5uxKqc6Ik/zx3yZjVI7R15cdNASH8Po +4B3LASd2b+zSZNIiG94rxCv3K86xtpEncvfDNRZckZZ+5OxDlu0++W6bqCKIJAvQ +XzIjoypEzfosBPgS49J42KSC4dE+o3rRZmNICuyxJETCOcDIPWjHlifR45p8Ugjn +sCduQgk/6068QIQVwEJ3/lM4c/b2J2nFEVDa3+cpJLwgLpajUdMm9tgqcA3Vv5ce +xRYE1qJo09MPKG6/uq09K0q4yIDK6Oma4RMBjcLciUQA82AyNcHN31YbkASxCyeV +N4ySr3fM975o5JOPhHV7N/6xBWrUOS2eaOOridiMyzLl4/06Hg0y5b3mP6L3LlgK +QY32Ar0cEHJJRNCoyUgy5g1tkiDcw6H7DG+GL9kVXed6N3A5wReVal/1/5ulhEiv +A8N3rQrka2ccM7EMTzEEJwA3Dt9OWsl85OJz2RI3RN9oQBk= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/http3/client/certs/ca_priv.pem b/0xetc/0xgo/http3/client/certs/ca_priv.pem new file mode 100644 index 0000000..e576be0 --- /dev/null +++ b/0xetc/0xgo/http3/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +6vyNiA+8sZAEJEQ9JfzRZ+simU+0Nw== +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/http3/client/certs/ca_pub.pem b/0xetc/0xgo/http3/client/certs/ca_pub.pem new file mode 100644 index 0000000..1bd892d --- /dev/null +++ b/0xetc/0xgo/http3/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnS3snNvmm0vQHKw8Jas +lQLgAsZ1bEdePj++5K2aGxwnFzk7TRd2BweH/d4aV0TGkIi5TvGcbRV28PCD0/sd +L2fophQPiKlk+/yfYVyFOkCHTvjFwBuA8M71S5Kwrlcqafhr7u/1dNITySJ3v8PJ +QiqfOgT5uC7CRN6VX+0bjICWu287daf278zpWe8jEhOIafH8qIh1EnnYwOFTtsnI +N5A57bPS3aoOBoLsBkOUA3wJbg8psKC8KT8ALLA8gzm5rHaP3JRlVk+jFLI8JvI+ ++jn9xWecrusssF6krEl8mzWKQJMP2tMGqR99XTjWeqgL3ZnCWGmSaEEXiV5H2ibR +kTVeSOzW2XqAHpEiSuNJzP7xti1gHCSaNhurlWkW4QewJDefc03bixZ9OlZhCblj +XDsjlsHFmfBW6fE5VeJBC1zvzF9ME5MKQB4/RFsTjh+app3MhzhEss6LtcGzKchD +kkgNCfMkqAWaG9OoVam7SaA4/7ohoNUiHMteLIKH3SifvjcCuntWRqMuW+kuF/yY +DZ23auIEtDNwNygBmAOj3lNcpkttmHV6k7WrXzVZtY2gBhpDMjmZulvdmCmXc0JL +DBy7i89gpEuAbhfQhaMKwzTAoJPwlLIuARadu876l2FgiGDoUuAVGU7rHAEKXiPz +qPQXArWUoG9AqnKVRn/nn1UCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/http3/client/main.go b/0xetc/0xgo/http3/client/main.go new file mode 100644 index 0000000..d4f31b3 --- /dev/null +++ b/0xetc/0xgo/http3/client/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "bytes" + "crypto/tls" + "crypto/x509" + "flag" + "io" + "log" + "net/http" + "os" + "sync" + + "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/http3" +) + +func main() { + quiet := flag.Bool("q", false, "don't print the data") + keyLogFile := flag.String("keylog", "", "key log file") + insecure := flag.Bool("insecure", false, "skip certificate verification") + flag.Parse() + urls := flag.Args() + + var keyLog io.Writer + if len(*keyLogFile) > 0 { + f, err := os.Create(*keyLogFile) + if err != nil { + log.Fatal(err) + } + defer f.Close() + keyLog = f + } + + caCert, err := os.ReadFile("certs/ca.pem") + if err != nil { + log.Fatalf("Reading server certificate: %s", err) + } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + roundTripper := &http3.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: caCertPool, + InsecureSkipVerify: *insecure, + KeyLogWriter: keyLog, + }, + QUICConfig: &quic.Config{}, + } + defer roundTripper.Close() + hclient := &http.Client{ + Transport: roundTripper, + } + + var wg sync.WaitGroup + wg.Add(len(urls)) + for _, addr := range urls { + log.Printf("GET %s", addr) + go func(addr string) { + rsp, err := hclient.Get(addr) + if err != nil { + log.Fatal(err) + } + log.Printf("Got response for %s: %#v", addr, rsp) + + body := &bytes.Buffer{} + _, err = io.Copy(body, rsp.Body) + if err != nil { + log.Fatal(err) + } + if *quiet { + log.Printf("Response Body: %d bytes", body.Len()) + } else { + log.Printf("Response Body (%d bytes):\n%s", body.Len(), body.Bytes()) + } + wg.Done() + }(addr) + } + wg.Wait() +} diff --git a/0xetc/0xgo/http3/server/certs/server.csr b/0xetc/0xgo/http3/server/certs/server.csr new file mode 100644 index 0000000..fb291c1 --- /dev/null +++ b/0xetc/0xgo/http3/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8POhrlqlIty5j6i95GfCA +4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUkNBLHwbh5fZzMxXpzZ6EG +9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMdzdcU7/eGKnYrl2KWSNCh +ZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TTozbuiABSTBt71+7AXnPfmA +YkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7+FEpSz40gEkZQAMOuUTL +4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGTYKEI9hfLP3nHHQhUfb6N +VHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6amR2fOQ/PBty3eFspxF7HL +NUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuNjdbXviouRZWP4JnCs9wU +k7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSmV5QW6Rb2DJ/XI+NLKsIe +FeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9AZOJBF5pKHAalf+vFzCp +5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaYiRMKasWFslUm74wOgPA1 +KIMCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQAeMrdaO0OS1FN3qLOkWdk7lLQs +1OYh5sQ81N6HMRO7yCLdIgZrK25i/w5RLb/amKGg2IUBW/5TmuGGfcn44g4MnKcw +MYAaEov72v4bSLtchMC3adcJq29+achKJsC9rBhKTN0wOCgpQqJIz6Vy+uYdKlcP +N4WrE9LmavmDLHcBDlV1BohYobzvl/VrLLlm46NmCwlAyyxwa1kF5Pcb6pmEY2qd +J/EeQjIx3GRZECibanWqvefHcLsDHcfHnbPxA4/W/8F1qzkcH5NKeyENXbluK5cL +Bo+FS9Zshn0/lOuj6DZcnYRGFh9HNrikG53ktZe256Q8AM9X1O1nOItFtjHBs5/F +lO6kcoOxDL3CCqr0ykF8pnQ4geeQq6T0Im6n8kQP8+OH+0MSES79HlZsp6fQk5E5 +uFMkHLEPdvi4GOmWM9tANb3oaeL73a+wytAkAwLccnzxuHnZAiORQeLWk6nrU/sP +Uq8yjsn0EgUmyHghlCghFprz8KTd8jzEI+MVgyIjCDGzhNnzoEvcnlMUnEyz84Ag +CxPE5rbgv7VvBcPFsDLRExYsCsHTsbRioOe/U6ol/avApwI0Cu8VjGK6nDGh2RSH +wDrBMX/m9Kh1D3vDfhUhstloWKcvPUFsJlUQea0H2P2SrYdLxYNFvFplbvwOtMw6 ++NPTjzkgsbvjgtvw8Q== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/http3/server/certs/server.key b/0xetc/0xgo/http3/server/certs/server.key new file mode 100644 index 0000000..7eddacd --- /dev/null +++ b/0xetc/0xgo/http3/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +KLkG/qJU5C3Mvjes7O8jYjmCjxfL +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/http3/server/certs/server.pem b/0xetc/0xgo/http3/server/certs/server.pem new file mode 100644 index 0000000..04fa24c --- /dev/null +++ b/0xetc/0xgo/http3/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUQr1JK18kJWCKyu7WBogsB5gZGIEwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzRaFw0yNTA1MDMwNzI1 +MzRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANEhSmjAZyDOjtA48/ac/Dzoa5apSLcuY+oveRnwgOG8wKnIreLo +CeTRQJojX4Sw07Z0to9JDXgWLC46+XTlJDQSx8G4eX2czMV6c2ehBvfgAGmBJsFd +747MsWVN+FmPRNhJoEnWnZCGf095tK4THc3XFO/3hip2K5dilkjQoWYDjoIN2xJT +qmoZMujErX7NK3UQbwk+B8xs/Q3BP006M27ogAUkwbe9fuwF5z35gGJAFU/V4g3b +t8iFxewCld0WOiYxz0YI9reQN/oxwTVye/hRKUs+NIBJGUADDrlEy+MroC8XZ6ib +fb4tZ6MlU4O6dxawQsxbmMG8EBaIpvlhk2ChCPYXyz95xx0IVH2+jVR4SodRM8WC +LXOE+8RQM58zVhFsZS9nbomGX8KnrLempkdnzkPzwbct3hbKcRexyzVKQuT7l8tq +fGQT14nluKXNTvG1Uyoapy+UBN3NyqRbjY3W174qLkWVj+CZwrPcFJO7hBfysrC6 +nzEhhq5RgPWEAP0h/r+4jkeiTImKQBI0pleUFukW9gyf1yPjSyrCHhXl9lV8Bc6x +n59szCMxhLJuQF62N0rJMS3JLekEg8OSPQGTiQReaShwGpX/rxcwqeXJJzy8B3ei +qyooyHIaW/a/eqxbUMOqwhSHz4+rAAi2mIkTCmrFhbJVJu+MDoDwNSiDAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUztOHY4D+a1LHqT5U +Jy6DVw4m3pwwHwYDVR0jBBgwFoAUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wDQYJKoZI +hvcNAQELBQADggIBAG/VaN8jCvcBuuo5tqgMgV1Ss8P/Arm63xhJ5nGNdiK+SbKC +BPB9ihqO+sXCUpV3/m2e83IdfRi7FZeJVwfBxQttjYeEwvp4M8ffzKucj9h1mxcG +T0AamVMPnEWKUtoh98r1cpbh8FvMtUpwuL1MMEYxN4TmJIG1X5Hj17h5M7bdEP7g +mumAs+CN4BQX4EQkBDQHlj/qjh9yaWL80XsvBJyhqFPYU1Mqd34mqzp1YR4bkQCn +x5LF3bIB36zOSP2tgJGOhu32bZCCyBAduH7jWtpfr7UXnp3k7xPl79yPkJ9ZDmn6 +lSaXUOWdKMiQJSi65H+LR4StfKUj7D/iyz21nhh6NNUwO94DOqDmJTSH00kONkIO +xvcMlt13YXZMvgLxzu4JKR9Cm3g3E7HicskKRzLeSmWH2K3jKMPivDJinwDI1Z8C +/i1G/10/eUT6USrvXrtVyxsVxWgND20PRJDnbh5018+4k+92b6O4CUhjf3EJwMsH +00U7XNyLRxIVXoCjM4q3ORKHDm5cKBtckCtpQj/9gVuQfOeJqJaZrb4etfGKappM +OtNg1tVpJb2oYBmgB2EBu5LnjsQIyUEzi1iEUEiMSjMMnHXk6iwVtkYcZDwJ2oXN +cdmRl9zwqxGVL8+jYMTClBEoObSF9WfR63mOpLd9/ABmCZtw1ixnWN4Q0ODp +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/http3/server/certs/server.pub b/0xetc/0xgo/http3/server/certs/server.pub new file mode 100644 index 0000000..09ec88f --- /dev/null +++ b/0xetc/0xgo/http3/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8 +POhrlqlIty5j6i95GfCA4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUk +NBLHwbh5fZzMxXpzZ6EG9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMd +zdcU7/eGKnYrl2KWSNChZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TToz +buiABSTBt71+7AXnPfmAYkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7 ++FEpSz40gEkZQAMOuUTL4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGT +YKEI9hfLP3nHHQhUfb6NVHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6am +R2fOQ/PBty3eFspxF7HLNUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuN +jdbXviouRZWP4JnCs9wUk7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSm +V5QW6Rb2DJ/XI+NLKsIeFeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9 +AZOJBF5pKHAalf+vFzCp5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaY +iRMKasWFslUm74wOgPA1KIMCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/http3/server/main.go b/0xetc/0xgo/http3/server/main.go new file mode 100644 index 0000000..9e30d7e --- /dev/null +++ b/0xetc/0xgo/http3/server/main.go @@ -0,0 +1,184 @@ +package main + +import ( + "crypto/md5" + "errors" + "flag" + "fmt" + "io" + "log" + "mime/multipart" + "net/http" + "strconv" + "strings" + "sync" + + _ "net/http/pprof" + + "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/http3" +) + +type binds []string + +func (b binds) String() string { + return strings.Join(b, ",") +} + +func (b *binds) Set(v string) error { + *b = strings.Split(v, ",") + return nil +} + +// Size is needed by the /demo/upload handler to determine the size of the uploaded file +type Size interface { + Size() int64 +} + +// See https://en.wikipedia.org/wiki/Lehmer_random_number_generator +func generatePRData(l int) []byte { + res := make([]byte, l) + seed := uint64(1) + for i := 0; i < l; i++ { + seed = seed * 48271 % 2147483647 + res[i] = byte(seed) + } + return res +} + +func setupHandler(www string) http.Handler { + mux := http.NewServeMux() + + if len(www) > 0 { + mux.Handle("/", http.FileServer(http.Dir(www))) + } else { + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Printf("%#v\n", r) + const maxSize = 1 << 30 // 1 GB + num, err := strconv.ParseInt(strings.ReplaceAll(r.RequestURI, "/", ""), 10, 64) + if err != nil || num <= 0 || num > maxSize { + w.WriteHeader(400) + return + } + w.Write(generatePRData(int(num))) + }) + } + + mux.HandleFunc("/demo/tile", func(w http.ResponseWriter, r *http.Request) { + // Small 40x40 png + w.Write([]byte{ + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, + 0x01, 0x03, 0x00, 0x00, 0x00, 0xb6, 0x30, 0x2a, 0x2e, 0x00, 0x00, 0x00, + 0x03, 0x50, 0x4c, 0x54, 0x45, 0x5a, 0xc3, 0x5a, 0xad, 0x38, 0xaa, 0xdb, + 0x00, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0x63, 0x18, + 0x61, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xe2, 0xb8, 0x75, 0x22, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, + }) + }) + + mux.HandleFunc("/demo/tiles", func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "") + for i := 0; i < 200; i++ { + fmt.Fprintf(w, ``, i) + } + io.WriteString(w, "") + }) + + mux.HandleFunc("/demo/echo", func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + fmt.Printf("error reading body while handling /echo: %s\n", err.Error()) + } + w.Write(body) + }) + + // accept file uploads and return the MD5 of the uploaded file + // maximum accepted file size is 1 GB + mux.HandleFunc("/demo/upload", func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost { + err := r.ParseMultipartForm(1 << 30) // 1 GB + if err == nil { + var file multipart.File + file, _, err = r.FormFile("uploadfile") + if err == nil { + var size int64 + if sizeInterface, ok := file.(Size); ok { + size = sizeInterface.Size() + b := make([]byte, size) + file.Read(b) + md5 := md5.Sum(b) + fmt.Fprintf(w, "%x", md5) + return + } + err = errors.New("couldn't get uploaded file size") + } + } + log.Printf("Error receiving upload: %#v", err) + } + io.WriteString(w, `
+
+ +
`) + }) + + return mux +} + +func main() { + // defer profile.Start().Stop() + go func() { + log.Println(http.ListenAndServe("localhost:6060", nil)) + }() + // runtime.SetBlockProfileRate(1) + + bs := binds{} + flag.Var(&bs, "bind", "bind to") + www := flag.String("www", "", "www data") + tcp := flag.Bool("tcp", false, "also listen on TCP") + key := flag.String("key", "", "TLS key (requires -cert option)") + cert := flag.String("cert", "", "TLS certificate (requires -key option)") + flag.Parse() + + if len(bs) == 0 { + bs = binds{"localhost:6121"} + } + + handler := setupHandler(*www) + + var wg sync.WaitGroup + wg.Add(len(bs)) + var certFile, keyFile string + if *key != "" && *cert != "" { + keyFile = *key + certFile = *cert + } else { + + certFile = "certs/server.pem" + + keyFile = "certs/server.key" + + } + for _, b := range bs { + fmt.Println("listening on", b) + bCap := b + go func() { + var err error + if *tcp { + err = http3.ListenAndServeQUIC(bCap, certFile, keyFile, handler) + } else { + server := http3.Server{ + Handler: handler, + Addr: bCap, + QUICConfig: &quic.Config{}, + } + err = server.ListenAndServeTLS(certFile, keyFile) + } + if err != nil { + fmt.Println(err) + } + wg.Done() + }() + } + wg.Wait() +} diff --git a/0xetc/0xgo/mysql-query/.gitignore b/0xetc/0xgo/mysql-query/.gitignore new file mode 100644 index 0000000..c8691c4 --- /dev/null +++ b/0xetc/0xgo/mysql-query/.gitignore @@ -0,0 +1 @@ +.data \ No newline at end of file diff --git a/0xetc/0xgo/mysql-query/Dockerfile b/0xetc/0xgo/mysql-query/Dockerfile new file mode 100644 index 0000000..aab7eb5 --- /dev/null +++ b/0xetc/0xgo/mysql-query/Dockerfile @@ -0,0 +1,9 @@ +FROM mysql:8 + +ENV MYSQL_ROOT_PASSWORD universalpassword +ENV MYSQL_HOST localhost +ENV MYSQL_TCP_PORT 3306 + +EXPOSE 3306 + +ADD ./init.sql /docker-entrypoint-initdb.d \ No newline at end of file diff --git a/0xetc/0xgo/mysql-query/core/modules.go b/0xetc/0xgo/mysql-query/core/modules.go new file mode 100644 index 0000000..e060159 --- /dev/null +++ b/0xetc/0xgo/mysql-query/core/modules.go @@ -0,0 +1,67 @@ +package core + +import ( + "database/sql" + "fmt" + "time" + + _ "github.com/go-sql-driver/mysql" +) + +var DB *sql.DB + +func DbEstablish(db_id string, db_pw string, db_addr string, db_name string) error { + + var err error + + db_info := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", db_id, db_pw, db_addr, db_name) + + DB, err = sql.Open("mysql", db_info) + + if err != nil { + + return fmt.Errorf("failed to open db: %s", err.Error()) + } + + DB.SetConnMaxLifetime(time.Second * 10) + DB.SetConnMaxIdleTime(time.Second * 5) + DB.SetMaxOpenConns(10) + DB.SetMaxIdleConns(10) + + return nil +} + +func DbQuery(query string, args []any) (*sql.Rows, error) { + + var empty_row *sql.Rows + + results, err := DB.Query(query, args[0:]...) + + if err != nil { + + return empty_row, fmt.Errorf("db query: %s", err.Error()) + + } + + return results, err + +} + +func DbExec(query string, args []any) error { + + result, err := DB.Exec(query, args[0:]...) + + if err != nil { + return fmt.Errorf("db exec: %s", err.Error()) + } + + _, err = result.RowsAffected() + + if err != nil { + + return fmt.Errorf("db exec: rows: %s", err.Error()) + } + + return nil + +} diff --git a/0xetc/0xgo/mysql-query/docker-compose.yaml b/0xetc/0xgo/mysql-query/docker-compose.yaml new file mode 100644 index 0000000..53a5951 --- /dev/null +++ b/0xetc/0xgo/mysql-query/docker-compose.yaml @@ -0,0 +1,12 @@ +version: "3" + +services: + + mysql-db: + build: . + container_name: mysql-db + ports: + - "3306:3306" + volumes: + - ./.data:/var/lib/mysql + \ No newline at end of file diff --git a/0xetc/0xgo/mysql-query/init.sql b/0xetc/0xgo/mysql-query/init.sql new file mode 100644 index 0000000..2effb03 --- /dev/null +++ b/0xetc/0xgo/mysql-query/init.sql @@ -0,0 +1,32 @@ +CREATE USER 'mysqldb'@'%' IDENTIFIED BY 'universalpassword'; + +GRANT ALL PRIVILEGES ON *.* TO 'mysqldb'@'%'; + +CREATE DATABASE mysqldb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE mysqldb; + + +CREATE TABLE user ( + + user_id INT NOT NULL AUTO_INCREMENT, + user_name VARCHAR(128), + user_pass TEXT, + PRIMARY KEY (user_id) + +); + + + +INSERT INTO + user ( + user_name, + user_pass + ) + VALUES ( + + "test1", + "test1pw" + ); + +COMMIT; \ No newline at end of file diff --git a/0xetc/0xgo/mysql-query/main.go b/0xetc/0xgo/mysql-query/main.go new file mode 100644 index 0000000..dec593c --- /dev/null +++ b/0xetc/0xgo/mysql-query/main.go @@ -0,0 +1,263 @@ +package main + +import ( + "fmt" + "log" + + pkgdbquery "github.com/seantywork/go/mysql-query/core" +) + +type DB_User struct { + UserId int `json:"user_id"` + UserName string `json:"user_name"` + UserPass string `json:"user_pass"` +} + +func GetUsers() ([]DB_User, error) { + + var dbuser_records []DB_User + + q := ` + + SELECT + user_id, + user_name, + user_pass + FROM + user + + ` + + a := []any{} + + res, err := pkgdbquery.DbQuery(q, a) + + if err != nil { + + return nil, fmt.Errorf("failed to get user: %s", err.Error()) + + } + + defer res.Close() + + for res.Next() { + + dbuser := DB_User{} + + err = res.Scan( + &dbuser.UserId, + &dbuser.UserName, + &dbuser.UserPass, + ) + + if err != nil { + + return nil, fmt.Errorf("failed to get user: row: %s", err.Error()) + } + + dbuser_records = append(dbuser_records, dbuser) + } + + return dbuser_records, nil + +} + +func GetUserByName(name string) (*DB_User, error) { + + var dbuser_records []DB_User + + var dbuser DB_User + + q := ` + + SELECT + user_id, + user_pass + FROM + user + WHERE + user_name = ? + + ` + + a := []any{ + name, + } + + res, err := pkgdbquery.DbQuery(q, a) + + if err != nil { + + return nil, fmt.Errorf("failed to get user: %s", err.Error()) + + } + + defer res.Close() + + for res.Next() { + + dbuser := DB_User{} + + err = res.Scan( + &dbuser.UserId, + &dbuser.UserPass, + ) + + if err != nil { + + return nil, fmt.Errorf("failed to get user: row: %s", err.Error()) + } + + dbuser_records = append(dbuser_records, dbuser) + } + + rlen := len(dbuser_records) + + if rlen != 1 { + return nil, nil + } + + dbuser = dbuser_records[0] + + return &dbuser, nil +} + +func SetUser(name string, pass string) error { + + check, err := GetUserByName(name) + + if err != nil { + + return fmt.Errorf("set user: %s", err.Error()) + } + + var q string + + a := make([]any, 0) + + if check != nil { + + log.Printf("user: %s: already exists: overriding\n", name) + + q = ` + + UPDATE + user + SET + user_pass = ? + WHERE + user_id = ? + + + ` + + a = append(a, pass) + + a = append(a, check.UserId) + + } else { + + log.Printf("user: %s: doesn't exist: create\n", name) + + q = ` + + INSERT INTO + user( + user_name, + user_pass + ) + VALUES( + ?, + ? + ) + + + ` + + a = append(a, name) + a = append(a, pass) + } + + err = pkgdbquery.DbExec(q, a) + + if err != nil { + return fmt.Errorf("failed to set user: %s", err.Error()) + } + + return nil +} + +func run() error { + + err := pkgdbquery.DbEstablish( + "mysqldb", + "universalpassword", + "localhost:3306", + "mysqldb", + ) + + if err != nil { + + return fmt.Errorf("failed to establish db conn: %s", err.Error()) + } + + urecall, err := GetUsers() + + if err != nil { + + return fmt.Errorf("failed to get all users: %s\n", err.Error()) + + } + + ulen := len(urecall) + + for i := 0; i < ulen; i++ { + + fmt.Printf("user: %d ===================\n", i) + fmt.Printf("id : %d\n", urecall[i].UserId) + fmt.Printf("name : %s\n", urecall[i].UserName) + fmt.Printf("pw : %s\n", urecall[i].UserPass) + fmt.Printf("=============================\n") + + } + + newuser := "test2" + newpw := "test2pw" + + err = SetUser(newuser, newpw) + + if err != nil { + return fmt.Errorf("failed to set new user: %s", err.Error()) + } + + urecall2, err := GetUsers() + + if err != nil { + + return fmt.Errorf("failed to get all users 2: %s\n", err.Error()) + + } + + ulen2 := len(urecall2) + + for i := 0; i < ulen2; i++ { + + fmt.Printf("user: %d ===================\n", i) + fmt.Printf("id : %d\n", urecall2[i].UserId) + fmt.Printf("name : %s\n", urecall2[i].UserName) + fmt.Printf("pw : %s\n", urecall2[i].UserPass) + fmt.Printf("=============================\n") + + } + + return nil +} + +func main() { + + if err := run(); err != nil { + + log.Fatal(err) + } + +} diff --git a/0xetc/0xgo/sock-tcp-async/certgen.sh b/0xetc/0xgo/sock-tcp-async/certgen.sh new file mode 100755 index 0000000..493976f --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/certgen.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca.pem b/0xetc/0xgo/sock-tcp-async/client/certs/ca.pem new file mode 100644 index 0000000..06e44c9 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUffjPF3nZtca+YmxkhFpPSg8+8r8wDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0zNTAyMDYxMTQx +MDBaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCrNVWpVf4qCCS+PHmRPTRA7EnAfgYwTQ0tUYtirsrPipbrlPX5zLF2vfTO +lJqzvDB0xnGC5pYAFeh6PRsar6HmkG5z46QZJeukybDIvcRBpHKn3Wg1xJ/Bswpe +76UbzNYmvnhkAeJgtptMXq0aGrn/us9f1jKX3EFNjipH2+c11XshVUNtPKT5XSqg +oveReVgBhJU8Vl/1qGvQdyI/CsT4C1BJ4r148J580Hg5BVla1fg610NPwjvWvT9q +rikjR1BPfzRrwiEgUoewLuZqDNeOXyeZCBhxWo5ugXqsMFSoBnUc4UYzTKPSVZXL +ceXXiHkk+EF7KdD4ZugLzO3StrH7EngO25iXNsJoKB3JBs/cgpNybS7HhP96VRBi +VCuhQJnqtmRVNnHMYR42RI0dxDlCewX16w2jM+XgEQ9YWwTE3gZp8+q1aKCFM/3c +F0TnHyWB5ENE0vjIJjHBLcKz6e4baYBTiPWq1TjBtRLKEOGHJhnxuLCRwNe3IDJI +1pCQhorr1/WFEDTrq5axbsNZUVnl7CeskojMsHEGYDVhTYMbBwscRqRPVd+C9XFi +AsfyHJb5QwwEMxzkwt5JyJvSEY483FwvQkiI8YDGydgdUPCOmYkEMahS7+QfHhwu +Ybnnn0xBHwcE6BQ8LjYLeMhP3hfyI5NJpRnhpVkIefRZm2untwIDAQABo1MwUTAd +BgNVHQ4EFgQUNTLhikFTfYlRZvi7OXJDrw0apSIwHwYDVR0jBBgwFoAUNTLhikFT +fYlRZvi7OXJDrw0apSIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAD6wBsPD4U4BJWKpUv56gfqqqhZ319u3aWy/+GDoV6ZQjDRGuwvxvzWGXbpI8 +kJA4ZWK3TNXb+h+z06ivY3oLRKuIEQs/vS7mwzv8EAf+4JVs/nvW3+dhbFW1u1FL +5OoV5al+w4TyO50T8QejmSiYJkgfe0x2uDf2PP8tcmlv0LoHjHOJ+HA4X5eUvZOQ +ehe9z4VOsflRv14eGuEYofy4+7YHzXbHVEvBIUqcnNxs99eLzZN3P2N7r0a3PazK +eeUPbx8TBbwHGWAHJFkYgOGpUQQ61ejHTwAWctc8rlNd0uLFnPRzAlSuwFK/ezZa +do8RE2B4fguyJup+DVwYW7mvbX3FlFrNSnH/sdo6dqGiqgxfCygKxG4GHdLVw1p6 +S+qwQjZYCtgl9dzVoXs5SBknSq1fUxS1WLzoseTpAy37O5ppXyqNUogl45FB/lSb +p4fZpHXaQ3hrtCR81UbRR2plUYx56GPZLi80MhOeFm2xJ+O82jkv8YGH11ePV+JO +AXyA3NX25DoTWIRbHOcNubaYCDQIIscNTuwQLYQgNqvHe5f+/coV8npOafCchY0j +pB0jfIZ09tNENLkqtvJ5tNQKMe9EFzL5ctynst383UdjDz8rDa6ZB9tVoicF3dW0 +xyC+qGlBpJE7W+Bs6VCFdXKuzqqewIvoTs0mka5jTEfXV0I= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca.srl b/0xetc/0xgo/sock-tcp-async/client/certs/ca.srl new file mode 100644 index 0000000..7ff6484 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/client/certs/ca.srl @@ -0,0 +1 @@ +24A3A8C4B775B0724F02BB952BB38A54EE85CCC6 diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca_priv.pem b/0xetc/0xgo/sock-tcp-async/client/certs/ca_priv.pem new file mode 100644 index 0000000..e371c5e --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +HvhSKWc8Lsus1sPYi7BXTC2qJhPn5esv +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/sock-tcp-async/client/certs/ca_pub.pem b/0xetc/0xgo/sock-tcp-async/client/certs/ca_pub.pem new file mode 100644 index 0000000..1f2732c --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqzVVqVX+Kggkvjx5kT00 +QOxJwH4GME0NLVGLYq7Kz4qW65T1+cyxdr30zpSas7wwdMZxguaWABXoej0bGq+h +5pBuc+OkGSXrpMmwyL3EQaRyp91oNcSfwbMKXu+lG8zWJr54ZAHiYLabTF6tGhq5 +/7rPX9Yyl9xBTY4qR9vnNdV7IVVDbTyk+V0qoKL3kXlYAYSVPFZf9ahr0HciPwrE ++AtQSeK9ePCefNB4OQVZWtX4OtdDT8I71r0/aq4pI0dQT380a8IhIFKHsC7magzX +jl8nmQgYcVqOboF6rDBUqAZ1HOFGM0yj0lWVy3Hl14h5JPhBeynQ+GboC8zt0rax ++xJ4DtuYlzbCaCgdyQbP3IKTcm0ux4T/elUQYlQroUCZ6rZkVTZxzGEeNkSNHcQ5 +QnsF9esNozPl4BEPWFsExN4GafPqtWighTP93BdE5x8lgeRDRNL4yCYxwS3Cs+nu +G2mAU4j1qtU4wbUSyhDhhyYZ8biwkcDXtyAySNaQkIaK69f1hRA066uWsW7DWVFZ +5ewnrJKIzLBxBmA1YU2DGwcLHEakT1XfgvVxYgLH8hyW+UMMBDMc5MLeScib0hGO +PNxcL0JIiPGAxsnYHVDwjpmJBDGoUu/kHx4cLmG5559MQR8HBOgUPC42C3jIT94X +8iOTSaUZ4aVZCHn0WZtrp7cCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/sock-tcp-async/client/main.go b/0xetc/0xgo/sock-tcp-async/client/main.go new file mode 100644 index 0000000..573819f --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/client/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "fmt" + "net" + "os" +) + +func main() { + + mode := os.Args[1] + + if mode == "net" { + conn, err := net.Dial("tcp", "localhost:8080") + if err != nil { + fmt.Println(err) + return + } + + wbuf := make([]byte, 1024) + + copy(wbuf, "Hello, server!") + + _, err = conn.Write(wbuf) + if err != nil { + fmt.Println(err) + return + } + + conn.Close() + + } else if mode == "tls" { + + TlsConnection() + } + +} diff --git a/0xetc/0xgo/sock-tcp-async/client/tls.go b/0xetc/0xgo/sock-tcp-async/client/tls.go new file mode 100644 index 0000000..574c0e5 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/client/tls.go @@ -0,0 +1,69 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "log" + "os" + "time" +) + +func TlsConnection() { + + certpool := x509.NewCertPool() + + file_b, err := os.ReadFile("certs/ca.pem") + + /* + ca_pem := new(bytes.Buffer) + + pem.Encode(ca_pem, &pem.Block{ + Type: "CERTIFICATE", + Bytes: file_b, + }) + */ + certpool.AppendCertsFromPEM(file_b) + + config := tls.Config{RootCAs: certpool} + conn, err := tls.Dial("tcp", "localhost:8080", &config) + if err != nil { + log.Fatalf("client: dial: %s", err) + } + defer conn.Close() + log.Println("client: connected to: ", conn.RemoteAddr()) + + state := conn.ConnectionState() + for _, v := range state.PeerCertificates { + fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey)) + fmt.Println(v.Subject) + } + log.Println("client: handshake: ", state.HandshakeComplete) + log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual) + wbuf := make([]byte, 1024) + + copy(wbuf, "Hello, tls server!") + n, err := conn.Write(wbuf) + if err != nil { + log.Fatalf("client: write: %s", err) + } + + reply := make([]byte, 1024) + + readlen := 0 + + for readlen != 1024 { + + n, err = conn.Read(reply[readlen:]) + if err != nil { + fmt.Println(err) + return + } + + readlen += n + } + + log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen) + time.Sleep(time.Millisecond * 1000) + log.Print("client: exiting") +} diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.csr b/0xetc/0xgo/sock-tcp-async/server/certs/server.csr new file mode 100644 index 0000000..d1716a7 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6ZweetnvPhYwY9UPcQwlHuEw6 +dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJCV9eKFJ5C1WyePglNBCg +rPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjCgvDSj1WvFv+3myG83sdH +yRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32eaoFVCNMmi08c9xZSbT8+ +5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQUOG7afJHMzSX3zDsKPDJ +IucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxzPZntRUu6iPZQlPGCGlcQ +XAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK88BLIJM7twDGiD17YMhh +iTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p217sROouCa6Id/v6KmEfs +9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7JFe/Xgfn/ihJXpMiB2vP +sSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+UxW3BrLvfMGq8T9MNz2Du +rIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKySX7wAtbgJUG5lMazUzUb +6OUCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQDBarvtlgaaiF32tTzMDAU+94+F +0WKdstbGIcUDjW126WhiDMD9nsbjNscdkFpw7/JqvnD6CX3nOaE7EmO0Zh5+AXn+ +SgD+KsdEPDAw40zX/ceaEyLo13HYTqEXXf9GyVYFoUrPs1kI4ncvOcY6T6hGsoCn +OzqzkQA0M44ct+VZkLZHtdotI/Pt0O3EGTIvxpH9LssI2XsAazRakudnECgf7krq +qqtWceclClqmGR3xSpV5oWPt2V3Y1dDFvX0W1spxiMG8FHgT1b4Gf5WM4jOfcNm9 +g23PFc+ffqeEs1+1LhFWf+r61NLjrKKH82JEzXPj+kXSZ844JJrGdsjh8tuVtMvf +ivYL8Di8AbEE2zSo7/bP3WKDkVN5oHC3/oz3V7vtPTfaWUHsJwI8qBkMO200KwH9 +FvTodg+NI8z7EOWhBvCE+hjlL1fn+9l2pLUV+fqjeXBQEsrHep+vN7zCCkJAmM0A +mpU7OPNc7zm28L6zGK5TkKUHU4aGVyeItam6eU8+d/sZjkrQqQ/lEJbiLVCz//Kd +/qGchrSksm6rKEcwYGE5h31wl8SAIjADk2cx/iQianhTdZaliL1I+s7pR67esTvi +BhK16uLW+x6fuASKU5kDqLuHc+3rT+icu/DNEsQvR6j3t5i/iu6GYLLBHhWZWH1T +0rS8ffinyso9IuImyQ== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.key b/0xetc/0xgo/sock-tcp-async/server/certs/server.key new file mode 100644 index 0000000..e45fe9b --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +Ug07IGqNaURkyoQerKUv7X+DOFO1Qo4= +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.pem b/0xetc/0xgo/sock-tcp-async/server/certs/server.pem new file mode 100644 index 0000000..9973288 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUJKOoxLd1sHJPAruVK7OKVO6FzMYwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0yNjAyMDgxMTQx +MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMmd0Od4s+bBMnVZ+mcHnrZ7z4WMGPVD3EMJR7hMOnTIsG1ixZd2 +78tKTGytkNiXf0zXdcUJxtiF+7jFbJnnCQlfXihSeQtVsnj4JTQQoKz8HHBTxVqg +F4+rNu5nmjcVAIHu0ty6mZcFUpnX8k7YwoLw0o9Vrxb/t5shvN7HR8kaYl1WpeEe +S7HdqRCLyfgZwBsWs1XUViHGE9si3c99nmqBVQjTJotPHPcWUm0/PuZqgYYQQ8Nt +MoYh+3FLBoOPZmFTPa1IM9A40GpaoNNUEFDhu2nyRzM0l98w7CjwySLnB4CHyBLa +CCDg9ItSFaoB0csM7ntfEv+TPyOGHLQ8cz2Z7UVLuoj2UJTxghpXEFwJWoufrv43 +4Ped3UjAS1KBksZiBYsR4TfEHEkUWNdDivPASyCTO7cAxog9e2DIYYkwNw5pCDjg +wB2lTeGpHX4ZjD+ID9tD2g/1C1VCJeu6dte7ETqLgmuiHf7+iphH7PfvDFUmY89c +WDb//p1jMZWtSKJi7JInxj0GiWFunh9IeyRXv14H5/4oSV6TIgdrz7EjtYYqODTN +wotcIT9x+oj41uq9v4Bif1DkNR+c2XXvlMVtway73zBqvE/TDc9g7qyIhu5QQWRC +qaC/7JR39vDF+wC16p4X6vPdUG9ypdsyskl+8ALW4CVBuZTGs1M1G+jlAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUbVC6F4cp3g11LRik +jHUBSlLFXF4wHwYDVR0jBBgwFoAUNTLhikFTfYlRZvi7OXJDrw0apSIwDQYJKoZI +hvcNAQELBQADggIBAHq7EV5kIo/RNG4Uzwnob6Zwi94la8ZDq7qFQoj6GJbbd/l0 +bQCIDTeIl5JzrPTv6Ka00DbSJ4BbY6OUTgUCeBDOX/lJ/FAYHhRMeTtOi7KTxyX2 +D8FKdQ/ZAYrU/GY0bC4vVwDqCmn5t+xkD2cXQlAAJIlQWVNEXIMrdDY4Q0jYyIiY +lFyCu/cJY2phOzltbcwTOHzFSyPTyYSGacyE7xAyWj9va9renOQ3+kmj5Nu+jkMv +hsAWNH6RjaJgOSYN5ItUi+i7qyqhWHOuU3ParKr0SEdl8cx9zvDRzNd2ZJQLtPvo +CLlyifI0IAhe/Xh52mTEAJ8WBzjbVazPLBn9RUpN330h3mbFi3LxqZjyGmYNr5L3 +GwxVLcnRr8nL7FPb0AP1GlzTkxWULSwAJuivPgZywwZCxfkRdPGe7bq6c92W/bAx +qAjEiqKZBzEpHMhwOvJXMo79/DmE4Q4N2yQxaA7vx8FQbFYvX0NhFIymKo6D4Uu+ +kYyFbSE3LymWbzGh0kFEf9xXl3xqQy1rXBYf8d9Z5+5acZG+6jcwmVQxqnWloajE +uZmO7CKnUW8uJgE/1WCR7pF0DFWvNpq3zOssOV3dJZhvgEp6XXiwymbF8RlBnUy0 +4/GwXud7beKomxBwbYmYmGKO6lmQOQou7VP6Ag/637oOt8YaU/DKEdKwpKdQ +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/sock-tcp-async/server/certs/server.pub b/0xetc/0xgo/sock-tcp-async/server/certs/server.pub new file mode 100644 index 0000000..9901d75 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6Zwee +tnvPhYwY9UPcQwlHuEw6dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJ +CV9eKFJ5C1WyePglNBCgrPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjC +gvDSj1WvFv+3myG83sdHyRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32e +aoFVCNMmi08c9xZSbT8+5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQ +UOG7afJHMzSX3zDsKPDJIucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxz +PZntRUu6iPZQlPGCGlcQXAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK +88BLIJM7twDGiD17YMhhiTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p2 +17sROouCa6Id/v6KmEfs9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7 +JFe/Xgfn/ihJXpMiB2vPsSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+U +xW3BrLvfMGq8T9MNz2DurIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKy +SX7wAtbgJUG5lMazUzUb6OUCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/sock-tcp-async/server/main.go b/0xetc/0xgo/sock-tcp-async/server/main.go new file mode 100644 index 0000000..a5dcff0 --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/server/main.go @@ -0,0 +1,104 @@ +package main + +import ( + "fmt" + "net" + "os" +) + +func main() { + + mode := os.Args[1] + + if mode == "net" { + ln, err := net.Listen("tcp", "0.0.0.0:8080") + if err != nil { + fmt.Println(err) + return + } + + for { + conn, err := ln.Accept() + if err != nil { + fmt.Println(err) + continue + } + + rc := make(chan []byte, 1024) + + wc := make(chan []byte, 1024) + + go readHandler(conn, rc) + + go worker(rc, wc) + + go writeHandler(conn, wc) + + } + } else if mode == "tls" { + + TlsListen() + + } + +} + +func readHandler(c net.Conn, rc chan []byte) { + + buf := make([]byte, 1024) + + for { + + readlen := 0 + + for readlen != 1024 { + + n, err := c.Read(buf[readlen:]) + if err != nil { + fmt.Println(err) + return + } + + readlen += n + } + + fmt.Printf("Received len: %d\n", readlen) + + rc <- buf + + } + +} + +func worker(rc chan []byte, wc chan []byte) { + + for { + + rbuf := <-rc + + fmt.Printf("Worker: %s\n", string(rbuf)) + + wc <- rbuf + + } + +} + +func writeHandler(c net.Conn, wc chan []byte) { + + for { + + wbuf := <-wc + + n, err := c.Write(wbuf) + + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("Write len: %d\n", n) + + } + +} diff --git a/0xetc/0xgo/sock-tcp-async/server/tls.go b/0xetc/0xgo/sock-tcp-async/server/tls.go new file mode 100644 index 0000000..36457fa --- /dev/null +++ b/0xetc/0xgo/sock-tcp-async/server/tls.go @@ -0,0 +1,51 @@ +package main + +import ( + "crypto/rand" + "crypto/tls" + "crypto/x509" + "log" +) + +func TlsListen() { + cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") + if err != nil { + log.Fatalf("server: loadkeys: %s", err) + } + config := tls.Config{Certificates: []tls.Certificate{cert}} + config.Rand = rand.Reader + service := "0.0.0.0:8080" + listener, err := tls.Listen("tcp", service, &config) + if err != nil { + log.Fatalf("server: listen: %s", err) + } + log.Print("server: listening") + for { + conn, err := listener.Accept() + if err != nil { + log.Printf("server: accept: %s", err) + break + } + defer conn.Close() + log.Printf("server: accepted from %s", conn.RemoteAddr()) + tlscon, ok := conn.(*tls.Conn) + if ok { + log.Print("ok=true") + state := tlscon.ConnectionState() + for _, v := range state.PeerCertificates { + log.Print(x509.MarshalPKIXPublicKey(v.PublicKey)) + } + } + + rc := make(chan []byte, 1024) + + wc := make(chan []byte, 1024) + + go readHandler(conn, rc) + + go worker(rc, wc) + + go writeHandler(conn, wc) + + } +} diff --git a/0xetc/0xgo/sock-tcp/certgen.sh b/0xetc/0xgo/sock-tcp/certgen.sh new file mode 100755 index 0000000..493976f --- /dev/null +++ b/0xetc/0xgo/sock-tcp/certgen.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca.pem b/0xetc/0xgo/sock-tcp/client/certs/ca.pem new file mode 100644 index 0000000..a01c57f --- /dev/null +++ b/0xetc/0xgo/sock-tcp/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUJaxWVeWBx0o+5tTvweUncow0Ma0wDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMjlaFw0zNTAyMDYxMTQx +MjlaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCpRl2utUhApEwha6B7Vr+8YJLWgbINjHMkzCJOyqVnvi6+Ja0pfYFXiZAp +xewegSsK1QaEpW8zTRgmTVaA9q4MryV7PoYz5Lx+vQR+Q5TYy2WkeW3TAKmSiZOS +tPa6UVjryGq5rK5L+3QkiJ5ckNXUpi6xYvSwWpVMVKm3XFD2VNM19wcxi42UfhSG +ABa6F+qkz/TG/3DChCakCxEPB68ldKm9NeS0QSrDtmyvgMg2uigmupRZcbnnS6i6 +WI89N+9hO2SED0WG9AjbnpWYTkG+XyD9ljILtgO85vMPR+kcV5nRgrk6tONpDsA0 +rOsreu0zXyP6olnZyGLCrwrsDTQTda4DZ1H10OLZ6NMbEWzf6pMGS/RPLBxYKaZZ +ITZqrF35QKlF3BUQxOwZrIeNuZlfwD7X9k5f7Z1b+ChX6wuG/qjsQNtkdQl9V0/T +fKWeFslJvIghQjaQQef5tqiF5AGUV1MBPdYQ4M8pSEMvESaK3a7RrMImbGpi2uvq +Ua5Rik6liw0m3jGT2tEMfOOhLUP6rpAelNzykqI7dN9yELLK57gmvKUrUt59oqdI +wkjcYXrlxk/ntKS4sLcz9LsFYM98Gecl6irK0KqmR4fM0ueTumvMNkeKOn6BISJz +hoDbjb6BU06N6q/p2ZBG1yJmAVgxdQ4ejJqtOuNLL8N6kX/bSQIDAQABo1MwUTAd +BgNVHQ4EFgQUfMktrWwZkMks0TEaY4IclVFnb5IwHwYDVR0jBBgwFoAUfMktrWwZ +kMks0TEaY4IclVFnb5IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAZ1kQ6OUReLN9CIz6MCb0ZMbMkvA469R5WYLuq/GbguE51l7sKfCRIc7isRe1 +ubt1qgBIIYveZu6FI4OCBgOpRJMoKFRSyo9MVNGyVjEuqqxW+MxE6LIb6NoRypNl +XrynxlfgrLCIMNhI73Ri1A+THwc91G8NJM5AkCygMejiCMKoDFM0hadMP8B5/hqE +WeviGenzrsuSuG/3G75RFvBpo6kYLEhIwMWfOsnOUi//M9MBOczjsOBTBbrZcIYL +T9UP8jiKjGjcwLBrKLbwhu01zFC3vokwB+91MCyCTmNbuPY7KoIPnhKhWtgzd7g1 +EltiNwOShyS/kURHm4XquEvj95FVLGLTHm/selrJKtt+rzOvGi+MWRxfXentoDyt +6OkbaaBToEmI9xYldKpA35yNirUEbvi7mTHm6Q5BtlSBvBL1xvVXPwUEdoJUirAl +I9x+EEWwvFJZ0eroCkv1NjDHtpybRQbbnVNushPbfMyUFOSmLLKb5JVjWNWGCpHv +0VFBohUr3lrm04Hc6VLcXEoTs9a/7fu5h9THsA1cnaHYq4aS8trTgx1Zh3wxDScK +s9GfSgjfNutRvzwCaIgCio73g9k0Ac4mUxJAaEwQBbLl9pMH3NHfe6LKU94vhRHM +PzN2NXG+uef5/OU1qp1fnJyNsoD7V9baW5FTxdBTINt0QDk= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca.srl b/0xetc/0xgo/sock-tcp/client/certs/ca.srl new file mode 100644 index 0000000..e446e15 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/client/certs/ca.srl @@ -0,0 +1 @@ +583097A8573CE10C8940EFE5892C6FB7706960C7 diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca_priv.pem b/0xetc/0xgo/sock-tcp/client/certs/ca_priv.pem new file mode 100644 index 0000000..4db6c12 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +fJIrFNbakNgT3zvHUrA2KSgwKsTW +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/sock-tcp/client/certs/ca_pub.pem b/0xetc/0xgo/sock-tcp/client/certs/ca_pub.pem new file mode 100644 index 0000000..988570c --- /dev/null +++ b/0xetc/0xgo/sock-tcp/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqUZdrrVIQKRMIWuge1a/ +vGCS1oGyDYxzJMwiTsqlZ74uviWtKX2BV4mQKcXsHoErCtUGhKVvM00YJk1WgPau +DK8lez6GM+S8fr0EfkOU2MtlpHlt0wCpkomTkrT2ulFY68hquayuS/t0JIieXJDV +1KYusWL0sFqVTFSpt1xQ9lTTNfcHMYuNlH4UhgAWuhfqpM/0xv9wwoQmpAsRDwev +JXSpvTXktEEqw7Zsr4DINrooJrqUWXG550uouliPPTfvYTtkhA9FhvQI256VmE5B +vl8g/ZYyC7YDvObzD0fpHFeZ0YK5OrTjaQ7ANKzrK3rtM18j+qJZ2chiwq8K7A00 +E3WuA2dR9dDi2ejTGxFs3+qTBkv0TywcWCmmWSE2aqxd+UCpRdwVEMTsGayHjbmZ +X8A+1/ZOX+2dW/goV+sLhv6o7EDbZHUJfVdP03ylnhbJSbyIIUI2kEHn+baoheQB +lFdTAT3WEODPKUhDLxEmit2u0azCJmxqYtrr6lGuUYpOpYsNJt4xk9rRDHzjoS1D ++q6QHpTc8pKiO3TfchCyyue4JrylK1LefaKnSMJI3GF65cZP57SkuLC3M/S7BWDP +fBnnJeoqytCqpkeHzNLnk7przDZHijp+gSEic4aA242+gVNOjeqv6dmQRtciZgFY +MXUOHoyarTrjSy/DepF/20kCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/sock-tcp/client/main.go b/0xetc/0xgo/sock-tcp/client/main.go new file mode 100644 index 0000000..573819f --- /dev/null +++ b/0xetc/0xgo/sock-tcp/client/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "fmt" + "net" + "os" +) + +func main() { + + mode := os.Args[1] + + if mode == "net" { + conn, err := net.Dial("tcp", "localhost:8080") + if err != nil { + fmt.Println(err) + return + } + + wbuf := make([]byte, 1024) + + copy(wbuf, "Hello, server!") + + _, err = conn.Write(wbuf) + if err != nil { + fmt.Println(err) + return + } + + conn.Close() + + } else if mode == "tls" { + + TlsConnection() + } + +} diff --git a/0xetc/0xgo/sock-tcp/client/tls.go b/0xetc/0xgo/sock-tcp/client/tls.go new file mode 100644 index 0000000..5cf24bd --- /dev/null +++ b/0xetc/0xgo/sock-tcp/client/tls.go @@ -0,0 +1,68 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "log" + "os" + "time" +) + +func TlsConnection() { + + certpool := x509.NewCertPool() + + file_b, err := os.ReadFile("certs/ca.pem") + + /* + ca_pem := new(bytes.Buffer) + + pem.Encode(ca_pem, &pem.Block{ + Type: "CERTIFICATE", + Bytes: file_b, + }) + */ + certpool.AppendCertsFromPEM(file_b) + + config := tls.Config{RootCAs: certpool} + conn, err := tls.Dial("tcp", "localhost:8080", &config) + if err != nil { + log.Fatalf("client: dial: %s", err) + } + defer conn.Close() + log.Println("client: connected to: ", conn.RemoteAddr()) + + state := conn.ConnectionState() + for _, v := range state.PeerCertificates { + fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey)) + fmt.Println(v.Subject) + } + log.Println("client: handshake: ", state.HandshakeComplete) + log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual) + + message := make([]byte, 1024) + copy(message, "hello tls server") + n, err := conn.Write(message) + if err != nil { + log.Fatalf("client: write: %s", err) + } + + reply := make([]byte, 1024) + + readlen := 0 + + for readlen != 1024 { + + n, err = conn.Read(reply[readlen:]) + if err != nil { + fmt.Println(err) + return + } + + readlen += n + } + log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen) + time.Sleep(time.Millisecond * 1000) + log.Print("client: exiting") +} diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.csr b/0xetc/0xgo/sock-tcp/server/certs/server.csr new file mode 100644 index 0000000..5b41b91 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBSnzfohGT2Jf+4hcckBUDi +3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMGm9Zugj5nW6aerycBY8Yr +tyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1RhEjC5UWdEtmRUIhGL5Y +JtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta1R5R0VTLccnE43imhC4K +pLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dHq4EfVqfTzcScW+KDV7rg +PH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULpUkg5MzANHUW+D3l0sUJd +oQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1Hnsrm0XNnyk1z1blEssp +rstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO8ur7bgBuzT6QUPcYtRgz +0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHDxBYde7uBR/IIrL29s8KF +SFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyOHIjH3NBwVcFkcZHEgrLA +/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42t1gHsTVwIAcpsh2U5uXe +8GECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCLvBYMKRYpz8FWWwA8Asq7RrXl +jPsaHhy8Bt+7s58VYKrvt10ip0qF97equA8AJB5sf8KxihfKeuWYMfuy3cyq8Erx +geUPa+TrlVdLkbi3qqeSJaDObg/MYrZmv+dJGYRMUxlzeOGncCZEhIOKUQRRkT73 +rxOEFEc1gLPi0p9fqsTuyyLWmQUd8rwfhoMubFiXkhFnw/NEBJPl6GqpjNGTsbyN +lUtA9wNK9ys2tuyL9yEzgmrKAkBljS6f98QIqN14EvSvF85Y910m5aC9uzadv6zr +Llgs7s18GI4tLq9xl1IpiiVrZxE1I97rgjJa29hSF0EZy3UW0esI/ZN8GpDmHwLN +CSbDOJDuNYsYeGrIsXzKNSK5kZYG2Zs4iVIwug335Bi/lN4g3NyMJxi2IdDHqgHw +GRDqb24VXhS5TyuVJ16schCCqA02Qh6SOSCWyy/Ao8UWm+XnMn8alm3DGGTCZNFP +pvSAd4YztkKcTayk7FDHczZcCDK7FMIVBSKRmsF1ahYYiiYfPAMs0Kf0D0GkSBPz +NR1+ImpNitFh94fAffo18lTm8eUE324ajBLgj9xOD6S4e2F1Q1GvgFaIWThe3thg +bcp9lGl+fBdmDz3wmPN+5/AitSr3W655eBoMYqObgjYpMj7/7/PTauvh/vQ4xzPX +SpUNK+yMT+N/hc2H+w== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.key b/0xetc/0xgo/sock-tcp/server/certs/server.key new file mode 100644 index 0000000..1382e5c --- /dev/null +++ b/0xetc/0xgo/sock-tcp/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCSNNCsnnhvlsYz +50LZQFKfN+iEZPYl/7iFxyQFQOLfDnGe+pvMKOOPLf2Ln1arPNuWt0Oa7qyBtbMv +Fs0scwab1m6CPmdbpp6vJwFjxiu3KPq52pDhQWeeGc3fIPQNJSEswLEB36PfjjVd +psj5gvVGESMLlRZ0S2ZFQiEYvlgm1+iYRd2k16yGlFldTdSLqjrNblXCrVm6EAvX +t6YsO1rVHlHRVMtxycTjeKaELgqkuaxczlBlz59KYcdAPcxfq/lNA3YBJiG1i9Po +q5VPh0ergR9Wp9PNxJxb4oNXuuA8fxZiHZKs42G6A202xJz5jYGNwTMqTcUQmbJE +/T+VQulSSDkzMA0dRb4PeXSxQl2hD7Cyr5p4sfkPZFRbT+jh1lESjs3a4mALNZrB +5u4jEPUeeyubRc2fKTXPVuUSyymuy1NsK45A8LkdYb9J3JfmsK6JO2dLI7XH6Y0G +G0GvBc7y6vtuAG7NPpBQ9xi1GDPRwR5ROh+5zN4uiewv63vuSEr4t22KxeYKoVl6 +WblWgcPEFh17u4FH8gisvb2zwoVIVxTmGy2kkpxOlte8o7G+HZrFSrY4nKyfzFVI +RnW0PI4ciMfc0HBVwWRxkcSCssD+mHQfCiUiIfUQTvjvdfIY6qrIkrKT0MDqMv1Q +Xbzabja3WAexNXAgBymyHZTm5d7wYQIDAQABAoICAAXj7+5+oQxDsKCOszJobKXp +4aECa++bQSZxK3q04uNo+Hi5xR9LeVbTxJrqW8MsjTxE31tPsZ/j0/eInXT75hxD +Xkb0rtpvJ1evKkBCcpEoWYAp7QRanSJ0DMeoMDiS/gOIpySfdCpbwAE00YwEn2aQ +uABfGDdn9p814nphc7mOW31Vlio/00kLqng2xRELbTyDBGI8l4E0/Er6DbYFZuMS +1gEGeed4bNUtSb9ruf5psmzDfseJ1jlv2q1iz/9DezAmwnQlwpgYZ4gdqk6tNyK1 +vzruKjWinF/hf/4/wYm6DcUrRsDLT6z/NxJ7QV8LCp77ygcyp0by2M8VSUOYY0Ax +E+kJwVk+TwBHLnc3PNop7nrKbq1HxF5SVRfYklIXpGs1ZgyVaxkUcNELs8QpTKUA +e8kjqHMtATwfE3/PiAYFi4gtBjp0WCWtyCmOZVCExFZlpe3BMflDR4eqldP8uYWq +APYCiTw2pC4FP3lrO7Wq3WcEdcFFUoDcjIhIduPXarlz57rChcsz3k+NwkRDHKaP +PALsXZdcs1ljVvctIsN/HHh3KGUtqMsLkT3yVu6RMq2gvGjI/9Su3lry/UTMVV5E +5etVsBZuUA/a30FU76xww+t/LYkHA7Y7m+gA9Z/IkraaZs0fHzv27fEnITEgPr56 +RLcs7lDzS4yhhZvah4hxAoIBAQDHJNVxrVPyaJHkScs1CssrQCSEiQwELlPZMoxL +SKWjwH3Wb0G8RftR9Y8PRV+drXfUlt4exxbsEEYMdmdB6gHXiNUF2x/FIcW3urAz +X0pLAgScGJWO9k15ycd4mFbCudkoVuCRH2GVHmm9+4/KaMo/hHPd0gDPL5rMZGxh +jK8rLJ7M5Am2zPUIqO+BCHWg3Tyz7gqh0w/3Fnl+yGqU3Ki2VPyKpW2w5R7u6Yuh +ICAW9NyUcpdN5bmjes3TeeS2jItIwATt9qRWxgJuPbmSHUhM09vaNHvoEtiyMgwe +TiLvtwrUJB+kpcNdEfJLx4XUuROSHGOyOlBIBq1a93C2EcT/AoIBAQC78tfjX74T +meKF4dNXf1W16KQCc25hjDsxh9eiuBexUQS7NYsZBGI5NMLsEJKoQ2iYVNZPK4Yf +mMmatrO0NSjVdfvAa6TaG24TpTBY+vI42ZY8ByASN9qH8UlcJNjOzM3T6TI9JHU6 +fR8JjGeSMA8DXazOvjNQ3++/MXrrN8aF72kajFAmoZKY3DYMBlJFnIDxU17xFdRn +fGF9L/3KFN8MrI/oPPqa1Z1yNNclSDr6FOfaImllEfBVed/kzo+6wHpKKpV/tNev +Kc5LavK/TbppxVzM+tGS8PmFOr6OV6DVX37YBEsNd/c9meqJCkiUJPOaLFFEM93D +ftWoshg2vGqfAoIBAE78kxRVlThOtZ8AjfLp5w+uj01qNjPqVCOP4wlxNRGwJblJ +w57zeu1VInsCHxyhUygk9tDqUnMrOT10MRx5vmVIxoVeFknQTWXETGLz5rm9gSqQ +rbFYi/5ERDPW6IKvyCwx2Tx2X/QPbg2Gm8/CpIVw+av/wYZr8VAkfMBsVoYfWpUV +1ayFuqLGrshVHKLDXXJYdisdVfXBGktpHq0QoHJBXzF2z/0bw5srUtCDt3ajhGH0 +2YJyHaFz8fNxI4AsWopubwYbj69DNm+XV+VWa/jdBxSTQJoZ740uQJQ8larSxR7D +fTGG9egSWDIqXzCyf8qyK/DjJDiNPXEZN8FfZu0CggEBAI9ZI8He5zlJ+FSGrcuh +afzpaBYadkjeTNN1OUl5QVDTa1lh+Cpnhob9L+Iercy6RQ9SPXZ6yrxUqwdea+d5 +WCCe8RmMwFo965H+PsbO92nWwtgb0yEyCnH+3SXzUI1B9Ya36MJriSHIBqEgvmno +T7sQelnhBYCcm93mXksC6l6DAFXoSMV+HDKMWoiHVb6UJGBrZxFXxf38BtsVfGrh +ylF/V+8Ye0cWwBQ4KxPbaGgPA9sCvgIBUZ3P6602wrb8UQk6O3YAtzR5HUe2VVkF +brV3e1U3xBpfwuATsv0b5qZ3RGZ7t8aZBjCssQ4+kqazHD0tqfnr2StfFJSq6P7u +bB8CggEAQzCqvbyGpHhpSqHPZe6w+2T749Zz7jkEb5D15tem5w3z/yMBlnZrBaQN +oBbwJ2Q70DcEFuJbNBqS9NuXMwAL68nCUK/5wBngyaLnm4BaKZB4m0iU3Eh1ltHy +f16An/aqB1dlqTrHXmF5Z1wE17kVWddPlRfEueNaNfRpMr3/ASr1aWWkwNB7/Ew7 +jJ7OtOlLqkhAkNjjheAkIk/JYiHkQhyKB8bpJLJRrin5uyzL09mhYsBULSZD4ksO +cxlKxYcr9MbEXuqvPx6wR20AVk+6qSxqRhKAO/wSWJWUY7uJQ3xJmVvawNBAWlKR +YBLNr2GdmvMahJVy1gQXG9HlYIj/sA== +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.pem b/0xetc/0xgo/sock-tcp/server/certs/server.pem new file mode 100644 index 0000000..2f00061 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUWDCXqFc84QyJQO/liSxvt3BpYMcwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMzBaFw0yNjAyMDgxMTQx +MzBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJI00KyeeG+WxjPnQtlAUp836IRk9iX/uIXHJAVA4t8OcZ76m8wo +448t/YufVqs825a3Q5rurIG1sy8WzSxzBpvWboI+Z1umnq8nAWPGK7co+rnakOFB +Z54Zzd8g9A0lISzAsQHfo9+ONV2myPmC9UYRIwuVFnRLZkVCIRi+WCbX6JhF3aTX +rIaUWV1N1IuqOs1uVcKtWboQC9e3piw7WtUeUdFUy3HJxON4poQuCqS5rFzOUGXP +n0phx0A9zF+r+U0DdgEmIbWL0+irlU+HR6uBH1an083EnFvig1e64Dx/FmIdkqzj +YboDbTbEnPmNgY3BMypNxRCZskT9P5VC6VJIOTMwDR1Fvg95dLFCXaEPsLKvmnix ++Q9kVFtP6OHWURKOzdriYAs1msHm7iMQ9R57K5tFzZ8pNc9W5RLLKa7LU2wrjkDw +uR1hv0ncl+awrok7Z0sjtcfpjQYbQa8FzvLq+24Abs0+kFD3GLUYM9HBHlE6H7nM +3i6J7C/re+5ISvi3bYrF5gqhWXpZuVaBw8QWHXu7gUfyCKy9vbPChUhXFOYbLaSS +nE6W17yjsb4dmsVKtjicrJ/MVUhGdbQ8jhyIx9zQcFXBZHGRxIKywP6YdB8KJSIh +9RBO+O918hjqqsiSspPQwOoy/VBdvNpuNrdYB7E1cCAHKbIdlObl3vBhAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU89cgoz1/aHzj2bu3 +RywilJJM5M8wHwYDVR0jBBgwFoAUfMktrWwZkMks0TEaY4IclVFnb5IwDQYJKoZI +hvcNAQELBQADggIBAKHCXvS4uX9o24h3XGN20Q4FzfofAZ7dHDjqNglg/0SxxvgO +2R1kyDNrD8PiaQRP990gNhodSp38XtMLro8nRWjQHyY0Wxv/msBd+BQF4kJ6/BLn +l2TBFpGCa1VN6zKed4Nf0BW5WKEuQIiuJ2IfNpp/Eel/5duKWGbhAKr4tVGXCWRV +SmpNl+aGKsxgrx2vZw92JgoRJ/bBOQp/C+etwI/Yravgbl6KVRhpx4Fwbu/nXErm +YUXyynpk2wlfKvOgW0DJpeJ7VwGukwtvLdeaOq6+goVXa2rJrrjYyLBsCNIaiNiW +cmBZp1k8zJQ0BQbY8a/FTb3yrFMo80EzpRQ10VtBztO8I11IE2K8fIEv5HpqIDYJ +h6sdvWP7dJYyXih1cKS78LRCuyOTyrRPjpyVwyzz5bbbrlcu5smNvK5HqbM9GeAT +R4+43ifMk9ZIObd8MlKgXTDC7QFb2GjiCUJF5hMGTlrwUZDNR4Esibe8l1xHd0yL +XQSNzBvj0UcKmuhabx79dAZLl/DutB95kH8esjPj0eCLwlZYkAZwXuw/xIbUIL5s +GsN0klNego9c51ey27K4CVVznt/8xPRfR182ZOr9KVE20cphK0UyAFaXhSCkZLaq +b/3+P6Dg7dDK2k5wFLWfOX0bhVbhfYIX8GZM9VGX/Dn3DqZtC1QXxDpyFlDG +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/sock-tcp/server/certs/server.pub b/0xetc/0xgo/sock-tcp/server/certs/server.pub new file mode 100644 index 0000000..058ca12 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBS +nzfohGT2Jf+4hcckBUDi3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMG +m9Zugj5nW6aerycBY8Yrtyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1 +RhEjC5UWdEtmRUIhGL5YJtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta +1R5R0VTLccnE43imhC4KpLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dH +q4EfVqfTzcScW+KDV7rgPH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULp +Ukg5MzANHUW+D3l0sUJdoQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1 +Hnsrm0XNnyk1z1blEssprstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO +8ur7bgBuzT6QUPcYtRgz0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHD +xBYde7uBR/IIrL29s8KFSFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyO +HIjH3NBwVcFkcZHEgrLA/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42 +t1gHsTVwIAcpsh2U5uXe8GECAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/sock-tcp/server/main.go b/0xetc/0xgo/sock-tcp/server/main.go new file mode 100644 index 0000000..95a0920 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/server/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "fmt" + "net" + "os" +) + +func main() { + + mode := os.Args[1] + + if mode == "net" { + ln, err := net.Listen("tcp", "0.0.0.0:8080") + if err != nil { + fmt.Println(err) + return + } + + for { + conn, err := ln.Accept() + if err != nil { + fmt.Println(err) + continue + } + + go handleConnection(conn) + } + } else if mode == "tls" { + + TlsListen() + + } + +} + +func handleConnection(conn net.Conn) { + + defer conn.Close() + + buf := make([]byte, 1024) + + for { + + readlen := 0 + + for readlen != 1024 { + + n, err := conn.Read(buf[readlen:]) + if err != nil { + fmt.Println(err) + return + } + + readlen += n + } + + fmt.Printf("Received: %s", buf) + + _, err := conn.Write(buf) + + if err != nil { + fmt.Println(err) + return + } + + } + +} diff --git a/0xetc/0xgo/sock-tcp/server/tls.go b/0xetc/0xgo/sock-tcp/server/tls.go new file mode 100644 index 0000000..b168244 --- /dev/null +++ b/0xetc/0xgo/sock-tcp/server/tls.go @@ -0,0 +1,78 @@ +package main + +import ( + "crypto/rand" + "crypto/tls" + "crypto/x509" + "log" + "net" +) + +func TlsListen() { + cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") + if err != nil { + log.Fatalf("server: loadkeys: %s", err) + } + config := tls.Config{Certificates: []tls.Certificate{cert}} + config.Rand = rand.Reader + service := "0.0.0.0:8080" + listener, err := tls.Listen("tcp", service, &config) + if err != nil { + log.Fatalf("server: listen: %s", err) + } + log.Print("server: listening") + for { + conn, err := listener.Accept() + if err != nil { + log.Printf("server: accept: %s", err) + break + } + defer conn.Close() + log.Printf("server: accepted from %s", conn.RemoteAddr()) + tlscon, ok := conn.(*tls.Conn) + if ok { + log.Print("ok=true") + state := tlscon.ConnectionState() + for _, v := range state.PeerCertificates { + log.Print(x509.MarshalPKIXPublicKey(v.PublicKey)) + } + } + go handleClient(conn) + } +} + +func handleClient(conn net.Conn) { + defer conn.Close() + buf := make([]byte, 1024) + var reterr error = nil + for { + readlen := 0 + log.Print("server: conn: waiting") + + for readlen != 1024 { + + n, err := conn.Read(buf[readlen:]) + if err != nil { + + reterr = err + break + } + + readlen += n + } + + if reterr != nil { + log.Printf("server: conn: read: %s", reterr) + return + } + + log.Printf("server: conn: echo %s\n", string(buf)) + _, err := conn.Write(buf) + + if err != nil { + log.Printf("server: write: %s", err) + break + } + } + log.Println("server: conn: closed") +} diff --git a/0xetc/0xgo/sock-udp/Makefile b/0xetc/0xgo/sock-udp/Makefile new file mode 100644 index 0000000..372df8f --- /dev/null +++ b/0xetc/0xgo/sock-udp/Makefile @@ -0,0 +1,5 @@ +all: + + go build -o client/client.out ./client + + go build -o server/server.out ./server \ No newline at end of file diff --git a/0xetc/0xgo/sock-udp/client/main.go b/0xetc/0xgo/sock-udp/client/main.go new file mode 100644 index 0000000..0693e2b --- /dev/null +++ b/0xetc/0xgo/sock-udp/client/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + "net" +) + +var addr = "0.0.0.0:8888" + +func main() { + + p := make([]byte, 128) + conn, err := net.Dial("udp", addr) + + if err != nil { + fmt.Printf("Some error %v", err) + return + } + + copy(p, "hello udp server") + + n, err := conn.Write(p) + + if err == nil { + fmt.Printf("sent %d\n", n) + } else { + fmt.Printf("Some error %v\n", err) + } + conn.Close() +} diff --git a/0xetc/0xgo/sock-udp/server/main.go b/0xetc/0xgo/sock-udp/server/main.go new file mode 100644 index 0000000..304bda3 --- /dev/null +++ b/0xetc/0xgo/sock-udp/server/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + "log" + "net" + "strings" +) + +var addr = "0.0.0.0:8888" + +func GetServer(addr string) (*net.UDPConn, error) { + + addrlist := strings.Split(addr, ":") + + var port int + + fmt.Sscanf(addrlist[1], "%d", &port) + + ip := net.ParseIP(addrlist[0]).To4() + + udpaddr := net.UDPAddr{ + + IP: ip, + Port: port, + } + + listener, err := net.ListenUDP("udp", &udpaddr) + + if err != nil { + + return nil, fmt.Errorf("failed to get server: %s", err.Error()) + } + + return listener, nil +} + +func main() { + + l, err := GetServer(addr) + + if err != nil { + + log.Printf("failed: %s\n", err.Error()) + + return + } + + for { + + buf := make([]byte, 128) + + _, remoteaddr, err := l.ReadFromUDP(buf) + + strbuf := string(buf) + + fmt.Printf("Read a message from %v: %s\n", remoteaddr, strbuf) + + if err != nil { + fmt.Printf("Some error %v", err) + continue + } + + } +} diff --git a/0xetc/0xgo/sock-unix/Makefile b/0xetc/0xgo/sock-unix/Makefile new file mode 100644 index 0000000..8421f5a --- /dev/null +++ b/0xetc/0xgo/sock-unix/Makefile @@ -0,0 +1,6 @@ +all: + + go build -o client/client.out ./client + + go build -o server/server.out ./server + diff --git a/0xetc/0xgo/sock-unix/client/main.go b/0xetc/0xgo/sock-unix/client/main.go new file mode 100644 index 0000000..c1def0a --- /dev/null +++ b/0xetc/0xgo/sock-unix/client/main.go @@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "log" + "net" + "time" +) + +var addr = "/tmp/this.sock" + +func GetClient(baseAddr string) (net.Conn, error) { + + c, err := net.Dial("unix", baseAddr) + + if err != nil { + + return nil, fmt.Errorf("failed to set ipc client: %s", err.Error()) + } + + return c, nil +} + +func main() { + + c, err := GetClient(addr) + + if err != nil { + + log.Printf("failed: %s\n", err.Error()) + + return + } + + buff := make([]byte, 512) + + copy(buff, "hello world") + + for { + + time.Sleep(1 * time.Second) + + n, err := c.Write(buff) + + if err != nil { + + log.Printf("write failed: %s\n", err.Error()) + + break + } + + _ = n + + buff := make([]byte, 512) + + n, err = c.Read(buff) + + if err != nil { + + log.Printf("read failed: %s\n", err.Error()) + + break + + } + + log.Printf("got message\n") + + fmt.Println(string(buff)) + + } + +} diff --git a/0xetc/0xgo/sock-unix/server/main.go b/0xetc/0xgo/sock-unix/server/main.go new file mode 100644 index 0000000..2245519 --- /dev/null +++ b/0xetc/0xgo/sock-unix/server/main.go @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "log" + "net" +) + +var addr = "/tmp/this.sock" + +func GetServer(baseAddr string) (net.Listener, error) { + + listener, err := net.Listen("unix", baseAddr) + + if err != nil { + + return nil, fmt.Errorf("listen error: %s", err.Error()) + + } + + return listener, nil +} + +func doProcess(c net.Conn) { + + for { + + buf := make([]byte, 512) + + wbuf := make([]byte, 512) + + n, err := c.Read(buf) + + if err != nil { + + log.Printf("read: %s\n", err.Error()) + + return + } + + nStr := fmt.Sprintf("%d", n) + + var strlen int = 0 + + for i := 0; i < 512; i++ { + + strlen = i + + if buf[i] == 0 { + + break + } + + } + + copy(wbuf, buf[:strlen]) + + copy(wbuf[strlen:], []byte(nStr)) + + _, err = c.Write(wbuf) + + if err != nil { + + log.Printf("write: %s\n", err.Error()) + + return + } + + } + +} + +func main() { + + l, err := GetServer(addr) + + if err != nil { + log.Printf("failed to get server: %s\n", err.Error()) + + return + } + + for { + + c, err := l.Accept() + + if err != nil { + + log.Printf("failed to accept: %s\n", err.Error()) + + continue + } + + go doProcess(c) + + } + +} diff --git a/0xetc/0xgo/util/util.go b/0xetc/0xgo/util/util.go new file mode 100644 index 0000000..c62c06e --- /dev/null +++ b/0xetc/0xgo/util/util.go @@ -0,0 +1,274 @@ +package util + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "io" + "log" + "os" + "strconv" + "strings" + "time" + + "golang.org/x/crypto/ssh" +) + +var HEX_RUNES = []rune{ + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', +} + +func CheckIfSliceContains[T comparable](slice []T, ele T) bool { + + hit := false + + for i := 0; i < len(slice); i++ { + + if slice[i] == ele { + + hit = true + + return hit + } + + } + + return hit + +} + +func PopFromSliceByIndex[T comparable](slice []T, idx int) (T, []T) { + + pop_val := slice[idx] + + return pop_val, append(slice[:idx], slice[idx+1:]...) + +} + +func InsertToSliceByIndex[T comparable](slice []T, idx int, val T) []T { + + return append(slice[:idx], append([]T{val}, slice[idx:]...)...) +} + +func SplitStrict(content string) map[string]string { + out := map[string]string{} + for _, line := range strings.Split(content, "\n") { + parts := strings.SplitN(line, "=", 2) + if len(parts) != 2 { + continue + } + key := parts[0] + if len(key) == 0 || key[0] == '#' { + continue + } + + value := parts[1] + if len(value) > 2 && value[0] == '"' && value[len(value)-1] == '"' { + + var err error + value, err = strconv.Unquote(value) + if err != nil { + continue + } + } + out[key] = value + } + return out +} + +func MakeOSReleaseLinux() map[string]string { + + var osRelease map[string]string + + if osRelease == nil { + + osRelease = map[string]string{} + if bytes, err := os.ReadFile("/etc/os-release"); err == nil { + osRelease = SplitStrict(string(bytes)) + } + } + return osRelease +} + +func SliceContains(s []string, str string) bool { + for _, v := range s { + if v == str { + return true + } + } + + return false +} + +func RandomHex(n int) (string, error) { + bytes := make([]byte, n) + if _, err := rand.Read(bytes); err != nil { + return "", err + } + return hex.EncodeToString(bytes), nil +} + +type ShellConnection struct { + *ssh.Client + password string +} + +func ShellConnect(addr, user, password string) (*ShellConnection, error) { + + var hostkeyCallback = ssh.InsecureIgnoreHostKey() + + sshConfig := &ssh.ClientConfig{ + User: user, + Auth: []ssh.AuthMethod{ + ssh.Password(password), + }, + HostKeyCallback: hostkeyCallback, + } + + conn, err := ssh.Dial("tcp", addr, sshConfig) + if err != nil { + return nil, err + } + + return &ShellConnection{conn, password}, nil + +} + +func (conn *ShellConnection) SendCommands(cmds string) ([]byte, error) { + session, err := conn.NewSession() + if err != nil { + log.Fatal(err) + } + defer session.Close() + + modes := ssh.TerminalModes{ + ssh.ECHO: 0, + ssh.TTY_OP_ISPEED: 14400, + ssh.TTY_OP_OSPEED: 14400, + } + + err = session.RequestPty("xterm", 80, 40, modes) + if err != nil { + return []byte{}, err + } + + stdoutB := new(bytes.Buffer) + session.Stdout = stdoutB + in, _ := session.StdinPipe() + + go func(in io.Writer, output *bytes.Buffer) { + + t_start := time.Now() + + for { + + t_now := time.Now() + + diff := t_now.Sub(t_start) + if strings.Contains(string(output.Bytes()), "[sudo] password for ") { + _, err = in.Write([]byte(conn.password + "\n")) + if err != nil { + break + } + break + } + if diff.Seconds() > 30 { + break + } + } + }(in, stdoutB) + + err = session.Run(cmds) + if err != nil { + return []byte{}, err + } + return stdoutB.Bytes(), nil +} + +func (conn *ShellConnection) SendCommandsBackground(cmds string) ([]byte, error) { + session, err := conn.NewSession() + if err != nil { + log.Fatal(err) + } + defer session.Close() + + stdoutB := new(bytes.Buffer) + session.Stdout = stdoutB + in, _ := session.StdinPipe() + + go func(in io.Writer, output *bytes.Buffer) { + + t_start := time.Now() + + for { + + t_now := time.Now() + + diff := t_now.Sub(t_start) + + if strings.Contains(string(output.Bytes()), "[sudo] password for ") { + _, err = in.Write([]byte(conn.password + "\n")) + if err != nil { + break + } + break + } + + if diff.Seconds() > 30 { + break + } + + } + }(in, stdoutB) + + err = session.Start(cmds) + if err != nil { + return []byte{}, err + } + return stdoutB.Bytes(), nil +} + +func SanitizeUnnecessary(line string) string { + + ret := "" + + line = strings.ReplaceAll(line, " ", "") + line = strings.ReplaceAll(line, "\n", "") + + llen := len(line) + + for i := 0; i < llen; i++ { + + if line[i] == '[' || line[i] == ']' { + + continue + + } else if line[i] == ',' { + + ret += " " + + } else { + + ret += string(line[i]) + + } + + } + + return ret +} diff --git a/0xetc/0xgo/webrtc/Makefile b/0xetc/0xgo/webrtc/Makefile new file mode 100644 index 0000000..c0436be --- /dev/null +++ b/0xetc/0xgo/webrtc/Makefile @@ -0,0 +1,6 @@ +all: + go build -o main.out . + +clean: + + rm -rf *.out \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/config.yaml b/0xetc/0xgo/webrtc/config.yaml new file mode 100644 index 0000000..ae7f13f --- /dev/null +++ b/0xetc/0xgo/webrtc/config.yaml @@ -0,0 +1,27 @@ +turnServerAddr: + - addr: turn:localhost:3478 + id: hello + pw: example + +rooms: + - key: abcd + members: + - hello + - world + +url: "localhost" + +signalPort: 8002 + +rtpReceivePort: 8004 + +peerSignalAttemptSync: 5 + +peerSignalAddr : /signal/peer/ + +rtcpPLIInterval: 3 + +udpMuxPort: 8006 + +udpEphemeralPortMin: 31000 +udpEphemeralPortMax: 31100 diff --git a/0xetc/0xgo/webrtc/main.go b/0xetc/0xgo/webrtc/main.go new file mode 100644 index 0000000..8a09baf --- /dev/null +++ b/0xetc/0xgo/webrtc/main.go @@ -0,0 +1,137 @@ +package main + +import ( + "fmt" + "log" + "os" + "time" + + "github.com/gin-gonic/contrib/sessions" + "github.com/gin-gonic/gin" + "gopkg.in/yaml.v3" + + "github.com/seantywork/go/webrtc/webrtc" +) + +type Config struct { + TurnServerAddr []struct { + Addr string `yaml:"addr"` + Id string `yaml:"id"` + Pw string `yaml:"pw"` + } `yaml:"turnServerAddr"` + Rooms []struct { + Key string `yaml:"key"` + Members []string `yaml:"members"` + } `yaml:"rooms"` + Url string `yaml:"url"` + SignalPort int `yaml:"signalPort"` + RtpReceivePort int `yaml:"rtpReceivePort"` + PeerSignalAttemptSync int `yaml:"peerSignalAttemptSync"` + PeerSignalAddr string `yaml:"peerSignalAddr"` + RtcpPLIInterval int `yaml:"rtcpPLIInterval"` + UdpMuxPort int `yaml:"udpMuxPort"` + UdpEphemeralPortMin int `yaml:"udpEphemeralPortMin"` + UdpEphemeralPortMax int `yaml:"udpEphemeralPortMax"` +} + +func GetIndex(c *gin.Context) { + + c.HTML(200, "index.html", gin.H{}) + +} + +func main() { + + file_b, err := os.ReadFile("config.yaml") + + if err != nil { + + log.Printf("failed to read config.yaml: %v", err) + + os.Exit(-1) + } + + conf := Config{} + + err = yaml.Unmarshal(file_b, &conf) + + if err != nil { + log.Printf("failed to unmarshal: %v\n", err) + + os.Exit(-1) + } + + turnlen := len(conf.TurnServerAddr) + + for i := 0; i < turnlen; i++ { + + addr := struct { + Addr string `json:"addr"` + Id string `json:"id"` + Pw string `json:"pw"` + }{} + + addr.Addr = conf.TurnServerAddr[i].Addr + addr.Id = conf.TurnServerAddr[i].Id + addr.Pw = conf.TurnServerAddr[i].Pw + + webrtc.TURN_SERVER_ADDR = append(webrtc.TURN_SERVER_ADDR, addr) + + } + + roomlen := len(conf.Rooms) + + for i := 0; i < roomlen; i++ { + + pc := webrtc.PeersCreate{} + + pc.RoomName = conf.Rooms[i].Key + + pc.Users = conf.Rooms[i].Members + + webrtc.CreatePeers(&pc) + + } + + webrtc.URL = conf.Url + webrtc.CHANNEL_PORT = fmt.Sprintf("%d", conf.SignalPort) + webrtc.RTP_RECEIVE_PORT = fmt.Sprintf("%d", conf.RtpReceivePort) + webrtc.PEER_SIGNAL_ATTEMPT_SYNC = conf.PeerSignalAttemptSync + webrtc.PEERS_SIGNAL_PATH = conf.PeerSignalAddr + webrtc.RTCP_PLI_INTERVAL = time.Second * time.Duration(conf.RtcpPLIInterval) + webrtc.UDP_MUX_PORT = conf.UdpMuxPort + webrtc.UDP_EPHEMERAL_PORT_MIN = conf.UdpEphemeralPortMin + webrtc.UDP_EPHEMERAL_PORT_MAX = conf.UdpEphemeralPortMax + + webrtc.InitWebRTCApi() + + server := gin.Default() + + store := sessions.NewCookieStore([]byte("WEBRTC")) + + server.Use(sessions.Sessions("WEBRTC", store)) + + server.LoadHTMLGlob("view/*") + + server.Static("/public", "./public") + + server.GET("/", GetIndex) + + server.GET("/rtmp", webrtc.GetRtmp) + + server.POST("/api/rtmp/open", webrtc.RtmpOpen) + + server.GET("/room/:roomId/:userId", webrtc.GetRoom) + + server.GET("/api/peers/signal/address", webrtc.GetPeersSignalAddress) + + go webrtc.InitRTMPServer() + + webrtc.AddChannelHandler(conf.PeerSignalAddr, webrtc.RoomSignalHandler) + + webrtc.AddChannelCallback(webrtc.SignalDispatcher) + + go webrtc.StartAllChannelHandlers() + + server.Run("0.0.0.0:8000") +} diff --git a/0xetc/0xgo/webrtc/public/js/room.js b/0xetc/0xgo/webrtc/public/js/room.js new file mode 100644 index 0000000..3290502 --- /dev/null +++ b/0xetc/0xgo/webrtc/public/js/room.js @@ -0,0 +1,232 @@ + + +pc = {} +ws = {} + +PEERS_SIGNAL_ADDRESS = "" + +TURN_SERVER_ADDRESS= {} + +ICE_SENT = 0 + +MESSAGE_FORMAT = { + + command: "", + data: "" + +} + +async function initPeers(){ + + + + let roomInfo = JSON.stringify(ROOM_INFO) + + if(roomInfo == ""){ + + alert("no room info provided") + + return + } + + await init() + + + + navigator.mediaDevices.getUserMedia({ video: true, audio: true }) + .then(function(stream){ + + pc = new RTCPeerConnection({ +// iceServers: [ +// { +// urls: TURN_SERVER_ADDRESS.addr, +// username: TURN_SERVER_ADDRESS.id, +// credential: TURN_SERVER_ADDRESS.pw +// } +// ] + }) + + document.getElementById('localVideo').srcObject = stream + stream.getTracks().forEach(function(track) {pc.addTrack(track, stream)}) + + if (location.protocol !== 'https:') { + + ws = new WebSocket("ws://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name) + + } else { + + ws = new WebSocket("wss://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name) + + + } + + ws.onopen = function(evt){ + + ws.send(JSON.stringify({command: 'auth', data: roomInfo})) + + } + + ws.onclose = function(evt) { + alert("Websocket has closed") + } + + ws.onmessage = function(evt) { + let msg = JSON.parse(evt.data) + + if (!msg) { + return console.log('failed to parse msg') + } + + + switch (msg.command) { + case 'offer': + let offer = JSON.parse(atob(msg.data)) + if (!offer) { + return console.log('failed to parse answer') + } + + console.log("got offer") + + pc.setRemoteDescription(offer) + pc.createAnswer().then(function(answer) { + pc.setLocalDescription(answer) + ws.send(JSON.stringify({command: 'answer', data: btoa(JSON.stringify(answer))})) + }) + + console.log("sent answer") + + return + + case 'candidate': + + console.log("got candidate") + + let candidate = JSON.parse(atob(msg.data)) + if (!candidate) { + return console.log('failed to parse candidate') + } + + pc.addIceCandidate(candidate) + + console.log("added candidate") + + return + + case 'chat': + + let chatData = msg.data + + let chatMessage = JSON.parse(chatData) + + document.getElementById("chat-reader").innerText += `<${chatMessage.user}> ${chatMessage.message} \n` + + return + } + } + + ws.onerror = function(evt) { + console.log("ERROR: " + evt.data) + } + + pc.ontrack = function (event) { + if (event.track.kind === 'audio') { + return + } + + let el = document.createElement(event.track.kind) + el.srcObject = event.streams[0] + el.autoplay = true + el.controls = true + document.getElementById('remoteVideos').appendChild(el) + + event.track.onmute = function(event) { + el.play() + } + + event.streams[0].onremovetrack = function({track}) { + + if (el.parentNode) { + el.parentNode.removeChild(el) + } + } + } + + + pc.onicecandidate = function(e){ + + if (!e.candidate) { + + console.log("not a candidate") + + return + } + + + ws.send(JSON.stringify({command: 'candidate', data: btoa(JSON.stringify(e.candidate))})) + console.log("sent ice candidate") + + + } + + + + console.log("opened peer connection ready") + + }) + .catch(function(e){ + + alert(e) + }) + + + +} + +function sendChat(){ + + let chatConent = document.getElementById("chat-sender").value + + document.getElementById("chat-sender").value = "" + + let req = JSON.parse(JSON.stringify(MESSAGE_FORMAT)) + + req.command = "chat" + req.data = chatConent + + ws.send(JSON.stringify(req)) + +} + + +async function init(){ + + let options = { + method: "GET" + } + let result = await fetch("/api/peers/signal/address", options) + + let data = await result.json() + + if(data.status != "success"){ + + alert("failed to get peers signal address") + + return + } + + + PEERS_SIGNAL_ADDRESS = data.reply + + console.log("peersSignalAddr: " + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name) + + + console.log("opened channel for peer signal") + +} + + +(async function (){ + + await initPeers() + +})() \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/public/js/rtmp.js b/0xetc/0xgo/webrtc/public/js/rtmp.js new file mode 100644 index 0000000..a9c2d45 --- /dev/null +++ b/0xetc/0xgo/webrtc/public/js/rtmp.js @@ -0,0 +1,125 @@ +pc = {} + +ws = {} + + + +TURN_SERVER_ADDRESS = {} + + +STREAMING_KEY = "" + +CLIENT_REQ = { + "data":"" +} + +SERVER_RE = { + "status": "", + "reply": "" +} + + + +RTMP_STRUCT = { + + "streaming_key":"", + "description": "" + +} + + + +async function initRTMP(){ + + + pc = new RTCPeerConnection({ +// iceServers: [ +// { +// urls: TURN_SERVER_ADDRESS.addr, +// username: TURN_SERVER_ADDRESS.id, +// credential: TURN_SERVER_ADDRESS.pw +// } +// ] + }) + + pc.oniceconnectionstatechange = function(e) {console.log(pc.iceConnectionState)} + + pc.onicecandidate = async function(event){ + + if (event.candidate === null){ + + + let req = { + data: JSON.stringify(pc.localDescription) + } + + let options = { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(req) + } + + let resp = await fetch("/api/rtmp/open", options) + + let data = await resp.json() + + if (data.status != "success") { + + alert("failed to start cctv offer") + } + try { + + cs = JSON.parse(data.reply) + + console.log(cs) + + let remoteDesc = JSON.parse(cs.description) + + pc.setRemoteDescription(new RTCSessionDescription(remoteDesc)) + + STREAMING_KEY = cs.streaming_key + + alert("streaming address: " + cs.location) + + + } catch (e){ + + alert(e) + } + + } + + + } + + pc.ontrack = function (event) { + + var el = document.createElement(event.track.kind) + el.srcObject = event.streams[0] + el.autoplay = true + el.controls = true + + document.getElementById('cctv-reader').appendChild(el) + + } + + pc.addTransceiver('video') + pc.addTransceiver('audio') + + let offer = await pc.createOffer() + + pc.setLocalDescription(offer) + + console.log("init success") + +} + + + + + + + + diff --git a/0xetc/0xgo/webrtc/setup.sh b/0xetc/0xgo/webrtc/setup.sh new file mode 100755 index 0000000..d825bc5 --- /dev/null +++ b/0xetc/0xgo/webrtc/setup.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +sudo apt update + +sudo apt install coturn -y \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/turn.md b/0xetc/0xgo/webrtc/turn.md new file mode 100644 index 0000000..2ca68d2 --- /dev/null +++ b/0xetc/0xgo/webrtc/turn.md @@ -0,0 +1,25 @@ +sudo vim /etc/default/coturn + +TURNSERVER_ENABLED=1 + +sudo systemctl start coturn + +sudo vim /etc/turnserver.conf + +listening-ip=0.0.0.0 + +listening-port=3478 + +external-ip=feebdaed.xyz/192.168.0.1 + +min-port=3479 max-port=3579 + +verbose + +lt-cred-mech + +user=MYUSER:MYPASS + +realm=feebdaed.xyz + +sudo systemctl restart coturn \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/view/index.html b/0xetc/0xgo/webrtc/view/index.html new file mode 100644 index 0000000..4cc9b1b --- /dev/null +++ b/0xetc/0xgo/webrtc/view/index.html @@ -0,0 +1,22 @@ +{{ define "index.html" }} + + + + + + index + + + + + + index + + video chat: /room/:roomId/:userId + + rtmp: /rtmp + + + + +{{ end }} \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/view/room.html b/0xetc/0xgo/webrtc/view/room.html new file mode 100644 index 0000000..eed0ac8 --- /dev/null +++ b/0xetc/0xgo/webrtc/view/room.html @@ -0,0 +1,61 @@ +{{ define "room.html" }} + + + + + + room + + + + + + +
+
+
+
+
+ Video +

Local Video

+
+
+
+

Remote Video

+
+

+
+
+
+
+
+
+
+ +
+ + + + + + + +{{ end }} \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/view/rtmp.html b/0xetc/0xgo/webrtc/view/rtmp.html new file mode 100644 index 0000000..5549b35 --- /dev/null +++ b/0xetc/0xgo/webrtc/view/rtmp.html @@ -0,0 +1,32 @@ +{{ define "rtmp.html" }} + + + + rtmp + + + + + + +
+
+
+
+
+ rtmp +
+
+
+ + +
+
+
+ + + + + + +{{ end }} \ No newline at end of file diff --git a/0xetc/0xgo/webrtc/webrtc/com.go b/0xetc/0xgo/webrtc/webrtc/com.go new file mode 100644 index 0000000..5b7353a --- /dev/null +++ b/0xetc/0xgo/webrtc/webrtc/com.go @@ -0,0 +1,154 @@ +package webrtc + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "sync" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" +) + +type CLIENT_REQ struct { + Data string `json:"data"` +} + +type SERVER_RE struct { + Status string `json:"status"` + Reply string `json:"reply"` +} + +type RT_REQ_DATA struct { + Command string `json:"command"` + Data string `json:"data"` +} + +type RT_RESP_DATA struct { + Status string `json:"status"` + Data string `json:"data"` +} + +var CHANNEL_ADDR string = "0.0.0.0" + +var CHANNEL_PORT string + +var USER_CHANNEL = make(map[string]*websocket.Conn) + +var CH_CALLBACKS []func() + +var ListLock sync.RWMutex + +type ThreadSafeWriter struct { + *websocket.Conn + sync.Mutex +} + +func GetRtmp(c *gin.Context) { + + c.HTML(200, "rtmp.html", gin.H{}) +} + +func GetRoom(c *gin.Context) { + + roomId := c.Param("roomId") + + userId := c.Param("userId") + + p_users, okay := ROOMREG[roomId] + + if !okay { + fmt.Printf("view room: no such room\n") + + c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"}) + + return + } + + pu_len := len(p_users) + + allowed := 0 + + user_index := -1 + + for i := 0; i < pu_len; i++ { + + if p_users[i].User == userId { + + allowed = 1 + + user_index = i + + break + } + + } + + if allowed != 1 { + + fmt.Printf("view room: user not allowed\n") + + c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"}) + + return + + } + + var pj PeersJoin + + pj.RoomName = roomId + pj.User = p_users[user_index].User + pj.UserKey = p_users[user_index].UserKey + + jb, err := json.Marshal(pj) + + if err != nil { + + fmt.Printf("view room: marshal\n") + + c.JSON(http.StatusInternalServerError, SERVER_RE{Status: "error", Reply: "failed to get room"}) + + return + + } + + c.HTML(200, "room.html", gin.H{ + "room_code": string(jb), + }) + +} + +func (t *ThreadSafeWriter) WriteJSON(v interface{}) error { + t.Lock() + defer t.Unlock() + + return t.Conn.WriteJSON(v) +} + +func AddChannelHandler(channelPath string, channelHandler func(w http.ResponseWriter, r *http.Request)) { + + http.HandleFunc(channelPath, channelHandler) + +} + +func AddChannelCallback(channelFunction func()) { + + CH_CALLBACKS = append(CH_CALLBACKS, channelFunction) +} + +func StartAllChannelHandlers() { + + callback_count := len(CH_CALLBACKS) + + for i := 0; i < callback_count; i++ { + + go CH_CALLBACKS[i]() + + } + + channel_addr := CHANNEL_ADDR + ":" + CHANNEL_PORT + + log.Fatal(http.ListenAndServe(channel_addr, nil)) + +} diff --git a/0xetc/0xgo/webrtc/webrtc/peers.go b/0xetc/0xgo/webrtc/webrtc/peers.go new file mode 100644 index 0000000..62db91a --- /dev/null +++ b/0xetc/0xgo/webrtc/webrtc/peers.go @@ -0,0 +1,521 @@ +package webrtc + +import ( + "encoding/json" + "fmt" + "html" + "log" + "net/http" + "strings" + "sync" + "time" + + "github.com/gin-gonic/gin" + "github.com/pion/rtcp" + "github.com/pion/webrtc/v4" +) + +var URL string = "localhost" + +var PEERS_SIGNAL_PATH string + +var PEER_SIGNAL_ATTEMPT_SYNC int + +type PeersEntryStruct struct { + RoomName []string `json:"room_name"` +} + +type PeersUserStruct struct { + UserKey string `json:"user_key"` + User string `json:"user"` +} + +type PeersCreate struct { + RoomName string `json:"room_name"` + Users []string `json:"users"` +} + +type PeersJoin struct { + RoomName string `json:"room_name"` + User string `json:"user"` + UserKey string `json:"user_key"` +} + +type ChatMessage struct { + User string `json:"user"` + Message string `json:"message"` +} + +var ROOMREG = make(map[string][]PeersUserStruct) + +func GetPeersSignalAddress(c *gin.Context) { + + var s_addr string + + s_addr = URL + ":" + CHANNEL_PORT + PEERS_SIGNAL_PATH + + c.JSON(http.StatusOK, SERVER_RE{Status: "success", Reply: s_addr}) + +} + +func CreatePeers(pc *PeersCreate) { + + fmt.Println("create peers") + + var p_create PeersCreate = *pc + + ROOMREG[p_create.RoomName] = make([]PeersUserStruct, 0) + + u_len := len(p_create.Users) + + for i := 0; i < u_len; i++ { + + ROOMREG[p_create.RoomName] = append(ROOMREG[p_create.RoomName], PeersUserStruct{ + UserKey: p_create.Users[i], + User: p_create.Users[i], + }) + + } + + roomPeerConnections[p_create.RoomName] = []peerConnectionState{} + + roomTrackLocals[p_create.RoomName] = nil + + return + +} + +func roomJoinAuth(c *ThreadSafeWriter) (string, error) { + + timeout_iter_count := 0 + + timeout_iter := TIMEOUT_SEC * 10 + + ticker := time.NewTicker(100 * time.Millisecond) + + received_auth := make(chan RT_REQ_DATA) + + got_auth := 0 + + var req RT_REQ_DATA + + go func() { + + auth_req := RT_REQ_DATA{} + + err := c.ReadJSON(&auth_req) + + if err != nil { + + log.Fatal("read auth:", err) + return + } + + received_auth <- auth_req + + }() + + for got_auth == 0 { + + select { + + case <-ticker.C: + + if timeout_iter_count <= timeout_iter { + + timeout_iter_count += 1 + + } else { + + return "", fmt.Errorf("read auth: timed out") + } + + case a := <-received_auth: + + req = a + + got_auth = 1 + + break + } + + } + + var pj PeersJoin + + err := json.Unmarshal([]byte(req.Data), &pj) + + if err != nil { + + return "", fmt.Errorf("read auth: marshal: %s", err.Error()) + } + + p_users, okay := ROOMREG[pj.RoomName] + + if !okay { + + return "", fmt.Errorf("failed to get okay: %s", "no such room") + } + + pu_len := len(p_users) + + found := 0 + + for i := 0; i < pu_len; i++ { + + if p_users[i].User == pj.User && p_users[i].UserKey == pj.UserKey { + + found = 1 + + break + + } + + } + + if found != 1 { + + return "", fmt.Errorf("no matching user found") + + } + + return pj.User, nil +} + +func RoomSignalHandler(w http.ResponseWriter, r *http.Request) { + // Upgrade HTTP request to Websocket + + UPGRADER.CheckOrigin = func(r *http.Request) bool { return true } + + unsafeConn, err := UPGRADER.Upgrade(w, r, nil) + if err != nil { + log.Printf("upgrade: %s\n", err.Error()) + return + } + + roomParam := strings.TrimPrefix(r.URL.Path, PEERS_SIGNAL_PATH) + + log.Printf("room: %s\n", roomParam) + + _, okay := roomPeerConnections[roomParam] + + if !okay { + + log.Printf("no such room: %s\n", roomParam) + + return + } + + c := &ThreadSafeWriter{unsafeConn, sync.Mutex{}} + + // When this frame returns close the Websocket + defer c.Close() //nolint + + thisUser, err := roomJoinAuth(c) + + if err != nil { + + log.Print("auth:", err) + + return + } + log.Printf("auth success: user: %s, room: %s\n", thisUser, roomParam) + + // Create new PeerConnection + peerConnection, err := api.NewPeerConnection(webrtc.Configuration{ + ICEServers: []webrtc.ICEServer{ + { + URLs: []string{TURN_SERVER_ADDR[0].Addr}, + Username: TURN_SERVER_ADDR[0].Id, + Credential: TURN_SERVER_ADDR[0].Pw, + }, + }, + }) + + if err != nil { + log.Print(err) + return + } + + log.Print("new peerconnection added") + + // When this frame returns close the PeerConnection + defer peerConnection.Close() //nolint + + // Accept one audio and one video track incoming + for _, typ := range []webrtc.RTPCodecType{webrtc.RTPCodecTypeVideo, webrtc.RTPCodecTypeAudio} { + if _, err := peerConnection.AddTransceiverFromKind(typ, webrtc.RTPTransceiverInit{ + Direction: webrtc.RTPTransceiverDirectionRecvonly, + }); err != nil { + log.Print(err) + return + } + } + + // Add our new PeerConnection to global list + ListLock.Lock() + roomPeerConnections[roomParam] = append(roomPeerConnections[roomParam], peerConnectionState{peerConnection, c}) + ListLock.Unlock() + + // Trickle ICE. Emit server candidate to client + peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) { + + log.Printf("got ice candidate\n") + + if i == nil { + return + } + + candidateStringEnc := Encode(i.ToJSON()) + + if writeErr := c.WriteJSON(&SIGNAL_INFO{ + Command: "candidate", + Data: candidateStringEnc, + }); writeErr != nil { + log.Println(writeErr) + } + + log.Printf("sent ice candidate\n") + }) + + // If PeerConnection is closed remove it from global list + peerConnection.OnConnectionStateChange(func(p webrtc.PeerConnectionState) { + switch p { + case webrtc.PeerConnectionStateFailed: + log.Printf("on connection state change: %s \n", p.String()) + if err := peerConnection.Close(); err != nil { + log.Print(err) + } + case webrtc.PeerConnectionStateClosed: + log.Printf("on connection state change: %s \n", p.String()) + signalPeerConnections(roomParam) + default: + log.Printf("on connection state change: %s \n", p.String()) + } + }) + + peerConnection.OnTrack(func(t *webrtc.TrackRemote, _ *webrtc.RTPReceiver) { + // Create a track to fan out our incoming video to all peers + trackLocal := addTrack(roomParam, t) + defer removeTrack(roomParam, trackLocal) + + buf := make([]byte, 1500) + for { + i, _, err := t.Read(buf) + if err != nil { + return + } + + if _, err = trackLocal.Write(buf[:i]); err != nil { + return + } + } + }) + + // Signal for the new PeerConnection + + signalPeerConnections(roomParam) + + message := &SIGNAL_INFO{} + for { + + _, raw, err := c.ReadMessage() + if err != nil { + log.Println(err) + return + } else if err := json.Unmarshal(raw, &message); err != nil { + log.Println(err) + return + } + + log.Printf("got message: %s\n", message.Command) + + switch message.Command { + case "candidate": + + log.Printf("got client ice candidate") + + candidate := webrtc.ICECandidateInit{} + + Decode(message.Data, &candidate) + + /* + if err := json.Unmarshal([]byte(message.Data), &candidate); err != nil { + log.Println(err) + return + } + + */ + if err := peerConnection.AddICECandidate(candidate); err != nil { + log.Println(err) + return + } + + log.Printf("added client ice candidiate") + + case "answer": + answer := webrtc.SessionDescription{} + + Decode(message.Data, &answer) + + /* + if err := json.Unmarshal([]byte(message.Data), &answer); err != nil { + log.Println(err) + return + } + */ + + if err := peerConnection.SetRemoteDescription(answer); err != nil { + log.Println(err) + return + } + + case "chat": + + cm := ChatMessage{ + Message: html.EscapeString(message.Data), + User: thisUser, + } + + jb, err := json.Marshal(cm) + + if err != nil { + + log.Println(err) + + return + } + + message.Data = string(jb) + + broadcastPeerConnections(roomParam, message) + + } + } +} + +func dispatchKeyFrame(k string) { + ListLock.Lock() + defer ListLock.Unlock() + + for i := range roomPeerConnections[k] { + for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() { + if receiver.Track() == nil { + continue + } + + _ = roomPeerConnections[k][i].peerConnection.WriteRTCP([]rtcp.Packet{ + &rtcp.PictureLossIndication{ + MediaSSRC: uint32(receiver.Track().SSRC()), + }, + }) + } + } + +} + +func broadcastPeerConnections(roomName string, message *SIGNAL_INFO) { + + for i := range roomPeerConnections[roomName] { + + roomPeerConnections[roomName][i].websocket.WriteJSON(*message) + + } + +} + +func signalPeerConnections(k string) { + ListLock.Lock() + + defer func() { + ListLock.Unlock() + dispatchKeyFrame(k) + }() + + for syncAttempt := 0; ; syncAttempt++ { + if syncAttempt == PEER_SIGNAL_ATTEMPT_SYNC { + // We might be blocking a RemoveTrack or AddTrack + go func() { + time.Sleep(time.Second * 3) + signalPeerConnections(k) + }() + return + } + + if !attemptSync(k) { + + break + } + } +} + +func attemptSync(k string) bool { + + for i := range roomPeerConnections[k] { + if roomPeerConnections[k][i].peerConnection.ConnectionState() == webrtc.PeerConnectionStateClosed { + roomPeerConnections[k] = append(roomPeerConnections[k][:i], roomPeerConnections[k][i+1:]...) + return true // We modified the slice, start from the beginning + } + + // map of sender we already are sending, so we don't double send + existingSenders := map[string]bool{} + + for _, sender := range roomPeerConnections[k][i].peerConnection.GetSenders() { + if sender.Track() == nil { + continue + } + + existingSenders[sender.Track().ID()] = true + + // If we have a RTPSender that doesn't map to a existing track remove and signal + if _, ok := roomTrackLocals[k][sender.Track().ID()]; !ok { + + if err := roomPeerConnections[k][i].peerConnection.RemoveTrack(sender); err != nil { + return true + } + } + } + + // Don't receive videos we are sending, make sure we don't have loopback + + for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() { + if receiver.Track() == nil { + continue + } + + existingSenders[receiver.Track().ID()] = true + + } + + // Add all track we aren't sending yet to the PeerConnection + for trackID, t := range roomTrackLocals[k] { + + if _, ok := existingSenders[trackID]; !ok { + + if _, err := roomPeerConnections[k][i].peerConnection.AddTrack(t); err != nil { + return true + } + } + } + + offer, err := roomPeerConnections[k][i].peerConnection.CreateOffer(nil) + if err != nil { + return true + } + + if err = roomPeerConnections[k][i].peerConnection.SetLocalDescription(offer); err != nil { + return true + } + + offerStringEnc := Encode(offer) + + if err = roomPeerConnections[k][i].websocket.WriteJSON(&SIGNAL_INFO{ + Command: "offer", + Data: offerStringEnc, + }); err != nil { + return true + } + } + + return false +} diff --git a/0xetc/0xgo/webrtc/webrtc/rtmp.go b/0xetc/0xgo/webrtc/webrtc/rtmp.go new file mode 100644 index 0000000..0261fa7 --- /dev/null +++ b/0xetc/0xgo/webrtc/webrtc/rtmp.go @@ -0,0 +1,313 @@ +package webrtc + +import ( + "bytes" + "encoding/binary" + "encoding/json" + "fmt" + "io" + "log" + "net" + "time" + + "github.com/gin-gonic/gin" + "github.com/pion/webrtc/v4" + "github.com/pion/webrtc/v4/pkg/media" + "github.com/pkg/errors" + + flvtag "github.com/yutopp/go-flv/tag" + "github.com/yutopp/go-rtmp" + rtmpmsg "github.com/yutopp/go-rtmp/message" +) + +var RTP_RECEIVE_ADDR string = "0.0.0.0" + +var RTP_RECEIVE_PORT string + +var RTP_CONSUMERS = make(map[string]RTMPWebRTCPeer) + +const RTP_HEADER_LENGTH_FIELD = 4 + +var TEST_KEY string = "foobar" + +var UDP_BUFFER_BYTE_SIZE int = 65536 + +var RECV_STARTED int = 0 + +type RTMPHandler struct { + rtmp.DefaultHandler + PublisherKey string +} + +type RTMPWebRTCPeer struct { + peerConnection *webrtc.PeerConnection + videoTrack *webrtc.TrackLocalStaticSample + audioTrack *webrtc.TrackLocalStaticSample +} + +type CCTVStruct struct { + Location string `json:"location"` + StreamingKey string `json:"streaming_key"` + Description string `json:"description"` +} + +func RtmpOpen(c *gin.Context) { + + log.Println("incoming rtmp open request") + + peerConnection, err := api.NewPeerConnection(webrtc.Configuration{ + ICEServers: []webrtc.ICEServer{ + { + URLs: []string{TURN_SERVER_ADDR[0].Addr}, + Username: TURN_SERVER_ADDR[0].Id, + Credential: TURN_SERVER_ADDR[0].Pw, + }, + }, + }) + if err != nil { + panic(err) + } + /* + peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { + fmt.Printf("Connection State has changed %s \n", connectionState.String()) + + if connectionState == webrtc.ICEConnectionStateFailed { + if closeErr := peerConnection.Close(); closeErr != nil { + panic(closeErr) + } + } + }) + */ + videoTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion") + if err != nil { + panic(err) + } + if _, err = peerConnection.AddTrack(videoTrack); err != nil { + panic(err) + } + + audioTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypePCMA}, "audio", "pion") + if err != nil { + panic(err) + } + if _, err = peerConnection.AddTrack(audioTrack); err != nil { + panic(err) + } + + var req CLIENT_REQ + + var offer webrtc.SessionDescription + + if err := c.BindJSON(&req); err != nil { + + panic(err) + + } + + err = json.Unmarshal([]byte(req.Data), &offer) + + if err != nil { + + panic(err) + } + + if err := peerConnection.SetRemoteDescription(offer); err != nil { + panic(err) + } + + gatherComplete := webrtc.GatheringCompletePromise(peerConnection) + answer, err := peerConnection.CreateAnswer(nil) + if err != nil { + panic(err) + } else if err = peerConnection.SetLocalDescription(answer); err != nil { + panic(err) + } + <-gatherComplete + + streamingKey, err := GetRandomHex(32) + + if err != nil { + + panic(err) + } + + log.Printf("rtmp key: %s\n", streamingKey) + + RTP_CONSUMERS[streamingKey] = RTMPWebRTCPeer{ + peerConnection: peerConnection, + videoTrack: videoTrack, + audioTrack: audioTrack, + } + + desc_b, err := json.Marshal(peerConnection.LocalDescription()) + + if err != nil { + panic(err) + } + + var resp SERVER_RE + + var cs CCTVStruct + + cs.Location = "rtmp://" + URL + ":" + string(RTP_RECEIVE_PORT) + "/publish/" + streamingKey + + cs.StreamingKey = streamingKey + + cs.Description = string(desc_b) + + cs_b, err := json.Marshal(cs) + + if err != nil { + + panic(err) + + } + + resp.Status = "success" + resp.Reply = string(cs_b) + + c.JSON(200, resp) + +} + +func InitRTMPServer() { + log.Println("starting RTMP Server") + + tcpAddr, err := net.ResolveTCPAddr("tcp", RTP_RECEIVE_ADDR+":"+RTP_RECEIVE_PORT) + if err != nil { + log.Panicf("Failed: %+v", err) + } + + listener, err := net.ListenTCP("tcp", tcpAddr) + if err != nil { + log.Panicf("Failed: %+v", err) + } + + srv := rtmp.NewServer(&rtmp.ServerConfig{ + OnConnect: func(conn net.Conn) (io.ReadWriteCloser, *rtmp.ConnConfig) { + return conn, &rtmp.ConnConfig{ + Handler: &RTMPHandler{}, + + ControlState: rtmp.StreamControlStateConfig{ + DefaultBandwidthWindowSize: 6 * 1024 * 1024 / 8, + }, + } + }, + }) + if err := srv.Serve(listener); err != nil { + log.Panicf("Failed: %+v", err) + } +} + +func (h *RTMPHandler) OnServe(conn *rtmp.Conn) { +} + +func (h *RTMPHandler) OnConnect(timestamp uint32, cmd *rtmpmsg.NetConnectionConnect) error { + log.Printf("OnConnect: %#v", cmd) + return nil +} + +func (h *RTMPHandler) OnCreateStream(timestamp uint32, cmd *rtmpmsg.NetConnectionCreateStream) error { + log.Printf("OnCreateStream: %#v", cmd) + return nil +} + +func (h *RTMPHandler) OnPublish(ctx *rtmp.StreamContext, timestamp uint32, cmd *rtmpmsg.NetStreamPublish) error { + log.Printf("OnPublish: %#v", cmd) + + if cmd.PublishingName == "" { + + log.Printf("publishing name is empty") + + return errors.New("publishing name is empty") + } + + _, okay := RTP_CONSUMERS[cmd.PublishingName] + + if !okay { + + log.Printf("publishing name doesn't exist") + + return errors.New("publishing name doesn't exist") + + } + + h.PublisherKey = cmd.PublishingName + + return nil +} + +func (h *RTMPHandler) OnAudio(timestamp uint32, payload io.Reader) error { + var audio flvtag.AudioData + + consumer, okay := RTP_CONSUMERS[h.PublisherKey] + + if !okay { + + return fmt.Errorf("invalid publisher") + + } + + consumerAudioTrack := consumer.audioTrack + + if err := flvtag.DecodeAudioData(payload, &audio); err != nil { + return err + } + + data := new(bytes.Buffer) + if _, err := io.Copy(data, audio.Data); err != nil { + return err + } + + return consumerAudioTrack.WriteSample(media.Sample{ + Data: data.Bytes(), + Duration: 128 * time.Millisecond, + }) +} + +func (h *RTMPHandler) OnVideo(timestamp uint32, payload io.Reader) error { + var video flvtag.VideoData + + consumer, okay := RTP_CONSUMERS[h.PublisherKey] + + if !okay { + + return fmt.Errorf("invalid publisher") + + } + + consumerVideoTrack := consumer.videoTrack + + if err := flvtag.DecodeVideoData(payload, &video); err != nil { + return err + } + + data := new(bytes.Buffer) + if _, err := io.Copy(data, video.Data); err != nil { + return err + } + + outBuf := []byte{} + videoBuffer := data.Bytes() + for offset := 0; offset < len(videoBuffer); { + bufferLength := int(binary.BigEndian.Uint32(videoBuffer[offset : offset+RTP_HEADER_LENGTH_FIELD])) + if offset+bufferLength >= len(videoBuffer) { + break + } + + offset += RTP_HEADER_LENGTH_FIELD + outBuf = append(outBuf, []byte{0x00, 0x00, 0x00, 0x01}...) + outBuf = append(outBuf, videoBuffer[offset:offset+bufferLength]...) + + offset += int(bufferLength) + } + + return consumerVideoTrack.WriteSample(media.Sample{ + Data: outBuf, + Duration: time.Second / 30, + }) +} + +func (h *RTMPHandler) OnClose() { + log.Printf("OnClose") +} diff --git a/0xetc/0xgo/webrtc/webrtc/stream.go b/0xetc/0xgo/webrtc/webrtc/stream.go new file mode 100644 index 0000000..acf5c33 --- /dev/null +++ b/0xetc/0xgo/webrtc/webrtc/stream.go @@ -0,0 +1,129 @@ +package webrtc + +import ( + "log" + "strings" + "time" + + "github.com/gorilla/websocket" + "github.com/pion/ice/v3" + "github.com/pion/webrtc/v4" +) + +var DEBUG bool = false + +var RTCP_PLI_INTERVAL time.Duration + +var UDP_MUX_PORT int + +var UDP_EPHEMERAL_PORT_MIN int + +var UDP_EPHEMERAL_PORT_MAX int + +var TIMEOUT_SEC int = 30 + +var TURN_SERVER_ADDR []struct { + Addr string `json:"addr"` + Id string `json:"id"` + Pw string `json:"pw"` +} + +var api *webrtc.API + +type SIGNAL_INFO struct { + Command string `json:"command"` + Status string `json:"status"` + Data string `json:"data"` +} + +var UPGRADER = websocket.Upgrader{} + +var roomPeerConnections = make(map[string][]peerConnectionState) + +var roomTrackLocals = make(map[string]map[string]*webrtc.TrackLocalStaticRTP) + +type peerConnectionState struct { + peerConnection *webrtc.PeerConnection + websocket *ThreadSafeWriter +} + +func InitWebRTCApi() { + + settingEngine := webrtc.SettingEngine{} + + var filterFunc func(string) bool = func(ifname string) bool { + + if strings.HasPrefix(ifname, "br-") { + + return false + } else if strings.HasPrefix(ifname, "vir") { + + return false + } else if strings.HasPrefix(ifname, "docker") { + + return false + } + + return true + + } + + ifaceFilter := ice.UDPMuxFromPortWithInterfaceFilter(filterFunc) + mux, err := ice.NewMultiUDPMuxFromPort(UDP_MUX_PORT, ifaceFilter) + + log.Println("creating webrtc api") + + settingEngine.SetICEUDPMux(mux) + if err != nil { + panic(err) + } + + log.Println("created webrtc api") + + settingEngine.SetEphemeralUDPPortRange(uint16(UDP_EPHEMERAL_PORT_MIN), uint16(UDP_EPHEMERAL_PORT_MAX)) + + api = webrtc.NewAPI(webrtc.WithSettingEngine(settingEngine)) + +} + +func SignalDispatcher() { + + for range time.NewTicker(time.Second * RTCP_PLI_INTERVAL).C { + + for k, _ := range roomPeerConnections { + + dispatchKeyFrame(k) + } + + } +} + +func addTrack(k string, t *webrtc.TrackRemote) *webrtc.TrackLocalStaticRTP { + ListLock.Lock() + defer func() { + ListLock.Unlock() + signalPeerConnections(k) + }() + + trackLocal, err := webrtc.NewTrackLocalStaticRTP(t.Codec().RTPCodecCapability, t.ID(), t.StreamID()) + if err != nil { + panic(err) + } + + if roomTrackLocals[k] == nil { + roomTrackLocals[k] = make(map[string]*webrtc.TrackLocalStaticRTP) + } + + roomTrackLocals[k][t.ID()] = trackLocal + return trackLocal +} + +func removeTrack(k string, t *webrtc.TrackLocalStaticRTP) { + ListLock.Lock() + defer func() { + ListLock.Unlock() + signalPeerConnections(k) + }() + + delete(roomTrackLocals, k) +} diff --git a/0xetc/0xgo/webrtc/webrtc/utils.go b/0xetc/0xgo/webrtc/webrtc/utils.go new file mode 100644 index 0000000..8f469a5 --- /dev/null +++ b/0xetc/0xgo/webrtc/webrtc/utils.go @@ -0,0 +1,87 @@ +package webrtc + +import ( + "bytes" + "compress/gzip" + "crypto/rand" + "encoding/base64" + "encoding/hex" + "encoding/json" + "io" +) + +var USE_COMPRESS bool = false + +func GetRandomHex(n int) (string, error) { + bytes := make([]byte, n) + if _, err := rand.Read(bytes); err != nil { + return "", err + } + return hex.EncodeToString(bytes), nil +} + +func Encode(obj interface{}) string { + b, err := json.Marshal(obj) + if err != nil { + panic(err) + } + + if USE_COMPRESS { + b = Zip(b) + } + + return base64.StdEncoding.EncodeToString(b) +} + +// Decode decodes the input from base64 +// It can optionally unzip the input after decoding +func Decode(in string, obj interface{}) { + b, err := base64.StdEncoding.DecodeString(in) + if err != nil { + panic(err) + } + + if USE_COMPRESS { + b = Unzip(b) + } + + err = json.Unmarshal(b, obj) + if err != nil { + panic(err) + } +} + +func Zip(in []byte) []byte { + var b bytes.Buffer + gz := gzip.NewWriter(&b) + _, err := gz.Write(in) + if err != nil { + panic(err) + } + err = gz.Flush() + if err != nil { + panic(err) + } + err = gz.Close() + if err != nil { + panic(err) + } + return b.Bytes() +} + +func Unzip(in []byte) []byte { + var b bytes.Buffer + _, err := b.Write(in) + if err != nil { + panic(err) + } + r, err := gzip.NewReader(&b) + if err != nil { + panic(err) + } + res, err := io.ReadAll(r) + if err != nil { + panic(err) + } + return res +} diff --git a/0xetc/0xgo/websocket/Makefile b/0xetc/0xgo/websocket/Makefile new file mode 100644 index 0000000..804008c --- /dev/null +++ b/0xetc/0xgo/websocket/Makefile @@ -0,0 +1,9 @@ +all: + + go build -o client/client.out ./client + + go build -o server/server.out ./server + + + + diff --git a/0xetc/0xgo/websocket/certgen.sh b/0xetc/0xgo/websocket/certgen.sh new file mode 100755 index 0000000..bdb69b5 --- /dev/null +++ b/0xetc/0xgo/websocket/certgen.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +rm -r ./client/certs/* + +rm -r ./server/certs/* + + +mkdir -p ./client/certs + +mkdir -p ./server/certs + +echo "root generating...." + +openssl genrsa -out ./client/certs/ca_priv.pem 4096 + +openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem + +openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" + +echo "server key pair, csr generating...." + +openssl genrsa -out ./server/certs/server.key 4096 + +openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub + +openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" + +echo "signing requests for server...." + +openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem + + +echo "done!" \ No newline at end of file diff --git a/0xetc/0xgo/websocket/client/certs/ca.pem b/0xetc/0xgo/websocket/client/certs/ca.pem new file mode 100644 index 0000000..0f067d6 --- /dev/null +++ b/0xetc/0xgo/websocket/client/certs/ca.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE/zCCAuegAwIBAgIUFAZ/NqdKQOVulUfJJk7XN13AzzYwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDRaFw0zNDEwMzEwODE3 +MDRaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCVq7U00wHqr7bic/De8n6w/QWKZ8wPSVK0QXokpWGr3FVgWU4D6cDQGEZR +A2qABWKG492a4yBM90NYKvVU6Ilfm0TxoBPqYzfdH0Txt15N/SnnV0DhGkJvDeqU +pfvnZ2+5/iMpLn1ptU03h5Fz4iDTRzKV+xTkWF3vEMOasMfevseSaIJJNaMf97rv +GsqBpRKF6eNqhewtz+gPf4J+2Y0019XCkEoWgIyFs2W3OZOmzNJI1XXXYZU3dsCS +YDK0V0KpNYdlHtPCHQ1gtrbYiIhP8kIYhgbhyGXUSpQoDghUotE0SHK15MBI+oBu +OkQB3+uGbtXw+HW6ReyI6Ks7ICrsQW+eiK/V9pOP6TaNnajRSg7sOBfdJCWOoBNv +6OdfYKgMORjfu8FpPaEca9L+38e0texXCNZt9lWyfHmuRFHF0MnbqDS409AMzhUl +upXbaFpdz6g7F4twAyFdB3pjSsO28toTqKIamXhl1+8D7byC9/sATEEm9/tO44GC ++01Z63R3mazn+9fAjReMEQMw5HtXYHho24zR433VpbTXJ14YMWeJa1VZAw5CRVKi +g5vxjUILIMu5DAi8KZdBjqKNgzT6v/KfjPMPenrHZYMqfXrttkmsU3kAUurOtVE8 +ppEN8fLY3LDONqwrG5hHZWTzeggFHtXSbK0dlhYZsBsPuCltSwIDAQABo1MwUTAd +BgNVHQ4EFgQUWryFapRsKtm4PFy0xy7IciUzQGMwHwYDVR0jBBgwFoAUWryFapRs +Ktm4PFy0xy7IciUzQGMwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAU+dGb3c4G9XDPui89cvrGqJDSytoy6VENvEiF4Vl1KLwbq/nhaDXD5Gh1irr +YmhZJwmV/6wx8hOA9A2ZipETucIGrJ/Zw82WBvJ76T7sXfDd16Pg1XUQVzl28W4/ +8T+BcVNVjSYIh6idQyoxCZ+AC+/ivVaOVwI4vJJh8J1Nlz2EbEw+A5qhkUlfwKOl +beC9WTY2N3Csu/COn8qacPTjrsnCYpN7YkZ+iav0jZit7Mb73XD8FTI86aUt99VU +/jLQ7oHQasX/WcBTTm7e8dsBM/C6PUVj4CbXSkGlXrJeqr09cBrR0Pq3vOVOBXII +9xlczTrbjZlG4/8KULMS4jGE0Ruqer8ULjr/g+b2RRTM3FR0ixuwyiwGN1SjAjNX +2p3FfP3IIo4VzYavfTvxKrOS4FDX+AFEruXLlt6Ufygg8woXyRPGsmRNtTNGElGl +0qSP73zwZX6Uix88ohCMrYPYMb/tk1Buiw8cGiNPZeSP/3Q4sg3yC7yQm8aPIS+U +J0Wwgm+bFMpsAO5B9DDeFRx2P2ygULSl1gMZnfHblhJSu563odrTVeOqeyF1kjSp +evXyeTXX+SMKV2UUl2z15bk+T+8f6TMt2bYyvMhF1uK8kxWIfWMlg+2c4vAJRJhM +gQ4YdEf2xD90PoEkoI6JNZFzEbViprDo68qYFnXHwK4haNE= +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/websocket/client/certs/ca_priv.pem b/0xetc/0xgo/websocket/client/certs/ca_priv.pem new file mode 100644 index 0000000..bf7e8e4 --- /dev/null +++ b/0xetc/0xgo/websocket/client/certs/ca_priv.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +g9mNZa3rFeivom6DV1fJp7UHkKlA4g== +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/websocket/client/certs/ca_pub.pem b/0xetc/0xgo/websocket/client/certs/ca_pub.pem new file mode 100644 index 0000000..70f3dcd --- /dev/null +++ b/0xetc/0xgo/websocket/client/certs/ca_pub.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlau1NNMB6q+24nPw3vJ+ +sP0FimfMD0lStEF6JKVhq9xVYFlOA+nA0BhGUQNqgAVihuPdmuMgTPdDWCr1VOiJ +X5tE8aAT6mM33R9E8bdeTf0p51dA4RpCbw3qlKX752dvuf4jKS59abVNN4eRc+Ig +00cylfsU5Fhd7xDDmrDH3r7HkmiCSTWjH/e67xrKgaUShenjaoXsLc/oD3+CftmN +NNfVwpBKFoCMhbNltzmTpszSSNV112GVN3bAkmAytFdCqTWHZR7Twh0NYLa22IiI +T/JCGIYG4chl1EqUKA4IVKLRNEhyteTASPqAbjpEAd/rhm7V8Ph1ukXsiOirOyAq +7EFvnoiv1faTj+k2jZ2o0UoO7DgX3SQljqATb+jnX2CoDDkY37vBaT2hHGvS/t/H +tLXsVwjWbfZVsnx5rkRRxdDJ26g0uNPQDM4VJbqV22haXc+oOxeLcAMhXQd6Y0rD +tvLaE6iiGpl4ZdfvA+28gvf7AExBJvf7TuOBgvtNWet0d5ms5/vXwI0XjBEDMOR7 +V2B4aNuM0eN91aW01ydeGDFniWtVWQMOQkVSooOb8Y1CCyDLuQwIvCmXQY6ijYM0 ++r/yn4zzD3p6x2WDKn167bZJrFN5AFLqzrVRPKaRDfHy2NywzjasKxuYR2Vk83oI +BR7V0mytHZYWGbAbD7gpbUsCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/websocket/client/main.go b/0xetc/0xgo/websocket/client/main.go new file mode 100644 index 0000000..6d4496f --- /dev/null +++ b/0xetc/0xgo/websocket/client/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "log" + "os" + + "github.com/gorilla/websocket" +) + +type CommJSON struct { + Data string `json:"data"` +} + +func run() error { + + certpool := x509.NewCertPool() + + file_ca, err := os.ReadFile("certs/ca.pem") + + if err != nil { + + return fmt.Errorf("failed to connect: read ca: %s", err.Error()) + } + + okay := certpool.AppendCertsFromPEM(file_ca) + + if !okay { + + return fmt.Errorf("failed to connect: add ca") + } + + websocket.DefaultDialer.TLSClientConfig = &tls.Config{ + RootCAs: certpool, + } + + c, _, err := websocket.DefaultDialer.Dial("wss://localhost:8888/hello", nil) + + if err != nil { + + return fmt.Errorf("failed to connect: dial: %s", err.Error()) + } + + req := CommJSON{ + Data: "hi", + } + + resp := CommJSON{} + + err = c.WriteJSON(req) + + if err != nil { + + return fmt.Errorf("failed to write: %s", err.Error()) + + } + + err = c.ReadJSON(&resp) + + if err != nil { + + return fmt.Errorf("failed to read: %s", err.Error()) + } + + log.Printf("server data: %s\n", resp.Data) + + return nil +} + +func main() { + + if err := run(); err != nil { + + log.Fatal(err.Error()) + } + +} diff --git a/0xetc/0xgo/websocket/server/certs/server.csr b/0xetc/0xgo/websocket/server/certs/server.csr new file mode 100644 index 0000000..1c45ad2 --- /dev/null +++ b/0xetc/0xgo/websocket/server/certs/server.csr @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxrL5Wu2nk7bqI+mIfEL+D0 +6RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQfZm41DHQjLVEfvR/zd+i +0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rkznVQhiA4m4mz3s4e+Qbd +LJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQgiVWMsx+ZAaPARMBdu+I +bLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X82hrxW11Qme3B/4I9o7re +RF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/lih5wULOh/g4cVrKVOrG +JJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJOrUd4c1wUDaiu9ZXpGUdl +Den7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKeA3dmH1AeG+jfT/BIBAOn +14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/vKhBIKkuiUl4RcHD5MEt +BTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPURujtYsN5N5EUvrnQCAV9 +Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGUS7jRieTuBT+7HPqt1H6V +Gh8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQANCCvGhAnI6lmBjKV0iE7G+rKV +KHB7nG4p4TRQcmy6o1/wVyGMBRHvowtvvcmX0wsfPX92g7exJr7sD+OvesDcG6Zi +/Ve/W3B3HKCiCXAQdfjHlunleqs8UtXlDg595OsnRdXM/lIG846oRvDtNEXSbga4 +vNyEcvsz96mzpekO+PYM9/txvMm4EA8XEdOw/Vfrfinw2Z2JHlbt/iyylbK9tDbj +SGV5iK/8alSdUhGe5HFJKy2mv1VpOiTtpAF9jNp0ZZ2Dlz6PKdhVndZOiYHexMRT +PTplq1khuokySRUxlXwhWva2rRFMWHtG/K9PLansvN1vT0i+fkp46kpyHEkzhljS +zF7Epb+5iffjwqyLLfU3w6yVnuan4KLUmllS4WNoHirBPNSMgvgJ+1YN4zsyI0UR +DENWQCMkxrQs8YiraavY5ATP2gQM/GbODa4ExX0ZT83IoffeqlXdS0Yjh84AeZ9m +yv32VMLTm+gOa2CjOSDTvUSdcFvTMU2bmoxSnJnj+8r/dnL+uB6mciAO54jc3B9I +0LBO0YYFYvIfmOU+aYYHriG9pf3B4GAwF6sbOQxhYGK2iaaBhf2y2RbOlENxcOza +y+NHUc/H0gLJd8RJ+0WxedqxuCvz2cZ2myEl3+wSGyrR4XEDkJohIwH9j5ogf8a2 +NYzZl+hZcN1MeEe1mQ== +-----END CERTIFICATE REQUEST----- diff --git a/0xetc/0xgo/websocket/server/certs/server.key b/0xetc/0xgo/websocket/server/certs/server.key new file mode 100644 index 0000000..22f4510 --- /dev/null +++ b/0xetc/0xgo/websocket/server/certs/server.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +SU4uK7xkjfLHk93yJH5gTzmq8Ol2 +-----END PRIVATE KEY----- diff --git a/0xetc/0xgo/websocket/server/certs/server.pem b/0xetc/0xgo/websocket/server/certs/server.pem new file mode 100644 index 0000000..af41410 --- /dev/null +++ b/0xetc/0xgo/websocket/server/certs/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCTCCAvGgAwIBAgIUPv8CXUm2Dfb1zIxZic8wGRFtg9AwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDVaFw0yNTExMDIwODE3 +MDVaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALenm0HNZtsaHVvu2LEsay+Vrtp5O26iPpiHxC/g9OkVHRDm64QU +2bmrcHgQjPjTdiOhqTbnPaCCXI5LGwJg0H2ZuNQx0Iy1RH70f83fotKMeWmYSusE +ahOSyiqayqIevacvTNLFrASFIkkL4A+q5M51UIYgOJuJs97OHvkG3SyU4WPMRmxe +DS5pXKVCvQFYfbYTD7hmFRrp/4oVTd8H0IIlVjLMfmQGjwETAXbviGy0C0G64maj +Gc+hA0twQSUW13nY8lrc3PJ7rOFV33vl/Noa8VtdUJntwf+CPaO63kRd4vgy752W +ZKCuiBYHFdEh4Pu5QkkKzQlUWnPDf6qEf5YoecFCzof4OHFaylTqxiSWva+bumLa +chjmOZuPSePMQqW6tVpm3NFVvWND3GZCTq1HeHNcFA2orvWV6RlHZQ3p+xw5dYe0 +lCsORiW8gJPADUfZMcEtxq62ZKS+ohgCngN3Zh9QHhvo30/wSAQDp9eGysGSFaxy +kJCj/IXGXij35Se6hYe+Wcn0jJ7miLUBv7yoQSCpLolJeEXBw+TBLQUx9jss21km +78cy4Lw3X3cGeFVVUmlvYl5wG9Eiwo1z1Ebo7WLDeTeRFL650AgFfWM9sBW6AUIp +ly4XmwY7GUvuXUAoZ3DfpGhkXCLjyriBlEu40Ynk7gU/uxz6rdR+lRofAgMBAAGj +WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU1PBtM/5U3mtg85f5 +tgBP1JQ0y+0wHwYDVR0jBBgwFoAUWryFapRsKtm4PFy0xy7IciUzQGMwDQYJKoZI +hvcNAQELBQADggIBAF1jwJ/Om0GcOnKGSJYaqxJydYyqcDhEgxODMGgNoDd2yNN8 +74E29G41cwZe3eATw2PstXXicFLZTz1Nhu457BqvGgxwz8lsKXreDNLczuTr6KTh ++S/9CCONQ0bkLu3pJLdkfEEWxYNYyI9Nz35WJt24ESSyKBTxka7y3NBgVwGrN4Ys +Tk8PtvgCVBRS1SD08WKoVhaD03M2wWJu2zvwcVqfYZxqgWxO+c5ElE/IF92WI3Gn +jP8dL2qbsN7dGHi0JV9uzukc4PTVNnwdEodCDgufhcrtvTpR4KsGktHqzXXiQsGy +hVMpx7yO+BCsjLCfCkbZXaXazp2PXLhIrAwhg3HFDbyESKJiAXQUGSlaNXD06UeT +zZfHDl/8hswnFdJLhS2eAahAh7n0FRLGHHx0BIk/FLktzzAZouQlSw4HXm/710GZ +8Z2agRv5g9e6bg7afks9grj4IhcZyCUNOQeZD/6+KBd97TqnfaYgFQzd192m+7eb +WBbuLnx5INHzBjmbmLAUP4OZ+t5krOeWQMxUQOJUHtts0cs7K3EI2PB4pf+KRDy/ +Ij9KkYtOJ7WEmSy1JlR7vQEuAgZ80PLjHsjndJO+hOUdaqdkwgKHkkHdh9NQ8TQx +AFyG5CSFHgGPPgJV2yaI/mIbzMxvuTnazhFyFjMXqWGyGxluchpmJWRfKxt6 +-----END CERTIFICATE----- diff --git a/0xetc/0xgo/websocket/server/certs/server.pub b/0xetc/0xgo/websocket/server/certs/server.pub new file mode 100644 index 0000000..0eec661 --- /dev/null +++ b/0xetc/0xgo/websocket/server/certs/server.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxr +L5Wu2nk7bqI+mIfEL+D06RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQ +fZm41DHQjLVEfvR/zd+i0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rk +znVQhiA4m4mz3s4e+QbdLJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQ +giVWMsx+ZAaPARMBdu+IbLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X8 +2hrxW11Qme3B/4I9o7reRF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/ +lih5wULOh/g4cVrKVOrGJJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJO +rUd4c1wUDaiu9ZXpGUdlDen7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKe +A3dmH1AeG+jfT/BIBAOn14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/ +vKhBIKkuiUl4RcHD5MEtBTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPU +RujtYsN5N5EUvrnQCAV9Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGU +S7jRieTuBT+7HPqt1H6VGh8CAwEAAQ== +-----END PUBLIC KEY----- diff --git a/0xetc/0xgo/websocket/server/main.go b/0xetc/0xgo/websocket/server/main.go new file mode 100644 index 0000000..e3bbe1d --- /dev/null +++ b/0xetc/0xgo/websocket/server/main.go @@ -0,0 +1,88 @@ +package main + +import ( + "log" + "net/http" + "time" + + "github.com/gorilla/websocket" +) + +type CommJSON struct { + Data string `json:"data"` +} + +func clientHandler(w http.ResponseWriter, r *http.Request) { + + log.Println("client access") + + u := websocket.Upgrader{} + + u.CheckOrigin = func(r *http.Request) bool { return true } + + c, err := u.Upgrade(w, r, nil) + if err != nil { + log.Printf("client upgrade: %s\n", err.Error()) + return + } + + c.SetReadDeadline(time.Time{}) + + defer c.Close() + + log.Printf("client accepted") + + for { + + req := CommJSON{} + + resp := CommJSON{} + + err := c.ReadJSON(&req) + + if err != nil { + + log.Printf("client handle: client gone") + + _ = c.Close() + + return + + } + + log.Printf("client data: %s\n", req.Data) + + resp.Data = req.Data + + err = c.WriteJSON(resp) + + if err != nil { + + log.Printf("failed to write: %s", err.Error()) + + _ = c.Close() + + return + } + + } + +} + +func run() error { + + http.HandleFunc("/hello", clientHandler) + + log.Fatal(http.ListenAndServeTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key", nil)) + + return nil +} + +func main() { + + if err := run(); err != nil { + + log.Fatal(err.Error()) + } + +} diff --git a/0xgo/automation/main.go b/0xgo/automation/main.go deleted file mode 100644 index 77c0f96..0000000 --- a/0xgo/automation/main.go +++ /dev/null @@ -1,107 +0,0 @@ -package main - -import ( - "fmt" - "strconv" - - "github.com/go-vgo/robotgo" - "github.com/vcaesar/imgo" -) - -func Wheel() { - - robotgo.MouseSleep = 100 - - robotgo.ScrollDir(10, "up") - robotgo.ScrollDir(20, "right") - - robotgo.Scroll(0, -10) - robotgo.Scroll(100, 0) - - robotgo.MilliSleep(100) - robotgo.ScrollSmooth(-10, 6) - // robotgo.ScrollRelative(10, -100) - - robotgo.Move(10, 20) - robotgo.MoveRelative(0, -10) - robotgo.DragSmooth(10, 10) - - robotgo.Click("wheelRight") - robotgo.Click("left", true) - robotgo.MoveSmooth(100, 200, 1.0, 10.0) - - robotgo.Toggle("left") - robotgo.Toggle("left", "up") - -} - -func Keyboard() { - - robotgo.TypeStr("Hello World") - robotgo.TypeStr("だんしゃり", 0, 1) - // robotgo.TypeStr("テストする") - - robotgo.TypeStr("Hi, Seattle space needle, Golden gate bridge, One world trade center.") - robotgo.TypeStr("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.") - robotgo.Sleep(1) - - // ustr := uint32(robotgo.CharCodeAt("Test", 0)) - // robotgo.UnicodeType(ustr) - - robotgo.KeySleep = 100 - robotgo.KeyTap("enter") - // robotgo.TypeStr("en") - robotgo.KeyTap("i", "alt", "cmd") - - arr := []string{"alt", "cmd"} - robotgo.KeyTap("i", arr) - - robotgo.MilliSleep(100) - robotgo.KeyToggle("a") - robotgo.KeyToggle("a", "up") - - robotgo.WriteAll("Test") - text, err := robotgo.ReadAll() - if err == nil { - fmt.Println(text) - } - -} - -func Screenshot() { - x, y := robotgo.Location() - fmt.Println("pos: ", x, y) - - color := robotgo.GetPixelColor(100, 200) - fmt.Println("color---- ", color) - - sx, sy := robotgo.GetScreenSize() - fmt.Println("get screen size: ", sx, sy) - - bit := robotgo.CaptureScreen(10, 10, 30, 30) - defer robotgo.FreeBitmap(bit) - - img := robotgo.ToImage(bit) - imgo.Save("test.png", img) - - num := robotgo.DisplaysNum() - for i := 0; i < num; i++ { - robotgo.DisplayID = i - img1, _ := robotgo.CaptureImg() - path1 := "save_" + strconv.Itoa(i) - robotgo.Save(img1, path1+".png") - robotgo.SaveJpeg(img1, path1+".jpeg", 50) - - img2, _ := robotgo.CaptureImg(10, 10, 20, 20) - robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png") - } -} - -func main() { - - //Wheel() - - Keyboard() - - //Screenshot() -} diff --git a/0xgo/binary/Makefile b/0xgo/binary/Makefile deleted file mode 100644 index 021938f..0000000 --- a/0xgo/binary/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - go build -o test.out . \ No newline at end of file diff --git a/0xgo/binary/main.go b/0xgo/binary/main.go deleted file mode 100644 index 1e9566c..0000000 --- a/0xgo/binary/main.go +++ /dev/null @@ -1,136 +0,0 @@ -package main - -import ( - "encoding/binary" - "fmt" - "net" - "unsafe" -) - -/* - -#define _GNU_SOURCE -#include -#include -#include -#include - -void print_raw_uint32(int value){ - - uint32_t uval = (uint32_t)value; - - printf("uval: %u\n", uval); - - uint8_t arr[4] = {0}; - - memcpy(arr, &uval, 4); - - for(int i = 0; i < 4; i++){ - - printf("%x ", arr[i]); - - } - - printf("\n"); - -} - -*/ -import "C" - -func main() { - - var i uint32 = 0x0100 - ptr := unsafe.Pointer(&i) - if 0x01 == *(*byte)(ptr) { - fmt.Println("Big Endian") - } else if 0x00 == *(*byte)(ptr) { - fmt.Println("Little Endian") - } - - ipstring := "10.1.10.2" - - ipbytes := net.ParseIP(ipstring).To4() - - fmt.Println(ipbytes) - - testle := binary.LittleEndian.Uint32(ipbytes) - - testbe := binary.BigEndian.Uint32(ipbytes) - - testne := binary.NativeEndian.Uint32(ipbytes) - - fmt.Println("le==========") - - C.print_raw_uint32(C.int(testle)) - - fmt.Println("be==========") - - C.print_raw_uint32(C.int(testbe)) - - fmt.Println("ne==========") - - C.print_raw_uint32(C.int(testne)) - - fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne) - - lebytes := make([]byte, 4) - bebytes := make([]byte, 4) - nebytes := make([]byte, 4) - - binary.LittleEndian.PutUint32(lebytes, testle) - - binary.BigEndian.PutUint32(bebytes, testbe) - - binary.NativeEndian.PutUint32(nebytes, testne) - - fmt.Printf("%d %d %d %d\n", lebytes[0], lebytes[1], lebytes[2], lebytes[3]) - - fmt.Printf("%d %d %d %d\n", bebytes[0], bebytes[1], bebytes[2], bebytes[3]) - - fmt.Printf("%d %d %d %d\n", nebytes[0], nebytes[1], nebytes[2], nebytes[3]) - - testle = binary.LittleEndian.Uint32(lebytes) - - testbe = binary.BigEndian.Uint32(bebytes) - - testne = binary.NativeEndian.Uint32(nebytes) - - fmt.Printf("le: %d, be: %d, ne: %d\n", testle, testbe, testne) - - fmt.Println("ntohl") - - in := testbe - - fmt.Printf("in: %d\n", in) - - C.print_raw_uint32(C.int(in)) - - tmp := make([]byte, 4) - - binary.BigEndian.PutUint32(tmp, in) - - out := binary.LittleEndian.Uint32(tmp) - - fmt.Printf("out: %d\n", out) - - C.print_raw_uint32(C.int(out)) - - fmt.Println("htonl") - - in = out - - fmt.Printf("in: %d\n", in) - - C.print_raw_uint32(C.int(in)) - - tmp = make([]byte, 4) - - binary.LittleEndian.PutUint32(tmp, in) - - out = binary.BigEndian.Uint32(tmp) - - fmt.Printf("out: %d\n", out) - - C.print_raw_uint32(C.int(out)) -} diff --git a/0xgo/c-lib/Makefile b/0xgo/c-lib/Makefile deleted file mode 100644 index 691f558..0000000 --- a/0xgo/c-lib/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -all: - - go build -o c2go.out . - - -clean: - - rm -r *.out \ No newline at end of file diff --git a/0xgo/c-lib/go2c/Makefile b/0xgo/c-lib/go2c/Makefile deleted file mode 100644 index 143088c..0000000 --- a/0xgo/c-lib/go2c/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: - - go build -buildmode=c-shared -o go2c.so . - -clean: - - rm -r *.h *.so \ No newline at end of file diff --git a/0xgo/c-lib/go2c/go2c.h b/0xgo/c-lib/go2c/go2c.h deleted file mode 100644 index 924700f..0000000 --- a/0xgo/c-lib/go2c/go2c.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Code generated by cmd/cgo; DO NOT EDIT. */ - -/* package github.com/seantywork/0xgo/c-lib/go2c */ - - -#line 1 "cgo-builtin-export-prolog" - -#include - -#ifndef GO_CGO_EXPORT_PROLOGUE_H -#define GO_CGO_EXPORT_PROLOGUE_H - -#ifndef GO_CGO_GOSTRING_TYPEDEF -typedef struct { const char *p; ptrdiff_t n; } _GoString_; -#endif - -#endif - -/* Start of preamble from import "C" comments. */ - - - - -/* End of preamble from import "C" comments. */ - - -/* Start of boilerplate cgo prologue. */ -#line 1 "cgo-gcc-export-header-prolog" - -#ifndef GO_CGO_PROLOGUE_H -#define GO_CGO_PROLOGUE_H - -typedef signed char GoInt8; -typedef unsigned char GoUint8; -typedef short GoInt16; -typedef unsigned short GoUint16; -typedef int GoInt32; -typedef unsigned int GoUint32; -typedef long long GoInt64; -typedef unsigned long long GoUint64; -typedef GoInt64 GoInt; -typedef GoUint64 GoUint; -typedef size_t GoUintptr; -typedef float GoFloat32; -typedef double GoFloat64; -#ifdef _MSC_VER -#include -typedef _Fcomplex GoComplex64; -typedef _Dcomplex GoComplex128; -#else -typedef float _Complex GoComplex64; -typedef double _Complex GoComplex128; -#endif - -/* - static assertion to make sure the file is being used on architecture - at least with matching size of GoInt. -*/ -typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; - -#ifndef GO_CGO_GOSTRING_TYPEDEF -typedef _GoString_ GoString; -#endif -typedef void *GoMap; -typedef void *GoChan; -typedef struct { void *t; void *v; } GoInterface; -typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; - -#endif - -/* End of boilerplate cgo prologue. */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern GoInt Add(GoInt a, GoInt b); -extern GoFloat64 Cosine(GoFloat64 x); -extern void Sort(GoSlice vals); -extern GoInt Log(GoString msg); - -#ifdef __cplusplus -} -#endif diff --git a/0xgo/c-lib/go2c/main.go b/0xgo/c-lib/go2c/main.go deleted file mode 100644 index 974b1dc..0000000 --- a/0xgo/c-lib/go2c/main.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -import "C" - -import ( - "fmt" - "math" - "sort" - "sync" -) - -var count int -var mtx sync.Mutex - -//export Add -func Add(a, b int) int { - return a + b -} - -//export Cosine -func Cosine(x float64) float64 { - return math.Cos(x) -} - -//export Sort -func Sort(vals []int) { - sort.Ints(vals) -} - -//export Log -func Log(msg string) int { - mtx.Lock() - defer mtx.Unlock() - fmt.Println(msg) - count++ - return count -} - -func main() {} diff --git a/0xgo/c-lib/main.go b/0xgo/c-lib/main.go deleted file mode 100644 index 0205bc2..0000000 --- a/0xgo/c-lib/main.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -/* -#cgo CFLAGS: -g -Wall -I../../go-c-lib/c2go -#cgo LDFLAGS: -L../../go-c-lib/c2go -Wl,-rpath=../../go-c-lib/c2go -lc2go -#include "c2go.h" -*/ -import "C" -import ( - "fmt" -) - -type ( - Person C.struct_APerson -) - -func (p *Person) Name() string { - return C.GoString(p.name) -} - -func (p *Person) LongName() string { - return C.GoString(p.long_name) -} - -func GetPerson(name string, long_name string) *Person { - return (*Person)(C.get_person(C.CString(name), C.CString(long_name))) -} - -func main() { - var f *Person - f = GetPerson("seanty", "work") - fmt.Printf("Hello Go world: My name is %s, %s.\n", C.GoString(f.name), C.GoString(f.long_name)) - - fmt.Printf("Hello Go world: My name is %s, %s.\n", f.Name(), f.LongName()) -} diff --git a/0xgo/crawler/main.go b/0xgo/crawler/main.go deleted file mode 100644 index a0bad0e..0000000 --- a/0xgo/crawler/main.go +++ /dev/null @@ -1,21 +0,0 @@ -package main - -import ( - "fmt" - - colly "github.com/gocolly/colly/v2" -) - -func main() { - c := colly.NewCollector() - - c.OnHTML("a[href]", func(e *colly.HTMLElement) { - e.Request.Visit(e.Attr("href")) - }) - - c.OnRequest(func(r *colly.Request) { - fmt.Println("Visiting", r.URL) - }) - - c.Visit("http://go-colly.org/") -} diff --git a/0xgo/crypt/Makefile b/0xgo/crypt/Makefile deleted file mode 100644 index b92a1b7..0000000 --- a/0xgo/crypt/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -all: - - go build -o test.out . - - -clean: - - rm -rf *.out \ No newline at end of file diff --git a/0xgo/crypt/asym/asym.go b/0xgo/crypt/asym/asym.go deleted file mode 100644 index f1041d8..0000000 --- a/0xgo/crypt/asym/asym.go +++ /dev/null @@ -1,357 +0,0 @@ -package pki - -import ( - "crypto/rand" - "crypto/sha512" - "crypto/x509/pkix" - "errors" - "fmt" - "log" - "math/big" - mathrand "math/rand" - "time" - - "crypto/rsa" - "crypto/x509" - "encoding/pem" -) - -type CertSet struct { - RootCertPEM []byte - RootKeyPEM []byte - RootPubPEM []byte - ClientCertPEM []byte - ClientKeyPEM []byte - ClientPubPEM []byte - ServCertPEM []byte - ServKeyPEM []byte - ServPubPEM []byte -} - -func GenerateKeyPair(bits int) (*rsa.PrivateKey, *rsa.PublicKey, error) { - - var pubkey *rsa.PublicKey - - privkey, err := rsa.GenerateKey(rand.Reader, bits) - if err != nil { - return privkey, pubkey, fmt.Errorf("failed to gen key pair: %s", err.Error()) - } - - pubkey = &privkey.PublicKey - - return privkey, pubkey, nil -} - -func PrivateKeyToBytes(priv *rsa.PrivateKey) ([]byte, error) { - var ret_byte []byte - privBytes := pem.EncodeToMemory( - &pem.Block{ - Type: "RSA PRIVATE KEY", - Bytes: x509.MarshalPKCS1PrivateKey(priv), - }, - ) - - if privBytes == nil { - return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid") - } - - return privBytes, nil -} - -func PublicKeyToBytes(pub *rsa.PublicKey) ([]byte, error) { - - var ret_byte []byte - - pubASN1, err := x509.MarshalPKIXPublicKey(pub) - if err != nil { - return pubASN1, fmt.Errorf("failed to encode pub key to bytes: %s", err.Error()) - } - - pubBytes := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PUBLIC KEY", - Bytes: pubASN1, - }) - - if pubBytes == nil { - return ret_byte, fmt.Errorf("failed to encode priv key to bytes: %s", "invalid") - } - - return pubBytes, nil -} - -func CertToBytes(crt *x509.Certificate) ([]byte, error) { - - cert_b := crt.Raw - - certBytes := pem.EncodeToMemory(&pem.Block{ - Type: "CERTIFICATE", - Bytes: cert_b, - }) - - if certBytes == nil { - - return nil, fmt.Errorf("failed to encode cert to bytes: %s", "invalid") - } - - return certBytes, nil - -} - -func BytesToPrivateKey(priv []byte) (*rsa.PrivateKey, error) { - - var privkey *rsa.PrivateKey - - block, _ := pem.Decode(priv) - enc := x509.IsEncryptedPEMBlock(block) - b := block.Bytes - var err error - if enc { - fmt.Println("is encrypted pem block") - b, err = x509.DecryptPEMBlock(block, nil) - if err != nil { - return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error()) - } - } - key, err := x509.ParsePKCS1PrivateKey(b) - if err != nil { - return privkey, fmt.Errorf("failed to decode bytes to priv key: %s", err.Error()) - } - return key, nil -} - -func BytesToPublicKey(pub []byte) (*rsa.PublicKey, error) { - - var pubkey *rsa.PublicKey - - block, _ := pem.Decode(pub) - enc := x509.IsEncryptedPEMBlock(block) - b := block.Bytes - var err error - if enc { - fmt.Println("is encrypted pem block") - b, err = x509.DecryptPEMBlock(block, nil) - if err != nil { - return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error()) - } - } - ifc, err := x509.ParsePKIXPublicKey(b) - if err != nil { - return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error()) - } - key, ok := ifc.(*rsa.PublicKey) - if !ok { - return pubkey, fmt.Errorf("failed to decode bytes to pub key: %s", err.Error()) - } - return key, nil -} - -func BytesToCert(cert []byte) (*x509.Certificate, error) { - - var ret_crt *x509.Certificate - - block, _ := pem.Decode(cert) - - ifc, err := x509.ParseCertificate(block.Bytes) - - if err != nil { - - return ret_crt, fmt.Errorf("failed to decode bytes to certificate: %s", err.Error()) - } - - ret_crt = ifc - - return ret_crt, nil -} - -func EncryptWithPublicKey(msg []byte, pub *rsa.PublicKey) ([]byte, error) { - hash := sha512.New() - ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil) - if err != nil { - return ciphertext, fmt.Errorf("failed to encrypt with public key: %s", err.Error()) - } - return ciphertext, nil -} - -func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) ([]byte, error) { - hash := sha512.New() - plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil) - if err != nil { - return plaintext, fmt.Errorf("failed to decrypt with private key: %s", err.Error()) - } - return plaintext, nil -} - -func GetRandIntInRange(min int, max int) int { - - mathrand.Seed(time.Now().UnixNano()) - - return mathrand.Intn(max-min+1) + min -} - -func GenKeyPair(keylen int) (*rsa.PrivateKey, *rsa.PublicKey) { - - bitSize := keylen - - key, err := rsa.GenerateKey(rand.Reader, bitSize) - if err != nil { - panic(err) - } - - pub := key.Public() - - return key, pub.(*rsa.PublicKey) -} - -func CertTemplate(cn string, validYear int) (*x509.Certificate, error) { - // generate a random serial number (a real cert authority would have some logic behind this) - serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) - serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) - if err != nil { - return nil, errors.New("failed to generate serial number: " + err.Error()) - } - - if err != nil { - - return nil, fmt.Errorf("failed to gen cert tmpl: %s", err.Error()) - } - - tmpl := x509.Certificate{ - SerialNumber: serialNumber, - Subject: pkix.Name{CommonName: cn}, - SignatureAlgorithm: x509.SHA256WithRSA, - NotBefore: time.Now(), - NotAfter: time.Now().Add(time.Hour * 24 * 30 * 12 * time.Duration(validYear)), - BasicConstraintsValid: true, - DNSNames: []string{ - cn, - }, - } - return &tmpl, nil -} - -func CreateCert(template, parent *x509.Certificate, pub interface{}, parentPriv interface{}) (cert *x509.Certificate, certPEM []byte, err error) { - - certDER, err := x509.CreateCertificate(rand.Reader, template, parent, pub, parentPriv) - if err != nil { - return - } - // parse the resulting certificate so we can use it again - cert, err = x509.ParseCertificate(certDER) - if err != nil { - return - } - // PEM encode the certificate (this is a standard TLS encoding) - b := pem.Block{Type: "CERTIFICATE", Bytes: certDER} - certPEM = pem.EncodeToMemory(&b) - - return -} - -func NewCertsPipeline(server_name string, client_name string) *CertSet { - // generate a new key-pair - rootKey, rootPub := GenKeyPair(4096) - - rootCertTmpl, err := CertTemplate("ca", 10) - if err != nil { - log.Fatalf("creating cert template: %v", err) - } - - // this cert will be the CA that we will use to sign the server cert - rootCertTmpl.IsCA = true - // describe what the certificate will be used for - rootCertTmpl.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature - rootCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth} - - log.Println("----------ca cert") - - rootCert, rootCertPEM, err := CreateCert(rootCertTmpl, rootCertTmpl, rootPub, rootKey) - if err != nil { - log.Fatalf("error creating cert: %v", err) - } - - // provide the private key and the cert - rootKeyPEM := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rootKey), - }) - - rootPubPEM := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(rootPub), - }) - - /******************************************************************* - Server Cert - *******************************************************************/ - - // create a key-pair for the server - servKey, servPub := GenKeyPair(4096) - - log.Println("----------server cert") - // create a template for the server - servCertTmpl, err := CertTemplate(server_name, 1) - if err != nil { - log.Fatalf("creating cert template: %v", err) - } - servCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature - servCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth} - - // create a certificate which wraps the server's public key, sign it with the root private key - _, servCertPEM, err := CreateCert(servCertTmpl, rootCert, servPub, rootKey) - if err != nil { - log.Fatalf("error creating cert: %v", err) - } - - // provide the private key and the cert - servKeyPEM := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(servKey), - }) - - servPubPEM := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(servPub), - }) - - /******************************************************************* - Client Cert - *******************************************************************/ - - // create a key-pair for the client - clientKey, clientPub := GenKeyPair(4096) - - log.Println("----------client cert") - - // create a template for the client - clientCertTmpl, err := CertTemplate(client_name, 1) - if err != nil { - log.Fatalf("creating cert template: %v", err) - } - clientCertTmpl.KeyUsage = x509.KeyUsageDigitalSignature - clientCertTmpl.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth} - - // the root cert signs the cert by again providing its private key - _, clientCertPEM, err := CreateCert(clientCertTmpl, rootCert, clientPub, rootKey) - if err != nil { - log.Fatalf("error creating cert: %v", err) - } - - // encode and load the cert and private key for the client - clientKeyPEM := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(clientKey), - }) - - clientPubPEM := pem.EncodeToMemory(&pem.Block{ - Type: "RSA PUBLIC KEY", Bytes: x509.MarshalPKCS1PublicKey(clientPub), - }) - - cs := CertSet{ - RootCertPEM: rootCertPEM, - RootKeyPEM: rootKeyPEM, - RootPubPEM: rootPubPEM, - ClientCertPEM: clientCertPEM, - ClientKeyPEM: clientKeyPEM, - ClientPubPEM: clientPubPEM, - ServCertPEM: servCertPEM, - ServKeyPEM: servKeyPEM, - ServPubPEM: servPubPEM, - } - - return &cs -} diff --git a/0xgo/crypt/main.go b/0xgo/crypt/main.go deleted file mode 100644 index 74889ff..0000000 --- a/0xgo/crypt/main.go +++ /dev/null @@ -1,56 +0,0 @@ -package main - -import ( - "log" - - pkgsym "github.com/seantywork/0xgo/crypt/sym" -) - -func main() { - - /* - key := "12345678123456781234567812345678" - - ciphertext := "7c1c5afe5fc1d2cda983019029a65490c3f2fc7fb752fff310406549ea52350edbe40cb8448b9a9a15e0bb02ed0a97244387c396125a6636ed3e9ee74517ab29" - - dap, err := pkgsym.DecryptAES256CBC(ciphertext, []byte(key)) - - if err != nil { - - log.Fatalf("err: %v\n", err) - } else { - log.Printf("success: %v\n", dap) - } - */ - - key := []byte("12345678123456781234567812345678") - - data := "Scroll through the sentence list to see the sentence that best meets the context you’re looking for." - - cipher := pkgsym.EncryptAES256CBC(data, key) - - decipher, err := pkgsym.DecryptAES256CBC(cipher, key) - - if err != nil { - - log.Fatalf("error: %v\n", err) - } else { - - log.Printf("success: %s\n", decipher) - } - - cipherb, err := pkgsym.EncryptAESGCM(key, []byte(data)) - - if err != nil { - log.Fatalf("error: %v\n", err) - } - - decipherb, err := pkgsym.DecryptAESGCM(key, cipherb) - if err != nil { - - log.Fatalf("error: %v\n", err) - } else { - - log.Printf("success: %s\n", string(decipherb)) - } -} diff --git a/0xgo/crypt/sym/sym.go b/0xgo/crypt/sym/sym.go deleted file mode 100644 index 0039f7c..0000000 --- a/0xgo/crypt/sym/sym.go +++ /dev/null @@ -1,164 +0,0 @@ -package aes - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "encoding/hex" - "fmt" - "io" -) - -func RandomHex(n int) (string, error) { - bytes := make([]byte, n) - if _, err := rand.Read(bytes); err != nil { - return "", err - } - return hex.EncodeToString(bytes), nil -} - -func RandomBytes(n int) ([]byte, error) { - bytes := make([]byte, n) - if _, err := rand.Read(bytes); err != nil { - return nil, err - } - - return bytes, nil - -} - -func EncryptAES256CBC(plaintext string, key []byte) string { - bKey := key - bIV, _ := RandomBytes(aes.BlockSize) - - blockSize := aes.BlockSize - - bPlaintext := PKCS5Padding([]byte(plaintext), blockSize, len(plaintext)) - block, err := aes.NewCipher(bKey) - if err != nil { - panic(err) - } - ciphertext := make([]byte, len(bPlaintext)+aes.BlockSize) - mode := cipher.NewCBCEncrypter(block, bIV) - mode.CryptBlocks(ciphertext[aes.BlockSize:], bPlaintext) - - copy(ciphertext, bIV) - - return hex.EncodeToString(ciphertext) -} - -func DecryptAES256CBC(ciphertext string, key []byte) (string, error) { - - if len(key) != 32 { - return "", fmt.Errorf("key must be 32 bytes for AES-256") - } - - cipherData, err := hex.DecodeString(ciphertext) - if err != nil { - - return "", err - } - - if len(cipherData) < aes.BlockSize { - fmt.Printf("cipherText too short\r\n") - return "", fmt.Errorf("cipherText too short") - } - - iv := cipherData[:aes.BlockSize] - cipherText := cipherData[aes.BlockSize:] - - block, err := aes.NewCipher(key) - if err != nil { - - return "", err - } - - if len(cipherText)%aes.BlockSize != 0 { - - return "", fmt.Errorf("cipherText is not a multiple of the block size") - } - - mode := cipher.NewCBCDecrypter(block, iv) - - plainText := make([]byte, len(cipherText)*2) - mode.CryptBlocks(plainText, cipherText) - - return string(plainText), nil -} - -func EncryptAESGCM(key []byte, file_byte []byte) ([]byte, error) { - - var ret_byte []byte = make([]byte, 0) - - c, err := aes.NewCipher(key) - - if err != nil { - return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) - - } - - gcm, err := cipher.NewGCM(c) - - if err != nil { - return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) - - } - - nonce := make([]byte, gcm.NonceSize()) - - if _, err = io.ReadFull(rand.Reader, nonce); err != nil { - return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) - } - - nonceSize := gcm.NonceSize() - if len(file_byte) < nonceSize { - return ret_byte, fmt.Errorf("failed to encrypt with symmetric key: %s", err.Error()) - } - ciphertext := gcm.Seal(nil, nonce, file_byte, nil) - - ret_byte = append(ret_byte, nonce...) - - ret_byte = append(ret_byte, ciphertext...) - - return ret_byte, nil - -} - -func DecryptAESGCM(key []byte, file_byte []byte) ([]byte, error) { - - var ret_byte []byte - - c, err := aes.NewCipher(key) - if err != nil { - return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) - } - - gcm, err := cipher.NewGCM(c) - if err != nil { - return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) - } - - nonceSize := gcm.NonceSize() - - if len(file_byte) < nonceSize { - return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) - } - - nonce, ciphertext := file_byte[:nonceSize], file_byte[nonceSize:] - - plainfile, err := gcm.Open(nil, nonce, ciphertext, nil) - if err != nil { - return ret_byte, fmt.Errorf("failed to decrypt with symmetric key: %s", err.Error()) - } - - ret_byte = plainfile - - return ret_byte, nil -} - -func PKCS5Padding(ciphertext []byte, blockSize int, after int) []byte { - padding := (blockSize - len(ciphertext)%blockSize) - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(ciphertext, padtext...) -} diff --git a/0xgo/etcd-query/.gitignore b/0xgo/etcd-query/.gitignore deleted file mode 100644 index 546b462..0000000 --- a/0xgo/etcd-query/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -etcd1_data -etcd2_data -etcd3_data \ No newline at end of file diff --git a/0xgo/etcd-query/core/modules.go b/0xgo/etcd-query/core/modules.go deleted file mode 100644 index bf67c63..0000000 --- a/0xgo/etcd-query/core/modules.go +++ /dev/null @@ -1,77 +0,0 @@ -package core - -import ( - "context" - "log" - "strconv" - "time" - - clientv3 "go.etcd.io/etcd/client/v3" -) - -func ConnectEtcd() (*clientv3.Client, error) { - - _, err := clientv3.New(clientv3.Config{ - Endpoints: []string{"localhost:2379"}, - DialTimeout: 2 * time.Second, - }) - - if err == context.DeadlineExceeded { - log.Println("deadline execeeded") - return nil, err - } - - cli, err := clientv3.New(clientv3.Config{ - Endpoints: []string{"localhost:2379"}, - DialTimeout: 5 * time.Second, - }) - if err != nil { - log.Println("failed to get new clien") - return nil, err - } - - log.Println("connection success!") - - return cli, nil - -} - -func PutKey(cli *clientv3.Client, key string, val string) error { - - ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*1000*10) - - _, err := cli.Put(ctx, key, val) - - cancel() - - if err != nil { - - return err - - } - - log.Println("put successful") - - return nil -} - -func GetKey(cli *clientv3.Client, key string) error { - - resp, err := cli.Get(context.TODO(), key) - - if err != nil { - log.Println("failed to get") - return err - } - - match_len := len(resp.Kvs) - - match_len_str := strconv.Itoa(match_len) - - log.Println("matched count: " + match_len_str) - - log.Println("match: key: " + string(resp.Kvs[0].Key) + " val: " + string(resp.Kvs[0].Value)) - - return nil - -} diff --git a/0xgo/etcd-query/docker-compose.yaml b/0xgo/etcd-query/docker-compose.yaml deleted file mode 100644 index 8b3b95a..0000000 --- a/0xgo/etcd-query/docker-compose.yaml +++ /dev/null @@ -1,54 +0,0 @@ -version: "3" -services: - etcd-1: - image: quay.io/coreos/etcd:v3.5.9 - entrypoint: /usr/local/bin/etcd - ports: - - "2379:2379" - command: - - '--name=etcd-1' - - '--initial-advertise-peer-urls=http://etcd-1:2380' - - '--listen-peer-urls=http://0.0.0.0:2380' - - '--listen-client-urls=http://0.0.0.0:2379' - - '--advertise-client-urls=http://etcd-1:2379' - - '--heartbeat-interval=250' - - '--election-timeout=1250' - - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380' - - '--initial-cluster-state=new' - - '--initial-cluster-token=etcdbogustoken1234' - volumes: - - ./etcd1_data:/etcd_data - - etcd-2: - image: quay.io/coreos/etcd:v3.5.9 - entrypoint: /usr/local/bin/etcd - command: - - '--name=etcd-2' - - '--initial-advertise-peer-urls=http://etcd-2:2380' - - '--listen-peer-urls=http://0.0.0.0:2380' - - '--listen-client-urls=http://0.0.0.0:2379' - - '--advertise-client-urls=http://etcd-2:2379' - - '--heartbeat-interval=250' - - '--election-timeout=1250' - - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380' - - '--initial-cluster-state=new' - - '--initial-cluster-token=etcdbogustoken1234' - volumes: - - ./etcd2_data:/etcd_data - - etcd-3: - image: quay.io/coreos/etcd:v3.5.9 - entrypoint: /usr/local/bin/etcd - command: - - '--name=etcd-3' - - '--initial-advertise-peer-urls=http://etcd-3:2380' - - '--listen-peer-urls=http://0.0.0.0:2380' - - '--listen-client-urls=http://0.0.0.0:2379' - - '--advertise-client-urls=http://etcd-3:2379' - - '--heartbeat-interval=250' - - '--election-timeout=1250' - - '--initial-cluster=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380' - - '--initial-cluster-state=new' - - '--initial-cluster-token=etcdbogustoken1234' - volumes: - - ./etcd3_data:/etcd_data diff --git a/0xgo/etcd-query/main.go b/0xgo/etcd-query/main.go deleted file mode 100644 index 3ebcad1..0000000 --- a/0xgo/etcd-query/main.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "log" - - etcqcore "github.com/seantywork/0xgo/etcd-query/core" -) - -func main() { - - cli, err := etcqcore.ConnectEtcd() - - defer cli.Close() - - if err != nil { - - log.Fatalln(err.Error()) - } - - test_key := "my_little_key" - - test_val := "myLittleValue" - - err = etcqcore.PutKey(cli, test_key, test_val) - - if err != nil { - log.Fatalln(err.Error()) - } - - err = etcqcore.GetKey(cli, test_key) - - if err != nil { - log.Fatalln(err.Error()) - } - -} diff --git a/0xgo/fault/.gitignore b/0xgo/fault/.gitignore deleted file mode 100644 index 1c0ec3f..0000000 --- a/0xgo/fault/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.prof -*.png \ No newline at end of file diff --git a/0xgo/fault/2504-03.xyz.md b/0xgo/fault/2504-03.xyz.md deleted file mode 100644 index 3ed8c93..0000000 --- a/0xgo/fault/2504-03.xyz.md +++ /dev/null @@ -1,83 +0,0 @@ -# 21 - - -```shell - 62 runtime.GC() - 63 - 64 cpuProfileBuff := &bytes.Buffer{} - 65 - 66 err := pprof.StartCPUProfile(cpuProfileBuff) - 67 - 68 if err != nil { - 69 - 70 panic(err) - 71 } - 72 - 73 time.Sleep(time.Second * time.Duration(waits)) - 74 - 75 pprof.StopCPUProfile() - 76 - 77 runtime.GC() - 78 - 79 profileBytes := cpuProfileBuff.Bytes() - 80 - 81 f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644) - 82 - - -``` - -# 22 - -```shell - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 13784 seantyw+ 20 0 1226856 4568 1536 S 107.3 0.1 0:22.65 test.out - 2903 seantyw+ 20 0 11.1g 75580 45056 S 9.3 0.9 0:04.94 node - 2797 seantyw+ 20 0 11.3g 102748 47872 R 6.0 1.3 0:05.74 node - 3718 seantyw+ 20 0 31.3g 142516 55296 S 3.3 1.8 0:10.09 node -``` - -# 23 - -```shell -$ ls -2504-03.xyz.md go.prof main.go Makefile test.out - - -$ sudo apt update && sudo apt install graphviz - - -$ go tool pprof -png go.prof -Generating report in profile001.png -``` - -# 24 - -```shell -94 type NullStruct struct { -95 Value int -96 Field *NullStruct -97 } - - -121 -122 null := NullStruct{} -123 -124 fmt.Printf("val: %d\n", null.Field.Value) -125 - -``` - -# 25 - -```shell -$ ./test.out 2 -panic: runtime error: invalid memory address or nil pointer dereference -[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4b7593] - -goroutine 1 [running]: -main.main() - /home/seantywork/hack/linux/linuxyz/0xgo/fault/main.go:124 +0xb3 - -``` \ No newline at end of file diff --git a/0xgo/fault/Makefile b/0xgo/fault/Makefile deleted file mode 100644 index 731062c..0000000 --- a/0xgo/fault/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -all: - go build -o test.out . - diff --git a/0xgo/fault/main.go b/0xgo/fault/main.go deleted file mode 100644 index 092bcd0..0000000 --- a/0xgo/fault/main.go +++ /dev/null @@ -1,128 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "os" - "runtime" - "runtime/pprof" - "time" -) - -var TLEN = 10 - -func busy() { - - val := 1 - str := "" - for { - - str = fmt.Sprintf("%d", val) - - _ = str - } - -} - -func notbusy(idx int) { - - val := 1 - str := "" - for { - - time.Sleep(time.Millisecond * 1) - - str = fmt.Sprintf("%d", val) - - fmt.Printf("i'm not busy: %d: %s\n", idx, str) - - } -} - -func threadFunc() { - - for i := 0; i < TLEN; i++ { - - if i == 5 { - - go busy() - - } else { - - go notbusy(i) - - } - - } - -} - -func profiler(waits int) { - - runtime.GC() - - cpuProfileBuff := &bytes.Buffer{} - - err := pprof.StartCPUProfile(cpuProfileBuff) - - if err != nil { - - panic(err) - } - - time.Sleep(time.Second * time.Duration(waits)) - - pprof.StopCPUProfile() - - runtime.GC() - - profileBytes := cpuProfileBuff.Bytes() - - f, err := os.OpenFile("go.prof", os.O_CREATE|os.O_RDWR, 0644) - - if err != nil { - - panic(err) - } - - f.Write(profileBytes) - - f.Close() - -} - -type NullStruct struct { - Value int - Field *NullStruct -} - -func main() { - - argc := len(os.Args) - - if argc != 2 { - fmt.Printf("feed case\n") - os.Exit(-1) - } - - if os.Args[1] == "1" { - - go threadFunc() - - go profiler(10) - - for { - - time.Sleep(time.Millisecond * 1000) - - } - - } else if os.Args[1] == "2" { - - null := NullStruct{} - - fmt.Printf("val: %d\n", null.Field.Value) - - } - -} diff --git a/0xgo/file-updownload/.gitignore b/0xgo/file-updownload/.gitignore deleted file mode 100644 index 6320cd2..0000000 --- a/0xgo/file-updownload/.gitignore +++ /dev/null @@ -1 +0,0 @@ -data \ No newline at end of file diff --git a/0xgo/file-updownload/Makefile b/0xgo/file-updownload/Makefile deleted file mode 100644 index a1070ec..0000000 --- a/0xgo/file-updownload/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -all: - go build -o client/c.out ./client - - go build -o server/s.out ./server - diff --git a/0xgo/file-updownload/client/main.go b/0xgo/file-updownload/client/main.go deleted file mode 100644 index 0f0bdd2..0000000 --- a/0xgo/file-updownload/client/main.go +++ /dev/null @@ -1,121 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "io" - "log" - "mime/multipart" - "net/http" - "os" - "strings" -) - -func Upload(client *http.Client, url string, values map[string]io.Reader) (err error) { - - var b bytes.Buffer - w := multipart.NewWriter(&b) - for key, r := range values { - var fw io.Writer - if x, ok := r.(io.Closer); ok { - defer x.Close() - } - - if x, ok := r.(*os.File); ok { - if fw, err = w.CreateFormFile(key, x.Name()); err != nil { - return - } - } else { - // Add other fields - if fw, err = w.CreateFormField(key); err != nil { - return - } - } - if _, err = io.Copy(fw, r); err != nil { - return err - } - - } - - w.Close() - - req, err := http.NewRequest("POST", url, &b) - if err != nil { - return - } - - req.Header.Set("Content-Type", w.FormDataContentType()) - - res, err := client.Do(req) - if err != nil { - return - } - - if res.StatusCode != http.StatusOK { - err = fmt.Errorf("bad status: %s", res.Status) - } - return -} - -func Download(filepath string, url string) (err error) { - - out, err := os.Create(filepath) - if err != nil { - return err - } - defer out.Close() - - resp, err := http.Get(url) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("bad status: %s", resp.Status) - } - - _, err = io.Copy(out, resp.Body) - if err != nil { - return err - } - - return nil -} - -func main() { - - v, err := os.Open("./data/test.mp4") - - if err != nil { - log.Printf("failed to read data: %v\n", err) - os.Exit(-1) - } - - values := map[string]io.Reader{ - "file": v, - "other": strings.NewReader("hello world!"), - } - - client := &http.Client{} - - err = Upload(client, "http://localhost:8080/upload", values) - - if err != nil { - - log.Printf("failed to upload file: %v\n", err) - - os.Exit(-1) - } - - err = Download("./data/return.mp4", "http://localhost:8080/download/test.mp4") - - if err != nil { - log.Printf("failed to download file: %v\n", err) - - os.Exit(-1) - } - - os.Exit(0) - -} diff --git a/0xgo/file-updownload/server/main.go b/0xgo/file-updownload/server/main.go deleted file mode 100644 index e8cfcca..0000000 --- a/0xgo/file-updownload/server/main.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/gin-gonic/contrib/sessions" - "github.com/gin-gonic/gin" -) - -func BinaryUpload(c *gin.Context) { - - file, _ := c.FormFile("file") - - rawMediaType := file.Header.Get("Content-Type") - - log.Printf("content type: %s\n", rawMediaType) - - f_name := file.Filename - - this_video_path := "./data/" + f_name - - err := c.SaveUploadedFile(file, this_video_path) - - if err != nil { - - c.String(http.StatusBadRequest, "failed") - - return - } - - c.String(http.StatusOK, "success") - -} - -func BinaryDownload(c *gin.Context) { - - binName := c.Param("binName") - - this_video_path := "./data/" + binName - - //c.Header("Content-Type", "video/mp4") - - c.File(this_video_path) - -} - -func setRoutes(e *gin.Engine) { - - e.POST("/upload", BinaryUpload) - - e.GET("/download/:binName", BinaryDownload) - -} - -func main() { - - server := gin.Default() - - store := sessions.NewCookieStore([]byte("FILEUPDOWN")) - - server.Use(sessions.Sessions("FILEUPDOWN", store)) - - setRoutes(server) - - server.Run("0.0.0.0:8080") - -} diff --git a/0xgo/go.mod b/0xgo/go.mod deleted file mode 100644 index 8dc0c90..0000000 --- a/0xgo/go.mod +++ /dev/null @@ -1,177 +0,0 @@ -module github.com/seantywork/0xgo - -go 1.25.0 - -require ( - fyne.io/fyne/v2 v2.5.2 - github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0 - github.com/gin-gonic/gin v1.10.0 - github.com/go-sql-driver/mysql v1.8.1 - github.com/go-vgo/robotgo v0.110.5 - github.com/gocolly/colly/v2 v2.1.0 - github.com/gorilla/websocket v1.5.3 - github.com/graphql-go/graphql v0.8.1 - github.com/graphql-go/handler v0.2.4 - github.com/pion/ice/v3 v3.0.16 - github.com/pion/rtcp v1.2.15 - github.com/pion/webrtc/v4 v4.0.7 - github.com/pkg/errors v0.9.1 - github.com/quic-go/quic-go v0.48.1 - github.com/vcaesar/imgo v0.40.2 - github.com/yutopp/go-flv v0.3.1 - github.com/yutopp/go-rtmp v0.0.7 - go.etcd.io/etcd/client/v3 v3.5.16 - golang.org/x/crypto v0.29.0 - golang.org/x/net v0.31.0 - golang.org/x/oauth2 v0.23.0 - google.golang.org/api v0.204.0 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - cloud.google.com/go/auth v0.10.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect - cloud.google.com/go/compute/metadata v0.5.2 // indirect - filippo.io/edwards25519 v1.1.0 // indirect - fyne.io/systray v1.11.0 // indirect - github.com/BurntSushi/toml v1.4.0 // indirect - github.com/PuerkitoBio/goquery v1.10.0 // indirect - github.com/andybalholm/cascadia v1.3.2 // indirect - github.com/antchfx/htmlquery v1.3.3 // indirect - github.com/antchfx/xmlquery v1.4.2 // indirect - github.com/antchfx/xpath v1.3.2 // indirect - github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff // indirect - github.com/bytedance/sonic v1.11.6 // indirect - github.com/bytedance/sonic/loader v0.1.1 // indirect - github.com/cloudwego/base64x v0.1.4 // indirect - github.com/cloudwego/iasm v0.2.0 // indirect - github.com/coreos/go-semver v0.3.1 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect - github.com/ebitengine/purego v0.8.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fredbi/uri v1.1.0 // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect - github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934 // indirect - github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect - github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/gen2brain/shm v0.1.1 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect - github.com/go-logr/logr v1.4.2 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.20.0 // indirect - github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/go-text/render v0.2.0 // indirect - github.com/go-text/typesetting v0.2.0 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/gomodule/redigo v2.0.0+incompatible // indirect - github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 // indirect - github.com/google/s2a-go v0.1.8 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect - github.com/gopherjs/gopherjs v1.17.2 // indirect - github.com/gorilla/context v1.1.2 // indirect - github.com/gorilla/securecookie v1.1.2 // indirect - github.com/gorilla/sessions v1.4.0 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.0 // indirect - github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 // indirect - github.com/jezek/xgb v1.1.1 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect - github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 // indirect - github.com/kennygrant/sanitize v1.2.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect - github.com/leodido/go-urn v1.4.0 // indirect - github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect - github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/nicksnyder/go-i18n/v2 v2.4.1 // indirect - github.com/onsi/ginkgo/v2 v2.21.0 // indirect - github.com/otiai10/gosseract v2.2.1+incompatible // indirect - github.com/otiai10/mint v1.6.3 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect - github.com/pion/datachannel v1.5.10 // indirect - github.com/pion/dtls/v2 v2.2.12 // indirect - github.com/pion/dtls/v3 v3.0.4 // indirect - github.com/pion/ice/v4 v4.0.3 // indirect - github.com/pion/interceptor v0.1.37 // indirect - github.com/pion/logging v0.2.2 // indirect - github.com/pion/mdns/v2 v2.0.7 // indirect - github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtp v1.8.10 // indirect - github.com/pion/sctp v1.8.35 // indirect - github.com/pion/sdp/v3 v3.0.9 // indirect - github.com/pion/srtp/v3 v3.0.4 // indirect - github.com/pion/stun/v2 v2.0.0 // indirect - github.com/pion/stun/v3 v3.0.0 // indirect - github.com/pion/transport/v2 v2.2.4 // indirect - github.com/pion/transport/v3 v3.0.7 // indirect - github.com/pion/turn/v3 v3.0.3 // indirect - github.com/pion/turn/v4 v4.0.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/quic-go/qpack v0.5.1 // indirect - github.com/robotn/xgb v0.10.0 // indirect - github.com/robotn/xgbutil v0.10.0 // indirect - github.com/rymdport/portal v0.2.6 // indirect - github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect - github.com/shirou/gopsutil/v4 v4.24.10 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect - github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect - github.com/stretchr/testify v1.10.0 // indirect - github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f // indirect - github.com/temoto/robotstxt v1.1.2 // indirect - github.com/tklauser/go-sysconf v0.3.14 // indirect - github.com/tklauser/numcpus v0.9.0 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.12 // indirect - github.com/vcaesar/gops v0.40.0 // indirect - github.com/vcaesar/keycode v0.10.1 // indirect - github.com/vcaesar/tt v0.20.1 // indirect - github.com/wlynxg/anet v0.0.5 // indirect - github.com/yuin/goldmark v1.7.8 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/yutopp/go-amf0 v0.1.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.16 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.uber.org/mock v0.5.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/arch v0.8.0 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect - golang.org/x/image v0.21.0 // indirect - golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/sync v0.9.0 // indirect - golang.org/x/sys v0.27.0 // indirect - golang.org/x/text v0.20.0 // indirect - golang.org/x/tools v0.26.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect -) diff --git a/0xgo/go.sum b/0xgo/go.sum deleted file mode 100644 index 9cbd7ff..0000000 --- a/0xgo/go.sum +++ /dev/null @@ -1,1033 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo= -cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= -cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= -cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -fyne.io/fyne/v2 v2.5.2 h1:eSyGTmSkv10yAdAeHpDet6u2KkKxOGFc14kQu81We7Q= -fyne.io/fyne/v2 v2.5.2/go.mod h1:26gqPDvtaxHeyct+C0BBjuGd2zwAJlPkUGSBrb+d7Ug= -fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg= -fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= -github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= -github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= -github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= -github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= -github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0= -github.com/antchfx/htmlquery v1.3.3 h1:x6tVzrRhVNfECDaVxnZi1mEGrQg3mjE/rxbH2Pe6dNE= -github.com/antchfx/htmlquery v1.3.3/go.mod h1:WeU3N7/rL6mb6dCwtE30dURBnBieKDC/fR8t6X+cKjU= -github.com/antchfx/xmlquery v1.2.4/go.mod h1:KQQuESaxSlqugE2ZBcM/qn+ebIpt+d+4Xx7YcSGAIrM= -github.com/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= -github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= -github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= -github.com/antchfx/xpath v1.1.8/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= -github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= -github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff h1:RmdPFa+slIr4SCBg4st/l/vZWVe9QJKMXGO60Bxbe04= -github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= -github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= -github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= -github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= -github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= -github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= -github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= -github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U= -github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU= -github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE= -github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= -github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fortytw2/leaktest v1.2.0 h1:cj6GCiwJDH7l3tMHLjZDo0QqPtrXJiWSI9JgpeQKw+Q= -github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8= -github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934 h1:dZC5aKobSN07hf71oMivxUmAofFja5GrfPK2rBlttX4= -github.com/fyne-io/gl-js v0.0.0-20230506162202-1fdaa286a934/go.mod h1:d4clgH0/GrRwWjRzJJQXxT/h1TyuNSfF/X64zb/3Ggg= -github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a h1:ybgRdYvAHTn93HW79bLiBiJwVL4jVeyGQRZMgImoeWs= -github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a/go.mod h1:gsGA2dotD4v0SR6PmPCYvS9JuOeMwAtmfvDE7mbYXMY= -github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964 h1:0pTELtjlVAVGSazfwRNcqTVzqmkWb1GsNozCmmZfdZA= -github.com/fyne-io/image v0.0.0-20240417123036-dc0ee9e7c964/go.mod h1:J9Uunu842kOcTjzQj4Eq8XIDmF55szvT1PTS1cUb1UE= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ= -github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0 h1:EUFmvQ8ffefnSAmaUZd9HZYZSw9w/bFjp3FiNaJ5WmE= -github.com/gin-gonic/contrib v0.0.0-20240508051311-c1c6bf0061b0/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg= -github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= -github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= -github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= -github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA= -github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= -github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc= -github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU= -github.com/go-text/typesetting v0.2.0 h1:fbzsgbmk04KiWtE+c3ZD4W2nmCRzBqrqQOvYlwAOdho= -github.com/go-text/typesetting v0.2.0/go.mod h1:2+owI/sxa73XA581LAzVuEBZ3WEEV2pXeDswCH/3i1I= -github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66 h1:GUrm65PQPlhFSKjLPGOZNPNxLCybjzjYBzjfoBGaDUY= -github.com/go-text/typesetting-utils v0.0.0-20240317173224-1986cbe96c66/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= -github.com/go-vgo/robotgo v0.110.5 h1:F3meroJVBPvxncoHX9ZoD1Gal+pYywu1MLPcJkN5oEw= -github.com/go-vgo/robotgo v0.110.5/go.mod h1:MzgZR4XAnlhBAe4ExLcJebisDUfbYoh3ekaP/s/XRqQ= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA= -github.com/gocolly/colly/v2 v2.1.0 h1:k0DuZkDoCsx51bKpRJNEmcxcp+W5N8ziuwGaSDuFoGs= -github.com/gocolly/colly/v2 v2.1.0/go.mod h1:I2MuhsLjQ+Ex+IzK3afNS8/1qP3AedHOusRPcRdC5o0= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20241101162523-b92577c0c142 h1:sAGdeJj0bnMgUNVeUpp6AYlVdCt3/GdI3pGRqsNSQLs= -github.com/google/pprof v0.0.0-20241101162523-b92577c0c142/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20211219123610-ec9572f70e60/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= -github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= -github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o= -github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= -github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= -github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= -github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/goxjs/gl v0.0.0-20210104184919-e3fafc6f8f2a/go.mod h1:dy/f2gjY09hwVfIyATps4G2ai7/hLwLkc5TrPqONuXY= -github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= -github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= -github.com/graphql-go/handler v0.2.4 h1:gz9q11TUHPNUpqzV8LMa+rkqM5NUuH/nkE3oF2LS3rI= -github.com/graphql-go/handler v0.2.4/go.mod h1:gsQlb4gDvURR0bgN8vWQEh+s5vJALM2lYL3n3cf6OxQ= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg= -github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8= -github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg= -github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= -github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M= -github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191 h1:5UHVWNX1qrIbNw7OpKbxe5bHkhHRk3xRKztMjERuCsU= -github.com/kbinani/screenshot v0.0.0-20240820160931-a8a2c5d0e191/go.mod h1:Pmpz2BLf55auQZ67u3rvyI2vAQvNetkK/4zYUmpauZQ= -github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= -github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0= -github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= -github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= -github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/nicksnyder/go-i18n/v2 v2.4.1 h1:zwzjtX4uYyiaU02K5Ia3zSkpJZrByARkRB4V3YPrr0g= -github.com/nicksnyder/go-i18n/v2 v2.4.1/go.mod h1:++Pl70FR6Cki7hdzZRnEEqdc2dJt+SAGotyFg/SvZMk= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= -github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= -github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= -github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= -github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= -github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= -github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= -github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= -github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= -github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= -github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= -github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg= -github.com/pion/ice/v3 v3.0.16 h1:YoPlNg3jU1UT/DDTa9v/g1vH6A2/pAzehevI1o66H8E= -github.com/pion/ice/v3 v3.0.16/go.mod h1:SdmubtIsCcvdb1ZInrTUz7Iaqi90/rYd1pzbzlMxsZg= -github.com/pion/ice/v4 v4.0.3 h1:9s5rI1WKzF5DRqhJ+Id8bls/8PzM7mau0mj1WZb4IXE= -github.com/pion/ice/v4 v4.0.3/go.mod h1:VfHy0beAZ5loDT7BmJ2LtMtC4dbawIkkkejHPRZNB3Y= -github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= -github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= -github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= -github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= -github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= -github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= -github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= -github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= -github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= -github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= -github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= -github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= -github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= -github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= -github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ= -github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= -github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= -github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= -github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= -github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= -github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo= -github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= -github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= -github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= -github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= -github.com/pion/turn/v3 v3.0.3 h1:1e3GVk8gHZLPBA5LqadWYV60lmaKUaHCkm9DX9CkGcE= -github.com/pion/turn/v3 v3.0.3/go.mod h1:vw0Dz420q7VYAF3J4wJKzReLHIo2LGp4ev8nXQexYsc= -github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= -github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= -github.com/pion/webrtc/v4 v4.0.7 h1:aeq78uVnFZd2umXW0O9A2VFQYuS7+BZxWetQvSp2jPo= -github.com/pion/webrtc/v4 v4.0.7/go.mod h1:oFVBBVSHU3vAEwSgnk3BuKCwAUwpDwQhko1EDwyZWbU= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= -github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= -github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= -github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA= -github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= -github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= -github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM= -github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= -github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw= -github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/rymdport/portal v0.2.6 h1:HWmU3gORu7vWcpr7VSwUS2Xx1HtJXVcUuTqEZcMEsIg= -github.com/rymdport/portal v0.2.6/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4= -github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= -github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= -github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= -github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= -github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= -github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= -github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= -github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f h1:13CyO8FO3blZH04ewuT9DDgm9V7G0CfjDzw8kLKx+s8= -github.com/tailscale/win v0.0.0-20241018163102-cfd3289ef17f/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8= -github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= -github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= -github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= -github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg= -github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= -github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= -github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo= -github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= -github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/vcaesar/gops v0.40.0 h1:I+1RCGiV+LkZJUYNzAd373xs0uM2UyeFdZBmow8HfCM= -github.com/vcaesar/gops v0.40.0/go.mod h1:3u/USW7JovqUK6i13VOD3qWfvXXd2TIIKE4PYIv4TOM= -github.com/vcaesar/imgo v0.40.2 h1:5GWScRLdBCMtO1v2I1bs+ZmDLZFINxYSMZ+mtUw5qPM= -github.com/vcaesar/imgo v0.40.2/go.mod h1:MVCl+FxHI2gTgmiHoi0n5xNCbYcfv9SVtdEOUC92+eo= -github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw= -github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= -github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4= -github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU= -github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= -github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= -github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yutopp/go-amf0 v0.1.0 h1:a3UeBZG7nRF0zfvmPn2iAfNo1RGzUpHz1VyJD2oGrik= -github.com/yutopp/go-amf0 v0.1.0/go.mod h1:QzDOBr9RV6sQh6E5GFEJROZbU0iQKijORBmprkb3FIk= -github.com/yutopp/go-flv v0.3.1 h1:4ILK6OgCJgUNm2WOjaucWM5lUHE0+sLNPdjq3L0Xtjk= -github.com/yutopp/go-flv v0.3.1/go.mod h1:pAlHPSVRMv5aCUKmGOS/dZn/ooTgnc09qOPmiUNMubs= -github.com/yutopp/go-rtmp v0.0.7 h1:sKKm1MVV3ANbJHZlf3Kq8ecq99y5U7XnDUDxSjuK7KU= -github.com/yutopp/go-rtmp v0.0.7/go.mod h1:KSwrC9Xj5Kf18EUlk1g7CScecjXfIqc0J5q+S0u6Irc= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= -go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= -go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= -go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= -golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= -golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= -golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= -golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c h1:zuNS/LWsEpPTLfrmBkis6Xofw3nieAqB4hYLn8+uswk= -golang.org/x/mobile v0.0.0-20241016134751-7ff83004ec2c/go.mod h1:snk1Mn2ZpdKCt90JPEsDh4sL3ReK520U2t0d7RHBnSU= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= -golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -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= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4= -google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/0xgo/graphql/Makefile b/0xgo/graphql/Makefile deleted file mode 100644 index 5f9b263..0000000 --- a/0xgo/graphql/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -all: - - go build -o gql.out . \ No newline at end of file diff --git a/0xgo/graphql/data.json b/0xgo/graphql/data.json deleted file mode 100644 index 142e599..0000000 --- a/0xgo/graphql/data.json +++ /dev/null @@ -1,13 +0,0 @@ -[ - { - "id": 1, - "name" : "one", - "description": "number one guy", - "otherNames": [ - "uno", - "ei", - "il" - ], - "imageUrl" :"none" - } -] \ No newline at end of file diff --git a/0xgo/graphql/main.go b/0xgo/graphql/main.go deleted file mode 100644 index b835535..0000000 --- a/0xgo/graphql/main.go +++ /dev/null @@ -1,127 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - - "net/http" - - "github.com/graphql-go/graphql" - "github.com/graphql-go/handler" -) - -func importJSONDataFromFile(fileName string, result interface{}) (isOK bool) { - isOK = true - content, err := os.ReadFile(fileName) - if err != nil { - fmt.Print("Error:", err) - isOK = false - } - err = json.Unmarshal(content, result) - if err != nil { - isOK = false - fmt.Print("Error:", err) - } - return -} - -var BeastList []Beast -var _ = importJSONDataFromFile("./data.json", &BeastList) - -var beastType = graphql.NewObject(graphql.ObjectConfig{ - Name: "Beast", - Fields: graphql.Fields{ - "name": &graphql.Field{ - Type: graphql.String, - }, - "description": &graphql.Field{ - Type: graphql.String, - }, - "id": &graphql.Field{ - Type: graphql.Int, - }, - "otherNames": &graphql.Field{ - Type: graphql.NewList(graphql.String), - }, - "imageUrl": &graphql.Field{ - Type: graphql.String, - }, - }, -}) - -var rootQuery = graphql.NewObject(graphql.ObjectConfig{ - Name: "RootQuery", - Fields: graphql.Fields{ - "beast": &graphql.Field{ - Type: beastType, - Description: "Get single beast", - Args: graphql.FieldConfigArgument{ - "name": &graphql.ArgumentConfig{ - Type: graphql.String, - }, - }, - Resolve: func(params graphql.ResolveParams) (interface{}, error) { - nameQuery, isOK := params.Args["name"].(string) - if isOK { - // Search for el with name - for _, beast := range BeastList { - if beast.Name == nameQuery { - return beast, nil - } - } - } - - return Beast{}, nil - }, - }, - - "beastList": &graphql.Field{ - Type: graphql.NewList(beastType), - Description: "List of beasts", - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - return BeastList, nil - }, - }, - }, -}) - -var BeastSchema, _ = graphql.NewSchema(graphql.SchemaConfig{ - Query: rootQuery, -}) - -var sandboxHTML = []byte(` - - - -
- - - - -`) - -func main() { - - h := handler.New(&handler.Config{ - Schema: &BeastSchema, - Pretty: true, - GraphiQL: false, - }) - - http.Handle("/graphql", h) - - http.Handle("/sandbox", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Write(sandboxHTML) - })) - - http.ListenAndServe(":8080", nil) -} diff --git a/0xgo/graphql/types.go b/0xgo/graphql/types.go deleted file mode 100644 index 9b7c3ee..0000000 --- a/0xgo/graphql/types.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -type Beast struct { - ID int `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - OtherNames []string `json:"otherNames"` - ImageURL string `json:"imageUrl"` -} diff --git a/0xgo/grpc/Makefile b/0xgo/grpc/Makefile deleted file mode 100644 index 9e56181..0000000 --- a/0xgo/grpc/Makefile +++ /dev/null @@ -1,31 +0,0 @@ - - -all: - - @echo "go grpc" - - -dep: - - apt install -y protobuf-compiler - -dep-go: - - go install google.golang.org/protobuf/cmd/protoc-gen-go - - go install google.golang.org/grpc/cmd/protoc-gen-go-grpc - -proto: - - cd chatpb && ./protoc.sh - -build: - - go build -o server/server.out ./server - - go build -o client/client.out ./client - - - - - diff --git a/0xgo/grpc/certgen.sh b/0xgo/grpc/certgen.sh deleted file mode 100755 index 493976f..0000000 --- a/0xgo/grpc/certgen.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/grpc/chatpb/chat.pb.go b/0xgo/grpc/chatpb/chat.pb.go deleted file mode 100644 index 630514c..0000000 --- a/0xgo/grpc/chatpb/chat.pb.go +++ /dev/null @@ -1,551 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.34.0 -// protoc v4.25.0 -// source: chat.proto - -package chatpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type HelloRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *HelloRequest) Reset() { - *x = HelloRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HelloRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HelloRequest) ProtoMessage() {} - -func (x *HelloRequest) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead. -func (*HelloRequest) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{0} -} - -func (x *HelloRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type HelloReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *HelloReply) Reset() { - *x = HelloReply{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HelloReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HelloReply) ProtoMessage() {} - -func (x *HelloReply) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HelloReply.ProtoReflect.Descriptor instead. -func (*HelloReply) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{1} -} - -func (x *HelloReply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type TalkRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *TalkRequest) Reset() { - *x = TalkRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TalkRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TalkRequest) ProtoMessage() {} - -func (x *TalkRequest) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TalkRequest.ProtoReflect.Descriptor instead. -func (*TalkRequest) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{2} -} - -func (x *TalkRequest) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type TalkResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TalkContent *TalkContent `protobuf:"bytes,1,opt,name=talk_content,json=talkContent,proto3" json:"talk_content,omitempty"` -} - -func (x *TalkResponse) Reset() { - *x = TalkResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TalkResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TalkResponse) ProtoMessage() {} - -func (x *TalkResponse) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TalkResponse.ProtoReflect.Descriptor instead. -func (*TalkResponse) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{3} -} - -func (x *TalkResponse) GetTalkContent() *TalkContent { - if x != nil { - return x.TalkContent - } - return nil -} - -type TalkContent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Index int64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` -} - -func (x *TalkContent) Reset() { - *x = TalkContent{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TalkContent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TalkContent) ProtoMessage() {} - -func (x *TalkContent) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TalkContent.ProtoReflect.Descriptor instead. -func (*TalkContent) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{4} -} - -func (x *TalkContent) GetIndex() int64 { - if x != nil { - return x.Index - } - return 0 -} - -func (x *TalkContent) GetContent() string { - if x != nil { - return x.Content - } - return "" -} - -type HistoryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Index int64 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` -} - -func (x *HistoryRequest) Reset() { - *x = HistoryRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HistoryRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HistoryRequest) ProtoMessage() {} - -func (x *HistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. -func (*HistoryRequest) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{5} -} - -func (x *HistoryRequest) GetIndex() int64 { - if x != nil { - return x.Index - } - return 0 -} - -type HistoryResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - History []*TalkContent `protobuf:"bytes,1,rep,name=history,proto3" json:"history,omitempty"` -} - -func (x *HistoryResponse) Reset() { - *x = HistoryResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_chat_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HistoryResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HistoryResponse) ProtoMessage() {} - -func (x *HistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_chat_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead. -func (*HistoryResponse) Descriptor() ([]byte, []int) { - return file_chat_proto_rawDescGZIP(), []int{6} -} - -func (x *HistoryResponse) GetHistory() []*TalkContent { - if x != nil { - return x.History - } - return nil -} - -var File_chat_proto protoreflect.FileDescriptor - -var file_chat_proto_rawDesc = []byte{ - 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x68, - 0x61, 0x74, 0x70, 0x62, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x27, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x46, 0x0a, 0x0c, 0x54, 0x61, 0x6c, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, 0x74, 0x61, 0x6c, - 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x74, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x22, 0x3d, 0x0a, 0x0b, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x22, 0x26, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x40, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, - 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x32, 0xba, 0x01, 0x0a, 0x07, 0x43, - 0x68, 0x61, 0x74, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, - 0x6c, 0x6f, 0x12, 0x14, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x37, 0x0a, 0x08, - 0x54, 0x61, 0x6c, 0x6b, 0x54, 0x6f, 0x4d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, - 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, - 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x6c, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x57, 0x68, 0x61, 0x74, 0x44, 0x69, 0x64, - 0x59, 0x6f, 0x75, 0x53, 0x61, 0x79, 0x12, 0x16, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x63, 0x68, 0x61, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x6e, 0x74, 0x79, 0x77, 0x6f, 0x72, 0x6b, - 0x2f, 0x30, 0x78, 0x67, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_chat_proto_rawDescOnce sync.Once - file_chat_proto_rawDescData = file_chat_proto_rawDesc -) - -func file_chat_proto_rawDescGZIP() []byte { - file_chat_proto_rawDescOnce.Do(func() { - file_chat_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_proto_rawDescData) - }) - return file_chat_proto_rawDescData -} - -var file_chat_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_chat_proto_goTypes = []interface{}{ - (*HelloRequest)(nil), // 0: chatpb.HelloRequest - (*HelloReply)(nil), // 1: chatpb.HelloReply - (*TalkRequest)(nil), // 2: chatpb.TalkRequest - (*TalkResponse)(nil), // 3: chatpb.TalkResponse - (*TalkContent)(nil), // 4: chatpb.TalkContent - (*HistoryRequest)(nil), // 5: chatpb.HistoryRequest - (*HistoryResponse)(nil), // 6: chatpb.HistoryResponse -} -var file_chat_proto_depIdxs = []int32{ - 4, // 0: chatpb.TalkResponse.talk_content:type_name -> chatpb.TalkContent - 4, // 1: chatpb.HistoryResponse.history:type_name -> chatpb.TalkContent - 0, // 2: chatpb.Chatter.SayHello:input_type -> chatpb.HelloRequest - 2, // 3: chatpb.Chatter.TalkToMe:input_type -> chatpb.TalkRequest - 5, // 4: chatpb.Chatter.WhatDidYouSay:input_type -> chatpb.HistoryRequest - 1, // 5: chatpb.Chatter.SayHello:output_type -> chatpb.HelloReply - 3, // 6: chatpb.Chatter.TalkToMe:output_type -> chatpb.TalkResponse - 6, // 7: chatpb.Chatter.WhatDidYouSay:output_type -> chatpb.HistoryResponse - 5, // [5:8] is the sub-list for method output_type - 2, // [2:5] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_chat_proto_init() } -func file_chat_proto_init() { - if File_chat_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_chat_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelloRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_chat_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelloReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_chat_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TalkRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_chat_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TalkResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_chat_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TalkContent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_chat_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_chat_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_chat_proto_rawDesc, - NumEnums: 0, - NumMessages: 7, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_chat_proto_goTypes, - DependencyIndexes: file_chat_proto_depIdxs, - MessageInfos: file_chat_proto_msgTypes, - }.Build() - File_chat_proto = out.File - file_chat_proto_rawDesc = nil - file_chat_proto_goTypes = nil - file_chat_proto_depIdxs = nil -} diff --git a/0xgo/grpc/chatpb/chat.proto b/0xgo/grpc/chatpb/chat.proto deleted file mode 100644 index 67a2279..0000000 --- a/0xgo/grpc/chatpb/chat.proto +++ /dev/null @@ -1,59 +0,0 @@ -syntax = "proto3"; - -option go_package = "github.com/seantywork/0xgo/grpc/chatpb"; - - -package chatpb; - - -service Chatter { - - rpc SayHello (HelloRequest) returns (HelloReply); - - rpc TalkToMe (TalkRequest) returns (stream TalkResponse); - - rpc WhatDidYouSay (HistoryRequest) returns (HistoryResponse); - -} - -message HelloRequest { - string name = 1; -} - -message HelloReply { - string message = 1; -} - -message TalkRequest { - - string message = 1; - -} - -message TalkResponse { - - TalkContent talk_content = 1; - -} - - -message TalkContent{ - - int64 index = 1; - string content = 2; - -} - -message HistoryRequest { - - int64 index = 1; - -} - -message HistoryResponse{ - - repeated TalkContent history = 1; - -} - - diff --git a/0xgo/grpc/chatpb/chat_grpc.pb.go b/0xgo/grpc/chatpb/chat_grpc.pb.go deleted file mode 100644 index 1335b34..0000000 --- a/0xgo/grpc/chatpb/chat_grpc.pb.go +++ /dev/null @@ -1,201 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package chatpb - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// ChatterClient is the client API for Chatter service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ChatterClient interface { - SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) - TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error) - WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) -} - -type chatterClient struct { - cc grpc.ClientConnInterface -} - -func NewChatterClient(cc grpc.ClientConnInterface) ChatterClient { - return &chatterClient{cc} -} - -func (c *chatterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) { - out := new(HelloReply) - err := c.cc.Invoke(ctx, "/chatpb.Chatter/SayHello", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *chatterClient) TalkToMe(ctx context.Context, in *TalkRequest, opts ...grpc.CallOption) (Chatter_TalkToMeClient, error) { - stream, err := c.cc.NewStream(ctx, &Chatter_ServiceDesc.Streams[0], "/chatpb.Chatter/TalkToMe", opts...) - if err != nil { - return nil, err - } - x := &chatterTalkToMeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Chatter_TalkToMeClient interface { - Recv() (*TalkResponse, error) - grpc.ClientStream -} - -type chatterTalkToMeClient struct { - grpc.ClientStream -} - -func (x *chatterTalkToMeClient) Recv() (*TalkResponse, error) { - m := new(TalkResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *chatterClient) WhatDidYouSay(ctx context.Context, in *HistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) { - out := new(HistoryResponse) - err := c.cc.Invoke(ctx, "/chatpb.Chatter/WhatDidYouSay", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ChatterServer is the server API for Chatter service. -// All implementations must embed UnimplementedChatterServer -// for forward compatibility -type ChatterServer interface { - SayHello(context.Context, *HelloRequest) (*HelloReply, error) - TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error - WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error) - mustEmbedUnimplementedChatterServer() -} - -// UnimplementedChatterServer must be embedded to have forward compatible implementations. -type UnimplementedChatterServer struct { -} - -func (UnimplementedChatterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") -} -func (UnimplementedChatterServer) TalkToMe(*TalkRequest, Chatter_TalkToMeServer) error { - return status.Errorf(codes.Unimplemented, "method TalkToMe not implemented") -} -func (UnimplementedChatterServer) WhatDidYouSay(context.Context, *HistoryRequest) (*HistoryResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method WhatDidYouSay not implemented") -} -func (UnimplementedChatterServer) mustEmbedUnimplementedChatterServer() {} - -// UnsafeChatterServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ChatterServer will -// result in compilation errors. -type UnsafeChatterServer interface { - mustEmbedUnimplementedChatterServer() -} - -func RegisterChatterServer(s grpc.ServiceRegistrar, srv ChatterServer) { - s.RegisterService(&Chatter_ServiceDesc, srv) -} - -func _Chatter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(HelloRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ChatterServer).SayHello(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/chatpb.Chatter/SayHello", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ChatterServer).SayHello(ctx, req.(*HelloRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Chatter_TalkToMe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(TalkRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ChatterServer).TalkToMe(m, &chatterTalkToMeServer{stream}) -} - -type Chatter_TalkToMeServer interface { - Send(*TalkResponse) error - grpc.ServerStream -} - -type chatterTalkToMeServer struct { - grpc.ServerStream -} - -func (x *chatterTalkToMeServer) Send(m *TalkResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Chatter_WhatDidYouSay_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(HistoryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ChatterServer).WhatDidYouSay(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/chatpb.Chatter/WhatDidYouSay", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ChatterServer).WhatDidYouSay(ctx, req.(*HistoryRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// Chatter_ServiceDesc is the grpc.ServiceDesc for Chatter service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Chatter_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "chatpb.Chatter", - HandlerType: (*ChatterServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "SayHello", - Handler: _Chatter_SayHello_Handler, - }, - { - MethodName: "WhatDidYouSay", - Handler: _Chatter_WhatDidYouSay_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TalkToMe", - Handler: _Chatter_TalkToMe_Handler, - ServerStreams: true, - }, - }, - Metadata: "chat.proto", -} diff --git a/0xgo/grpc/chatpb/protoc.sh b/0xgo/grpc/chatpb/protoc.sh deleted file mode 100755 index 98dc947..0000000 --- a/0xgo/grpc/chatpb/protoc.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -export PATH="$PATH:$(go env GOPATH)/bin" - -protoc --go_out=. --go_opt=paths=source_relative \ - --go-grpc_out=. --go-grpc_opt=paths=source_relative \ - ./chat.proto \ No newline at end of file diff --git a/0xgo/grpc/client/certs/ca.pem b/0xgo/grpc/client/certs/ca.pem deleted file mode 100644 index bce9d76..0000000 --- a/0xgo/grpc/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUfHY1zHmm3s9LbMImhCYdyb5bCwYwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDJaFw0zNDA1MDkwNzA1 -NDJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCmEElAsjMBtS3yHcp6j3HOU0QGfGL8j5AacRqw8mt6xAtgWqZmwDD/Bkn8 -9tYV+quRY8ZgQM2imtV78NtVQedsrNJlCnAi1krJquTEv6UMf6k91h2pEMghvP05 -Lenr6EpKPlHvpWoO6cfZa3N9cogwn5WaApQYvX9O9cGbN6dSjd/mwSddqo+LBy27 -BQEfDIieeVVc4Kcb61ZY16tYWqB9GybtaNoElZE1lsrBVJOnX2hDSKj+yoR46DgI -BsDkofCKCUrTI4YcUOSYS1sd/JbEeRkPvwXg/2BtUR9W29vV1pYVFBmzqFiC0sbf -9XQhy30fnQjJrGrWJA6RDVLYnSykNOoYNuLkGgm1ZlGlipwrbBz1kIP99554dXGN -4lnXk7js7l5lEsOo/c3lDtmjYRQlmPepyD2KCEbbbkK/u3DcMnS+AKL5m2VQuwvw -LTTDTvvXF+9yV69c6pRHh/w3JSPVh3HgMSe6dKc5S0CDunXh+cBNk9iIvKT7WKqJ -m5NuHITVVxOWlbBH2Wl1AOjzFjiYVLMvFNRAT3Cwh6h0ewWRYxm9bdLspZsEHhQK -Gz10f8KiK+Z9wNCRCKp1TMEsgXw7Q5jdzQNwFjaAu0uxTl4x5syCWI2zW2cPPwCg -SLSsozxbeson2Zj5/9ZDQngrbwCq0tEZPgHZaujW7igKQfwXdwIDAQABo1MwUTAd -BgNVHQ4EFgQUIm4H+A+/zncV06Pm4qSUetmIUBswHwYDVR0jBBgwFoAUIm4H+A+/ -zncV06Pm4qSUetmIUBswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEAJ12ZZyIvb0LQgsZuct0u54/23K0aula1B6vIZ/XxPmdb3wk87hL1D87Es2MU -MbM/5ZXVIK9SWB4pYqP2hxJq4Pcm/4HPxUrw3Cl3lh2uMnnYikX2IfofypwOaFUY -e5HMjO9r4AnosbxS85gVHRIcPKfQJdSEYUb/gPX9tpycWKse6FzE69p9dvh4oSBe -LTDAkNrkn5GC4Y/RqCfbhFytytEaUG/GN9e3P1Ye9Q6mxYXgkDC51+F4/EMzR1sp -rrR1mvP2y43JLV4WsUAhvNJfkIhd2IcKo7IYol4wYSb8HVt9h47KpTUzEIG/SS3+ -FuO/oc2Am27jKsj36IREA8gN0rQdIP8S3JQYy0Tp5+RYuk+l4p8uKzu+NCabKEh9 -ypINTKyyYRAWaQ5ns+xKuIEcIEroakL0fRvcivYBoea9Tk/P2cSYE8MBkjwfgsFp -8AQIF5AZhXV/428orAMUYj0OvDD3mx5mBwiD/6iV8PFpp0VWMsyF6e6KRV7PXJWV -r9GMfdMDaqg9+2Hf5ezBkvh2T50xJpc9BHoN6s5h4s+IE6nXzksc9OSXhfbSDlDZ -G/FNuIEV4rAZv1lAa3qa+JmZKYi+Ex66IS4FyGLFHAYDfGPyJKOwrLvu6FDDzDLP -jpkR2jP/4Duhyy0xX9UdMo3s88cuAMJG/GbaA3hjbibmw84= ------END CERTIFICATE----- diff --git a/0xgo/grpc/client/certs/ca_priv.pem b/0xgo/grpc/client/certs/ca_priv.pem deleted file mode 100644 index 2dd7175..0000000 --- a/0xgo/grpc/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -29CM/6ulbLzZRmRhZ6iH2H+MVH/6WA== ------END PRIVATE KEY----- diff --git a/0xgo/grpc/client/certs/ca_pub.pem b/0xgo/grpc/client/certs/ca_pub.pem deleted file mode 100644 index 64c7019..0000000 --- a/0xgo/grpc/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAphBJQLIzAbUt8h3Keo9x -zlNEBnxi/I+QGnEasPJresQLYFqmZsAw/wZJ/PbWFfqrkWPGYEDNoprVe/DbVUHn -bKzSZQpwItZKyarkxL+lDH+pPdYdqRDIIbz9OS3p6+hKSj5R76VqDunH2WtzfXKI -MJ+VmgKUGL1/TvXBmzenUo3f5sEnXaqPiwctuwUBHwyInnlVXOCnG+tWWNerWFqg -fRsm7WjaBJWRNZbKwVSTp19oQ0io/sqEeOg4CAbA5KHwiglK0yOGHFDkmEtbHfyW -xHkZD78F4P9gbVEfVtvb1daWFRQZs6hYgtLG3/V0Ict9H50Iyaxq1iQOkQ1S2J0s -pDTqGDbi5BoJtWZRpYqcK2wc9ZCD/feeeHVxjeJZ15O47O5eZRLDqP3N5Q7Zo2EU -JZj3qcg9ighG225Cv7tw3DJ0vgCi+ZtlULsL8C00w0771xfvclevXOqUR4f8NyUj -1Ydx4DEnunSnOUtAg7p14fnATZPYiLyk+1iqiZuTbhyE1VcTlpWwR9lpdQDo8xY4 -mFSzLxTUQE9wsIeodHsFkWMZvW3S7KWbBB4UChs9dH/CoivmfcDQkQiqdUzBLIF8 -O0OY3c0DcBY2gLtLsU5eMebMgliNs1tnDz8AoEi0rKM8W3rKJ9mY+f/WQ0J4K28A -qtLRGT4B2Wro1u4oCkH8F3cCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/grpc/client/main.go b/0xgo/grpc/client/main.go deleted file mode 100644 index dbb4648..0000000 --- a/0xgo/grpc/client/main.go +++ /dev/null @@ -1,113 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "crypto/x509" - "flag" - "io" - "log" - "os" - "time" - - pb "github.com/seantywork/0xgo/grpc/chatpb" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -const ( - defaultName = "world" -) - -var ( - addr = flag.String("addr", "localhost:50051", "the address to connect to") - name = flag.String("name", defaultName, "Name to greet") -) - -func main() { - flag.Parse() - - pemServerCA, err := os.ReadFile("certs/ca.pem") - if err != nil { - log.Fatalf("failed to load cert") - } - - certPool := x509.NewCertPool() - if !certPool.AppendCertsFromPEM(pemServerCA) { - log.Fatalf("failed to add server CA's certificate") - } - - config := &tls.Config{ - RootCAs: certPool, - } - - newTLSconfig := credentials.NewTLS(config) - - conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(newTLSconfig)) - if err != nil { - log.Fatalf("did not connect: %v", err) - } - defer conn.Close() - c := pb.NewChatterClient(conn) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name}) - if err != nil { - log.Fatalf("could not greet: %v", err) - } - - my_id := r.GetMessage() - - log.Printf("Greeting: %s", r.GetMessage()) - - r_stream, err := c.TalkToMe(ctx, &pb.TalkRequest{Message: my_id}) - - if err != nil { - log.Fatalf("could not get to talk to: %v", err) - } - - done := make(chan bool) - - recent_id := 0 - - go func() { - for { - resp, err := r_stream.Recv() - if err == io.EOF { - done <- true - return - } - if err != nil { - log.Fatalf("cannot receive %v", err) - } - - tc := resp.GetTalkContent() - - recent_id = int(tc.GetIndex()) - - log.Printf("Resp received: %s", tc.GetContent()) - } - }() - - <-done - - r2, err := c.WhatDidYouSay(ctx, &pb.HistoryRequest{Index: int64(recent_id)}) - - if err != nil { - log.Fatalf("could not ask: %v", err) - } - - it_said := r2.GetHistory() - - for i := 0; i < len(it_said); i++ { - - at := it_said[i].GetIndex() - - word := it_said[i].GetContent() - - log.Printf("it said [%d]: %s", at, word) - - } - -} diff --git a/0xgo/grpc/server/certs/server.csr b/0xgo/grpc/server/certs/server.csr deleted file mode 100644 index aecbae8..0000000 --- a/0xgo/grpc/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hCjGUVhpfyWPfOs2siwkYh -0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMIim9JET8rhOhxUMURgNJn -CT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJlujJFvp6mnfsZv/bjmcPddt -F+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfqoekwdumzc0zPaBtPNw7o -g+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9QWji/M+vnX00bnqoG6gE -HlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3zY4pPFPJNileetswLMlO -2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcRv0AgerWoXVYZ0sECi28v -P+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2Qk+q+qctzwcjosRL3VtV -vrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMeavrfuP5/osUo55bnMetw -PvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5kzv/FOKVjCcUqL/WJchS -AlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnPIiphWxhL28ae6okVabMh -T9ECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBjyokE3Sg/SWmcHRB95xJAW7rX -pFEatk+jC7kcChCltyqJjqsHrrv3xhLNO7oZ06uwYVgxSwVpLmEXSaIwvLdjdSQm -oOdXAOfyJNyqbzzNf8jBOq6g8tpM6mMCOS/qGM2dvH6lUTi4Rb3Zo08ArStMyFbI -GMh411ldy3lN2qAzascCrthtnMCqckEgs53hy8GEybb8qsqFC26GNUWFddab1lnj -1OZv+oNXD7iw+KB99wQm57Mj6ag1mp6sCbBgQefNGF0FCTVmquubNEyo0LV0u7PT -hVNG9dsVEoNQJiulJrLwZ0NxH/Do40Mdmmr677WWG2SL00kD/cADgA6TnXk5UeK9 -WeCec8uigp+rCHDyQV8SgsPiM92OZnFHuXGuqwuyvcSdb6oRSl0AJ0AigSmIA8m0 -1kwytUoh910wP4Bv2HIk+R8XnSxuqQzPeooV3swuiNSA0HHP2OR8mGZU4rLokgOQ -/rX1Oznqm7Vt6YYvh1EzdnPvYDv0e3XR5LtzUGhVF9VFAx8oIJ+UFnqHeTYEVbPr -qanZ6YCJj2F5lUYUz7ks/INVSDIOBiYnnmzOtUAbnphB9enNdhEGlcLLPpATFyhS -sriGg+hPeBEXL8QTmO2s96mcT7A9wDR5VgF9FcdmIKZWy+oXmM0hp+TIOdT3KkkX -YO6XW8nXYfog/hv98w== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/grpc/server/certs/server.key b/0xgo/grpc/server/certs/server.key deleted file mode 100644 index 8e0c7d1..0000000 --- a/0xgo/grpc/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -/6TjB2rKRjS0oMT76Qj95oAiG1IR ------END PRIVATE KEY----- diff --git a/0xgo/grpc/server/certs/server.pem b/0xgo/grpc/server/certs/server.pem deleted file mode 100644 index 0329993..0000000 --- a/0xgo/grpc/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUK0kjySLAqJHUbhc5Q0upk/b6HhQwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MTEwNzA1NDRaFw0yNTA1MTEwNzA1 -NDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMJxvD4pJTEqytOVJsuoQoxlFYaX8lj3zrNrIsJGIdMrI2WdLGMr -qcxoU5rEEAyOtU1Y59eB/3yuiXDQh5nzCIpvSRE/K4TocVDFEYDSZwk+0zOUmMPG -vxDOCp7ORkwKnwPfi1Gzwrq1k93DZiZboyRb6epp37Gb/245nD3XbRfr4/4WPUYj -649nrL5l3Ez7YZA/rJYrB5otJsnlfPTX6qHpMHbps3NMz2gbTzcO6IPgLii+TLMY -9NfFhVXtezFf7mm8VyFiu5ANz1HU9naF/UFo4vzPr519NG56qBuoBB5XytSIKx01 -y7KdKhPkTMiIXIC0ksvi/GMblOstLVYSN82OKTxTyTYpXnrbMCzJTtozjJ3RCo5O -Pc404mqZhs6CuCJ8IX24kJQMrFqArpCHEb9AIHq1qF1WGdLBAotvLz/mbimpZYdW -JfsNIPGcihG/NinDfgZXnsUk6hGKDF8ctkJPqvqnLc8HI6LES91bVb68HU33M8gF -9RQjwdvpQ62xzQbeDWBGoRjRzfsq1lETHmr637j+f6LFKOeW5zHrcD7zG0O9+yGk -u25aILyryjVBIH7p4kA1zJkziP8Clki7eZM7/xTilYwnFKi/1iXIUgJRPzaQEwDf -qWSAWZH56sRF+REQHejHpZ4Mr+ePZBMZzyIqYVsYS9vGnuqJFWmzIU/RAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUKDVEnh6vH1beZ6r4 -aF2jgcXZTLUwHwYDVR0jBBgwFoAUIm4H+A+/zncV06Pm4qSUetmIUBswDQYJKoZI -hvcNAQELBQADggIBAC6pDuSa+lUxW0cbf7Tzvo5NbB7tix4/XY6fNviSzwdpjAh+ -c9VqHoTT24j35bMx76Tlg7aGJbKKFsjk++njM3u/Digb7A95FQ/0Ly5myMpkjK8D -TedhTx2vEPbUY+nG2Au4yRvAN0WU7vDypTYPZ0AQVRokq2zeUmP60BE7xnb6+NdL -fJwTis4QX653S0D68aoV0w4RtiB9VhitODeEhwvsWGGqa+I20XqX3eI0KI3JkMCz -9fJtLRKn70Gnidh1TCfvlnfmWqoSTZz5/UGEBKa7bbNXIgW1S0EZYD+D583XOA9o -NKv8Ektw/lhwRzsfN0j1SNzPhBXX7TQt8eZCdGopw9UlXzF1+BZlQuG+MVh9JTzP -xXW/Uo7CmPMT5jZSQsfQb0mvG5JRQQ4x+4TlmA67OxBMM8+ko9W/4TJf9yxAmRIu -GLVS5xjgvG5yo9ckcexy/OEY9qXFWgWXn8pfbbNWW8CoL1Mk1hLICdxrUL6pyrFC -fdHhPJcDJPFaILqSRhT77UKpm4Y29V97ikb6sIjKWj1d2Z49yZN4yjtNQFeWlkVm -CuOFzHAHpI7SnFz9AzH1vwaM4XI+v6pTulrkXlCVt4+6GLJAXHUKBDiuFnEqqp0J -Mkx65S017e8WFTxLcmTbcKX/w15+2pi0kiCbm2IDiTEDJFzAjUhL7OJvceGg ------END CERTIFICATE----- diff --git a/0xgo/grpc/server/certs/server.pub b/0xgo/grpc/server/certs/server.pub deleted file mode 100644 index 28a26b8..0000000 --- a/0xgo/grpc/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnG8PiklMSrK05Umy6hC -jGUVhpfyWPfOs2siwkYh0ysjZZ0sYyupzGhTmsQQDI61TVjn14H/fK6JcNCHmfMI -im9JET8rhOhxUMURgNJnCT7TM5SYw8a/EM4Kns5GTAqfA9+LUbPCurWT3cNmJluj -JFvp6mnfsZv/bjmcPddtF+vj/hY9RiPrj2esvmXcTPthkD+slisHmi0myeV89Nfq -oekwdumzc0zPaBtPNw7og+AuKL5Msxj018WFVe17MV/uabxXIWK7kA3PUdT2doX9 -QWji/M+vnX00bnqoG6gEHlfK1IgrHTXLsp0qE+RMyIhcgLSSy+L8YxuU6y0tVhI3 -zY4pPFPJNileetswLMlO2jOMndEKjk49zjTiapmGzoK4InwhfbiQlAysWoCukIcR -v0AgerWoXVYZ0sECi28vP+ZuKallh1Yl+w0g8ZyKEb82KcN+BleexSTqEYoMXxy2 -Qk+q+qctzwcjosRL3VtVvrwdTfczyAX1FCPB2+lDrbHNBt4NYEahGNHN+yrWURMe -avrfuP5/osUo55bnMetwPvMbQ737IaS7blogvKvKNUEgfuniQDXMmTOI/wKWSLt5 -kzv/FOKVjCcUqL/WJchSAlE/NpATAN+pZIBZkfnqxEX5ERAd6Melngyv549kExnP -IiphWxhL28ae6okVabMhT9ECAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/grpc/server/main.go b/0xgo/grpc/server/main.go deleted file mode 100644 index ebdad56..0000000 --- a/0xgo/grpc/server/main.go +++ /dev/null @@ -1,202 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "flag" - "fmt" - "log" - "net" - "strconv" - "time" - - pb "github.com/seantywork/0xgo/grpc/chatpb" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -var allowed_names []string - -var user_idx int = 0 - -var loop_idx int = 0 - -var word_idx int = 0 - -var words = []string{ - "hello", - "my", - "name", - "is", - "test", - "program", -} - -var history pb.HistoryResponse - -var ( - port = flag.Int("port", 50051, "The server port") -) - -type server struct { - pb.UnimplementedChatterServer -} - -func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { - log.Printf("Received: %v", in.GetName()) - - allowing := in.GetName() + "-" + strconv.FormatInt(int64(user_idx), 10) - - user_idx += 1 - - allowed_names = append(allowed_names, allowing) - - return &pb.HelloReply{Message: allowing}, nil -} - -func (s *server) TalkToMe(in *pb.TalkRequest, srv pb.Chatter_TalkToMeServer) error { - - log.Printf("Received: %v", "talk") - - if len(allowed_names) == 0 { - - return fmt.Errorf("no allowed user") - } - - hit := 0 - name := "" - - for i := 0; i < len(allowed_names); i++ { - - name = in.GetMessage() - - if name == allowed_names[i] { - - log.Printf("found: %v", name) - - hit = 1 - - break - - } - - } - - if hit != 1 { - - return fmt.Errorf("failed to retrieve user") - - } - - max_idx := len(words) - 1 - - for { - - if loop_idx > max_idx { - - loop_idx = 0 - - break - - } - - tc := pb.TalkContent{ - Index: int64(word_idx), - Content: words[word_idx], - } - - history.History = append(history.History, &tc) - - resp := pb.TalkResponse{ - TalkContent: &tc, - } - - if err := srv.Send(&resp); err != nil { - - log.Printf("send error %v", err) - - } - - loop_idx += 1 - - word_idx += 1 - - time.Sleep(time.Second * 1) - - } - - return nil -} - -func (s *server) WhatDidYouSay(ctx context.Context, in *pb.HistoryRequest) (*pb.HistoryResponse, error) { - - log.Printf("Received: %v", in.GetIndex()) - - if len(history.History) < 3 { - - null_array := []*pb.TalkContent{} - - hr := pb.HistoryResponse{ - History: null_array, - } - - return &hr, fmt.Errorf("not enough has been said") - - } - - idx_from := in.GetIndex() - - i := 0 - - resp_array := []*pb.TalkContent{} - - for { - - if i > 2 { - break - } - - target_idx := int(idx_from) - i - - history_el := history.History[target_idx] - - resp_array = append(resp_array, history_el) - - i += 1 - } - - resp := pb.HistoryResponse{ - History: resp_array, - } - - return &resp, nil -} - -func main() { - flag.Parse() - - serverCert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") - if err != nil { - log.Fatalf("failed to load cert and key") - } - - config := &tls.Config{ - Certificates: []tls.Certificate{serverCert}, - } - - newTLSconfig := credentials.NewTLS(config) - - lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } - s := grpc.NewServer( - grpc.Creds(newTLSconfig), - ) - - pb.RegisterChatterServer(s, &server{}) - log.Printf("server listening at %v", lis.Addr()) - if err := s.Serve(lis); err != nil { - log.Fatalf("failed to serve: %v", err) - } -} diff --git a/0xgo/gsheet/.gitignore b/0xgo/gsheet/.gitignore deleted file mode 100644 index 1eb0597..0000000 --- a/0xgo/gsheet/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -config.yaml -token.json \ No newline at end of file diff --git a/0xgo/gsheet/Makefile b/0xgo/gsheet/Makefile deleted file mode 100644 index 8cc72f9..0000000 --- a/0xgo/gsheet/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: - - go build -o gsheet.out . - -clean: - - rm -r *.out \ No newline at end of file diff --git a/0xgo/gsheet/core/modules.go b/0xgo/gsheet/core/modules.go deleted file mode 100644 index c3a2b61..0000000 --- a/0xgo/gsheet/core/modules.go +++ /dev/null @@ -1,111 +0,0 @@ -package core - -import ( - "context" - "encoding/json" - "fmt" - "log" - "net/http" - "os" - - "golang.org/x/oauth2" - "gopkg.in/yaml.v3" -) - -type GsheetConfig struct { - CRED_PATH string `yaml:"CRED_PATH"` - SHEET_ID string `yaml:"SHEET_ID"` - SHEETS []string `yaml:"SHEETS"` -} - -func GetGsheetConfig() (GsheetConfig, error) { - - var gsh_conf GsheetConfig - - file_b, err := os.ReadFile("./config.yaml") - - if err != nil { - - return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error()) - - } - - err = yaml.Unmarshal(file_b, &gsh_conf) - - if err != nil { - - return gsh_conf, fmt.Errorf("failed to read conf: %s", err.Error()) - - } - - return gsh_conf, nil -} - -func GetGsheetClient(config *oauth2.Config) (*http.Client, error) { - - var http_client *http.Client - - tokFile := "token.json" - tok, err := GetGsheetTokenFromFile(tokFile) - if err != nil { - tok, err = GetGsheetTokenFromWeb(config) - - if err != nil { - - return http_client, fmt.Errorf("failed to get gsheet client: %s", err.Error()) - - } - - SaveGsheetToken(tokFile, tok) - } - - http_client = config.Client(context.Background(), tok) - - return http_client, nil -} - -func GetGsheetTokenFromWeb(config *oauth2.Config) (*oauth2.Token, error) { - - var tok *oauth2.Token - - authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) - - fmt.Printf("Go to the following link in your browser then type the "+ - "authorization code: \n%v\n", authURL) - - var authCode string - - if _, err := fmt.Scan(&authCode); err != nil { - - return tok, fmt.Errorf("failed to get web token: %s", err.Error()) - } - - tok, err := config.Exchange(context.TODO(), authCode) - - if err != nil { - return tok, fmt.Errorf("unable to retrive token from web: %s", err.Error()) - } - - return tok, nil -} - -func GetGsheetTokenFromFile(file string) (*oauth2.Token, error) { - f, err := os.Open(file) - if err != nil { - return nil, err - } - defer f.Close() - tok := &oauth2.Token{} - err = json.NewDecoder(f).Decode(tok) - return tok, err -} - -func SaveGsheetToken(path string, token *oauth2.Token) { - fmt.Printf("Saving credential file to: %s\n", path) - f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - log.Fatalf("Unable to cache oauth token: %v", err) - } - defer f.Close() - json.NewEncoder(f).Encode(token) -} diff --git a/0xgo/gsheet/main.go b/0xgo/gsheet/main.go deleted file mode 100644 index c0c8aa1..0000000 --- a/0xgo/gsheet/main.go +++ /dev/null @@ -1,110 +0,0 @@ -package main - -import ( - "context" - "fmt" - "os" - - "golang.org/x/oauth2/google" - "google.golang.org/api/option" - "google.golang.org/api/sheets/v4" - - gshcore "github.com/seantywork/0xgo/gsheet/core" -) - -func main() { - - ctx := context.Background() - - gsh_conf, err := gshcore.GetGsheetConfig() - - if err != nil { - - fmt.Println(err.Error()) - - return - - } - - cred_path := gsh_conf.CRED_PATH - - cred_b, err := os.ReadFile(cred_path) - - if err != nil { - - fmt.Println(err.Error()) - - return - } - - client_config, err := google.ConfigFromJSON(cred_b, "https://www.googleapis.com/auth/spreadsheets.readonly") - - if err != nil { - - fmt.Println(err.Error()) - - return - } - - client, err := gshcore.GetGsheetClient(client_config) - - if err != nil { - - fmt.Println(err.Error()) - - return - - } - - srv, err := sheets.NewService(ctx, option.WithHTTPClient(client)) - - if err != nil { - - fmt.Println(err.Error()) - - return - - } - - sheet_id := gsh_conf.SHEET_ID - - sheets_len := len(gsh_conf.SHEETS) - - for i := 0; i < sheets_len; i++ { - - target_sheet := gsh_conf.SHEETS[i] - - resp, err := srv.Spreadsheets.Values.Get(sheet_id, target_sheet).Do() - - if err != nil { - - fmt.Printf("failed to get values from: %s: %s\n", target_sheet, err.Error()) - - return - - } - - if len(resp.Values) == 0 { - - fmt.Printf("no data found for: %s\n", target_sheet) - - } else { - - for _, row := range resp.Values { - - col_len := len(row) - - for j := 0; j < col_len; j++ { - - fmt.Printf("%s ", row[j]) - - } - - fmt.Printf("\n") - - } - } - - } - -} diff --git a/0xgo/gui/main.go b/0xgo/gui/main.go deleted file mode 100644 index 7dc372a..0000000 --- a/0xgo/gui/main.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "fyne.io/fyne/v2/app" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" -) - -func main() { - a := app.New() - w := a.NewWindow("Hello") - - hello := widget.NewLabel("Hello Fyne!") - w.SetContent(container.NewVBox( - hello, - widget.NewButton("Hi!", func() { - hello.SetText("Welcome :)") - }), - )) - - w.ShowAndRun() -} diff --git a/0xgo/http/Makefile b/0xgo/http/Makefile deleted file mode 100644 index 804008c..0000000 --- a/0xgo/http/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: - - go build -o client/client.out ./client - - go build -o server/server.out ./server - - - - diff --git a/0xgo/http/certgen.sh b/0xgo/http/certgen.sh deleted file mode 100755 index bdb69b5..0000000 --- a/0xgo/http/certgen.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - - -mkdir -p ./client/certs - -mkdir -p ./server/certs - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/http/client/certs/ca.pem b/0xgo/http/client/certs/ca.pem deleted file mode 100644 index 4468555..0000000 --- a/0xgo/http/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUTe8SZnDGd5n9bMbehALXP2GGBeEwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM2NThaFw0zNDEwMzEwODM2 -NThaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDTv+CZXgDHH7Vh9wqa63EwW7suKDOaKsL94Hcf6wu2LccF5mlouuWbB2U1 -Ji1SoFrsZ1apqR5x/1xk99UN5vagP8zJSvAIRok46xbab+Ci2L7CbKofENm9VhS5 -qAZuGb824pcoKCsywoectrGRrGvL+2dCJvmvSTimqz+/Pb8b5ur22y9zze3l67RB -ggkQZTFKL8URNP1LJWosnI5h6l8+3tAa78Bm6lLVmb3A6eP/DP1f8A7A5iO7z/EP -qoCPP5yf3/9+nWhZIJEEO5CKQFiRdo/RSAaGK+eY0tfvT5hFq89PIR6PHvggAwgB -sTpBFeuSuEgdcTQ7v6yChB3t+0jh1YtiuSmjOQ+4Uix8TYlGMf0vaIVPKzUEFYB9 -BYLXWN9BvQmyMLeqxOXgGvGUmUtXKfesQZIJ1ro8jl0h+Isjv61dQGgs01DDvBV8 -pKzs+vB0tcHP6+V7XSu98SCdM6i4w2aerXZO7KVfj3gRpb+IRcvGXvK0j2al4h23 -HTf2lVNBKHIQYPSZAr+wKo4oLJqWrVKdI34qB0GBprz8bYTxWM7UZJtu6MnJhyFT -O0fS6hbD266HyrQILpURRmc/8AL+I/U5oVAK1U+6ViGKNcyqpN/d6rwNYFyKLnab -T5VcsyLFPoutizjGo4wFTab83ddkwLOR14TdLP+Xq0d0DZ6w6QIDAQABo1MwUTAd -BgNVHQ4EFgQUCI7gGU1vOV0ENPD/eujH47lzH6kwHwYDVR0jBBgwFoAUCI7gGU1v -OV0ENPD/eujH47lzH6kwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEAnF2DWc+A6P85ND6T4yqQ6Xr+S5qTYl2d5AUKDaU1IEg6z6eMUxnu5DZRukD5 -HLSUJa13qRR935oth/EG+r78td3BFmbS9eMjlp+FA3Bkh9PIxtfj0IaUoitiSV1c -kg6FGE7XYfSYh6TkCK5WN8fJ0Qtr40PyI2Uz9UfMIbMEtGtsJZ5enG5H6IGp5cCo -5+pKRwdMBObeiceh28nloiktJJQrIbOWF/SaiL5U2+zmeEpNO0w041BwObBttBE7 -lB1MtgSsPuDgKjOVrWOjYTWg7eA5arZ1Ush8p8POYtJiWV5mmOK/ancKjvj05Ouv -HTZvfDNBpMWG7DsMgJINvuqLXSbBfDk5UGw8VCdhtqW/3wuR9Wspt6eIgxst/JPD -pXP3ddxJ3xeNE3cujZTQWASNIcXRbEU0AF/leqydOdtDWLQCI4jWKpGx+ZtZ3c96 -8uJwmI3V8ILZF75H1z3JyCqdmFHHQw+n3Q6CFMqOFXucKsHK8aEH8h48yMhS90wN -VXJ9pbI2TYi5bBn+XmImcRv0kd7mASF/1n9s1hK5r/dNHbEhyCNNl8kBnIoQak4g -EcLIma7XPZJg4g00JnR+w8Zx4YG5oeNIFii+OxCHwNSWYYNE/mHrzeJvGi2NQuHW -vIVlZgebDgPxkxd+jvcnxMm6Dn9TOqWHiTUiPxkQu05rgXg= ------END CERTIFICATE----- diff --git a/0xgo/http/client/certs/ca_priv.pem b/0xgo/http/client/certs/ca_priv.pem deleted file mode 100644 index ad15298..0000000 --- a/0xgo/http/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -22FUN0cT9cuPJkirjHxJ6UA+whMp ------END PRIVATE KEY----- diff --git a/0xgo/http/client/certs/ca_pub.pem b/0xgo/http/client/certs/ca_pub.pem deleted file mode 100644 index 0027ba9..0000000 --- a/0xgo/http/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA07/gmV4Axx+1YfcKmutx -MFu7LigzmirC/eB3H+sLti3HBeZpaLrlmwdlNSYtUqBa7GdWqakecf9cZPfVDeb2 -oD/MyUrwCEaJOOsW2m/goti+wmyqHxDZvVYUuagGbhm/NuKXKCgrMsKHnLaxkaxr -y/tnQib5r0k4pqs/vz2/G+bq9tsvc83t5eu0QYIJEGUxSi/FETT9SyVqLJyOYepf -Pt7QGu/AZupS1Zm9wOnj/wz9X/AOwOYju8/xD6qAjz+cn9//fp1oWSCRBDuQikBY -kXaP0UgGhivnmNLX70+YRavPTyEejx74IAMIAbE6QRXrkrhIHXE0O7+sgoQd7ftI -4dWLYrkpozkPuFIsfE2JRjH9L2iFTys1BBWAfQWC11jfQb0JsjC3qsTl4BrxlJlL -Vyn3rEGSCda6PI5dIfiLI7+tXUBoLNNQw7wVfKSs7PrwdLXBz+vle10rvfEgnTOo -uMNmnq12TuylX494EaW/iEXLxl7ytI9mpeIdtx039pVTQShyEGD0mQK/sCqOKCya -lq1SnSN+KgdBgaa8/G2E8VjO1GSbbujJyYchUztH0uoWw9uuh8q0CC6VEUZnP/AC -/iP1OaFQCtVPulYhijXMqqTf3eq8DWBcii52m0+VXLMixT6LrYs4xqOMBU2m/N3X -ZMCzkdeE3Sz/l6tHdA2esOkCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/http/client/main.go b/0xgo/http/client/main.go deleted file mode 100644 index 0590ec3..0000000 --- a/0xgo/http/client/main.go +++ /dev/null @@ -1,74 +0,0 @@ -package main - -import ( - "bytes" - "crypto/tls" - "crypto/x509" - "encoding/json" - "log" - "net/http" - "os" -) - -type CommJSON struct { - Data string `json:"data"` -} - -func main() { - - certpool := x509.NewCertPool() - - file_b, err := os.ReadFile("certs/ca.pem") - - certpool.AppendCertsFromPEM(file_b) - - tlsConfig := &tls.Config{ - RootCAs: certpool, - } - - transport := &http.Transport{TLSClientConfig: tlsConfig} - client := &http.Client{Transport: transport} - - req := CommJSON{ - Data: "hello", - } - - respjson := CommJSON{} - - jb, err := json.Marshal(req) - - if err != nil { - log.Println(err) - return - } - - r, err := http.NewRequest("POST", "https://localhost:8888/hello", bytes.NewBuffer(jb)) - - if err != nil { - log.Println(err) - return - } - - r.Header.Add("Content-Type", "application/json") - - resp, err := client.Do(r) - - if err != nil { - log.Println(err) - return - } - defer resp.Body.Close() - - log.Printf("is HTTP 1: %v (%s)\n\n", resp.ProtoAtLeast(1, 0), resp.Proto) - - derr := json.NewDecoder(resp.Body).Decode(&respjson) - - if derr != nil { - log.Println(err) - return - - } - - log.Printf("server data: %s\n", respjson.Data) - -} diff --git a/0xgo/http/server/certs/server.csr b/0xgo/http/server/certs/server.csr deleted file mode 100644 index 6ddb8f2..0000000 --- a/0xgo/http/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQA9Y1FbEGElToEt033eTv -dlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9eRGMDJFu04Xzk7Btb8Q7 -gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03dKvGe2riOmcbQtLl46MDY -RTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NNgztjvN6o+C3sjl/GLSkM -5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5BdhwX8tlWlZcAiW29lKAr9MF -zOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnLW2SNWC1mDL0qqC/UlOle -YjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN5ftcECCPHp2pZYSnLyuq -CsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDrune+AIhz6TyglXA5YN1az -WEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8EDIR2qkDu/Y/b/C5u1kM6 -EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7ON77gOPrVIE+Bb5KwDR7 -FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXklbFR0RPzUNMFoOgAJ0/EJ -w+MCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBN7eYXm1UbAP4poWU3z6GxBZKY -yhFu2QBky1ONenyDk6mvZHmQItzSycx/bpV0MwRdyH/w4FriVJcuuEm5DiLYyvEm -nIdxb/4zl728ZLQg/9o+mR9gN/wE8nSHg0B2reB5/aeDcRxGi3x9eBXyblG56nuO -Gte5jsCn0vqjLbbTNAQakk/YKzekpME1fMbEKxd4xP9r3rlK0ZFd9hs7WRld3zWX -pG+bw+U5MS/IPfm4Rar/l0eGc7D5H2hpzuJCClukdFWvn1Vco3c1Owv4JYGG6lJs -JS2hy2yNFBzJlhXyF1v51TDCLVisyEPm8lkRfMx5EUFPesbmd2t5VIw9A88gnUIK -b8Wn+kmV1TkCdOswwPC5IbUrKejyrCn4a49pXPfdpXyI0uhwkrWoUz91EZgUnqcO -UMdvxjZuWXx25I+rhMFeR4qHLyMfm5vbnS0+HwTLNuy2qpd5xIUCwtCVOgcUONez -5Ax/HMmPUdpCCpKaDRjp/xl8B76eY5ex/YSCCeKaKy42vZ0qoUvXKM6fsg7HRQHr -p551Gv+xIv2ikdbg/p2xLGQPAsVVRLeBhcTvQJokgPNsY/RcaSy5cprSE7ux0Rpd -VDuPPLSM5fe3pfGBUXxbCNsULdAL6bLQcrwe1OCV9GMZ7sVdmvgFoDtGT1yc34tF -xa7gfed6079H5p6Bfg== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/http/server/certs/server.key b/0xgo/http/server/certs/server.key deleted file mode 100644 index c2eb360..0000000 --- a/0xgo/http/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -GnWPPl7p4Kc8fCTK1vZnmhI4kAK+Lw== ------END PRIVATE KEY----- diff --git a/0xgo/http/server/certs/server.pem b/0xgo/http/server/certs/server.pem deleted file mode 100644 index d5ba7bc..0000000 --- a/0xgo/http/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUKXjjSj2aCl9FGUjbp8HZlPjABAswDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODM3MDBaFw0yNTExMDIwODM3 -MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKfjkBOhQs/pNClyRLFRUAPWNRWxBhJU6BLdN93k73ZUBJ5ZbxUy -yLaQx1kNt5gr9iO8uOM548XRbdP8daRLvXkRjAyRbtOF85OwbW/EO4F+H9f6CcdN -tK3yvHhXzZmXvZ8exREJfciav7ozaH9N3Srxntq4jpnG0LS5eOjA2EU5QHplMg13 -twQtDZn/5WyHP2rg1Ro9Beg7/6nz2jtzTYM7Y7zeqPgt7I5fxi0pDOYT8lW5HQOz -vH2RHSQm0YjSBy7FEZzhsAmU4wJJuQXYcF/LZVpWXAIltvZSgK/TBczhg08Sv7iP -lt4kXMxdnXmCeAa0HgtEEOjY+whpR4CZy1tkjVgtZgy9Kqgv1JTpXmI2JEyMNf92 -SBBAuMqesId/ZdkY2Jz1Oc4hKuXpXMGiTeX7XBAgjx6dqWWEpy8rqgrBkc1PIbNH -QpN+m47URElQS2t6UBm/Yn1ONpcKrMw67p3vgCIc+k8oJVwOWDdWs1hKYPzh8T0j -hVpmWNhBRo9PtaHC8tY2m2kdA3H7fv2fBAyEdqpA7v2P2/wubtZDOhFOaSl0t3ZV -jpLu1zsZyHSiDk8LvNy86AgJ4X4ANqeVuzje+4Dj61SBPgW+SsA0exSuJxB85V3O -VL+FqINmbHDDsyiPSlaP3MsAfKhj0ZV5JWxUdET81DTBaDoACdPxCcPjAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUJUhYdx2t7K6kqubV -e4Ls3gzjbecwHwYDVR0jBBgwFoAUCI7gGU1vOV0ENPD/eujH47lzH6kwDQYJKoZI -hvcNAQELBQADggIBAIzZatOoI8fvzRiqOEQp+wJ2nErevSbNijJZta0aWOAWNuaj -cikA4nlRCKbUiIlo1iIBUwf6VE2nSNHn7Z5Cbe4UMcAKBYbGe/eUWj4UOYAsrGfT -Ueg6Tr9sfVZ2ipllX576RNHXkBM/z2whOmdVbDslIe0Z/4bQ0RKbj+V/qq5N2GQ3 -6mjDWsuuHgv0aGoOUYIe3NU5oB51ZPQySUFr7uk6Qkd+oz/3OID+RYOivuIk8u1Q -fryGdEwjmhPDHwX1w7ibUlzfiJpV65u7Iv9qg4e3clvPy7CLUqzOb0m+zpefYwb8 -ED+Gm4SKRDJZb8Uu4gNvKIZwyWtuPhVla97xdviOxI/uyY+1rNQqr5/bQHVGjr6M -iop1D3aEL+DWFqoZ5FM2lPx3ced/b4qHKA6uFk0/U4NusmMEWWhE6djfmTupWx+H -nntYCyDk2y7qxMLI6Ft3LeQCbrfcM0e7XT9dfbIHM4R/cGrUOfCChoKlnsvt8SaJ -6ZYO0qH90VLdJ3m4dYD3wZqYRUwgqQaYkJlpeGsrDMaiqJwK/OIARhbckRsBamop -JOILc0T1TzAuQIUFdjFTdefzVymwcI6uOVcEui1OF7WMzS8A35MKEXKRqhXtNTX0 -8RRFNwRKcufvd1SAvWR/MWCAN6U19vcz/I4JmkMv6oj9uFE5A9cMswRAnJDV ------END CERTIFICATE----- diff --git a/0xgo/http/server/certs/server.pub b/0xgo/http/server/certs/server.pub deleted file mode 100644 index e0c2b96..0000000 --- a/0xgo/http/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp+OQE6FCz+k0KXJEsVFQ -A9Y1FbEGElToEt033eTvdlQEnllvFTLItpDHWQ23mCv2I7y44znjxdFt0/x1pEu9 -eRGMDJFu04Xzk7Btb8Q7gX4f1/oJx020rfK8eFfNmZe9nx7FEQl9yJq/ujNof03d -KvGe2riOmcbQtLl46MDYRTlAemUyDXe3BC0Nmf/lbIc/auDVGj0F6Dv/qfPaO3NN -gztjvN6o+C3sjl/GLSkM5hPyVbkdA7O8fZEdJCbRiNIHLsURnOGwCZTjAkm5Bdhw -X8tlWlZcAiW29lKAr9MFzOGDTxK/uI+W3iRczF2deYJ4BrQeC0QQ6Nj7CGlHgJnL -W2SNWC1mDL0qqC/UlOleYjYkTIw1/3ZIEEC4yp6wh39l2RjYnPU5ziEq5elcwaJN -5ftcECCPHp2pZYSnLyuqCsGRzU8hs0dCk36bjtRESVBLa3pQGb9ifU42lwqszDru -ne+AIhz6TyglXA5YN1azWEpg/OHxPSOFWmZY2EFGj0+1ocLy1jabaR0Dcft+/Z8E -DIR2qkDu/Y/b/C5u1kM6EU5pKXS3dlWOku7XOxnIdKIOTwu83LzoCAnhfgA2p5W7 -ON77gOPrVIE+Bb5KwDR7FK4nEHzlXc5Uv4Wog2ZscMOzKI9KVo/cywB8qGPRlXkl -bFR0RPzUNMFoOgAJ0/EJw+MCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/http/server/main.go b/0xgo/http/server/main.go deleted file mode 100644 index 31a047f..0000000 --- a/0xgo/http/server/main.go +++ /dev/null @@ -1,59 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/gin-gonic/contrib/sessions" - "github.com/gin-gonic/gin" -) - -type CommJSON struct { - Data string `json:"data"` -} - -func handlePostHello(c *gin.Context) { - - req := CommJSON{} - resp := CommJSON{} - - if err := c.BindJSON(&req); err != nil { - - log.Printf("failed to bind json: %s\n", err.Error()) - - c.JSON(http.StatusBadRequest, resp) - - return - } - - resp.Data = req.Data - - c.JSON(http.StatusOK, resp) - -} - -func createServer() *gin.Engine { - - genserver := gin.Default() - - store := sessions.NewCookieStore([]byte("SOLIAGAIN")) - - genserver.Use(sessions.Sessions("SOLIAGAIN", store)) - - // genserver.LoadHTMLGlob("view/**/*") - - // genserver.Static("/public", "./public") - - genserver.POST("/hello", handlePostHello) - - return genserver - -} - -func main() { - - e := createServer() - - e.RunTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key") - -} diff --git a/0xgo/http2/Makefile b/0xgo/http2/Makefile deleted file mode 100644 index 804008c..0000000 --- a/0xgo/http2/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: - - go build -o client/client.out ./client - - go build -o server/server.out ./server - - - - diff --git a/0xgo/http2/certgen.sh b/0xgo/http2/certgen.sh deleted file mode 100755 index 81dd186..0000000 --- a/0xgo/http2/certgen.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - -mkdir -p ./client/certs - -mkdir -p ./server/certs - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/http2/client/certs/ca.pem b/0xgo/http2/client/certs/ca.pem deleted file mode 100644 index 6d56e87..0000000 --- a/0xgo/http2/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUMm3y7oQMKrW33ouncVunNZJAqGUwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDFaFw0zNDEwMzEwNzQx -NDFaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnQRtxoldMAoPUKy1JbSX1r3FGTs9nLKidsl8vpFKplWpCvjLRYCAfFlhY -hltMAEYihnsPWJBEqp/UKHMATJeLY/d0iiEdJIntc5O3HGnXgbaH0wB6dvJRpwxR -sW8b4f9cHguQbbNqCk84ZTnX3xPajzAdUlt6eQwGwwI3OIfUJqXPO6X5AuZQlNt/ -stG6ZVCXj8/H0/u5SiEfTT2uW3DKmugoswy9fgNguIFWTOstz1RrW6Oxe0CinAtw -f40VsBG4bwhWlGFHOdVGLBHe/FVv4LFQo9C5pn05H4gxRa/Oly+G0v2+fHwbK/vb -6B2Evxn0IODT6wL+owujdvxztd9f0OjBAiA/0+6wc9AyOvdiOfmqXGoM8vADU1RF -ZFx8ZWCAHs5jbglzvwWzHHyc0y9jijc2y72aEl1jWDJTPXGRQpYD95cgyOlVHnx/ -qSzLpGZmnls40JPUP5fCcyj+mXIV+KF5JO4HV2fTvFme5xZJCjujbXTAn24ELtkN -LTiyx9iOZkXYEa1I+Pvjiv5sNgI8tNwpZAKSgwQJ1Le4eqPzP0YSLrfDbNJdnGFQ -PAZGXzCk3JARM8PPo+/s8T+i0kGMwee2p5rI5593joKTLM6lLO3ou+R34CAFe9Ae -OOkHjWQ93JiONo5EgHCes8RBgzfRn8rmOVRxB0FnxrqvS1tSmwIDAQABo1MwUTAd -BgNVHQ4EFgQUgoQLRoUoITdNuR2EcO1+gCnNHrwwHwYDVR0jBBgwFoAUgoQLRoUo -ITdNuR2EcO1+gCnNHrwwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEAFaZv4LRlap5v8chyeme3MOEZh+SexQPcD/E5ZLuYxTT5fDa6oSDz1Sa8zyYj -g5bqOqoGOvUjpY2stdZyQKJOGSLQk+Qs2atAPSz1n+MuyAVh/IgEk13/kA9R6dXc -IBTDDAZT2zwGFfz0K2cL1NlD4KZlC+POhYNWQfaR7vk3hjt3d7kbq2wBPkenVNVu -HA05vYpVhoZ/bZDwR7V5hwDOR6JvPLoe48gBE7AV3F+ZWEnv/E2qum0pTWpmIy0k -wIXES0g4ItVIlHj+BZF8rWPFW155S8yHHCvNw7FY9VJFfoG6JnZokxkUQR/M6L4w -dIrkcmdfL7QPXMecWiX6sFV6MHP/5ulNYi05jwbi+F0yrUIi2m/AmMyFp8LO5jbW -5uGL+9JDuVLFmrdOO9s5zv5upCKwPeZ1XVMlK5w/uS7uJ5+CfrjFooTv/+4RRrvS -udKRwvXz2Q25yo5GiwgSBQCKI56DIlmUyHI9WcxjBvG91Kpj6jkRgcHbtJrDMc+f -LaQEOoSvZQbi0YUP72YDYCspijlJ8QR4g/MM+HNOetOwTNTRlb7wsTURzWDn6VVo -1ZyJS/a9Snd8f24fUXSlpajTbTa+Ya/A7Qzkgk4Ck+CSwCWzyT2EXMQerljdMyhc -6sheDhGn9f5X038dyaewL0in36QhNqKxEwon4TO9VWV5ll4= ------END CERTIFICATE----- diff --git a/0xgo/http2/client/certs/ca_priv.pem b/0xgo/http2/client/certs/ca_priv.pem deleted file mode 100644 index d0dc859..0000000 --- a/0xgo/http2/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -lIYAoKcwoRG7WlexQm7SRnHWMGGW9Q== ------END PRIVATE KEY----- diff --git a/0xgo/http2/client/certs/ca_pub.pem b/0xgo/http2/client/certs/ca_pub.pem deleted file mode 100644 index 13b36e2..0000000 --- a/0xgo/http2/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp0EbcaJXTAKD1CstSW0l -9a9xRk7PZyyonbJfL6RSqZVqQr4y0WAgHxZYWIZbTABGIoZ7D1iQRKqf1ChzAEyX -i2P3dIohHSSJ7XOTtxxp14G2h9MAenbyUacMUbFvG+H/XB4LkG2zagpPOGU5198T -2o8wHVJbenkMBsMCNziH1Calzzul+QLmUJTbf7LRumVQl4/Px9P7uUohH009rltw -yproKLMMvX4DYLiBVkzrLc9Ua1ujsXtAopwLcH+NFbARuG8IVpRhRznVRiwR3vxV -b+CxUKPQuaZ9OR+IMUWvzpcvhtL9vnx8Gyv72+gdhL8Z9CDg0+sC/qMLo3b8c7Xf -X9DowQIgP9PusHPQMjr3Yjn5qlxqDPLwA1NURWRcfGVggB7OY24Jc78Fsxx8nNMv -Y4o3Nsu9mhJdY1gyUz1xkUKWA/eXIMjpVR58f6ksy6RmZp5bONCT1D+XwnMo/ply -FfiheSTuB1dn07xZnucWSQo7o210wJ9uBC7ZDS04ssfYjmZF2BGtSPj744r+bDYC -PLTcKWQCkoMECdS3uHqj8z9GEi63w2zSXZxhUDwGRl8wpNyQETPDz6Pv7PE/otJB -jMHntqeayOefd46CkyzOpSzt6Lvkd+AgBXvQHjjpB41kPdyYjjaORIBwnrPEQYM3 -0Z/K5jlUcQdBZ8a6r0tbUpsCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/http2/client/main.go b/0xgo/http2/client/main.go deleted file mode 100644 index 402a613..0000000 --- a/0xgo/http2/client/main.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io" - "log" - "net/http" - "os" - - "golang.org/x/net/http2" -) - -func main() { - - certpool := x509.NewCertPool() - - file_b, err := os.ReadFile("certs/ca.pem") - - certpool.AppendCertsFromPEM(file_b) - - tlsConfig := &tls.Config{ - RootCAs: certpool, - } - - transport := &http2.Transport{TLSClientConfig: tlsConfig} - client := &http.Client{Transport: transport} - - resp, err := client.Get("https://localhost:8888/hello") - - if err != nil { - log.Println(err) - return - } - defer resp.Body.Close() - - fmt.Printf("is HTTP2: %v (%s)\n\n", resp.ProtoAtLeast(2, 0), resp.Proto) - - io.Copy(os.Stdout, resp.Body) -} diff --git a/0xgo/http2/server/certs/server.csr b/0xgo/http2/server/certs/server.csr deleted file mode 100644 index a8ff909..0000000 --- a/0xgo/http2/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv60l4QTOtec1ilSs6vaVGz -iLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldGhrhQmHcpj7uGodZ0SMQU -n228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqtxzEaN1GdnxLjjigG9hAE -k8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH29Ql/NV79cHEFzoWJX831 -EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0ZbjSw5MrkMk7mToJOfnKuHY -NYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDIguCJtvxavM7iY8XFhZj2 -SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUTH1Zgoz8LF0AXN37pl2nq -SwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4dZjvBePK8UUG6F3lltJu0 -DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYSi02RRq0HDn/ApH9uwT+f -L8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7MppHLvfAJdF3SusbDgoU -vZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9n9DQEnIhdNu9jD3bGQhx -Aw8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCOsJn45TZzgno61B+3G6vB3N/2 -ZTfOSDef/HQyc0JVZbR5uoxw/4ac1GV/iDIFKiwBvC8siG5sNb1xvQTHm5MQPuqY -Avs/JCsO9FTfoo9GG8DeobtxC01PV4gNk5/BCtwNhr7ztjltdzA/hosX2b1D4iXC -DCnHm/NlMjohyPFWsleET6H1aGqY4sprunHAvj3nvM5kIHAy347ZKGBkSousGZs9 -+ysgq1N42cpmVMp9TZe4WOdpDrkTxXAxpRZhPnKU1uyPDv5tcI/d7DtNgmdiH4Hm -lwIw27Vkt3x7ZbQDYMbsoKY2wGzNgIjQOHjHS5eQZEtdneH6BDNkRTmkwnXG06q1 -Qdw/MSY667tJyKtdQlBSHWTMcYCSe01amkWPsYH1Ud9L05c0WuKHV2I4nhKAc6vZ -H3RX/Pj2WoWIikr7D6C1w6G47qTieCIh+N85AWEizjnlQKkaf8zzwMoiOJOjB/bQ -DYreYbC9sV9JZDHFzBiuou+WDB0nTkUnRxi4fVac2hU8xcg5hLrbVobSug2yqccv -s+qTgf2rQBcHDtYBS+ORPp6l1uE6bRpe3eUP6e20sjYmv5XPd5tSgoMcCo9IYi3b -9L25fFY9oCLAUjyE7spjknrfBfYUUaZV1u+ssQ/l+1AMWmp2JNEt0kCZnyzTMDtY -bsT3KS3zgcyxrcjwqg== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/http2/server/certs/server.key b/0xgo/http2/server/certs/server.key deleted file mode 100644 index 5052679..0000000 --- a/0xgo/http2/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -Z73kid71Rbb2DAbXN9OXUmSDNTC1 ------END PRIVATE KEY----- diff --git a/0xgo/http2/server/certs/server.pem b/0xgo/http2/server/certs/server.pem deleted file mode 100644 index cf3b1aa..0000000 --- a/0xgo/http2/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUNiH3wgbZ2sa232ix2HMRSTX/p9YwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwNzQxNDJaFw0yNTExMDIwNzQx -NDJaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKMSN2tksm/BNFgvc81L+tJeEEzrXnNYpUrOr2lRs4i2SUncPBfM -ND9yxssNE/vB8bG/HMksV1/9gcX2lApXRoa4UJh3KY+7hqHWdEjEFJ9tvMSxcb04 -546y9ZiiADfaNqycqLsHExYk6SeJz6MKrccxGjdRnZ8S444oBvYQBJPHdTvFhuCT -JdxtwnqcVd/EF2nIzELnltIKc3q3ekoR9vUJfzVe/XBxBc6FiV/N9RHYSlS9uFY5 -/Nlp92pzcTjv5niE0h/SaP6fFKcO0tGW40sOTK5DJO5k6CTn5yrh2DWMGt8jTYU5 -CoIia7uYi3qSQF2Tety4UXEpj93BrdkAyILgibb8WrzO4mPFxYWY9kmeIlkp/i8X -W+BxAbfZVc5eQLEIe95UktjEcXI6L1Y1Ex9WYKM/CxdAFzd+6Zdp6ksJGiGO3nax -usTFSJ9Jt5oJByZMxduh7KryC9+okosOHWY7wXjyvFFBuhd5ZbSbtA2pGEsf61sJ -gQIA5bmJmp+nmXC/C2av+1RGbe2H1j72EotNkUatBw5/wKR/bsE/ny/Ak21U5tTs -6SJn/z70EI+MiSx9ZKEx3ag38lCgEhEbuzKaRy73wCXRd0rrGw4KFL2d9hQqc5y9 -MjHA7vNe8Fe8uz0E8AF6ePqnqNpKzVgZfZ/Q0BJyIXTbvYw92xkIcQMPAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUI53WKowOvtTqI4Pm -h2Ak+AVURfQwHwYDVR0jBBgwFoAUgoQLRoUoITdNuR2EcO1+gCnNHrwwDQYJKoZI -hvcNAQELBQADggIBABEiS9WRtkMIgEfhwIl2Vrb12BHKcveGs+iJuzNKCEYE40R7 -j3c5FpPZ3X2rxvU/U4TTGCSQ8/ZtjcL/oRM6nVNw4pf3y3CvXsNVHd0QMnLGc2NZ -swkmvE4CKCzmHOTAHVcPefyMC1fG7xf6IzLGH0P36QQw3M6Qcv4462ZGY07iZGwV -qzEBYbOCVL1aawuz3Mu1+3Z/xTRlp3kaNjjkAM4xMvu8kxdfH2iCMu/6ExVwE+vu -qZ6B9sRXvfvoZQsfKlXSnqPMOAVfgbi0iqQmr+s00azI/2G9oVt632KPtRgWFsZx -yNPuiljo8DrhszSkwbZtGV0xkwTatz28scpO97OZfD3NaEdeCsc+oQgGC6ZYgDWD -e+hU4B9e9gnLK5T+uRaklBrFFMXjftP2wOmOWLsu+iizJOU9OGnbQmFJ/zPehUYb -Y4+5XifC0+UkR1/gwCsqb1VKRtqP2frLmyqe+3XXKHUDPcLE1OPmghMemc88UuxR -sAClRxD24xjasPf0CJHRlq9rpWnqHxdVWqcKt5eVzao+42xK0o9hYmfMtzbaFJ1O -UperlRXOfPHfDXhoEuOjmiVzz7pf3JtsVUjt01/3pl6oUZjvnDJGm5B7ipqvHYUV -FRlIf7ltL/wvHAxYzlploypqr8oQN9fadIQ3IfdtqhM+0EMRyMRqKHQVspdq ------END CERTIFICATE----- diff --git a/0xgo/http2/server/certs/server.pub b/0xgo/http2/server/certs/server.pub deleted file mode 100644 index 6889ab0..0000000 --- a/0xgo/http2/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoxI3a2Syb8E0WC9zzUv6 -0l4QTOtec1ilSs6vaVGziLZJSdw8F8w0P3LGyw0T+8Hxsb8cySxXX/2BxfaUCldG -hrhQmHcpj7uGodZ0SMQUn228xLFxvTjnjrL1mKIAN9o2rJyouwcTFiTpJ4nPowqt -xzEaN1GdnxLjjigG9hAEk8d1O8WG4JMl3G3CepxV38QXacjMQueW0gpzerd6ShH2 -9Ql/NV79cHEFzoWJX831EdhKVL24Vjn82Wn3anNxOO/meITSH9Jo/p8Upw7S0Zbj -Sw5MrkMk7mToJOfnKuHYNYwa3yNNhTkKgiJru5iLepJAXZN63LhRcSmP3cGt2QDI -guCJtvxavM7iY8XFhZj2SZ4iWSn+Lxdb4HEBt9lVzl5AsQh73lSS2MRxcjovVjUT -H1Zgoz8LF0AXN37pl2nqSwkaIY7edrG6xMVIn0m3mgkHJkzF26HsqvIL36iSiw4d -ZjvBePK8UUG6F3lltJu0DakYSx/rWwmBAgDluYman6eZcL8LZq/7VEZt7YfWPvYS -i02RRq0HDn/ApH9uwT+fL8CTbVTm1OzpImf/PvQQj4yJLH1koTHdqDfyUKASERu7 -MppHLvfAJdF3SusbDgoUvZ32FCpznL0yMcDu817wV7y7PQTwAXp4+qeo2krNWBl9 -n9DQEnIhdNu9jD3bGQhxAw8CAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/http2/server/main.go b/0xgo/http2/server/main.go deleted file mode 100644 index 5dde53d..0000000 --- a/0xgo/http2/server/main.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "golang.org/x/net/http2" -) - -func helloHandler(w http.ResponseWriter, r *http.Request) { - - w.Write([]byte("hello")) -} - -func main() { - - http.HandleFunc("/hello", helloHandler) - - var srv http.Server - srv.Addr = "0.0.0.0:8888" - http2.ConfigureServer(&srv, &http2.Server{}) - - err := srv.ListenAndServeTLS("certs/server.pem", "certs/server.key") - if err != nil { - log.Fatal("ListenAndServe: ", err) - } -} diff --git a/0xgo/http3/Makefile b/0xgo/http3/Makefile deleted file mode 100644 index 804008c..0000000 --- a/0xgo/http3/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: - - go build -o client/client.out ./client - - go build -o server/server.out ./server - - - - diff --git a/0xgo/http3/certgen.sh b/0xgo/http3/certgen.sh deleted file mode 100755 index bdb69b5..0000000 --- a/0xgo/http3/certgen.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - - -mkdir -p ./client/certs - -mkdir -p ./server/certs - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/http3/client/certs/ca.pem b/0xgo/http3/client/certs/ca.pem deleted file mode 100644 index f889c44..0000000 --- a/0xgo/http3/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUS2Xr3/K1AiMYppcYEqVyQ8BB39IwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzJaFw0zNDA1MDEwNzI1 -MzJaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQDCdLeyc2+abS9AcrDwlqyVAuACxnVsR14+P77krZobHCcXOTtNF3YHB4f9 -3hpXRMaQiLlO8ZxtFXbw8IPT+x0vZ+imFA+IqWT7/J9hXIU6QIdO+MXAG4DwzvVL -krCuVypp+Gvu7/V00hPJIne/w8lCKp86BPm4LsJE3pVf7RuMgJa7bzt1p/bvzOlZ -7yMSE4hp8fyoiHUSedjA4VO2ycg3kDnts9Ldqg4GguwGQ5QDfAluDymwoLwpPwAs -sDyDObmsdo/clGVWT6MUsjwm8j76Of3FZ5yu6yywXqSsSXybNYpAkw/a0wapH31d -ONZ6qAvdmcJYaZJoQReJXkfaJtGRNV5I7NbZeoAekSJK40nM/vG2LWAcJJo2G6uV -aRbhB7AkN59zTduLFn06VmEJuWNcOyOWwcWZ8Fbp8TlV4kELXO/MX0wTkwpAHj9E -WxOOH5qmncyHOESyzou1wbMpyEOSSA0J8ySoBZob06hVqbtJoDj/uiGg1SIcy14s -gofdKJ++NwK6e1ZGoy5b6S4X/JgNnbdq4gS0M3A3KAGYA6PeU1ymS22YdXqTtatf -NVm1jaAGGkMyOZm6W92YKZdzQksMHLuLz2CkS4BuF9CFowrDNMCgk/CUsi4BFp27 -zvqXYWCIYOhS4BUZTuscAQpeI/Oo9BcCtZSgb0CqcpVGf+efVQIDAQABo1MwUTAd -BgNVHQ4EFgQUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wHwYDVR0jBBgwFoAUFQ+swYvY -beIM6DFpxjVYVJ0G4G0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEANqPpKGUIxjCuKEjDeCo8iQVg/VQSsbyygmh4S3oX92rtxfL0STbyGHcN2uOo -V2x6NAoZJS96Pr782e99TYbEmMDSowFeWQKslytJJgR00XkiCXRC49Rev62LkJe/ -tb30i9TmbEFNzGYhcIqU0kmLr/gP0uZmWthBU2D2XKErNTsEYMsQGGVDbK0xblC2 -dSda/XoBG9FRSpalG30PZkg1adBCJgIUa5uxKqc6Ik/zx3yZjVI7R15cdNASH8Po -4B3LASd2b+zSZNIiG94rxCv3K86xtpEncvfDNRZckZZ+5OxDlu0++W6bqCKIJAvQ -XzIjoypEzfosBPgS49J42KSC4dE+o3rRZmNICuyxJETCOcDIPWjHlifR45p8Ugjn -sCduQgk/6068QIQVwEJ3/lM4c/b2J2nFEVDa3+cpJLwgLpajUdMm9tgqcA3Vv5ce -xRYE1qJo09MPKG6/uq09K0q4yIDK6Oma4RMBjcLciUQA82AyNcHN31YbkASxCyeV -N4ySr3fM975o5JOPhHV7N/6xBWrUOS2eaOOridiMyzLl4/06Hg0y5b3mP6L3LlgK -QY32Ar0cEHJJRNCoyUgy5g1tkiDcw6H7DG+GL9kVXed6N3A5wReVal/1/5ulhEiv -A8N3rQrka2ccM7EMTzEEJwA3Dt9OWsl85OJz2RI3RN9oQBk= ------END CERTIFICATE----- diff --git a/0xgo/http3/client/certs/ca_priv.pem b/0xgo/http3/client/certs/ca_priv.pem deleted file mode 100644 index e576be0..0000000 --- a/0xgo/http3/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -6vyNiA+8sZAEJEQ9JfzRZ+simU+0Nw== ------END PRIVATE KEY----- diff --git a/0xgo/http3/client/certs/ca_pub.pem b/0xgo/http3/client/certs/ca_pub.pem deleted file mode 100644 index 1bd892d..0000000 --- a/0xgo/http3/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwnS3snNvmm0vQHKw8Jas -lQLgAsZ1bEdePj++5K2aGxwnFzk7TRd2BweH/d4aV0TGkIi5TvGcbRV28PCD0/sd -L2fophQPiKlk+/yfYVyFOkCHTvjFwBuA8M71S5Kwrlcqafhr7u/1dNITySJ3v8PJ -QiqfOgT5uC7CRN6VX+0bjICWu287daf278zpWe8jEhOIafH8qIh1EnnYwOFTtsnI -N5A57bPS3aoOBoLsBkOUA3wJbg8psKC8KT8ALLA8gzm5rHaP3JRlVk+jFLI8JvI+ -+jn9xWecrusssF6krEl8mzWKQJMP2tMGqR99XTjWeqgL3ZnCWGmSaEEXiV5H2ibR -kTVeSOzW2XqAHpEiSuNJzP7xti1gHCSaNhurlWkW4QewJDefc03bixZ9OlZhCblj -XDsjlsHFmfBW6fE5VeJBC1zvzF9ME5MKQB4/RFsTjh+app3MhzhEss6LtcGzKchD -kkgNCfMkqAWaG9OoVam7SaA4/7ohoNUiHMteLIKH3SifvjcCuntWRqMuW+kuF/yY -DZ23auIEtDNwNygBmAOj3lNcpkttmHV6k7WrXzVZtY2gBhpDMjmZulvdmCmXc0JL -DBy7i89gpEuAbhfQhaMKwzTAoJPwlLIuARadu876l2FgiGDoUuAVGU7rHAEKXiPz -qPQXArWUoG9AqnKVRn/nn1UCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/http3/client/main.go b/0xgo/http3/client/main.go deleted file mode 100644 index d4f31b3..0000000 --- a/0xgo/http3/client/main.go +++ /dev/null @@ -1,80 +0,0 @@ -package main - -import ( - "bytes" - "crypto/tls" - "crypto/x509" - "flag" - "io" - "log" - "net/http" - "os" - "sync" - - "github.com/quic-go/quic-go" - "github.com/quic-go/quic-go/http3" -) - -func main() { - quiet := flag.Bool("q", false, "don't print the data") - keyLogFile := flag.String("keylog", "", "key log file") - insecure := flag.Bool("insecure", false, "skip certificate verification") - flag.Parse() - urls := flag.Args() - - var keyLog io.Writer - if len(*keyLogFile) > 0 { - f, err := os.Create(*keyLogFile) - if err != nil { - log.Fatal(err) - } - defer f.Close() - keyLog = f - } - - caCert, err := os.ReadFile("certs/ca.pem") - if err != nil { - log.Fatalf("Reading server certificate: %s", err) - } - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM(caCert) - - roundTripper := &http3.Transport{ - TLSClientConfig: &tls.Config{ - RootCAs: caCertPool, - InsecureSkipVerify: *insecure, - KeyLogWriter: keyLog, - }, - QUICConfig: &quic.Config{}, - } - defer roundTripper.Close() - hclient := &http.Client{ - Transport: roundTripper, - } - - var wg sync.WaitGroup - wg.Add(len(urls)) - for _, addr := range urls { - log.Printf("GET %s", addr) - go func(addr string) { - rsp, err := hclient.Get(addr) - if err != nil { - log.Fatal(err) - } - log.Printf("Got response for %s: %#v", addr, rsp) - - body := &bytes.Buffer{} - _, err = io.Copy(body, rsp.Body) - if err != nil { - log.Fatal(err) - } - if *quiet { - log.Printf("Response Body: %d bytes", body.Len()) - } else { - log.Printf("Response Body (%d bytes):\n%s", body.Len(), body.Bytes()) - } - wg.Done() - }(addr) - } - wg.Wait() -} diff --git a/0xgo/http3/server/certs/server.csr b/0xgo/http3/server/certs/server.csr deleted file mode 100644 index fb291c1..0000000 --- a/0xgo/http3/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8POhrlqlIty5j6i95GfCA -4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUkNBLHwbh5fZzMxXpzZ6EG -9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMdzdcU7/eGKnYrl2KWSNCh -ZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TTozbuiABSTBt71+7AXnPfmA -YkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7+FEpSz40gEkZQAMOuUTL -4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGTYKEI9hfLP3nHHQhUfb6N -VHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6amR2fOQ/PBty3eFspxF7HL -NUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuNjdbXviouRZWP4JnCs9wU -k7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSmV5QW6Rb2DJ/XI+NLKsIe -FeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9AZOJBF5pKHAalf+vFzCp -5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaYiRMKasWFslUm74wOgPA1 -KIMCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQAeMrdaO0OS1FN3qLOkWdk7lLQs -1OYh5sQ81N6HMRO7yCLdIgZrK25i/w5RLb/amKGg2IUBW/5TmuGGfcn44g4MnKcw -MYAaEov72v4bSLtchMC3adcJq29+achKJsC9rBhKTN0wOCgpQqJIz6Vy+uYdKlcP -N4WrE9LmavmDLHcBDlV1BohYobzvl/VrLLlm46NmCwlAyyxwa1kF5Pcb6pmEY2qd -J/EeQjIx3GRZECibanWqvefHcLsDHcfHnbPxA4/W/8F1qzkcH5NKeyENXbluK5cL -Bo+FS9Zshn0/lOuj6DZcnYRGFh9HNrikG53ktZe256Q8AM9X1O1nOItFtjHBs5/F -lO6kcoOxDL3CCqr0ykF8pnQ4geeQq6T0Im6n8kQP8+OH+0MSES79HlZsp6fQk5E5 -uFMkHLEPdvi4GOmWM9tANb3oaeL73a+wytAkAwLccnzxuHnZAiORQeLWk6nrU/sP -Uq8yjsn0EgUmyHghlCghFprz8KTd8jzEI+MVgyIjCDGzhNnzoEvcnlMUnEyz84Ag -CxPE5rbgv7VvBcPFsDLRExYsCsHTsbRioOe/U6ol/avApwI0Cu8VjGK6nDGh2RSH -wDrBMX/m9Kh1D3vDfhUhstloWKcvPUFsJlUQea0H2P2SrYdLxYNFvFplbvwOtMw6 -+NPTjzkgsbvjgtvw8Q== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/http3/server/certs/server.key b/0xgo/http3/server/certs/server.key deleted file mode 100644 index 7eddacd..0000000 --- a/0xgo/http3/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -KLkG/qJU5C3Mvjes7O8jYjmCjxfL ------END PRIVATE KEY----- diff --git a/0xgo/http3/server/certs/server.pem b/0xgo/http3/server/certs/server.pem deleted file mode 100644 index 04fa24c..0000000 --- a/0xgo/http3/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUQr1JK18kJWCKyu7WBogsB5gZGIEwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDA1MDMwNzI1MzRaFw0yNTA1MDMwNzI1 -MzRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBANEhSmjAZyDOjtA48/ac/Dzoa5apSLcuY+oveRnwgOG8wKnIreLo -CeTRQJojX4Sw07Z0to9JDXgWLC46+XTlJDQSx8G4eX2czMV6c2ehBvfgAGmBJsFd -747MsWVN+FmPRNhJoEnWnZCGf095tK4THc3XFO/3hip2K5dilkjQoWYDjoIN2xJT -qmoZMujErX7NK3UQbwk+B8xs/Q3BP006M27ogAUkwbe9fuwF5z35gGJAFU/V4g3b -t8iFxewCld0WOiYxz0YI9reQN/oxwTVye/hRKUs+NIBJGUADDrlEy+MroC8XZ6ib -fb4tZ6MlU4O6dxawQsxbmMG8EBaIpvlhk2ChCPYXyz95xx0IVH2+jVR4SodRM8WC -LXOE+8RQM58zVhFsZS9nbomGX8KnrLempkdnzkPzwbct3hbKcRexyzVKQuT7l8tq -fGQT14nluKXNTvG1Uyoapy+UBN3NyqRbjY3W174qLkWVj+CZwrPcFJO7hBfysrC6 -nzEhhq5RgPWEAP0h/r+4jkeiTImKQBI0pleUFukW9gyf1yPjSyrCHhXl9lV8Bc6x -n59szCMxhLJuQF62N0rJMS3JLekEg8OSPQGTiQReaShwGpX/rxcwqeXJJzy8B3ei -qyooyHIaW/a/eqxbUMOqwhSHz4+rAAi2mIkTCmrFhbJVJu+MDoDwNSiDAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUztOHY4D+a1LHqT5U -Jy6DVw4m3pwwHwYDVR0jBBgwFoAUFQ+swYvYbeIM6DFpxjVYVJ0G4G0wDQYJKoZI -hvcNAQELBQADggIBAG/VaN8jCvcBuuo5tqgMgV1Ss8P/Arm63xhJ5nGNdiK+SbKC -BPB9ihqO+sXCUpV3/m2e83IdfRi7FZeJVwfBxQttjYeEwvp4M8ffzKucj9h1mxcG -T0AamVMPnEWKUtoh98r1cpbh8FvMtUpwuL1MMEYxN4TmJIG1X5Hj17h5M7bdEP7g -mumAs+CN4BQX4EQkBDQHlj/qjh9yaWL80XsvBJyhqFPYU1Mqd34mqzp1YR4bkQCn -x5LF3bIB36zOSP2tgJGOhu32bZCCyBAduH7jWtpfr7UXnp3k7xPl79yPkJ9ZDmn6 -lSaXUOWdKMiQJSi65H+LR4StfKUj7D/iyz21nhh6NNUwO94DOqDmJTSH00kONkIO -xvcMlt13YXZMvgLxzu4JKR9Cm3g3E7HicskKRzLeSmWH2K3jKMPivDJinwDI1Z8C -/i1G/10/eUT6USrvXrtVyxsVxWgND20PRJDnbh5018+4k+92b6O4CUhjf3EJwMsH -00U7XNyLRxIVXoCjM4q3ORKHDm5cKBtckCtpQj/9gVuQfOeJqJaZrb4etfGKappM -OtNg1tVpJb2oYBmgB2EBu5LnjsQIyUEzi1iEUEiMSjMMnHXk6iwVtkYcZDwJ2oXN -cdmRl9zwqxGVL8+jYMTClBEoObSF9WfR63mOpLd9/ABmCZtw1ixnWN4Q0ODp ------END CERTIFICATE----- diff --git a/0xgo/http3/server/certs/server.pub b/0xgo/http3/server/certs/server.pub deleted file mode 100644 index 09ec88f..0000000 --- a/0xgo/http3/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0SFKaMBnIM6O0Djz9pz8 -POhrlqlIty5j6i95GfCA4bzAqcit4ugJ5NFAmiNfhLDTtnS2j0kNeBYsLjr5dOUk -NBLHwbh5fZzMxXpzZ6EG9+AAaYEmwV3vjsyxZU34WY9E2EmgSdadkIZ/T3m0rhMd -zdcU7/eGKnYrl2KWSNChZgOOgg3bElOqahky6MStfs0rdRBvCT4HzGz9DcE/TToz -buiABSTBt71+7AXnPfmAYkAVT9XiDdu3yIXF7AKV3RY6JjHPRgj2t5A3+jHBNXJ7 -+FEpSz40gEkZQAMOuUTL4yugLxdnqJt9vi1noyVTg7p3FrBCzFuYwbwQFoim+WGT -YKEI9hfLP3nHHQhUfb6NVHhKh1EzxYItc4T7xFAznzNWEWxlL2duiYZfwqest6am -R2fOQ/PBty3eFspxF7HLNUpC5PuXy2p8ZBPXieW4pc1O8bVTKhqnL5QE3c3KpFuN -jdbXviouRZWP4JnCs9wUk7uEF/KysLqfMSGGrlGA9YQA/SH+v7iOR6JMiYpAEjSm -V5QW6Rb2DJ/XI+NLKsIeFeX2VXwFzrGfn2zMIzGEsm5AXrY3SskxLckt6QSDw5I9 -AZOJBF5pKHAalf+vFzCp5cknPLwHd6KrKijIchpb9r96rFtQw6rCFIfPj6sACLaY -iRMKasWFslUm74wOgPA1KIMCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/http3/server/main.go b/0xgo/http3/server/main.go deleted file mode 100644 index 9e30d7e..0000000 --- a/0xgo/http3/server/main.go +++ /dev/null @@ -1,184 +0,0 @@ -package main - -import ( - "crypto/md5" - "errors" - "flag" - "fmt" - "io" - "log" - "mime/multipart" - "net/http" - "strconv" - "strings" - "sync" - - _ "net/http/pprof" - - "github.com/quic-go/quic-go" - "github.com/quic-go/quic-go/http3" -) - -type binds []string - -func (b binds) String() string { - return strings.Join(b, ",") -} - -func (b *binds) Set(v string) error { - *b = strings.Split(v, ",") - return nil -} - -// Size is needed by the /demo/upload handler to determine the size of the uploaded file -type Size interface { - Size() int64 -} - -// See https://en.wikipedia.org/wiki/Lehmer_random_number_generator -func generatePRData(l int) []byte { - res := make([]byte, l) - seed := uint64(1) - for i := 0; i < l; i++ { - seed = seed * 48271 % 2147483647 - res[i] = byte(seed) - } - return res -} - -func setupHandler(www string) http.Handler { - mux := http.NewServeMux() - - if len(www) > 0 { - mux.Handle("/", http.FileServer(http.Dir(www))) - } else { - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - fmt.Printf("%#v\n", r) - const maxSize = 1 << 30 // 1 GB - num, err := strconv.ParseInt(strings.ReplaceAll(r.RequestURI, "/", ""), 10, 64) - if err != nil || num <= 0 || num > maxSize { - w.WriteHeader(400) - return - } - w.Write(generatePRData(int(num))) - }) - } - - mux.HandleFunc("/demo/tile", func(w http.ResponseWriter, r *http.Request) { - // Small 40x40 png - w.Write([]byte{ - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, - 0x01, 0x03, 0x00, 0x00, 0x00, 0xb6, 0x30, 0x2a, 0x2e, 0x00, 0x00, 0x00, - 0x03, 0x50, 0x4c, 0x54, 0x45, 0x5a, 0xc3, 0x5a, 0xad, 0x38, 0xaa, 0xdb, - 0x00, 0x00, 0x00, 0x0b, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0x63, 0x18, - 0x61, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xe2, 0xb8, 0x75, 0x22, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, - }) - }) - - mux.HandleFunc("/demo/tiles", func(w http.ResponseWriter, r *http.Request) { - io.WriteString(w, "") - for i := 0; i < 200; i++ { - fmt.Fprintf(w, ``, i) - } - io.WriteString(w, "") - }) - - mux.HandleFunc("/demo/echo", func(w http.ResponseWriter, r *http.Request) { - body, err := io.ReadAll(r.Body) - if err != nil { - fmt.Printf("error reading body while handling /echo: %s\n", err.Error()) - } - w.Write(body) - }) - - // accept file uploads and return the MD5 of the uploaded file - // maximum accepted file size is 1 GB - mux.HandleFunc("/demo/upload", func(w http.ResponseWriter, r *http.Request) { - if r.Method == http.MethodPost { - err := r.ParseMultipartForm(1 << 30) // 1 GB - if err == nil { - var file multipart.File - file, _, err = r.FormFile("uploadfile") - if err == nil { - var size int64 - if sizeInterface, ok := file.(Size); ok { - size = sizeInterface.Size() - b := make([]byte, size) - file.Read(b) - md5 := md5.Sum(b) - fmt.Fprintf(w, "%x", md5) - return - } - err = errors.New("couldn't get uploaded file size") - } - } - log.Printf("Error receiving upload: %#v", err) - } - io.WriteString(w, `
-
- -
`) - }) - - return mux -} - -func main() { - // defer profile.Start().Stop() - go func() { - log.Println(http.ListenAndServe("localhost:6060", nil)) - }() - // runtime.SetBlockProfileRate(1) - - bs := binds{} - flag.Var(&bs, "bind", "bind to") - www := flag.String("www", "", "www data") - tcp := flag.Bool("tcp", false, "also listen on TCP") - key := flag.String("key", "", "TLS key (requires -cert option)") - cert := flag.String("cert", "", "TLS certificate (requires -key option)") - flag.Parse() - - if len(bs) == 0 { - bs = binds{"localhost:6121"} - } - - handler := setupHandler(*www) - - var wg sync.WaitGroup - wg.Add(len(bs)) - var certFile, keyFile string - if *key != "" && *cert != "" { - keyFile = *key - certFile = *cert - } else { - - certFile = "certs/server.pem" - - keyFile = "certs/server.key" - - } - for _, b := range bs { - fmt.Println("listening on", b) - bCap := b - go func() { - var err error - if *tcp { - err = http3.ListenAndServeQUIC(bCap, certFile, keyFile, handler) - } else { - server := http3.Server{ - Handler: handler, - Addr: bCap, - QUICConfig: &quic.Config{}, - } - err = server.ListenAndServeTLS(certFile, keyFile) - } - if err != nil { - fmt.Println(err) - } - wg.Done() - }() - } - wg.Wait() -} diff --git a/0xgo/mysql-query/.gitignore b/0xgo/mysql-query/.gitignore deleted file mode 100644 index c8691c4..0000000 --- a/0xgo/mysql-query/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.data \ No newline at end of file diff --git a/0xgo/mysql-query/Dockerfile b/0xgo/mysql-query/Dockerfile deleted file mode 100644 index aab7eb5..0000000 --- a/0xgo/mysql-query/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM mysql:8 - -ENV MYSQL_ROOT_PASSWORD universalpassword -ENV MYSQL_HOST localhost -ENV MYSQL_TCP_PORT 3306 - -EXPOSE 3306 - -ADD ./init.sql /docker-entrypoint-initdb.d \ No newline at end of file diff --git a/0xgo/mysql-query/core/modules.go b/0xgo/mysql-query/core/modules.go deleted file mode 100644 index e060159..0000000 --- a/0xgo/mysql-query/core/modules.go +++ /dev/null @@ -1,67 +0,0 @@ -package core - -import ( - "database/sql" - "fmt" - "time" - - _ "github.com/go-sql-driver/mysql" -) - -var DB *sql.DB - -func DbEstablish(db_id string, db_pw string, db_addr string, db_name string) error { - - var err error - - db_info := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", db_id, db_pw, db_addr, db_name) - - DB, err = sql.Open("mysql", db_info) - - if err != nil { - - return fmt.Errorf("failed to open db: %s", err.Error()) - } - - DB.SetConnMaxLifetime(time.Second * 10) - DB.SetConnMaxIdleTime(time.Second * 5) - DB.SetMaxOpenConns(10) - DB.SetMaxIdleConns(10) - - return nil -} - -func DbQuery(query string, args []any) (*sql.Rows, error) { - - var empty_row *sql.Rows - - results, err := DB.Query(query, args[0:]...) - - if err != nil { - - return empty_row, fmt.Errorf("db query: %s", err.Error()) - - } - - return results, err - -} - -func DbExec(query string, args []any) error { - - result, err := DB.Exec(query, args[0:]...) - - if err != nil { - return fmt.Errorf("db exec: %s", err.Error()) - } - - _, err = result.RowsAffected() - - if err != nil { - - return fmt.Errorf("db exec: rows: %s", err.Error()) - } - - return nil - -} diff --git a/0xgo/mysql-query/docker-compose.yaml b/0xgo/mysql-query/docker-compose.yaml deleted file mode 100644 index 53a5951..0000000 --- a/0xgo/mysql-query/docker-compose.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: "3" - -services: - - mysql-db: - build: . - container_name: mysql-db - ports: - - "3306:3306" - volumes: - - ./.data:/var/lib/mysql - \ No newline at end of file diff --git a/0xgo/mysql-query/init.sql b/0xgo/mysql-query/init.sql deleted file mode 100644 index 2effb03..0000000 --- a/0xgo/mysql-query/init.sql +++ /dev/null @@ -1,32 +0,0 @@ -CREATE USER 'mysqldb'@'%' IDENTIFIED BY 'universalpassword'; - -GRANT ALL PRIVILEGES ON *.* TO 'mysqldb'@'%'; - -CREATE DATABASE mysqldb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - -USE mysqldb; - - -CREATE TABLE user ( - - user_id INT NOT NULL AUTO_INCREMENT, - user_name VARCHAR(128), - user_pass TEXT, - PRIMARY KEY (user_id) - -); - - - -INSERT INTO - user ( - user_name, - user_pass - ) - VALUES ( - - "test1", - "test1pw" - ); - -COMMIT; \ No newline at end of file diff --git a/0xgo/mysql-query/main.go b/0xgo/mysql-query/main.go deleted file mode 100644 index e4a6335..0000000 --- a/0xgo/mysql-query/main.go +++ /dev/null @@ -1,263 +0,0 @@ -package main - -import ( - "fmt" - "log" - - pkgdbquery "github.com/seantywork/0xgo/mysql-query/core" -) - -type DB_User struct { - UserId int `json:"user_id"` - UserName string `json:"user_name"` - UserPass string `json:"user_pass"` -} - -func GetUsers() ([]DB_User, error) { - - var dbuser_records []DB_User - - q := ` - - SELECT - user_id, - user_name, - user_pass - FROM - user - - ` - - a := []any{} - - res, err := pkgdbquery.DbQuery(q, a) - - if err != nil { - - return nil, fmt.Errorf("failed to get user: %s", err.Error()) - - } - - defer res.Close() - - for res.Next() { - - dbuser := DB_User{} - - err = res.Scan( - &dbuser.UserId, - &dbuser.UserName, - &dbuser.UserPass, - ) - - if err != nil { - - return nil, fmt.Errorf("failed to get user: row: %s", err.Error()) - } - - dbuser_records = append(dbuser_records, dbuser) - } - - return dbuser_records, nil - -} - -func GetUserByName(name string) (*DB_User, error) { - - var dbuser_records []DB_User - - var dbuser DB_User - - q := ` - - SELECT - user_id, - user_pass - FROM - user - WHERE - user_name = ? - - ` - - a := []any{ - name, - } - - res, err := pkgdbquery.DbQuery(q, a) - - if err != nil { - - return nil, fmt.Errorf("failed to get user: %s", err.Error()) - - } - - defer res.Close() - - for res.Next() { - - dbuser := DB_User{} - - err = res.Scan( - &dbuser.UserId, - &dbuser.UserPass, - ) - - if err != nil { - - return nil, fmt.Errorf("failed to get user: row: %s", err.Error()) - } - - dbuser_records = append(dbuser_records, dbuser) - } - - rlen := len(dbuser_records) - - if rlen != 1 { - return nil, nil - } - - dbuser = dbuser_records[0] - - return &dbuser, nil -} - -func SetUser(name string, pass string) error { - - check, err := GetUserByName(name) - - if err != nil { - - return fmt.Errorf("set user: %s", err.Error()) - } - - var q string - - a := make([]any, 0) - - if check != nil { - - log.Printf("user: %s: already exists: overriding\n", name) - - q = ` - - UPDATE - user - SET - user_pass = ? - WHERE - user_id = ? - - - ` - - a = append(a, pass) - - a = append(a, check.UserId) - - } else { - - log.Printf("user: %s: doesn't exist: create\n", name) - - q = ` - - INSERT INTO - user( - user_name, - user_pass - ) - VALUES( - ?, - ? - ) - - - ` - - a = append(a, name) - a = append(a, pass) - } - - err = pkgdbquery.DbExec(q, a) - - if err != nil { - return fmt.Errorf("failed to set user: %s", err.Error()) - } - - return nil -} - -func run() error { - - err := pkgdbquery.DbEstablish( - "mysqldb", - "universalpassword", - "localhost:3306", - "mysqldb", - ) - - if err != nil { - - return fmt.Errorf("failed to establish db conn: %s", err.Error()) - } - - urecall, err := GetUsers() - - if err != nil { - - return fmt.Errorf("failed to get all users: %s\n", err.Error()) - - } - - ulen := len(urecall) - - for i := 0; i < ulen; i++ { - - fmt.Printf("user: %d ===================\n", i) - fmt.Printf("id : %d\n", urecall[i].UserId) - fmt.Printf("name : %s\n", urecall[i].UserName) - fmt.Printf("pw : %s\n", urecall[i].UserPass) - fmt.Printf("=============================\n") - - } - - newuser := "test2" - newpw := "test2pw" - - err = SetUser(newuser, newpw) - - if err != nil { - return fmt.Errorf("failed to set new user: %s", err.Error()) - } - - urecall2, err := GetUsers() - - if err != nil { - - return fmt.Errorf("failed to get all users 2: %s\n", err.Error()) - - } - - ulen2 := len(urecall2) - - for i := 0; i < ulen2; i++ { - - fmt.Printf("user: %d ===================\n", i) - fmt.Printf("id : %d\n", urecall2[i].UserId) - fmt.Printf("name : %s\n", urecall2[i].UserName) - fmt.Printf("pw : %s\n", urecall2[i].UserPass) - fmt.Printf("=============================\n") - - } - - return nil -} - -func main() { - - if err := run(); err != nil { - - log.Fatal(err) - } - -} diff --git a/0xgo/sock-tcp-async/certgen.sh b/0xgo/sock-tcp-async/certgen.sh deleted file mode 100755 index 493976f..0000000 --- a/0xgo/sock-tcp-async/certgen.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/sock-tcp-async/client/certs/ca.pem b/0xgo/sock-tcp-async/client/certs/ca.pem deleted file mode 100644 index 06e44c9..0000000 --- a/0xgo/sock-tcp-async/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUffjPF3nZtca+YmxkhFpPSg8+8r8wDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0zNTAyMDYxMTQx -MDBaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCrNVWpVf4qCCS+PHmRPTRA7EnAfgYwTQ0tUYtirsrPipbrlPX5zLF2vfTO -lJqzvDB0xnGC5pYAFeh6PRsar6HmkG5z46QZJeukybDIvcRBpHKn3Wg1xJ/Bswpe -76UbzNYmvnhkAeJgtptMXq0aGrn/us9f1jKX3EFNjipH2+c11XshVUNtPKT5XSqg -oveReVgBhJU8Vl/1qGvQdyI/CsT4C1BJ4r148J580Hg5BVla1fg610NPwjvWvT9q -rikjR1BPfzRrwiEgUoewLuZqDNeOXyeZCBhxWo5ugXqsMFSoBnUc4UYzTKPSVZXL -ceXXiHkk+EF7KdD4ZugLzO3StrH7EngO25iXNsJoKB3JBs/cgpNybS7HhP96VRBi -VCuhQJnqtmRVNnHMYR42RI0dxDlCewX16w2jM+XgEQ9YWwTE3gZp8+q1aKCFM/3c -F0TnHyWB5ENE0vjIJjHBLcKz6e4baYBTiPWq1TjBtRLKEOGHJhnxuLCRwNe3IDJI -1pCQhorr1/WFEDTrq5axbsNZUVnl7CeskojMsHEGYDVhTYMbBwscRqRPVd+C9XFi -AsfyHJb5QwwEMxzkwt5JyJvSEY483FwvQkiI8YDGydgdUPCOmYkEMahS7+QfHhwu -Ybnnn0xBHwcE6BQ8LjYLeMhP3hfyI5NJpRnhpVkIefRZm2untwIDAQABo1MwUTAd -BgNVHQ4EFgQUNTLhikFTfYlRZvi7OXJDrw0apSIwHwYDVR0jBBgwFoAUNTLhikFT -fYlRZvi7OXJDrw0apSIwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEAD6wBsPD4U4BJWKpUv56gfqqqhZ319u3aWy/+GDoV6ZQjDRGuwvxvzWGXbpI8 -kJA4ZWK3TNXb+h+z06ivY3oLRKuIEQs/vS7mwzv8EAf+4JVs/nvW3+dhbFW1u1FL -5OoV5al+w4TyO50T8QejmSiYJkgfe0x2uDf2PP8tcmlv0LoHjHOJ+HA4X5eUvZOQ -ehe9z4VOsflRv14eGuEYofy4+7YHzXbHVEvBIUqcnNxs99eLzZN3P2N7r0a3PazK -eeUPbx8TBbwHGWAHJFkYgOGpUQQ61ejHTwAWctc8rlNd0uLFnPRzAlSuwFK/ezZa -do8RE2B4fguyJup+DVwYW7mvbX3FlFrNSnH/sdo6dqGiqgxfCygKxG4GHdLVw1p6 -S+qwQjZYCtgl9dzVoXs5SBknSq1fUxS1WLzoseTpAy37O5ppXyqNUogl45FB/lSb -p4fZpHXaQ3hrtCR81UbRR2plUYx56GPZLi80MhOeFm2xJ+O82jkv8YGH11ePV+JO -AXyA3NX25DoTWIRbHOcNubaYCDQIIscNTuwQLYQgNqvHe5f+/coV8npOafCchY0j -pB0jfIZ09tNENLkqtvJ5tNQKMe9EFzL5ctynst383UdjDz8rDa6ZB9tVoicF3dW0 -xyC+qGlBpJE7W+Bs6VCFdXKuzqqewIvoTs0mka5jTEfXV0I= ------END CERTIFICATE----- diff --git a/0xgo/sock-tcp-async/client/certs/ca.srl b/0xgo/sock-tcp-async/client/certs/ca.srl deleted file mode 100644 index 7ff6484..0000000 --- a/0xgo/sock-tcp-async/client/certs/ca.srl +++ /dev/null @@ -1 +0,0 @@ -24A3A8C4B775B0724F02BB952BB38A54EE85CCC6 diff --git a/0xgo/sock-tcp-async/client/certs/ca_priv.pem b/0xgo/sock-tcp-async/client/certs/ca_priv.pem deleted file mode 100644 index e371c5e..0000000 --- a/0xgo/sock-tcp-async/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQCrNVWpVf4qCCS+ -PHmRPTRA7EnAfgYwTQ0tUYtirsrPipbrlPX5zLF2vfTOlJqzvDB0xnGC5pYAFeh6 -PRsar6HmkG5z46QZJeukybDIvcRBpHKn3Wg1xJ/Bswpe76UbzNYmvnhkAeJgtptM -Xq0aGrn/us9f1jKX3EFNjipH2+c11XshVUNtPKT5XSqgoveReVgBhJU8Vl/1qGvQ -dyI/CsT4C1BJ4r148J580Hg5BVla1fg610NPwjvWvT9qrikjR1BPfzRrwiEgUoew -LuZqDNeOXyeZCBhxWo5ugXqsMFSoBnUc4UYzTKPSVZXLceXXiHkk+EF7KdD4ZugL -zO3StrH7EngO25iXNsJoKB3JBs/cgpNybS7HhP96VRBiVCuhQJnqtmRVNnHMYR42 -RI0dxDlCewX16w2jM+XgEQ9YWwTE3gZp8+q1aKCFM/3cF0TnHyWB5ENE0vjIJjHB -LcKz6e4baYBTiPWq1TjBtRLKEOGHJhnxuLCRwNe3IDJI1pCQhorr1/WFEDTrq5ax -bsNZUVnl7CeskojMsHEGYDVhTYMbBwscRqRPVd+C9XFiAsfyHJb5QwwEMxzkwt5J -yJvSEY483FwvQkiI8YDGydgdUPCOmYkEMahS7+QfHhwuYbnnn0xBHwcE6BQ8LjYL -eMhP3hfyI5NJpRnhpVkIefRZm2untwIDAQABAoICAAfijj4c96mWgKBOtBsA/06V -wBtm7A1xoJxuzhh7f1vjZwPIWcz2GFHYYGJBP5/s5PhqPHqwXvkrCSI6fTlgT5I8 -VaUg6oMj/XNniV/jz+cyb5T7Ylv5+pEwfnCuR2OwrkfQUhNQPBpP+EM72wVB20FQ -jutvHhswKcVfuXyTJdXGlFCnluuv6GzGby4Nw125gaWapkesnLSS9XNltGr3doHY -yr5UYuO8654VxdIU3nwlMM6Y8M2UEi7Xvjt0dCP4gIjgwJiaTLp3dcgiwm1HVFTt -kF40Ar6TUpr64jXBVhMulPQBctSHzSwYBMZlY2LNTL/SO5Ka2h50/6JHfy5+SCBH -CfpY5t7yCus+6QXp58kd4gFHPH43QzNFQIe7xJWOWKslse6pJBN/9Ooete4X2Eqd -EdOrlTtXdOU+fEjRl5GvA8hqv/YRXFS0D/UoSh4GVPxpgCy6cOpjxtwRaT821s5f -LmC2mULoJVP2CX+uzsLVqdncpycmcrs46SfGbwOyO8+8dz9nu8mmXM53sh+fVUxE -HQqABfFEb1Od3JTeHHlEjUv5UsSag4vSb/owpDUak7AfJQS1k05sjxbdO/WNSOd4 -gaOiPhnt118i6NQq33ghIvZhtqX3Dok0J/gFOvh67qihQq3fLONIuAxOx+6foZhw -FF9qcY12SRrPvqs2oHCpAoIBAQDhDvUSnwZoTCSODom4eUG9hiKveidYVjVkUNAA -/bs+Z4qM8BOt/EcRRPfKoYiwsIY6xRNY4O3x+KR2+Ap4WWPX61zHZpjfmBDO83qS -9CcBowTM8eDNAe3nNJ596H0fHoI2S0KyO0zifm1VjSeM12CEmSJQFW9X0Ds6z9bI -9hjtqIBDi72MnvfCf2+b7hXTUODD0LeGLcZyRZBGn83qsVSJsCgi+y5kx1NvsQsB -LxAfuWn57J3M9/7e2zjzsRGRdXyZpPIITl/4fSInN7WAguV3YbY2NdljoSMktoiI -+xNpO9lhxfqIxY4HoIXUGGEZynf7Up2wivbdyH/Ba2pyYlk/AoIBAQDCvxjHB/JI -yVv3ibGti1UwfI0ItfPvGbT+rM+/sPrAgTZtVYW+iwbQieRodfwUNJn4wAvVR+Xg -AObN9kj31QI8IuLBMRnAYCP0sCtDuvBWYuqZHOd2FCmMs5RM5XeKuxJyDTyWvrez -JZiCPZcoi4I0XycvLzBamoX+eZn6GLrrh0m9dypvux7bZ76yqcKPDC8QbfDyOog+ -ACq5mSTc6r84ARjyndQzq7hOehFJMvShso7iXV7VfTvfHfEkeO4cVNaiWE0fXhEx -99SD9ciBFHWkInofWw8WI213lICNm5QbZzNa9cfUXYJxyaOhu3Vy/OvudUiO4Aaw -clKnqqtIT9uJAoIBAQDa7Nja91SdSkxY3616hIG9oejFt9bkKGAhqDbeb/Of3cq6 -FKOgIILlOqisNPwpnF3Gd4S9dXghZFRf4iMVNSdZl3sWASh+gIcBOXmnz9bN0c1O -q4+Y/OJ2gQoXwntMNTpHJGjJxcOho4gpq3ioma4q7mehbWh1DHtBV4JA1JwlOz8h -9aI6Uz0Bt0NTdINInyk1cifEX2zmJeMVwEfnn/5zPaedd6eGoxr30Em7KhPOOGft -lQ1foHIOSUQaUcmcLKQ7NWe3Sr4yk08QxTFKxIoA2k0MaM+CCfKMuP8R+OLGAFES -uipet4XUx4LHcburAfg6wv/gBx3jWjFkbmAKyr6zAoIBAQCsvHerwl6jNQd/7wBM -YHP1h+RIv6tYf0LNSlcTPlWL/pBaNitlMUegHU8dYNlwyp9vxlg4m4dIQ0R1l2ht -euB6mq7qkTS4MA50cPZPIzceSKqxmLOtRoD8LiTyd+6qfPgFdbwyMYQbQNOfYiX7 -bpLVBTlqXr7S/pCvgQiUju7tDpjXlyVq6VybW9AIBQ9vdm0gc4PuNwC1jcxXx4Cs -+wMVF9QbDucz1bKq2RcQCER4UDrwicUeM/CxHIvRv/nj41Rlt1Dg67zwx1QWoCFy -bMVUCsirm0csacwk7vF/qWmbTNR+b9cJhM+5QhMD15R7o99ZKWpsYEVOqHisA3Pd -tgeRAoIBAQC8Qq9oGt1G1ZpEjSll/7Mi3iK+ENjeU6Gb9aSZiaCrTB4RXVe2jiB4 -4hmfpVghifULvphCZZY6dahKIqGmJFkKu049ltyhHfnc/r/nThyKTs2+ESv68pLx -7pjqDRDcd72Lna9cO4dDihlSwmEXrUzzZ6Hkn6JG9ZZ3e/nMsmpOS8d/a+NVL2QL -w8stjB8VDHaqWnWoe/ZIePZ66UcNMtv6Q4JyyOmarTL1SVq3hOK+6FHkFDufgIjj -gbSbCtxNUxs24GX4a4M6nVyHY2zESPzknb3cAcWKvxoG20lXj1HjZE/KaA7g+KXM -HvhSKWc8Lsus1sPYi7BXTC2qJhPn5esv ------END PRIVATE KEY----- diff --git a/0xgo/sock-tcp-async/client/certs/ca_pub.pem b/0xgo/sock-tcp-async/client/certs/ca_pub.pem deleted file mode 100644 index 1f2732c..0000000 --- a/0xgo/sock-tcp-async/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqzVVqVX+Kggkvjx5kT00 -QOxJwH4GME0NLVGLYq7Kz4qW65T1+cyxdr30zpSas7wwdMZxguaWABXoej0bGq+h -5pBuc+OkGSXrpMmwyL3EQaRyp91oNcSfwbMKXu+lG8zWJr54ZAHiYLabTF6tGhq5 -/7rPX9Yyl9xBTY4qR9vnNdV7IVVDbTyk+V0qoKL3kXlYAYSVPFZf9ahr0HciPwrE -+AtQSeK9ePCefNB4OQVZWtX4OtdDT8I71r0/aq4pI0dQT380a8IhIFKHsC7magzX -jl8nmQgYcVqOboF6rDBUqAZ1HOFGM0yj0lWVy3Hl14h5JPhBeynQ+GboC8zt0rax -+xJ4DtuYlzbCaCgdyQbP3IKTcm0ux4T/elUQYlQroUCZ6rZkVTZxzGEeNkSNHcQ5 -QnsF9esNozPl4BEPWFsExN4GafPqtWighTP93BdE5x8lgeRDRNL4yCYxwS3Cs+nu -G2mAU4j1qtU4wbUSyhDhhyYZ8biwkcDXtyAySNaQkIaK69f1hRA066uWsW7DWVFZ -5ewnrJKIzLBxBmA1YU2DGwcLHEakT1XfgvVxYgLH8hyW+UMMBDMc5MLeScib0hGO -PNxcL0JIiPGAxsnYHVDwjpmJBDGoUu/kHx4cLmG5559MQR8HBOgUPC42C3jIT94X -8iOTSaUZ4aVZCHn0WZtrp7cCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/sock-tcp-async/client/main.go b/0xgo/sock-tcp-async/client/main.go deleted file mode 100644 index 573819f..0000000 --- a/0xgo/sock-tcp-async/client/main.go +++ /dev/null @@ -1,37 +0,0 @@ -package main - -import ( - "fmt" - "net" - "os" -) - -func main() { - - mode := os.Args[1] - - if mode == "net" { - conn, err := net.Dial("tcp", "localhost:8080") - if err != nil { - fmt.Println(err) - return - } - - wbuf := make([]byte, 1024) - - copy(wbuf, "Hello, server!") - - _, err = conn.Write(wbuf) - if err != nil { - fmt.Println(err) - return - } - - conn.Close() - - } else if mode == "tls" { - - TlsConnection() - } - -} diff --git a/0xgo/sock-tcp-async/client/tls.go b/0xgo/sock-tcp-async/client/tls.go deleted file mode 100644 index 574c0e5..0000000 --- a/0xgo/sock-tcp-async/client/tls.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "os" - "time" -) - -func TlsConnection() { - - certpool := x509.NewCertPool() - - file_b, err := os.ReadFile("certs/ca.pem") - - /* - ca_pem := new(bytes.Buffer) - - pem.Encode(ca_pem, &pem.Block{ - Type: "CERTIFICATE", - Bytes: file_b, - }) - */ - certpool.AppendCertsFromPEM(file_b) - - config := tls.Config{RootCAs: certpool} - conn, err := tls.Dial("tcp", "localhost:8080", &config) - if err != nil { - log.Fatalf("client: dial: %s", err) - } - defer conn.Close() - log.Println("client: connected to: ", conn.RemoteAddr()) - - state := conn.ConnectionState() - for _, v := range state.PeerCertificates { - fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey)) - fmt.Println(v.Subject) - } - log.Println("client: handshake: ", state.HandshakeComplete) - log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual) - wbuf := make([]byte, 1024) - - copy(wbuf, "Hello, tls server!") - n, err := conn.Write(wbuf) - if err != nil { - log.Fatalf("client: write: %s", err) - } - - reply := make([]byte, 1024) - - readlen := 0 - - for readlen != 1024 { - - n, err = conn.Read(reply[readlen:]) - if err != nil { - fmt.Println(err) - return - } - - readlen += n - } - - log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen) - time.Sleep(time.Millisecond * 1000) - log.Print("client: exiting") -} diff --git a/0xgo/sock-tcp-async/server/certs/server.csr b/0xgo/sock-tcp-async/server/certs/server.csr deleted file mode 100644 index d1716a7..0000000 --- a/0xgo/sock-tcp-async/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6ZweetnvPhYwY9UPcQwlHuEw6 -dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJCV9eKFJ5C1WyePglNBCg -rPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjCgvDSj1WvFv+3myG83sdH -yRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32eaoFVCNMmi08c9xZSbT8+ -5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQUOG7afJHMzSX3zDsKPDJ -IucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxzPZntRUu6iPZQlPGCGlcQ -XAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK88BLIJM7twDGiD17YMhh -iTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p217sROouCa6Id/v6KmEfs -9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7JFe/Xgfn/ihJXpMiB2vP -sSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+UxW3BrLvfMGq8T9MNz2Du -rIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKySX7wAtbgJUG5lMazUzUb -6OUCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQDBarvtlgaaiF32tTzMDAU+94+F -0WKdstbGIcUDjW126WhiDMD9nsbjNscdkFpw7/JqvnD6CX3nOaE7EmO0Zh5+AXn+ -SgD+KsdEPDAw40zX/ceaEyLo13HYTqEXXf9GyVYFoUrPs1kI4ncvOcY6T6hGsoCn -OzqzkQA0M44ct+VZkLZHtdotI/Pt0O3EGTIvxpH9LssI2XsAazRakudnECgf7krq -qqtWceclClqmGR3xSpV5oWPt2V3Y1dDFvX0W1spxiMG8FHgT1b4Gf5WM4jOfcNm9 -g23PFc+ffqeEs1+1LhFWf+r61NLjrKKH82JEzXPj+kXSZ844JJrGdsjh8tuVtMvf -ivYL8Di8AbEE2zSo7/bP3WKDkVN5oHC3/oz3V7vtPTfaWUHsJwI8qBkMO200KwH9 -FvTodg+NI8z7EOWhBvCE+hjlL1fn+9l2pLUV+fqjeXBQEsrHep+vN7zCCkJAmM0A -mpU7OPNc7zm28L6zGK5TkKUHU4aGVyeItam6eU8+d/sZjkrQqQ/lEJbiLVCz//Kd -/qGchrSksm6rKEcwYGE5h31wl8SAIjADk2cx/iQianhTdZaliL1I+s7pR67esTvi -BhK16uLW+x6fuASKU5kDqLuHc+3rT+icu/DNEsQvR6j3t5i/iu6GYLLBHhWZWH1T -0rS8ffinyso9IuImyQ== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/sock-tcp-async/server/certs/server.key b/0xgo/sock-tcp-async/server/certs/server.key deleted file mode 100644 index e45fe9b..0000000 --- a/0xgo/sock-tcp-async/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -Ug07IGqNaURkyoQerKUv7X+DOFO1Qo4= ------END PRIVATE KEY----- diff --git a/0xgo/sock-tcp-async/server/certs/server.pem b/0xgo/sock-tcp-async/server/certs/server.pem deleted file mode 100644 index 9973288..0000000 --- a/0xgo/sock-tcp-async/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUJKOoxLd1sHJPAruVK7OKVO6FzMYwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMDBaFw0yNjAyMDgxMTQx -MDBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMmd0Od4s+bBMnVZ+mcHnrZ7z4WMGPVD3EMJR7hMOnTIsG1ixZd2 -78tKTGytkNiXf0zXdcUJxtiF+7jFbJnnCQlfXihSeQtVsnj4JTQQoKz8HHBTxVqg -F4+rNu5nmjcVAIHu0ty6mZcFUpnX8k7YwoLw0o9Vrxb/t5shvN7HR8kaYl1WpeEe -S7HdqRCLyfgZwBsWs1XUViHGE9si3c99nmqBVQjTJotPHPcWUm0/PuZqgYYQQ8Nt -MoYh+3FLBoOPZmFTPa1IM9A40GpaoNNUEFDhu2nyRzM0l98w7CjwySLnB4CHyBLa -CCDg9ItSFaoB0csM7ntfEv+TPyOGHLQ8cz2Z7UVLuoj2UJTxghpXEFwJWoufrv43 -4Ped3UjAS1KBksZiBYsR4TfEHEkUWNdDivPASyCTO7cAxog9e2DIYYkwNw5pCDjg -wB2lTeGpHX4ZjD+ID9tD2g/1C1VCJeu6dte7ETqLgmuiHf7+iphH7PfvDFUmY89c -WDb//p1jMZWtSKJi7JInxj0GiWFunh9IeyRXv14H5/4oSV6TIgdrz7EjtYYqODTN -wotcIT9x+oj41uq9v4Bif1DkNR+c2XXvlMVtway73zBqvE/TDc9g7qyIhu5QQWRC -qaC/7JR39vDF+wC16p4X6vPdUG9ypdsyskl+8ALW4CVBuZTGs1M1G+jlAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQUbVC6F4cp3g11LRik -jHUBSlLFXF4wHwYDVR0jBBgwFoAUNTLhikFTfYlRZvi7OXJDrw0apSIwDQYJKoZI -hvcNAQELBQADggIBAHq7EV5kIo/RNG4Uzwnob6Zwi94la8ZDq7qFQoj6GJbbd/l0 -bQCIDTeIl5JzrPTv6Ka00DbSJ4BbY6OUTgUCeBDOX/lJ/FAYHhRMeTtOi7KTxyX2 -D8FKdQ/ZAYrU/GY0bC4vVwDqCmn5t+xkD2cXQlAAJIlQWVNEXIMrdDY4Q0jYyIiY -lFyCu/cJY2phOzltbcwTOHzFSyPTyYSGacyE7xAyWj9va9renOQ3+kmj5Nu+jkMv -hsAWNH6RjaJgOSYN5ItUi+i7qyqhWHOuU3ParKr0SEdl8cx9zvDRzNd2ZJQLtPvo -CLlyifI0IAhe/Xh52mTEAJ8WBzjbVazPLBn9RUpN330h3mbFi3LxqZjyGmYNr5L3 -GwxVLcnRr8nL7FPb0AP1GlzTkxWULSwAJuivPgZywwZCxfkRdPGe7bq6c92W/bAx -qAjEiqKZBzEpHMhwOvJXMo79/DmE4Q4N2yQxaA7vx8FQbFYvX0NhFIymKo6D4Uu+ -kYyFbSE3LymWbzGh0kFEf9xXl3xqQy1rXBYf8d9Z5+5acZG+6jcwmVQxqnWloajE -uZmO7CKnUW8uJgE/1WCR7pF0DFWvNpq3zOssOV3dJZhvgEp6XXiwymbF8RlBnUy0 -4/GwXud7beKomxBwbYmYmGKO6lmQOQou7VP6Ag/637oOt8YaU/DKEdKwpKdQ ------END CERTIFICATE----- diff --git a/0xgo/sock-tcp-async/server/certs/server.pub b/0xgo/sock-tcp-async/server/certs/server.pub deleted file mode 100644 index 9901d75..0000000 --- a/0xgo/sock-tcp-async/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyZ3Q53iz5sEydVn6Zwee -tnvPhYwY9UPcQwlHuEw6dMiwbWLFl3bvy0pMbK2Q2Jd/TNd1xQnG2IX7uMVsmecJ -CV9eKFJ5C1WyePglNBCgrPwccFPFWqAXj6s27meaNxUAge7S3LqZlwVSmdfyTtjC -gvDSj1WvFv+3myG83sdHyRpiXVal4R5Lsd2pEIvJ+BnAGxazVdRWIcYT2yLdz32e -aoFVCNMmi08c9xZSbT8+5mqBhhBDw20yhiH7cUsGg49mYVM9rUgz0DjQalqg01QQ -UOG7afJHMzSX3zDsKPDJIucHgIfIEtoIIOD0i1IVqgHRywzue18S/5M/I4YctDxz -PZntRUu6iPZQlPGCGlcQXAlai5+u/jfg953dSMBLUoGSxmIFixHhN8QcSRRY10OK -88BLIJM7twDGiD17YMhhiTA3DmkIOODAHaVN4akdfhmMP4gP20PaD/ULVUIl67p2 -17sROouCa6Id/v6KmEfs9+8MVSZjz1xYNv/+nWMxla1IomLskifGPQaJYW6eH0h7 -JFe/Xgfn/ihJXpMiB2vPsSO1hio4NM3Ci1whP3H6iPjW6r2/gGJ/UOQ1H5zZde+U -xW3BrLvfMGq8T9MNz2DurIiG7lBBZEKpoL/slHf28MX7ALXqnhfq891Qb3Kl2zKy -SX7wAtbgJUG5lMazUzUb6OUCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/sock-tcp-async/server/main.go b/0xgo/sock-tcp-async/server/main.go deleted file mode 100644 index a5dcff0..0000000 --- a/0xgo/sock-tcp-async/server/main.go +++ /dev/null @@ -1,104 +0,0 @@ -package main - -import ( - "fmt" - "net" - "os" -) - -func main() { - - mode := os.Args[1] - - if mode == "net" { - ln, err := net.Listen("tcp", "0.0.0.0:8080") - if err != nil { - fmt.Println(err) - return - } - - for { - conn, err := ln.Accept() - if err != nil { - fmt.Println(err) - continue - } - - rc := make(chan []byte, 1024) - - wc := make(chan []byte, 1024) - - go readHandler(conn, rc) - - go worker(rc, wc) - - go writeHandler(conn, wc) - - } - } else if mode == "tls" { - - TlsListen() - - } - -} - -func readHandler(c net.Conn, rc chan []byte) { - - buf := make([]byte, 1024) - - for { - - readlen := 0 - - for readlen != 1024 { - - n, err := c.Read(buf[readlen:]) - if err != nil { - fmt.Println(err) - return - } - - readlen += n - } - - fmt.Printf("Received len: %d\n", readlen) - - rc <- buf - - } - -} - -func worker(rc chan []byte, wc chan []byte) { - - for { - - rbuf := <-rc - - fmt.Printf("Worker: %s\n", string(rbuf)) - - wc <- rbuf - - } - -} - -func writeHandler(c net.Conn, wc chan []byte) { - - for { - - wbuf := <-wc - - n, err := c.Write(wbuf) - - if err != nil { - fmt.Println(err) - return - } - - fmt.Printf("Write len: %d\n", n) - - } - -} diff --git a/0xgo/sock-tcp-async/server/tls.go b/0xgo/sock-tcp-async/server/tls.go deleted file mode 100644 index 36457fa..0000000 --- a/0xgo/sock-tcp-async/server/tls.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "crypto/rand" - "crypto/tls" - "crypto/x509" - "log" -) - -func TlsListen() { - cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") - if err != nil { - log.Fatalf("server: loadkeys: %s", err) - } - config := tls.Config{Certificates: []tls.Certificate{cert}} - config.Rand = rand.Reader - service := "0.0.0.0:8080" - listener, err := tls.Listen("tcp", service, &config) - if err != nil { - log.Fatalf("server: listen: %s", err) - } - log.Print("server: listening") - for { - conn, err := listener.Accept() - if err != nil { - log.Printf("server: accept: %s", err) - break - } - defer conn.Close() - log.Printf("server: accepted from %s", conn.RemoteAddr()) - tlscon, ok := conn.(*tls.Conn) - if ok { - log.Print("ok=true") - state := tlscon.ConnectionState() - for _, v := range state.PeerCertificates { - log.Print(x509.MarshalPKIXPublicKey(v.PublicKey)) - } - } - - rc := make(chan []byte, 1024) - - wc := make(chan []byte, 1024) - - go readHandler(conn, rc) - - go worker(rc, wc) - - go writeHandler(conn, wc) - - } -} diff --git a/0xgo/sock-tcp/certgen.sh b/0xgo/sock-tcp/certgen.sh deleted file mode 100755 index 493976f..0000000 --- a/0xgo/sock-tcp/certgen.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/sock-tcp/client/certs/ca.pem b/0xgo/sock-tcp/client/certs/ca.pem deleted file mode 100644 index a01c57f..0000000 --- a/0xgo/sock-tcp/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUJaxWVeWBx0o+5tTvweUncow0Ma0wDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMjlaFw0zNTAyMDYxMTQx -MjlaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCpRl2utUhApEwha6B7Vr+8YJLWgbINjHMkzCJOyqVnvi6+Ja0pfYFXiZAp -xewegSsK1QaEpW8zTRgmTVaA9q4MryV7PoYz5Lx+vQR+Q5TYy2WkeW3TAKmSiZOS -tPa6UVjryGq5rK5L+3QkiJ5ckNXUpi6xYvSwWpVMVKm3XFD2VNM19wcxi42UfhSG -ABa6F+qkz/TG/3DChCakCxEPB68ldKm9NeS0QSrDtmyvgMg2uigmupRZcbnnS6i6 -WI89N+9hO2SED0WG9AjbnpWYTkG+XyD9ljILtgO85vMPR+kcV5nRgrk6tONpDsA0 -rOsreu0zXyP6olnZyGLCrwrsDTQTda4DZ1H10OLZ6NMbEWzf6pMGS/RPLBxYKaZZ -ITZqrF35QKlF3BUQxOwZrIeNuZlfwD7X9k5f7Z1b+ChX6wuG/qjsQNtkdQl9V0/T -fKWeFslJvIghQjaQQef5tqiF5AGUV1MBPdYQ4M8pSEMvESaK3a7RrMImbGpi2uvq -Ua5Rik6liw0m3jGT2tEMfOOhLUP6rpAelNzykqI7dN9yELLK57gmvKUrUt59oqdI -wkjcYXrlxk/ntKS4sLcz9LsFYM98Gecl6irK0KqmR4fM0ueTumvMNkeKOn6BISJz -hoDbjb6BU06N6q/p2ZBG1yJmAVgxdQ4ejJqtOuNLL8N6kX/bSQIDAQABo1MwUTAd -BgNVHQ4EFgQUfMktrWwZkMks0TEaY4IclVFnb5IwHwYDVR0jBBgwFoAUfMktrWwZ -kMks0TEaY4IclVFnb5IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEAZ1kQ6OUReLN9CIz6MCb0ZMbMkvA469R5WYLuq/GbguE51l7sKfCRIc7isRe1 -ubt1qgBIIYveZu6FI4OCBgOpRJMoKFRSyo9MVNGyVjEuqqxW+MxE6LIb6NoRypNl -XrynxlfgrLCIMNhI73Ri1A+THwc91G8NJM5AkCygMejiCMKoDFM0hadMP8B5/hqE -WeviGenzrsuSuG/3G75RFvBpo6kYLEhIwMWfOsnOUi//M9MBOczjsOBTBbrZcIYL -T9UP8jiKjGjcwLBrKLbwhu01zFC3vokwB+91MCyCTmNbuPY7KoIPnhKhWtgzd7g1 -EltiNwOShyS/kURHm4XquEvj95FVLGLTHm/selrJKtt+rzOvGi+MWRxfXentoDyt -6OkbaaBToEmI9xYldKpA35yNirUEbvi7mTHm6Q5BtlSBvBL1xvVXPwUEdoJUirAl -I9x+EEWwvFJZ0eroCkv1NjDHtpybRQbbnVNushPbfMyUFOSmLLKb5JVjWNWGCpHv -0VFBohUr3lrm04Hc6VLcXEoTs9a/7fu5h9THsA1cnaHYq4aS8trTgx1Zh3wxDScK -s9GfSgjfNutRvzwCaIgCio73g9k0Ac4mUxJAaEwQBbLl9pMH3NHfe6LKU94vhRHM -PzN2NXG+uef5/OU1qp1fnJyNsoD7V9baW5FTxdBTINt0QDk= ------END CERTIFICATE----- diff --git a/0xgo/sock-tcp/client/certs/ca.srl b/0xgo/sock-tcp/client/certs/ca.srl deleted file mode 100644 index e446e15..0000000 --- a/0xgo/sock-tcp/client/certs/ca.srl +++ /dev/null @@ -1 +0,0 @@ -583097A8573CE10C8940EFE5892C6FB7706960C7 diff --git a/0xgo/sock-tcp/client/certs/ca_priv.pem b/0xgo/sock-tcp/client/certs/ca_priv.pem deleted file mode 100644 index 4db6c12..0000000 --- a/0xgo/sock-tcp/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCpRl2utUhApEwh -a6B7Vr+8YJLWgbINjHMkzCJOyqVnvi6+Ja0pfYFXiZApxewegSsK1QaEpW8zTRgm -TVaA9q4MryV7PoYz5Lx+vQR+Q5TYy2WkeW3TAKmSiZOStPa6UVjryGq5rK5L+3Qk -iJ5ckNXUpi6xYvSwWpVMVKm3XFD2VNM19wcxi42UfhSGABa6F+qkz/TG/3DChCak -CxEPB68ldKm9NeS0QSrDtmyvgMg2uigmupRZcbnnS6i6WI89N+9hO2SED0WG9Ajb -npWYTkG+XyD9ljILtgO85vMPR+kcV5nRgrk6tONpDsA0rOsreu0zXyP6olnZyGLC -rwrsDTQTda4DZ1H10OLZ6NMbEWzf6pMGS/RPLBxYKaZZITZqrF35QKlF3BUQxOwZ -rIeNuZlfwD7X9k5f7Z1b+ChX6wuG/qjsQNtkdQl9V0/TfKWeFslJvIghQjaQQef5 -tqiF5AGUV1MBPdYQ4M8pSEMvESaK3a7RrMImbGpi2uvqUa5Rik6liw0m3jGT2tEM -fOOhLUP6rpAelNzykqI7dN9yELLK57gmvKUrUt59oqdIwkjcYXrlxk/ntKS4sLcz -9LsFYM98Gecl6irK0KqmR4fM0ueTumvMNkeKOn6BISJzhoDbjb6BU06N6q/p2ZBG -1yJmAVgxdQ4ejJqtOuNLL8N6kX/bSQIDAQABAoICAAnP+WhCO/D7VSpuybu8mJq7 -4mcq135vkNEmQCrfFl2AKcd9+Z65FsFTSRcS0RAnnq4fESSpTlvj8S1vOD97jTVR -BdQyGKdzb/XM0TDcjAlRKRAytcoQdMP406Qid1bvlj78vCsNNoFTDzV68esdvjd4 -dqZzvQloBtWI5tmpMUxGOIQdUL5vf4KHGHt4D9kzv7dUErViY0/zRyYlOhTr9hwu -uhQsxpgoWulDbuNxjKmXevJbyHOy4vrkaOB8d7ktv+OcBMSe+gHLraPFeph8mNUH -QKtShI4nO+o8XQSav4mUDmeVs1US3UfewgeLqoo3sv5SWoyR0rGMKyVr7i8myMjr -2Buh9doKxQfUXyb2CS+xL3H0PUVjnlZl2tuZtbEFPajMO6DujAdodzLjlTTIJv0s -B4MFfhSPQ5N6P6XF4y8k8VPvLT5FVFJ5vtRpAPj8nFtD+Wxo0XOx94pnTpESoWLh -BQJPsylYvkXlJRqtspT7LYTvrUBp8wgZGhnrxuK6KZiGCvYquWbM1qsiWPht+ShJ -8e1mbZYMWOxv5FQuxWTC8Gz1jtyJ/yXiWVmdpta5D6FMb4GCsvJDl3CTbpPo72lU -NFuXpRI7VGQRZyK8iKsd7qp7WgrQLyjIi78RDuAoSRknYQqO/WJth3YMY5j9L1a+ -7/e/7vhCX0ADNA/UjJJxAoIBAQDXuWBHAOLHM9qp8IKQ36+cfAOwYqxNL37Ot+9g -hTLLyzKuonkyF21YoUSSqJ6jDO3xdoTB7KVa8fjE9SPqKSLAMHHn+KFxZLGvdv7j -gdPHhiNw+4qo3QWSc/uPP3Oif3t44sAx5zYw66yaeCdZFOUyjpO4dKsHDYqHubKb -Ljp/dKSgkPQO6WN++qweX7R4ELWmIVoSjSX+qR+LDTQIb6f1cUYj6TrZZZ9xp6C3 -Ls7nLwn/Ry+DfcmOnsyzhI7t0iybiuIhLL5T38p+ryBSRWWzlD4SPUB1t38bbHhI -0SyOJdsJPCYmoAkPlcOVdqT7D/V2BG+gz/AupBJiVQc8L46dAoIBAQDI4O2mlaxd -6VAmORjcL89Psqmt4fxMtzVkR98IpBidV/HoL0mWDA/ho1qblTBccYkfQ00juwMO -pp7ZOyc7Pl8dN6klhowfkavHBrW/HqtoTovS4avPM13YaHHdwmZXLPRAOS1jtI/l -FPkLqXvWtksM3pmnVcOwEFvJT4dwXUjnp3wwiLfZ5ASKo6LyFX5mhWVN02tVTHcR -yPFFNnDEbtWQjejAXokdG1gPOO/ge6uBR9vF5tPw+DztjdibXXTMHqYcVay0h5ec -5MaBIkAIdOt54oLi16uH3LVbUq4qFK5QTsPFtlwsYS9d906A1emJzD+d0aObWg5K -4bs7RA/3A2mdAoIBAHypM2nUqThUTthFlC4EFYdoYvlbDBbOi4kJ4dr1HhWGpxMj -8MVxpE7DYs0dhA7VOet/gdhO2H9ltUycHNUEUICffjN/Ckxs1AGB0mnGbIuwiGqR -8d8DWmT3gTeWg0w0PzXsUwSDiF1c07GwHYzs9kXw/oxpXywENzmXpg7m+AcPcNMY -8PBtDoIiebRTugZoIZCPVW3DA2HWedPxHVCCtZywiMfXz5oxj6IuLEGvWwFdvXk3 -uc1Ss1cnjUNwJuhnvD9mUqa5JINzn6D1ssfYMp1D3VrM6qMcFufSFvB9cDH0zk7X -43QOpy3KbevBVDWBU2ePyLI1d6Z8SeNpH3U4RkECggEAacfAfZuNo/proWUpyTFH -+xD7Nzysjn1fmUobkcJPz/NyyLC2EFSTvF84JHvAdr221oarRWiCaKGnPn9e3lyu -24TnBoK+oRUlnu3SoSz2WDwcd1UtEzRac840P/HR0JA0ouk5FKsNpzWPG+wI8X0X -MlS6FxsbrEhA/VZq3OnSrWJODITCQ/RFy/f1o4NcB4KxYPU3LTjR7sShALB1W4t9 -3NxNt5dQnso6afGyp8SYAMElYyZ1bwxZkULD0LS6/44YLQ2Un5BTb2Qtf+zYSVvA -cHOuNuQZSLcZrVhxrGktjc6cWy33hcs7lUDYzxFWJKEw0tuFSxZ2Nkp+POxPd+UN -JQKCAQAgRhHXfI4wO2OB3GSto/acEHGm2hNDZtunZZsMfFb+8SKm8kR0MQj2B1Ww -nwwm6Cde0xvup5qA/9R24Fd0TP6Npdmz/Ol3XbOiasCRqru61VkgjzPgslrWrY4P -t8iEuCcqe+ob4hE3fV8Ys387F7mkZFoPgm6LRd3rnwhBbSx1vM0GlA0a2CmuK/Qi -hIl2fLrf3gX6w9ihfkgb8OjN9hGzwZKnpYvXusLCuWgiXstP1KDsv6pSqlbUsmSP -YuQ+xU4qDELG+qXzNxFJ92w3Oyt3Fcr/JQFcS2MiMhOQ91OaUmz9FBnrF8qpakge -fJIrFNbakNgT3zvHUrA2KSgwKsTW ------END PRIVATE KEY----- diff --git a/0xgo/sock-tcp/client/certs/ca_pub.pem b/0xgo/sock-tcp/client/certs/ca_pub.pem deleted file mode 100644 index 988570c..0000000 --- a/0xgo/sock-tcp/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqUZdrrVIQKRMIWuge1a/ -vGCS1oGyDYxzJMwiTsqlZ74uviWtKX2BV4mQKcXsHoErCtUGhKVvM00YJk1WgPau -DK8lez6GM+S8fr0EfkOU2MtlpHlt0wCpkomTkrT2ulFY68hquayuS/t0JIieXJDV -1KYusWL0sFqVTFSpt1xQ9lTTNfcHMYuNlH4UhgAWuhfqpM/0xv9wwoQmpAsRDwev -JXSpvTXktEEqw7Zsr4DINrooJrqUWXG550uouliPPTfvYTtkhA9FhvQI256VmE5B -vl8g/ZYyC7YDvObzD0fpHFeZ0YK5OrTjaQ7ANKzrK3rtM18j+qJZ2chiwq8K7A00 -E3WuA2dR9dDi2ejTGxFs3+qTBkv0TywcWCmmWSE2aqxd+UCpRdwVEMTsGayHjbmZ -X8A+1/ZOX+2dW/goV+sLhv6o7EDbZHUJfVdP03ylnhbJSbyIIUI2kEHn+baoheQB -lFdTAT3WEODPKUhDLxEmit2u0azCJmxqYtrr6lGuUYpOpYsNJt4xk9rRDHzjoS1D -+q6QHpTc8pKiO3TfchCyyue4JrylK1LefaKnSMJI3GF65cZP57SkuLC3M/S7BWDP -fBnnJeoqytCqpkeHzNLnk7przDZHijp+gSEic4aA242+gVNOjeqv6dmQRtciZgFY -MXUOHoyarTrjSy/DepF/20kCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/sock-tcp/client/main.go b/0xgo/sock-tcp/client/main.go deleted file mode 100644 index 573819f..0000000 --- a/0xgo/sock-tcp/client/main.go +++ /dev/null @@ -1,37 +0,0 @@ -package main - -import ( - "fmt" - "net" - "os" -) - -func main() { - - mode := os.Args[1] - - if mode == "net" { - conn, err := net.Dial("tcp", "localhost:8080") - if err != nil { - fmt.Println(err) - return - } - - wbuf := make([]byte, 1024) - - copy(wbuf, "Hello, server!") - - _, err = conn.Write(wbuf) - if err != nil { - fmt.Println(err) - return - } - - conn.Close() - - } else if mode == "tls" { - - TlsConnection() - } - -} diff --git a/0xgo/sock-tcp/client/tls.go b/0xgo/sock-tcp/client/tls.go deleted file mode 100644 index 5cf24bd..0000000 --- a/0xgo/sock-tcp/client/tls.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "os" - "time" -) - -func TlsConnection() { - - certpool := x509.NewCertPool() - - file_b, err := os.ReadFile("certs/ca.pem") - - /* - ca_pem := new(bytes.Buffer) - - pem.Encode(ca_pem, &pem.Block{ - Type: "CERTIFICATE", - Bytes: file_b, - }) - */ - certpool.AppendCertsFromPEM(file_b) - - config := tls.Config{RootCAs: certpool} - conn, err := tls.Dial("tcp", "localhost:8080", &config) - if err != nil { - log.Fatalf("client: dial: %s", err) - } - defer conn.Close() - log.Println("client: connected to: ", conn.RemoteAddr()) - - state := conn.ConnectionState() - for _, v := range state.PeerCertificates { - fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey)) - fmt.Println(v.Subject) - } - log.Println("client: handshake: ", state.HandshakeComplete) - log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual) - - message := make([]byte, 1024) - copy(message, "hello tls server") - n, err := conn.Write(message) - if err != nil { - log.Fatalf("client: write: %s", err) - } - - reply := make([]byte, 1024) - - readlen := 0 - - for readlen != 1024 { - - n, err = conn.Read(reply[readlen:]) - if err != nil { - fmt.Println(err) - return - } - - readlen += n - } - log.Printf("client: read :%s (%d bytes)", string(reply[:readlen]), readlen) - time.Sleep(time.Millisecond * 1000) - log.Print("client: exiting") -} diff --git a/0xgo/sock-tcp/server/certs/server.csr b/0xgo/sock-tcp/server/certs/server.csr deleted file mode 100644 index 5b41b91..0000000 --- a/0xgo/sock-tcp/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBSnzfohGT2Jf+4hcckBUDi -3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMGm9Zugj5nW6aerycBY8Yr -tyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1RhEjC5UWdEtmRUIhGL5Y -JtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta1R5R0VTLccnE43imhC4K -pLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dHq4EfVqfTzcScW+KDV7rg -PH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULpUkg5MzANHUW+D3l0sUJd -oQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1Hnsrm0XNnyk1z1blEssp -rstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO8ur7bgBuzT6QUPcYtRgz -0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHDxBYde7uBR/IIrL29s8KF -SFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyOHIjH3NBwVcFkcZHEgrLA -/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42t1gHsTVwIAcpsh2U5uXe -8GECAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQCLvBYMKRYpz8FWWwA8Asq7RrXl -jPsaHhy8Bt+7s58VYKrvt10ip0qF97equA8AJB5sf8KxihfKeuWYMfuy3cyq8Erx -geUPa+TrlVdLkbi3qqeSJaDObg/MYrZmv+dJGYRMUxlzeOGncCZEhIOKUQRRkT73 -rxOEFEc1gLPi0p9fqsTuyyLWmQUd8rwfhoMubFiXkhFnw/NEBJPl6GqpjNGTsbyN -lUtA9wNK9ys2tuyL9yEzgmrKAkBljS6f98QIqN14EvSvF85Y910m5aC9uzadv6zr -Llgs7s18GI4tLq9xl1IpiiVrZxE1I97rgjJa29hSF0EZy3UW0esI/ZN8GpDmHwLN -CSbDOJDuNYsYeGrIsXzKNSK5kZYG2Zs4iVIwug335Bi/lN4g3NyMJxi2IdDHqgHw -GRDqb24VXhS5TyuVJ16schCCqA02Qh6SOSCWyy/Ao8UWm+XnMn8alm3DGGTCZNFP -pvSAd4YztkKcTayk7FDHczZcCDK7FMIVBSKRmsF1ahYYiiYfPAMs0Kf0D0GkSBPz -NR1+ImpNitFh94fAffo18lTm8eUE324ajBLgj9xOD6S4e2F1Q1GvgFaIWThe3thg -bcp9lGl+fBdmDz3wmPN+5/AitSr3W655eBoMYqObgjYpMj7/7/PTauvh/vQ4xzPX -SpUNK+yMT+N/hc2H+w== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/sock-tcp/server/certs/server.key b/0xgo/sock-tcp/server/certs/server.key deleted file mode 100644 index 1382e5c..0000000 --- a/0xgo/sock-tcp/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -YBLNr2GdmvMahJVy1gQXG9HlYIj/sA== ------END PRIVATE KEY----- diff --git a/0xgo/sock-tcp/server/certs/server.pem b/0xgo/sock-tcp/server/certs/server.pem deleted file mode 100644 index 2f00061..0000000 --- a/0xgo/sock-tcp/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUWDCXqFc84QyJQO/liSxvt3BpYMcwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNTAyMDgxMTQxMzBaFw0yNjAyMDgxMTQx -MzBaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAJI00KyeeG+WxjPnQtlAUp836IRk9iX/uIXHJAVA4t8OcZ76m8wo -448t/YufVqs825a3Q5rurIG1sy8WzSxzBpvWboI+Z1umnq8nAWPGK7co+rnakOFB -Z54Zzd8g9A0lISzAsQHfo9+ONV2myPmC9UYRIwuVFnRLZkVCIRi+WCbX6JhF3aTX -rIaUWV1N1IuqOs1uVcKtWboQC9e3piw7WtUeUdFUy3HJxON4poQuCqS5rFzOUGXP -n0phx0A9zF+r+U0DdgEmIbWL0+irlU+HR6uBH1an083EnFvig1e64Dx/FmIdkqzj -YboDbTbEnPmNgY3BMypNxRCZskT9P5VC6VJIOTMwDR1Fvg95dLFCXaEPsLKvmnix -+Q9kVFtP6OHWURKOzdriYAs1msHm7iMQ9R57K5tFzZ8pNc9W5RLLKa7LU2wrjkDw -uR1hv0ncl+awrok7Z0sjtcfpjQYbQa8FzvLq+24Abs0+kFD3GLUYM9HBHlE6H7nM -3i6J7C/re+5ISvi3bYrF5gqhWXpZuVaBw8QWHXu7gUfyCKy9vbPChUhXFOYbLaSS -nE6W17yjsb4dmsVKtjicrJ/MVUhGdbQ8jhyIx9zQcFXBZHGRxIKywP6YdB8KJSIh -9RBO+O918hjqqsiSspPQwOoy/VBdvNpuNrdYB7E1cCAHKbIdlObl3vBhAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU89cgoz1/aHzj2bu3 -RywilJJM5M8wHwYDVR0jBBgwFoAUfMktrWwZkMks0TEaY4IclVFnb5IwDQYJKoZI -hvcNAQELBQADggIBAKHCXvS4uX9o24h3XGN20Q4FzfofAZ7dHDjqNglg/0SxxvgO -2R1kyDNrD8PiaQRP990gNhodSp38XtMLro8nRWjQHyY0Wxv/msBd+BQF4kJ6/BLn -l2TBFpGCa1VN6zKed4Nf0BW5WKEuQIiuJ2IfNpp/Eel/5duKWGbhAKr4tVGXCWRV -SmpNl+aGKsxgrx2vZw92JgoRJ/bBOQp/C+etwI/Yravgbl6KVRhpx4Fwbu/nXErm -YUXyynpk2wlfKvOgW0DJpeJ7VwGukwtvLdeaOq6+goVXa2rJrrjYyLBsCNIaiNiW -cmBZp1k8zJQ0BQbY8a/FTb3yrFMo80EzpRQ10VtBztO8I11IE2K8fIEv5HpqIDYJ -h6sdvWP7dJYyXih1cKS78LRCuyOTyrRPjpyVwyzz5bbbrlcu5smNvK5HqbM9GeAT -R4+43ifMk9ZIObd8MlKgXTDC7QFb2GjiCUJF5hMGTlrwUZDNR4Esibe8l1xHd0yL -XQSNzBvj0UcKmuhabx79dAZLl/DutB95kH8esjPj0eCLwlZYkAZwXuw/xIbUIL5s -GsN0klNego9c51ey27K4CVVznt/8xPRfR182ZOr9KVE20cphK0UyAFaXhSCkZLaq -b/3+P6Dg7dDK2k5wFLWfOX0bhVbhfYIX8GZM9VGX/Dn3DqZtC1QXxDpyFlDG ------END CERTIFICATE----- diff --git a/0xgo/sock-tcp/server/certs/server.pub b/0xgo/sock-tcp/server/certs/server.pub deleted file mode 100644 index 058ca12..0000000 --- a/0xgo/sock-tcp/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkjTQrJ54b5bGM+dC2UBS -nzfohGT2Jf+4hcckBUDi3w5xnvqbzCjjjy39i59WqzzblrdDmu6sgbWzLxbNLHMG -m9Zugj5nW6aerycBY8Yrtyj6udqQ4UFnnhnN3yD0DSUhLMCxAd+j3441XabI+YL1 -RhEjC5UWdEtmRUIhGL5YJtfomEXdpNeshpRZXU3Ui6o6zW5Vwq1ZuhAL17emLDta -1R5R0VTLccnE43imhC4KpLmsXM5QZc+fSmHHQD3MX6v5TQN2ASYhtYvT6KuVT4dH -q4EfVqfTzcScW+KDV7rgPH8WYh2SrONhugNtNsSc+Y2BjcEzKk3FEJmyRP0/lULp -Ukg5MzANHUW+D3l0sUJdoQ+wsq+aeLH5D2RUW0/o4dZREo7N2uJgCzWawebuIxD1 -Hnsrm0XNnyk1z1blEssprstTbCuOQPC5HWG/SdyX5rCuiTtnSyO1x+mNBhtBrwXO -8ur7bgBuzT6QUPcYtRgz0cEeUTofuczeLonsL+t77khK+LdtisXmCqFZelm5VoHD -xBYde7uBR/IIrL29s8KFSFcU5hstpJKcTpbXvKOxvh2axUq2OJysn8xVSEZ1tDyO -HIjH3NBwVcFkcZHEgrLA/ph0HwolIiH1EE7473XyGOqqyJKyk9DA6jL9UF282m42 -t1gHsTVwIAcpsh2U5uXe8GECAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/sock-tcp/server/main.go b/0xgo/sock-tcp/server/main.go deleted file mode 100644 index 95a0920..0000000 --- a/0xgo/sock-tcp/server/main.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "fmt" - "net" - "os" -) - -func main() { - - mode := os.Args[1] - - if mode == "net" { - ln, err := net.Listen("tcp", "0.0.0.0:8080") - if err != nil { - fmt.Println(err) - return - } - - for { - conn, err := ln.Accept() - if err != nil { - fmt.Println(err) - continue - } - - go handleConnection(conn) - } - } else if mode == "tls" { - - TlsListen() - - } - -} - -func handleConnection(conn net.Conn) { - - defer conn.Close() - - buf := make([]byte, 1024) - - for { - - readlen := 0 - - for readlen != 1024 { - - n, err := conn.Read(buf[readlen:]) - if err != nil { - fmt.Println(err) - return - } - - readlen += n - } - - fmt.Printf("Received: %s", buf) - - _, err := conn.Write(buf) - - if err != nil { - fmt.Println(err) - return - } - - } - -} diff --git a/0xgo/sock-tcp/server/tls.go b/0xgo/sock-tcp/server/tls.go deleted file mode 100644 index b168244..0000000 --- a/0xgo/sock-tcp/server/tls.go +++ /dev/null @@ -1,78 +0,0 @@ -package main - -import ( - "crypto/rand" - "crypto/tls" - "crypto/x509" - "log" - "net" -) - -func TlsListen() { - cert, err := tls.LoadX509KeyPair("certs/server.pem", "certs/server.key") - if err != nil { - log.Fatalf("server: loadkeys: %s", err) - } - config := tls.Config{Certificates: []tls.Certificate{cert}} - config.Rand = rand.Reader - service := "0.0.0.0:8080" - listener, err := tls.Listen("tcp", service, &config) - if err != nil { - log.Fatalf("server: listen: %s", err) - } - log.Print("server: listening") - for { - conn, err := listener.Accept() - if err != nil { - log.Printf("server: accept: %s", err) - break - } - defer conn.Close() - log.Printf("server: accepted from %s", conn.RemoteAddr()) - tlscon, ok := conn.(*tls.Conn) - if ok { - log.Print("ok=true") - state := tlscon.ConnectionState() - for _, v := range state.PeerCertificates { - log.Print(x509.MarshalPKIXPublicKey(v.PublicKey)) - } - } - go handleClient(conn) - } -} - -func handleClient(conn net.Conn) { - defer conn.Close() - buf := make([]byte, 1024) - var reterr error = nil - for { - readlen := 0 - log.Print("server: conn: waiting") - - for readlen != 1024 { - - n, err := conn.Read(buf[readlen:]) - if err != nil { - - reterr = err - break - } - - readlen += n - } - - if reterr != nil { - log.Printf("server: conn: read: %s", reterr) - return - } - - log.Printf("server: conn: echo %s\n", string(buf)) - _, err := conn.Write(buf) - - if err != nil { - log.Printf("server: write: %s", err) - break - } - } - log.Println("server: conn: closed") -} diff --git a/0xgo/sock-udp/Makefile b/0xgo/sock-udp/Makefile deleted file mode 100644 index 372df8f..0000000 --- a/0xgo/sock-udp/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -all: - - go build -o client/client.out ./client - - go build -o server/server.out ./server \ No newline at end of file diff --git a/0xgo/sock-udp/client/main.go b/0xgo/sock-udp/client/main.go deleted file mode 100644 index 0693e2b..0000000 --- a/0xgo/sock-udp/client/main.go +++ /dev/null @@ -1,30 +0,0 @@ -package main - -import ( - "fmt" - "net" -) - -var addr = "0.0.0.0:8888" - -func main() { - - p := make([]byte, 128) - conn, err := net.Dial("udp", addr) - - if err != nil { - fmt.Printf("Some error %v", err) - return - } - - copy(p, "hello udp server") - - n, err := conn.Write(p) - - if err == nil { - fmt.Printf("sent %d\n", n) - } else { - fmt.Printf("Some error %v\n", err) - } - conn.Close() -} diff --git a/0xgo/sock-udp/server/main.go b/0xgo/sock-udp/server/main.go deleted file mode 100644 index 304bda3..0000000 --- a/0xgo/sock-udp/server/main.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - "strings" -) - -var addr = "0.0.0.0:8888" - -func GetServer(addr string) (*net.UDPConn, error) { - - addrlist := strings.Split(addr, ":") - - var port int - - fmt.Sscanf(addrlist[1], "%d", &port) - - ip := net.ParseIP(addrlist[0]).To4() - - udpaddr := net.UDPAddr{ - - IP: ip, - Port: port, - } - - listener, err := net.ListenUDP("udp", &udpaddr) - - if err != nil { - - return nil, fmt.Errorf("failed to get server: %s", err.Error()) - } - - return listener, nil -} - -func main() { - - l, err := GetServer(addr) - - if err != nil { - - log.Printf("failed: %s\n", err.Error()) - - return - } - - for { - - buf := make([]byte, 128) - - _, remoteaddr, err := l.ReadFromUDP(buf) - - strbuf := string(buf) - - fmt.Printf("Read a message from %v: %s\n", remoteaddr, strbuf) - - if err != nil { - fmt.Printf("Some error %v", err) - continue - } - - } -} diff --git a/0xgo/sock-unix/Makefile b/0xgo/sock-unix/Makefile deleted file mode 100644 index 8421f5a..0000000 --- a/0xgo/sock-unix/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -all: - - go build -o client/client.out ./client - - go build -o server/server.out ./server - diff --git a/0xgo/sock-unix/client/main.go b/0xgo/sock-unix/client/main.go deleted file mode 100644 index c1def0a..0000000 --- a/0xgo/sock-unix/client/main.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" - "time" -) - -var addr = "/tmp/this.sock" - -func GetClient(baseAddr string) (net.Conn, error) { - - c, err := net.Dial("unix", baseAddr) - - if err != nil { - - return nil, fmt.Errorf("failed to set ipc client: %s", err.Error()) - } - - return c, nil -} - -func main() { - - c, err := GetClient(addr) - - if err != nil { - - log.Printf("failed: %s\n", err.Error()) - - return - } - - buff := make([]byte, 512) - - copy(buff, "hello world") - - for { - - time.Sleep(1 * time.Second) - - n, err := c.Write(buff) - - if err != nil { - - log.Printf("write failed: %s\n", err.Error()) - - break - } - - _ = n - - buff := make([]byte, 512) - - n, err = c.Read(buff) - - if err != nil { - - log.Printf("read failed: %s\n", err.Error()) - - break - - } - - log.Printf("got message\n") - - fmt.Println(string(buff)) - - } - -} diff --git a/0xgo/sock-unix/server/main.go b/0xgo/sock-unix/server/main.go deleted file mode 100644 index 2245519..0000000 --- a/0xgo/sock-unix/server/main.go +++ /dev/null @@ -1,98 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net" -) - -var addr = "/tmp/this.sock" - -func GetServer(baseAddr string) (net.Listener, error) { - - listener, err := net.Listen("unix", baseAddr) - - if err != nil { - - return nil, fmt.Errorf("listen error: %s", err.Error()) - - } - - return listener, nil -} - -func doProcess(c net.Conn) { - - for { - - buf := make([]byte, 512) - - wbuf := make([]byte, 512) - - n, err := c.Read(buf) - - if err != nil { - - log.Printf("read: %s\n", err.Error()) - - return - } - - nStr := fmt.Sprintf("%d", n) - - var strlen int = 0 - - for i := 0; i < 512; i++ { - - strlen = i - - if buf[i] == 0 { - - break - } - - } - - copy(wbuf, buf[:strlen]) - - copy(wbuf[strlen:], []byte(nStr)) - - _, err = c.Write(wbuf) - - if err != nil { - - log.Printf("write: %s\n", err.Error()) - - return - } - - } - -} - -func main() { - - l, err := GetServer(addr) - - if err != nil { - log.Printf("failed to get server: %s\n", err.Error()) - - return - } - - for { - - c, err := l.Accept() - - if err != nil { - - log.Printf("failed to accept: %s\n", err.Error()) - - continue - } - - go doProcess(c) - - } - -} diff --git a/0xgo/util/util.go b/0xgo/util/util.go deleted file mode 100644 index c62c06e..0000000 --- a/0xgo/util/util.go +++ /dev/null @@ -1,274 +0,0 @@ -package util - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "io" - "log" - "os" - "strconv" - "strings" - "time" - - "golang.org/x/crypto/ssh" -) - -var HEX_RUNES = []rune{ - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', -} - -func CheckIfSliceContains[T comparable](slice []T, ele T) bool { - - hit := false - - for i := 0; i < len(slice); i++ { - - if slice[i] == ele { - - hit = true - - return hit - } - - } - - return hit - -} - -func PopFromSliceByIndex[T comparable](slice []T, idx int) (T, []T) { - - pop_val := slice[idx] - - return pop_val, append(slice[:idx], slice[idx+1:]...) - -} - -func InsertToSliceByIndex[T comparable](slice []T, idx int, val T) []T { - - return append(slice[:idx], append([]T{val}, slice[idx:]...)...) -} - -func SplitStrict(content string) map[string]string { - out := map[string]string{} - for _, line := range strings.Split(content, "\n") { - parts := strings.SplitN(line, "=", 2) - if len(parts) != 2 { - continue - } - key := parts[0] - if len(key) == 0 || key[0] == '#' { - continue - } - - value := parts[1] - if len(value) > 2 && value[0] == '"' && value[len(value)-1] == '"' { - - var err error - value, err = strconv.Unquote(value) - if err != nil { - continue - } - } - out[key] = value - } - return out -} - -func MakeOSReleaseLinux() map[string]string { - - var osRelease map[string]string - - if osRelease == nil { - - osRelease = map[string]string{} - if bytes, err := os.ReadFile("/etc/os-release"); err == nil { - osRelease = SplitStrict(string(bytes)) - } - } - return osRelease -} - -func SliceContains(s []string, str string) bool { - for _, v := range s { - if v == str { - return true - } - } - - return false -} - -func RandomHex(n int) (string, error) { - bytes := make([]byte, n) - if _, err := rand.Read(bytes); err != nil { - return "", err - } - return hex.EncodeToString(bytes), nil -} - -type ShellConnection struct { - *ssh.Client - password string -} - -func ShellConnect(addr, user, password string) (*ShellConnection, error) { - - var hostkeyCallback = ssh.InsecureIgnoreHostKey() - - sshConfig := &ssh.ClientConfig{ - User: user, - Auth: []ssh.AuthMethod{ - ssh.Password(password), - }, - HostKeyCallback: hostkeyCallback, - } - - conn, err := ssh.Dial("tcp", addr, sshConfig) - if err != nil { - return nil, err - } - - return &ShellConnection{conn, password}, nil - -} - -func (conn *ShellConnection) SendCommands(cmds string) ([]byte, error) { - session, err := conn.NewSession() - if err != nil { - log.Fatal(err) - } - defer session.Close() - - modes := ssh.TerminalModes{ - ssh.ECHO: 0, - ssh.TTY_OP_ISPEED: 14400, - ssh.TTY_OP_OSPEED: 14400, - } - - err = session.RequestPty("xterm", 80, 40, modes) - if err != nil { - return []byte{}, err - } - - stdoutB := new(bytes.Buffer) - session.Stdout = stdoutB - in, _ := session.StdinPipe() - - go func(in io.Writer, output *bytes.Buffer) { - - t_start := time.Now() - - for { - - t_now := time.Now() - - diff := t_now.Sub(t_start) - if strings.Contains(string(output.Bytes()), "[sudo] password for ") { - _, err = in.Write([]byte(conn.password + "\n")) - if err != nil { - break - } - break - } - if diff.Seconds() > 30 { - break - } - } - }(in, stdoutB) - - err = session.Run(cmds) - if err != nil { - return []byte{}, err - } - return stdoutB.Bytes(), nil -} - -func (conn *ShellConnection) SendCommandsBackground(cmds string) ([]byte, error) { - session, err := conn.NewSession() - if err != nil { - log.Fatal(err) - } - defer session.Close() - - stdoutB := new(bytes.Buffer) - session.Stdout = stdoutB - in, _ := session.StdinPipe() - - go func(in io.Writer, output *bytes.Buffer) { - - t_start := time.Now() - - for { - - t_now := time.Now() - - diff := t_now.Sub(t_start) - - if strings.Contains(string(output.Bytes()), "[sudo] password for ") { - _, err = in.Write([]byte(conn.password + "\n")) - if err != nil { - break - } - break - } - - if diff.Seconds() > 30 { - break - } - - } - }(in, stdoutB) - - err = session.Start(cmds) - if err != nil { - return []byte{}, err - } - return stdoutB.Bytes(), nil -} - -func SanitizeUnnecessary(line string) string { - - ret := "" - - line = strings.ReplaceAll(line, " ", "") - line = strings.ReplaceAll(line, "\n", "") - - llen := len(line) - - for i := 0; i < llen; i++ { - - if line[i] == '[' || line[i] == ']' { - - continue - - } else if line[i] == ',' { - - ret += " " - - } else { - - ret += string(line[i]) - - } - - } - - return ret -} diff --git a/0xgo/webrtc/Makefile b/0xgo/webrtc/Makefile deleted file mode 100644 index c0436be..0000000 --- a/0xgo/webrtc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -all: - go build -o main.out . - -clean: - - rm -rf *.out \ No newline at end of file diff --git a/0xgo/webrtc/config.yaml b/0xgo/webrtc/config.yaml deleted file mode 100644 index ae7f13f..0000000 --- a/0xgo/webrtc/config.yaml +++ /dev/null @@ -1,27 +0,0 @@ -turnServerAddr: - - addr: turn:localhost:3478 - id: hello - pw: example - -rooms: - - key: abcd - members: - - hello - - world - -url: "localhost" - -signalPort: 8002 - -rtpReceivePort: 8004 - -peerSignalAttemptSync: 5 - -peerSignalAddr : /signal/peer/ - -rtcpPLIInterval: 3 - -udpMuxPort: 8006 - -udpEphemeralPortMin: 31000 -udpEphemeralPortMax: 31100 diff --git a/0xgo/webrtc/main.go b/0xgo/webrtc/main.go deleted file mode 100644 index 5bebae4..0000000 --- a/0xgo/webrtc/main.go +++ /dev/null @@ -1,137 +0,0 @@ -package main - -import ( - "fmt" - "log" - "os" - "time" - - "github.com/gin-gonic/contrib/sessions" - "github.com/gin-gonic/gin" - "gopkg.in/yaml.v3" - - "github.com/seantywork/0xgo/webrtc/webrtc" -) - -type Config struct { - TurnServerAddr []struct { - Addr string `yaml:"addr"` - Id string `yaml:"id"` - Pw string `yaml:"pw"` - } `yaml:"turnServerAddr"` - Rooms []struct { - Key string `yaml:"key"` - Members []string `yaml:"members"` - } `yaml:"rooms"` - Url string `yaml:"url"` - SignalPort int `yaml:"signalPort"` - RtpReceivePort int `yaml:"rtpReceivePort"` - PeerSignalAttemptSync int `yaml:"peerSignalAttemptSync"` - PeerSignalAddr string `yaml:"peerSignalAddr"` - RtcpPLIInterval int `yaml:"rtcpPLIInterval"` - UdpMuxPort int `yaml:"udpMuxPort"` - UdpEphemeralPortMin int `yaml:"udpEphemeralPortMin"` - UdpEphemeralPortMax int `yaml:"udpEphemeralPortMax"` -} - -func GetIndex(c *gin.Context) { - - c.HTML(200, "index.html", gin.H{}) - -} - -func main() { - - file_b, err := os.ReadFile("config.yaml") - - if err != nil { - - log.Printf("failed to read config.yaml: %v", err) - - os.Exit(-1) - } - - conf := Config{} - - err = yaml.Unmarshal(file_b, &conf) - - if err != nil { - log.Printf("failed to unmarshal: %v\n", err) - - os.Exit(-1) - } - - turnlen := len(conf.TurnServerAddr) - - for i := 0; i < turnlen; i++ { - - addr := struct { - Addr string `json:"addr"` - Id string `json:"id"` - Pw string `json:"pw"` - }{} - - addr.Addr = conf.TurnServerAddr[i].Addr - addr.Id = conf.TurnServerAddr[i].Id - addr.Pw = conf.TurnServerAddr[i].Pw - - webrtc.TURN_SERVER_ADDR = append(webrtc.TURN_SERVER_ADDR, addr) - - } - - roomlen := len(conf.Rooms) - - for i := 0; i < roomlen; i++ { - - pc := webrtc.PeersCreate{} - - pc.RoomName = conf.Rooms[i].Key - - pc.Users = conf.Rooms[i].Members - - webrtc.CreatePeers(&pc) - - } - - webrtc.URL = conf.Url - webrtc.CHANNEL_PORT = fmt.Sprintf("%d", conf.SignalPort) - webrtc.RTP_RECEIVE_PORT = fmt.Sprintf("%d", conf.RtpReceivePort) - webrtc.PEER_SIGNAL_ATTEMPT_SYNC = conf.PeerSignalAttemptSync - webrtc.PEERS_SIGNAL_PATH = conf.PeerSignalAddr - webrtc.RTCP_PLI_INTERVAL = time.Second * time.Duration(conf.RtcpPLIInterval) - webrtc.UDP_MUX_PORT = conf.UdpMuxPort - webrtc.UDP_EPHEMERAL_PORT_MIN = conf.UdpEphemeralPortMin - webrtc.UDP_EPHEMERAL_PORT_MAX = conf.UdpEphemeralPortMax - - webrtc.InitWebRTCApi() - - server := gin.Default() - - store := sessions.NewCookieStore([]byte("WEBRTC")) - - server.Use(sessions.Sessions("WEBRTC", store)) - - server.LoadHTMLGlob("view/*") - - server.Static("/public", "./public") - - server.GET("/", GetIndex) - - server.GET("/rtmp", webrtc.GetRtmp) - - server.POST("/api/rtmp/open", webrtc.RtmpOpen) - - server.GET("/room/:roomId/:userId", webrtc.GetRoom) - - server.GET("/api/peers/signal/address", webrtc.GetPeersSignalAddress) - - go webrtc.InitRTMPServer() - - webrtc.AddChannelHandler(conf.PeerSignalAddr, webrtc.RoomSignalHandler) - - webrtc.AddChannelCallback(webrtc.SignalDispatcher) - - go webrtc.StartAllChannelHandlers() - - server.Run("0.0.0.0:8000") -} diff --git a/0xgo/webrtc/public/js/room.js b/0xgo/webrtc/public/js/room.js deleted file mode 100644 index 3290502..0000000 --- a/0xgo/webrtc/public/js/room.js +++ /dev/null @@ -1,232 +0,0 @@ - - -pc = {} -ws = {} - -PEERS_SIGNAL_ADDRESS = "" - -TURN_SERVER_ADDRESS= {} - -ICE_SENT = 0 - -MESSAGE_FORMAT = { - - command: "", - data: "" - -} - -async function initPeers(){ - - - - let roomInfo = JSON.stringify(ROOM_INFO) - - if(roomInfo == ""){ - - alert("no room info provided") - - return - } - - await init() - - - - navigator.mediaDevices.getUserMedia({ video: true, audio: true }) - .then(function(stream){ - - pc = new RTCPeerConnection({ -// iceServers: [ -// { -// urls: TURN_SERVER_ADDRESS.addr, -// username: TURN_SERVER_ADDRESS.id, -// credential: TURN_SERVER_ADDRESS.pw -// } -// ] - }) - - document.getElementById('localVideo').srcObject = stream - stream.getTracks().forEach(function(track) {pc.addTrack(track, stream)}) - - if (location.protocol !== 'https:') { - - ws = new WebSocket("ws://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name) - - } else { - - ws = new WebSocket("wss://" + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name) - - - } - - ws.onopen = function(evt){ - - ws.send(JSON.stringify({command: 'auth', data: roomInfo})) - - } - - ws.onclose = function(evt) { - alert("Websocket has closed") - } - - ws.onmessage = function(evt) { - let msg = JSON.parse(evt.data) - - if (!msg) { - return console.log('failed to parse msg') - } - - - switch (msg.command) { - case 'offer': - let offer = JSON.parse(atob(msg.data)) - if (!offer) { - return console.log('failed to parse answer') - } - - console.log("got offer") - - pc.setRemoteDescription(offer) - pc.createAnswer().then(function(answer) { - pc.setLocalDescription(answer) - ws.send(JSON.stringify({command: 'answer', data: btoa(JSON.stringify(answer))})) - }) - - console.log("sent answer") - - return - - case 'candidate': - - console.log("got candidate") - - let candidate = JSON.parse(atob(msg.data)) - if (!candidate) { - return console.log('failed to parse candidate') - } - - pc.addIceCandidate(candidate) - - console.log("added candidate") - - return - - case 'chat': - - let chatData = msg.data - - let chatMessage = JSON.parse(chatData) - - document.getElementById("chat-reader").innerText += `<${chatMessage.user}> ${chatMessage.message} \n` - - return - } - } - - ws.onerror = function(evt) { - console.log("ERROR: " + evt.data) - } - - pc.ontrack = function (event) { - if (event.track.kind === 'audio') { - return - } - - let el = document.createElement(event.track.kind) - el.srcObject = event.streams[0] - el.autoplay = true - el.controls = true - document.getElementById('remoteVideos').appendChild(el) - - event.track.onmute = function(event) { - el.play() - } - - event.streams[0].onremovetrack = function({track}) { - - if (el.parentNode) { - el.parentNode.removeChild(el) - } - } - } - - - pc.onicecandidate = function(e){ - - if (!e.candidate) { - - console.log("not a candidate") - - return - } - - - ws.send(JSON.stringify({command: 'candidate', data: btoa(JSON.stringify(e.candidate))})) - console.log("sent ice candidate") - - - } - - - - console.log("opened peer connection ready") - - }) - .catch(function(e){ - - alert(e) - }) - - - -} - -function sendChat(){ - - let chatConent = document.getElementById("chat-sender").value - - document.getElementById("chat-sender").value = "" - - let req = JSON.parse(JSON.stringify(MESSAGE_FORMAT)) - - req.command = "chat" - req.data = chatConent - - ws.send(JSON.stringify(req)) - -} - - -async function init(){ - - let options = { - method: "GET" - } - let result = await fetch("/api/peers/signal/address", options) - - let data = await result.json() - - if(data.status != "success"){ - - alert("failed to get peers signal address") - - return - } - - - PEERS_SIGNAL_ADDRESS = data.reply - - console.log("peersSignalAddr: " + PEERS_SIGNAL_ADDRESS + ROOM_INFO.room_name) - - - console.log("opened channel for peer signal") - -} - - -(async function (){ - - await initPeers() - -})() \ No newline at end of file diff --git a/0xgo/webrtc/public/js/rtmp.js b/0xgo/webrtc/public/js/rtmp.js deleted file mode 100644 index a9c2d45..0000000 --- a/0xgo/webrtc/public/js/rtmp.js +++ /dev/null @@ -1,125 +0,0 @@ -pc = {} - -ws = {} - - - -TURN_SERVER_ADDRESS = {} - - -STREAMING_KEY = "" - -CLIENT_REQ = { - "data":"" -} - -SERVER_RE = { - "status": "", - "reply": "" -} - - - -RTMP_STRUCT = { - - "streaming_key":"", - "description": "" - -} - - - -async function initRTMP(){ - - - pc = new RTCPeerConnection({ -// iceServers: [ -// { -// urls: TURN_SERVER_ADDRESS.addr, -// username: TURN_SERVER_ADDRESS.id, -// credential: TURN_SERVER_ADDRESS.pw -// } -// ] - }) - - pc.oniceconnectionstatechange = function(e) {console.log(pc.iceConnectionState)} - - pc.onicecandidate = async function(event){ - - if (event.candidate === null){ - - - let req = { - data: JSON.stringify(pc.localDescription) - } - - let options = { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify(req) - } - - let resp = await fetch("/api/rtmp/open", options) - - let data = await resp.json() - - if (data.status != "success") { - - alert("failed to start cctv offer") - } - try { - - cs = JSON.parse(data.reply) - - console.log(cs) - - let remoteDesc = JSON.parse(cs.description) - - pc.setRemoteDescription(new RTCSessionDescription(remoteDesc)) - - STREAMING_KEY = cs.streaming_key - - alert("streaming address: " + cs.location) - - - } catch (e){ - - alert(e) - } - - } - - - } - - pc.ontrack = function (event) { - - var el = document.createElement(event.track.kind) - el.srcObject = event.streams[0] - el.autoplay = true - el.controls = true - - document.getElementById('cctv-reader').appendChild(el) - - } - - pc.addTransceiver('video') - pc.addTransceiver('audio') - - let offer = await pc.createOffer() - - pc.setLocalDescription(offer) - - console.log("init success") - -} - - - - - - - - diff --git a/0xgo/webrtc/setup.sh b/0xgo/webrtc/setup.sh deleted file mode 100755 index d825bc5..0000000 --- a/0xgo/webrtc/setup.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -sudo apt update - -sudo apt install coturn -y \ No newline at end of file diff --git a/0xgo/webrtc/turn.md b/0xgo/webrtc/turn.md deleted file mode 100644 index 2ca68d2..0000000 --- a/0xgo/webrtc/turn.md +++ /dev/null @@ -1,25 +0,0 @@ -sudo vim /etc/default/coturn - -TURNSERVER_ENABLED=1 - -sudo systemctl start coturn - -sudo vim /etc/turnserver.conf - -listening-ip=0.0.0.0 - -listening-port=3478 - -external-ip=feebdaed.xyz/192.168.0.1 - -min-port=3479 max-port=3579 - -verbose - -lt-cred-mech - -user=MYUSER:MYPASS - -realm=feebdaed.xyz - -sudo systemctl restart coturn \ No newline at end of file diff --git a/0xgo/webrtc/view/index.html b/0xgo/webrtc/view/index.html deleted file mode 100644 index 4cc9b1b..0000000 --- a/0xgo/webrtc/view/index.html +++ /dev/null @@ -1,22 +0,0 @@ -{{ define "index.html" }} - - - - - - index - - - - - - index - - video chat: /room/:roomId/:userId - - rtmp: /rtmp - - - - -{{ end }} \ No newline at end of file diff --git a/0xgo/webrtc/view/room.html b/0xgo/webrtc/view/room.html deleted file mode 100644 index eed0ac8..0000000 --- a/0xgo/webrtc/view/room.html +++ /dev/null @@ -1,61 +0,0 @@ -{{ define "room.html" }} - - - - - - room - - - - - - -
-
-
-
-
- Video -

Local Video

-
-
-
-

Remote Video

-
-

-
-
-
-
-
-
-
- -
- - - - - - - -{{ end }} \ No newline at end of file diff --git a/0xgo/webrtc/view/rtmp.html b/0xgo/webrtc/view/rtmp.html deleted file mode 100644 index 5549b35..0000000 --- a/0xgo/webrtc/view/rtmp.html +++ /dev/null @@ -1,32 +0,0 @@ -{{ define "rtmp.html" }} - - - - rtmp - - - - - - -
-
-
-
-
- rtmp -
-
-
- - -
-
-
- - - - - - -{{ end }} \ No newline at end of file diff --git a/0xgo/webrtc/webrtc/com.go b/0xgo/webrtc/webrtc/com.go deleted file mode 100644 index 5b7353a..0000000 --- a/0xgo/webrtc/webrtc/com.go +++ /dev/null @@ -1,154 +0,0 @@ -package webrtc - -import ( - "encoding/json" - "fmt" - "log" - "net/http" - "sync" - - "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" -) - -type CLIENT_REQ struct { - Data string `json:"data"` -} - -type SERVER_RE struct { - Status string `json:"status"` - Reply string `json:"reply"` -} - -type RT_REQ_DATA struct { - Command string `json:"command"` - Data string `json:"data"` -} - -type RT_RESP_DATA struct { - Status string `json:"status"` - Data string `json:"data"` -} - -var CHANNEL_ADDR string = "0.0.0.0" - -var CHANNEL_PORT string - -var USER_CHANNEL = make(map[string]*websocket.Conn) - -var CH_CALLBACKS []func() - -var ListLock sync.RWMutex - -type ThreadSafeWriter struct { - *websocket.Conn - sync.Mutex -} - -func GetRtmp(c *gin.Context) { - - c.HTML(200, "rtmp.html", gin.H{}) -} - -func GetRoom(c *gin.Context) { - - roomId := c.Param("roomId") - - userId := c.Param("userId") - - p_users, okay := ROOMREG[roomId] - - if !okay { - fmt.Printf("view room: no such room\n") - - c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"}) - - return - } - - pu_len := len(p_users) - - allowed := 0 - - user_index := -1 - - for i := 0; i < pu_len; i++ { - - if p_users[i].User == userId { - - allowed = 1 - - user_index = i - - break - } - - } - - if allowed != 1 { - - fmt.Printf("view room: user not allowed\n") - - c.JSON(http.StatusForbidden, SERVER_RE{Status: "error", Reply: "not allowed"}) - - return - - } - - var pj PeersJoin - - pj.RoomName = roomId - pj.User = p_users[user_index].User - pj.UserKey = p_users[user_index].UserKey - - jb, err := json.Marshal(pj) - - if err != nil { - - fmt.Printf("view room: marshal\n") - - c.JSON(http.StatusInternalServerError, SERVER_RE{Status: "error", Reply: "failed to get room"}) - - return - - } - - c.HTML(200, "room.html", gin.H{ - "room_code": string(jb), - }) - -} - -func (t *ThreadSafeWriter) WriteJSON(v interface{}) error { - t.Lock() - defer t.Unlock() - - return t.Conn.WriteJSON(v) -} - -func AddChannelHandler(channelPath string, channelHandler func(w http.ResponseWriter, r *http.Request)) { - - http.HandleFunc(channelPath, channelHandler) - -} - -func AddChannelCallback(channelFunction func()) { - - CH_CALLBACKS = append(CH_CALLBACKS, channelFunction) -} - -func StartAllChannelHandlers() { - - callback_count := len(CH_CALLBACKS) - - for i := 0; i < callback_count; i++ { - - go CH_CALLBACKS[i]() - - } - - channel_addr := CHANNEL_ADDR + ":" + CHANNEL_PORT - - log.Fatal(http.ListenAndServe(channel_addr, nil)) - -} diff --git a/0xgo/webrtc/webrtc/peers.go b/0xgo/webrtc/webrtc/peers.go deleted file mode 100644 index 62db91a..0000000 --- a/0xgo/webrtc/webrtc/peers.go +++ /dev/null @@ -1,521 +0,0 @@ -package webrtc - -import ( - "encoding/json" - "fmt" - "html" - "log" - "net/http" - "strings" - "sync" - "time" - - "github.com/gin-gonic/gin" - "github.com/pion/rtcp" - "github.com/pion/webrtc/v4" -) - -var URL string = "localhost" - -var PEERS_SIGNAL_PATH string - -var PEER_SIGNAL_ATTEMPT_SYNC int - -type PeersEntryStruct struct { - RoomName []string `json:"room_name"` -} - -type PeersUserStruct struct { - UserKey string `json:"user_key"` - User string `json:"user"` -} - -type PeersCreate struct { - RoomName string `json:"room_name"` - Users []string `json:"users"` -} - -type PeersJoin struct { - RoomName string `json:"room_name"` - User string `json:"user"` - UserKey string `json:"user_key"` -} - -type ChatMessage struct { - User string `json:"user"` - Message string `json:"message"` -} - -var ROOMREG = make(map[string][]PeersUserStruct) - -func GetPeersSignalAddress(c *gin.Context) { - - var s_addr string - - s_addr = URL + ":" + CHANNEL_PORT + PEERS_SIGNAL_PATH - - c.JSON(http.StatusOK, SERVER_RE{Status: "success", Reply: s_addr}) - -} - -func CreatePeers(pc *PeersCreate) { - - fmt.Println("create peers") - - var p_create PeersCreate = *pc - - ROOMREG[p_create.RoomName] = make([]PeersUserStruct, 0) - - u_len := len(p_create.Users) - - for i := 0; i < u_len; i++ { - - ROOMREG[p_create.RoomName] = append(ROOMREG[p_create.RoomName], PeersUserStruct{ - UserKey: p_create.Users[i], - User: p_create.Users[i], - }) - - } - - roomPeerConnections[p_create.RoomName] = []peerConnectionState{} - - roomTrackLocals[p_create.RoomName] = nil - - return - -} - -func roomJoinAuth(c *ThreadSafeWriter) (string, error) { - - timeout_iter_count := 0 - - timeout_iter := TIMEOUT_SEC * 10 - - ticker := time.NewTicker(100 * time.Millisecond) - - received_auth := make(chan RT_REQ_DATA) - - got_auth := 0 - - var req RT_REQ_DATA - - go func() { - - auth_req := RT_REQ_DATA{} - - err := c.ReadJSON(&auth_req) - - if err != nil { - - log.Fatal("read auth:", err) - return - } - - received_auth <- auth_req - - }() - - for got_auth == 0 { - - select { - - case <-ticker.C: - - if timeout_iter_count <= timeout_iter { - - timeout_iter_count += 1 - - } else { - - return "", fmt.Errorf("read auth: timed out") - } - - case a := <-received_auth: - - req = a - - got_auth = 1 - - break - } - - } - - var pj PeersJoin - - err := json.Unmarshal([]byte(req.Data), &pj) - - if err != nil { - - return "", fmt.Errorf("read auth: marshal: %s", err.Error()) - } - - p_users, okay := ROOMREG[pj.RoomName] - - if !okay { - - return "", fmt.Errorf("failed to get okay: %s", "no such room") - } - - pu_len := len(p_users) - - found := 0 - - for i := 0; i < pu_len; i++ { - - if p_users[i].User == pj.User && p_users[i].UserKey == pj.UserKey { - - found = 1 - - break - - } - - } - - if found != 1 { - - return "", fmt.Errorf("no matching user found") - - } - - return pj.User, nil -} - -func RoomSignalHandler(w http.ResponseWriter, r *http.Request) { - // Upgrade HTTP request to Websocket - - UPGRADER.CheckOrigin = func(r *http.Request) bool { return true } - - unsafeConn, err := UPGRADER.Upgrade(w, r, nil) - if err != nil { - log.Printf("upgrade: %s\n", err.Error()) - return - } - - roomParam := strings.TrimPrefix(r.URL.Path, PEERS_SIGNAL_PATH) - - log.Printf("room: %s\n", roomParam) - - _, okay := roomPeerConnections[roomParam] - - if !okay { - - log.Printf("no such room: %s\n", roomParam) - - return - } - - c := &ThreadSafeWriter{unsafeConn, sync.Mutex{}} - - // When this frame returns close the Websocket - defer c.Close() //nolint - - thisUser, err := roomJoinAuth(c) - - if err != nil { - - log.Print("auth:", err) - - return - } - log.Printf("auth success: user: %s, room: %s\n", thisUser, roomParam) - - // Create new PeerConnection - peerConnection, err := api.NewPeerConnection(webrtc.Configuration{ - ICEServers: []webrtc.ICEServer{ - { - URLs: []string{TURN_SERVER_ADDR[0].Addr}, - Username: TURN_SERVER_ADDR[0].Id, - Credential: TURN_SERVER_ADDR[0].Pw, - }, - }, - }) - - if err != nil { - log.Print(err) - return - } - - log.Print("new peerconnection added") - - // When this frame returns close the PeerConnection - defer peerConnection.Close() //nolint - - // Accept one audio and one video track incoming - for _, typ := range []webrtc.RTPCodecType{webrtc.RTPCodecTypeVideo, webrtc.RTPCodecTypeAudio} { - if _, err := peerConnection.AddTransceiverFromKind(typ, webrtc.RTPTransceiverInit{ - Direction: webrtc.RTPTransceiverDirectionRecvonly, - }); err != nil { - log.Print(err) - return - } - } - - // Add our new PeerConnection to global list - ListLock.Lock() - roomPeerConnections[roomParam] = append(roomPeerConnections[roomParam], peerConnectionState{peerConnection, c}) - ListLock.Unlock() - - // Trickle ICE. Emit server candidate to client - peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) { - - log.Printf("got ice candidate\n") - - if i == nil { - return - } - - candidateStringEnc := Encode(i.ToJSON()) - - if writeErr := c.WriteJSON(&SIGNAL_INFO{ - Command: "candidate", - Data: candidateStringEnc, - }); writeErr != nil { - log.Println(writeErr) - } - - log.Printf("sent ice candidate\n") - }) - - // If PeerConnection is closed remove it from global list - peerConnection.OnConnectionStateChange(func(p webrtc.PeerConnectionState) { - switch p { - case webrtc.PeerConnectionStateFailed: - log.Printf("on connection state change: %s \n", p.String()) - if err := peerConnection.Close(); err != nil { - log.Print(err) - } - case webrtc.PeerConnectionStateClosed: - log.Printf("on connection state change: %s \n", p.String()) - signalPeerConnections(roomParam) - default: - log.Printf("on connection state change: %s \n", p.String()) - } - }) - - peerConnection.OnTrack(func(t *webrtc.TrackRemote, _ *webrtc.RTPReceiver) { - // Create a track to fan out our incoming video to all peers - trackLocal := addTrack(roomParam, t) - defer removeTrack(roomParam, trackLocal) - - buf := make([]byte, 1500) - for { - i, _, err := t.Read(buf) - if err != nil { - return - } - - if _, err = trackLocal.Write(buf[:i]); err != nil { - return - } - } - }) - - // Signal for the new PeerConnection - - signalPeerConnections(roomParam) - - message := &SIGNAL_INFO{} - for { - - _, raw, err := c.ReadMessage() - if err != nil { - log.Println(err) - return - } else if err := json.Unmarshal(raw, &message); err != nil { - log.Println(err) - return - } - - log.Printf("got message: %s\n", message.Command) - - switch message.Command { - case "candidate": - - log.Printf("got client ice candidate") - - candidate := webrtc.ICECandidateInit{} - - Decode(message.Data, &candidate) - - /* - if err := json.Unmarshal([]byte(message.Data), &candidate); err != nil { - log.Println(err) - return - } - - */ - if err := peerConnection.AddICECandidate(candidate); err != nil { - log.Println(err) - return - } - - log.Printf("added client ice candidiate") - - case "answer": - answer := webrtc.SessionDescription{} - - Decode(message.Data, &answer) - - /* - if err := json.Unmarshal([]byte(message.Data), &answer); err != nil { - log.Println(err) - return - } - */ - - if err := peerConnection.SetRemoteDescription(answer); err != nil { - log.Println(err) - return - } - - case "chat": - - cm := ChatMessage{ - Message: html.EscapeString(message.Data), - User: thisUser, - } - - jb, err := json.Marshal(cm) - - if err != nil { - - log.Println(err) - - return - } - - message.Data = string(jb) - - broadcastPeerConnections(roomParam, message) - - } - } -} - -func dispatchKeyFrame(k string) { - ListLock.Lock() - defer ListLock.Unlock() - - for i := range roomPeerConnections[k] { - for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() { - if receiver.Track() == nil { - continue - } - - _ = roomPeerConnections[k][i].peerConnection.WriteRTCP([]rtcp.Packet{ - &rtcp.PictureLossIndication{ - MediaSSRC: uint32(receiver.Track().SSRC()), - }, - }) - } - } - -} - -func broadcastPeerConnections(roomName string, message *SIGNAL_INFO) { - - for i := range roomPeerConnections[roomName] { - - roomPeerConnections[roomName][i].websocket.WriteJSON(*message) - - } - -} - -func signalPeerConnections(k string) { - ListLock.Lock() - - defer func() { - ListLock.Unlock() - dispatchKeyFrame(k) - }() - - for syncAttempt := 0; ; syncAttempt++ { - if syncAttempt == PEER_SIGNAL_ATTEMPT_SYNC { - // We might be blocking a RemoveTrack or AddTrack - go func() { - time.Sleep(time.Second * 3) - signalPeerConnections(k) - }() - return - } - - if !attemptSync(k) { - - break - } - } -} - -func attemptSync(k string) bool { - - for i := range roomPeerConnections[k] { - if roomPeerConnections[k][i].peerConnection.ConnectionState() == webrtc.PeerConnectionStateClosed { - roomPeerConnections[k] = append(roomPeerConnections[k][:i], roomPeerConnections[k][i+1:]...) - return true // We modified the slice, start from the beginning - } - - // map of sender we already are sending, so we don't double send - existingSenders := map[string]bool{} - - for _, sender := range roomPeerConnections[k][i].peerConnection.GetSenders() { - if sender.Track() == nil { - continue - } - - existingSenders[sender.Track().ID()] = true - - // If we have a RTPSender that doesn't map to a existing track remove and signal - if _, ok := roomTrackLocals[k][sender.Track().ID()]; !ok { - - if err := roomPeerConnections[k][i].peerConnection.RemoveTrack(sender); err != nil { - return true - } - } - } - - // Don't receive videos we are sending, make sure we don't have loopback - - for _, receiver := range roomPeerConnections[k][i].peerConnection.GetReceivers() { - if receiver.Track() == nil { - continue - } - - existingSenders[receiver.Track().ID()] = true - - } - - // Add all track we aren't sending yet to the PeerConnection - for trackID, t := range roomTrackLocals[k] { - - if _, ok := existingSenders[trackID]; !ok { - - if _, err := roomPeerConnections[k][i].peerConnection.AddTrack(t); err != nil { - return true - } - } - } - - offer, err := roomPeerConnections[k][i].peerConnection.CreateOffer(nil) - if err != nil { - return true - } - - if err = roomPeerConnections[k][i].peerConnection.SetLocalDescription(offer); err != nil { - return true - } - - offerStringEnc := Encode(offer) - - if err = roomPeerConnections[k][i].websocket.WriteJSON(&SIGNAL_INFO{ - Command: "offer", - Data: offerStringEnc, - }); err != nil { - return true - } - } - - return false -} diff --git a/0xgo/webrtc/webrtc/rtmp.go b/0xgo/webrtc/webrtc/rtmp.go deleted file mode 100644 index 0261fa7..0000000 --- a/0xgo/webrtc/webrtc/rtmp.go +++ /dev/null @@ -1,313 +0,0 @@ -package webrtc - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "fmt" - "io" - "log" - "net" - "time" - - "github.com/gin-gonic/gin" - "github.com/pion/webrtc/v4" - "github.com/pion/webrtc/v4/pkg/media" - "github.com/pkg/errors" - - flvtag "github.com/yutopp/go-flv/tag" - "github.com/yutopp/go-rtmp" - rtmpmsg "github.com/yutopp/go-rtmp/message" -) - -var RTP_RECEIVE_ADDR string = "0.0.0.0" - -var RTP_RECEIVE_PORT string - -var RTP_CONSUMERS = make(map[string]RTMPWebRTCPeer) - -const RTP_HEADER_LENGTH_FIELD = 4 - -var TEST_KEY string = "foobar" - -var UDP_BUFFER_BYTE_SIZE int = 65536 - -var RECV_STARTED int = 0 - -type RTMPHandler struct { - rtmp.DefaultHandler - PublisherKey string -} - -type RTMPWebRTCPeer struct { - peerConnection *webrtc.PeerConnection - videoTrack *webrtc.TrackLocalStaticSample - audioTrack *webrtc.TrackLocalStaticSample -} - -type CCTVStruct struct { - Location string `json:"location"` - StreamingKey string `json:"streaming_key"` - Description string `json:"description"` -} - -func RtmpOpen(c *gin.Context) { - - log.Println("incoming rtmp open request") - - peerConnection, err := api.NewPeerConnection(webrtc.Configuration{ - ICEServers: []webrtc.ICEServer{ - { - URLs: []string{TURN_SERVER_ADDR[0].Addr}, - Username: TURN_SERVER_ADDR[0].Id, - Credential: TURN_SERVER_ADDR[0].Pw, - }, - }, - }) - if err != nil { - panic(err) - } - /* - peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { - fmt.Printf("Connection State has changed %s \n", connectionState.String()) - - if connectionState == webrtc.ICEConnectionStateFailed { - if closeErr := peerConnection.Close(); closeErr != nil { - panic(closeErr) - } - } - }) - */ - videoTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion") - if err != nil { - panic(err) - } - if _, err = peerConnection.AddTrack(videoTrack); err != nil { - panic(err) - } - - audioTrack, err := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypePCMA}, "audio", "pion") - if err != nil { - panic(err) - } - if _, err = peerConnection.AddTrack(audioTrack); err != nil { - panic(err) - } - - var req CLIENT_REQ - - var offer webrtc.SessionDescription - - if err := c.BindJSON(&req); err != nil { - - panic(err) - - } - - err = json.Unmarshal([]byte(req.Data), &offer) - - if err != nil { - - panic(err) - } - - if err := peerConnection.SetRemoteDescription(offer); err != nil { - panic(err) - } - - gatherComplete := webrtc.GatheringCompletePromise(peerConnection) - answer, err := peerConnection.CreateAnswer(nil) - if err != nil { - panic(err) - } else if err = peerConnection.SetLocalDescription(answer); err != nil { - panic(err) - } - <-gatherComplete - - streamingKey, err := GetRandomHex(32) - - if err != nil { - - panic(err) - } - - log.Printf("rtmp key: %s\n", streamingKey) - - RTP_CONSUMERS[streamingKey] = RTMPWebRTCPeer{ - peerConnection: peerConnection, - videoTrack: videoTrack, - audioTrack: audioTrack, - } - - desc_b, err := json.Marshal(peerConnection.LocalDescription()) - - if err != nil { - panic(err) - } - - var resp SERVER_RE - - var cs CCTVStruct - - cs.Location = "rtmp://" + URL + ":" + string(RTP_RECEIVE_PORT) + "/publish/" + streamingKey - - cs.StreamingKey = streamingKey - - cs.Description = string(desc_b) - - cs_b, err := json.Marshal(cs) - - if err != nil { - - panic(err) - - } - - resp.Status = "success" - resp.Reply = string(cs_b) - - c.JSON(200, resp) - -} - -func InitRTMPServer() { - log.Println("starting RTMP Server") - - tcpAddr, err := net.ResolveTCPAddr("tcp", RTP_RECEIVE_ADDR+":"+RTP_RECEIVE_PORT) - if err != nil { - log.Panicf("Failed: %+v", err) - } - - listener, err := net.ListenTCP("tcp", tcpAddr) - if err != nil { - log.Panicf("Failed: %+v", err) - } - - srv := rtmp.NewServer(&rtmp.ServerConfig{ - OnConnect: func(conn net.Conn) (io.ReadWriteCloser, *rtmp.ConnConfig) { - return conn, &rtmp.ConnConfig{ - Handler: &RTMPHandler{}, - - ControlState: rtmp.StreamControlStateConfig{ - DefaultBandwidthWindowSize: 6 * 1024 * 1024 / 8, - }, - } - }, - }) - if err := srv.Serve(listener); err != nil { - log.Panicf("Failed: %+v", err) - } -} - -func (h *RTMPHandler) OnServe(conn *rtmp.Conn) { -} - -func (h *RTMPHandler) OnConnect(timestamp uint32, cmd *rtmpmsg.NetConnectionConnect) error { - log.Printf("OnConnect: %#v", cmd) - return nil -} - -func (h *RTMPHandler) OnCreateStream(timestamp uint32, cmd *rtmpmsg.NetConnectionCreateStream) error { - log.Printf("OnCreateStream: %#v", cmd) - return nil -} - -func (h *RTMPHandler) OnPublish(ctx *rtmp.StreamContext, timestamp uint32, cmd *rtmpmsg.NetStreamPublish) error { - log.Printf("OnPublish: %#v", cmd) - - if cmd.PublishingName == "" { - - log.Printf("publishing name is empty") - - return errors.New("publishing name is empty") - } - - _, okay := RTP_CONSUMERS[cmd.PublishingName] - - if !okay { - - log.Printf("publishing name doesn't exist") - - return errors.New("publishing name doesn't exist") - - } - - h.PublisherKey = cmd.PublishingName - - return nil -} - -func (h *RTMPHandler) OnAudio(timestamp uint32, payload io.Reader) error { - var audio flvtag.AudioData - - consumer, okay := RTP_CONSUMERS[h.PublisherKey] - - if !okay { - - return fmt.Errorf("invalid publisher") - - } - - consumerAudioTrack := consumer.audioTrack - - if err := flvtag.DecodeAudioData(payload, &audio); err != nil { - return err - } - - data := new(bytes.Buffer) - if _, err := io.Copy(data, audio.Data); err != nil { - return err - } - - return consumerAudioTrack.WriteSample(media.Sample{ - Data: data.Bytes(), - Duration: 128 * time.Millisecond, - }) -} - -func (h *RTMPHandler) OnVideo(timestamp uint32, payload io.Reader) error { - var video flvtag.VideoData - - consumer, okay := RTP_CONSUMERS[h.PublisherKey] - - if !okay { - - return fmt.Errorf("invalid publisher") - - } - - consumerVideoTrack := consumer.videoTrack - - if err := flvtag.DecodeVideoData(payload, &video); err != nil { - return err - } - - data := new(bytes.Buffer) - if _, err := io.Copy(data, video.Data); err != nil { - return err - } - - outBuf := []byte{} - videoBuffer := data.Bytes() - for offset := 0; offset < len(videoBuffer); { - bufferLength := int(binary.BigEndian.Uint32(videoBuffer[offset : offset+RTP_HEADER_LENGTH_FIELD])) - if offset+bufferLength >= len(videoBuffer) { - break - } - - offset += RTP_HEADER_LENGTH_FIELD - outBuf = append(outBuf, []byte{0x00, 0x00, 0x00, 0x01}...) - outBuf = append(outBuf, videoBuffer[offset:offset+bufferLength]...) - - offset += int(bufferLength) - } - - return consumerVideoTrack.WriteSample(media.Sample{ - Data: outBuf, - Duration: time.Second / 30, - }) -} - -func (h *RTMPHandler) OnClose() { - log.Printf("OnClose") -} diff --git a/0xgo/webrtc/webrtc/stream.go b/0xgo/webrtc/webrtc/stream.go deleted file mode 100644 index acf5c33..0000000 --- a/0xgo/webrtc/webrtc/stream.go +++ /dev/null @@ -1,129 +0,0 @@ -package webrtc - -import ( - "log" - "strings" - "time" - - "github.com/gorilla/websocket" - "github.com/pion/ice/v3" - "github.com/pion/webrtc/v4" -) - -var DEBUG bool = false - -var RTCP_PLI_INTERVAL time.Duration - -var UDP_MUX_PORT int - -var UDP_EPHEMERAL_PORT_MIN int - -var UDP_EPHEMERAL_PORT_MAX int - -var TIMEOUT_SEC int = 30 - -var TURN_SERVER_ADDR []struct { - Addr string `json:"addr"` - Id string `json:"id"` - Pw string `json:"pw"` -} - -var api *webrtc.API - -type SIGNAL_INFO struct { - Command string `json:"command"` - Status string `json:"status"` - Data string `json:"data"` -} - -var UPGRADER = websocket.Upgrader{} - -var roomPeerConnections = make(map[string][]peerConnectionState) - -var roomTrackLocals = make(map[string]map[string]*webrtc.TrackLocalStaticRTP) - -type peerConnectionState struct { - peerConnection *webrtc.PeerConnection - websocket *ThreadSafeWriter -} - -func InitWebRTCApi() { - - settingEngine := webrtc.SettingEngine{} - - var filterFunc func(string) bool = func(ifname string) bool { - - if strings.HasPrefix(ifname, "br-") { - - return false - } else if strings.HasPrefix(ifname, "vir") { - - return false - } else if strings.HasPrefix(ifname, "docker") { - - return false - } - - return true - - } - - ifaceFilter := ice.UDPMuxFromPortWithInterfaceFilter(filterFunc) - mux, err := ice.NewMultiUDPMuxFromPort(UDP_MUX_PORT, ifaceFilter) - - log.Println("creating webrtc api") - - settingEngine.SetICEUDPMux(mux) - if err != nil { - panic(err) - } - - log.Println("created webrtc api") - - settingEngine.SetEphemeralUDPPortRange(uint16(UDP_EPHEMERAL_PORT_MIN), uint16(UDP_EPHEMERAL_PORT_MAX)) - - api = webrtc.NewAPI(webrtc.WithSettingEngine(settingEngine)) - -} - -func SignalDispatcher() { - - for range time.NewTicker(time.Second * RTCP_PLI_INTERVAL).C { - - for k, _ := range roomPeerConnections { - - dispatchKeyFrame(k) - } - - } -} - -func addTrack(k string, t *webrtc.TrackRemote) *webrtc.TrackLocalStaticRTP { - ListLock.Lock() - defer func() { - ListLock.Unlock() - signalPeerConnections(k) - }() - - trackLocal, err := webrtc.NewTrackLocalStaticRTP(t.Codec().RTPCodecCapability, t.ID(), t.StreamID()) - if err != nil { - panic(err) - } - - if roomTrackLocals[k] == nil { - roomTrackLocals[k] = make(map[string]*webrtc.TrackLocalStaticRTP) - } - - roomTrackLocals[k][t.ID()] = trackLocal - return trackLocal -} - -func removeTrack(k string, t *webrtc.TrackLocalStaticRTP) { - ListLock.Lock() - defer func() { - ListLock.Unlock() - signalPeerConnections(k) - }() - - delete(roomTrackLocals, k) -} diff --git a/0xgo/webrtc/webrtc/utils.go b/0xgo/webrtc/webrtc/utils.go deleted file mode 100644 index 8f469a5..0000000 --- a/0xgo/webrtc/webrtc/utils.go +++ /dev/null @@ -1,87 +0,0 @@ -package webrtc - -import ( - "bytes" - "compress/gzip" - "crypto/rand" - "encoding/base64" - "encoding/hex" - "encoding/json" - "io" -) - -var USE_COMPRESS bool = false - -func GetRandomHex(n int) (string, error) { - bytes := make([]byte, n) - if _, err := rand.Read(bytes); err != nil { - return "", err - } - return hex.EncodeToString(bytes), nil -} - -func Encode(obj interface{}) string { - b, err := json.Marshal(obj) - if err != nil { - panic(err) - } - - if USE_COMPRESS { - b = Zip(b) - } - - return base64.StdEncoding.EncodeToString(b) -} - -// Decode decodes the input from base64 -// It can optionally unzip the input after decoding -func Decode(in string, obj interface{}) { - b, err := base64.StdEncoding.DecodeString(in) - if err != nil { - panic(err) - } - - if USE_COMPRESS { - b = Unzip(b) - } - - err = json.Unmarshal(b, obj) - if err != nil { - panic(err) - } -} - -func Zip(in []byte) []byte { - var b bytes.Buffer - gz := gzip.NewWriter(&b) - _, err := gz.Write(in) - if err != nil { - panic(err) - } - err = gz.Flush() - if err != nil { - panic(err) - } - err = gz.Close() - if err != nil { - panic(err) - } - return b.Bytes() -} - -func Unzip(in []byte) []byte { - var b bytes.Buffer - _, err := b.Write(in) - if err != nil { - panic(err) - } - r, err := gzip.NewReader(&b) - if err != nil { - panic(err) - } - res, err := io.ReadAll(r) - if err != nil { - panic(err) - } - return res -} diff --git a/0xgo/websocket/Makefile b/0xgo/websocket/Makefile deleted file mode 100644 index 804008c..0000000 --- a/0xgo/websocket/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: - - go build -o client/client.out ./client - - go build -o server/server.out ./server - - - - diff --git a/0xgo/websocket/certgen.sh b/0xgo/websocket/certgen.sh deleted file mode 100755 index bdb69b5..0000000 --- a/0xgo/websocket/certgen.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -rm -r ./client/certs/* - -rm -r ./server/certs/* - - -mkdir -p ./client/certs - -mkdir -p ./server/certs - -echo "root generating...." - -openssl genrsa -out ./client/certs/ca_priv.pem 4096 - -openssl rsa -in ./client/certs/ca_priv.pem -outform PEM -pubout -out ./client/certs/ca_pub.pem - -openssl req -x509 -new -key ./client/certs/ca_priv.pem -days 3650 -out ./client/certs/ca.pem -subj "/CN=root" - -echo "server key pair, csr generating...." - -openssl genrsa -out ./server/certs/server.key 4096 - -openssl rsa -in ./server/certs/server.key -outform PEM -pubout -out ./server/certs/server.pub - -openssl req -key ./server/certs/server.key -new -sha256 -out ./server/certs/server.csr -subj "/CN=localhost" - -echo "signing requests for server...." - -openssl x509 -req -extfile <(printf "subjectAltName = DNS:localhost") -days 365 -in ./server/certs/server.csr -CA ./client/certs/ca.pem -CAkey ./client/certs/ca_priv.pem -CAcreateserial -sha256 -out ./server/certs/server.pem - - -echo "done!" \ No newline at end of file diff --git a/0xgo/websocket/client/certs/ca.pem b/0xgo/websocket/client/certs/ca.pem deleted file mode 100644 index 0f067d6..0000000 --- a/0xgo/websocket/client/certs/ca.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIE/zCCAuegAwIBAgIUFAZ/NqdKQOVulUfJJk7XN13AzzYwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDRaFw0zNDEwMzEwODE3 -MDRaMA8xDTALBgNVBAMMBHJvb3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCVq7U00wHqr7bic/De8n6w/QWKZ8wPSVK0QXokpWGr3FVgWU4D6cDQGEZR -A2qABWKG492a4yBM90NYKvVU6Ilfm0TxoBPqYzfdH0Txt15N/SnnV0DhGkJvDeqU -pfvnZ2+5/iMpLn1ptU03h5Fz4iDTRzKV+xTkWF3vEMOasMfevseSaIJJNaMf97rv -GsqBpRKF6eNqhewtz+gPf4J+2Y0019XCkEoWgIyFs2W3OZOmzNJI1XXXYZU3dsCS -YDK0V0KpNYdlHtPCHQ1gtrbYiIhP8kIYhgbhyGXUSpQoDghUotE0SHK15MBI+oBu -OkQB3+uGbtXw+HW6ReyI6Ks7ICrsQW+eiK/V9pOP6TaNnajRSg7sOBfdJCWOoBNv -6OdfYKgMORjfu8FpPaEca9L+38e0texXCNZt9lWyfHmuRFHF0MnbqDS409AMzhUl -upXbaFpdz6g7F4twAyFdB3pjSsO28toTqKIamXhl1+8D7byC9/sATEEm9/tO44GC -+01Z63R3mazn+9fAjReMEQMw5HtXYHho24zR433VpbTXJ14YMWeJa1VZAw5CRVKi -g5vxjUILIMu5DAi8KZdBjqKNgzT6v/KfjPMPenrHZYMqfXrttkmsU3kAUurOtVE8 -ppEN8fLY3LDONqwrG5hHZWTzeggFHtXSbK0dlhYZsBsPuCltSwIDAQABo1MwUTAd -BgNVHQ4EFgQUWryFapRsKtm4PFy0xy7IciUzQGMwHwYDVR0jBBgwFoAUWryFapRs -Ktm4PFy0xy7IciUzQGMwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEAU+dGb3c4G9XDPui89cvrGqJDSytoy6VENvEiF4Vl1KLwbq/nhaDXD5Gh1irr -YmhZJwmV/6wx8hOA9A2ZipETucIGrJ/Zw82WBvJ76T7sXfDd16Pg1XUQVzl28W4/ -8T+BcVNVjSYIh6idQyoxCZ+AC+/ivVaOVwI4vJJh8J1Nlz2EbEw+A5qhkUlfwKOl -beC9WTY2N3Csu/COn8qacPTjrsnCYpN7YkZ+iav0jZit7Mb73XD8FTI86aUt99VU -/jLQ7oHQasX/WcBTTm7e8dsBM/C6PUVj4CbXSkGlXrJeqr09cBrR0Pq3vOVOBXII -9xlczTrbjZlG4/8KULMS4jGE0Ruqer8ULjr/g+b2RRTM3FR0ixuwyiwGN1SjAjNX -2p3FfP3IIo4VzYavfTvxKrOS4FDX+AFEruXLlt6Ufygg8woXyRPGsmRNtTNGElGl -0qSP73zwZX6Uix88ohCMrYPYMb/tk1Buiw8cGiNPZeSP/3Q4sg3yC7yQm8aPIS+U -J0Wwgm+bFMpsAO5B9DDeFRx2P2ygULSl1gMZnfHblhJSu563odrTVeOqeyF1kjSp -evXyeTXX+SMKV2UUl2z15bk+T+8f6TMt2bYyvMhF1uK8kxWIfWMlg+2c4vAJRJhM -gQ4YdEf2xD90PoEkoI6JNZFzEbViprDo68qYFnXHwK4haNE= ------END CERTIFICATE----- diff --git a/0xgo/websocket/client/certs/ca_priv.pem b/0xgo/websocket/client/certs/ca_priv.pem deleted file mode 100644 index bf7e8e4..0000000 --- a/0xgo/websocket/client/certs/ca_priv.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -g9mNZa3rFeivom6DV1fJp7UHkKlA4g== ------END PRIVATE KEY----- diff --git a/0xgo/websocket/client/certs/ca_pub.pem b/0xgo/websocket/client/certs/ca_pub.pem deleted file mode 100644 index 70f3dcd..0000000 --- a/0xgo/websocket/client/certs/ca_pub.pem +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlau1NNMB6q+24nPw3vJ+ -sP0FimfMD0lStEF6JKVhq9xVYFlOA+nA0BhGUQNqgAVihuPdmuMgTPdDWCr1VOiJ -X5tE8aAT6mM33R9E8bdeTf0p51dA4RpCbw3qlKX752dvuf4jKS59abVNN4eRc+Ig -00cylfsU5Fhd7xDDmrDH3r7HkmiCSTWjH/e67xrKgaUShenjaoXsLc/oD3+CftmN -NNfVwpBKFoCMhbNltzmTpszSSNV112GVN3bAkmAytFdCqTWHZR7Twh0NYLa22IiI -T/JCGIYG4chl1EqUKA4IVKLRNEhyteTASPqAbjpEAd/rhm7V8Ph1ukXsiOirOyAq -7EFvnoiv1faTj+k2jZ2o0UoO7DgX3SQljqATb+jnX2CoDDkY37vBaT2hHGvS/t/H -tLXsVwjWbfZVsnx5rkRRxdDJ26g0uNPQDM4VJbqV22haXc+oOxeLcAMhXQd6Y0rD -tvLaE6iiGpl4ZdfvA+28gvf7AExBJvf7TuOBgvtNWet0d5ms5/vXwI0XjBEDMOR7 -V2B4aNuM0eN91aW01ydeGDFniWtVWQMOQkVSooOb8Y1CCyDLuQwIvCmXQY6ijYM0 -+r/yn4zzD3p6x2WDKn167bZJrFN5AFLqzrVRPKaRDfHy2NywzjasKxuYR2Vk83oI -BR7V0mytHZYWGbAbD7gpbUsCAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/websocket/client/main.go b/0xgo/websocket/client/main.go deleted file mode 100644 index 6d4496f..0000000 --- a/0xgo/websocket/client/main.go +++ /dev/null @@ -1,79 +0,0 @@ -package main - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "os" - - "github.com/gorilla/websocket" -) - -type CommJSON struct { - Data string `json:"data"` -} - -func run() error { - - certpool := x509.NewCertPool() - - file_ca, err := os.ReadFile("certs/ca.pem") - - if err != nil { - - return fmt.Errorf("failed to connect: read ca: %s", err.Error()) - } - - okay := certpool.AppendCertsFromPEM(file_ca) - - if !okay { - - return fmt.Errorf("failed to connect: add ca") - } - - websocket.DefaultDialer.TLSClientConfig = &tls.Config{ - RootCAs: certpool, - } - - c, _, err := websocket.DefaultDialer.Dial("wss://localhost:8888/hello", nil) - - if err != nil { - - return fmt.Errorf("failed to connect: dial: %s", err.Error()) - } - - req := CommJSON{ - Data: "hi", - } - - resp := CommJSON{} - - err = c.WriteJSON(req) - - if err != nil { - - return fmt.Errorf("failed to write: %s", err.Error()) - - } - - err = c.ReadJSON(&resp) - - if err != nil { - - return fmt.Errorf("failed to read: %s", err.Error()) - } - - log.Printf("server data: %s\n", resp.Data) - - return nil -} - -func main() { - - if err := run(); err != nil { - - log.Fatal(err.Error()) - } - -} diff --git a/0xgo/websocket/server/certs/server.csr b/0xgo/websocket/server/certs/server.csr deleted file mode 100644 index 1c45ad2..0000000 --- a/0xgo/websocket/server/certs/server.csr +++ /dev/null @@ -1,26 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIEWTCCAkECAQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxrL5Wu2nk7bqI+mIfEL+D0 -6RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQfZm41DHQjLVEfvR/zd+i -0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rkznVQhiA4m4mz3s4e+Qbd -LJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQgiVWMsx+ZAaPARMBdu+I -bLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X82hrxW11Qme3B/4I9o7re -RF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/lih5wULOh/g4cVrKVOrG -JJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJOrUd4c1wUDaiu9ZXpGUdl -Den7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKeA3dmH1AeG+jfT/BIBAOn -14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/vKhBIKkuiUl4RcHD5MEt -BTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPURujtYsN5N5EUvrnQCAV9 -Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGUS7jRieTuBT+7HPqt1H6V -Gh8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQANCCvGhAnI6lmBjKV0iE7G+rKV -KHB7nG4p4TRQcmy6o1/wVyGMBRHvowtvvcmX0wsfPX92g7exJr7sD+OvesDcG6Zi -/Ve/W3B3HKCiCXAQdfjHlunleqs8UtXlDg595OsnRdXM/lIG846oRvDtNEXSbga4 -vNyEcvsz96mzpekO+PYM9/txvMm4EA8XEdOw/Vfrfinw2Z2JHlbt/iyylbK9tDbj -SGV5iK/8alSdUhGe5HFJKy2mv1VpOiTtpAF9jNp0ZZ2Dlz6PKdhVndZOiYHexMRT -PTplq1khuokySRUxlXwhWva2rRFMWHtG/K9PLansvN1vT0i+fkp46kpyHEkzhljS -zF7Epb+5iffjwqyLLfU3w6yVnuan4KLUmllS4WNoHirBPNSMgvgJ+1YN4zsyI0UR -DENWQCMkxrQs8YiraavY5ATP2gQM/GbODa4ExX0ZT83IoffeqlXdS0Yjh84AeZ9m -yv32VMLTm+gOa2CjOSDTvUSdcFvTMU2bmoxSnJnj+8r/dnL+uB6mciAO54jc3B9I -0LBO0YYFYvIfmOU+aYYHriG9pf3B4GAwF6sbOQxhYGK2iaaBhf2y2RbOlENxcOza -y+NHUc/H0gLJd8RJ+0WxedqxuCvz2cZ2myEl3+wSGyrR4XEDkJohIwH9j5ogf8a2 -NYzZl+hZcN1MeEe1mQ== ------END CERTIFICATE REQUEST----- diff --git a/0xgo/websocket/server/certs/server.key b/0xgo/websocket/server/certs/server.key deleted file mode 100644 index 22f4510..0000000 --- a/0xgo/websocket/server/certs/server.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -SU4uK7xkjfLHk93yJH5gTzmq8Ol2 ------END PRIVATE KEY----- diff --git a/0xgo/websocket/server/certs/server.pem b/0xgo/websocket/server/certs/server.pem deleted file mode 100644 index af41410..0000000 --- a/0xgo/websocket/server/certs/server.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFCTCCAvGgAwIBAgIUPv8CXUm2Dfb1zIxZic8wGRFtg9AwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yNDExMDIwODE3MDVaFw0yNTExMDIwODE3 -MDVaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALenm0HNZtsaHVvu2LEsay+Vrtp5O26iPpiHxC/g9OkVHRDm64QU -2bmrcHgQjPjTdiOhqTbnPaCCXI5LGwJg0H2ZuNQx0Iy1RH70f83fotKMeWmYSusE -ahOSyiqayqIevacvTNLFrASFIkkL4A+q5M51UIYgOJuJs97OHvkG3SyU4WPMRmxe -DS5pXKVCvQFYfbYTD7hmFRrp/4oVTd8H0IIlVjLMfmQGjwETAXbviGy0C0G64maj -Gc+hA0twQSUW13nY8lrc3PJ7rOFV33vl/Noa8VtdUJntwf+CPaO63kRd4vgy752W -ZKCuiBYHFdEh4Pu5QkkKzQlUWnPDf6qEf5YoecFCzof4OHFaylTqxiSWva+bumLa -chjmOZuPSePMQqW6tVpm3NFVvWND3GZCTq1HeHNcFA2orvWV6RlHZQ3p+xw5dYe0 -lCsORiW8gJPADUfZMcEtxq62ZKS+ohgCngN3Zh9QHhvo30/wSAQDp9eGysGSFaxy -kJCj/IXGXij35Se6hYe+Wcn0jJ7miLUBv7yoQSCpLolJeEXBw+TBLQUx9jss21km -78cy4Lw3X3cGeFVVUmlvYl5wG9Eiwo1z1Ebo7WLDeTeRFL650AgFfWM9sBW6AUIp -ly4XmwY7GUvuXUAoZ3DfpGhkXCLjyriBlEu40Ynk7gU/uxz6rdR+lRofAgMBAAGj -WDBWMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAdBgNVHQ4EFgQU1PBtM/5U3mtg85f5 -tgBP1JQ0y+0wHwYDVR0jBBgwFoAUWryFapRsKtm4PFy0xy7IciUzQGMwDQYJKoZI -hvcNAQELBQADggIBAF1jwJ/Om0GcOnKGSJYaqxJydYyqcDhEgxODMGgNoDd2yNN8 -74E29G41cwZe3eATw2PstXXicFLZTz1Nhu457BqvGgxwz8lsKXreDNLczuTr6KTh -+S/9CCONQ0bkLu3pJLdkfEEWxYNYyI9Nz35WJt24ESSyKBTxka7y3NBgVwGrN4Ys -Tk8PtvgCVBRS1SD08WKoVhaD03M2wWJu2zvwcVqfYZxqgWxO+c5ElE/IF92WI3Gn -jP8dL2qbsN7dGHi0JV9uzukc4PTVNnwdEodCDgufhcrtvTpR4KsGktHqzXXiQsGy -hVMpx7yO+BCsjLCfCkbZXaXazp2PXLhIrAwhg3HFDbyESKJiAXQUGSlaNXD06UeT -zZfHDl/8hswnFdJLhS2eAahAh7n0FRLGHHx0BIk/FLktzzAZouQlSw4HXm/710GZ -8Z2agRv5g9e6bg7afks9grj4IhcZyCUNOQeZD/6+KBd97TqnfaYgFQzd192m+7eb -WBbuLnx5INHzBjmbmLAUP4OZ+t5krOeWQMxUQOJUHtts0cs7K3EI2PB4pf+KRDy/ -Ij9KkYtOJ7WEmSy1JlR7vQEuAgZ80PLjHsjndJO+hOUdaqdkwgKHkkHdh9NQ8TQx -AFyG5CSFHgGPPgJV2yaI/mIbzMxvuTnazhFyFjMXqWGyGxluchpmJWRfKxt6 ------END CERTIFICATE----- diff --git a/0xgo/websocket/server/certs/server.pub b/0xgo/websocket/server/certs/server.pub deleted file mode 100644 index 0eec661..0000000 --- a/0xgo/websocket/server/certs/server.pub +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt6ebQc1m2xodW+7YsSxr -L5Wu2nk7bqI+mIfEL+D06RUdEObrhBTZuatweBCM+NN2I6GpNuc9oIJcjksbAmDQ -fZm41DHQjLVEfvR/zd+i0ox5aZhK6wRqE5LKKprKoh69py9M0sWsBIUiSQvgD6rk -znVQhiA4m4mz3s4e+QbdLJThY8xGbF4NLmlcpUK9AVh9thMPuGYVGun/ihVN3wfQ -giVWMsx+ZAaPARMBdu+IbLQLQbriZqMZz6EDS3BBJRbXedjyWtzc8nus4VXfe+X8 -2hrxW11Qme3B/4I9o7reRF3i+DLvnZZkoK6IFgcV0SHg+7lCSQrNCVRac8N/qoR/ -lih5wULOh/g4cVrKVOrGJJa9r5u6YtpyGOY5m49J48xCpbq1Wmbc0VW9Y0PcZkJO -rUd4c1wUDaiu9ZXpGUdlDen7HDl1h7SUKw5GJbyAk8ANR9kxwS3GrrZkpL6iGAKe -A3dmH1AeG+jfT/BIBAOn14bKwZIVrHKQkKP8hcZeKPflJ7qFh75ZyfSMnuaItQG/ -vKhBIKkuiUl4RcHD5MEtBTH2OyzbWSbvxzLgvDdfdwZ4VVVSaW9iXnAb0SLCjXPU -RujtYsN5N5EUvrnQCAV9Yz2wFboBQimXLhebBjsZS+5dQChncN+kaGRcIuPKuIGU -S7jRieTuBT+7HPqt1H6VGh8CAwEAAQ== ------END PUBLIC KEY----- diff --git a/0xgo/websocket/server/main.go b/0xgo/websocket/server/main.go deleted file mode 100644 index e3bbe1d..0000000 --- a/0xgo/websocket/server/main.go +++ /dev/null @@ -1,88 +0,0 @@ -package main - -import ( - "log" - "net/http" - "time" - - "github.com/gorilla/websocket" -) - -type CommJSON struct { - Data string `json:"data"` -} - -func clientHandler(w http.ResponseWriter, r *http.Request) { - - log.Println("client access") - - u := websocket.Upgrader{} - - u.CheckOrigin = func(r *http.Request) bool { return true } - - c, err := u.Upgrade(w, r, nil) - if err != nil { - log.Printf("client upgrade: %s\n", err.Error()) - return - } - - c.SetReadDeadline(time.Time{}) - - defer c.Close() - - log.Printf("client accepted") - - for { - - req := CommJSON{} - - resp := CommJSON{} - - err := c.ReadJSON(&req) - - if err != nil { - - log.Printf("client handle: client gone") - - _ = c.Close() - - return - - } - - log.Printf("client data: %s\n", req.Data) - - resp.Data = req.Data - - err = c.WriteJSON(resp) - - if err != nil { - - log.Printf("failed to write: %s", err.Error()) - - _ = c.Close() - - return - } - - } - -} - -func run() error { - - http.HandleFunc("/hello", clientHandler) - - log.Fatal(http.ListenAndServeTLS("0.0.0.0:8888", "certs/server.pem", "certs/server.key", nil)) - - return nil -} - -func main() { - - if err := run(); err != nil { - - log.Fatal(err.Error()) - } - -}