63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
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)
|
|
}
|