X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fchannel.c;h=175f23b253562118c9dc7f19b9fc82c0535187c4;hb=04e38f17ae671f84b93e06c6eefa9235dd71d6ce;hp=9a59712ade71a4f986aec3a2d8cdd2cabba67c44;hpb=175f0af979bfdb6dfde1535dd7de6a452cf98e32;p=ngircd-alex.git diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 9a59712a..175f23b2 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -22,23 +22,23 @@ #include #include #include +#include #include #include "defines.h" #include "conn-func.h" -#include "client.h" #include "exp.h" #include "channel.h" #include "imp.h" #include "irc-write.h" -#include "resolve.h" #include "conf.h" #include "hash.h" #include "lists.h" #include "log.h" #include "messages.h" +#include "match.h" #include "exp.h" @@ -58,7 +58,8 @@ static bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIE static CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan )); static CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan )); static void Delete_Channel PARAMS(( CHANNEL *Chan )); -static void Channel_Free PARAMS(( CHANNEL *Chan )); +static void Free_Channel PARAMS(( CHANNEL *Chan )); +static void Set_KeyFile PARAMS((CHANNEL *Chan, const char *KeyFile)); GLOBAL void @@ -116,8 +117,10 @@ Channel_InitPredefined( void ) new_chan = Channel_Search(conf_chan->name); if (new_chan) { - Log(LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", - conf_chan->name); + Log(LOG_INFO, + "Can't create pre-defined channel \"%s\": name already in use.", + conf_chan->name); + Set_KeyFile(new_chan, conf_chan->keyfile); continue; } @@ -127,6 +130,8 @@ Channel_InitPredefined( void ) conf_chan->name); continue; } + Log(LOG_INFO, "Created pre-defined channel \"%s\"", + conf_chan->name); Channel_ModeAdd(new_chan, 'P'); @@ -139,8 +144,7 @@ Channel_InitPredefined( void ) Channel_SetKey(new_chan, conf_chan->key); Channel_SetMaxUsers(new_chan, conf_chan->maxusers); - Log(LOG_INFO, "Created pre-defined channel \"%s\"", - conf_chan->name); + Set_KeyFile(new_chan, conf_chan->keyfile); } if (channel_count) array_free(&Conf_Channels); @@ -148,9 +152,10 @@ Channel_InitPredefined( void ) static void -Channel_Free(CHANNEL *chan) +Free_Channel(CHANNEL *chan) { array_free(&chan->topic); + array_free(&chan->keyfile); Lists_Free(&chan->list_bans); Lists_Free(&chan->list_invites); @@ -168,7 +173,7 @@ Channel_Exit( void ) c = My_Channels; while (c) { c_next = c->next; - Channel_Free(c); + Free_Channel(c); c = c_next; } @@ -191,7 +196,7 @@ Channel_Exit( void ) * Add_Client(). */ GLOBAL bool -Channel_Join( CLIENT *Client, char *Name ) +Channel_Join( CLIENT *Client, const char *Name ) { CHANNEL *chan; @@ -318,7 +323,7 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name, GLOBAL void -Channel_Quit( CLIENT *Client, char *Reason ) +Channel_Quit( CLIENT *Client, const char *Reason ) { CHANNEL *c, *next_c; @@ -724,7 +729,7 @@ Channel_SetTopic(CHANNEL *Chan, CLIENT *Client, const char *Topic) GLOBAL void -Channel_SetModes( CHANNEL *Chan, char *Modes ) +Channel_SetModes( CHANNEL *Chan, const char *Modes ) { assert( Chan != NULL ); assert( Modes != NULL ); @@ -876,7 +881,7 @@ Add_Client( CHANNEL *Chan, CLIENT *Client ) cl2chan->next = My_Cl2Chan; My_Cl2Chan = cl2chan; - Log( LOG_DEBUG, "User \"%s\" joined channel \"%s\".", Client_Mask( Client ), Chan->name ); + LogDebug("User \"%s\" joined channel \"%s\".", Client_Mask(Client), Chan->name); return cl2chan; } /* Add_Client */ @@ -1035,7 +1040,7 @@ Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel ) * Log a message to the local &SERVER channel, if it exists. */ GLOBAL void -Channel_LogServer(char *msg) +Channel_LogServer(const char *msg) { CHANNEL *sc; CLIENT *c; @@ -1051,6 +1056,56 @@ Channel_LogServer(char *msg) } /* Channel_LogServer */ +GLOBAL bool +Channel_CheckKey(CHANNEL *Chan, CLIENT *Client, const char *Key) +{ + char *file_name, line[COMMAND_LEN], *nick, *pass; + FILE *fd; + + assert(Chan != NULL); + assert(Client != NULL); + assert(Key != NULL); + + if (!strchr(Chan->modes, 'k')) + return true; + if (strcmp(Chan->key, Key) == 0) + return true; + if (*Key == '\0') + return false; + + file_name = array_start(&Chan->keyfile); + if (!file_name) + return false; + fd = fopen(file_name, "r"); + if (!fd) { + Log(LOG_ERR, "Can't open channel key file \"%s\" for %s: %s", + file_name, Chan->name, strerror(errno)); + return false; + } + + while (fgets(line, (int)sizeof(line), fd) != NULL) { + ngt_TrimStr(line); + if (! (nick = strchr(line, ':'))) + continue; + *nick++ = '\0'; + if (!Match(line, Client_User(Client))) + continue; + if (! (pass = strchr(nick, ':'))) + continue; + *pass++ = '\0'; + if (!Match(nick, Client_ID(Client))) + continue; + if (strcmp(Key, pass) != 0) + continue; + + fclose(fd); + return true; + } + fclose(fd); + return false; +} /* Channel_CheckKey */ + + static CL2CHAN * Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan ) { @@ -1104,8 +1159,36 @@ Delete_Channel(CHANNEL *Chan) My_Channels = chan->next; LogDebug("Freed channel structure for \"%s\".", Chan->name); - Channel_Free(Chan); + Free_Channel(Chan); } /* Delete_Channel */ +static void +Set_KeyFile(CHANNEL *Chan, const char *KeyFile) +{ + size_t len; + + assert(Chan != NULL); + assert(KeyFile != NULL); + + len = strlen(KeyFile); + if (len < array_bytes(&Chan->keyfile)) { + Log(LOG_INFO, "Channel key file of %s removed.", Chan->name); + array_free(&Chan->keyfile); + } + + if (len < 1) + return; + + if (!array_copyb(&Chan->keyfile, KeyFile, len+1)) + Log(LOG_WARNING, + "Could not set new channel key file \"%s\" for %s: %s", + KeyFile, Chan->name, strerror(errno)); + else + Log(LOG_INFO|LOG_snotice, + "New local channel key file \"%s\" for %s activated.", + KeyFile, Chan->name); +} /* Set_KeyFile */ + + /* -eof- */