Merge remote-tracking branch 'LucentW/master'

* LucentW/master:
  Fix with oneshot invites
  Fixed building issues\
  Implement timestamp tracking of invites
  Keep track of who placed bans/invites/excepts
  IRC operators w/OperCanMode can kick anyone [already cherry-picked]

Closes #203, Closes #205.
This commit is contained in:
Alexander Barton 2015-06-07 21:13:45 +02:00
commit d28d838cb9
8 changed files with 43 additions and 24 deletions

View File

@ -1098,29 +1098,29 @@ Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, const ch
GLOBAL bool GLOBAL bool
Channel_AddBan(CHANNEL *c, const char *mask ) Channel_AddBan(CHANNEL *c, const char *mask, const char *who )
{ {
struct list_head *h = Channel_GetListBans(c); struct list_head *h = Channel_GetListBans(c);
LogDebug("Adding \"%s\" to \"%s\" ban list", mask, Channel_Name(c)); LogDebug("Adding \"%s\" to \"%s\" ban list", mask, Channel_Name(c));
return Lists_Add(h, mask, false, NULL); return Lists_Add(h, mask, time(NULL), who, false);
} }
GLOBAL bool GLOBAL bool
Channel_AddExcept(CHANNEL *c, const char *mask ) Channel_AddExcept(CHANNEL *c, const char *mask, const char *who )
{ {
struct list_head *h = Channel_GetListExcepts(c); struct list_head *h = Channel_GetListExcepts(c);
LogDebug("Adding \"%s\" to \"%s\" exception list", mask, Channel_Name(c)); LogDebug("Adding \"%s\" to \"%s\" exception list", mask, Channel_Name(c));
return Lists_Add(h, mask, false, NULL); return Lists_Add(h, mask, time(NULL), who, false);
} }
GLOBAL bool GLOBAL bool
Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce) Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce, const char *who )
{ {
struct list_head *h = Channel_GetListInvites(c); struct list_head *h = Channel_GetListInvites(c);
LogDebug("Adding \"%s\" to \"%s\" invite list", mask, Channel_Name(c)); LogDebug("Adding \"%s\" to \"%s\" invite list", mask, Channel_Name(c));
return Lists_Add(h, mask, onlyonce, NULL); return Lists_Add(h, mask, time(NULL), who, onlyonce);
} }
@ -1137,7 +1137,9 @@ ShowChannelList(struct list_head *head, CLIENT *Client, CHANNEL *Channel,
while (e) { while (e) {
if (!IRC_WriteStrClient(Client, msg, Client_ID(Client), if (!IRC_WriteStrClient(Client, msg, Client_ID(Client),
Channel_Name(Channel), Channel_Name(Channel),
Lists_GetMask(e))) Lists_GetMask(e),
Lists_GetReason(e),
Lists_GetValidity(e)))
return DISCONNECTED; return DISCONNECTED;
e = Lists_GetNext(e); e = Lists_GetNext(e);
} }

View File

@ -127,10 +127,10 @@ GLOBAL char *Channel_TopicWho PARAMS(( CHANNEL *Chan ));
GLOBAL unsigned int Channel_CreationTime PARAMS(( CHANNEL *Chan )); GLOBAL unsigned int Channel_CreationTime PARAMS(( CHANNEL *Chan ));
#endif #endif
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask)); GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask, const char *who));
GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask)); GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask, const char *who));
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask, GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask,
bool OnlyOnce)); bool OnlyOnce, const char *who));
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c)); GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
GLOBAL bool Channel_ShowExcepts PARAMS((CLIENT *client, CHANNEL *c)); GLOBAL bool Channel_ShowExcepts PARAMS((CLIENT *client, CHANNEL *c));

View File

@ -105,7 +105,7 @@ Class_AddMask(const int Class, const char *Pattern, time_t ValidUntil,
Lists_MakeMask(Pattern, mask, sizeof(mask)); Lists_MakeMask(Pattern, mask, sizeof(mask));
return Lists_Add(&My_Classes[Class], mask, return Lists_Add(&My_Classes[Class], mask,
ValidUntil, Reason); ValidUntil, Reason, false);
} }
GLOBAL void GLOBAL void

View File

@ -1017,15 +1017,15 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
switch (what) { switch (what) {
case 'I': case 'I':
if (!Channel_AddInvite(Channel, mask, false)) if (!Channel_AddInvite(Channel, mask, false, Client_ID(Client)))
return CONNECTED; return CONNECTED;
break; break;
case 'b': case 'b':
if (!Channel_AddBan(Channel, mask)) if (!Channel_AddBan(Channel, mask, Client_ID(Client)))
return CONNECTED; return CONNECTED;
break; break;
case 'e': case 'e':
if (!Channel_AddExcept(Channel, mask)) if (!Channel_AddExcept(Channel, mask, Client_ID(Client)))
return CONNECTED; return CONNECTED;
break; break;
} }

View File

@ -200,7 +200,7 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
if (remember) { if (remember) {
/* We must remember this invite */ /* We must remember this invite */
if (!Channel_AddInvite(chan, Client_MaskCloaked(target), if (!Channel_AddInvite(chan, Client_MaskCloaked(target),
true)) true, Client_ID(from)))
return CONNECTED; return CONNECTED;
} }
} }

View File

@ -32,7 +32,8 @@ struct list_elem {
struct list_elem *next; /** pointer to next list element */ struct list_elem *next; /** pointer to next list element */
char mask[MASK_LEN]; /** IRC mask */ char mask[MASK_LEN]; /** IRC mask */
char *reason; /** Optional "reason" text */ char *reason; /** Optional "reason" text */
time_t valid_until; /** 0: unlimited; 1: once; t(>1): until t */ time_t valid_until; /** 0: unlimited; t(>0): until t */
bool onlyonce;
}; };
/** /**
@ -65,7 +66,7 @@ Lists_GetReason(const struct list_elem *e)
* Get "validity" value stored in list element. * Get "validity" value stored in list element.
* *
* @param list_elem List element. * @param list_elem List element.
* @return Validity: 0=unlimited, 1=once, >1 until this time stamp. * @return Validity: 0=unlimited, >0 until this time stamp.
*/ */
GLOBAL time_t GLOBAL time_t
Lists_GetValidity(const struct list_elem *e) Lists_GetValidity(const struct list_elem *e)
@ -74,6 +75,19 @@ Lists_GetValidity(const struct list_elem *e)
return e->valid_until; return e->valid_until;
} }
/**
* Get "onlyonce" value stored in list element.
*
* @param list_elem List element.
* @return True if the element was stored for single use, false otherwise.
*/
GLOBAL bool
Lists_GetOnlyOnce(const struct list_elem *e)
{
assert(e != NULL);
return e->onlyonce;
}
/** /**
* Get first list element of a list. * Get first list element of a list.
* *
@ -111,7 +125,7 @@ Lists_GetNext(const struct list_elem *e)
*/ */
bool bool
Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil, Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
const char *Reason) const char *Reason, bool OnlyOnce)
{ {
struct list_elem *e, *newelem; struct list_elem *e, *newelem;
@ -148,6 +162,7 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
else else
newelem->reason = NULL; newelem->reason = NULL;
newelem->valid_until = ValidUntil; newelem->valid_until = ValidUntil;
newelem->onlyonce = OnlyOnce;
newelem->next = e; newelem->next = e;
h->first = newelem; h->first = newelem;
@ -329,7 +344,7 @@ Lists_CheckReason(struct list_head *h, CLIENT *Client, char *reason, size_t len)
if (MatchCaseInsensitive(e->mask, Client_MaskCloaked(Client))) { if (MatchCaseInsensitive(e->mask, Client_MaskCloaked(Client))) {
if (len && e->reason) if (len && e->reason)
strlcpy(reason, e->reason, len); strlcpy(reason, e->reason, len);
if (e->valid_until == 1) { if (e->onlyonce) {
/* Entry is valid only once, delete it */ /* Entry is valid only once, delete it */
LogDebug("Deleted \"%s\" from list (used).", LogDebug("Deleted \"%s\" from list (used).",
e->mask); e->mask);
@ -363,7 +378,7 @@ Lists_Expire(struct list_head *h, const char *ListName)
while (e) { while (e) {
next = e->next; next = e->next;
if (e->valid_until > 1 && e->valid_until < now) { if (e->valid_until > 0 && e->valid_until < now) {
/* Entry is expired, delete it */ /* Entry is expired, delete it */
if (e->reason) if (e->reason)
Log(LOG_INFO, Log(LOG_INFO,

View File

@ -36,7 +36,8 @@ GLOBAL struct list_elem *Lists_CheckDupeMask PARAMS((const struct list_head *hea
const char *mask)); const char *mask));
GLOBAL bool Lists_Add PARAMS((struct list_head *h, const char *Mask, GLOBAL bool Lists_Add PARAMS((struct list_head *h, const char *Mask,
time_t ValidUntil, const char *Reason)); time_t ValidUntil, const char *Reason,
bool OnlyOnce));
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask)); GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask));
GLOBAL unsigned long Lists_Count PARAMS((struct list_head *h)); GLOBAL unsigned long Lists_Count PARAMS((struct list_head *h));
@ -46,6 +47,7 @@ GLOBAL void Lists_MakeMask PARAMS((const char *Pattern, char *mask, size_t len))
GLOBAL const char *Lists_GetMask PARAMS((const struct list_elem *e)); GLOBAL const char *Lists_GetMask PARAMS((const struct list_elem *e));
GLOBAL const char *Lists_GetReason PARAMS((const struct list_elem *e)); GLOBAL const char *Lists_GetReason PARAMS((const struct list_elem *e));
GLOBAL time_t Lists_GetValidity PARAMS((const struct list_elem *e)); GLOBAL time_t Lists_GetValidity PARAMS((const struct list_elem *e));
GLOBAL bool Lists_GetOnlyOnce PARAMS((const struct list_elem *e));
GLOBAL void Lists_Expire PARAMS((struct list_head *h, const char *ListName)); GLOBAL void Lists_Expire PARAMS((struct list_head *h, const char *ListName));

View File

@ -78,9 +78,9 @@
#define RPL_TOPICSETBY_MSG "333 %s %s %s %u" #define RPL_TOPICSETBY_MSG "333 %s %s %s %u"
#define RPL_WHOISBOT_MSG "335 %s %s :is an IRC Bot" #define RPL_WHOISBOT_MSG "335 %s %s :is an IRC Bot"
#define RPL_INVITING_MSG "341 %s %s %s%s" #define RPL_INVITING_MSG "341 %s %s %s%s"
#define RPL_INVITELIST_MSG "346 %s %s %s" #define RPL_INVITELIST_MSG "346 %s %s %s %s %d"
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list" #define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
#define RPL_EXCEPTLIST_MSG "348 %s %s %s" #define RPL_EXCEPTLIST_MSG "348 %s %s %s %s %d"
#define RPL_ENDOFEXCEPTLIST_MSG "349 %s %s :End of channel exception list" #define RPL_ENDOFEXCEPTLIST_MSG "349 %s %s :End of channel exception list"
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s" #define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s" #define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
@ -88,7 +88,7 @@
#define RPL_LINKS_MSG "364 %s %s %s :%d %s" #define RPL_LINKS_MSG "364 %s %s %s :%d %s"
#define RPL_ENDOFLINKS_MSG "365 %s %s :End of LINKS list" #define RPL_ENDOFLINKS_MSG "365 %s %s :End of LINKS list"
#define RPL_ENDOFNAMES_MSG "366 %s %s :End of NAMES list" #define RPL_ENDOFNAMES_MSG "366 %s %s :End of NAMES list"
#define RPL_BANLIST_MSG "367 %s %s %s" #define RPL_BANLIST_MSG "367 %s %s %s %s %d"
#define RPL_ENDOFBANLIST_MSG "368 %s %s :End of channel ban list" #define RPL_ENDOFBANLIST_MSG "368 %s %s :End of channel ban list"
#define RPL_ENDOFWHOWAS_MSG "369 %s %s :End of WHOWAS list" #define RPL_ENDOFWHOWAS_MSG "369 %s %s :End of WHOWAS list"
#define RPL_INFO_MSG "371 %s :%s" #define RPL_INFO_MSG "371 %s :%s"