Skip to content

Commit 07f23ef

Browse files
committed
ALL WORKING
1 parent e7e5a60 commit 07f23ef

1 file changed

Lines changed: 73 additions & 41 deletions

File tree

lnpos/lnpos.ino

Lines changed: 73 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ void accessPoint()
351351
}
352352
else if (pinToShow == securityPin)
353353
{
354-
error(" SETTINGS", "HOLD 1 FOR USB", "");
354+
error(" SETTINGS", "HOLD 1 FOR USB \nHOLD 2 TO RESET", "");
355355
// start portal (any key pressed on startup)
356356
int count = 0;
357357
while (count < 10)
@@ -370,6 +370,10 @@ void accessPoint()
370370
return;
371371
}
372372
}
373+
if (key == '2')
374+
{
375+
ESP.restart();
376+
}
373377
}
374378
}
375379
else
@@ -1436,26 +1440,33 @@ bool getSats()
14361440
return false;
14371441
}
14381442

1439-
const String toPost = "{\"amount\" : 1, \"from\" :\"" + String(lncurrencyChar) + "\"}";
1443+
const String toPost = "{\"amount\" : 1, \"from_\" :\"" + String(lncurrencyChar) + "\", \"to\" : \"sat\"}";
14401444
const String url = "/api/v1/conversion";
14411445
client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Host: " + String(lnbitsServerChar) + "\r\n" + "User-Agent: ESP32\r\n" + "X-Api-Key: " + String(invoiceChar) + " \r\n" + "Content-Type: application/json\r\n" + "Connection: close\r\n" + "Content-Length: " + toPost.length() + "\r\n" + "\r\n" + toPost + "\n");
14421446

1447+
// Skip response headers
14431448
while (client.connected())
14441449
{
1445-
const String line = client.readStringUntil('\n');
1450+
String line = client.readStringUntil('\n');
14461451
if (line == "\r")
1447-
{
14481452
break;
1449-
}
14501453
}
14511454

1452-
const String line = client.readString();
1453-
StaticJsonDocument<150> doc;
1454-
DeserializationError error = deserializeJson(doc, line);
1455-
if (error)
1455+
// Read entire body
1456+
String payload;
1457+
while (client.available())
1458+
{
1459+
char c = client.read();
1460+
payload += c;
1461+
}
1462+
1463+
StaticJsonDocument<3000> doc;
1464+
DeserializationError jsonError = deserializeJson(doc, payload);
1465+
1466+
if (jsonError)
14561467
{
14571468
Serial.print("deserializeJson() failed: ");
1458-
Serial.println(error.f_str());
1469+
Serial.println(jsonError.f_str());
14591470
return false;
14601471
}
14611472

@@ -1487,29 +1498,39 @@ bool getInvoice()
14871498
const String toPost = "{\"out\": false,\"amount\" : " + String(noSats.toInt()) + ", \"memo\" :\"Online PoS-" + String(random(1, 1000)) + "\"}";
14881499
const String url = "/api/v1/payments";
14891500
client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Host: " + lnbitsServerChar + "\r\n" + "User-Agent: ESP32\r\n" + "X-Api-Key: " + invoiceChar + " \r\n" + "Content-Type: application/json\r\n" + "Connection: close\r\n" + "Content-Length: " + toPost.length() + "\r\n" + "\r\n" + toPost + "\n");
1490-
1501+
// Skip response headers
14911502
while (client.connected())
14921503
{
1493-
const String line = client.readStringUntil('\n');
1494-
1504+
String line = client.readStringUntil('\n');
14951505
if (line == "\r")
1496-
{
14971506
break;
1498-
}
14991507
}
1500-
const String line = client.readString();
15011508

1502-
StaticJsonDocument<1000> doc;
1503-
DeserializationError error = deserializeJson(doc, line);
1504-
if (error)
1509+
// IMPORTANT, to skip "443\r\n
1510+
client.readStringUntil('\n');
1511+
1512+
// Read JSON payload
1513+
String payload;
1514+
while (client.connected())
1515+
{
1516+
String line = client.readStringUntil('\n');
1517+
if (line == "\r" || line.length() == 0)
1518+
break;
1519+
payload += line + "\n";
1520+
}
1521+
1522+
Serial.println(payload);
1523+
StaticJsonDocument<3000> doc;
1524+
DeserializationError jsonError = deserializeJson(doc, payload);
1525+
if (jsonError)
15051526
{
15061527
Serial.print("deserializeJson() failed: ");
1507-
Serial.println(error.f_str());
1528+
Serial.println(jsonError.f_str());
15081529
return false;
15091530
}
15101531

15111532
const char *payment_hash = doc["checking_id"];
1512-
const char *payment_request = doc["payment_request"];
1533+
const char *payment_request = doc["bolt11"];
15131534
qrData = payment_request;
15141535
dataId = payment_hash;
15151536

@@ -1533,24 +1554,28 @@ bool checkInvoice()
15331554

15341555
const String url = "/api/v1/payments/";
15351556
client.print(String("GET ") + url + dataId + " HTTP/1.1\r\n" + "Host: " + lnbitsServerChar + "\r\n" + "User-Agent: ESP32\r\n" + "Content-Type: application/json\r\n" + "Connection: close\r\n\r\n");
1557+
// Skip response headers
15361558
while (client.connected())
15371559
{
1538-
const String line = client.readStringUntil('\n');
1560+
String line = client.readStringUntil('\n');
15391561
if (line == "\r")
1540-
{
15411562
break;
1542-
}
15431563
}
15441564

1545-
const String line = client.readString();
1546-
Serial.println(line);
1547-
StaticJsonDocument<2000> doc;
1565+
// Read entire body
1566+
String payload;
1567+
while (client.available())
1568+
{
1569+
char c = client.read();
1570+
payload += c;
1571+
}
15481572

1549-
DeserializationError error = deserializeJson(doc, line);
1550-
if (error)
1573+
StaticJsonDocument<3000> doc;
1574+
DeserializationError jsonError = deserializeJson(doc, payload);
1575+
if (jsonError)
15511576
{
15521577
Serial.print("deserializeJson() failed: ");
1553-
Serial.println(error.f_str());
1578+
Serial.println(jsonError.f_str());
15541579
return false;
15551580
}
15561581
if (doc["paid"])
@@ -1612,10 +1637,13 @@ bool makeLNURL()
16121637
String secret;
16131638
char hexbuffer[3];
16141639

1615-
if (selection == "Offline PoS") {
1640+
if (selection == "Offline PoS")
1641+
{
16161642
preparedURL = baseURLPoS;
16171643
secret = secretPoS;
1618-
} else {
1644+
}
1645+
else
1646+
{
16191647
// ATM
16201648
preparedURL = baseURLATM;
16211649
secret = secretATM;
@@ -1624,7 +1652,8 @@ bool makeLNURL()
16241652
int salt_length = 8;
16251653
unsigned char salt[salt_length];
16261654

1627-
for (int i = 0; i < salt_length; i++) {
1655+
for (int i = 0; i < salt_length; i++)
1656+
{
16281657
salt[i] = random(0, 256);
16291658
}
16301659

@@ -1646,7 +1675,8 @@ bool makeLNURL()
16461675
size_t payload_len = payload.length();
16471676
int padding = 16 - (payload_len % 16);
16481677
payload_len += padding;
1649-
for (int i = 0; i < padding; i++) {
1678+
for (int i = 0; i < padding; i++)
1679+
{
16501680
payload += String((char)padding);
16511681
}
16521682

@@ -1660,7 +1690,7 @@ bool makeLNURL()
16601690
memcpy(salted + 16, encrypted, payload_len);
16611691

16621692
preparedURL += "?p=";
1663-
preparedURL += toBase64(salted, payload_len+16, BASE64_URLSAFE);
1693+
preparedURL += toBase64(salted, payload_len + 16, BASE64_URLSAFE);
16641694
Serial.println(preparedURL);
16651695

16661696
char Buf[200];
@@ -1896,17 +1926,19 @@ void printSleepAnimationFrame(String text, int wait)
18961926
}
18971927

18981928
//////////ENCRYPTION///////////////
1899-
void encrypt(unsigned char* key, unsigned char* iv, int length, const char* plainText, unsigned char* outputBuffer){
1929+
void encrypt(unsigned char *key, unsigned char *iv, int length, const char *plainText, unsigned char *outputBuffer)
1930+
{
19001931
mbedtls_aes_context aes;
19011932
mbedtls_aes_init(&aes);
19021933
mbedtls_aes_setkey_enc(&aes, key, 256); // AES-256 requires a 32-byte key
1903-
mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, length, iv, (const unsigned char*)plainText, outputBuffer);
1934+
mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, length, iv, (const unsigned char *)plainText, outputBuffer);
19041935
mbedtls_aes_free(&aes);
19051936
}
19061937

1907-
void deriveKeyAndIV(const char* secret, unsigned char* salt, unsigned char* outputBuffer) {
1938+
void deriveKeyAndIV(const char *secret, unsigned char *salt, unsigned char *outputBuffer)
1939+
{
19081940
mbedtls_md5_context md5_ctx;
1909-
unsigned char data[24]; // 16 bytes key + 8 bytes salt
1941+
unsigned char data[24]; // 16 bytes key + 8 bytes salt
19101942
unsigned char md5Output[16]; // 16 bytes for MD5 output
19111943

19121944
memcpy(data, secret, 16);
@@ -1922,7 +1954,8 @@ void deriveKeyAndIV(const char* secret, unsigned char* salt, unsigned char* outp
19221954

19231955
unsigned char data_md5[16 + 16 + 8]; // 16 bytes md5 output + 16 bytes key + 8 bytes salt
19241956

1925-
for (int i = 16; i <= 48; i+=16) {
1957+
for (int i = 16; i <= 48; i += 16)
1958+
{
19261959
memcpy(data_md5, md5Output, 16);
19271960
memcpy(data_md5 + 16, data, 24);
19281961
mbedtls_md5_init(&md5_ctx);
@@ -1934,4 +1967,3 @@ void deriveKeyAndIV(const char* secret, unsigned char* salt, unsigned char* outp
19341967

19351968
mbedtls_md5_free(&md5_ctx);
19361969
}
1937-

0 commit comments

Comments
 (0)