GyverLamp2 icon indicating copy to clipboard operation
GyverLamp2 copied to clipboard

Не воспринимает пароли к WiFi с запятой

Open h4tr3d opened this issue 2 years ago • 2 comments

Токенайзер бьёт по запятой и заменяет её на '\0', нужно как-то эскейпить её на стороне приложения и восстанавливать в прошивке.

Или, как вариант, передавать размер строк. Т.е. сейчас команда установки выглядит так:

GL,0,10,gaz,pass,with,comma,5,18,50,34

и части with и comma интерпретируются как части другой команды.

Вариант решения такой, что бы не заморачиваться с экранированием, свести команду к:

GL,0,10,SSID_SIZE,SSID,PASS_SIZE,PASS_WITH_ANY_SYMBOLS,5,18,50,34

Процессинг возможен такой:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdint>

int main()
{
    const char *s = "GL,0,10,3,gaz,15,pass,with,comma,5,18,50,34";
    char buf[256]{};
    char data[256]{};
    
    memcpy(buf, s, strlen(s));
    
    int count = 0;
    char *str, *p = buf;
    char *ssid, *pass;
    
    while ((str = strtok_r(p, ",", &p))) {
        uint32_t thisInt = (uint32_t)atoi(str);
        data[count++] = char(thisInt);
        
        //std::cout << str << "\n  -> " << p << '\n';
        
        if (data[1] == 0) {
            if (count == 4) {
                if (strlen(p) >= thisInt) {
                    ssid = p;
                    ssid[thisInt] = '\0';
                    p += thisInt + 1;
                }
            }
            
            if (count == 5) {
                if (strlen(p) >= thisInt) {
                    pass = p;
                    pass[thisInt] = '\0';
                    p += thisInt + 1;
                }
            }
        }
    }
    std::cout << "ssid: " << ssid << ", pass: " << pass << '\n';    
}

h4tr3d avatar Oct 29 '21 08:10 h4tr3d

Я предполагаю, что есть 2 возможных варианта решения:

  1. Сделать в приложении диалог с 2 инпутами, и сразу при передаче передавать с /0
  2. Вместо запятой сделать ; тк этот символ в паролях встречается реже

d347h4ck avatar May 10 '22 15:05 d347h4ck

Первый пункт решает вопрос UI, в протокольной части всё так же будет ,. Второй - не сильно лучше того, что есть. Как вариант, можно кодировать BASE64, там точно только цифры и буквы будут и отправлять. На приёмнике распаковыывать. BASE64 не сильно много ресурсов требует.

h4tr3d avatar May 11 '22 01:05 h4tr3d