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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <cstdlib>
#include <exception>
#include <cstring> //std::string
#include <cerrno> //errno
#include <iostream> //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<clientData> userData;
int alive;
std::string password;
int nbrUser;
functionTab parsingTab;
};

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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";

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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<std::string
void JOIN(std::string buffer, fdList &allFds, int userNbr)
void join_or_create(std::vector<std::string> splitBuff, fdList &allFds, int userNbr)
{
std::vector<std::string> 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<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)
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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::vector<std::string> 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");

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <port> <password>");
std::cout << "wrong number of arguments\nFORMAT: ./ircserv <port> <password>\n";
exit(1);
}
std::cout << "============Homemade IRC Server start============" << std::endl;
// try
// {
// initialize(av);
// }
// catch
// {
// }
try
{
initialize(av);
}
catch(std::exception &e)
{
std::cout << "Fatal error causing the end of the program :/\n";
}
return (0);
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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.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)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}