add CLI command to create a new card, fixes #1
This commit is contained in:
parent
efeb32b09f
commit
136d8db799
10 changed files with 240 additions and 5 deletions
76
createboltcard/database.go
Normal file
76
createboltcard/database.go
Normal 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
51
createboltcard/main.go
Normal 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))
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue