napTu Опубликовано: September 6, 2010 at 14:19 Опубликовано: September 6, 2010 at 14:19 Подскажите, где поправить чтобы был тримминг пробелов имени пароля пришедшие от авторизатора? А еще и приведение имени к нижнему регистру.
madf Опубліковано: September 7, 2010 at 07:00 Опубліковано: September 7, 2010 at 07:00 Подскажите, где поправить чтобы был тримминг пробелов имени пароля пришедшие от авторизатора? А еще и приведение имени к нижнему регистру. В плагине mod_auth_ia. Ваш К.О.
napTu Опубліковано: September 7, 2010 at 12:02 Автор Опубліковано: September 7, 2010 at 12:02 это понятно что проще отмазаться чем помочь ))) я то нашел где, нашел реализацию alltrim, но в cpp - бум-бум и как воткнуть не знаю )) Вероятно в int AUTH_IA::RecvData(char * buffer, int bufferSize) { ... char login[PASSWD_LEN]; //TODO why PASSWD_LEN ? memset(login, 0, PASSWD_LEN); Decrypt(&ctxS, login, buffer + 8, PASSWD_LEN / 8); sip = *((uint32_t*)&outerAddr.sin_addr); sport = htons(outerAddr.sin_port); // ГДЕ ТО ТУТ =============================== user_iter user; if (users->FindByName(login, &user) == 0) { printfd(__FILE__, "User %s FOUND!\n", user->GetLogin().c_str()); PacketProcessor(buffer, dataLen, sip, sport, protoVer, &user); ... способ трима нашел такой: #include <string.h> /* SqueezeSpaces: удаляет из s группы пробелов _по краям_ */ int SqueezeSpaces(char *s) { char *startp, *endp; if (s == NULL) return EOF; for (startp = s; *startp == ' '; startp++) ; if (startp-s > 0) { endp = startp; startp = s; while (*startp++ = *endp++) ; } endp = s+strlen(s); while (*--endp == ' ') *endp = '\0'; return 1; }
madf Опубліковано: September 7, 2010 at 13:53 Опубліковано: September 7, 2010 at 13:53 Да, втыкать там. Код грязновастенький, но вроде рабочий (не проверял). Можно разместить его (без include) прямо в этом файле где-нибуть в конце, и в начале сделать объявление: int SqueezeSpaces(char *s); Воткнуть примерно так: SqueezeSpaces(login); Проверку возвращаемого значения можно не делать т.к. login у нас расположен на стеке и никогда не будет NULL. Если при компиляции будет ругаться на EOF - можно заменить на 0.
madf Опубліковано: September 7, 2010 at 14:02 Опубліковано: September 7, 2010 at 14:02 Код для приведения к нижнему регистру: void strtolower(char * val) { if (val == NULL) return; while ((*val = tolower(*val))) ++val; } Для его использования нужно подключить заголовочный файл: #include <cctype> Объявляется вверху файла так: void strtolower(char * val); Используется в том-же месте так: strtolower(login);
napTu Опубліковано: September 7, 2010 at 14:35 Автор Опубліковано: September 7, 2010 at 14:35 Спасибо! Со SqueezeSpaces собралось, чет предупредило только inetaccess.cpp: In function 'int SqueezeSpaces(char*)': inetaccess.cpp:722: warning: suggest parentheses around assignment used as truth value
madf Опубліковано: September 7, 2010 at 14:41 Опубліковано: September 7, 2010 at 14:41 Спасибо! Со SqueezeSpaces собралось, чет предупредило только inetaccess.cpp: In function 'int SqueezeSpaces(char*)': inetaccess.cpp:722: warning: suggest parentheses around assignment used as truth value Не критично, но можешь заменить: while (*startp++ = *endp++) на while ((*startp++ = *endp++))
napTu Опубліковано: September 7, 2010 at 14:42 Автор Опубліковано: September 7, 2010 at 14:42 Не совсем понимаю как происходит поиск здесь: user_iter user; if (users->FindByName(login, &user) == 0) Логин я переведу в нижний регистр, затем как сделать чтобы поиск производился по именам переведенным в нижний регистр? А затем, уже после найденного имени, укажу что login=user->GetLogin();
napTu Опубліковано: September 7, 2010 at 22:35 Автор Опубліковано: September 7, 2010 at 22:35 попробовал еще и паролю трим сделать, не вышло, даже размер выходного файла не изменился ... map<string, int>::iterator pi; SqueezeSpaces(packetName); pi = packetTypes.find(packetName); if (pi == packetTypes.end()) ...
madf Опубліковано: September 8, 2010 at 07:02 Опубліковано: September 8, 2010 at 07:02 попробовал еще и паролю трим сделать, не вышло, даже размер выходного файла не изменился ... map<string, int>::iterator pi; SqueezeSpaces(packetName); pi = packetTypes.find(packetName); if (pi == packetTypes.end()) ... packetName похож на пароль? Я так понял, в базе все тоже хранится в разных регистрах? Тогда проще забить. Реально. Привести ВСЕ в регистронезависимую форму простыми правками не получится. А пароли так и вобще невозможно (разве только сам авторизатор править). Дело в том что они нигде не передаются от клиента к серверу. Они используются только для шифрования пакетов. И если на клиентской стороне пакет был зашифрован паролем в неправильном регистре и с пробелами то на сервере для его корректной расшифровки нужно будет откуда-то взять такой-же пароль в таком-же регистре и с такими-же пробелами. А это невозможно.
napTu Опубліковано: September 8, 2010 at 08:32 Автор Опубліковано: September 8, 2010 at 08:32 Тогда проще забить. Реально. Поковыряв вчера код тоже так подумал Еще раз спасибо за разъяснения
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас