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/lnurlp_callback.go b/lnurlp/lnurlp_callback.go similarity index 88% rename from lnurlp_callback.go rename to lnurlp/lnurlp_callback.go index 8d32e71..84fb023 100644 --- a/lnurlp_callback.go +++ b/lnurlp/lnurlp_callback.go @@ -1,4 +1,4 @@ -package main +package lnurlp import ( "encoding/hex" @@ -8,9 +8,10 @@ import ( "strconv" "github.com/boltcard/boltcard/lnd" "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" ) -func lnurlp_callback(w http.ResponseWriter, r *http.Request) { +func Callback(w http.ResponseWriter, r *http.Request) { if db.Get_setting("FUNCTION_LNURLP") != "ENABLE" { log.Debug("LNURLp function is not enabled") return @@ -22,7 +23,7 @@ func lnurlp_callback(w http.ResponseWriter, r *http.Request) { card_id, err := db.Get_card_id_for_name(name) if err != nil { log.Info("card name not found") - write_error(w) + resp_err.Write(w) return } @@ -38,14 +39,14 @@ func lnurlp_callback(w http.ResponseWriter, r *http.Request) { domain := db.Get_setting("HOST_DOMAIN") if r.Host != domain { log.Warn("wrong host domain") - write_error(w) + resp_err.Write(w) return } amount_msat, err := strconv.ParseInt(amount, 10, 64) if err != nil { log.Warn("amount is not a valid integer") - write_error(w) + resp_err.Write(w) return } @@ -55,14 +56,14 @@ func lnurlp_callback(w http.ResponseWriter, r *http.Request) { pr, r_hash, err := lnd.Add_invoice(amount_sat, metadata) if err != nil { log.Warn("could not add_invoice") - write_error(w) + resp_err.Write(w) return } err = db.Insert_receipt(card_id, pr, hex.EncodeToString(r_hash), amount_msat) if err != nil { log.Warn(err) - write_error(w) + resp_err.Write(w) return } diff --git a/lnurlp_request.go b/lnurlp/lnurlp_request.go similarity index 88% rename from lnurlp_request.go rename to lnurlp/lnurlp_request.go index eb4535c..a7adfbf 100644 --- a/lnurlp_request.go +++ b/lnurlp/lnurlp_request.go @@ -1,13 +1,14 @@ -package main +package lnurlp import ( "github.com/gorilla/mux" log "github.com/sirupsen/logrus" "net/http" "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" ) -func lnurlp_response(w http.ResponseWriter, r *http.Request) { +func Response(w http.ResponseWriter, r *http.Request) { if db.Get_setting("FUNCTION_LNURLP") != "ENABLE" { log.Debug("LNURLp function is not enabled") return @@ -27,7 +28,7 @@ func lnurlp_response(w http.ResponseWriter, r *http.Request) { domain := db.Get_setting("HOST_DOMAIN") if r.Host != domain { log.Warn("wrong host domain") - write_error(w) + resp_err.Write(w) return } @@ -36,13 +37,13 @@ func lnurlp_response(w http.ResponseWriter, r *http.Request) { card_count, err := db.Get_card_count_for_name_lnurlp(name) if err != nil { log.Warn("could not get card count for name") - write_error(w) + resp_err.Write(w) return } if card_count != 1 { log.Info("not one enabled card with that name") - write_error(w) + resp_err.Write(w) return } diff --git a/lnurlw_callback.go b/lnurlw/lnurlw_callback.go similarity index 91% rename from lnurlw_callback.go rename to lnurlw/lnurlw_callback.go index 29237c6..9f4abab 100644 --- a/lnurlw_callback.go +++ b/lnurlw/lnurlw_callback.go @@ -1,4 +1,4 @@ -package main +package lnurlw import ( decodepay "github.com/fiatjaf/ln-decodepay" @@ -6,14 +6,15 @@ import ( "net/http" "github.com/boltcard/boltcard/db" "github.com/boltcard/boltcard/lnd" + "github.com/boltcard/boltcard/resp_err" ) -func lnurlw_callback(w http.ResponseWriter, req *http.Request) { +func Callback(w http.ResponseWriter, req *http.Request) { env_host_domain := db.Get_setting("HOST_DOMAIN") if req.Host != env_host_domain { log.Warn("wrong host domain") - write_error(w) + resp_err.Write(w) return } @@ -25,7 +26,7 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { if !ok || len(params_k1[0]) < 1 { log.WithFields(log.Fields{"url": url}).Debug("k1 not found") - write_error(w) + resp_err.Write(w) return } @@ -34,14 +35,14 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { p, err := db.Get_payment_k1(param_k1) if err != nil { log.WithFields(log.Fields{"url": url, "k1": param_k1}).Warn(err) - write_error(w) + resp_err.Write(w) return } // check that payment has not been made if p.Paid_flag != "N" { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("payment already made") - write_error(w) + resp_err.Write(w) return } @@ -49,19 +50,19 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { lnurlw_timeout, err := db.Check_lnurlw_timeout(p.Card_payment_id) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) - write_error(w) + resp_err.Write(w) return } if lnurlw_timeout == true { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("lnurlw request has timed out") - write_error(w) + resp_err.Write(w) return } params_pr, ok := req.URL.Query()["pr"] if !ok || len(params_pr[0]) < 1 { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn("pr field not found") - write_error(w) + resp_err.Write(w) return } @@ -72,7 +73,7 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { err = db.Update_payment_invoice(p.Card_payment_id, param_pr, bolt11.MSatoshi) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) - write_error(w) + resp_err.Write(w) return } @@ -82,7 +83,7 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { testnode := db.Get_setting("LN_TESTNODE") if testnode != "" && bolt11.Payee != testnode { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("rejected as not the defined test node") - write_error(w) + resp_err.Write(w) return } @@ -93,14 +94,14 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { day_total_sats, err := db.Get_card_totals(p.Card_id) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) - write_error(w) + resp_err.Write(w) return } c, err := db.Get_card_from_card_id(p.Card_id) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) - write_error(w) + resp_err.Write(w) return } @@ -108,7 +109,7 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("invoice_sats: ", invoice_sats) log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("tx_limit_sats: ", c.Tx_limit_sats) log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("over tx_limit_sats!") - write_error(w) + resp_err.Write(w) return } @@ -117,7 +118,7 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("day_total_sats: ", day_total_sats) log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("day_limit_sats: ", c.Day_limit_sats) log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Info("over day_limit_sats!") - write_error(w) + resp_err.Write(w) return } @@ -128,13 +129,13 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { card_total, err := db.Get_card_total_sats(p.Card_id) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) - write_error(w) + resp_err.Write(w) return } if card_total-invoice_sats < 0 { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn("not enough balance") - write_error(w) + resp_err.Write(w) return } } @@ -145,7 +146,7 @@ func lnurlw_callback(w http.ResponseWriter, req *http.Request) { err = db.Update_payment_paid(p.Card_payment_id) if err != nil { log.WithFields(log.Fields{"card_payment_id": p.Card_payment_id}).Warn(err) - write_error(w) + resp_err.Write(w) return } diff --git a/lnurlw_request.go b/lnurlw/lnurlw_request.go similarity index 92% rename from lnurlw_request.go rename to lnurlw/lnurlw_request.go index db7ca07..b0a70b3 100644 --- a/lnurlw_request.go +++ b/lnurlw/lnurlw_request.go @@ -1,4 +1,4 @@ -package main +package lnurlw import ( "encoding/hex" @@ -10,9 +10,11 @@ import ( "strconv" "strings" "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/crypto" + "github.com/boltcard/boltcard/resp_err" ) -type Response struct { +type ResponseData struct { Tag string `json:"tag"` Callback string `json:"callback"` LnurlwK1 string `json:"k1"` @@ -61,7 +63,7 @@ func check_cmac(uid []byte, ctr []byte, k2_cmac_key []byte, cmac []byte) (bool, sv2[14] = ctr[1] sv2[15] = ctr[2] - cmac_verified, err := crypto_aes_cmac(k2_cmac_key, sv2, cmac) + cmac_verified, err := crypto.Aes_cmac(k2_cmac_key, sv2, cmac) if err != nil { return false, err @@ -159,7 +161,7 @@ func parse_request(req *http.Request) (int, error) { return 0, err } - dec_p, err := crypto_aes_decrypt(key_sdm_file_read, ba_p) + dec_p, err := crypto.Aes_decrypt(key_sdm_file_read, ba_p) if err != nil { return 0, err @@ -245,12 +247,12 @@ func parse_request(req *http.Request) (int, error) { return c.Card_id, nil } -func lnurlw_response(w http.ResponseWriter, req *http.Request) { +func Response(w http.ResponseWriter, req *http.Request) { env_host_domain := db.Get_setting("HOST_DOMAIN") if req.Host != env_host_domain { log.Warn("wrong host domain") - write_error(w) + resp_err.Write(w) return } @@ -258,15 +260,15 @@ func lnurlw_response(w http.ResponseWriter, req *http.Request) { if err != nil { log.Debug(err.Error()) - write_error(w) + resp_err.Write(w) return } - lnurlw_k1, err := create_k1() + lnurlw_k1, err := crypto.Create_k1() if err != nil { log.Warn(err.Error()) - write_error(w) + resp_err.Write(w) return } @@ -276,7 +278,7 @@ func lnurlw_response(w http.ResponseWriter, req *http.Request) { if err != nil { log.Warn(err.Error()) - write_error(w) + resp_err.Write(w) return } @@ -292,7 +294,7 @@ func lnurlw_response(w http.ResponseWriter, req *http.Request) { if err != nil { log.Warn(err.Error()) - write_error(w) + resp_err.Write(w) return } @@ -301,11 +303,11 @@ func lnurlw_response(w http.ResponseWriter, req *http.Request) { if err != nil { log.Warn(err.Error()) - write_error(w) + resp_err.Write(w) return } - response := Response{} + response := ResponseData{} response.Tag = "withdrawRequest" response.Callback = lnurlw_cb_url response.LnurlwK1 = lnurlw_k1 @@ -317,7 +319,7 @@ func lnurlw_response(w http.ResponseWriter, req *http.Request) { if err != nil { log.Warn(err) - write_error(w) + resp_err.Write(w) return } diff --git a/main.go b/main.go index eb3bf09..6460e3c 100644 --- a/main.go +++ b/main.go @@ -6,24 +6,12 @@ import ( "net/http" "time" "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/lnurlw" + "github.com/boltcard/boltcard/lnurlp" ) var router = mux.NewRouter() -func write_error(w http.ResponseWriter) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - jsonData := []byte(`{"status":"ERROR","reason":"bad request"}`) - w.Write(jsonData) -} - -func write_error_message(w http.ResponseWriter, message string) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - jsonData := []byte(`{"status":"ERROR","reason":"` + message + `"}`) - w.Write(jsonData) -} - func main() { log_level := db.Get_setting("LOG_LEVEL") @@ -45,11 +33,11 @@ func main() { // createboltcard 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) + router.Path("/ln").Methods("GET").HandlerFunc(lnurlw.Response) + 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) + router.Path("/.well-known/lnurlp/{name}").Methods("GET").HandlerFunc(lnurlp.Response) + router.Path("/lnurlp/{name}").Methods("GET").HandlerFunc(lnurlp.Callback) port := db.Get_setting("HOST_PORT") if port == "" { diff --git a/new_card_request.go b/new_card_request.go index 6d8d8e9..f74f4e8 100644 --- a/new_card_request.go +++ b/new_card_request.go @@ -6,6 +6,7 @@ import ( log "github.com/sirupsen/logrus" "net/http" "github.com/boltcard/boltcard/db" + "github.com/boltcard/boltcard/resp_err" ) /** @@ -48,7 +49,7 @@ func new_card_request(w http.ResponseWriter, req *http.Request) { params_a, ok := req.URL.Query()["a"] if !ok || len(params_a[0]) < 1 { log.Debug("a not found") - write_error(w) + resp_err.Write(w) return } @@ -60,13 +61,13 @@ func new_card_request(w http.ResponseWriter, req *http.Request) { if err == sql.ErrNoRows { log.Debug(err) - write_error_message(w, "one time code was used or card was wiped or card does not exist") + resp_err.Write_message(w, "one time code was used or card was wiped or card does not exist") return } if err != nil { log.Warn(err) - write_error(w) + resp_err.Write(w) return } @@ -90,7 +91,7 @@ func new_card_request(w http.ResponseWriter, req *http.Request) { jsonData, err := json.Marshal(response) if err != nil { log.Warn(err) - write_error(w) + resp_err.Write(w) return } diff --git a/resp_err/resp_err.go b/resp_err/resp_err.go new file mode 100644 index 0000000..951dab7 --- /dev/null +++ b/resp_err/resp_err.go @@ -0,0 +1,19 @@ +package resp_err + +import ( + "net/http" +) + +func Write(w http.ResponseWriter) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + jsonData := []byte(`{"status":"ERROR","reason":"bad request"}`) + w.Write(jsonData) +} + +func Write_message(w http.ResponseWriter, message string) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + jsonData := []byte(`{"status":"ERROR","reason":"` + message + `"}`) + w.Write(jsonData) +}