1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-07 11:53:13 +02:00

1) New function new_message() which should be called when a new message is

sent, or at least for channel events.
2) Move adding of msgid/time/account tags to modules,
   which is their proper place.
This commit is contained in:
Bram Matthys
2019-05-19 09:24:38 +02:00
parent 10dcacdb0a
commit 4e17f85fe6
7 changed files with 108 additions and 93 deletions
+3 -4
View File
@@ -828,8 +828,7 @@ extern long ClientCapabilityBit(const char *token);
extern int user_ready_for_register(aClient *sptr);
extern void SetCapability(aClient *acptr, const char *token);
extern void ClearCapability(aClient *acptr, const char *token);
extern MessageTag *mtag_generate_msgid(void);
extern void new_message(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list);
extern MessageTag *find_mtag(MessageTag *mtags, const char *token);
extern MessageTag *duplicate_mtag(MessageTag *mtag);
extern void free_mtags(MessageTag *m);
extern void mtag_add_or_inherit_msgid(MessageTag *recv_mtags, MessageTag **mtag_list);
extern void mtag_add_or_inherit_account(MessageTag *recv_mtags, MessageTag **mtag_list, aClient *acptr);
extern void mtag_add_or_inherit_time(MessageTag *recv_mtags, MessageTag **mtag_list);
+4 -1
View File
@@ -871,6 +871,7 @@ extern char *moddata_client_get(aClient *acptr, char *varname);
#define HOOKTYPE_WELCOME 97
#define HOOKTYPE_PRE_COMMAND 98
#define HOOKTYPE_POST_COMMAND 99
#define HOOKTYPE_NEW_MESSAGE 100
/* Adding a new hook here?
* 1) Add the #define HOOKTYPE_.... with a new number
@@ -977,6 +978,7 @@ int hooktype_find_tkline_match(aClient *sptr, aTKline *tk);
int hooktype_welcome(aClient *sptr, int after_numeric);
int hooktype_pre_command(aClient *from, MessageTag *mtags, char *buf);
int hooktype_post_command(aClient *from, MessageTag *mtags, char *buf);
void hooktype_new_message(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list);
#ifdef GCC_TYPECHECKING
#define ValidateHook(validatefunc, func) __builtin_types_compatible_p(__typeof__(func), __typeof__(validatefunc))
@@ -1080,7 +1082,8 @@ _UNREAL_ERROR(_hook_error_incompatible, "Incompatible hook function. Check argum
((hooktype == HOOKTYPE_FIND_TKLINE_MATCH) && !ValidateHook(hooktype_find_tkline_match, func)) || \
((hooktype == HOOKTYPE_WELCOME) && !ValidateHook(hooktype_welcome, func)) || \
((hooktype == HOOKTYPE_PRE_COMMAND) && !ValidateHook(hooktype_pre_command, func)) || \
((hooktype == HOOKTYPE_POST_COMMAND) && !ValidateHook(hooktype_post_command, func)) ) \
((hooktype == HOOKTYPE_POST_COMMAND) && !ValidateHook(hooktype_post_command, func)) || \
((hooktype == HOOKTYPE_NEW_MESSAGE) && !ValidateHook(hooktype_new_message, func)) ) \
_hook_error_incompatible();
#endif /* GCC_TYPECHECKING */
+22 -1
View File
@@ -35,6 +35,7 @@ ModuleHeader MOD_HEADER(account-tag)
long CAP_ACCOUNT_TAG = 0L;
int account_tag_mtag_is_ok(aClient *acptr, char *name, char *value);
void mtag_add_or_inherit_account(aClient *acptr, MessageTag *recv_mtags, MessageTag **mtag_list);
MOD_INIT(account-tag)
{
@@ -54,6 +55,8 @@ MOD_INIT(account-tag)
mtag.clicap_handler = c;
MessageTagHandlerAdd(modinfo->handle, &mtag);
HookAddVoid(modinfo->handle, HOOKTYPE_NEW_MESSAGE, 0, mtag_add_or_inherit_account);
return MOD_SUCCESS;
}
@@ -80,4 +83,22 @@ int account_tag_mtag_is_ok(aClient *acptr, char *name, char *value)
return 0;
}
// TODO: move from m_message (and elsewhere?) to here, some hook call or something
void mtag_add_or_inherit_account(aClient *acptr, MessageTag *recv_mtags, MessageTag **mtag_list)
{
MessageTag *m = find_mtag(recv_mtags, "account");
if (m)
{
m = duplicate_mtag(m);
} else
{
if (acptr && acptr->user &&
(*acptr->user->svid != '*') && !isdigit(*acptr->user->svid))
{
m = MyMallocEx(sizeof(MessageTag));
m->name = strdup("account");
m->value = strdup(acptr->user->svid);
}
}
if (m)
AddListItem(m, *mtag_list);
}
+38 -1
View File
@@ -35,6 +35,7 @@ ModuleHeader MOD_HEADER(msgid)
long CAP_ACCOUNT_TAG = 0L;
int msgid_mtag_is_ok(aClient *acptr, char *name, char *value);
void mtag_add_or_inherit_msgid(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list);
MOD_INIT(msgid)
{
@@ -50,6 +51,8 @@ MOD_INIT(msgid)
mtag.flags = MTAG_HANDLER_FLAGS_NO_CAP_NEEDED;
MessageTagHandlerAdd(modinfo->handle, &mtag);
HookAddVoid(modinfo->handle, HOOKTYPE_NEW_MESSAGE, 0, mtag_add_or_inherit_msgid);
return MOD_SUCCESS;
}
@@ -76,4 +79,38 @@ int msgid_mtag_is_ok(aClient *acptr, char *name, char *value)
return 0;
}
// TODO: move from m_message (and elsewhere?) to here, some hook call or something
/** Generate a msgid.
* @returns a MessageTag struct that you can use directly.
* @notes
* Apparently there has been some discussion on what method to use to
* generate msgid's. I am not going to list them here. Just saying that
* they have been considered and we chose to go for a string that contains
* 128+ bits of randomness, which has an extremely low chance of colissions.
* Or, to quote wikipedia on the birthday attack problem:
* "For comparison, 10^-18 to 10^-15 is the uncorrectable bit error rate
* of a typical hard disk. In theory, hashes or UUIDs being 128 bits,
* should stay within that range until about 820 billion outputs"
* For reference, 10^-15 is 0.000000000000001%
* The main reasons for this choice are: that it is extremely simple,
* the chance of making a mistake in an otherwise complex implementation
* is nullified and we don't risk "leaking" any details.
*/
MessageTag *mtag_generate_msgid(void)
{
MessageTag *m = MyMallocEx(sizeof(MessageTag));
m->name = strdup("msgid");
m->value = MyMallocEx(MSGIDLEN+1);
gen_random_alnum(m->value, MSGIDLEN);
return m;
}
void mtag_add_or_inherit_msgid(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list)
{
MessageTag *m = find_mtag(recv_mtags, "msgid");
if (m)
m = duplicate_mtag(m);
else
m = mtag_generate_msgid();
AddListItem(m, *mtag_list);
}
+32 -1
View File
@@ -35,6 +35,7 @@ ModuleHeader MOD_HEADER(server-time)
long CAP_SERVER_TIME = 0L;
int server_time_mtag_is_ok(aClient *acptr, char *name, char *value);
void mtag_add_or_inherit_time(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list);
MOD_INIT(server-time)
{
@@ -54,6 +55,8 @@ MOD_INIT(server-time)
mtag.clicap_handler = c;
MessageTagHandlerAdd(modinfo->handle, &mtag);
HookAddVoid(modinfo->handle, HOOKTYPE_NEW_MESSAGE, 0, mtag_add_or_inherit_time);
return MOD_SUCCESS;
}
@@ -80,4 +83,32 @@ int server_time_mtag_is_ok(aClient *acptr, char *name, char *value)
return 0;
}
// TODO: move from m_message (and elsewhere?) to here, some hook call or something
void mtag_add_or_inherit_time(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list)
{
MessageTag *m = find_mtag(recv_mtags, "time");
if (m)
{
m = duplicate_mtag(m);
} else
{
struct timeval t;
struct tm *tm;
char buf[64];
gettimeofday(&t, NULL);
tm = gmtime(&t.tv_sec);
snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ",
tm->tm_year + 1900,
tm->tm_mon + 1,
tm->tm_mday,
tm->tm_hour,
tm->tm_min,
tm->tm_sec,
(int)(t.tv_usec / 1000));
m = MyMallocEx(sizeof(MessageTag));
m->name = strdup("time");
m->value = strdup(buf);
}
AddListItem(m, *mtag_list);
}
+1 -3
View File
@@ -370,9 +370,7 @@ int m_message(aClient *cptr, aClient *sptr, MessageTag *recv_mtags, int parc, ch
if (!text)
continue;
mtag_add_or_inherit_msgid(recv_mtags, &mtags);
mtag_add_or_inherit_account(recv_mtags, &mtags, sptr);
mtag_add_or_inherit_time(recv_mtags, &mtags);
new_message(sptr, recv_mtags, &mtags);
sendto_channel(chptr, sptr, sptr,
prefix, 0, sendflags, mtags,
notice ? ":%s NOTICE %s :%s" : ":%s PRIVMSG %s :%s",
+8 -82
View File
@@ -1330,31 +1330,6 @@ char *pretty_date(TS t)
return buf;
}
/** Generate a msgid.
* @returns a MessageTag struct that you can use directly.
* @notes
* Apparently there has been some discussion on what method to use to
* generate msgid's. I am not going to list them here. Just saying that
* they have been considered and we chose to go for a string that contains
* 128+ bits of randomness, which has an extremely low chance of colissions.
* Or, to quote wikipedia on the birthday attack problem:
* "For comparison, 10^-18 to 10^-15 is the uncorrectable bit error rate
* of a typical hard disk. In theory, hashes or UUIDs being 128 bits,
* should stay within that range until about 820 billion outputs"
* For reference, 10^-15 is 0.000000000000001%
* The main reasons for this choice are: that it is extremely simple,
* the chance of making a mistake in an otherwise complex implementation
* is nullified and we don't risk "leaking" any details.
*/
MessageTag *mtag_generate_msgid(void)
{
MessageTag *m = MyMallocEx(sizeof(MessageTag));
m->name = strdup("msgid");
m->value = MyMallocEx(MSGIDLEN+1);
gen_random_alnum(m->value, MSGIDLEN);
return m;
}
/** Find a particular message-tag in the 'mtags' list */
MessageTag *find_mtag(MessageTag *mtags, const char *token)
{
@@ -1389,62 +1364,13 @@ MessageTag *duplicate_mtag(MessageTag *mtag)
return m;
}
void mtag_add_or_inherit_msgid(MessageTag *recv_mtags, MessageTag **mtag_list)
/** New message. Either really brand new, or inherited from other servers.
* This function calls modules so they can add tags tags such as:
* msgid, time and account.
*/
void new_message(aClient *sender, MessageTag *recv_mtags, MessageTag **mtag_list)
{
MessageTag *m = find_mtag(recv_mtags, "msgid");
if (m)
m = duplicate_mtag(m);
else
m = mtag_generate_msgid();
AddListItem(m, *mtag_list);
}
void mtag_add_or_inherit_account(MessageTag *recv_mtags, MessageTag **mtag_list, aClient *acptr)
{
MessageTag *m = find_mtag(recv_mtags, "account");
if (m)
{
m = duplicate_mtag(m);
} else
{
if (acptr && acptr->user &&
(*acptr->user->svid != '*') && !isdigit(*acptr->user->svid))
{
m = MyMallocEx(sizeof(MessageTag));
m->name = strdup("account");
m->value = strdup(acptr->user->svid);
}
}
if (m)
AddListItem(m, *mtag_list);
}
void mtag_add_or_inherit_time(MessageTag *recv_mtags, MessageTag **mtag_list)
{
MessageTag *m = find_mtag(recv_mtags, "time");
if (m)
{
m = duplicate_mtag(m);
} else
{
struct timeval t;
struct tm *tm;
char buf[64];
gettimeofday(&t, NULL);
tm = gmtime(&t.tv_sec);
snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ",
tm->tm_year + 1900,
tm->tm_mon + 1,
tm->tm_mday,
tm->tm_hour,
tm->tm_min,
tm->tm_sec,
(int)(t.tv_usec / 1000));
m = MyMallocEx(sizeof(MessageTag));
m->name = strdup("time");
m->value = strdup(buf);
}
AddListItem(m, *mtag_list);
Hook *h;
for (h = Hooks[HOOKTYPE_NEW_MESSAGE]; h; h = h->next)
(*(h->func.voidfunc))(sender, recv_mtags, mtag_list);
}