Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
chore: update SecListPath in build_tables.go script

chore: Refactor build_tables.go script to read and print file contents

chore: Update build_tables.go script to create rainbow tables from SecList

chore: Refactor build_tables.go script to use filepath.Join for file paths

chore: Update README.md to remove unused wordlist link

initial commit frontend

chore: Add PassInput component to Home page

chore: Update build_tables.go script to create rainbow tables from multiple sources

lolazo bailemos

chore: Remove unused files and code from frontend/passcheck

chore: Update file paths in frontend configuration files

chore: Add RequestBody and ResponseBody structs to backend

chore: Remove unused files and code from frontend/passcheck

chore: Add logging middleware and implement request processing in main.go

chore: Refactor main.go to search for hash in multiple files

chore: Improve search performance by implementing concurrent file scanning

chore: Implement concurrent file scanning for improved search performance

chore: Update go.mod and go.sum with indirect dependency on github.com/google/re2

chore: Update main.go to use GET method for hash validation

chore: Remove unused RequestBody struct from backend

chore: Add API tests for hash validation endpoint

clean cache for pycache

test: Add API tests for hash validation and improve file scanning performance

chore: Remove tables from repo and update file scanning performance

chore: Remove lfs

chore: Add script to clone SecLists repository

chore: Update README with WIP notice and pending improvements

chore: Update get_repos.sh script to build tables and check for minimum number of .txt files in tables folder

drop svelt for vue

chore: Add CORS middleware to backend and update frontend dependencies

now's vuetifyjs

chore: Update password field label in HelloWorld.vue component

chore: Update password field label in HelloWorld.vue component

chore: Update password field label in HelloWorld.vue component

chore: Update page title and logo

chore: Add password checker description in HelloWorld.vue component

ip

chore: Update npm dependencies for password checker feature

chore: Update npm dependencies for password checker feature

feat: Add password hashing and API call in HelloWorld.vue component

format

refactor: Update HelloWorld.vue component to display list of files checked

feat: Add Vue Router components to GlobalComponents in components.d.ts

refactor: Update server.js to serve static files and handle SPA routing

refactor: Update server.js to serve static files and handle SPA routing

wip

copy tables folder

wip

wip

wip

wip

move scripts, sources and tables to backend folder

Move get_repos.sh to backend folder and update references

refactor: Move get_repos.sh, scripts, sources, and tables to backend folder

Move get_repos.sh to backend folder and update references

Move get_repos.sh to backend folder and update references

wip

wip

wip

Move get_repos.sh, scripts, sources, and tables to backend folder

Move get_repos.sh, scripts, sources, and tables to backend folder

Move get_repos.sh, scripts, sources, and tables to backend folder

refactor: Move get_repos.sh, scripts, sources, and tables to backend folder

refactor: Move get_repos.sh, scripts, sources, and tables to backend folder

wip

add nohup to go run

wip

wip

chore: Update build_backend.yml to separate commands for go get and go run

chore: Update tablesPath constant in main.go to use relative path "./tables" instead of "../tables"

wip

chore: Update Dockerfile to build a smaller final image with Alpine Linux and set GIN_MODE to release

chore: Update Dockerfile to build a smaller final image with Alpine Linux and set GIN_MODE to release

chore: Remove backend folder and update Dockerfile to remove unnecessary commands

chore: Remove backend folder and update Dockerfile to remove unnecessary commands

chore: Set DOCKER_BUILDKIT=1 in run_backend.sh script

chore: Refactor Dockerfile to optimize image size and remove unnecessary commands

chore: Optimize Dockerfile for frontend, build smaller image with Alpine Linux and lazy load images

chore: Update Dockerfile to remove backend folder and optimize image size

chore: Update Dockerfile to fix port mapping for frontend container

chore: Update API endpoint to use HTTPS in HelloWorld.vue

chore: Update main.go to use CORSMiddleware in router

chore: Optimize Dockerfile for backend, build smaller image with Alpine Linux

chore: Update CORS middleware to allow requests from specific origin

chore: Update build_backend.yml to remove unnecessary commands and optimize file paths
  • Loading branch information
nilgaar committed Jul 20, 2024
1 parent db10235 commit c26ea8f
Show file tree
Hide file tree
Showing 45 changed files with 3,817 additions and 0 deletions.
28 changes: 28 additions & 0 deletions .github/workflows/build_backend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Build Backend

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Upload and run Backend
run: |
sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USERNAME@$SERVER_IP "sudo rm -rf /home/$USERNAME/*"
sshpass -p $PASSWORD sftp -o StrictHostKeyChecking=no $USERNAME@$SERVER_IP <<EOF
put -r ./backend
bye
EOF
sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USERNAME@$SERVER_IP "bash ~/backend/get_repos.sh"
sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USERNAME@$SERVER_IP "cd ~/backend && bash run_backend.sh"
env:
SERVER_IP: ${{ secrets.SERVER_IP }}
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,9 @@
# Go workspace file
go.work
go.work.sum
backend/sources/SecLists
backend/tables/*.txt
backend/tables/*.csv
backend/tables/*.txt
backend/tables/*.csv
backend/web-service-gin
4 changes: 4 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"tabWidth": 2,
"useTabs": false
}
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
[![Build Backend](https://github.com/nilgaar/PassCheck/actions/workflows/build_backend.yml/badge.svg)](https://github.com/nilgaar/PassCheck/actions/workflows/build_backend.yml)

# PassCheck

Check if your password is present in any popular wordlist

### Wordlist in use:

[SecList, all Common-Credentials](https://github.com/danielmiessler/SecLists/tree/master/Passwords/Common-Credentials)

### Pending Improvements:

1. Dynamically download the wordlist, now the download is hardcoded at `get_repos.sh`
2 changes: 2 additions & 0 deletions backend/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
npm-debug.log
27 changes: 27 additions & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
FROM golang:1.18 AS builder

WORKDIR /app

COPY go.mod go.sum ./

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

FROM alpine:latest

WORKDIR /root/

RUN apk --no-cache add ca-certificates

COPY --from=builder /app/main .

COPY --from=builder /app/tables ./tables

EXPOSE 8080

ENV GIN_MODE=release

CMD ["./main"]
32 changes: 32 additions & 0 deletions backend/cors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package main

import (
"strings"

"github.com/gin-gonic/gin"
)

func CORSMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
origin := c.GetHeader("Origin")

if strings.HasSuffix(origin, ".pops.cafe") {
c.Writer.Header().Set("Access-Control-Allow-Origin", origin)
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")

if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
} else {
// Optionally handle requests from disallowed origins
c.JSON(403, gin.H{"error": "Access not allowed"})
c.Abort()
return
}

c.Next()
}
}
13 changes: 13 additions & 0 deletions backend/get_repos.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#! /bin/bash

cd ./backend/sources
git clone --depth 1 https://github.com/danielmiessler/SecLists.git
cd ../scripts

go clean
go run build_tables.go

if [ $(ls ../tables/*.txt | wc -l) -lt 10 ]; then
echo "Error: less than 10 .txt files in tables folder"
exit 1
fi
35 changes: 35 additions & 0 deletions backend/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module example/web-service-gin

go 1.23

require github.com/gin-gonic/gin v1.10.0

require (
github.com/bytedance/sonic v1.11.6 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/google/re2 v0.0.0-20240621200418-6144b62bece5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
google.golang.org/protobuf v1.34.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
81 changes: 81 additions & 0 deletions backend/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/re2 v0.0.0-20240621200418-6144b62bece5 h1:L8wTPkAu21Qy/4O7dNgmFDRD76YMnrv7wsbJN6NJD1w=
github.com/google/re2 v0.0.0-20240621200418-6144b62bece5/go.mod h1:ZlBvb65OZwjnLV/l4B1HGCxZXoW40tN1siMMczg4kog=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
108 changes: 108 additions & 0 deletions backend/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package main

import (
"bufio"
"fmt"
"net/http"
"os"
"path/filepath"
"strings"
"sync"

"regexp"

"github.com/gin-gonic/gin"
)

type RequestBody struct {
Data string `json:"hash" binding:"required"`
}

func main() {
const Sha3Regex = `^([0-9a-fA-F]{128})$`
router := gin.Default()
gin.SetMode(gin.ReleaseMode)
router.Use(CORSMiddleware())

router.Use(gin.Logger())

router.GET("/", func(c *gin.Context) {

hash := c.Query("hash")
if hash == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "Missing hash parameter"})
return
}
if ok, _ := regexp.MatchString(Sha3Regex, hash); !ok {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid hash format"})
return
}

c.JSON(http.StatusOK, gin.H{"data": processRequest(RequestBody{Data: hash})})

})

router.Run(":8080")
}

func processRequest(requestBody RequestBody) string {

result := searchHash(requestBody.Data)
if len(result) == 0 {
return "No matches found"
}

return strings.Join(searchHash(requestBody.Data), ", ")
}

func searchHash(hash string) []string {
const tablesPath = "./tables"
files, err := os.ReadDir(tablesPath)
if err != nil {
fmt.Printf("Error reading directory: %v\n", err)
return nil
}

var wg sync.WaitGroup
resultsChan := make(chan string, len(files))
results := []string{}

for _, file := range files {
if !file.IsDir() {
wg.Add(1)
go func(file os.DirEntry) {
defer wg.Done()
filePath := filepath.Join(tablesPath, file.Name())
f, err := os.Open(filePath)
if err != nil {
fmt.Printf("Error opening file %s: %v\n", file.Name(), err)
return
}
defer f.Close()

scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, hash) {
resultsChan <- file.Name()
break
}
}
if err := scanner.Err(); err != nil {
fmt.Printf("Error reading file %s: %v\n", file.Name(), err)
}
}(file)
}
}

go func() {
wg.Wait()
close(resultsChan)
}()

for fileName := range resultsChan {
results = append(results, fileName)
}

return results
}
5 changes: 5 additions & 0 deletions backend/response_body.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package main

type ResponseBody struct {
Matches []string
}
20 changes: 20 additions & 0 deletions backend/run_backend.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/bin/bash
export DOCKER_BUILDKIT=1

# Name of your Docker application
APP_NAME="go-app"

# Stop the currently running container
docker stop $APP_NAME

# Remove the stopped container
docker rm $APP_NAME

# Build the new Docker image
docker build -t $APP_NAME .

# Run the new Docker container
docker run -d --name $APP_NAME -p 8080:8080 $APP_NAME

cd ..
rm -rf ./frontend
Loading

0 comments on commit c26ea8f

Please sign in to comment.