new packages

This commit is contained in:
Peter Rounce 2023-02-18 14:44:01 +00:00
parent aa5ccaded0
commit 4f4e320999
8 changed files with 83 additions and 70 deletions

View file

@ -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 {

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

24
main.go
View file

@ -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 == "" {

View file

@ -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
}

19
resp_err/resp_err.go Normal file
View file

@ -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)
}