@@ -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 \n HOLD 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