From c2e06419a510c0aaa57fba30699c3817747071b0 Mon Sep 17 00:00:00 2001 From: Rene Kuhn Date: Wed, 15 Jan 2025 21:46:06 +0100 Subject: [PATCH 1/2] update go version in docker file --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2c9c698..77ebae1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.18-alpine3.16 +FROM golang:1.23-alpine3.21 RUN apk add build-base RUN apk add libpcap-dev From 975bc2cc94e72d1c7acd012313c3de3cf4ad6960 Mon Sep 17 00:00:00 2001 From: Rene Kuhn Date: Wed, 15 Jan 2025 21:46:50 +0100 Subject: [PATCH 2/2] add sqlite based request logging --- .gitignore | 3 +- Makefile | 15 +++ database.go => database.go.old | 0 database/db.go | 31 ++++++ database/models.go | 20 ++++ database/request_log.sql.go | 46 +++++++++ go.mod | 13 +++ go.sum | 52 ++++++++++ main.go | 41 +++++--- router.go | 45 +++++++- routes.go | 120 +++++++++++----------- sql/queries/request_log.sql | 13 +++ sql/schema/20250115185908_request_log.sql | 19 ++++ sqlc.yaml | 8 ++ structs.go | 2 +- 15 files changed, 349 insertions(+), 79 deletions(-) create mode 100644 Makefile rename database.go => database.go.old (100%) create mode 100644 database/db.go create mode 100644 database/models.go create mode 100644 database/request_log.sql.go create mode 100644 sql/queries/request_log.sql create mode 100644 sql/schema/20250115185908_request_log.sql create mode 100644 sqlc.yaml diff --git a/.gitignore b/.gitignore index cec45b3..daa3c18 100755 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ TrackMe requests-db/ config.json .idea -adminKey \ No newline at end of file +adminKey +database.db diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a68fef8 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +.PHONY: migrate sqlc db-setup install-deps + +migrate: + goose -dir sql/schema sqlite3 database.db up + + +sqlc: + sqlc generate + +db-setup: migrate sqlc + + +install-deps: + go install github.com/pressly/goose/v3/cmd/goose@latest + go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest \ No newline at end of file diff --git a/database.go b/database.go.old similarity index 100% rename from database.go rename to database.go.old diff --git a/database/db.go b/database/db.go new file mode 100644 index 0000000..dacb52e --- /dev/null +++ b/database/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package database + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/database/models.go b/database/models.go new file mode 100644 index 0000000..cd5f600 --- /dev/null +++ b/database/models.go @@ -0,0 +1,20 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package database + +import ( + "database/sql" + "time" +) + +type RequestLog struct { + ID int64 + CreatedAt time.Time + UserAgent sql.NullString + Ja3 sql.NullString + H2 sql.NullString + PeetPrint sql.NullString + IpAddress sql.NullString +} diff --git a/database/request_log.sql.go b/database/request_log.sql.go new file mode 100644 index 0000000..e2af7aa --- /dev/null +++ b/database/request_log.sql.go @@ -0,0 +1,46 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: request_log.sql + +package database + +import ( + "context" + "database/sql" + "time" +) + +const insertRequestLog = `-- name: InsertRequestLog :exec +INSERT INTO request_log ( + created_at, + user_agent, + ja3, + h2, + peet_print, + ip_address +) VALUES ( + ?,?,?,?,?,? +) +` + +type InsertRequestLogParams struct { + CreatedAt time.Time + UserAgent sql.NullString + Ja3 sql.NullString + H2 sql.NullString + PeetPrint sql.NullString + IpAddress sql.NullString +} + +func (q *Queries) InsertRequestLog(ctx context.Context, arg InsertRequestLogParams) error { + _, err := q.db.ExecContext(ctx, insertRequestLog, + arg.CreatedAt, + arg.UserAgent, + arg.Ja3, + arg.H2, + arg.PeetPrint, + arg.IpAddress, + ) + return err +} diff --git a/go.mod b/go.mod index 1b04023..00351ce 100755 --- a/go.mod +++ b/go.mod @@ -7,14 +7,21 @@ require ( github.com/wwhtrbbtt/utls v0.0.0-20220918194152-45ee2a20799c go.mongodb.org/mongo-driver v1.17.1 golang.org/x/net v0.30.0 + modernc.org/sqlite v1.34.4 ) require ( github.com/andybalholm/brotli v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/klauspost/compress v1.17.11 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/montanaflynn/stats v0.7.1 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/refraction-networking/utls v1.1.2 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect @@ -23,4 +30,10 @@ require ( golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.26.0 // indirect golang.org/x/text v0.19.0 // indirect + modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect + modernc.org/libc v1.55.3 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index 08c0dcf..ae2389f 100755 --- a/go.sum +++ b/go.sum @@ -1,17 +1,37 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +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/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +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/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +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/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +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/refraction-networking/utls v1.1.2 h1:a7GQauRt72VG+wtNm0lnrAaCGlyX47gEi1++dSsDBpw= github.com/refraction-networking/utls v1.1.2/go.mod h1:+D89TUtA8+NKVFj1IXWr0p3tSdX1+SqUB7rL0QnGqyg= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/wwhtrbbtt/utls v0.0.0-20220918194152-45ee2a20799c h1:eDUKT2sHyNTpZTawrungpwOZgaEvcbTldzrmEmBO0pY= github.com/wwhtrbbtt/utls v0.0.0-20220918194152-45ee2a20799c/go.mod h1:cE/NJeUKssh/0XGO4KVBXZH0u7/BqRDqGs1Ij8hgy0w= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -20,6 +40,7 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= @@ -35,6 +56,8 @@ golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -53,6 +76,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -68,5 +92,33 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 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= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= +modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.34.4 h1:sjdARozcL5KJBvYQvLlZEmctRgW9xqIZc2ncN7PU0P8= +modernc.org/sqlite v1.34.4/go.mod h1:3QQFCG2SEMtc2nv+Wq4cQCH7Hjcg+p/RMlS1XK+zwbk= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/main.go b/main.go index 1bf185b..45dbe2a 100755 --- a/main.go +++ b/main.go @@ -2,8 +2,11 @@ package main import ( "context" - "fmt" + "database/sql" + + // "fmt" "log" + "main/database" "net" "net/http" "strconv" @@ -11,9 +14,9 @@ import ( "time" tls "github.com/wwhtrbbtt/utls" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + _ "modernc.org/sqlite" + // "go.mongodb.org/mongo-driver/mongo/options" ) var cert tls.Certificate @@ -24,6 +27,7 @@ var client *mongo.Client var local = false var connectedToDB = false var TCPFingerprints sync.Map +var queries *database.Queries func init() { // Loads the config and connects to database (if enabled) @@ -33,24 +37,33 @@ func init() { log.Fatal(err) } - if len(LoadedConfig.MongoURL) == 0 { // Don't attempt to setup mongo if its not populated in the config - return - } + // if len(LoadedConfig.MongoURL) == 0 { // Don't attempt to setup mongo if its not populated in the config + // return + // } - clientOptions := options.Client().ApplyURI(LoadedConfig.MongoURL) - client, err = mongo.Connect(ctx, clientOptions) - if err != nil { - log.Fatal(err) - } + // clientOptions := options.Client().ApplyURI(LoadedConfig.MongoURL) + // client, err = mongo.Connect(ctx, clientOptions) + // if err != nil { + // log.Fatal(err) + // } + + // err = client.Ping(ctx, nil) + // if err != nil { + // log.Fatal(err) + // } + // fmt.Println(LoadedConfig.DB, LoadedConfig.Collection) + // collection = client.Database(LoadedConfig.DB).Collection(LoadedConfig.Collection) - err = client.Ping(ctx, nil) + // ctx := context.Background() + + db, err := sql.Open("sqlite", "database.db") if err != nil { log.Fatal(err) } - fmt.Println(LoadedConfig.DB, LoadedConfig.Collection) - collection = client.Database(LoadedConfig.DB).Collection(LoadedConfig.Collection) connectedToDB = true + queries = database.New(db) + } func redirect(w http.ResponseWriter, r *http.Request) { diff --git a/router.go b/router.go index 55e38a8..8a93d5b 100755 --- a/router.go +++ b/router.go @@ -1,7 +1,11 @@ package main import ( + "context" + "database/sql" "fmt" + "log" + "main/database" "net/url" "strings" "time" @@ -29,10 +33,44 @@ func Router(path string, res Response) ([]byte, string) { // return []byte("{\"error\": \"No user-agent\"}"), "text/html" // } if LoadedConfig.LogToDB && res.path != "/favicon.ico" { - SaveRequest(res) + // SaveRequest(res) } - u, _ := url.Parse("https://tls.peet.ws" + path) + parts := strings.Split(res.IP, ":") + ip := strings.Join(parts[0:len(parts)-1], ":") + + h2i := "-" + if res.HTTPVersion == "h2" { + h2i = res.Http2.AkamaiFingerprint + } + + err := queries.InsertRequestLog(context.Background(), database.InsertRequestLogParams{ + CreatedAt: time.Now(), + UserAgent: sql.NullString{ + String: GetUserAgent(res), + Valid: GetUserAgent(res) != "", + }, + Ja3: sql.NullString{ + String: res.TLS.JA3, + Valid: res.TLS.JA3 != "", + }, + H2: sql.NullString{ + String: h2i, + Valid: h2i != "", + }, + PeetPrint: sql.NullString{ + String: res.TLS.PeetPrint, + Valid: res.TLS.PeetPrint != "", + }, + IpAddress: sql.NullString{ + String: ip, + Valid: ip != "", + }, + }) + if err != nil { + log.Fatal(err) + } + u, _ := url.Parse("https://localhost" + path) m, _ := url.ParseQuery(u.RawQuery) paths := getAllPaths() @@ -41,5 +79,6 @@ func Router(path string, res Response) ([]byte, string) { } // 404 b, _ := ReadFile("static/404.html") - return []byte(strings.ReplaceAll(string(b), "/*DATA*/", fmt.Sprintf("%v", GetTotalRequestCount()))), "text/html" + // return []byte(strings.ReplaceAll(string(b), "/*DATA*/", fmt.Sprintf("%v", GetTotalRequestCount()))), "text/html" + return []byte(strings.ReplaceAll(string(b), "/*DATA*/", "TODO")), "text/html" //TODO } diff --git a/routes.go b/routes.go index c4862e1..eb72571 100644 --- a/routes.go +++ b/routes.go @@ -2,7 +2,7 @@ package main import ( "encoding/json" - "fmt" + // "fmt" "net/url" "strings" ) @@ -42,64 +42,64 @@ func apiClean(res Response, _ url.Values) ([]byte, string) { }.ToJson()), "application/json" } -func apiRequestCount(_ Response, _ url.Values) ([]byte, string) { - if !connectedToDB { - return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" - } - return []byte(fmt.Sprintf(`{"total_requests": %v}`, GetTotalRequestCount())), "application/json" -} +// func apiRequestCount(_ Response, _ url.Values) ([]byte, string) { +// if !connectedToDB { +// return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" +// } +// return []byte(fmt.Sprintf(`{"total_requests": %v}`, GetTotalRequestCount())), "application/json" +// } -func apiSearchJA3(_ Response, u url.Values) ([]byte, string) { - if !connectedToDB { - return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" - } - by := getParam("by", u) - if by == "" { - return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" - } - res := GetByJa3(by) - j, _ := json.MarshalIndent(res, "", "\t") - return j, "application/json" -} +// func apiSearchJA3(_ Response, u url.Values) ([]byte, string) { +// if !connectedToDB { +// return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" +// } +// by := getParam("by", u) +// if by == "" { +// return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" +// } +// res := GetByJa3(by) +// j, _ := json.MarshalIndent(res, "", "\t") +// return j, "application/json" +// } -func apiSearchH2(_ Response, u url.Values) ([]byte, string) { - if !connectedToDB { - return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" - } - by := getParam("by", u) - if by == "" { - return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" - } - res := GetByH2(by) - j, _ := json.MarshalIndent(res, "", "\t") - return j, "application/json" -} +// func apiSearchH2(_ Response, u url.Values) ([]byte, string) { +// if !connectedToDB { +// return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" +// } +// by := getParam("by", u) +// if by == "" { +// return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" +// } +// res := GetByH2(by) +// j, _ := json.MarshalIndent(res, "", "\t") +// return j, "application/json" +// } -func apiSearchPeetPrint(_ Response, u url.Values) ([]byte, string) { - if !connectedToDB { - return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" - } - by := getParam("by", u) - if by == "" { - return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" - } - res := GetByPeetPrint(by) - j, _ := json.MarshalIndent(res, "", "\t") - return j, "application/json" -} +// func apiSearchPeetPrint(_ Response, u url.Values) ([]byte, string) { +// if !connectedToDB { +// return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" +// } +// by := getParam("by", u) +// if by == "" { +// return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" +// } +// res := GetByPeetPrint(by) +// j, _ := json.MarshalIndent(res, "", "\t") +// return j, "application/json" +// } -func apiSearchUserAgent(_ Response, u url.Values) ([]byte, string) { - if !connectedToDB { - return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" - } - by := getParam("by", u) - if by == "" { - return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" - } - res := GetByUserAgent(by) - j, _ := json.MarshalIndent(res, "", "\t") - return j, "application/json" -} +// func apiSearchUserAgent(_ Response, u url.Values) ([]byte, string) { +// if !connectedToDB { +// return []byte("{\"error\": \"Not connected to database.\"}"), "application/json" +// } +// by := getParam("by", u) +// if by == "" { +// return []byte("{\"error\": \"No 'by' param present\"}"), "application/json" +// } +// res := GetByUserAgent(by) +// j, _ := json.MarshalIndent(res, "", "\t") +// return j, "application/json" +// } func index(r Response, v url.Values) ([]byte, string) { res, ct := staticFile("static/index.html")(r, v) @@ -114,10 +114,10 @@ func getAllPaths() map[string]func(Response, url.Values) ([]byte, string) { "/api/all": apiAll, "/api/tls": apiTLS, "/api/clean": apiClean, - "/api/request-count": apiRequestCount, - "/api/search-ja3": apiSearchJA3, - "/api/search-h2": apiSearchH2, - "/api/search-peetprint": apiSearchPeetPrint, - "/api/search-useragent": apiSearchUserAgent, + // "/api/request-count": apiRequestCount, + // "/api/search-ja3": apiSearchJA3, + // "/api/search-h2": apiSearchH2, + // "/api/search-peetprint": apiSearchPeetPrint, + // "/api/search-useragent": apiSearchUserAgent, } } diff --git a/sql/queries/request_log.sql b/sql/queries/request_log.sql new file mode 100644 index 0000000..3b33158 --- /dev/null +++ b/sql/queries/request_log.sql @@ -0,0 +1,13 @@ +-- name: InsertRequestLog :exec +INSERT INTO request_log ( + created_at, + user_agent, + ja3, + h2, + peet_print, + ip_address +) VALUES ( + ?,?,?,?,?,? +) + + diff --git a/sql/schema/20250115185908_request_log.sql b/sql/schema/20250115185908_request_log.sql new file mode 100644 index 0000000..5364585 --- /dev/null +++ b/sql/schema/20250115185908_request_log.sql @@ -0,0 +1,19 @@ +-- +goose Up +-- +goose StatementBegin +CREATE TABLE + request_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created_at TIMESTAMP NOT NULL, + user_agent TEXT, + ja3 TEXT, + h2 TEXT, + peet_print TEXT, + ip_address TEXT + ) +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP TABLE request_log; + +-- +goose StatementEnd \ No newline at end of file diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..343a3c3 --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,8 @@ +version: "2" +sql: + - schema: "sql/schema" + queries: "sql/queries" + engine: "sqlite" + gen: + go: + out: "database/" \ No newline at end of file diff --git a/structs.go b/structs.go index 7035359..2ca241f 100755 --- a/structs.go +++ b/structs.go @@ -166,6 +166,6 @@ func (c *Config) MakeDefault() { c.Collection = "requests" c.DB = "TrackMe" c.LogIPs = false - c.HTTPRedirect = "https://tls.peet.ws" + c.HTTPRedirect = "https://localhost" c.CorsKey = "X-CORS" }