bool FN_IS_VALID_LOGIN_STRING(const char *str) { const char* tmp; if (!str || !*str) return false; if (strlen(str) < 2) return false; for (tmp = str; *tmp; ++tmp) { // 알파벳과 수자만 허용 if (isdigit(*tmp) || isalpha(*tmp)) continue; // 캐나다는 몇몇 특수문자 허용 if (LC_IsCanada()) { switch (*tmp) { case ' ': case '_': case '-': case '.': case '!': case '@': case '#': case '$': case '%': case '^': case '&': case '*': case '(': case ')': continue; } } if (LC_IsYMIR() == true || LC_IsKorea() == true) { switch (*tmp) { case '-' : case '_' : continue; } } if (LC_IsBrazil() == true) { switch (*tmp) { case '_' : case '-' : case '=' : continue; } } if (LC_IsJapan() == true) { switch (*tmp) { case '-' : case '_' : case '@': case '#': continue; } } return false; } return true; }
void interpret_command(LPCHARACTER ch, const char * argument, size_t len) { if (NULL == ch) { sys_err ("NULL CHRACTER"); return ; } char cmd[128 + 1]; // buffer overflow 문제가 생기지 않도록 일부러 길이를 짧게 잡음 char new_line[256 + 1]; const char * line; int icmd; if (len == 0 || !*argument) return; double_dollar(argument, len, new_line, sizeof(new_line)); size_t cmdlen; line = first_cmd(new_line, cmd, sizeof(cmd), &cmdlen); for (icmd = 1; *cmd_info[icmd].command != '\n'; ++icmd) { if (cmd_info[icmd].command_pointer == do_cmd) { if (!strcmp(cmd_info[icmd].command, cmd)) // do_cmd는 모든 명령어를 쳐야 할 수 있다. break; } else if (!strncmp(cmd_info[icmd].command, cmd, cmdlen)) break; } if (ch->GetPosition() < cmd_info[icmd].minimum_position) { switch (ch->GetPosition()) { case POS_MOUNTING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("탄 상태에서는 할 수 없습니다.")); break; case POS_DEAD: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("쓰러진 상태에서는 할 수 없습니다.")); break; case POS_SLEEPING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("꿈속에서 어떻게요?")); break; case POS_RESTING: case POS_SITTING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("먼저 일어 나세요.")); break; /* case POS_FIGHTING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("목숨을 걸고 전투 중 입니다. 집중 하세요.")); break; */ default: sys_err("unknown position %d", ch->GetPosition()); break; } return; } if (*cmd_info[icmd].command == '\n') { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 명령어는 없습니다")); return; } if (cmd_info[icmd].gm_level && cmd_info[icmd].gm_level > ch->GetGMLevel()) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 명령어는 없습니다")); return; } if (strncmp("phase", cmd_info[icmd].command, 5) != 0) // 히든 명령어 처리 sys_log(0, "COMMAND: %s: %s", ch->GetName(), cmd_info[icmd].command); ((*cmd_info[icmd].command_pointer) (ch, line, icmd, cmd_info[icmd].subcmd)); if (ch->GetGMLevel() >= GM_LOW_WIZARD) { if (cmd_info[icmd].gm_level >= GM_LOW_WIZARD) { if (LC_IsEurope() == true || /*LC_IsNewCIBN() == true || */LC_IsCanada() == true) { char buf[1024]; snprintf( buf, sizeof(buf), "%s", argument ); LogManager::instance().GMCommandLog(ch->GetPlayerID(), ch->GetName(), ch->GetDesc()->GetHostName(), g_bChannel, buf); } } } }