[C++] Wyrażenie regularne - błędne??

0

Witam.
Korzystam z biblioteki wyrażeń regularnych (nagłówek pcreposix.h) żeby zweryfikować dane odbierane od klienta przez serwer.
Oto wyrażenie regularne, które sprawdzam:

"^LOGIN( )+((`username`|`password`){1}='.*'( )*){2}( )*;$"

No i jest problem bo teraz po wysłaniu poniższych danych do serwera częśc pasuje a część nie i nie wiem dlaczego bo mi wydaje się ze jest wszystko dobrze:

DOBRE:

LOGIN `username`='sdg' `password`='sdgsdg';
LOGIN `username`='sdg3' `password`='sdgsdgas';
LOGIN `username`='sdgasfasfasdf3' `password`='asf';
LOGIN `username`='as3' `password`='asf';
LOGIN `username`='as3er' `password`='rw';
LOGIN `username`='as3er' `password`='rwa';

ZŁE: (mimo iż na oko zgadzają się z moim wyrażeniem regularnym)

LOGIN `username`='sdg3' `password`='sdgsdg';
LOGIN `username`='as3er' `password`='r';

Korzystam z kodowania UTF-8 (kompilator wspiera mi to kodowanie z typie char).
Bardzo proszę o pomoc co może być złe? (nie ma sensu wdawać się w pozostały kod bo tam nic nie ma oprócz wysłania tych danych i odebrania ich (zapisania do pliku w celu sprawdzenia przeze mnie czy są dobrze wysłane i poróbnaniu ich z wyrażeniem regularnym.) I tak się zastanawiam czy to nie coś przez to kodowanie UTF-8 ;/

0

Teraz tak testowałem i wyszło na to ze jak kilka razy wysyłam jedne i te same dane to są różnie interpretowane... Raz dobrze raz źle... Jak sie tam programowi chce ;/ Normalnie brak mi już sił ;/

Oto jest kod który analizuje odebrane dane, bo może jednak faktycznie coś tu jest źle:

bool LoginUser(int loger_socket, char * recived_login, struct connected_sock * user_list, int user_nr)
    {
        regex_t preg;
        if(!regcomp(&preg, "^LOGIN( )+`username`='.*'( )+`password`='.*'( )*;$", REG_UTF8))
        {
         // Poprawność zapytania
          if(!regexec(&preg, recived_login, 0, NULL, 0))
          {
            regex_t username;
            regex_t password;
            regmatch_t username_match;
            regmatch_t password_match;
            if(!regcomp(&username, "`username`='.*?'", 0) && !regcomp(&password, "`password`='.*?'", 0))
            {
              if(!regexec(&username, recived_login, 1, &username_match, 0) && !regexec(&password, recived_login, 1, &password_match, 0))
              {
                char * login = NULL;
                    login = (char *) realloc(login, username_match.rm_eo-username_match.rm_so-12);
                    memcpy(login, recived_login+username_match.rm_so+12, username_match.rm_eo-username_match.rm_so-13);
                    login[username_match.rm_eo-username_match.rm_so-13] = '\0';
                char * pass = NULL;
                    pass = (char *) realloc(pass, password_match.rm_eo-password_match.rm_so-12);
                    memcpy(pass, recived_login+password_match.rm_so+12, password_match.rm_eo-password_match.rm_so-13);
                    pass[password_match.rm_eo-password_match.rm_so-13] = '\0';

                // Przekonwertowane uprawnienia
                  int right_int;

                // Skompletowane zapytanie
                  char * get_rights = NULL;
                  int get_rights_len = 0;

                // Składowe zapytania
                  char * part1 = "SELECT `query_rights` FROM `";  int part1_len = 28;
                  char * part2 = "user` WHERE `username`='";      int part2_len = 24;
                  char * part3 = "' AND `password`='";            int part3_len = 18;
                  char * part4 = "';";                            int part4_len = 2;
                  /* char * mysql_prefix */                       int prefix_len = strlen(mysql_prefix);
                  /* char * login = "root"; */                    int login_len = strlen(login);
                  /* char * pass = "kompdomowy1"; */              int pass_len = strlen(pass);

                // Realokacja zapytania w pamięci
                  get_rights = (char *) realloc(get_rights, part1_len+prefix_len+part2_len+login_len+part3_len+pass_len+part4_len+1);

                //############### SKLEJANIE ZAPYTANIA ###############
                  // Częsć pierwsza
                    memcpy(get_rights, part1, part1_len);
                    get_rights_len += part1_len;
                  // Prefix tabel
                    memcpy(get_rights+get_rights_len, mysql_prefix, prefix_len);
                    get_rights_len += prefix_len;
                  // Część druga
                    memcpy(get_rights+get_rights_len, part2, part2_len);
                    get_rights_len += part2_len;
                  // Login
                    memcpy(get_rights+get_rights_len, login, login_len);
                    get_rights_len += login_len;
                  // Część trzecia
                    memcpy(get_rights+get_rights_len, part3, part3_len);
                    get_rights_len += part3_len;
                  // Hasło
                    memcpy(get_rights+get_rights_len, pass, pass_len);
                    get_rights_len += pass_len;
                  // Część czwarta
                    memcpy(get_rights+get_rights_len, part4, part4_len);
                    get_rights_len += part4_len;
                //###################################################

                // Wysłanie zapytania
                  if(!mysql_real_query(mysql_handle, get_rights, strlen(get_rights)))
                  {
                    // Zwrócenie wyniku
                      MYSQL_RES * params = mysql_use_result(mysql_handle);
                    // Zapisanie uprawnień to zmiennej
                      MYSQL_ROW right = mysql_fetch_row(params);

                    // Sprawdzenie czy jest taki user
                      if(right)
                      {
                        // Sprawdzanie uprawnień do korzystania z programu
                          if((right_int = atoi(right[0])) && user_list[user_nr].socket == loger_socket)
                          {
                            // Zalogowanie usera
                              user_list[user_nr].rights = right_int;
                              user_list[user_nr].login = login;
                              SEND_DATA(right[0],loger_socket);

                            // Czyszczenie pamięci po wykorzystaniu wyniku
                              mysql_free_result(params);

                              return true;
                          }
                          else
                          {
                            // Uprawnienia wynosiły 0
                              SEND_ERROR("@~E:002",loger_socket);

                            // Czyszczenie pamięci po wykorzystaniu wyniku
                              mysql_free_result(params);

                              return false;
                          }
                      }
                      else
                      {
                        // Nie było takiego usera
                          SEND_ERROR("@~E:001",loger_socket);

                        // Czyszczenie pamięci po wykorzystaniu wyniku
                          mysql_free_result(params);

                          return false;
                      }
                  }
                  else
                  {
                    // Problem z serwerem (powiadom administratora)
                      SEND_ERROR("@~E:555",loger_socket);

                      return false;
                  }
              }
              else
              {
                // Błędna treśc zapytania hasła
                  SEND_ERROR("@~E:665",loger_socket);

                  return false;
              }
            }
            else
            {
              // Problem z kompilacją zapytania
                SEND_ERROR("@~E:777",loger_socket);

                return false;
            }
          }
          else
          {
            // Błędna treśc zapytania
              SEND_ERROR("@~E:667",loger_socket);

              return false;
          }
        }
        else
        {
          // Problem z kompilacją zapytania
            SEND_ERROR("@~E:777",loger_socket);

            return false;
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1