add CLI command to create a new card, fixes #1

This commit is contained in:
Peter Rounce 2022-08-04 15:06:01 +00:00
parent efeb32b09f
commit 136d8db799
10 changed files with 240 additions and 5 deletions

View file

@ -0,0 +1,76 @@
package main
import (
"database/sql"
"errors"
"fmt"
_ "github.com/lib/pq"
"os"
)
func db_open() (*sql.DB, error) {
// get connection string from environment variables
conn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
os.Getenv("DB_HOST"),
os.Getenv("DB_PORT"),
os.Getenv("DB_USER"),
os.Getenv("DB_PASSWORD"),
os.Getenv("DB_NAME"))
db, err := sql.Open("postgres", conn)
if err != nil {
return db, err
}
return db, nil
}
func db_delete_expired() error {
db, err := db_open()
if err != nil {
return err
}
defer db.Close()
// delete expired one time code records
sqlStatement := `DELETE FROM cards WHERE one_time_code_expiry < NOW() AND one_time_code_used = 'N';`
_, err = db.Exec(sqlStatement)
if err != nil {
return err
}
return nil
}
func db_insert_card(one_time_code string, lock_key string, aes_cmac string) error {
db, err := db_open()
if err != nil {
return err
}
defer db.Close()
// insert a new record into cards
sqlStatement := `INSERT INTO cards` +
` (one_time_code, lock_key, aes_cmac, uid, last_counter_value,` +
` lnurlw_request_timeout_sec, tx_limit_sats, day_limit_sats, one_time_code_used)` +
` VALUES ($1, $2, $3, '', 0, 60, 1000, 10000, 'N');`
res, err := db.Exec(sqlStatement, one_time_code, lock_key, aes_cmac)
if err != nil {
return err
}
count, err := res.RowsAffected()
if err != nil {
return err
}
if count != 1 {
return errors.New("not one card record inserted")
}
return nil
}

51
createboltcard/main.go Normal file
View file

@ -0,0 +1,51 @@
package main
import (
"crypto/rand"
"encoding/hex"
"fmt"
log "github.com/sirupsen/logrus"
qrcode "github.com/skip2/go-qrcode"
"os"
)
func random_hex() string {
b := make([]byte, 16)
_, err := rand.Read(b)
if err != nil {
log.Warn(err.Error())
return ""
}
return hex.EncodeToString(b)
}
func main() {
one_time_code := random_hex()
lock_key := random_hex()
aes_cmac := random_hex()
// create the new card record
err := db_insert_card(one_time_code, lock_key, aes_cmac)
if err != nil {
log.Warn(err.Error())
return
}
// remove any expired records
err = db_delete_expired()
if err != nil {
log.Warn(err.Error())
return
}
// show a QR code on the console for the URI + one_time_code
hostdomain := os.Getenv("HOST_DOMAIN")
url := "https://" + hostdomain + "/new?a=" + one_time_code
fmt.Println(url)
q, err := qrcode.New(url, qrcode.Medium)
fmt.Println(q.ToSmallString(false))
}