finalize SASL, move all IRC-related includes to a specific folder

This commit is contained in:
thorium1256
2026-05-14 16:35:10 +03:00
parent 634366a875
commit da3aef1468
12 changed files with 272 additions and 43 deletions

32
include/IRC/IRC.h Normal file
View File

@@ -0,0 +1,32 @@
#ifndef IRC_H
#define IRC_H
#include "IRC_structs.h"
#include "IRC_numerics.h"
void IRC_ParseMessage(char* line, irc_message_t *msg);
void IRC_ProcessMessage(irc_message_t *msg, irc_client_t *irc);
// various IRC commands
void IRC_PRIVMSG(char* to, char* msg, irc_client_t *irc);
void IRC_NOTICE(char* to, char* msg, irc_client_t *irc);
void IRC_NICK(char *nick, irc_client_t *irc);
void IRC_USER(char *ident, char* realname, irc_client_t *irc);
// registration
void IRC_Register(char *nick, char *username, char *realname, irc_client_t *irc);
void IRC_SetSASLParameters(irc_sasl_mechanism_t, char* username, char* password, irc_client_t *irc);
void IRC_RequestSASLAuthentication(irc_client_t *irc);
// Capability negotiation block
void IRC_StartCapabilityNegotiation(irc_client_t *irc);
void IRC_RequestCapabilities(char* caps, irc_client_t *irc);
void IRC_EndCapabilityNegotiation(irc_client_t *irc);
void IRC_NeedCapabilities(char* caps, irc_client_t *irc);
int IRC_ParseCapabilities(char* caps, irc_capability_t *capabilities, int capsLength);
#endif

203
include/IRC/IRC_numerics.h Normal file
View File

@@ -0,0 +1,203 @@
#ifndef IRC_NUMERICS_H
#define IRC_NUMERICS_H
// * 0xx (initial login information)
#define RPL_WELCOME "001"
#define RPL_YOURHOST "002"
#define RPL_CREATED "003"
#define RPL_MYINFO "004"
#define RPL_ISUPPORT "005"
#define RPL_BOUNCE "010" /* deprecated */
// * 2xx (request information)
/* replies to STATS */
#define RPL_STATSCOMMANDS "212"
#define RPL_ENDOFSTATS "219"
#define RPL_STATSUPTIME "242"
/* server user modes on-connect */
#define RPL_UMODEIS "221"
/* replies to LUSERS */
#define RPL_LUSERCLIENT "251"
#define RPL_LUSEROP "252"
#define RPL_LUSERUNKNOWN "253"
#define RPL_LUSERCHANNELS "254"
#define RPL_LUSERME "255"
#define RPL_LOCALUSERS "265"
#define RPL_GLOBALUSERS "266"
/* replies to ADMIN */
#define RPL_ADMINME "256"
#define RPL_ADMINLOC1 "257"
#define RPL_ADMINLOC2 "258"
#define RPL_ADMINEMAIL "259"
/* generic replies (i.e. ratelimiting) */
#define RPL_TRYAGAIN "263"
/* WHOIS info */
#define RPL_WHOISCERTFP "276"
// * 3xx (information for clients)
#define RPL_NONE "300"
/* replies to WHOIS/WHOWAS */
#define RPL_AWAY "301"
#define RPL_WHOISREGNICK "307"
#define RPL_WHOISUSER "311"
#define RPL_WHOISSERVER "312"
#define RPL_WHOISOPERATOR "313"
#define RPL_WHOWASUSER "314"
#define RPL_WHOISIDLE "317"
#define RPL_WHOISCHANNELS "319"
#define RPL_WHOISSPECIAL "320"
#define RPL_WHOISACCOUNT "330"
#define RPL_WHOISACTUALLY "338"
#define RPL_WHOISHOST "378"
#define RPL_WHOISMODES "379"
#define RPL_ENDOFWHOIS "318"
#define RPL_ENDOFWHOWAS "369"
#define ERR_WASNOSUCHNICK "406" /* WHOWAS error */
#define RPL_WHOISSECURE "671"
/* replies to WHO */
#define RPL_WHOREPLY "352"
#define RPL_ENDOFWHO "315"
/* replies to LIST */
#define RPL_LISTSTART "321"
#define RPL_LIST "322"
#define RPL_LISTEND "323"
/* upon joining a channel */
#define RPL_CHANNELMODEIS "324"
#define RPL_CREATIONTIME "329"
#define RPL_TOPIC "332"
#define RPL_TOPICWHOTIME "333"
/* replies to TOPIC */
#define RPL_NOTOPIC "331"
/* replies to INVITE */
#define RPL_INVITELIST "336"
#define RPL_ENDOFINVITELIST "337"
#define RPL_INVITING "341"
/* replies to MODE */
#define RPL_INVEXLIST "346"
#define RPL_ENDOFINVEXLIST "347"
#define RPL_EXCEPTLIST "348"
#define RPL_ENDOFEXCEPTLIST "349"
#define RPL_BANLIST "367"
#define RPL_ENDOFBANLIST "368"
#define ERR_INVALIDMODEPARAM "696"
/* replies to INFO */
#define RPL_INFO "371"
#define RPL_ENDOFINFO "374"
/* when sending a Message of the Day */
#define RPL_MOTDSTART "375"
#define RPL_MOTD "372"
#define RPL_ENDOFMOTD "376"
/* replies to VERSION */
#define RPL_VERSION "351"
/* replies to NAMES */
#define RPL_NAMREPLY "353"
#define RPL_ENDOFNAMES "366"
/* replies to LINKS */
#define RPL_LINKS "364"
#define RPL_ENDOFLINKS "365"
/* replies to OPER */
#define RPL_YOUREOPER "381"
/* replies to REHASH */
#define RPL_REHASHING "382"
/* replies to TIME */
#define RPL_TIME "391"
/* replies to USERHOST */
#define RPL_USERHOST "302"
/* sent to clients to inform of away status */
#define RPL_UNAWAY "305"
#define RPL_NOWAWAY "306"
// * 4xx and 5xx (errors)
#define ERR_UNKNOWNERROR "400"
#define ERR_NOSUCHNICK "401"
#define ERR_NOSUCHSERVER "402"
#define ERR_NOSUCHCHANNEL "403"
#define ERR_CANNOTSENDTOCHAN "404"
#define ERR_TOOMANYCHANNELS "405"
#define ERR_NOORIGIN "409"
#define ERR_NORECIPIENT "411"
#define ERR_NOTEXTTOSEND "412"
#define ERR_INPUTTOOLONG "417"
#define ERR_UNKNOWNCOMMAND "421"
#define ERR_NOMOTD "422"
#define ERR_NONICKNAMEGIVEN "431"
#define ERR_ERRONEUSNICKNAME "432"
#define ERR_NICKNAMEINUSE "433"
#define ERR_NICKCOLLISION "436"
#define ERR_USERNOTINCHANNEL "441"
#define ERR_NOTONCHANNEL "442"
#define ERR_USERONCHANNEL "443"
#define ERR_NOTREGISTERED "451"
#define ERR_NEEDMOREPARAMS "461"
#define ERR_ALREADYREGISTERED "462"
#define ERR_PASSWDMISMATCH "464"
#define ERR_YOUREBANNEDCREEP "465"
#define ERR_CHANNELISFULL "471"
#define ERR_UNKNOWNMODE "472"
#define ERR_INVITEONLYCHAN "473"
#define ERR_BANNEDFROMCHAN "474"
#define ERR_BADCHANNELKEY "475"
#define ERR_BADCHANMASK "476"
#define ERR_NOPRIVILEGES "481"
#define ERR_CHANOPRIVSNEEDED "482"
#define ERR_CANTKILLSERVER "483"
#define ERR_NOOPERHOST "491"
#define ERR_UMODEUNKNOWNFLAG "501"
#define ERR_USERSDONTMATCH "502"
#define ERR_INVALIDKEY "525"
/* replies to HELP */
#define ERR_HELPNOTFOUND "524"
#define RPL_HELPSTART "704"
#define RPL_HELPTXT "705"
#define RPL_ENDOFHELP "706"
// * 6xx (various TLS and IRCv3 stuff)
/* STARTTLS stuff */
#define RPL_STARTTLS "670"
#define ERR_STARTTLS "691"
// * 7xx (various)
#define ERR_NOPRIVS "723"
// * 9xx (authentication)
/* SASL */
#define RPL_LOGGEDIN "900"
#define RPL_LOGGEDOUT "901"
#define RPL_SASLSUCCESS "903"
#define ERR_NICKLOCKED "902"
#define ERR_SASLFAIL "904"
#define ERR_SASLTOOLONG "905"
#define ERR_SASLABORTED "906"
#define ERR_SASLALREADY "907"
#define RPL_SASLMECHS "908"
#endif

93
include/IRC/IRC_structs.h Normal file
View File

@@ -0,0 +1,93 @@
#ifndef IRC_STRUCTS_H
#define IRC_STRUCTS_H
#include <stdbool.h>
typedef enum
{
SASL_MECHANISM_NONE,
SASL_MECHANISM_PLAIN,
SASL_MECHANISM_EXTERNAL
} irc_sasl_mechanism_t;
typedef struct
{
char nickname[32];
char ident[16];
char hostname;
} irc_hostmask_t;
typedef struct {
char line[513];
char *source;
char *command;
char *argv[16];
int argc;
} irc_message_t;
typedef struct
{
irc_hostmask_t hostmask;
char prefix;
} irc_chanuser_t;
typedef struct
{
char name[64];
char topic[512];
irc_chanuser_t* users;
} irc_channel_t;
typedef struct
{
char capLine[96]; // A place for name and args to point to.
char *name;
char *args;
} irc_capability_t;
typedef struct
{
char username[32];
char password[64];
} irc_sasl_plain_credentials_t;
typedef struct
{
char nickname[32];
unsigned char fingerprint[20];
} irc_sasl_external_credentials_t;
typedef struct
{
irc_sasl_mechanism_t mechanism;
union {
irc_sasl_plain_credentials_t plain_credentials;
irc_sasl_external_credentials_t external_credentials;
};
} irc_auth_t;
typedef struct
{
int sockfd;
irc_hostmask_t ownHostmask;
char supportedCapabilities[512];
char requestedCapabilities[512];
irc_capability_t acked[24];
/* Authentication parameters */
irc_auth_t saslAuth;
} irc_client_t;
typedef struct
{
char nick[32];
char ident[16];
char realname[64];
} irc_identity_t;
typedef struct {
const char *name;
void (*handler)(irc_message_t *msg, irc_client_t *irc);
} command_t;
#endif