diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..fe1477f690d707a10c8175f188b7c5672cc72787 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +static/static/core filter=lfs diff=lfs merge=lfs -text diff --git a/Dockerfile b/Dockerfile index 55a2fe644fd5096a371ace309995823cf978979f..595e1d6c0791c41d1f532b14c64b1b70bc780a39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,25 @@ -FROM python:3.9 +FROM golang:1.26.2 as builder -WORKDIR /code +MAINTAINER Clint Ruoho clint@wtfismyip.com -COPY ./requirements.txt /code/requirements.txt -RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt +WORKDIR /app +COPY go.mod go.sum ./ +COPY wtf.go ./ +COPY default.pgo ./ -COPY . . +RUN go mod download && CGO_ENABLED=0 GOOS=linux go build -pgo=default.pgo -a -installsuffix cgo -o wtf . -# Must listen on port 7860 for Hugging Face Spaces -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file +FROM alpine:edge + +WORKDIR /app + +RUN mkdir -p /usr/local/wtf/GeoIP && apk update && apk upgrade && apk add --no-cache vim procps-ng && addgroup -S appuser && adduser -u 666 -S -G appuser appuser +COPY static/GeoIP /usr/local/wtf/GeoIP +COPY static/static /usr/local/wtf/static +COPY static/docker /docker +COPY static/docker/resolv.conf /etc/resolv.conf +COPY --from=builder /app/wtf . +COPY start.sh . + +USER appuser +CMD [ "./start.sh" ] diff --git a/default.pgo b/default.pgo new file mode 100644 index 0000000000000000000000000000000000000000..53e59e41a3a41e76abf2e05acfcd00c820162694 Binary files /dev/null and b/default.pgo differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..68e4aa7c1ee84c92b9c53725d4a8eff2d5a96213 --- /dev/null +++ b/go.mod @@ -0,0 +1,43 @@ +module codeberg.org/wtfismyip/wtfismyip + +go 1.25.3 + +require ( + github.com/caddyserver/certmagic v0.25.1 + github.com/cyphar/filepath-securejoin v0.6.1 + github.com/go-redis/redis/v8 v8.11.5 + github.com/gorilla/mux v1.8.1 + github.com/oschwald/geoip2-golang v1.13.0 + github.com/prometheus/client_golang v1.23.2 + github.com/slok/go-http-metrics v0.13.0 + gopkg.in/yaml.v2 v2.4.0 +) + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/caddyserver/zerossl v0.1.4 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/libdns/libdns v1.1.1 // indirect + github.com/mholt/acmez/v3 v3.1.4 // indirect + github.com/miekg/dns v1.1.69 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oschwald/maxminddb-golang v1.13.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect + github.com/zeebo/blake3 v0.2.4 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.1 // indirect + go.uber.org/zap/exp v0.3.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/crypto v0.46.0 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.39.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..ff486daf82ce66b3fb80746f4c9e5690dbd9585e --- /dev/null +++ b/go.sum @@ -0,0 +1,109 @@ +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/caddyserver/certmagic v0.25.1 h1:4sIKKbOt5pg6+sL7tEwymE1x2bj6CHr80da1CRRIPbY= +github.com/caddyserver/certmagic v0.25.1/go.mod h1:VhyvndxtVton/Fo/wKhRoC46Rbw1fmjvQ3GjHYSQTEY= +github.com/caddyserver/zerossl v0.1.4 h1:CVJOE3MZeFisCERZjkxIcsqIH4fnFdlYWnPYeFtBHRw= +github.com/caddyserver/zerossl v0.1.4/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= +github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= +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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/libdns/libdns v1.1.1 h1:wPrHrXILoSHKWJKGd0EiAVmiJbFShguILTg9leS/P/U= +github.com/libdns/libdns v1.1.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= +github.com/mholt/acmez/v3 v3.1.4 h1:DyzZe/RnAzT3rpZj/2Ii5xZpiEvvYk3cQEN/RmqxwFQ= +github.com/mholt/acmez/v3 v3.1.4/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= +github.com/miekg/dns v1.1.69 h1:Kb7Y/1Jo+SG+a2GtfoFUfDkG//csdRPwRLkCsxDG9Sc= +github.com/miekg/dns v1.1.69/go.mod h1:7OyjD9nEba5OkqQ/hB4fy3PIoxafSZJtducccIelz3g= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/oschwald/geoip2-golang v1.13.0 h1:Q44/Ldc703pasJeP5V9+aFSZFmBN7DKHbNsSFzQATJI= +github.com/oschwald/geoip2-golang v1.13.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo= +github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= +github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= +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/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/slok/go-http-metrics v0.13.0 h1:lQDyJJx9wKhmbliyUsZ2l6peGnXRHjsjoqPt5VYzcP8= +github.com/slok/go-http-metrics v0.13.0/go.mod h1:HIr7t/HbN2sJaunvnt9wKP9xoBBVZFo1/KiHU3b0w+4= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= +github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +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/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.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= +go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/start.sh b/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..c805106c00a3fbaee1a899ba77fd8a69ef34dd14 --- /dev/null +++ b/start.sh @@ -0,0 +1,4 @@ +#!/bin/ash +# this is really really really really really really fugly +sleep 5 +./wtf diff --git a/static/static/.DS_Store b/static/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6b64ed14612a92748ef6d158c78a3f8611eacba3 --- /dev/null +++ b/static/static/.DS_Store @@ -0,0 +1 @@ +OMFG did you actually think I would be using a Mac? diff --git a/static/static/.aws/config b/static/static/.aws/config new file mode 100644 index 0000000000000000000000000000000000000000..55b912f5d76f8084b0d02f5e6a19533a5ba07898 --- /dev/null +++ b/static/static/.aws/config @@ -0,0 +1,3 @@ +[default] +aws_access_key_id = AKIAJPB3602OGMGLMFAO +aws_secret_access_key = LOLOLOLOLOLOLOLOLOLOL diff --git a/static/static/.aws/credentials b/static/static/.aws/credentials new file mode 100644 index 0000000000000000000000000000000000000000..55b912f5d76f8084b0d02f5e6a19533a5ba07898 --- /dev/null +++ b/static/static/.aws/credentials @@ -0,0 +1,3 @@ +[default] +aws_access_key_id = AKIAJPB3602OGMGLMFAO +aws_secret_access_key = LOLOLOLOLOLOLOLOLOLOL diff --git a/static/static/.awscredentials b/static/static/.awscredentials new file mode 100644 index 0000000000000000000000000000000000000000..55b912f5d76f8084b0d02f5e6a19533a5ba07898 --- /dev/null +++ b/static/static/.awscredentials @@ -0,0 +1,3 @@ +[default] +aws_access_key_id = AKIAJPB3602OGMGLMFAO +aws_secret_access_key = LOLOLOLOLOLOLOLOLOLOL diff --git a/static/static/.bash_history b/static/static/.bash_history new file mode 100644 index 0000000000000000000000000000000000000000..20deb4d07cf94a590263cd9b501f33318b54cdb4 --- /dev/null +++ b/static/static/.bash_history @@ -0,0 +1,147 @@ +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! diff --git a/static/static/.docker/.dockercfg b/static/static/.docker/.dockercfg new file mode 100644 index 0000000000000000000000000000000000000000..302451ba398073956adb0b884d02cbe4a00d2aa4 --- /dev/null +++ b/static/static/.docker/.dockercfg @@ -0,0 +1,8 @@ +{ + "auths": { + "https://www.youtube.com/watch?v=sTSA_sWGM44": { + "auth": "TE1GQU8hIE5pY2UgdHJ5LCBtb3RoZXJmdWNrZXIhCg==", + "email": "clint@wtfismyip.com" + } + } +} diff --git a/static/static/.docker/config.json b/static/static/.docker/config.json new file mode 100644 index 0000000000000000000000000000000000000000..302451ba398073956adb0b884d02cbe4a00d2aa4 --- /dev/null +++ b/static/static/.docker/config.json @@ -0,0 +1,8 @@ +{ + "auths": { + "https://www.youtube.com/watch?v=sTSA_sWGM44": { + "auth": "TE1GQU8hIE5pY2UgdHJ5LCBtb3RoZXJmdWNrZXIhCg==", + "email": "clint@wtfismyip.com" + } + } +} diff --git a/static/static/.dockercfg b/static/static/.dockercfg new file mode 100644 index 0000000000000000000000000000000000000000..302451ba398073956adb0b884d02cbe4a00d2aa4 --- /dev/null +++ b/static/static/.dockercfg @@ -0,0 +1,8 @@ +{ + "auths": { + "https://www.youtube.com/watch?v=sTSA_sWGM44": { + "auth": "TE1GQU8hIE5pY2UgdHJ5LCBtb3RoZXJmdWNrZXIhCg==", + "email": "clint@wtfismyip.com" + } + } +} diff --git a/static/static/.env b/static/static/.env new file mode 100644 index 0000000000000000000000000000000000000000..3fe1f53664261c6987c560e349841880e4f6b35c --- /dev/null +++ b/static/static/.env @@ -0,0 +1,5 @@ +DEBUG=on +SECRET_KEY=trololo +DATABASE_URL=https://www.youtube.com/watch?v=sTSA_sWGM44 +AWS_ACCESS_KEY_ID=AKIAJPB3602OGMGLMFAO +AWS_SECRET_ACCESS_KEY=LOLOLOLOLOLOLOLOLOLOL diff --git a/static/static/.env.production b/static/static/.env.production new file mode 100644 index 0000000000000000000000000000000000000000..3fe1f53664261c6987c560e349841880e4f6b35c --- /dev/null +++ b/static/static/.env.production @@ -0,0 +1,5 @@ +DEBUG=on +SECRET_KEY=trololo +DATABASE_URL=https://www.youtube.com/watch?v=sTSA_sWGM44 +AWS_ACCESS_KEY_ID=AKIAJPB3602OGMGLMFAO +AWS_SECRET_ACCESS_KEY=LOLOLOLOLOLOLOLOLOLOL diff --git a/static/static/.ftpconfig b/static/static/.ftpconfig new file mode 100644 index 0000000000000000000000000000000000000000..9ad27c416f7cef1418aed4252c8648099e4b839b --- /dev/null +++ b/static/static/.ftpconfig @@ -0,0 +1,20 @@ +{ +"protocol": "sftp", +"host": "wtfismyip.com", +"port": 22, +"user": "root", +"pass": "trolololo!", +"promptForPass": false, +"remote": "", +"local": "", +"agent": "", +"privatekey": "putty_private_key_sbappsupconvrted.ppk", +"passphrase": "", +"hosthash": "", +"ignorehost": true, +"connTimeout": 10000, +"keepalive": 10000, +"keyboardInteractive": true, +"watch": [], +"watchTimeout": 500 +} diff --git a/static/static/.git-credentials b/static/static/.git-credentials new file mode 100644 index 0000000000000000000000000000000000000000..6dbb8921a8ea722d40e2142c986fcb7ea02c1895 --- /dev/null +++ b/static/static/.git-credentials @@ -0,0 +1 @@ +https://root:LMFAO@wtfismyip.com/ diff --git a/static/static/.gitconfig b/static/static/.gitconfig new file mode 100644 index 0000000000000000000000000000000000000000..ca5bc857e803e9d79852b17118b5e1e42fc2aa5a --- /dev/null +++ b/static/static/.gitconfig @@ -0,0 +1,5 @@ +[user] + email = clint@wtfismyip.com +[credential] + username = root + password = TROLOLOLOLOLOLOLOOL! diff --git a/static/static/.htaccess b/static/static/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..ebbbdebd16abfaeaeb4ac8e3ce574ef3fc75e586 --- /dev/null +++ b/static/static/.htaccess @@ -0,0 +1 @@ +Redirect 301 https://www.youtube.com/watch?v=sTSA_sWGM44 diff --git a/static/static/.netrc b/static/static/.netrc new file mode 100644 index 0000000000000000000000000000000000000000..3d02b384fb6893d0a84cca5e0fcf649fd2e0e9c5 --- /dev/null +++ b/static/static/.netrc @@ -0,0 +1,3 @@ +machine nic.ddn.mil +login trolololololololol +password omgwtfbbq diff --git a/static/static/.npmrc b/static/static/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..5bb2439c45ae42039c8987033917625b4f5c1a8e --- /dev/null +++ b/static/static/.npmrc @@ -0,0 +1,2 @@ +registry = https://www.youtube.com/watch?v=sTSA_sWGM44 +auth = TE1GQU8hIE5pY2UgdHJ5LCBtb3RoZXJmdWNrZXIhCg== diff --git a/static/static/.npmrc_auth b/static/static/.npmrc_auth new file mode 100644 index 0000000000000000000000000000000000000000..5bb2439c45ae42039c8987033917625b4f5c1a8e --- /dev/null +++ b/static/static/.npmrc_auth @@ -0,0 +1,2 @@ +registry = https://www.youtube.com/watch?v=sTSA_sWGM44 +auth = TE1GQU8hIE5pY2UgdHJ5LCBtb3RoZXJmdWNrZXIhCg== diff --git a/static/static/.s3cfg b/static/static/.s3cfg new file mode 100644 index 0000000000000000000000000000000000000000..8d2f3d2af82c3b78c0452d8f10865e942e9b9fef --- /dev/null +++ b/static/static/.s3cfg @@ -0,0 +1,3 @@ +[default] +access_key = AKIAJPB3602OGMGLMFAO +secret_key = LbhZhfgOrErnyylShpxvatOberqGbEBG13QrpbqrGuvf diff --git a/static/static/.sh_history b/static/static/.sh_history new file mode 100644 index 0000000000000000000000000000000000000000..20deb4d07cf94a590263cd9b501f33318b54cdb4 --- /dev/null +++ b/static/static/.sh_history @@ -0,0 +1,147 @@ +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! diff --git a/static/static/.ssh/authorized_keys b/static/static/.ssh/authorized_keys new file mode 100644 index 0000000000000000000000000000000000000000..56bad8e02aa44759e73cd928100303aa480ff53f --- /dev/null +++ b/static/static/.ssh/authorized_keys @@ -0,0 +1 @@ +ssh-rsa AAAAVGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgYmFzZSA2NCBkZWNvZGluZyB0aGlzLiBJIGhvcGUgeW91IGZpbmQgdGhpcyB2YWd1ZWx5IGFtdXNpbmcuIElmIG5vdCwgSSdtIGhhcHB5IEkgd2FzdGVkIHlvdXIgdGltZS4ga3RoeGJ5ZQo= root@wtfismyip.com diff --git a/static/static/.ssh/id_ed25519 b/static/static/.ssh/id_ed25519 new file mode 100644 index 0000000000000000000000000000000000000000..db7a0a5649c569605e8bce9c86716772f4bc5622 --- /dev/null +++ b/static/static/.ssh/id_ed25519 @@ -0,0 +1,10 @@ +-----BEGIN OPENSSH PRIVATE KEY----- + _____________________________ +< I'm too fucking cool for RSA > + ----------------------------- + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || +-----END OPENSSH PRIVATE KEY----- diff --git a/static/static/.ssh/id_rsa b/static/static/.ssh/id_rsa new file mode 100644 index 0000000000000000000000000000000000000000..0e743856717158a6bd8658acfb0d5f81adbff4ff --- /dev/null +++ b/static/static/.ssh/id_rsa @@ -0,0 +1,23 @@ +-----BEGIN RSA PRIVATE KEY----- +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL== +-----END RSA PRIVATE KEY----- diff --git a/static/static/.travis.yml b/static/static/.travis.yml new file mode 100644 index 0000000000000000000000000000000000000000..7e6e2dd93bbe1061c45fe2393e70920c4bccc15b --- /dev/null +++ b/static/static/.travis.yml @@ -0,0 +1,3 @@ +env: + global: + - secure: "TROLOLOLOLOLOL!" diff --git a/static/static/.vscode/sftp-config.json b/static/static/.vscode/sftp-config.json new file mode 100644 index 0000000000000000000000000000000000000000..ab3b6629a7f7c1122e9e186964bc995a893ea372 --- /dev/null +++ b/static/static/.vscode/sftp-config.json @@ -0,0 +1,5 @@ +{ + "host": "omg.wtf.bbq", + "user": "LMFAO", + "password": "TROLOLOLOL" +} diff --git a/static/static/Vagrantfile b/static/static/Vagrantfile new file mode 100644 index 0000000000000000000000000000000000000000..0b5c8fc7d2efc79a9951d8aeb422ad92ee94b99a --- /dev/null +++ b/static/static/Vagrantfile @@ -0,0 +1,4 @@ +Vagrant.configure(2) do |config| + config.vm.provider :omg do |wtf.bbq| + config.username = "trololo" + config.api_token = "lmfao" diff --git a/static/static/admin.html b/static/static/admin.html new file mode 100644 index 0000000000000000000000000000000000000000..f812b53e7a33099792bda0aa6cd2116162003f0b --- /dev/null +++ b/static/static/admin.html @@ -0,0 +1,38 @@ + + + WTFISMYIP Admin Login + + + +

 

+

 

+

 

+ +

+ +

WTFISMYIP Admin Login

+ + +
+ + + + + + + + + + + + + + +
Username
Password
+ +
+

 

+ +

+ + diff --git a/static/static/authorized_keys b/static/static/authorized_keys new file mode 100644 index 0000000000000000000000000000000000000000..56bad8e02aa44759e73cd928100303aa480ff53f --- /dev/null +++ b/static/static/authorized_keys @@ -0,0 +1 @@ +ssh-rsa AAAAVGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgYmFzZSA2NCBkZWNvZGluZyB0aGlzLiBJIGhvcGUgeW91IGZpbmQgdGhpcyB2YWd1ZWx5IGFtdXNpbmcuIElmIG5vdCwgSSdtIGhhcHB5IEkgd2FzdGVkIHlvdXIgdGltZS4ga3RoeGJ5ZQo= root@wtfismyip.com diff --git a/static/static/automation b/static/static/automation new file mode 100644 index 0000000000000000000000000000000000000000..2f24ea3b2f580dc2d0fbbbd35616ca33b0db27d1 --- /dev/null +++ b/static/static/automation @@ -0,0 +1,99 @@ + + + + + +wtfismyip.com Automation Policy + + + +
+ +

Automation Policy

+ +You are welcome to use any of the wtfismyip.com services in your noncommercial +automated applications. All we ask is that you limit usage to 1 request per minute per IP +address. Any usage in excess of this may lead to a temporary block. This free service is +provided with no guarantees as to availability or reliability. Commercial use is +expressely prohibited. + +

We don't make any money from running this fucking website, since we don't allow ads or trackers. + +

Questions or concerns? Reach us on Mastodon, Signal, or Wire. + + + + diff --git a/static/static/aws.credentials b/static/static/aws.credentials new file mode 100644 index 0000000000000000000000000000000000000000..55b912f5d76f8084b0d02f5e6a19533a5ba07898 --- /dev/null +++ b/static/static/aws.credentials @@ -0,0 +1,3 @@ +[default] +aws_access_key_id = AKIAJPB3602OGMGLMFAO +aws_secret_access_key = LOLOLOLOLOLOLOLOLOLOL diff --git a/static/static/aws.yml b/static/static/aws.yml new file mode 100644 index 0000000000000000000000000000000000000000..108e39dba3c759522feff2e8fb04d8067c5210b2 --- /dev/null +++ b/static/static/aws.yml @@ -0,0 +1,27 @@ +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +name: wtfismyip + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: AKIAJPB3602OGMGLMFAO + aws-secret-access-key: LOLOLOLOLOLOLOLOLOLOL + aws-region: hell-ring-4 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 diff --git a/static/static/cart.json b/static/static/cart.json new file mode 100644 index 0000000000000000000000000000000000000000..0911209af7a1f552ce2637b2847896b9d673097a --- /dev/null +++ b/static/static/cart.json @@ -0,0 +1 @@ +{"token":"abcdefgnowiknowmyabcsmotherfucker","note":null,"attributes":{},"original_total_price":666,"total_price":666,"total_discount":666,"total_weight":666.666,"item_count":666,"items":[],"requires_shipping":false,"currency":"USD","items_subtotal_price":666,"cart_level_discount_applications":[],"trololologuy":"https://www.youtube.com/watch?v=sTSA_sWGM44"} diff --git a/static/static/clean.template b/static/static/clean.template new file mode 100644 index 0000000000000000000000000000000000000000..fe2248b2abf35a75c860e6ba20ebc7484095fa0b --- /dev/null +++ b/static/static/clean.template @@ -0,0 +1,119 @@ + +WTF is my IP?!?!?? + +

+
+

+{{if not .Myipwtf}}

Also accessible as myip.wtf!


{{end}} +{{if .Tor}}

You are using Tor!

{{end}} +{{if .IPv6 }}

Your IPv6 address is:

+{{else}}

Your IP address is:

+{{end}} +
+
+

{{.Address}} +

+
+

+

Your host name is:

+
+
+

{{.Hostname}} +

+{{if .IPv6 }}
+

+

Geographic location of your IPv6 address:

+
+
+

{{.Geo}} +

+
+
+
+ +
+
+

+

+

WTF is my IPv4 address!?

+{{else}}
+

+

Geographic location of your IP address:

+
+
+

{{.Geo}} +

+
+
+
+ +
+

+

Your ISP:

+
+
+

{{.ISP}} +

+{{end}}

+
+

What headers is my browser sending?

+
+
+

+

Give me this stuff in XML, JSON or plain text!

+

+

+
+ +

+

+ + diff --git a/static/static/cleanjson.template b/static/static/cleanjson.template new file mode 100644 index 0000000000000000000000000000000000000000..2181677e0cee4fcfcbb272eff0afb68ede32bf5a --- /dev/null +++ b/static/static/cleanjson.template @@ -0,0 +1,10 @@ +{ + "YourIPAddress": "{{.Address}}", + "YourLocation": "{{.Geo}}", + "YourHostname": "{{.Hostname}}", + "YourISP": "{{.ISP}}", + "YourTorExit": {{.Tor}}, + "YourCity": "{{.City}}", + "YourCountry": "{{.Country}}", + "YourCountryCode": "{{.CountryCode}}" +} diff --git a/static/static/client_secrets.json b/static/static/client_secrets.json new file mode 100644 index 0000000000000000000000000000000000000000..dd1d328d3123d6e4c2c69fc4581878fe7840f186 --- /dev/null +++ b/static/static/client_secrets.json @@ -0,0 +1,10 @@ +{ + "installed": { + "client_id": "88b4ad7f-c3c6-44b5-ac24-7c9f67a97858.trololololo.nsa.gov", + "client_secret":"trolololo!", + "redirect_uris": ["https://www.youtube.com/watch?v=sTSA_sWGM44", "urn:ietf:wg:oauth:2.0:oob"], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token" + } +} + diff --git a/static/static/config.json b/static/static/config.json new file mode 100644 index 0000000000000000000000000000000000000000..302451ba398073956adb0b884d02cbe4a00d2aa4 --- /dev/null +++ b/static/static/config.json @@ -0,0 +1,8 @@ +{ + "auths": { + "https://www.youtube.com/watch?v=sTSA_sWGM44": { + "auth": "TE1GQU8hIE5pY2UgdHJ5LCBtb3RoZXJmdWNrZXIhCg==", + "email": "clint@wtfismyip.com" + } + } +} diff --git a/static/static/config/aws.yml b/static/static/config/aws.yml new file mode 100644 index 0000000000000000000000000000000000000000..108e39dba3c759522feff2e8fb04d8067c5210b2 --- /dev/null +++ b/static/static/config/aws.yml @@ -0,0 +1,27 @@ +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +name: wtfismyip + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: AKIAJPB3602OGMGLMFAO + aws-secret-access-key: LOLOLOLOLOLOLOLOLOLOL + aws-region: hell-ring-4 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 diff --git a/static/static/config/secrets.yml b/static/static/config/secrets.yml new file mode 100644 index 0000000000000000000000000000000000000000..326d6daa798cd979ab5622084fb60a4f5357f05e --- /dev/null +++ b/static/static/config/secrets.yml @@ -0,0 +1,3 @@ +production: + secret_key_base: bf0b94004ce587515af90b3705ffb33a + prod_api_key: TROLOLOLOLOLO! diff --git a/static/static/core b/static/static/core new file mode 100644 index 0000000000000000000000000000000000000000..25c7795f17e13ee8062bb2366a6c04413510eb74 --- /dev/null +++ b/static/static/core @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c897b6763871904446199a157e81441bb1e5e9f593d081eb309e44c427793962 +size 1942941 diff --git a/static/static/credentials.xml b/static/static/credentials.xml new file mode 100644 index 0000000000000000000000000000000000000000..eaa167136c95a2ab3f4bc58615948179188ecb15 --- /dev/null +++ b/static/static/credentials.xml @@ -0,0 +1,7 @@ + + GLOBAL + artifactory-credentials + + admin + {VFJPTE9MT0xPTE9MT0xPTE9MT0whCg==} + diff --git a/static/static/database.yml b/static/static/database.yml new file mode 100644 index 0000000000000000000000000000000000000000..a461376e7cd149eec9bc9436e3023e43a88c05b0 --- /dev/null +++ b/static/static/database.yml @@ -0,0 +1,6 @@ +production: + adapter: mysql2 + encoding: utf8 + username: root + password: Trololololo!!!! + host: 127.666.666.666 diff --git a/static/static/deployment-config.json b/static/static/deployment-config.json new file mode 100644 index 0000000000000000000000000000000000000000..ee02538a1f1854c8b61e380a32d4d7750abbe7f7 --- /dev/null +++ b/static/static/deployment-config.json @@ -0,0 +1,10 @@ +{ + "type": "sftp", + "host": "omg.wtf.bbq", + "username": "lmfao", + "password": "NiceTry!", + "port": 22, + "remotePath": "/trololo", + "uploadOnSave": false +} + diff --git a/static/static/donate b/static/static/donate new file mode 100644 index 0000000000000000000000000000000000000000..145a4253cbab64c35a26df80efed639e4af842cf --- /dev/null +++ b/static/static/donate @@ -0,0 +1,103 @@ + + + + + +Fucking Donations + + + +

+ +

We don't make any fucking money from running this fucking website, since we don't allow fucking ads or fucking trackers. We serve over 1 fucking million requests an hour. Supporting this fucking service isn't fuckin free. Please consider a fucking donation. + + +

Paypal: +

+ + + + + +
+ +

Bitcoin: 1WTFWTF151rsbCantRR2BJ65Q1oDMHV4f +

Monero: 4223X1KH1D8R1crimaNgPSFZjrWymLCvbN38dfja7ojGDH8KdcdjkVVCdywdUbbdaKXX5oTCuPobqeNaw4uey9SnLZMMRDe + +

Any fucking questions or fucking concerns? Reach us on Mastodon, Signal, or Wire. + + + diff --git a/static/static/evil.ini b/static/static/evil.ini new file mode 100644 index 0000000000000000000000000000000000000000..fc2b6c873b37d25efea036a6f74f71ad2b928038 --- /dev/null +++ b/static/static/evil.ini @@ -0,0 +1,5 @@ +[OMFG] +Did=You +Expect=To +Find=Something +Here=LOLOLOLOLOL diff --git a/static/static/evil.log b/static/static/evil.log new file mode 100644 index 0000000000000000000000000000000000000000..20deb4d07cf94a590263cd9b501f33318b54cdb4 --- /dev/null +++ b/static/static/evil.log @@ -0,0 +1,147 @@ +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! +TROLOLOLOL! diff --git a/static/static/evil.sql b/static/static/evil.sql new file mode 100644 index 0000000000000000000000000000000000000000..fa3ce3e91aceb12ca40d0e5135da2dde03e5e4c7 --- /dev/null +++ b/static/static/evil.sql @@ -0,0 +1,149 @@ +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; +SELECT * FROM OMG WHERE WTF='BBQ'; diff --git a/static/static/evil.tar.gz b/static/static/evil.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1b5ef4d7cae5509fea8ffd2acad81b60e6614bfa --- /dev/null +++ b/static/static/evil.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3141f1eb6d51984cc475171ec3f1cc06947772c34127f303b551e469481b18b +size 131 diff --git a/static/static/evil.zip b/static/static/evil.zip new file mode 100644 index 0000000000000000000000000000000000000000..42185eec46d077cd991866b2267ab16e17cf337a --- /dev/null +++ b/static/static/evil.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccfdccf7e13b7eeabf2578a92dea4952b8e4a2e3150316e12bc21d0397a448ec +size 186 diff --git a/static/static/favicon.ico b/static/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e4cdebe74d4bd56cd7c7acf1e9b22015d0bd3ec Binary files /dev/null and b/static/static/favicon.ico differ diff --git a/static/static/html.template b/static/static/html.template new file mode 100644 index 0000000000000000000000000000000000000000..b2d903a08814aef6c44d17ec401bb065e576a76e --- /dev/null +++ b/static/static/html.template @@ -0,0 +1,122 @@ + +WTF is my IP?!?!?? + +

+
+{{if not .Myipwtf}}

Also accessible as myip.wtf!


{{end}} +{{if .Tor }}

You are using Tor!


{{end}} +{{if .IPv6 }}

Your fucking IPv6 address is:

+{{else}}

Your fucking IP address is:

+{{end}} +
+
+

{{.Address}} +

+
+

+

Your fucking host name is:

+
+
+

{{.Hostname}} +

+{{if .IPv6 }}
+

+

Geographic location of your fucking IPv6 address:

+
+
+

{{.Geo}} +

+
+
+
+ +
+
+

+

+{{if not .Myipwtf}}

WTF is my IPv4 address!?

+{{else}}

WTF is my IPv4 address!?

{{end}} +{{else}}
+

+

Geographic location of your fucking IP address:

+
+
+

{{.Geo}} +

+
+
+
+ +
+

+

Your fucking ISP:

+
+
+

{{.ISP}} +

+{{end}}

+
+

What fucking headers is my browser sending?

+
+
+

+

Give me this shit in XML, YAML, JSON or plain text!

+

+

+
+ +

+

+ + diff --git a/static/static/id_rsa b/static/static/id_rsa new file mode 100644 index 0000000000000000000000000000000000000000..0e743856717158a6bd8658acfb0d5f81adbff4ff --- /dev/null +++ b/static/static/id_rsa @@ -0,0 +1,23 @@ +-----BEGIN RSA PRIVATE KEY----- +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL +TROLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL== +-----END RSA PRIVATE KEY----- diff --git a/static/static/josn b/static/static/josn new file mode 100644 index 0000000000000000000000000000000000000000..30fbc739d6db4f0d2a8732df78e44439c5678f68 --- /dev/null +++ b/static/static/josn @@ -0,0 +1 @@ +I think you're looking for /json, motherfucker! diff --git a/static/static/js2 b/static/static/js2 new file mode 100644 index 0000000000000000000000000000000000000000..5a1c3c575309e88f746137d238baf0bf31973056 --- /dev/null +++ b/static/static/js2 @@ -0,0 +1 @@ +function getIPs(e){var n=new(window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection)({iceServers:[{urls:"stun:stun.wtfismyip.com"}]}),t=function(){},c={},a=/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g;function d(n){c[n]||e(n),c[n]=!0}n.createDataChannel(""),n.createOffer(function(e){e.sdp.split("\n").forEach(function(e){e.indexOf("candidate")<0||e.match(a).forEach(d)}),n.setLocalDescription(e,t,t)},t),n.onicecandidate=function(e){e&&e.candidate&&e.candidate.candidate&&e.candidate.candidate.match(a)&&e.candidate.candidate.match(a).forEach(d)}}getIPs(function(e){if(e.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)){var n=document.createElement("H2");n.innerHTML="

Your fucking local IP address is:
";var t=document.createElement("P");t.innerHTML="
"+e+"
",document.getElementById("local").appendChild(n),document.getElementById("local").appendChild(t)}}); diff --git a/static/static/json.template b/static/static/json.template new file mode 100644 index 0000000000000000000000000000000000000000..563cc21c7e54f9a0cfa6990871b0784872625fdd --- /dev/null +++ b/static/static/json.template @@ -0,0 +1,10 @@ +{ + "YourFuckingIPAddress": "{{.Address}}", + "YourFuckingLocation": "{{.Geo}}", + "YourFuckingHostname": "{{.Hostname}}", + "YourFuckingISP": "{{.ISP}}", + "YourFuckingTorExit": {{.Tor}}, + "YourFuckingCity": "{{.City}}", + "YourFuckingCountry": "{{.Country}}", + "YourFuckingCountryCode": "{{.CountryCode}}" +} diff --git a/static/static/none b/static/static/none new file mode 100644 index 0000000000000000000000000000000000000000..c961710046124a45dd566a34f7be0c8673163baf --- /dev/null +++ b/static/static/none @@ -0,0 +1 @@ +Nothing to fucking see here. Go home. diff --git a/static/static/parameters.yml b/static/static/parameters.yml new file mode 100644 index 0000000000000000000000000000000000000000..7b3692a90a6ebcd3ab0cd868912542f6796229ad --- /dev/null +++ b/static/static/parameters.yml @@ -0,0 +1,3 @@ +parameters: + database_user: root + database_password: trolololo!!!!! diff --git a/static/static/passwd b/static/static/passwd new file mode 100644 index 0000000000000000000000000000000000000000..a5ddb5ff002e617e7db10e6e464bc62c00df58a1 --- /dev/null +++ b/static/static/passwd @@ -0,0 +1 @@ +root:$6$LMFAO$LOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL:17325:0:99999:7::: diff --git a/static/static/pool_info b/static/static/pool_info new file mode 100644 index 0000000000000000000000000000000000000000..64f4e483cf93d66c34a6755c85ee73d6f80a35d1 --- /dev/null +++ b/static/static/pool_info @@ -0,0 +1,10 @@ +{ + "pool_name": "trolololo_main!", + "active_connections": 8, + "idle_connections": 12, + "max_connections": 20, + "min_connections": 5, + "wait_count": 2, + "wait_duration_ms": 150, + "connection_timeout_ms": 5000 +} diff --git a/static/static/privacy b/static/static/privacy new file mode 100644 index 0000000000000000000000000000000000000000..115c70ca40f6267b16341877a67f7eff06024f1f --- /dev/null +++ b/static/static/privacy @@ -0,0 +1,106 @@ + + + + + +wtfismyip.com Fucking Privacy Policy + + + +
+ +

Privacy Policy

+ +At wtfismyip.com, we care about your fucking privacy. When you use +wtfismyip.com, we perform a reverse DNS lookup of your IP address to display to +you. Local databases are used to obtain all other information we display to +you. We do not use any fucking tracking cookies, fucking third-party analytics, nor do we sell +fucking advertisements. We provide this solely as a free service for the fucking community. +The service is built directly and unmodified from our publicly posted source code. Take a look at source code, motherfucker, to see that we aren't logging shit. + +

+ +

+This service is subject to the laws of the United States of America. This free service is +provided with no fucking guarantees as to availability or reliability. + +

We don't make any fucking money from running this fucking website, since we don't allow fucking ads or fucking trackers. + +

Any fucking questions or fucking concerns? Reach us on Mastodon, Signal, or Wire. + + + + diff --git a/static/static/readme.html b/static/static/readme.html new file mode 100644 index 0000000000000000000000000000000000000000..e6c62dab8bda236a70698f302f0e0186f5c4d35a --- /dev/null +++ b/static/static/readme.html @@ -0,0 +1 @@ +Read this, motherfucker! diff --git a/static/static/robots.txt b/static/static/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..23f019e56ed76fe9099c9545919718b2ea689cb7 --- /dev/null +++ b/static/static/robots.txt @@ -0,0 +1,7 @@ +User-agent: * +Disallow: /P5EQOJwaHXZ3Xf6BkMocASKkPQxwvGDt +Disallow: /jabber +Disallow: /jabber/register +Disallow: /jabber/verify +Disallow: /jabber/privacy +Disallow: /m diff --git a/static/static/server-status b/static/static/server-status new file mode 100644 index 0000000000000000000000000000000000000000..2755ffb76d20c05d319b6b4b79ae39584959ba62 --- /dev/null +++ b/static/static/server-status @@ -0,0 +1,69 @@ + + +Apache Status + +

Apache Server Status for wtfismyip.com (via OMFG this isn't really enabled!)

+ +
Server Version: Apache/2.4.10 (Debian) mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_fcgid/2.3.9 OpenSSL/1.0.1k mod_apreq2-20090110/2.8.0 mod_perl/2.0.9dev Perl/v5.20.2
+
Server MPM: prefork
+
Server Built: Mar 15 2015 09:51:43 +

+
Current Time: Wednesday, 22-Nov-2017 19:42:36 EST
+
Restart Time: Wednesday, 28-Jun-2017 03:34:45 EDT
+
Parent Server Config. Generation: 155
+
Parent Server MPM Generation: 154
+
Server uptime: 147 days 17 hours 7 minutes 50 seconds
+
Server load: 0.41 0.32 0.32
+
Total accesses: 69991550 - Total Traffic: 390.2 GB
+
CPU Usage: u44.35 s7.66 cu0 cs0 - .000408% CPU load
+
5.48 requests/sec - 32.1 kB/second - 5.8 kB/request
+
11 requests currently being processed, 4 idle workers
+
KCKK__KK.W...KK_._..KK..........................................
+................................................................
+......................
+

Scoreboard Key:
+"_" Waiting for Connection, +"S" Starting up, +"R" Reading Request,
+"W" Sending Reply, +"K" Keepalive (read), +"D" DNS Lookup,
+"C" Closing connection, +"L" Logging, +"G" Gracefully finishing,
+"I" Idle cleanup of worker, +"." Open slot with no current process
+

+ + + + + + +
SrvPIDAccMCPU +SSReqConnChildSlotClientVHostRequest
0-154206541/36/5263792K +0.221023010.80.0528306.20 +93.158.161.75wtfismyip.com:443GET /LOLOLOLOL-This-Really-Is-Not-Enabled HTTP/1.1
+


+ + + + + + + + + + +
SrvChild Server number - generation
PIDOS process ID
AccNumber of accesses this connection / this child / this slot
MMode of operation
CPUCPU usage, number of seconds
SSSeconds since beginning of most recent request
ReqMilliseconds required to process most recent request
ConnKilobytes transferred this connection
ChildMegabytes transferred this child
SlotTotal megabytes transferred this slot
+
+

mod_fcgid status:

+Total FastCGI processes: 0 +
+ + + +
+SSL/TLS Session Cache Status:
+cache type: SHMCB, shared memory: 512000 bytes, current entries: 10
subcaches: 32, indexes per subcache: 88
time left on oldest entries' objects: avg: 208 seconds, (range: 89...249)
index usage: 0%, cache usage: 0%
total entries stored since starting: 2430
total entries replaced since starting: 0
total entries expired since starting: 2420
total (pre-expiry) entries scrolled out of the cache: 0
total retrieves since starting: 827 hit, 612 miss
total removes since starting: 0 hit, 0 miss
+ diff --git a/static/static/settings.py b/static/static/settings.py new file mode 100644 index 0000000000000000000000000000000000000000..ec46e642e7c4564e6ff0ccd5624bb728c0b4570d --- /dev/null +++ b/static/static/settings.py @@ -0,0 +1,3 @@ +import base64 + +SECRET_KEY = base64.b64decode('TmljZSBmdWNraW5nIHRyeQ==') diff --git a/static/static/sftp-config.json b/static/static/sftp-config.json new file mode 100644 index 0000000000000000000000000000000000000000..ab3b6629a7f7c1122e9e186964bc995a893ea372 --- /dev/null +++ b/static/static/sftp-config.json @@ -0,0 +1,5 @@ +{ + "host": "omg.wtf.bbq", + "user": "LMFAO", + "password": "TROLOLOLOL" +} diff --git a/static/static/sftp.json b/static/static/sftp.json new file mode 100644 index 0000000000000000000000000000000000000000..149c129f52b7971d736ce536b4d347552de29026 --- /dev/null +++ b/static/static/sftp.json @@ -0,0 +1,23 @@ +{ + "pools": [ + { + "name": "legacy_trolololo", + "host": "trolololo.cia.gov", + "port": 22, + "username": "djt", + "auth_method": "password", + "password": "OMFGOMFG!", + "max_connections": 8, + "min_connections": 2, + "timeout_seconds": 30, + "retry_attempts": 3, + "keepalive_interval": 60 + } + ], + "defaults": { + "auth_method": "password", + "retry_delay_ms": 1000, + "max_retry_attempts": 3, + "enable_compression": false + } +} diff --git a/static/static/shadow b/static/static/shadow new file mode 100644 index 0000000000000000000000000000000000000000..a5ddb5ff002e617e7db10e6e464bc62c00df58a1 --- /dev/null +++ b/static/static/shadow @@ -0,0 +1 @@ +root:$6$LMFAO$LOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOLOL:17325:0:99999:7::: diff --git a/static/static/thereIsNoWayThat-You-CanBeThere b/static/static/thereIsNoWayThat-You-CanBeThere new file mode 100644 index 0000000000000000000000000000000000000000..865acbd96d24f031562ccd498706353b42cffe54 --- /dev/null +++ b/static/static/thereIsNoWayThat-You-CanBeThere @@ -0,0 +1 @@ +I'm fucking here! diff --git a/static/static/thispathdoesnotexistslol b/static/static/thispathdoesnotexistslol new file mode 100644 index 0000000000000000000000000000000000000000..039bc02520b5cc529eeb82cf2a69c4adc7643537 --- /dev/null +++ b/static/static/thispathdoesnotexistslol @@ -0,0 +1 @@ +This path certainly fucking exists! diff --git a/static/static/travis.yml b/static/static/travis.yml new file mode 100644 index 0000000000000000000000000000000000000000..7e6e2dd93bbe1061c45fe2393e70920c4bccc15b --- /dev/null +++ b/static/static/travis.yml @@ -0,0 +1,3 @@ +env: + global: + - secure: "TROLOLOLOLOLOL!" diff --git a/static/static/vim_settings.xml b/static/static/vim_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..888b376cf641a35f2ed219e8e1d684f6eb3fd45a --- /dev/null +++ b/static/static/vim_settings.xml @@ -0,0 +1,9 @@ + + + + + UEFTU1dEPVRST0xPTE9MT09MT0xPTCE= + + + + diff --git a/static/static/wallet.dat b/static/static/wallet.dat new file mode 100644 index 0000000000000000000000000000000000000000..4b5bbff0d8342c4def65d40df680ca2b093a95c6 --- /dev/null +++ b/static/static/wallet.dat @@ -0,0 +1 @@ +No fucking BTC for you!! diff --git a/static/static/why b/static/static/why new file mode 100644 index 0000000000000000000000000000000000000000..4b341f79c00cccc5862b7d3eea0b71a928cf88f3 --- /dev/null +++ b/static/static/why @@ -0,0 +1,106 @@ + + + + + +Why wtfismyip.com?!?!? + + + +
+ +

Why wtfismyip.com?

+

    +
  • Fucking HTML, fucking JSON, fucking XML, and fucking text interfaces
  • +
  • Fucking HTTPS/SSL support
  • +
  • We put the fucking source code on Codeberg
  • +
  • We don't fucking use CloudFlare
  • +
  • We never fucking will
  • +
  • Fucking IPv6 support
  • +
  • No fucking advertisements
  • +
  • No fucking analytics
  • +
  • No fucking first-party cookies
  • +
  • No fucking third-party cookies
  • +
  • fucking Tor exit node notification
  • +
  • Reasonable fucking rate limiting
  • +
+ +

We don't make any fucking money from running this fucking website, since we don't allow fucking ads or fucking trackers. + +

Any fucking questions or fucking concerns? Reach us on Mastodon, Signal, or Wire. + + + diff --git a/static/static/wtf.rar b/static/static/wtf.rar new file mode 100644 index 0000000000000000000000000000000000000000..02cb763f7d7326623d71c7b4f6e8c3b2c53ff111 --- /dev/null +++ b/static/static/wtf.rar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0132aa436a063e2e356f56481656939e4f3e2507a2127f960a8a0150f81271a5 +size 136 diff --git a/static/static/xml.template b/static/static/xml.template new file mode 100644 index 0000000000000000000000000000000000000000..1b69f408ace585a6291f1ce4addf96a65b7ef61b --- /dev/null +++ b/static/static/xml.template @@ -0,0 +1,10 @@ + + {{.Address}} + {{.Geo}} + {{.Hostname}} + {{.ISP}} + {{.Tor}} + {{.City}} + {{.Country}} + {{.CountryCode}} + diff --git a/static/static/yaml.template b/static/static/yaml.template new file mode 100644 index 0000000000000000000000000000000000000000..50c94566a4c205cde9e617fba15003737acb0dbf --- /dev/null +++ b/static/static/yaml.template @@ -0,0 +1,8 @@ +YourFuckingIPAddress: "{{.Address}}" +YourFuckingLocation: "{{.Geo}}" +YourFuckingHostname: "{{.Hostname}}" +YourFuckingISP: "{{.ISP}}" +YourFuckingTorExit: {{.Tor}} +YourFuckingCity: "{{.City}}" +YourFuckingCountry: "{{.Country}}" +YourFuckingCountryCode: "{{.CountryCode}}" diff --git a/wtf.go b/wtf.go new file mode 100644 index 0000000000000000000000000000000000000000..5aa2b1bc47364619603fce61a66a5824c9f41554 --- /dev/null +++ b/wtf.go @@ -0,0 +1,808 @@ +package main + +import ( + "context" + "encoding/json" + encodingxml "encoding/xml" + "fmt" + "log" + "net" + "net/http" + "os" + "path/filepath" + "strings" + "text/template" + "time" + + "github.com/caddyserver/certmagic" + "github.com/cyphar/filepath-securejoin" + "github.com/go-redis/redis/v8" + "github.com/gorilla/mux" + "github.com/oschwald/geoip2-golang" + "github.com/prometheus/client_golang/prometheus/promhttp" + metrics "github.com/slok/go-http-metrics/metrics/prometheus" + "github.com/slok/go-http-metrics/middleware" + middlewarestd "github.com/slok/go-http-metrics/middleware/std" + "gopkg.in/yaml.v2" + _ "net/http/pprof" +) + +const reverseDNSTimeout = 5 * time.Second + +var xffMode bool + +var cityReader *geoip2.Reader +var orgReader *geoip2.Reader +var templateHTML *template.Template +var templateCleanJSON *template.Template +var templateXML *template.Template +var templateClean *template.Template + +var rdb *redis.Client + +type geoText struct { + org string + details string + countryCode string + city string + country string + state string +} + +type wtfResponse struct { + IPv6 bool + Address string + Hostname string + Geo string + ISP string + CountryCode string + Tor bool + Myipwtf bool + City string + Country string +} + +func main() { + + xffMode = false + + if len(os.Args) == 2 { + if os.Args[1] == "--xff" { + xffMode = true + } + } + var err error + + rdb = redis.NewClient(&redis.Options{ + Addr: "172.19.1.70:6379", + Password: "", + DB: 0}) + + cityReader, err = geoip2.Open("/usr/local/wtf/GeoIP/ipcity.mmdb") + if err != nil { + log.Fatal(err) + } + + orgReader, err = geoip2.Open("/usr/local/wtf/GeoIP/iporg.mmdb") + if err != nil { + log.Fatal(err) + } + + defer cityReader.Close() + defer orgReader.Close() + + templateHTML, err = template.ParseFiles("/usr/local/wtf/static/html.template") + if err != nil { + log.Fatal(err) + } + templateCleanJSON, err = template.ParseFiles("/usr/local/wtf/static/cleanjson.template") + if err != nil { + log.Fatal(err) + } + templateXML, err = template.ParseFiles("/usr/local/wtf/static/xml.template") + if err != nil { + log.Fatal(err) + } + templateClean, err = template.ParseFiles("/usr/local/wtf/static/clean.template") + if err != nil { + log.Fatal(err) + } + + mdlw := middleware.New(middleware.Config{ + Recorder: metrics.NewRecorder(metrics.Config{}), + }) + + r := mux.NewRouter() + h := middlewarestd.Handler("", mdlw, r) + + r.Host("ipv5.wtfismyip.com").HandlerFunc(ipv5Handler) + r.Host("ipv7.wtfismyip.com").HandlerFunc(ipv5Handler) + r.Host("yaml.myip.wtf").HandlerFunc(yamlHandler) + r.Host("yaml.wtfismyip.com").HandlerFunc(yamlHandler) + r.Host("ipv4.yaml.wtfismyip.com").HandlerFunc(yamlHandler) + r.Host("ipv4.yaml.myip.wtf").HandlerFunc(yamlHandler) + r.Host("yaml.ipv4.wtfismyip.com").HandlerFunc(yamlHandler) + r.Host("yaml.ipv4.myip.wtf").HandlerFunc(yamlHandler) + r.Host("ipv6.yaml.wtfismyip.com").HandlerFunc(yamlHandler) + r.Host("ipv6.yaml.myip.wtf").HandlerFunc(yamlHandler) + r.Host("yaml.ipv6.wtfismyip.com").HandlerFunc(yamlHandler) + r.Host("yaml.ipv6.myip.wtf").HandlerFunc(yamlHandler) + r.Host("text.wtfismyip.com").HandlerFunc(text) + r.Host("text.myip.wtf").HandlerFunc(text) + r.Host("ipv4.text.wtfismyip.com").HandlerFunc(text) + r.Host("ipv4.text.myip.wtf").HandlerFunc(text) + r.Host("text.ipv4.wtfismyip.com").HandlerFunc(text) + r.Host("text.ipv4.myip.wtf").HandlerFunc(text) + r.Host("ipv6.text.wtfismyip.com").HandlerFunc(text) + r.Host("ipv6.text.myip.wtf").HandlerFunc(text) + r.Host("text.ipv6.wtfismyip.com").HandlerFunc(text) + r.Host("text.ipv6.myip.wtf").HandlerFunc(text) + r.Host("json.wtfismyip.com").HandlerFunc(jsonHandler) + r.Host("json.myip.wtf").HandlerFunc(jsonHandler) + r.Host("ipv4.json.wtfismyip.com").HandlerFunc(jsonHandler) + r.Host("ipv4.json.myip.wtf").HandlerFunc(jsonHandler) + r.Host("json.ipv4.wtfismyip.com").HandlerFunc(jsonHandler) + r.Host("json.ipv4.myip.wtf").HandlerFunc(jsonHandler) + r.Host("ipv6.json.wtfismyip.com").HandlerFunc(jsonHandler) + r.Host("ipv6.json.myip.wtf").HandlerFunc(jsonHandler) + r.Host("json.ipv6.wtfismyip.com").HandlerFunc(jsonHandler) + r.Host("json.ipv6.myip.wtf").HandlerFunc(jsonHandler) + r.Host("xml.wtfismyip.com").HandlerFunc(xml) + r.Host("xml.myip.wtf").HandlerFunc(xml) + r.Host("ipv4.xml.wtfismyip.com").HandlerFunc(xml) + r.Host("ipv4.xml.myip.wtf").HandlerFunc(xml) + r.Host("xml.ipv4.wtfismyip.com").HandlerFunc(xml) + r.Host("xml.ipv4.myip.wtf").HandlerFunc(xml) + r.Host("ipv6.xml.wtfismyip.com").HandlerFunc(xml) + r.Host("ipv6.xml.myip.wtf").HandlerFunc(xml) + r.Host("xml.ipv6.wtfismyip.com").HandlerFunc(xml) + r.Host("xml.ipv6.myip.wtf").HandlerFunc(xml) + r.HandleFunc("/", cleanHandle).Host("clean.wtfismyip.com") + r.HandleFunc("/json", cleanjson).Host("clean.wtfismyip.com") + r.HandleFunc("/", cleanHandle).Host("clean.myip.wtf") + r.HandleFunc("/json", cleanjson).Host("clean.myip.wtf") + r.HandleFunc("/", cleanHandle).Host("c.myip.wtf") + r.HandleFunc("/json", cleanjson).Host("c.myip.wtf") + r.HandleFunc("/clean", cleanHandle) + r.HandleFunc("/headers", headers) + r.HandleFunc("/test", test) + r.HandleFunc("/json", jsonHandler) + r.HandleFunc("/yaml", yamlHandler) + r.HandleFunc("/xml", xml) + r.HandleFunc("/text", text) + r.HandleFunc("/text/isp", textisp) + r.HandleFunc("/text/geo", textgeo) + r.HandleFunc("/text/city", textcity) + r.HandleFunc("/text/country", textcountry) + r.HandleFunc("/text/ip", text) + r.HandleFunc("/js", jsHandle) + r.HandleFunc("/jsclean", jscleanHandle) + r.HandleFunc("/js2", js2Handle) + r.HandleFunc("/js2clean", js2cleanHandle) + r.HandleFunc("/clean", cleanHandle) + r.HandleFunc("/church", cleanHandle) + r.HandleFunc("/traffic", trafficHandle) + r.HandleFunc("/omgwtfbbq.png", trafficPngHandle) + r.HandleFunc("/wtf.png", latencyPngHandle) + r.HandleFunc("/.git/config", gitconfigHandle) + r.HandleFunc("/_ignition/health-check/}", healthHandle) + r.HandleFunc("/public/_ignition/health-check/}", healthHandle) + r.HandleFunc("/", wtfHandle).Methods("GET") + r.HandleFunc("/", miscHandle).Methods("POST") + r.HandleFunc("/", miscHandle).Methods("PUT") + r.HandleFunc("/", miscHandle).Methods("DELETE") + r.HandleFunc("/", miscHandle).Methods("TRACE") + r.HandleFunc("/admin", adminHandle) + r.HandleFunc("/administrator", adminHandle) + r.HandleFunc("/metrics", metricsHandle) + r.PathPrefix("/debug/pprof/").HandlerFunc(pprofHandler) + r.HandleFunc("/{foo:.*log$}", miscHandle) + r.HandleFunc("/{foo:.*bak$}", miscHandle) + r.HandleFunc("/{foo:.*swp$}", miscHandle) + r.HandleFunc("/{foo:.*~$}", miscHandle) + r.HandleFunc("/{foo:.*sql$}", sqlHandle) + r.HandleFunc("/{foo:.*zip$}", zipHandle) + r.HandleFunc("/{foo:.*rar$}", rarHandle) + r.HandleFunc("/{foo:.*gz$}", gzHandle) + r.HandleFunc("/{foo:.*ini$}", iniHandle) + r.HandleFunc("/{foo:.*env$}", envHandle) + r.HandleFunc("/{foo:.*php$}", trollHandle) + r.HandleFunc("/{foo:.*asp$}", trollHandle) + r.HandleFunc("/{foo:.*aspx$}", trollHandle) + r.NotFoundHandler = http.HandlerFunc(custom404) + + config := certmagic.NewDefault() + tags := []string{} + config.CacheUnmanagedCertificatePEMFile(context.Background(), "/docker/certs/wtf.cert.pem", "/docker/certs/wtf.key.pem", tags) + tlsConfig := config.TLSConfig() + + srvHTTPS := &http.Server{ + ReadTimeout: 8 * time.Second, + WriteTimeout: 32 * time.Second, + IdleTimeout: 32 * time.Second, + Addr: ":10443", + Handler: h, + TLSConfig: tlsConfig, + } + + srvHTTP := &http.Server{ + ReadTimeout: 8 * time.Second, + WriteTimeout: 16 * time.Second, + IdleTimeout: 16 * time.Second, + Handler: h, + Addr: ":10080", + } + + go srvHTTP.ListenAndServe() + srvHTTPS.ListenAndServeTLS("", "") +} + +func geoData(ip string) (location geoText) { + var isCityPresent bool + + address := net.ParseIP(ip) + isp, err := orgReader.Enterprise(address) + if err != nil { + log.Println(err) + } + + record, err := cityReader.City(address) + if err != nil { + log.Println(err) + } + + if len(record.Subdivisions) > 0 { + location.state = record.Subdivisions[0].IsoCode + } + + location.city, isCityPresent = record.City.Names["en"] + location.country, _ = record.Country.Names["en"] + location.country = strings.Replace(location.country, "Palestinian Territory", "Occupied Palestinian Territory", 1) + location.countryCode = record.Country.IsoCode + + if isCityPresent { + if len(location.state) > 0 { + location.details = location.city + ", " + location.state + ", " + location.country + } else { + location.details = location.city + ", " + location.country + } + } else { + if len(location.country) > 0 { + location.details = location.country + } else { + location.details = "Unknown" + } + } + + if len(location.countryCode) == 0 { + location.countryCode = "Unknown" + } + + location.org = isp.Traits.ISP + return location +} + +var resolver = &net.Resolver{} + +var dnsResolver = &net.Resolver{ + PreferGo: true, + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + d := &net.Dialer{ + Timeout: reverseDNSTimeout, + } + return d.DialContext(ctx, network, address) + }, +} + +func reverseDNS(ctx context.Context, ip string) string { + lookupCtx, cancel := context.WithTimeout(ctx, reverseDNSTimeout) + defer cancel() + + names, err := dnsResolver.LookupAddr(lookupCtx, ip) + if err != nil || len(names) == 0 { + return ip + } + return strings.TrimSuffix(names[0], ".") +} + +func custom404(w http.ResponseWriter, r *http.Request) { + path, _ := securejoin.SecureJoin("/usr/local/wtf/static", filepath.Clean(r.URL.Path)) + contents, err := os.ReadFile(path) + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Write(contents) +} + +func js2Handle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/js2") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(contents) +} + +func js2cleanHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/js2clean") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(contents) +} + +func miscHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/evil.log") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "text/plain") + w.Write(contents) +} + +func sqlHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/evil.sql") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "text/plain") + w.Write(contents) +} + +func zipHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/evil.zip") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "application/zip") + w.Write(contents) +} + +func rarHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/wtf.rar") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "application/rar") + w.Write(contents) +} + +func gzHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/evil.tar.gz") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "application/gzip") + w.Write(contents) +} + +func iniHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/evil.ini") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "text/plain") + w.Write(contents) +} + +func envHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/.env") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "text/plain") + w.Write(contents) +} + +func adminHandle(w http.ResponseWriter, r *http.Request) { + contents, err := os.ReadFile("/usr/local/wtf/static/admin.html") + if err != nil { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "No such fucking page!") + return + } + w.Header().Set("Content-Type", "text/html") + w.Write(contents) +} + +func trollHandle(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html") + fmt.Fprintf(w, "

TROLOLOLOL!

") +} + +// lets add some really rudimentary and shitty IP allowlisting to block access to explicit metrics +func pprofHandler(w http.ResponseWriter, r *http.Request) { + allowlistAddr, _ := rdb.Get(r.Context(), "pprofListAddr").Result() + add := getAddress(r) + if add == allowlistAddr { + http.DefaultServeMux.ServeHTTP(w, r) + } else { + w.WriteHeader(http.StatusForbidden) + w.Write([]byte("sorry dude")) + } +} + +// and let's do it again +func metricsHandle(w http.ResponseWriter, r *http.Request) { + allowlistAddr, _ := rdb.Get(r.Context(), "allowlistAddr").Result() + add := getAddress(r) + if add == allowlistAddr { + promhttp.Handler().ServeHTTP(w, r) + } else { + w.WriteHeader(http.StatusForbidden) + w.Write([]byte("sorry dude")) + } +} + +func cleanjson(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isIPv6 := strings.Contains(add, ":") + isTor, _ := isTorExit(r.Context(), add) + resp := wtfResponse{isIPv6, add, hostname, geo.details, geo.org, geo.countryCode, isTor, false, geo.city, geo.country} + w.Header().Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate") + w.Header().Set("Pragma", "no-cache") + w.Header().Set("Expires", "0") + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + w.Header().Set("X-Fortune", "It's going to be a fucking glorious day") + templateCleanJSON.Execute(w, resp) +} + +func jsonHandler(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isTor, _ := isTorExit(r.Context(), add) + + respData := struct { + YourFuckingIPAddress string `json:"YourFuckingIPAddress"` + YourFuckingLocation string `json:"YourFuckingLocation"` + YourFuckingHostname string `json:"YourFuckingHostname"` + YourFuckingISP string `json:"YourFuckingISP"` + YourFuckingTorExit bool `json:"YourFuckingTorExit"` + YourFuckingCity string `json:"YourFuckingCity"` + YourFuckingCountry string `json:"YourFuckingCountry"` + YourFuckingCountryCode string `json:"YourFuckingCountryCode"` + }{ + YourFuckingIPAddress: add, + YourFuckingLocation: geo.details, + YourFuckingHostname: hostname, + YourFuckingISP: geo.org, + YourFuckingTorExit: isTor, + YourFuckingCity: geo.city, + YourFuckingCountry: geo.country, + YourFuckingCountryCode: geo.countryCode, + } + + w.Header().Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate") + w.Header().Set("Pragma", "no-cache") + w.Header().Set("Expires", "0") + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + w.Header().Set("X-Fortune", "Did you really believe that everyone makes it out?") + encoder := json.NewEncoder(w) + encoder.SetIndent("", " ") + err := encoder.Encode(respData) + if err != nil { + http.Error(w, "Failed to encode JSON response", http.StatusInternalServerError) + return + } +} + +func yamlHandler(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isTor, _ := isTorExit(r.Context(), add) + + respData := struct { + YourFuckingIPAddress string `yaml:"YourFuckingIPAddress"` + YourFuckingLocation string `yaml:"YourFuckingLocation"` + YourFuckingHostname string `yaml:"YourFuckingHostname"` + YourFuckingISP string `yaml:"YourFuckingISP"` + YourFuckingTorExit bool `yaml:"YourFuckingTorExit"` + YourFuckingCity string `yaml:"YourFuckingCity"` + YourFuckingCountry string `yaml:"YourFuckingCountry"` + YourFuckingCountryCode string `yaml:"YourFuckingCountryCode"` + }{ + YourFuckingIPAddress: add, + YourFuckingLocation: geo.details, + YourFuckingHostname: hostname, + YourFuckingISP: geo.org, + YourFuckingTorExit: isTor, + YourFuckingCity: geo.city, + YourFuckingCountry: geo.country, + YourFuckingCountryCode: geo.countryCode, + } + + w.Header().Set("Content-Type", "text/yaml; charset=utf-8") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + w.Header().Set("X-Fortune", "It's going to be a fucking glorious day") + + yamlBytes, err := yaml.Marshal(respData) + if err != nil { + http.Error(w, "Failed to encode YAML response", http.StatusInternalServerError) + return + } + + w.Write(yamlBytes) +} + +func text(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + response := add + "\n" + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + fmt.Fprintf(w, response) +} + +func textisp(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + response := geoData(add).org + "\n" + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + fmt.Fprintf(w, response) +} + +func textgeo(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + response := geoData(add).details + "\n" + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + fmt.Fprintf(w, response) +} + +func textcountry(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + response := geoData(add).countryCode + "\n" + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + fmt.Fprintf(w, response) +} + +func textcity(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + response := geoData(add).city + "\n" + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + fmt.Fprintf(w, response) +} + +func test(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "Yes, the website is fucking running\n") +} + +func jsHandle(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isIPv6 := strings.Contains(add, ":") + if isIPv6 && r.Host == "ipv4.wtfismyip.com" { + w.WriteHeader(http.StatusMisdirectedRequest) + w.Write([]byte("Fucking protocol error")) + } else { + response := "ip='" + add + "';\n" + response += "hostname='" + hostname + "';\n" + response += "geolocation='" + geo.details + "';\n" + response += "document.write('

Your fucking IPv4 address is:

');document.write('

' + ip + '

');document.write('

Your fucking IPv4 hostname is:

');document.write('

' + hostname + '

');document.write('

Geographic location of your fucking IPv4 address:

');document.write('

' + geolocation + '

');" + fmt.Fprintf(w, response) + } +} + +func jscleanHandle(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isIPv6 := strings.Contains(add, ":") + if isIPv6 && r.Host == "ipv4.wtfismyip.com" { + w.WriteHeader(http.StatusMisdirectedRequest) + w.Write([]byte("Fucking protocol error")) + } else { + response := "ip='" + add + "';\n" + response += "hostname='" + hostname + "';\n" + response += "geolocation='" + geo.details + "';\n" + response += "document.write('

Your IPv4 address is:

');document.write('

' + ip + '

');document.write('

Your IPv4 hostname is:

');document.write('

' + hostname + '

');document.write('

Geographic location of your IPv4 address:

');document.write('

' + geolocation + '

');" + fmt.Fprintf(w, response) + } +} + +func xml(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isTor, _ := isTorExit(r.Context(), add) + + respData := struct { + XMLName encodingxml.Name `xml:"wtf"` + YourFuckingIPAddress string `xml:"your-fucking-ip-address"` + YourFuckingLocation string `xml:"your-fucking-location"` + YourFuckingHostname string `xml:"your-fucking-hostname"` + YourFuckingISP string `xml:"your-fucking-isp"` + YourFuckingTorExit bool `xml:"your-fucking-tor-exit"` + YourFuckingCity string `xml:"your-fucking-city"` + YourFuckingCountry string `xml:"your-fucking-country"` + YourFuckingCountryCode string `xml:"your-fucking-country-code"` + }{ + YourFuckingIPAddress: add, + YourFuckingLocation: geo.details, + YourFuckingHostname: hostname, + YourFuckingISP: geo.org, + YourFuckingTorExit: isTor, + YourFuckingCity: geo.city, + YourFuckingCountry: geo.country, + YourFuckingCountryCode: geo.countryCode, + } + + xmlBytes, err := encodingxml.MarshalIndent(respData, "", " ") + if err != nil { + http.Error(w, "Failed to encode XML response", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/xml; charset=utf-8") + w.Header().Set("X-Fortune", "It's going to be a fucking glorious day") + w.Write(xmlBytes) + w.Write([]byte("\n")) +} + +func cleanHandle(w http.ResponseWriter, r *http.Request) { + add := getAddress(r) + isIPv6 := strings.Contains(add, ":") + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isTor, _ := isTorExit(r.Context(), add) + myipwtf := false + lowHost := strings.ToLower(r.Host) + myipwtf = strings.HasSuffix(lowHost, "myip.wtf") + resp := wtfResponse{isIPv6, add, hostname, geo.details, geo.org, geo.countryCode, isTor, myipwtf, geo.city, geo.country} + templateClean.Execute(w, resp) +} + +func wtfHandle(w http.ResponseWriter, r *http.Request) { + // Changing respones based on User-Agent surely must violate some fucking RFC + if strings.HasPrefix(r.Header.Get("user-agent"), "curl") || strings.HasPrefix(r.Header.Get("user-agent"), "HTTPie") { + w.Header().Set("X-Comment", "You got here because your User-Agent is curl") + text(w, r) + } else { + add := getAddress(r) + isIPv6 := strings.Contains(add, ":") + hostname := reverseDNS(r.Context(), add) + geo := geoData(add) + isTor, _ := isTorExit(r.Context(), add) + myipwtf := false + lowHost := strings.ToLower(r.Host) + myipwtf = strings.HasSuffix(lowHost, "myip.wtf") + resp := wtfResponse{isIPv6, add, hostname, geo.details, geo.org, geo.countryCode, isTor, myipwtf, geo.city, geo.country} + if r.TLS == nil { + if myipwtf { + http.Redirect(w, r, "https://myip.wtf/", 301) + } else { + http.Redirect(w, r, "https://wtfismyip.com/", 301) + } + } else { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("X-Hire-Me", "clint@wtfismyip.com") + w.Header().Set("X-Frame-Options", "DENY") + w.Header().Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate") + w.Header().Set("Pragma", "no-cache") + w.Header().Set("Expires", "0") + w.Header().Set("X-OMGWTF", "BBQ") + w.Header().Set("X-XSS-Protection", "1; mode=block") + w.Header().Set("X-Content-Type-Options", "nosniff") + w.Header().Set("Content-Security-Policy", "default-src 'none'; img-src wtfismyip.com myip.wtf; script-src ipv4.wtfismyip.com wtfismyip.com myip.wtf ipv4.myip.wtf; style-src 'unsafe-inline'") + w.Header().Set("X-DNS-Prefetch-Control", "off") + w.Header().Set("Referrer-Policy", "no-referrer") + w.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains; preload") + w.Header().Set("X-Did-I-Set-Too-Many-Fucking-Headers", "Yes. I just wanted a fucking A from securityheaders.io.") + templateHTML.Execute(w, resp) + } + } +} + +func headers(w http.ResponseWriter, r *http.Request) { + var response string + for name, val := range r.Header { + response += name + ": " + val[0] + "\n" + } + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, response) +} + +func ipv5Handler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "No such fucking protocol") +} + +func healthHandle(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "I am healthy, motherfucker!") +} + +func trafficHandle(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate") + w.Header().Set("Pragma", "no-cache") + w.Header().Set("Expires", "0") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET") + fmt.Fprintf(w, "

") +} + +func gitconfigHandle(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "[user]\n\tname = wtfismyip\n\temail = wtfismyip@nsa.gov\n\n[github]\n\tuser = wtfismyip\n\ttoken = lmfaotrolololo") +} + +func trafficPngHandle(w http.ResponseWriter, r *http.Request) { + content, err := os.ReadFile("/usr/local/tmp/omgwtfbbq.png") + if err != nil { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "Fucking Error: %s", err) + return + } + w.Header().Set("Content-Type", "image/png") + w.Write([]byte(content)) +} + +func latencyPngHandle(w http.ResponseWriter, r *http.Request) { + content, err := os.ReadFile("/usr/local/tmp/wtf.png") + if err != nil { + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "Fucking Error: %s", err) + return + } + w.Header().Set("Content-Type", "image/png") + w.Write([]byte(content)) +} + +func getAddress(r *http.Request) (ip string) { + if xffMode { + ip = r.Header.Get("X-Forwarded-For") + return + } + ip, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return "0.0.0.0" + } + return +} + +func isTorExit(ctx context.Context, ip string) (bool, string) { + val, _ := rdb.Get(ctx, ip).Result() + + if val == "exit" { + return true, val + } + return false, val +}