napTu 4 Posted 2010-09-06 14:19:17 Share Posted 2010-09-06 14:19:17 Подскажите, где поправить чтобы был тримминг пробелов имени пароля пришедшие от авторизатора? А еще и приведение имени к нижнему регистру. Link to post Share on other sites
madf 279 Posted 2010-09-07 07:00:14 Share Posted 2010-09-07 07:00:14 Подскажите, где поправить чтобы был тримминг пробелов имени пароля пришедшие от авторизатора? А еще и приведение имени к нижнему регистру. В плагине mod_auth_ia. Ваш К.О. Link to post Share on other sites
napTu 4 Posted 2010-09-07 12:02:27 Author Share Posted 2010-09-07 12:02:27 это понятно что проще отмазаться чем помочь ))) я то нашел где, нашел реализацию 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; } Link to post Share on other sites
madf 279 Posted 2010-09-07 13:53:38 Share Posted 2010-09-07 13:53:38 Да, втыкать там. Код грязновастенький, но вроде рабочий (не проверял). Можно разместить его (без include) прямо в этом файле где-нибуть в конце, и в начале сделать объявление: int SqueezeSpaces(char *s); Воткнуть примерно так: SqueezeSpaces(login); Проверку возвращаемого значения можно не делать т.к. login у нас расположен на стеке и никогда не будет NULL. Если при компиляции будет ругаться на EOF - можно заменить на 0. Link to post Share on other sites
madf 279 Posted 2010-09-07 14:02:33 Share Posted 2010-09-07 14:02:33 Код для приведения к нижнему регистру: void strtolower(char * val) { if (val == NULL) return; while ((*val = tolower(*val))) ++val; } Для его использования нужно подключить заголовочный файл: #include <cctype> Объявляется вверху файла так: void strtolower(char * val); Используется в том-же месте так: strtolower(login); Link to post Share on other sites
napTu 4 Posted 2010-09-07 14:35:19 Author Share Posted 2010-09-07 14:35:19 Спасибо! Со SqueezeSpaces собралось, чет предупредило только inetaccess.cpp: In function 'int SqueezeSpaces(char*)': inetaccess.cpp:722: warning: suggest parentheses around assignment used as truth value Link to post Share on other sites
madf 279 Posted 2010-09-07 14:41:46 Share Posted 2010-09-07 14:41:46 Спасибо! Со 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++)) Link to post Share on other sites
napTu 4 Posted 2010-09-07 14:42:12 Author Share Posted 2010-09-07 14:42:12 Не совсем понимаю как происходит поиск здесь: user_iter user; if (users->FindByName(login, &user) == 0) Логин я переведу в нижний регистр, затем как сделать чтобы поиск производился по именам переведенным в нижний регистр? А затем, уже после найденного имени, укажу что login=user->GetLogin(); Link to post Share on other sites
napTu 4 Posted 2010-09-07 22:35:24 Author Share Posted 2010-09-07 22:35:24 попробовал еще и паролю трим сделать, не вышло, даже размер выходного файла не изменился ... map<string, int>::iterator pi; SqueezeSpaces(packetName); pi = packetTypes.find(packetName); if (pi == packetTypes.end()) ... Link to post Share on other sites
madf 279 Posted 2010-09-08 07:02:16 Share Posted 2010-09-08 07:02:16 попробовал еще и паролю трим сделать, не вышло, даже размер выходного файла не изменился ... map<string, int>::iterator pi; SqueezeSpaces(packetName); pi = packetTypes.find(packetName); if (pi == packetTypes.end()) ... packetName похож на пароль? Я так понял, в базе все тоже хранится в разных регистрах? Тогда проще забить. Реально. Привести ВСЕ в регистронезависимую форму простыми правками не получится. А пароли так и вобще невозможно (разве только сам авторизатор править). Дело в том что они нигде не передаются от клиента к серверу. Они используются только для шифрования пакетов. И если на клиентской стороне пакет был зашифрован паролем в неправильном регистре и с пробелами то на сервере для его корректной расшифровки нужно будет откуда-то взять такой-же пароль в таком-же регистре и с такими-же пробелами. А это невозможно. Link to post Share on other sites
napTu 4 Posted 2010-09-08 08:32:28 Author Share Posted 2010-09-08 08:32:28 Тогда проще забить. Реально. Поковыряв вчера код тоже так подумал Еще раз спасибо за разъяснения Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now