start coding command pass/nick/user and add client/channel struct

This commit is contained in:
kinou-p 2023-02-07 20:28:19 +01:00
parent 4bc54b29d7
commit fb1b7b10cf
11 changed files with 276 additions and 144 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:29 by apommier #+# #+# # # Created: 2022/12/01 17:27:29 by apommier #+# #+# #
# Updated: 2022/12/20 23:31:36 by apommier ### ########.fr # # Updated: 2023/02/07 14:47:20 by apommier ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
@ -18,7 +18,11 @@ SRCS := main.cpp\
client_request.cpp\ client_request.cpp\
new_connection.cpp\ new_connection.cpp\
server_loop.cpp\ server_loop.cpp\
commands/parse_commands.cpp commands/parse_commands.cpp\
commands/auth/nick.cpp\
commands/auth/pass.cpp\
commands/auth/user.cpp\
commands/auth/utils.cpp
CC = c++ CC = c++
FLAGS = -g FLAGS = -g

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/06 15:10:08 by apommier ### ########.fr */ /* Updated: 2023/02/07 20:25:26 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -20,58 +20,61 @@
#include <netinet/in.h> //struct socket #include <netinet/in.h> //struct socket
#include <sys/epoll.h> //epoll ensemble #include <sys/epoll.h> //epoll ensemble
#include <unistd.h> //close() #include <unistd.h> //close()
#include <vector>
#define MAX_EVENTS 5 #define MAX_EVENTS 5
#define READ_SIZE 10 #define READ_SIZE 10
#define CMD_NBR 10 #define CMD_NBR 10
//struct functionTab; //struct functionTab;
void ft_test(); struct fdList;
//std::string ft_test();
/* ************************************************************************** */ /* ************************************************************************** */
/* *********************************COMMANDS********************************* */ /* *********************************COMMANDS********************************* */
/* ************************************************************************** */ /* ************************************************************************** */
std::string PASS(); void PASS(std::string buffer, fdList allFds, int user);
std::string NICK(); void NICK(std::string buffer, fdList allFds, int user);
std::string USER(); void USER(std::string buffer, fdList allFds, int user);
std::string SERVER(); void SERVER(std::string buffer, fdList allFds, int user);
std::string OPER(); void OPER(std::string buffer, fdList allFds, int user);
std::string QUIT(); void QUIT(std::string buffer, fdList allFds, int user);
std::string SQUIT(); void SQUIT(std::string buffer, fdList allFds, int user);
std::string JOIN(); void JOIN(std::string buffer, fdList allFds, int user);
std::string PART(); void PART(std::string buffer, fdList allFds, int user);
std::string MODE(); void MODE(std::string buffer, fdList allFds, int user);
std::string TOPIC(); void TOPIC(std::string buffer, fdList allFds, int user);
std::string NAMES(); void NAMES(std::string buffer, fdList allFds, int user);
std::string LIST(); void LIST(std::string buffer, fdList allFds, int user);
std::string INVITE(); void INVITE(std::string buffer, fdList allFds, int user);
std::string KICK(); void KICK(std::string buffer, fdList allFds, int user);
std::string VERSION(); void VERSION(std::string buffer, fdList allFds, int user);
std::string STATS(); void STATS(std::string buffer, fdList allFds, int user);
std::string LINKS(); void LINKS(std::string buffer, fdList allFds, int user);
std::string TIME(); void TIME(std::string buffer, fdList allFds, int user);
std::string CONNECT(); void CONNECT(std::string buffer, fdList allFds, int user);
std::string TRACE(); void TRACE(std::string buffer, fdList allFds, int user);
std::string ADMIN(); void ADMIN(std::string buffer, fdList allFds, int user);
std::string INFO(); void INFO(std::string buffer, fdList allFds, int user);
std::string PRIVMSG(); void PRIVMSG(std::string buffer, fdList allFds, int user);
std::string NOTICE(); void NOTICE(std::string buffer, fdList allFds, int user);
std::string WHO(); void WHO(std::string buffer, fdList allFds, int user);
std::string WHOIS(); void WHOIS(std::string buffer, fdList allFds, int user);
std::string WHOWAS(); void WHOWAS(std::string buffer, fdList allFds, int user);
std::string KILL(); void KILL(std::string buffer, fdList allFds, int user);
std::string PING(); void PING(std::string buffer, fdList allFds, int user);
std::string PONG(); void PONG(std::string buffer, fdList allFds, int user);
std::string ERROR(); void ERROR(std::string buffer, fdList allFds, int user);
std::string AWAY(); void AWAY(std::string buffer, fdList allFds, int user);
std::string REHASH(); void REHASH(std::string buffer, fdList allFds, int user);
std::string RESTART(); void RESTART(std::string buffer, fdList allFds, int user);
std::string SUMMON(); void SUMMON(std::string buffer, fdList allFds, int user);
std::string USER(); void USER(std::string buffer, fdList allFds, int user);
std::string OPERWALL(); void OPERWALL(std::string buffer, fdList allFds, int user);
std::string USERHOST(); void USERHOST(std::string buffer, fdList allFds, int user);
std::string ISON(); void ISON(std::string buffer, fdList allFds, int user);
/* ************************************************************************** */ /* ************************************************************************** */
@ -80,7 +83,7 @@ void ft_test();
struct functionTab struct functionTab
{ {
static const int cmdNbr = 5; static const int cmdNbr = 40;
std::string cmdName[cmdNbr] = std::string cmdName[cmdNbr] =
{ {
//4. Détails des messages //4. Détails des messages
@ -142,64 +145,67 @@ struct functionTab
}; };
void (*cmdPtr[cmdNbr])(void) = //std::string (*cmdPtr[cmdNbr])(void) =
void (*cmdPtr[cmdNbr])(std::string buffer, fdList allFds, int user) =
{ {
//ft_test
//4. Détails des messages //4. Détails des messages
//4.1 Etablissement de connexion // //4.1 Etablissement de connexion
PASS, // PASS,
NICK, NICK
USER, // USER,
SERVER, // SERVER,
OPER, // OPER,
QUIT, // QUIT,
SQUIT, // SQUIT,
//4.2 Opérations sur les canaux // //4.2 Opérations sur les canaux
JOIN, // JOIN,
PART, // PART,
MODE, // MODE,
TOPIC, // TOPIC,
NAMES, // NAMES,
LIST, // LIST,
INVITE, // INVITE,
KICK, // KICK,
//4.3 Requêtes et commandes des serveurs // //4.3 Requêtes et commandes des serveurs
VERSION, // VERSION,
STATS, // STATS,
LINKS, // LINKS,
TIME, // TIME,
CONNECT, // CONNECT,
TRACE, // TRACE,
ADMIN, // ADMIN,
INFO, // INFO,
//4.4 Envoi de messages // //4.4 Envoi de messages
PRIVMSG, // PRIVMSG,
NOTICE, // NOTICE,
//4.5 Requêtes basées sur les utilisateurs // //4.5 Requêtes basées sur les utilisateurs
WHO, // WHO,
WHOIS, // WHOIS,
WHOWAS, // WHOWAS,
//4.6 Messages divers // //4.6 Messages divers
KILL, // KILL,
PING, // PING,
PONG, // PONG,
ERROR, // ERROR,
//5. Messages optionnels // //5. Messages optionnels
AWAY, // AWAY,
REHASH, // REHASH,
RESTART, // RESTART,
SUMMON, // SUMMON,
USER, // USER,
OPERWALL, // OPERWALL,
USERHOST, // USERHOST,
ISON // ISON
}; };
}; };
@ -207,22 +213,49 @@ struct functionTab
/* *********************************STRUCT*********************************** */ /* *********************************STRUCT*********************************** */
/* ************************************************************************** */ /* ************************************************************************** */
struct channelData;
struct clientData
{
bool registered = 0;
std::string buf[1024];
std::string nickname;
std::string password;
std::string userName;
std::string realName;
std::string hostName;
std::string serverName;
//std::string joinedChan[20];
channelData *joinedChan; //is there a limit?
int nbrChan;
int perm;
int fd;
};
struct channelData
{
//std::string userList[MAX_EVENTS];
clientData userList[MAX_EVENTS];
int op;
int nbrUser;
};
struct fdList //allFds in code struct fdList //allFds in code
{ {
struct epoll_event events[MAX_EVENTS];
int epollFd; int epollFd;
int serverFd; int serverFd;
int userList[MAX_EVENTS]; int userList[MAX_EVENTS]; //list of user's fd
clientData userData[MAX_EVENTS];
int nbrUser; int nbrUser;
functionTab parsingTab; functionTab parsingTab;
}; };
struct userClient
{
// int epollFd;
// int serverFd;
// int userList[MAX_EVENTS];
// int nbrUser;
};
@ -237,6 +270,8 @@ void close_fd(int fd);
/* ******************************START SERVER******************************** */ /* ******************************START SERVER******************************** */
/* ************************************************************************** */ /* ************************************************************************** */
void cmd_error(fdList allFds, int user, std::string error);
void split(std::string const &str, const char delim, std::vector<std::string> &out);
void initialize(char **av); //1st void initialize(char **av); //1st
void start_loop(fdList allFds); //3rd void start_loop(fdList allFds); //3rd
@ -252,11 +287,11 @@ int epoll_start(); //2nd
/* ************************************************************************** */ /* ************************************************************************** */
void new_connection(fdList allFds, struct epoll_event newClient); void new_connection(fdList allFds, struct epoll_event newClient);
bool clientRequest(fdList allFds, int newFd); bool clientRequest(fdList allFds, int user);
/* ************************************************************************** */ /* ************************************************************************** */
/* ***************************COMMANDS PARSING******************************* */ /* ***************************COMMANDS PARSING******************************* */
/* ************************************************************************** */ /* ************************************************************************** */
void parse_commands(std::string buffer, fdList allFds); void parse_commands(std::string buffer, fdList allFds, int user);

View File

@ -6,21 +6,25 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:34:36 by apommier #+# #+# */ /* Created: 2022/12/09 22:34:36 by apommier #+# #+# */
/* Updated: 2023/02/06 12:36:52 by apommier ### ########.fr */ /* Updated: 2023/02/07 11:24:51 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "../includes/ft_irc.hpp" #include "../includes/ft_irc.hpp"
bool clientRequest(fdList allFds, int clientFd) bool clientRequest(fdList allFds, int user)//,
{ {
int clientFd = allFds.events[user].data.fd;
char buf[1024] = {0}; char buf[1024] = {0};
size_t len = 1024; size_t len = 1024;
//se demerder pour join quand pas \n
std::cout << "client request!" << std::endl; std::cout << "client request!" << std::endl;
if (recv(clientFd, buf, len, 0) == -1) if (recv(clientFd, buf, len, 0) == -1)
ft_error("recv() error"); ft_error("recv() error");
std::cout << "BUFFER: ---" << buf << "---" << std::endl; std::cout << "BUFFER: ---" << buf << "---" << std::endl;
parse_commands(buf, allFds);
//split with \n and while (tab de split) -> parsing
parse_commands(buf, allFds, user);
return (1); return (1);
} }

View File

@ -6,13 +6,21 @@
/* 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/06 14:28:55 by apommier ### ########.fr */ /* Updated: 2023/02/07 15:13:27 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "../../includes/ft_irc.hpp" #include "../../../includes/ft_irc.hpp"
void NICK() // ERR_NONICKNAMEGIVEN ERR_ERRONEUSNICKNAME
// ERR_NICKNAMEINUSE ERR_NICKCOLLISION
void NICK(std::string buffer, fdList allFds, int user)
{ {
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
//if nickname ok then (another user has it? )
allFds.userData[user].nickname = splitBuff[1];
return ;
} }

View File

@ -6,13 +6,33 @@
/* 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/06 14:41:12 by apommier ### ########.fr */ /* Updated: 2023/02/07 19:40:34 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "../../includes/ft_irc.hpp" #include "../../../includes/ft_irc.hpp"
void PASS() void PASS(std::string buffer, fdList allFds, int user)
{ {
std::string password;
if (buffer.size() < 6)// ---PASS ---
{
cmd_error(allFds, user, "461 * PASS :Not enough parameters");
return ;
}
// if (splitBuff.size() != 2)
// {
// cmd_error(allFds, user, "461 * PASS :Not enough parameters");
// //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18);
// return ;
// }
else if (allFds.userData[user].registered)
{
cmd_error(allFds, user, "462 * PASS :You may not reregister");
return ;
}
password = buffer.substr(5, buffer.npos);
allFds.userData[user].password = buffer;
} }

View File

@ -0,0 +1,40 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* user.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */
/* Updated: 2023/02/07 20:27:12 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
//Commande: USER
//Paramètres: <nom d'utilisateur> <hôte> <nom de serveur> :<nom réel>
//ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED
void USER(std::string buffer, fdList allFds, int user)
{
std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos);
std::vector<std::string> splitBuff;
buffer.resize(buffer.size() - realName.size());
std::cout << "Buffer in user = ---" << buffer << "---" << std::endl;
std::cout << "realname in user = ---" << realName << "---" << std::endl;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 4)
{
cmd_error(allFds, user, "461 * PASS :Not enough parameters");
//write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18);
return ;
}
allFds.userData[user].userName = splitBuff[1];
allFds.userData[user].hostName = splitBuff[2];
allFds.userData[user].serverName = splitBuff[3];
allFds.userData[user].realName = realName;
}

View File

@ -0,0 +1,31 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* utils.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/07 14:45:45 by apommier #+# #+# */
/* Updated: 2023/02/07 15:16:10 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void cmd_error(fdList allFds, int user, std::string error)
{
write(allFds.userData[user].fd, ":irc.local ", error.size());
write(allFds.userData[user].fd, error.c_str(), error.size());
}
void split(std::string const &str, const char delim, std::vector<std::string> &out)
{
size_t start;
size_t end = 0;
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
{
end = str.find(delim, start);
out.push_back(str.substr(start, end - start));
}
}

View File

@ -6,28 +6,33 @@
/* 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/06 12:39:13 by apommier ### ########.fr */ /* Updated: 2023/02/07 15:18:41 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "../../includes/ft_irc.hpp" #include "../../includes/ft_irc.hpp"
void ft_test() std::string ft_test()
{ {
std::cout << "hehe je suis la" << std::endl; std::cout << "hehe je suis la" << std::endl;
return ("prout");
} }
void parse_commands(std::string buffer, fdList allFds) void parse_commands(std::string buffer, fdList allFds, int user)
{ {
std::string cmd = buffer; std::string cmd = buffer;
std::vector<std::string> splitBuff;
int a = 0; int a = 0;
cmd.pop_back(); cmd.pop_back();
split(cmd, ' ', splitBuff);
std::cout << "BUFFER In PARSING: ---" << cmd << "---" << std::endl; std::cout << "BUFFER In PARSING: ---" << cmd << "---" << std::endl;
while (cmd != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr) while (splitBuff[0] != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr)
a++; a++;
if (a == allFds.parsingTab.cmdNbr) if (a == allFds.parsingTab.cmdNbr)
std::cout << "Command not found\n"; std::cout << "Command not found\n";
else else
allFds.parsingTab.cmdPtr[a](); allFds.parsingTab.cmdPtr[a](buffer, allFds, user);
} }

View File

@ -1,18 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* user.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */
/* Updated: 2023/02/06 14:41:03 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../includes/ft_irc.hpp"
void USER()
{
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:26:27 by apommier #+# #+# */ /* Created: 2022/12/09 22:26:27 by apommier #+# #+# */
/* Updated: 2022/12/18 12:13:28 by apommier ### ########.fr */ /* Updated: 2023/02/07 11:41:38 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -21,6 +21,9 @@ void new_connection(fdList allFds, struct epoll_event newClient)
if (MAX_EVENTS == allFds.nbrUser) if (MAX_EVENTS == allFds.nbrUser)
std::cout << "new connection refused, already full" << std::endl; std::cout << "new connection refused, already full" << std::endl;
allFds.userList[allFds.nbrUser] = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); allFds.userList[allFds.nbrUser] = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);
allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser];
epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]); epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]);
allFds.nbrUser++; allFds.nbrUser++;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:58:13 by apommier #+# #+# */ /* Created: 2022/12/06 21:58:13 by apommier #+# #+# */
/* Updated: 2023/02/06 12:33:21 by apommier ### ########.fr */ /* Updated: 2023/02/07 11:23:01 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,11 +16,12 @@ void start_loop(fdList allFds)
{ {
bool alive = true; bool alive = true;
char buffer[1024] = { 0 }; char buffer[1024] = { 0 };
struct epoll_event events[MAX_EVENTS]; //struct epoll_event events[MAX_EVENTS];
int readChar; int readChar;
int eventNbr; int eventNbr;
std::cout << "serverFd: " << allFds.serverFd << std::endl; std::cout << "serverFd: " << allFds.serverFd << std::endl;
//allFds.events //= allFds.events;
while (alive) while (alive)
{ {
// std::cout << "hehe\n"; // std::cout << "hehe\n";
@ -30,14 +31,14 @@ void start_loop(fdList allFds)
// send(clientFd, "message received", 18, 0); // send(clientFd, "message received", 18, 0);
eventNbr = epoll_wait(allFds.epollFd, events, MAX_EVENTS, 5000); eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000);
std::cout << "eventNbr: " << eventNbr << std::endl; std::cout << "eventNbr: " << eventNbr << std::endl;
for (int i = 0; i < eventNbr ; i++) for (int i = 0; i < eventNbr ; i++)
{ {
std::cout << "event[i]'s fd: " << events[i].data.fd << std::endl; std::cout << "event[i]'s fd: " << allFds.events[i].data.fd << std::endl;
if (events[i].data.fd == allFds.serverFd) if (allFds.events[i].data.fd == allFds.serverFd)
new_connection(allFds, events[i]); new_connection(allFds, allFds.events[i]);
else if (!clientRequest(allFds, events[i].data.fd)) else if (!clientRequest(allFds, i))//allFds.events[i].data.fd))
{ {
alive = false; alive = false;
//else //else
@ -48,7 +49,6 @@ void start_loop(fdList allFds)
} }
if (!strncmp("/quit", buffer, 5)) if (!strncmp("/quit", buffer, 5))
std::cout << "quit message received\n"; std::cout << "quit message received\n";
} }
std::cout << "dead server\n"; std::cout << "dead server\n";