diff --git a/createboltcard.go b/createboltcard.go index 59bd7b2..42a9784 100644 --- a/createboltcard.go +++ b/createboltcard.go @@ -7,6 +7,8 @@ import ( "net/http" "strconv" "strings" + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" ) func random_hex() string { @@ -21,10 +23,10 @@ func random_hex() string { } func createboltcard(w http.ResponseWriter, r *http.Request) { - if db_get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { + if db.Get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { msg := "createboltcard: internal API function is not enabled" log.Debug(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } @@ -33,7 +35,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { if err != nil { msg := "createboltcard: tx_max is not a valid integer" log.Warn(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } @@ -42,7 +44,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { if err != nil { msg := "createboltcard: day_max is not a valid integer" log.Warn(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } @@ -51,7 +53,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { if err != nil { msg := "createboltcard: enable is not a valid boolean" log.Warn(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } @@ -62,7 +64,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { if err != nil { msg := "createboltcard: uid_privacy is not a valid boolean" log.Warn(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } @@ -71,13 +73,13 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { if err != nil { msg := "createboltcard: allow_neg_bal is not a valid boolean" log.Warn(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } // check if card_name already exists - card_count, err := db_get_card_name_count(card_name) + card_count, err := db.Get_card_name_count(card_name) if err != nil { log.Warn(err.Error()) return @@ -86,7 +88,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { if card_count > 0 { msg := "createboltcard: the card name already exists in the database" log.Warn(msg) - write_error_message(w, msg) + resp_err.Write_message(w, msg) return } @@ -107,7 +109,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { // create the new card record - err = db_insert_card(one_time_code, k0_auth_key, k2_cmac_key, k3, k4, + err = db.Insert_card(one_time_code, k0_auth_key, k2_cmac_key, k3, k4, tx_max, day_max, enable_flag, card_name, uid_privacy_flag, allow_neg_bal_flag) if err != nil { @@ -117,7 +119,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { // return the URI + one_time_code - hostdomain := db_get_setting("HOST_DOMAIN") + hostdomain := db.Get_setting("HOST_DOMAIN") url := "" if strings.HasSuffix(hostdomain, ".onion") { url = "http://" + hostdomain + "/new?a=" + one_time_code diff --git a/crypto.go b/crypto/crypto.go similarity index 83% rename from crypto.go rename to crypto/crypto.go index 23ed884..1555c00 100644 --- a/crypto.go +++ b/crypto/crypto.go @@ -1,4 +1,4 @@ -package main +package crypto import ( "bytes" @@ -9,7 +9,7 @@ import ( "github.com/aead/cmac" ) -func create_k1() (string, error) { +func Create_k1() (string, error) { // 16 bytes = 128 bits b := make([]byte, 16) @@ -24,7 +24,7 @@ func create_k1() (string, error) { } // decrypt p with aes_dec -func crypto_aes_decrypt(key_sdm_file_read []byte, ba_p []byte) ([]byte, error) { +func Aes_decrypt(key_sdm_file_read []byte, ba_p []byte) ([]byte, error) { dec_p := make([]byte, 16) iv := make([]byte, 16) @@ -38,7 +38,7 @@ func crypto_aes_decrypt(key_sdm_file_read []byte, ba_p []byte) ([]byte, error) { return dec_p, nil } -func crypto_aes_cmac(key_sdm_file_read_mac []byte, sv2 []byte, ba_c []byte) (bool, error) { +func Aes_cmac(key_sdm_file_read_mac []byte, sv2 []byte, ba_c []byte) (bool, error) { c2, err := aes.NewCipher(key_sdm_file_read_mac) if err != nil { diff --git a/database.go b/db/db.go similarity index 75% rename from database.go rename to db/db.go index 47d7052..5a98c21 100644 --- a/database.go +++ b/db/db.go @@ -1,4 +1,4 @@ -package main +package db import ( "database/sql" @@ -8,45 +8,55 @@ import ( "os" ) -type card struct { - card_id int - card_guid string - k0_auth_key string - k1_decrypt_key string - k2_cmac_key string - k3 string - k4 string - db_uid string - last_counter_value uint32 - lnurlw_request_timeout_sec int - lnurlw_enable string - tx_limit_sats int - day_limit_sats int - lnurlp_enable string - email_address string - email_enable string - uid_privacy string - one_time_code string - card_name string - allow_negative_balance string +type Card struct { + Card_id int + Card_guid string + K0_auth_key string + K1_decrypt_key string + K2_cmac_key string + K3 string + K4 string + Db_uid string + Last_counter_value uint32 + Lnurlw_request_timeout_sec int + Lnurlw_enable string + Tx_limit_sats int + Day_limit_sats int + Lnurlp_enable string + Email_address string + Email_enable string + Uid_privacy string + One_time_code string + Card_name string + Allow_negative_balance string } -type payment struct { - card_payment_id int - card_id int - lnurlw_k1 string - paid_flag string +type Payment struct { + Card_payment_id int + Card_id int + Lnurlw_k1 string + Paid_flag string } -type transaction struct { - card_id int - tx_id int - tx_type string - tx_amount_msats int - tx_time string +type Transaction struct { + Card_id int + Tx_id int + Tx_type string + Tx_amount_msats int + Tx_time string } -func db_open() (*sql.DB, error) { +type Card_wipe_info struct { + Id int + K0 string + K1 string + K2 string + K3 string + K4 string + Uid string +} + +func open() (*sql.DB, error) { // get connection string from environment variables @@ -65,11 +75,11 @@ func db_open() (*sql.DB, error) { return db, nil } -func db_get_setting(setting_name string) string { +func Get_setting(setting_name string) string { setting_value := "" - db, err := db_open() + db, err := open() if err != nil { return "" } @@ -86,11 +96,11 @@ func db_get_setting(setting_name string) string { return setting_value } -func db_get_new_card(one_time_code string) (*card, error) { +func Get_new_card(one_time_code string) (*Card, error) { - c := card{} + c := Card{} - db, err := db_open() + db, err := open() if err != nil { return &c, err } @@ -101,12 +111,12 @@ func db_get_new_card(one_time_code string) (*card, error) { ` one_time_code_expiry > NOW() AND one_time_code_used = 'N' AND wiped = 'N';` row := db.QueryRow(sqlStatement, one_time_code) err = row.Scan( - &c.k0_auth_key, - &c.k2_cmac_key, - &c.k3, - &c.k4, - &c.card_name, - &c.uid_privacy) + &c.K0_auth_key, + &c.K2_cmac_key, + &c.K3, + &c.K4, + &c.Card_name, + &c.Uid_privacy) if err != nil { return &c, err } @@ -120,11 +130,11 @@ func db_get_new_card(one_time_code string) (*card, error) { return &c, nil } -func db_get_card_count_for_uid(uid string) (int, error) { +func Get_card_count_for_uid(uid string) (int, error) { card_count := 0 - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -141,11 +151,11 @@ func db_get_card_count_for_uid(uid string) (int, error) { return card_count, nil } -func db_get_card_count_for_name_lnurlp(name string) (int, error) { +func Get_card_count_for_name_lnurlp(name string) (int, error) { card_count := 0 - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -162,11 +172,11 @@ func db_get_card_count_for_name_lnurlp(name string) (int, error) { return card_count, nil } -func db_get_card_id_for_name(name string) (int, error) { +func Get_card_id_for_name(name string) (int, error) { card_id := 0 - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -183,10 +193,10 @@ func db_get_card_id_for_name(name string) (int, error) { return card_id, nil } -func db_get_card_id_for_card_payment_id(card_payment_id int) (int, error) { +func Get_card_id_for_card_payment_id(card_payment_id int) (int, error) { card_id := 0 - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -203,10 +213,10 @@ func db_get_card_id_for_card_payment_id(card_payment_id int) (int, error) { return card_id, nil } -func db_get_card_id_for_r_hash(r_hash string) (int, error) { +func Get_card_id_for_r_hash(r_hash string) (int, error) { card_id := 0 - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -223,11 +233,11 @@ func db_get_card_id_for_r_hash(r_hash string) (int, error) { return card_id, nil } -func db_get_cards_blank_uid() ([]card, error) { +func Get_cards_blank_uid() ([]Card, error) { // open the database - db, err := db_open() + db, err := open() if err != nil { return nil, err @@ -249,12 +259,12 @@ func db_get_cards_blank_uid() ([]card, error) { // prepare the results - var cards []card + var cards []Card // Loop through rows, using Scan to assign column data to struct fields. for rows.Next() { - var c card - err := rows.Scan(&c.card_id, &c.k2_cmac_key) + var c Card + err := rows.Scan(&c.Card_id, &c.K2_cmac_key) if err != nil { return cards, err @@ -271,8 +281,8 @@ func db_get_cards_blank_uid() ([]card, error) { return cards, nil } -func db_update_card_uid_ctr(card_id int, uid string, ctr uint32) error { - db, err := db_open() +func Update_card_uid_ctr(card_id int, uid string, ctr uint32) error { + db, err := open() if err != nil { return err } @@ -294,11 +304,11 @@ func db_update_card_uid_ctr(card_id int, uid string, ctr uint32) error { return nil } -func db_get_card_from_uid(card_uid string) (*card, error) { +func Get_card_from_uid(card_uid string) (*Card, error) { - c := card{} + c := Card{} - db, err := db_open() + db, err := open() if err != nil { return &c, err } @@ -310,14 +320,14 @@ func db_get_card_from_uid(card_uid string) (*card, error) { ` FROM cards WHERE uid=$1 AND wiped='N';` row := db.QueryRow(sqlStatement, card_uid) err = row.Scan( - &c.card_id, - &c.k2_cmac_key, - &c.db_uid, - &c.last_counter_value, - &c.lnurlw_request_timeout_sec, - &c.lnurlw_enable, - &c.tx_limit_sats, - &c.day_limit_sats) + &c.Card_id, + &c.K2_cmac_key, + &c.Db_uid, + &c.Last_counter_value, + &c.Lnurlw_request_timeout_sec, + &c.Lnurlw_enable, + &c.Tx_limit_sats, + &c.Day_limit_sats) if err != nil { return &c, err } @@ -325,11 +335,11 @@ func db_get_card_from_uid(card_uid string) (*card, error) { return &c, nil } -func db_get_card_from_card_id(card_id int) (*card, error) { +func Get_card_from_card_id(card_id int) (*Card, error) { - c := card{} + c := Card{} - db, err := db_open() + db, err := open() if err != nil { return &c, err } @@ -342,18 +352,18 @@ func db_get_card_from_card_id(card_id int) (*card, error) { `allow_negative_balance FROM cards WHERE card_id=$1;` row := db.QueryRow(sqlStatement, card_id) err = row.Scan( - &c.card_id, - &c.k2_cmac_key, - &c.db_uid, - &c.last_counter_value, - &c.lnurlw_request_timeout_sec, - &c.lnurlw_enable, - &c.tx_limit_sats, - &c.day_limit_sats, - &c.email_enable, - &c.email_address, - &c.card_name, - &c.allow_negative_balance) + &c.Card_id, + &c.K2_cmac_key, + &c.Db_uid, + &c.Last_counter_value, + &c.Lnurlw_request_timeout_sec, + &c.Lnurlw_enable, + &c.Tx_limit_sats, + &c.Day_limit_sats, + &c.Email_enable, + &c.Email_address, + &c.Card_name, + &c.Allow_negative_balance) if err != nil { return &c, err } @@ -361,9 +371,9 @@ func db_get_card_from_card_id(card_id int) (*card, error) { return &c, nil } -func db_check_lnurlw_timeout(card_payment_id int) (bool, error) { +func Check_lnurlw_timeout(card_payment_id int) (bool, error) { - db, err := db_open() + db, err := open() if err != nil { return true, err } @@ -383,9 +393,9 @@ func db_check_lnurlw_timeout(card_payment_id int) (bool, error) { return lnurlw_timeout, nil } -func db_check_and_update_counter(card_id int, new_counter_value uint32) (bool, error) { +func Check_and_update_counter(card_id int, new_counter_value uint32) (bool, error) { - db, err := db_open() + db, err := open() if err != nil { return false, err } @@ -408,9 +418,9 @@ func db_check_and_update_counter(card_id int, new_counter_value uint32) (bool, e return true, nil } -func db_insert_payment(card_id int, lnurlw_k1 string) error { +func Insert_payment(card_id int, lnurlw_k1 string) error { - db, err := db_open() + db, err := open() if err != nil { return err } @@ -436,13 +446,13 @@ func db_insert_payment(card_id int, lnurlw_k1 string) error { return nil } -func db_insert_receipt( +func Insert_receipt( card_id int, ln_invoice string, r_hash_hex string, amount_msat int64) error { - db, err := db_open() + db, err := open() if err != nil { return err } @@ -468,8 +478,8 @@ func db_insert_receipt( return nil } -func db_update_receipt_state(r_hash_hex string, invoice_state string) error { - db, err := db_open() +func Update_receipt_state(r_hash_hex string, invoice_state string) error { + db, err := open() if err != nil { return err } @@ -493,10 +503,10 @@ func db_update_receipt_state(r_hash_hex string, invoice_state string) error { return nil } -func db_get_payment_k1(lnurlw_k1 string) (*payment, error) { - p := payment{} +func Get_payment_k1(lnurlw_k1 string) (*Payment, error) { + p := Payment{} - db, err := db_open() + db, err := open() if err != nil { return &p, err } @@ -506,9 +516,9 @@ func db_get_payment_k1(lnurlw_k1 string) (*payment, error) { ` FROM card_payments WHERE lnurlw_k1=$1;` row := db.QueryRow(sqlStatement, lnurlw_k1) err = row.Scan( - &p.card_payment_id, - &p.card_id, - &p.paid_flag) + &p.Card_payment_id, + &p.Card_id, + &p.Paid_flag) if err != nil { return &p, err } @@ -516,9 +526,9 @@ func db_get_payment_k1(lnurlw_k1 string) (*payment, error) { return &p, nil } -func db_update_payment_invoice(card_payment_id int, ln_invoice string, amount_msats int64) error { +func Update_payment_invoice(card_payment_id int, ln_invoice string, amount_msats int64) error { - db, err := db_open() + db, err := open() if err != nil { return err } @@ -540,9 +550,9 @@ func db_update_payment_invoice(card_payment_id int, ln_invoice string, amount_ms return nil } -func db_update_payment_paid(card_payment_id int) error { +func Update_payment_paid(card_payment_id int) error { - db, err := db_open() + db, err := open() if err != nil { return err } @@ -564,9 +574,9 @@ func db_update_payment_paid(card_payment_id int) error { return nil } -func db_update_payment_status(card_payment_id int, payment_status string, failure_reason string) error { +func Update_payment_status(card_payment_id int, payment_status string, failure_reason string) error { - db, err := db_open() + db, err := open() if err != nil { return err @@ -596,9 +606,9 @@ func db_update_payment_status(card_payment_id int, payment_status string, failur return nil } -func db_get_card_totals(card_id int) (int, error) { +func Get_card_totals(card_id int) (int, error) { - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -620,10 +630,10 @@ func db_get_card_totals(card_id int) (int, error) { return day_total_sats, nil } -func db_get_card_txs(card_id int, max_txs int) ([]transaction, error) { +func Get_card_txs(card_id int, max_txs int) ([]Transaction, error) { // open the database - db, err := db_open() + db, err := open() if err != nil { return nil, err @@ -655,12 +665,12 @@ func db_get_card_txs(card_id int, max_txs int) ([]transaction, error) { // prepare the results - var transactions []transaction + var transactions []Transaction // Loop through rows, using Scan to assign column data to struct fields. for rows.Next() { - var t transaction - err := rows.Scan(&t.card_id, &t.tx_id, &t.tx_type, &t.tx_amount_msats, &t.tx_time) + var t Transaction + err := rows.Scan(&t.Card_id, &t.Tx_id, &t.Tx_type, &t.Tx_amount_msats, &t.Tx_time) if err != nil { return transactions, err @@ -677,9 +687,9 @@ func db_get_card_txs(card_id int, max_txs int) ([]transaction, error) { return transactions, nil } -func db_get_card_total_sats(card_id int) (int, error) { +func Get_card_total_sats(card_id int) (int, error) { - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -707,11 +717,11 @@ func db_get_card_total_sats(card_id int) (int, error) { return card_total_sats, nil } -func db_get_card_name_count(card_name string) (card_count int, err error) { +func Get_card_name_count(card_name string) (card_count int, err error) { card_count = 0 - db, err := db_open() + db, err := open() if err != nil { return 0, err } @@ -728,7 +738,7 @@ func db_get_card_name_count(card_name string) (card_count int, err error) { return card_count, nil } -func db_insert_card(one_time_code string, k0_auth_key string, k2_cmac_key string, k3 string, k4 string, +func Insert_card(one_time_code string, k0_auth_key string, k2_cmac_key string, k3 string, k4 string, tx_max_sats int, day_max_sats int, lnurlw_enable bool, card_name string, uid_privacy bool, allow_neg_bal_ptr bool) error { @@ -747,7 +757,7 @@ func db_insert_card(one_time_code string, k0_auth_key string, k2_cmac_key string allow_neg_bal_yn = "Y" } - db, err := db_open() + db, err := open() if err != nil { return err } @@ -777,11 +787,11 @@ func db_insert_card(one_time_code string, k0_auth_key string, k2_cmac_key string return nil } -func db_wipe_card(card_name string) (*card_wipe_info, error) { +func Wipe_card(card_name string) (*Card_wipe_info, error) { - card_wipe_info := card_wipe_info{} + card_wipe_info := Card_wipe_info{} - db, err := db_open() + db, err := open() if err != nil { return &card_wipe_info, err } @@ -810,17 +820,17 @@ func db_wipe_card(card_name string) (*card_wipe_info, error) { ` FROM cards WHERE card_name = $1;` row := db.QueryRow(sqlStatement, card_name) err = row.Scan( - &card_wipe_info.id, - &card_wipe_info.uid, - &card_wipe_info.k0, - &card_wipe_info.k2, - &card_wipe_info.k3, - &card_wipe_info.k4) + &card_wipe_info.Id, + &card_wipe_info.Uid, + &card_wipe_info.K0, + &card_wipe_info.K2, + &card_wipe_info.K3, + &card_wipe_info.K4) if err != nil { return &card_wipe_info, err } - card_wipe_info.k1 = db_get_setting("AES_DECRYPT_KEY") + card_wipe_info.K1 = Get_setting("AES_DECRYPT_KEY") return &card_wipe_info, nil } diff --git a/email.go b/email/email.go similarity index 77% rename from email.go rename to email/email.go index 070f6e1..2b123e7 100644 --- a/email.go +++ b/email/email.go @@ -1,4 +1,4 @@ -package main +package email import ( "github.com/aws/aws-sdk-go/aws" @@ -9,35 +9,36 @@ import ( log "github.com/sirupsen/logrus" "strconv" "strings" + "github.com/boltcard/boltcard/db" ) -func send_balance_email(recipient_email string, card_id int) { +func Send_balance_email(recipient_email string, card_id int) { - c, err := db_get_card_from_card_id(card_id) + c, err := db.Get_card_from_card_id(card_id) if err != nil { log.Warn(err.Error()) return } - card_total_sats, err := db_get_card_total_sats(card_id) + card_total_sats, err := db.Get_card_total_sats(card_id) if err != nil { log.Warn(err.Error()) return } - email_max_txs, err := strconv.Atoi(db_get_setting("EMAIL_MAX_TXS")) + email_max_txs, err := strconv.Atoi(db.Get_setting("EMAIL_MAX_TXS")) if err != nil { log.Warn(err.Error()) return } - txs, err := db_get_card_txs(card_id, email_max_txs+1) + txs, err := db.Get_card_txs(card_id, email_max_txs+1) if err != nil { log.Warn(err.Error()) return } - subject := c.card_name + " balance = " + strconv.Itoa(card_total_sats) + " sats" + subject := c.Card_name + " balance = " + strconv.Itoa(card_total_sats) + " sats" // add transactions to the email body @@ -56,9 +57,9 @@ func send_balance_email(recipient_email string, card_id int) { if i < email_max_txs { html_body_sb.WriteString( "