package main import ( "crypto/rand" "database/sql" "fmt" "log" "math/big" ) const createPinTableSql = `CREATE TABLE IF NOT EXISTS pin ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "pin" STRING NOT NULL, "active" BOOLEAN DEFAULT TRUE, "createdAt" DATETIME NOT NULL DEFAULT (datetime('now','localtime')), )` const createPeerTableSql = `CREATE TABLE IF NOT EXISTS peer ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "publicKey" STRING NOT NULL, "createdAt" DATETIME NOT NULL DEFAULT (datetime('now','localtime')), )` func InitDb() *sql.DB { db, err := sql.Open("sqlite3", "./sqlite-database.db") _, err = db.Exec(createPinTableSql) if err != nil { log.Fatal(err.Error()) } _, err = db.Exec(createPeerTableSql) if err != nil { log.Fatal(err.Error()) } return db } func NewPin(db *sql.DB) (string, error) { pin := randomPin() _, err := db.Exec(`INSERT INTO PIN pin = ?`, pin) if err != nil { return "", err } return pin, nil } func VerifyPin(db *sql.DB, pin string) bool { row := db.QueryRow(`SELECT EXISTS (SELECT 1 FROM pin WHERE pin = ? AND active = True)`, pin) var exists bool row.Scan(&exists) return exists } func randomPin() string { num, _ := rand.Int(rand.Reader, big.NewInt(999999+1)) return fmt.Sprintf("%06d", num) }