add exception instead exit to fix leak | add PING PONG | add password at connexion

This commit is contained in:
kinou-p 2023-02-14 03:08:28 +01:00
parent a72c97f0f8
commit 370e099b22
11 changed files with 104 additions and 71 deletions

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:37 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -18,6 +18,8 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <cstdlib> #include <cstdlib>
#include <exception>
#include <cstring> //std::string #include <cstring> //std::string
#include <cerrno> //errno #include <cerrno> //errno
#include <iostream> //std::cout | cerr #include <iostream> //std::cout | cerr
@ -37,6 +39,14 @@
#define READ_SIZE 10 #define READ_SIZE 10
#define CMD_NBR 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*********************************** */ /* *********************************STRUCT*********************************** */
/* ************************************************************************** */ /* ************************************************************************** */
@ -139,7 +149,7 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY
accessList<clientData> userData; accessList<clientData> userData;
int alive; int alive;
std::string password;
int nbrUser; int nbrUser;
functionTab parsingTab; functionTab parsingTab;
}; };

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/12 23:30:11 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))) // if (-1 == connect(allFds.userData[userNbr].fd, (struct sockaddr *)&allFds.userData[userNbr].addr, sizeof(allFds.userData[userNbr].addr)))
// ft_error("connect() error"); // 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; allFds.userData[userNbr].registered = 1;
print_registered_msg(allFds, userNbr); print_registered_msg(allFds, userNbr);
std::cout << "connect client end\n"; std::cout << "connect client end\n";

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:28:38 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? ) //if nickname ok then (another user has it? )
//ERR_NONICKNAMEGIVEN //ERR_NONICKNAMEGIVEN
allFds.userData[userNbr].nickname = splitBuff[1]; 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); connect_client(allFds, userNbr);
// allFds.userData[userNbr].registered = 1; // allFds.userData[userNbr].registered = 1;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:42 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); password = buffer.substr(5, buffer.npos);
allFds.userData[userNbr].password = buffer; allFds.userData[userNbr].password = password;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:39 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].serverName = splitBuff[3];
allFds.userData[userNbr].realName = realName; 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); connect_client(allFds, userNbr);
// allFds.userData[userNbr].registered = 1; // allFds.userData[userNbr].registered = 1;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 15:40:33 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 // 1459
// ERR_NEEDMOREPARAMS + ERR_BANNEDFROMCHAN // ERR_NEEDMOREPARAMS + ERR_BANNEDFROMCHAN
// ERR_INVITEONLYCHAN + ERR_BADCHANNELKEY // ERR_INVITEONLYCHAN + ERR_BADCHANNELKEY
// ERR_CHANNELISFULL x ERR_BADCHANMASK ? // ERR_CHANNELISFULL x ERR_BADCHANMASK ? +
// ERR_NOSUCHCHANNEL x ERR_TOOMANYCHANNELS x // ERR_NOSUCHCHANNEL x ERR_TOOMANYCHANNELS x
// RPL_TOPIC // RPL_TOPIC
@ -74,48 +74,11 @@ int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector<std::string
void join_or_create(std::vector<std::string> splitBuff, fdList &allFds, int userNbr)
void JOIN(std::string buffer, fdList &allFds, int userNbr)
{ {
std::vector<std::string> splitBuff;
int chanNbr; int chanNbr;
channelData joined_chan; 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]); chanNbr = find_channel(allFds, splitBuff[1]);
if (chanNbr != -1) //chan already exist 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); send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "loop here\n"; std::cout << "loop here\n";
} }
}
void JOIN(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> 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) //send 352 and 315 or 353 and 366 (WHO or NAME)
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/13 00:16:27 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,8 +51,13 @@ void PING(std::string buffer, fdList &allFds, int userNbr)
std::string msg; std::string msg;
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
split(buffer, ' ', 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); 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) // if (splitBuff.size() < 2)
// { // {
// cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n"); // cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n");

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 22:01:25 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:33 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) int main(int ac, char **av)
{ {
if (!(ac == 3 || ac == 2)) if (!(ac == 3))
{ {
//ft_error("wrong number of arguments\nFORMAT: ./ircserv <port> <password>"); //ft_error("wrong number of arguments\nFORMAT: ./ircserv <port> <password>");
std::cout << "wrong number of arguments\nFORMAT: ./ircserv <port> <password>\n"; std::cout << "wrong number of arguments\nFORMAT: ./ircserv <port> <password>\n";
exit(1); exit(1);
} }
std::cout << "============Homemade IRC Server start============" << std::endl; std::cout << "============Homemade IRC Server start============" << std::endl;
// try try
// { {
// initialize(av);
// }
// catch
// {
// }
initialize(av); initialize(av);
}
catch(std::exception &e)
{
std::cout << "Fatal error causing the end of the program :/\n";
}
return (0); return (0);
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:44:20 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -30,7 +30,8 @@ void initialize(char **av)
//allFds.userData.reserve(MAX_EVENTS); //allFds.userData.reserve(MAX_EVENTS);
//allFds.channelList.reserve(MAX_CHAN); //allFds.channelList.reserve(MAX_CHAN);
allFds.password = av[2];
std::cout << "pass= " << av[2] << std::endl;
allFds.nbrUser = 0; allFds.nbrUser = 0;
allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0); allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0);
if (allFds.serverFd == -1) if (allFds.serverFd == -1)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:46:41 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) if (errno)
{ {
std::cerr << "errno: " << strerror(errno) << std::endl; std::cerr << "errno: " << strerror(errno) << std::endl;
exit(errno); throw std::bad_alloc();
//exit(errno);
} }
exit(1); exit(1);
} }