From 370e099b22d4329f01ec8a4904d8a8fb9969a53b Mon Sep 17 00:00:00 2001 From: kinou-p Date: Tue, 14 Feb 2023 03:08:28 +0100 Subject: [PATCH] add exception instead exit to fix leak | add PING PONG | add password at connexion --- includes/ft_irc.hpp | 16 ++++- srcs/commands/auth/connect_client.cpp | 11 +++- srcs/commands/auth/nick.cpp | 4 +- srcs/commands/auth/pass.cpp | 4 +- srcs/commands/auth/user.cpp | 4 +- srcs/commands/channel/join.cpp | 88 +++++++++++++++------------ srcs/commands/other/ping_pong.cpp | 11 +++- srcs/commands/parse_commands.cpp | 4 +- srcs/main.cpp | 21 +++---- srcs/start_server.cpp | 7 ++- srcs/utils.cpp | 5 +- 11 files changed, 104 insertions(+), 71 deletions(-) diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index d0441b9..1d486d8 100644 --- a/includes/ft_irc.hpp +++ b/includes/ft_irc.hpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/01 17:27:37 by apommier #+# #+# */ -/* Updated: 2023/02/13 19:48:40 by apommier ### ########.fr */ +/* Updated: 2023/02/14 02:40:49 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,9 @@ #include //inet #include -#include +#include +#include + #include //std::string #include //errno #include //std::cout | cerr @@ -37,6 +39,14 @@ #define READ_SIZE 10 #define CMD_NBR 10 + + // if (!allFds.userData[userNbr].registered) + // { + // /*change error*/ + // cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS + // return ; + // } + /* ************************************************************************** */ /* *********************************STRUCT*********************************** */ /* ************************************************************************** */ @@ -139,7 +149,7 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY accessList userData; int alive; - + std::string password; int nbrUser; functionTab parsingTab; }; diff --git a/srcs/commands/auth/connect_client.cpp b/srcs/commands/auth/connect_client.cpp index 91aaa08..6141ea4 100644 --- a/srcs/commands/auth/connect_client.cpp +++ b/srcs/commands/auth/connect_client.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/12 23:30:11 by apommier #+# #+# */ -/* Updated: 2023/02/13 11:04:52 by apommier ### ########.fr */ +/* Updated: 2023/02/14 02:19:19 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,15 @@ void connect_client(fdList &allFds, int userNbr) // if (-1 == connect(allFds.userData[userNbr].fd, (struct sockaddr *)&allFds.userData[userNbr].addr, sizeof(allFds.userData[userNbr].addr))) // ft_error("connect() error"); + if (allFds.userData[userNbr].password.empty() || allFds.userData[userNbr].password != allFds.password) + { + std::cout << "password= " << allFds.userData[userNbr].password << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "464 * :Password incorrect\n"); + return ; + } + //464 ERR_PASSWDMISMATCH + //":Password incorrect" + allFds.userData[userNbr].registered = 1; print_registered_msg(allFds, userNbr); std::cout << "connect client end\n"; diff --git a/srcs/commands/auth/nick.cpp b/srcs/commands/auth/nick.cpp index 4909123..2b0bc8f 100644 --- a/srcs/commands/auth/nick.cpp +++ b/srcs/commands/auth/nick.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:28:38 by apommier #+# #+# */ -/* Updated: 2023/02/12 23:37:37 by apommier ### ########.fr */ +/* Updated: 2023/02/14 01:25:31 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ void NICK(std::string buffer, fdList &allFds, int userNbr) //if nickname ok then (another user has it? ) //ERR_NONICKNAMEGIVEN allFds.userData[userNbr].nickname = splitBuff[1]; - if (!allFds.userData[userNbr].registered && !allFds.userData[userNbr].userName.empty()) + if (!allFds.userData[userNbr].registered && !allFds.userData[userNbr].userName.empty() /*&& !allFds.userData[userNbr].password.empty()*/) { connect_client(allFds, userNbr); // allFds.userData[userNbr].registered = 1; diff --git a/srcs/commands/auth/pass.cpp b/srcs/commands/auth/pass.cpp index 15affd0..f0c3756 100644 --- a/srcs/commands/auth/pass.cpp +++ b/srcs/commands/auth/pass.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:40:42 by apommier #+# #+# */ -/* Updated: 2023/02/13 17:33:51 by apommier ### ########.fr */ +/* Updated: 2023/02/14 02:28:03 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,5 +36,5 @@ void PASS(std::string buffer, fdList &allFds, int userNbr) // } password = buffer.substr(5, buffer.npos); - allFds.userData[userNbr].password = buffer; + allFds.userData[userNbr].password = password; } \ No newline at end of file diff --git a/srcs/commands/auth/user.cpp b/srcs/commands/auth/user.cpp index 694738c..bd81e11 100644 --- a/srcs/commands/auth/user.cpp +++ b/srcs/commands/auth/user.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:40:39 by apommier #+# #+# */ -/* Updated: 2023/02/13 20:05:39 by apommier ### ########.fr */ +/* Updated: 2023/02/14 01:25:22 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,7 @@ void USER(std::string buffer, fdList &allFds, int userNbr) allFds.userData[userNbr].serverName = splitBuff[3]; allFds.userData[userNbr].realName = realName; - if (!allFds.userData[userNbr].nickname.empty()) + if (!allFds.userData[userNbr].nickname.empty() /*&& !allFds.userData[userNbr].password.empty()*/) { connect_client(allFds, userNbr); // allFds.userData[userNbr].registered = 1; diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index 4e92477..23c97bd 100644 --- a/srcs/commands/channel/join.cpp +++ b/srcs/commands/channel/join.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 15:40:33 by apommier #+# #+# */ -/* Updated: 2023/02/13 20:21:28 by apommier ### ########.fr */ +/* Updated: 2023/02/14 00:41:43 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,7 @@ // 1459 // ERR_NEEDMOREPARAMS + ERR_BANNEDFROMCHAN // ERR_INVITEONLYCHAN + ERR_BADCHANNELKEY -// ERR_CHANNELISFULL x ERR_BADCHANMASK ? +// ERR_CHANNELISFULL x ERR_BADCHANMASK ? + // ERR_NOSUCHCHANNEL x ERR_TOOMANYCHANNELS x // RPL_TOPIC @@ -74,48 +74,11 @@ int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector splitBuff, fdList &allFds, int userNbr) { - std::vector splitBuff; int chanNbr; channelData joined_chan; - std::cout << "==========join start========\n"; - std::cout << "userNbr= " << userNbr << std::endl; - if (!allFds.userData[userNbr].registered) - { - /*change error*/ - cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS - return ; - } - split(buffer, ' ', splitBuff); - if (splitBuff.size() < 2) - { - /*change error*/ - cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS - return ; - } - //if (splitBuff[1].find(' ') != std::string::npos || splitBuff[1].find(7) != std::string::npos) - if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') - { - //leave_all(allFds, userNbr); - return ; - } - if (splitBuff[1] == "0") - { - leave_all(allFds, userNbr); - return ; - } chanNbr = find_channel(allFds, splitBuff[1]); if (chanNbr != -1) //chan already exist { @@ -146,5 +109,50 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr) send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); std::cout << "loop here\n"; } +} + + + + + + + + + +void JOIN(std::string buffer, fdList &allFds, int userNbr) +{ + std::vector splitBuff; + std::string msg; + std::cout << "==========join start========\n"; + + std::cout << "userNbr= " << userNbr << std::endl; + if (!allFds.userData[userNbr].registered) + { + /*change error*/ + cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS + return ; + } + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 2) + { + /*change error*/ + cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS + return ; + } + //if (splitBuff[1].find(' ') != std::string::npos || splitBuff[1].find(7) != std::string::npos) + if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') + { + //error bad channel name + msg = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n"; + cmd_error(allFds, allFds.userData[userNbr].fd, msg); + //:Bad Channel Mask + return ; + } + if (splitBuff[1] == "0") + { + leave_all(allFds, userNbr); + return ; + } + join_or_create(splitBuff, allFds, userNbr); //send 352 and 315 or 353 and 366 (WHO or NAME) } \ No newline at end of file diff --git a/srcs/commands/other/ping_pong.cpp b/srcs/commands/other/ping_pong.cpp index 555a0c6..4729f7d 100644 --- a/srcs/commands/other/ping_pong.cpp +++ b/srcs/commands/other/ping_pong.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/13 00:16:27 by apommier #+# #+# */ -/* Updated: 2023/02/13 22:54:14 by apommier ### ########.fr */ +/* Updated: 2023/02/14 00:11:54 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,14 +51,19 @@ void PING(std::string buffer, fdList &allFds, int userNbr) std::string msg; std::vector splitBuff; split(buffer, ' ', splitBuff); - msg = ":irc.local PONG irc.local :irc.local"; + msg = ":irc.local PONG irc.local :" + splitBuff[1] + "\n"; + //msg = "PONG irc.local " + splitBuff[1]; send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0); + std::cout << "pong send\n"; + std::cout << "/r = " << (int)'\r' << "\n"; + std::cout << "/n = " << (int)'\n' << "\n"; + std::cout << "msg=" << msg << "\n"; // if (splitBuff.size() < 2) // { // cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n"); // //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18); // return ; // } - + return ; } \ No newline at end of file diff --git a/srcs/commands/parse_commands.cpp b/srcs/commands/parse_commands.cpp index e6dfbec..adf7eb2 100644 --- a/srcs/commands/parse_commands.cpp +++ b/srcs/commands/parse_commands.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 22:01:25 by apommier #+# #+# */ -/* Updated: 2023/02/13 19:44:43 by apommier ### ########.fr */ +/* Updated: 2023/02/14 01:16:34 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,7 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr) std::cout << "===========parse command=============" << std::endl; std::vector splitBuff; int a = 0; - + if (buffer.find(13) != std::string::npos) //change that pls { std::cout << "pos of bitch= " << buffer.find(13) << std::endl; diff --git a/srcs/main.cpp b/srcs/main.cpp index cd5f6d5..9068700 100644 --- a/srcs/main.cpp +++ b/srcs/main.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/01 17:27:33 by apommier #+# #+# */ -/* Updated: 2023/02/12 22:35:11 by apommier ### ########.fr */ +/* Updated: 2023/02/14 03:00:42 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,21 +14,20 @@ int main(int ac, char **av) { - if (!(ac == 3 || ac == 2)) + if (!(ac == 3)) { //ft_error("wrong number of arguments\nFORMAT: ./ircserv "); std::cout << "wrong number of arguments\nFORMAT: ./ircserv \n"; exit(1); } std::cout << "============Homemade IRC Server start============" << std::endl; - // try - // { - // initialize(av); - // } - // catch - // { - - // } - initialize(av); + try + { + initialize(av); + } + catch(std::exception &e) + { + std::cout << "Fatal error causing the end of the program :/\n"; + } return (0); } \ No newline at end of file diff --git a/srcs/start_server.cpp b/srcs/start_server.cpp index 0c2a1d7..28c0327 100644 --- a/srcs/start_server.cpp +++ b/srcs/start_server.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:44:20 by apommier #+# #+# */ -/* Updated: 2023/02/13 00:04:55 by apommier ### ########.fr */ +/* Updated: 2023/02/14 01:51:55 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,11 +26,12 @@ void initialize(char **av) int opt = 1; struct sockaddr_in addr; //int addrLen = sizeof(addr); - fdList allFds; + fdList allFds; //allFds.userData.reserve(MAX_EVENTS); //allFds.channelList.reserve(MAX_CHAN); - + allFds.password = av[2]; + std::cout << "pass= " << av[2] << std::endl; allFds.nbrUser = 0; allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0); if (allFds.serverFd == -1) diff --git a/srcs/utils.cpp b/srcs/utils.cpp index d3e2c67..a5d0803 100644 --- a/srcs/utils.cpp +++ b/srcs/utils.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:46:41 by apommier #+# #+# */ -/* Updated: 2023/02/13 10:52:07 by apommier ### ########.fr */ +/* Updated: 2023/02/14 02:56:48 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,8 @@ void ft_error(std::string str) if (errno) { std::cerr << "errno: " << strerror(errno) << std::endl; - exit(errno); + throw std::bad_alloc(); + //exit(errno); } exit(1); }