From 58c074234c019dbb9abf76a3532397fe84d3f70d Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Thu, 2 Feb 2023 09:16:23 +0000 Subject: [PATCH 01/10] add internal API & ping --- main.go | 44 ++++++++++++++++++++++++++++++++++---------- ping.go | 20 ++++++++++++++++++++ 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 ping.go diff --git a/main.go b/main.go index 63d3d7d..0e80910 100644 --- a/main.go +++ b/main.go @@ -7,8 +7,6 @@ import ( "time" ) -var router = mux.NewRouter() - func write_error(w http.ResponseWriter) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) @@ -41,26 +39,52 @@ func main() { DisableHTMLEscape: true, }) + var external_router = mux.NewRouter() + var internal_router = mux.NewRouter() + + // external API + + // ping + external_router.Path("/ping").Methods("GET").HandlerFunc(external_ping) // createboltcard - router.Path("/new").Methods("GET").HandlerFunc(new_card_request) + external_router.Path("/new").Methods("GET").HandlerFunc(new_card_request) // lnurlw for pos - router.Path("/ln").Methods("GET").HandlerFunc(lnurlw_response) - router.Path("/cb").Methods("GET").HandlerFunc(lnurlw_callback) + external_router.Path("/ln").Methods("GET").HandlerFunc(lnurlw_response) + external_router.Path("/cb").Methods("GET").HandlerFunc(lnurlw_callback) // lnurlp for lightning address - router.Path("/.well-known/lnurlp/{name}").Methods("GET").HandlerFunc(lnurlp_response) - router.Path("/lnurlp/{name}").Methods("GET").HandlerFunc(lnurlp_callback) + external_router.Path("/.well-known/lnurlp/{name}").Methods("GET").HandlerFunc(lnurlp_response) + external_router.Path("/lnurlp/{name}").Methods("GET").HandlerFunc(lnurlp_callback) + + // internal API + // this has no authentication and is not to be exposed publicly + // it exists for use on a private virtual network within a docker container + + // ping + internal_router.Path("/ping").Methods("GET").HandlerFunc(internal_ping) + //internal_router.Path("/createboltcard").Methods("POST").HandlerFunc(adminapi_createboltcard) + //internal_router.Path("/wipeboltcard").Methods("POST").HandlerFunc(adminapi_wipeboltcard) port := db_get_setting("HOST_PORT") if port == "" { port = "9000" } - srv := &http.Server{ - Handler: router, + external_server := &http.Server{ + Handler: external_router, Addr: ":" + port, // consider adding host WriteTimeout: 30 * time.Second, ReadTimeout: 30 * time.Second, } - srv.ListenAndServe() + internal_server := &http.Server{ + Handler: internal_router, + Addr: ":9001", + WriteTimeout: 5 * time.Second, + ReadTimeout: 5 * time.Second, + } + + go external_server.ListenAndServe() + go internal_server.ListenAndServe() + + select {} } diff --git a/ping.go b/ping.go new file mode 100644 index 0000000..d42eabe --- /dev/null +++ b/ping.go @@ -0,0 +1,20 @@ +package main + +import ( + "net/http" +) + +func external_ping(w http.ResponseWriter, req *http.Request) { + ping(w, "external API") +} + +func internal_ping(w http.ResponseWriter, req *http.Request) { + ping(w, "internal API") +} + +func ping(w http.ResponseWriter, message string) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + jsonData := []byte(`{"status":"OK","pong":"` + message + `"}`) + w.Write(jsonData) +} From fe0b6fafb4781da144d20f9f4cd0254e627db631 Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Thu, 2 Feb 2023 11:54:41 +0000 Subject: [PATCH 02/10] API for createboltcard call added --- createboltcard.go | 139 ++++++++++++++++++++++++++++++++++++++++++++++ database.go | 70 +++++++++++++++++++++++ main.go | 12 ++-- 3 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 createboltcard.go diff --git a/createboltcard.go b/createboltcard.go new file mode 100644 index 0000000..d7e962f --- /dev/null +++ b/createboltcard.go @@ -0,0 +1,139 @@ +package main + +import ( + "crypto/rand" + "encoding/hex" + log "github.com/sirupsen/logrus" + "net/http" + "strconv" + "strings" +) + +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 createboltcard(w http.ResponseWriter, r *http.Request) { + if db_get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { + msg := "Internal API function is not enabled" + log.Debug(msg) + write_error_message(w, msg) + return + } + + tx_max_str := r.URL.Query().Get("tx_max") + tx_max, err := strconv.Atoi(tx_max_str) + if err != nil { + msg := "tx_max is not a valid integer" + log.Warn(msg) + write_error_message(w, msg) + return + } + + day_max_str := r.URL.Query().Get("day_max") + day_max, err := strconv.Atoi(day_max_str) + if err != nil { + msg := "day_max is not a valid integer" + log.Warn(msg) + write_error_message(w, msg) + return + } + + enable_flag_str := r.URL.Query().Get("enable") + enable_flag, err := strconv.ParseBool(enable_flag_str) + if err != nil { + msg := "enable is not a valid boolean" + log.Warn(msg) + write_error_message(w, msg) + return + } + + card_name := r.URL.Query().Get("card_name") + + uid_privacy_flag_str := r.URL.Query().Get("uid_privacy") + uid_privacy_flag, err := strconv.ParseBool(uid_privacy_flag_str) + if err != nil { + msg := "uid_privacy is not a valid boolean" + log.Warn(msg) + write_error_message(w, msg) + return + } + + allow_neg_bal_flag_str := r.URL.Query().Get("allow_neg_bal") + allow_neg_bal_flag, err := strconv.ParseBool(allow_neg_bal_flag_str) + if err != nil { + msg := "allow_neg_bal is not a valid boolean" + log.Warn(msg) + write_error_message(w, msg) + return + } + + // check if card_name already exists + + card_count, err := db_get_card_name_count(card_name) + if err != nil { + log.Warn(err.Error()) + return + } + + if card_count > 0 { + msg := "the card name already exists in the database" + log.Warn(msg) + write_error_message(w, msg) + return + } + + // log the request + + log.WithFields(log.Fields{ + "card_name": card_name, "tx_max": tx_max, "day_max": day_max, + "enable": enable_flag, "uid_privacy": uid_privacy_flag, + "allow_neg_bal": allow_neg_bal_flag}).Info("createboltcard API request") + + // create the keys + + one_time_code := random_hex() + k0_auth_key := random_hex() + k2_cmac_key := random_hex() + k3 := random_hex() + k4 := random_hex() + + // create the new card record + + 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 { + log.Warn(err.Error()) + return + } + + // return the URI + one_time_code + + hostdomain := db_get_setting("HOST_DOMAIN") + url := "" + if strings.HasSuffix(hostdomain, ".onion") { + url = "http://" + hostdomain + "/new?a=" + one_time_code + } else { + url = "https://" + hostdomain + "/new?a=" + one_time_code + } + + // log the response + + log.WithFields(log.Fields{ + "card_name": card_name, "url": url}).Info("createboltcard API response") + + jsonData := []byte(`{"status":"OK",` + + `"url":"` + url + `"}`) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(jsonData) +} diff --git a/database.go b/database.go index 8eac299..7351fd1 100644 --- a/database.go +++ b/database.go @@ -706,3 +706,73 @@ 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) { + + card_count = 0 + + db, err := db_open() + if err != nil { + return 0, err + } + defer db.Close() + + sqlStatement := `SELECT COUNT(card_id) FROM cards WHERE card_name = $1;` + + row := db.QueryRow(sqlStatement, card_name) + err = row.Scan(&card_count) + if err != nil { + return 0, err + } + + return card_count, nil +} + +func db_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 { + + lnurlw_enable_yn := "N" + if lnurlw_enable { + lnurlw_enable_yn = "Y" + } + + uid_privacy_yn := "N" + if uid_privacy { + uid_privacy_yn = "Y" + } + + allow_neg_bal_yn := "N" + if allow_neg_bal_ptr { + allow_neg_bal_yn = "Y" + } + + 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, k0_auth_key, k2_cmac_key, k3, k4, uid, last_counter_value,` + + ` lnurlw_request_timeout_sec, tx_limit_sats, day_limit_sats, lnurlw_enable,` + + ` one_time_code_used, card_name, uid_privacy, allow_negative_balance)` + + ` VALUES ($1, $2, $3, $4, $5, '', 0, 60, $6, $7, $8, 'N', $9, $10, $11);` + res, err := db.Exec(sqlStatement, one_time_code, k0_auth_key, k2_cmac_key, k3, k4, + tx_max_sats, day_max_sats, lnurlw_enable_yn, card_name, uid_privacy_yn, + allow_neg_bal_yn) + 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 +} diff --git a/main.go b/main.go index 0e80910..ffb52b3 100644 --- a/main.go +++ b/main.go @@ -61,8 +61,8 @@ func main() { // ping internal_router.Path("/ping").Methods("GET").HandlerFunc(internal_ping) - //internal_router.Path("/createboltcard").Methods("POST").HandlerFunc(adminapi_createboltcard) - //internal_router.Path("/wipeboltcard").Methods("POST").HandlerFunc(adminapi_wipeboltcard) + internal_router.Path("/createboltcard").Methods("GET").HandlerFunc(createboltcard) + //internal_router.Path("/wipeboltcard").Methods("GET").HandlerFunc(wipeboltcard) port := db_get_setting("HOST_PORT") if port == "" { @@ -77,10 +77,10 @@ func main() { } internal_server := &http.Server{ - Handler: internal_router, - Addr: ":9001", - WriteTimeout: 5 * time.Second, - ReadTimeout: 5 * time.Second, + Handler: internal_router, + Addr: ":9001", + WriteTimeout: 5 * time.Second, + ReadTimeout: 5 * time.Second, } go external_server.ListenAndServe() From 4d7dfb481d429689e963e1704dadf0d107ff5e39 Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Thu, 2 Feb 2023 15:52:57 +0000 Subject: [PATCH 03/10] API for wipeboltcard call added --- createboltcard.go | 14 ++++---- database.go | 48 +++++++++++++++++++++++++++ main.go | 3 +- wipeboltcard.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 wipeboltcard.go diff --git a/createboltcard.go b/createboltcard.go index d7e962f..59bd7b2 100644 --- a/createboltcard.go +++ b/createboltcard.go @@ -22,7 +22,7 @@ func random_hex() string { func createboltcard(w http.ResponseWriter, r *http.Request) { if db_get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { - msg := "Internal API function is not enabled" + msg := "createboltcard: internal API function is not enabled" log.Debug(msg) write_error_message(w, msg) return @@ -31,7 +31,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { tx_max_str := r.URL.Query().Get("tx_max") tx_max, err := strconv.Atoi(tx_max_str) if err != nil { - msg := "tx_max is not a valid integer" + msg := "createboltcard: tx_max is not a valid integer" log.Warn(msg) write_error_message(w, msg) return @@ -40,7 +40,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { day_max_str := r.URL.Query().Get("day_max") day_max, err := strconv.Atoi(day_max_str) if err != nil { - msg := "day_max is not a valid integer" + msg := "createboltcard: day_max is not a valid integer" log.Warn(msg) write_error_message(w, msg) return @@ -49,7 +49,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { enable_flag_str := r.URL.Query().Get("enable") enable_flag, err := strconv.ParseBool(enable_flag_str) if err != nil { - msg := "enable is not a valid boolean" + msg := "createboltcard: enable is not a valid boolean" log.Warn(msg) write_error_message(w, msg) return @@ -60,7 +60,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { uid_privacy_flag_str := r.URL.Query().Get("uid_privacy") uid_privacy_flag, err := strconv.ParseBool(uid_privacy_flag_str) if err != nil { - msg := "uid_privacy is not a valid boolean" + msg := "createboltcard: uid_privacy is not a valid boolean" log.Warn(msg) write_error_message(w, msg) return @@ -69,7 +69,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { allow_neg_bal_flag_str := r.URL.Query().Get("allow_neg_bal") allow_neg_bal_flag, err := strconv.ParseBool(allow_neg_bal_flag_str) if err != nil { - msg := "allow_neg_bal is not a valid boolean" + msg := "createboltcard: allow_neg_bal is not a valid boolean" log.Warn(msg) write_error_message(w, msg) return @@ -84,7 +84,7 @@ func createboltcard(w http.ResponseWriter, r *http.Request) { } if card_count > 0 { - msg := "the card name already exists in the database" + msg := "createboltcard: the card name already exists in the database" log.Warn(msg) write_error_message(w, msg) return diff --git a/database.go b/database.go index 7351fd1..65e5d1d 100644 --- a/database.go +++ b/database.go @@ -776,3 +776,51 @@ 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) { + + card_wipe_info := card_wipe_info{} + + db, err := db_open() + if err != nil { + return &card_wipe_info, err + } + defer db.Close() + + // set card as wiped and disabled + + sqlStatement := `UPDATE cards SET` + + ` lnurlw_enable = 'N', lnurlp_enable = 'N', email_enable = 'N', wiped = 'Y'` + + ` WHERE card_name = $1;` + res, err := db.Exec(sqlStatement, card_name) + if err != nil { + return &card_wipe_info, err + } + count, err := res.RowsAffected() + if err != nil { + return &card_wipe_info, err + } + if count != 1 { + return &card_wipe_info, errors.New("not one card record updated") + } + + // get card keys + + sqlStatement = `SELECT card_id, uid, k0_auth_key, k2_cmac_key, k3, k4` + + ` 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) + if err != nil { + return &card_wipe_info, err + } + + card_wipe_info.k1 = db_get_setting("AES_DECRYPT_KEY") + + return &card_wipe_info, nil +} diff --git a/main.go b/main.go index ffb52b3..8077842 100644 --- a/main.go +++ b/main.go @@ -59,10 +59,9 @@ func main() { // this has no authentication and is not to be exposed publicly // it exists for use on a private virtual network within a docker container - // ping internal_router.Path("/ping").Methods("GET").HandlerFunc(internal_ping) internal_router.Path("/createboltcard").Methods("GET").HandlerFunc(createboltcard) - //internal_router.Path("/wipeboltcard").Methods("GET").HandlerFunc(wipeboltcard) + internal_router.Path("/wipeboltcard").Methods("GET").HandlerFunc(wipeboltcard) port := db_get_setting("HOST_PORT") if port == "" { diff --git a/wipeboltcard.go b/wipeboltcard.go new file mode 100644 index 0000000..59511e6 --- /dev/null +++ b/wipeboltcard.go @@ -0,0 +1,83 @@ +package main + +import ( + log "github.com/sirupsen/logrus" + "strconv" + "net/http" +) + +type card_wipe_info struct { + id int + k0 string + k1 string + k2 string + k3 string + k4 string + uid string +} + +func wipeboltcard(w http.ResponseWriter, r *http.Request) { + if db_get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { + msg := "wipeboltcard: internal API function is not enabled" + log.Debug(msg) + write_error_message(w, msg) + return + } + + card_name := r.URL.Query().Get("card_name") + + // check if card_name has been given + + if card_name == "" { + msg := "wipeboltcard: the card name must be set" + log.Warn(msg) + write_error_message(w, msg) + return + } + + // check if card_name exists + + card_count, err := db_get_card_name_count(card_name) + + if card_count == 0 { + msg := "the card name does not exist in the database" + log.Warn(msg) + write_error_message(w, msg) + return + } + + // set the card as wiped and disabled, get the keys + + card_wipe_info_values, err := db_wipe_card(card_name) + if err != nil { + log.Warn(err.Error()) + return + } + + // log the request + + log.WithFields(log.Fields{ + "card_name": card_name}).Info("wipeboltcard API request") + + // generate a response + + jsonData := `{"status":"OK",` + + `"action": "wipe",` + + `"id": ` + strconv.Itoa(card_wipe_info_values.id) + `,` + + `"k0": "` + card_wipe_info_values.k0 + `",` + + `"k1": "` + card_wipe_info_values.k1 + `",` + + `"k2": "` + card_wipe_info_values.k2 + `",` + + `"k3": "` + card_wipe_info_values.k3 + `",` + + `"k4": "` + card_wipe_info_values.k4 + `",` + + `"uid": "` + card_wipe_info_values.uid + `",` + + `"version": 1"}` + + // log the response + + log.WithFields(log.Fields{ + "card_name": card_name, "response": jsonData}).Info("wipeboltcard API response") + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(jsonData)) +} From a5d4643bf254bdd9fcf6022c22c3c0a7e469ec43 Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Tue, 7 Feb 2023 08:03:49 +0000 Subject: [PATCH 04/10] fix JSON response --- wipeboltcard.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wipeboltcard.go b/wipeboltcard.go index 59511e6..ed4a9fa 100644 --- a/wipeboltcard.go +++ b/wipeboltcard.go @@ -70,7 +70,7 @@ func wipeboltcard(w http.ResponseWriter, r *http.Request) { `"k3": "` + card_wipe_info_values.k3 + `",` + `"k4": "` + card_wipe_info_values.k4 + `",` + `"uid": "` + card_wipe_info_values.uid + `",` + - `"version": 1"}` + `"version": 1}` // log the response From c54328001f2a408df430c9b7360151c3e03fd27d Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Fri, 17 Feb 2023 10:50:14 +0000 Subject: [PATCH 05/10] fix formatting --- database.go | 74 ++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/database.go b/database.go index 65e5d1d..47d7052 100644 --- a/database.go +++ b/database.go @@ -779,48 +779,48 @@ func db_insert_card(one_time_code string, k0_auth_key string, k2_cmac_key string func db_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() - if err != nil { - return &card_wipe_info, err - } - defer db.Close() + db, err := db_open() + if err != nil { + return &card_wipe_info, err + } + defer db.Close() - // set card as wiped and disabled + // set card as wiped and disabled - sqlStatement := `UPDATE cards SET` + - ` lnurlw_enable = 'N', lnurlp_enable = 'N', email_enable = 'N', wiped = 'Y'` + - ` WHERE card_name = $1;` - res, err := db.Exec(sqlStatement, card_name) - if err != nil { - return &card_wipe_info, err - } - count, err := res.RowsAffected() - if err != nil { - return &card_wipe_info, err - } - if count != 1 { - return &card_wipe_info, errors.New("not one card record updated") - } + sqlStatement := `UPDATE cards SET` + + ` lnurlw_enable = 'N', lnurlp_enable = 'N', email_enable = 'N', wiped = 'Y'` + + ` WHERE card_name = $1;` + res, err := db.Exec(sqlStatement, card_name) + if err != nil { + return &card_wipe_info, err + } + count, err := res.RowsAffected() + if err != nil { + return &card_wipe_info, err + } + if count != 1 { + return &card_wipe_info, errors.New("not one card record updated") + } - // get card keys + // get card keys - sqlStatement = `SELECT card_id, uid, k0_auth_key, k2_cmac_key, k3, k4` + - ` 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) - if err != nil { - return &card_wipe_info, err - } + sqlStatement = `SELECT card_id, uid, k0_auth_key, k2_cmac_key, k3, k4` + + ` 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) + if err != nil { + return &card_wipe_info, err + } - card_wipe_info.k1 = db_get_setting("AES_DECRYPT_KEY") + card_wipe_info.k1 = db_get_setting("AES_DECRYPT_KEY") - return &card_wipe_info, nil + return &card_wipe_info, nil } From 10f2a756b9015d962ff10e6530cc492cae89fd57 Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Fri, 17 Feb 2023 10:51:46 +0000 Subject: [PATCH 06/10] fix formatting --- wipeboltcard.go | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/wipeboltcard.go b/wipeboltcard.go index ed4a9fa..1e6e927 100644 --- a/wipeboltcard.go +++ b/wipeboltcard.go @@ -2,8 +2,8 @@ package main import ( log "github.com/sirupsen/logrus" - "strconv" "net/http" + "strconv" ) type card_wipe_info struct { @@ -17,34 +17,34 @@ type card_wipe_info struct { } func wipeboltcard(w http.ResponseWriter, r *http.Request) { - if db_get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { - msg := "wipeboltcard: internal API function is not enabled" - log.Debug(msg) - write_error_message(w, msg) - return - } + if db_get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { + msg := "wipeboltcard: internal API function is not enabled" + log.Debug(msg) + write_error_message(w, msg) + return + } card_name := r.URL.Query().Get("card_name") // check if card_name has been given if card_name == "" { - msg := "wipeboltcard: the card name must be set" - log.Warn(msg) - write_error_message(w, msg) - return + msg := "wipeboltcard: the card name must be set" + log.Warn(msg) + write_error_message(w, msg) + return } // check if card_name exists card_count, err := db_get_card_name_count(card_name) - if card_count == 0 { - msg := "the card name does not exist in the database" - log.Warn(msg) - write_error_message(w, msg) - return - } + if card_count == 0 { + msg := "the card name does not exist in the database" + log.Warn(msg) + write_error_message(w, msg) + return + } // set the card as wiped and disabled, get the keys @@ -56,12 +56,12 @@ func wipeboltcard(w http.ResponseWriter, r *http.Request) { // log the request - log.WithFields(log.Fields{ - "card_name": card_name}).Info("wipeboltcard API request") + log.WithFields(log.Fields{ + "card_name": card_name}).Info("wipeboltcard API request") // generate a response - jsonData := `{"status":"OK",` + + jsonData := `{"status":"OK",` + `"action": "wipe",` + `"id": ` + strconv.Itoa(card_wipe_info_values.id) + `,` + `"k0": "` + card_wipe_info_values.k0 + `",` + @@ -72,12 +72,12 @@ func wipeboltcard(w http.ResponseWriter, r *http.Request) { `"uid": "` + card_wipe_info_values.uid + `",` + `"version": 1}` - // log the response + // log the response - log.WithFields(log.Fields{ - "card_name": card_name, "response": jsonData}).Info("wipeboltcard API response") + log.WithFields(log.Fields{ + "card_name": card_name, "response": jsonData}).Info("wipeboltcard API response") - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - w.Write([]byte(jsonData)) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(jsonData)) } From d1559c61f08070694b86054a359a8b31eade6737 Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Sat, 18 Feb 2023 14:49:38 +0000 Subject: [PATCH 07/10] update package --- go.mod | 8 ++++---- go.sum | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 300d1d6..00ce009 100644 --- a/go.mod +++ b/go.mod @@ -140,10 +140,10 @@ require ( go.uber.org/zap v1.23.0 // indirect golang.org/x/crypto v0.3.0 // indirect golang.org/x/mod v0.7.0 // indirect - golang.org/x/net v0.2.0 // indirect - golang.org/x/sys v0.2.0 // indirect - golang.org/x/term v0.2.0 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect golang.org/x/time v0.2.0 // indirect golang.org/x/tools v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect diff --git a/go.sum b/go.sum index 746d8eb..1bbd301 100644 --- a/go.sum +++ b/go.sum @@ -1174,6 +1174,8 @@ golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1313,6 +1315,7 @@ golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1321,6 +1324,7 @@ golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1333,6 +1337,7 @@ golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From a0a62f738fec8bf42dbc8b8cd9f618f94a4d47f5 Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Sat, 18 Feb 2023 17:44:15 +0000 Subject: [PATCH 08/10] fix build --- go.sum | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go.sum b/go.sum index 1bbd301..0e43a32 100644 --- a/go.sum +++ b/go.sum @@ -1315,6 +1315,7 @@ golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1324,6 +1325,7 @@ golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1337,6 +1339,7 @@ golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From b4494c7ed3980b106244ade15d51df150176cedf Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Sun, 19 Feb 2023 06:52:12 +0000 Subject: [PATCH 09/10] fix formatting --- createboltcard.go | 4 ++-- db/db.go | 14 +++++++------- email/email.go | 2 +- lndhub/lndhub.go | 6 +++--- lnurlp/lnurlp_callback.go | 6 +++--- lnurlp/lnurlp_request.go | 4 ++-- lnurlw/lnurlw_callback.go | 12 ++++++------ lnurlw/lnurlw_request.go | 6 +++--- main.go | 6 +++--- new_card_request.go | 4 ++-- wipeboltcard.go | 4 ++-- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/createboltcard.go b/createboltcard.go index 42a9784..c2d291d 100644 --- a/createboltcard.go +++ b/createboltcard.go @@ -3,12 +3,12 @@ package main import ( "crypto/rand" "encoding/hex" + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" log "github.com/sirupsen/logrus" "net/http" "strconv" "strings" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/resp_err" ) func random_hex() string { diff --git a/db/db.go b/db/db.go index 5a98c21..4a868fd 100644 --- a/db/db.go +++ b/db/db.go @@ -47,13 +47,13 @@ type Transaction struct { } type Card_wipe_info struct { - Id int - K0 string - K1 string - K2 string - K3 string - K4 string - Uid string + Id int + K0 string + K1 string + K2 string + K3 string + K4 string + Uid string } func open() (*sql.DB, error) { diff --git a/email/email.go b/email/email.go index 2b123e7..8f78ddd 100644 --- a/email/email.go +++ b/email/email.go @@ -6,10 +6,10 @@ import ( "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ses" + "github.com/boltcard/boltcard/db" log "github.com/sirupsen/logrus" "strconv" "strings" - "github.com/boltcard/boltcard/db" ) func Send_balance_email(recipient_email string, card_id int) { diff --git a/lndhub/lndhub.go b/lndhub/lndhub.go index e0d6153..fa5f133 100644 --- a/lndhub/lndhub.go +++ b/lndhub/lndhub.go @@ -1,10 +1,10 @@ package lndhub import ( - log "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/email" + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/email" ) func Pay_invoice(card_payment_id int, invoice string) { diff --git a/lnurlp/lnurlp_callback.go b/lnurlp/lnurlp_callback.go index 84fb023..1984e8c 100644 --- a/lnurlp/lnurlp_callback.go +++ b/lnurlp/lnurlp_callback.go @@ -2,13 +2,13 @@ package lnurlp import ( "encoding/hex" + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/lnd" + "github.com/boltcard/boltcard/resp_err" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" "net/http" "strconv" - "github.com/boltcard/boltcard/lnd" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/resp_err" ) func Callback(w http.ResponseWriter, r *http.Request) { diff --git a/lnurlp/lnurlp_request.go b/lnurlp/lnurlp_request.go index a7adfbf..6483388 100644 --- a/lnurlp/lnurlp_request.go +++ b/lnurlp/lnurlp_request.go @@ -1,11 +1,11 @@ package lnurlp import ( + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" "net/http" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/resp_err" ) func Response(w http.ResponseWriter, r *http.Request) { diff --git a/lnurlw/lnurlw_callback.go b/lnurlw/lnurlw_callback.go index 5d31e27..d502290 100644 --- a/lnurlw/lnurlw_callback.go +++ b/lnurlw/lnurlw_callback.go @@ -1,14 +1,14 @@ package lnurlw import ( - decodepay "github.com/fiatjaf/ln-decodepay" - log "github.com/sirupsen/logrus" - "net/http" "bytes" - "io" "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/lnd" "github.com/boltcard/boltcard/resp_err" + decodepay "github.com/fiatjaf/ln-decodepay" + log "github.com/sirupsen/logrus" + "io" + "net/http" ) func lndhub_payment(w http.ResponseWriter, p *db.Payment) { @@ -28,7 +28,7 @@ func lndhub_payment(w http.ResponseWriter, p *db.Payment) { //the login JSON is held in the Card_name field body := []byte(c.Card_name) - r, err := http.NewRequest("POST", lndhub_url + "/auth", bytes.NewBuffer(body)) + r, err := http.NewRequest("POST", lndhub_url+"/auth", bytes.NewBuffer(body)) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) resp_err.Write(w) @@ -57,7 +57,7 @@ func lndhub_payment(w http.ResponseWriter, p *db.Payment) { log.Info(string(b)) -// fmt.Println(string(b)) + // fmt.Println(string(b)) //lndhub.payinvoice API call } diff --git a/lnurlw/lnurlw_request.go b/lnurlw/lnurlw_request.go index b0a70b3..c3a25e2 100644 --- a/lnurlw/lnurlw_request.go +++ b/lnurlw/lnurlw_request.go @@ -4,14 +4,14 @@ import ( "encoding/hex" "encoding/json" "errors" + "github.com/boltcard/boltcard/crypto" + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" log "github.com/sirupsen/logrus" "net/http" "os" "strconv" "strings" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/crypto" - "github.com/boltcard/boltcard/resp_err" ) type ResponseData struct { diff --git a/main.go b/main.go index c06eeba..40a0ed0 100644 --- a/main.go +++ b/main.go @@ -1,13 +1,13 @@ package main import ( + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/lnurlp" + "github.com/boltcard/boltcard/lnurlw" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" "net/http" "time" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/lnurlw" - "github.com/boltcard/boltcard/lnurlp" ) var router = mux.NewRouter() diff --git a/new_card_request.go b/new_card_request.go index f74f4e8..5e7e545 100644 --- a/new_card_request.go +++ b/new_card_request.go @@ -3,10 +3,10 @@ package main import ( "database/sql" "encoding/json" - log "github.com/sirupsen/logrus" - "net/http" "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/resp_err" + log "github.com/sirupsen/logrus" + "net/http" ) /** diff --git a/wipeboltcard.go b/wipeboltcard.go index a2ff0fa..3fa52fe 100644 --- a/wipeboltcard.go +++ b/wipeboltcard.go @@ -1,11 +1,11 @@ package main import ( + "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" log "github.com/sirupsen/logrus" "net/http" "strconv" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/resp_err" ) func wipeboltcard(w http.ResponseWriter, r *http.Request) { From 1fe32b1704059d2470d1d1d69e4c4614f4532b9d Mon Sep 17 00:00:00 2001 From: Peter Rounce Date: Sun, 19 Feb 2023 06:54:51 +0000 Subject: [PATCH 10/10] fix build --- lndhub/lndhub.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lndhub/lndhub.go b/lndhub/lndhub.go index fa5f133..92780a8 100644 --- a/lndhub/lndhub.go +++ b/lndhub/lndhub.go @@ -1,10 +1,10 @@ package lndhub import ( - log "github.com/sirupsen/logrus" +// log "github.com/sirupsen/logrus" - "github.com/boltcard/boltcard/db" - "github.com/boltcard/boltcard/email" +// "github.com/boltcard/boltcard/db" +// "github.com/boltcard/boltcard/email" ) func Pay_invoice(card_payment_id int, invoice string) {