diff --git a/docs/INSTALL.md b/docs/INSTALL.md index a06521c..faca21e 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -50,10 +50,10 @@ edit `Caddyfile` to set the boltcard domain name ### database creation edit `create_db.sql` to set the cardapp password `$ sudo -u postgres createuser -s ubuntu` -`$ ./s_create_db` +`$ script/s_create_db` ### boltcard service install -`$ ./s_build` +`$ script/s_build` `$ sudo systemctl enable boltcard` `$ sudo systemctl status boltcard` diff --git a/createboltcard.go b/internalapi/createboltcard.go similarity index 100% rename from createboltcard.go rename to internalapi/createboltcard.go diff --git a/internalapi/updateboltcard.go b/internalapi/updateboltcard.go new file mode 100644 index 0000000..4fde0dd --- /dev/null +++ b/internalapi/updateboltcard.go @@ -0,0 +1,100 @@ +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" +) + +func updateboltcard(w http.ResponseWriter, r *http.Request) { + if db.Get_setting("FUNCTION_INTERNAL_API") != "ENABLE" { + msg := "updateboltcard: internal API function is not enabled" + log.Debug(msg) + resp_err.Write_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 := "updateboltcard: tx_max is not a valid integer" + log.Warn(msg) + resp_err.Write_message(w, msg) + return + } + + enable_flag_str := r.URL.Query().Get("enable") + enable_flag, err := strconv.ParseBool(enable_flag_str) + if err != nil { + msg := "updateboltcard: enable is not a valid boolean" + log.Warn(msg) + resp_err.Write_message(w, msg) + return + } + + card_name := r.URL.Query().Get("card_name") + + // check if card_name already exists +//TODO: allow multiple deactivated cards with the same card_name + card_count, err := db.Get_card_name_count(card_name) + if err != nil { + log.Warn(err.Error()) + return + } + + if card_count == 0 { + msg := "updateboltcard: the card name does not exist in the database" + log.Warn(msg) + resp_err.Write_message(w, msg) + return + } + + // log the request + + log.WithFields(log.Fields{ + "card_name": card_name, "tx_max": tx_max, + "enable": enable_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() + + // update the card record + + err = db.Update_card(card_name, tx_max, enable_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("updateboltcard 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/wipeboltcard.go b/internalapi/wipeboltcard.go similarity index 100% rename from wipeboltcard.go rename to internalapi/wipeboltcard.go diff --git a/s_build b/script/s_build similarity index 100% rename from s_build rename to script/s_build diff --git a/s_create_db b/script/s_create_db similarity index 100% rename from s_create_db rename to script/s_create_db diff --git a/s_launch b/script/s_launch similarity index 100% rename from s_launch rename to script/s_launch diff --git a/s_restart b/script/s_restart similarity index 100% rename from s_restart rename to script/s_restart diff --git a/sql/create_db.sql b/sql/create_db.sql index f50285b..20cf9d5 100644 --- a/sql/create_db.sql +++ b/sql/create_db.sql @@ -20,7 +20,7 @@ CREATE TABLE cards ( tx_limit_sats INT NOT NULL, day_limit_sats INT NOT NULL, lnurlp_enable CHAR(1) NOT NULL DEFAULT 'N', - card_name VARCHAR(100) UNIQUE NOT NULL DEFAULT '', + card_name VARCHAR(100) NOT NULL DEFAULT '', email_address VARCHAR(100) DEFAULT '', email_enable CHAR(1) NOT NULL DEFAULT 'N', uid_privacy CHAR(1) NOT NULL DEFAULT 'N',