From f3a3b1e0ffcaba08e50ffb2033091def04d0f8ef Mon Sep 17 00:00:00 2001 From: kexkey Date: Fri, 11 Jan 2019 18:46:40 -0500 Subject: [PATCH] More LN, more robust, more info --- api_auth_docker/api-sample.properties | 2 + .../generators/app/index.js | 2 + proxy_docker/app/data/cyphernode.sql | 11 ++- .../app/data/sqlmigrate20190104_0.1-0.2.sql | 10 ++- proxy_docker/app/script/call_lightningd.sh | 33 +++++-- proxy_docker/app/script/callbacks_job.sh | 89 +++++++++++++++---- proxy_docker/app/script/requesthandler.sh | 8 ++ proxy_docker/app/script/waitanyinvoice.sh | 44 ++------- 8 files changed, 139 insertions(+), 60 deletions(-) diff --git a/api_auth_docker/api-sample.properties b/api_auth_docker/api-sample.properties index 4016972..c99cccd 100644 --- a/api_auth_docker/api-sample.properties +++ b/api_auth_docker/api-sample.properties @@ -31,6 +31,8 @@ action_ln_pay=spender action_ln_newaddr=spender action_ots_stamp=spender action_ots_getfile=spender +action_ln_getinvoice=spender +action_ln_decodebolt11=spender # Admin can do what the spender can do, plus: diff --git a/install/generator-cyphernode/generators/app/index.js b/install/generator-cyphernode/generators/app/index.js index dac9fc7..96779ac 100644 --- a/install/generator-cyphernode/generators/app/index.js +++ b/install/generator-cyphernode/generators/app/index.js @@ -54,6 +54,8 @@ action_ln_pay=spender action_ln_newaddr=spender action_ots_stamp=spender action_ots_getfile=spender +action_ln_getinvoice=spender +action_ln_decodebolt11=spender # Admin can do what the spender can do, plus: diff --git a/proxy_docker/app/data/cyphernode.sql b/proxy_docker/app/data/cyphernode.sql index cad9789..6cca484 100644 --- a/proxy_docker/app/data/cyphernode.sql +++ b/proxy_docker/app/data/cyphernode.sql @@ -93,11 +93,18 @@ CREATE TABLE ln_invoice ( id INTEGER PRIMARY KEY AUTOINCREMENT, label TEXT UNIQUE, bolt11 TEXT UNIQUE, + payment_hash TEXT, + msatoshi INTEGER, status TEXT, + pay_index INTEGER, + msatoshi_received INTEGER, + paid_at INTEGER, + description TEXT, + expires_at INTEGER, callback_url TEXT, calledback INTEGER DEFAULT FALSE, callback_failed INTEGER DEFAULT FALSE, inserted_ts INTEGER DEFAULT CURRENT_TIMESTAMP -) +); +CREATE INDEX idx_lninvoice_label ON ln_invoice (label); CREATE INDEX idx_lninvoice_bolt11 ON ln_invoice (bolt11); -CREATE INDEX idx_lninvoice_status ON ln_invoice (status); diff --git a/proxy_docker/app/data/sqlmigrate20190104_0.1-0.2.sql b/proxy_docker/app/data/sqlmigrate20190104_0.1-0.2.sql index da01b20..4d6e588 100644 --- a/proxy_docker/app/data/sqlmigrate20190104_0.1-0.2.sql +++ b/proxy_docker/app/data/sqlmigrate20190104_0.1-0.2.sql @@ -4,12 +4,20 @@ INSERT INTO cyphernode_props (property, value) VALUES ("pay_index", "0"); CREATE TABLE ln_invoice ( id INTEGER PRIMARY KEY AUTOINCREMENT, + label TEXT UNIQUE, bolt11 TEXT UNIQUE, + payment_hash TEXT, + msatoshi INTEGER, status TEXT, + pay_index INTEGER, + msatoshi_received INTEGER, + paid_at INTEGER, + description TEXT, + expires_at INTEGER, callback_url TEXT, calledback INTEGER DEFAULT FALSE, callback_failed INTEGER DEFAULT FALSE, inserted_ts INTEGER DEFAULT CURRENT_TIMESTAMP ); +CREATE INDEX idx_lninvoice_label ON ln_invoice (label); CREATE INDEX idx_lninvoice_bolt11 ON ln_invoice (bolt11); -CREATE INDEX idx_lninvoice_status ON ln_invoice (status); diff --git a/proxy_docker/app/script/call_lightningd.sh b/proxy_docker/app/script/call_lightningd.sh index 528c111..01c759c 100644 --- a/proxy_docker/app/script/call_lightningd.sh +++ b/proxy_docker/app/script/call_lightningd.sh @@ -11,13 +11,13 @@ ln_create_invoice() local request=${1} local msatoshi=$(echo "${request}" | jq ".msatoshi" | tr -d '"') trace "[ln_create_invoice] msatoshi=${msatoshi}" - local label=$(echo "${request}" | jq ".label") + local label=$(echo "${request}" | jq ".label" | tr -d '"') trace "[ln_create_invoice] label=${label}" - local description=$(echo "${request}" | jq ".description") + local description=$(echo "${request}" | jq ".description" | tr -d '"') trace "[ln_create_invoice] description=${description}" local expiry=$(echo "${request}" | jq ".expiry" | tr -d '"') trace "[ln_create_invoice] expiry=${expiry}" - local callback_url=$(echo "${request}" | jq ".callback_url" | tr -d '"') + local callback_url=$(echo "${request}" | jq ".callbackUrl" | tr -d '"') trace "[ln_create_invoice] callback_url=${callback_url}" #/proxy $ ./lightning-cli invoice 10000 "t1" "t1d" 60 @@ -27,15 +27,20 @@ ln_create_invoice() # "bolt11": "lnbc100n1pwzllqgpp55a8xen9sdcntehwr93pkwnuu8nmtqx9yew0flalcxhx9nvy34crqdq9wsckgxqzpucqp2rzjqt04ll5ft3mcuy8hws4xcku2pnhma9r9mavtjtadawyrw5kgzp7g7zr745qq3mcqqyqqqqlgqqqqqzsqpcr85k33shzaxscpj29fadmjmfej6y2p380x9w4kxydqpxq87l6lshy69fry9q2yrtu037nt44x77uhzkdyn8043n5yj8tqgluvmcl69cquaxr68" #} + trace "[ln_create_invoice] ./lightning-cli invoice ${msatoshi} \"${label}\" \${description}\" ${expiry}" result=$(./lightning-cli invoice ${msatoshi} "${label}" "${description}" ${expiry}) returncode=$? trace_rc ${returncode} trace "[ln_create_invoice] result=${result}" - local bolt11 - bolt11=$(echo ${result} | jq ".bolt11" | tr -d '"') + local bolt11=$(echo ${result} | jq ".bolt11" | tr -d '"') trace "[ln_create_invoice] bolt11=${bolt11}" - sql "INSERT OR IGNORE INTO ln_invoice (bolt11, callback_url) VALUES (\"${bolt11}\", \"${callback_url}\")" + local payment_hash=$(echo ${result} | jq ".payment_hash" | tr -d '"') + trace "[ln_create_invoice] payment_hash=${payment_hash}" + local expires_at=$(echo ${result} | jq ".expires_at" | tr -d '"') + trace "[ln_create_invoice] expires_at=${expires_at}" + + sql "INSERT OR IGNORE INTO ln_invoice (label, bolt11, callback_url, payment_hash, expires_at, msatoshi, description, status) VALUES (\"${label}\", \"${bolt11}\", \"${callback_url}\", \"${payment_hash}\", ${expires_at}, ${msatoshi}, \"${description}\", \"unpaid\")" trace_rc $? echo "${result}" @@ -75,6 +80,22 @@ ln_getinvoice() { return ${returncode} } +ln_delinvoice() { + trace "Entering ln_delinvoice()..." + + local label=${1} + local result + + result=$(./lightning-cli delinvoice ${label} "unpaid") + returncode=$? + trace_rc ${returncode} + trace "[ln_delinvoice] result=${result}" + + echo "${result}" + + return ${returncode} +} + ln_decodebolt11() { trace "Entering ln_decodebolt11()..." diff --git a/proxy_docker/app/script/callbacks_job.sh b/proxy_docker/app/script/callbacks_job.sh index 3de4b77..0308b07 100644 --- a/proxy_docker/app/script/callbacks_job.sh +++ b/proxy_docker/app/script/callbacks_job.sh @@ -44,29 +44,86 @@ do_callbacks() fi done - callbacks=$(sql 'SELECT id, callback_url FROM ln_invoice WHERE NOT calledback AND callback_failed') - trace "[do_callbacks] ln_callbacks=${callbacks}" + callbacks=$(sql "SELECT id, label, bolt11, callback_url, payment_hash, msatoshi, status, pay_index, msatoshi_received, paid_at, description, expires_at FROM ln_invoice WHERE NOT calledback AND callback_failed") + trace "[do_callbacks LN] ln_callbacks=${callbacks}" for row in ${callbacks} do - url=$(echo "${row}" | cut -d '|' -f2) - trace "[do_callbacks LN] url=${url}" - - trace "[do_callbacks LN] curl -H \"X-Forwarded-Proto: https\" ${url}" - curl -H "X-Forwarded-Proto: https" ${url} - returncode=$? - if [ "${returncode}" -eq 0 ]; then - id=$(echo "${row}" | cut -d '|' -f1) - sql "UPDATE ln_invoice SET calledback=1,callback_failed=0 WHERE id=\"${id}\"" - trace_rc $? - else - trace "[do_callbacks LN] callback failed: ${callback_url}" - fi + ln_manage_callback ${row} + trace_rc $? done ) 200>./.callbacks.lock } +ln_manage_callback() { + trace "Entering ln_manage_callback()..." + + local row=$@ + trace "[ln_manage_callback] row=${row}" + + local id=$(echo "${row}" | cut -d '|' -f1) + trace "[ln_manage_callback] id=${id}" + local label=$(echo "${row}" | cut -d '|' -f2) + trace "[ln_manage_callback] label=${label}" + local bolt11=$(echo "${row}" | cut -d '|' -f3) + trace "[ln_manage_callback] bolt11=${bolt11}" + local callback_url=$(echo "${row}" | cut -d '|' -f4) + trace "[ln_manage_callback] callback_url=${callback_url}" + local payment_hash=$(echo "${row}" | cut -d '|' -f5) + trace "[ln_manage_callback] payment_hash=${payment_hash}" + local msatoshi=$(echo "${row}" | cut -d '|' -f6) + trace "[ln_manage_callback] msatoshi=${msatoshi}" + local status=$(echo "${row}" | cut -d '|' -f7) + trace "[ln_manage_callback] status=${status}" + local pay_index=$(echo "${row}" | cut -d '|' -f8) + trace "[ln_manage_callback] pay_index=${pay_index}" + local msatoshi_received=$(echo "${row}" | cut -d '|' -f9) + trace "[ln_manage_callback] msatoshi_received=${msatoshi_received}" + local paid_at=$(echo "${row}" | cut -d '|' -f10) + trace "[ln_manage_callback] paid_at=${paid_at}" + local description=$(echo "${row}" | cut -d '|' -f11) + trace "[ln_manage_callback] description=${description}" + local expires_at=$(echo "${row}" | cut -d '|' -f12) + trace "[ln_manage_callback] expires_at=${expires_at}" + local returncode + + if [ -z "${callback_url}" ]; then + # No callback url provided for that invoice + sql "UPDATE ln_invoice SET calledback=1 WHERE id=\"${id}\"" + trace_rc $? + return + fi + + data="{\"id\":\"${id}\"," + data="${data}\"label\":\"${label}\"," + data="${data}\"bolt11\":\"${bolt11}\"," + data="${data}\"callback_url\":\"${callback_url}\"," + data="${data}\"payment_hash\":\"${payment_hash}\"," + data="${data}\"msatoshi\":${msatoshi}," + data="${data}\"status\":\"${status}\"," + data="${data}\"pay_index\":${pay_index}," + data="${data}\"msatoshi_received\":${msatoshi_received}," + data="${data}\"paid_at\":${paid_at}," + data="${data}\"description\":\"${description}\"," + data="${data}\"expires_at\":${expires_at}}" + trace "[ln_manage_callback] data=${data}" + + curl_callback "${callback_url}" "${data}" + returncode=$? + trace_rc ${returncode} + if [ "${returncode}" -eq 0 ]; then + sql "UPDATE ln_invoice SET calledback=1 WHERE id=\"${id}\"" + trace_rc $? + else + trace "[ln_manage_callback] callback failed: ${callback_url}" + sql "UPDATE ln_invoice SET callback_failed=1 WHERE id=\"${id}\"" + trace_rc $? + fi + + return ${returncode} +} + build_callback() { trace "Entering build_callback()..." @@ -182,7 +239,7 @@ curl_callback() local url=${1} local data=${2} - trace "[curl_callback] curl -H \"Content-Type: application/json\" -d \"${data}\" ${url}" + trace "[curl_callback] curl -H \"Content-Type: application/json\" -H \"X-Forwarded-Proto: https\" -d \"${data}\" ${url}" curl -H "Content-Type: application/json" -H "X-Forwarded-Proto: https" -d "${data}" ${url} local returncode=$? trace_rc ${returncode} diff --git a/proxy_docker/app/script/requesthandler.sh b/proxy_docker/app/script/requesthandler.sh index c595647..8c643f3 100644 --- a/proxy_docker/app/script/requesthandler.sh +++ b/proxy_docker/app/script/requesthandler.sh @@ -289,6 +289,14 @@ main() response_to_client "${response}" ${?} break ;; + ln_delinvoice) + # GET http://192.168.111.152:8080/ln_delinvoice/label + # GET http://192.168.111.152:8080/ln_delinvoice/koNCcrSvhX3dmyFhW + + response=$(ln_delinvoice $(echo "${line}" | cut -d ' ' -f2 | cut -d '/' -f3)) + response_to_client "${response}" ${?} + break + ;; ln_decodebolt11) # GET http://192.168.111.152:8080/ln_decodebolt11/bolt11 # GET http://192.168.111.152:8080/ln_decodebolt11/lntb1pdca82tpp5gv8mn5jqlj6xztpnt4r472zcyrwf3y2c3cvm4uzg2gqcnj90f83qdp2gf5hgcm0d9hzqnm4w3kx2apqdaexgetjyq3nwvpcxgcqp2g3d86wwdfvyxcz7kce7d3n26d2rw3wf5tzpm2m5fl2z3mm8msa3xk8nv2y32gmzlhwjved980mcmkgq83u9wafq9n4w28amnmwzujgqpmapcr3 diff --git a/proxy_docker/app/script/waitanyinvoice.sh b/proxy_docker/app/script/waitanyinvoice.sh index 9865eba..bfd8d75 100644 --- a/proxy_docker/app/script/waitanyinvoice.sh +++ b/proxy_docker/app/script/waitanyinvoice.sh @@ -2,6 +2,7 @@ . ./trace.sh . ./sql.sh +. ./callbacks_job.sh ln_waitanyinvoice() { trace "Entering ln_waitanyinvoice()..." @@ -36,45 +37,18 @@ ln_waitanyinvoice() { bolt11=$(echo ${result} | jq ".bolt11" | tr -d '"') pay_index=$(echo ${result} | jq ".pay_index" | tr -d '"') + msatoshi_received=$(echo ${result} | jq ".msatoshi_received" | tr -d '"') + status=$(echo ${result} | jq ".status" | tr -d '"') + paid_at=$(echo ${result} | jq ".paid_at" | tr -d '"') - row=$(sql "SELECT id, callback_url FROM ln_invoice WHERE NOT calledback AND bolt11=\"${bolt11}\"") + sql "UPDATE ln_invoice SET status=\"${status}\", pay_index=${pay_index}, msatoshi_received=${msatoshi_received}, paid_at=${paid_at} WHERE bolt11=\"${bolt11}\"" + row=$(sql "SELECT id, label, bolt11, callback_url, payment_hash, msatoshi, status, pay_index, msatoshi_received, paid_at, description, expires_at FROM ln_invoice WHERE NOT calledback AND bolt11=\"${bolt11}\"") - id=$(echo ${row} | cut -d '|' -f1) - callback_url=$(echo ${row} | cut -d '|' -f2) - if [ -z "${callback_url}" ]; then - # No callback url provided for that invoice - sql "UPDATE ln_invoice SET calledback=1 WHERE id=\"${id}\"" - trace_rc $? - return - fi - - ln_payment_callback ${callback_url} - returncode=$? - trace_rc ${returncode} - if [ "${returncode}" -eq 0 ]; then - sql "UPDATE ln_invoice SET calledback=1 WHERE id=\"${id}\"" - trace_rc $? - else - trace "[ln_waitanyinvoice] callback failed: ${callback_url}" - sql "UPDATE ln_invoice SET callback_failed=1 WHERE id=\"${id}\"" - trace_rc $? + if [ -n "${row}" ]; then + ln_manage_callback ${row} fi sql "UPDATE cyphernode_props SET value="${pay_index}" WHERE property=\"pay_index\"" - -} - -ln_payment_callback() { - trace "Entering ln_payment_callback()..." - - local url=${1} - - trace "[ln_payment_callback] curl ${url}" - curl -H "X-Forwarded-Proto: https" ${url} - local returncode=$? - trace_rc ${returncode} - - return ${returncode} } while : @@ -82,5 +56,5 @@ do pay_index=$(sql "SELECT value FROM cyphernode_props WHERE property='pay_index'") trace "[waitanyinvoice] pay_index=${pay_index}" ln_waitanyinvoice ${pay_index} - sleep 1 + sleep 5 done