1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-25 16:26:38 +02:00
Commit Graph

301 Commits

Author SHA1 Message Date
k4be 55a5574a4b Merge branch 'unreal60_dev' into unreal60_dev+watch 2021-08-06 15:23:37 +02:00
Bram Matthys 8dd6640bf5 Rename get_channel() to make_channel() to match make_user() and
change some more calls to make_channel() to use find_channel().
Also make it take 1 argument instead of 3.

Needed to be careful in sjoin code since the previous code set
channel->creationtime to 0 if client was a remote. Now merged
a few if's into one. Should be correct :D.
2021-08-05 16:55:28 +02:00
Bram Matthys dbdfb7c656 Update TKL code to use new logging system. Make the TKL add/del/expiry
messages more consistent at the same time.
2021-08-05 10:19:05 +02:00
k4be 7fab97d364 Add watch notification hook.
This will likely reduce performance, but this should not matter in modern times.
Also added flags to let modules know which one the entry belongs to, and what
to do with it.
Now modules should be able to add their own WATCH methods (like IRCv3 MONITOR),
or extend functionality to notify about other changes than the default log on,
log off and away statuses (like SETNAMEs).
2021-07-20 20:59:36 +02:00
k4be 6ec6c37839 Add watch calls to efunctions.
(Doing nothing useful at this point.)
Also bump MAXEFUNCTIONS.
2021-07-19 21:28:29 +02:00
k4be bcbcc10b9d Move watch code from core to module 2021-07-19 18:16:28 +02:00
k4be 3ede47c7fa Remove invite moddata access from core (without breaking the api) 2021-07-15 16:13:02 +02:00
Bram Matthys d3c98c73c2 Fix issue where saslmechlist could not be set by services server.
This broke SASL services autodetection and also sasl=x,y,z in CAP.
Reported by Valware in https://bugs.unrealircd.org/view.php?id=5960

Of course the easiest solution would be just to set .remote_write=1
for this, which is what I've just done for the 5.2.1.1 release.
But there seems to be a pattern here. When a server wants to write
its own object (irc1.example.net writing to the MD object of
irc1.example.net) we have the problem that that object is both
"our client" and from the other server POV it is "themselves".
On one hand you may want to allow that (eg for 'saslmechlist'), on
the other hand a server writing its own 'certfp' sounds like a bad
idea in principle.
So we now add a new option for the 'self' case and make some MD
objects use it. In fact, in the core we now have zero MD objects
using remote_write. We keep the option available though, for example
for k4be's geoip modules and possibly future features.

Module API change:
* .self_write added which allows a server to write to its own object
  (irc1.example.net writing to the MD object of irc1.example.net)
* .remote_write still exists too if you want to allow remote servers
  to write to your own objects
* Note that in all cases, servers can always write to their own
  (child) client objects.

Changes:
* The link-security MD changed from .remote_write=1 to .self_write=1
* The salmechslist MD now has .self_write=1, this fixes the actual bug
2021-07-10 09:14:18 +02:00
Bram Matthys e9e2504bf4 Don't allow remote servers to write to our MD client objects by default.
Modules can still opt-in via mreq.remote_write=1 to allow it for
certain moddata.
For example, k4be may want to do this for his geoip-base module which
allows a single server to set moddata "geoip" for all connecting clients,
including remote clients.
If you are a moddata provider then you can enable it like this:
 ModDataInfo mreq;
 [..]
 #if UNREAL_VERSION_TIME >= 202125
 mreq.remote_write = 1;
 #endif
 [..]

See discussion on https://github.com/unrealircd/unrealircd/pull/142
2021-06-25 11:28:32 +02:00
Bram Matthys 3188b7be2d Small code cleanup for two efuncs, so the names match. 2021-06-06 08:33:20 +02:00
Bram Matthys a85a38e69d Add the ability to SPAMFILTER message-tags.
The new target type is called 'T' and we match against "name=value"
of each message tag (or just "name" if it is without value).

Example: SPAMFILTER ADD -simple T kill 0 this_is_a_test +typing=active
(No this is not a suggestion :D)

This probably won't be used much at all, but it is good to have the
option available in case there is some massive problem,
especially since more message tags may pop up sooner or later.

Caveat: this is actually a bit slow as we may have to check multiple
message tags for a single line.
If there are zero message-tag spamfilters then we will automatically
short-circuit and save all this CPU, which will be the most common case.
2021-05-25 20:31:10 +02:00
Bram Matthys 3ad6878865 Set new maximums for channel mode +H. If the channel is +r then the maximum
is now 5000 lines / 31 days. For unregistered it is 200 lines / 31 days.
Previous setting was 200 lines / 7 days for both.

Admins can tweak these settings, see:
https://www.unrealircd.org/docs/Set_block#set::history

More code to deal with corner issues will follow later.

UnrealIRCd module coders [!]:
This also changes the channel mode API conv_param. You can use
the UNREAL_VERSION_TIME >= 202120 condition to detect this.
Eg:
 #if UNREAL_VERSION_TIME < 202120
 int my_conv_param(char *para, Client *client);
 #else
 int my_conv_param(char *para, Client *client, Channel *channel);
 #endif
2021-05-22 18:15:26 +02:00
Bram Matthys cda145b62a Add initial version of CHATHISTORY command
from https://ircv3.net/specs/extensions/chathistory

Current status of the module in UnrealIRCd:
* A significant part of this is done and working
* Currently in modules.optional.conf to get test exposure,
  not yet loaded by default.
* CHATHISTORY subcommands implemented: BEFORE, AFTER, LATEST, AROUND
* It does not implement the subcommand "BETWEEN" yet
* It does not announce or recognize the (draft) CAP's yet
* It does not announce the ISUPPORT token CHATHISTORY=xx yet
* Testcases need to be written to validate everything
* There will be bugs, now, and also while implementing the rest
  in the days to come.
2021-05-19 16:19:41 +02:00
Bram Matthys c79cc6f430 Add ModuleSetOptions(modinfo->handle, MOD_OPT_UNLOAD_PRIORITY, priority);
so modules can indicate if they wish to be unloaded before or after others.
This is used by the channel and history modules so they can save their
databases before the chanmodes modules are unloaded.

Also, made ModuleSetOptions() a void function. I don't think anyone
used the returned value and it now no longer is strictly bitmask add/del
so returning an unsigned int would be a tad confusing.
2021-05-17 11:43:46 +02:00
Bram Matthys 73ae7ccbef Mod API: Add CONFIG_SET_HISTORY_CHANNEL so chanmodes/history
can delegate configuration to history_backend_mem.
2021-05-15 15:41:02 +02:00
Bram Matthys d6b0981433 Module coders: Update HOOKTYPE_LOCAL_NICKCHANGE and HOOKTYPE_REMOTE_NICKCHANGE.
I forgot to include message tags earlier, so this is a breaking change:
-int hooktype_local_nickchange(Client *client, char *newnick);
-int hooktype_remote_nickchange(Client *client, char *newnick);
+int hooktype_local_nickchange(Client *client, MessageTag *mtags, char *newnick);
+int hooktype_remote_nickchange(Client *client, MessageTag *mtags, char *newnick);

Be sure to update your hooks!
You can use something like: #if UNREAL_VERSION_TIME>=202115
2021-04-17 10:38:25 +02:00
Bram Matthys e596b730af Move channel history sending from one layer to the other.
This so for example history_backend_mem() does not do any sending.
Less efficient but needed for later when things get more complex.
2021-04-07 09:42:18 +02:00
Bram Matthys 1baf5f9f7d Show reputation score and some other info in "Client connecting"
notices to IRCOps and in ircd.log.
See the release notes for more details.

Module coders:
You can use HOOKTYPE_CONNECT_EXTINFO to add your own additional
information as well. See get_connect_extinfo() for inspiration.
Use nvplist_add() or nvplist_add_fmt() to easily add your info
to the list.

Module coders II:
Small note: this moves the sending of the far connect notice
to /under/ HOOKTYPE_REMOTE_CONNECT instead of /above/.
2021-01-31 18:30:49 +01:00
Bram Matthys bde91bcc5c Finish Hook API doxygen docs, ~100% done now. 2020-11-22 12:26:30 +01:00
Bram Matthys fcb1767500 Update module API doxygen docs: the hook docs are now 80% done. 2020-11-21 19:08:17 +01:00
Bram Matthys 8372224c01 Add vertical spacing to function prototypes
[skip ci]
2020-11-21 18:10:29 +01:00
Bram Matthys 8720c846a1 And some more hook documentation... 2020-11-08 18:48:11 +01:00
Bram Matthys 8f7e40a6dc Compile fix for gcc with previous commits. 2020-11-08 16:42:39 +01:00
Bram Matthys c369551721 Commit first 40% of Hook API Documentation in doxygen.
The remaining 60% consists of placeholders at the moment.

Note: if you are running git then don't try to live-reload these
changes, ircd must restart.
2020-11-08 16:16:59 +01:00
Bram Matthys 3701ce9a43 Document existing extended ban options. 2020-09-26 12:49:44 +02:00
Bram Matthys 7a4832d337 Fix missing ERROR when using a @label, reported by k4be.
This had to do with the queued packet (in the labeled-response module)
not being sent because the client was freed before the
post packet hook was called.
2020-05-11 19:18:41 +02:00
Bram Matthys 4832559642 LoadPersistentLong() called the wrong function, always raising a warning/error. 2020-05-09 11:51:59 +02:00
Bram Matthys 57f524cbed Support for +draft/typing
This is the work from May 3rd.. need to commit it so i can merge the
flood protection that is related to this...
The final implementation will still need tweaking before pushed.
[skip ci]
2020-05-05 20:16:56 +02:00
Bram Matthys 9887ef6955 Fix possible crash when unloading a module with moddata.
This only happens in some circumstances.

From now on EventDel() will simply mark the event as deleted.
The actual freeing is started in DoEvents() after the event loop.
This makes it safe to use EventDel() everywhere.

The previous attempt to fix that issue was
d29a55a8db but it introduced a
new crash issue for a slightly different case, as mentioned in
https://bugs.unrealircd.org/view.php?id=5553
2020-04-12 16:52:43 +02:00
Bram Matthys 8c0a2a1f96 Fix bug in hook prototype for FREE_USER. In most cases you are better
off not using this and you'll want to use the three other hooks anyway:
* HOOKTYPE_LOCAL_QUIT - for local quits of registered clients
* HOOKTYPE_REMOTE_QUIT - for remote quits of registered clients
* HOOKTYPE_UNKUSER_QUIT - for local quits of unregistered clients
  (that is, before they have completed NICK+USER etc)
2020-02-09 14:53:43 +01:00
k4bek4be 19e672ac22 Module coders: add ACCOUNT_LOGIN hook (#94) 2020-02-09 10:34:06 +01:00
Bram Matthys ed6a2cf3e3 Add new message tag "unrealircd.org/userip" which will communicate
the user@ip of users to IRCOps if the message-tags capability is
enabled. Idea from westor. This is work in progress.
2020-02-02 15:49:21 +01:00
Bram Matthys a8c191b291 Add new command: HISTORY #chan [lines]. This is meant for end-users
so they can fetch more history than the standard on-join history.

In the future we are also likely to implement IRCv3 CHATHISTORY
once that becomes an official specification. However, until it is
specified and until most major clients support it, several years
are likely to pass. It would be a shame to withhold channel
history to many end-users in the meantime when it takes so little
effort from us to provide an easy command.

See also
https://www.unrealircd.org/docs/Channel_history
And in particular the new section:
https://www.unrealircd.org/docs/Channel_history#Playback_frontends
which explains the relationship between on-join playback,
HISTORY and CHATHISTORY.
2020-02-02 11:57:51 +01:00
Bram Matthys 596cf8e7de New: extended server bans: exempt by certificate fingerprint and SASL account.
See https://www.unrealircd.org/docs/Extended_server_bans

Examples with ELINE:
/ELINE ~a:TrustedAccount kg 0 This user can bypass kline/gline when using SASL
/ELINE ~S:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef kgf 0 Trusted user with this certificate fingerprint
It also works with bans, although this would be less common:
/GLINE ~a:EvilAccount
A more useful purpose would be to use ~r (realname):
/GLINE ~r:*some*stupid*real*name*
(Although you could already ban realnames via spamfilter 'u')

For third party module coders:
If you have an extban in group 3 (a "matcher"-extban) then you
can opt-in to support this. You do so at extban registration time:
req.options = EXTBOPT_TKL;
or, if you already had another flag set, like for +I, then:
req.options = EXTBOPT_INVEX|EXTBOPT_TKL;
In any case, you set the .options before you call ExtbanAdd().

Note that if you do indicate support then your is_ok function
will be called like:
extban->is_ok(client, NULL, mask, EXBCHK_PARAM, MODE_ADD, EXBTYPE_TKL);
Important here is the NULL channel (since there is none)

Similarly your is_banned function will be called with BANCHK_CONNECT:
extban->is_banned(client, NULL, banstr, BANCHK_JOIN, &msg, &errmsg);
Here too, it is important to note that channel is NULL.
2020-01-10 11:45:25 +01:00
Bram Matthys 4a547a766e Remove HOOKTYPE_LOCAL_NICKPASS (now useless), see previous commit. 2019-12-23 16:42:10 +01:00
Bram Matthys 28539d41e0 Fix incorrect prototype for HOOKTYPE_TOPIC, has mtags. 2019-11-29 12:23:13 +01:00
Bram Matthys a8534a6063 Add new function kick_user() for use by modules. This so KICKs are
done in a consistent way.
2019-11-27 10:33:08 +01:00
Bram Matthys 21ef90e503 Document channel mode api and two other files. 2019-10-26 11:22:10 +02:00
Bram Matthys 845f9ca8ed Uniform spelling: seetle on sync/synced/desync/desynced, rather than
synch/synched/desynch/desynched.
2019-10-25 14:07:58 +02:00
Bram Matthys 09854abade Move the dcc deny stuff into the dccdeny module, that is:
functions from extra.c, entire undccdeny and svsfline,
large functions that were in message.c and conf.c
2019-10-25 13:39:24 +02:00
Bram Matthys 798b223ee3 Convert some more stuff to enums (config preprocessor mostly). 2019-10-06 07:54:46 +02:00
Bram Matthys c399aab016 Support for labeled-response in LIST (I really wanted this) 2019-10-05 18:21:47 +02:00
Bram Matthys 2eecf4f2da Use generic numeric 531 (ERR_CANTSENDTOUSER) for all such cases and use hook
CAN_SEND_TO_USER rather than HOOKTYPE_PRE_USERMSG (which is now removed).

As for the numeric change: this makes it much easier for client devs.
You rarely need to differentiate in the client code between the various
causes. One only cares about detecting that the message was not sent and
that the user needs to be informed.
This replaces various NOTICEs, ERR_NOCTCP, ERR_NONONREG etc. with just the
new numeric 531, which is taken from InspIRCd. The syntax is:
:server 531 yourname targetname :reason for the block
This makes it similar to numeric 404 (ERR_CANNOTSENDTOCHAN) that is used to
indicate that a channel message was blocked.

For module devs, the new hook CAN_SEND_TO_USER prototype is:
int hooktype_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, int notice);
You can replace the text via this, by setting *text in your function.
You can block the message, by returning HOOK_DENY. If doing so, then
you must also set *errmsg to an appropriate value.
Do not send any error message to the user! UnrealIRCd will take care of
sending the error message for you, if you set *errmsg.
Only if you need something special you could violate this rule, but
preferably not!

As you can see, CAN_SEND_TO_USER works just like CAN_SEND_TO_CHANNEL.
2019-10-05 12:53:41 +02:00
Bram Matthys df71812707 HOOKTYPE_CAN_SEND and HOOKTYPE_PRE_USERMSG changes:
1) HOOKTYPE_CAN_SEND is now called HOOKTYPE_CAN_SEND_TO_CHANNEL
   The arguments and return values are unchanged
2) similarly can_send() is now called can_send_to_channel()
3) If you want to block or alter a message you must now
   use HOOKTYPE_CAN_SEND_TO_CHANNEL and return HOOK_DENY from
   there with an appropriate *errmsg filled (see nocolor and
   many other modules for an example)
4) You CANNOT use HOOKTYPE_PRE_USERMSG anymore to block a message.
   I actually wanted to rip this hooktype out entirely, but
   delayjoin needs it. HOOKTYPE_PRE_USERMSG is only useful for
   notification that a message is going to be sent BEFORE it is
   actually sent (which is exactly what delayjoin needs, so it
   can send a JOIN if the user is currently invisible).
5) This is all to make things more clean:
   * HOOKTYPE_PRE_USERMSG is only for delayjoin
   * HOOKTYPE_CAN_SEND_TO_CHANNEL is used for exactly what the
     name implies. You can also change the message text there,
     such as for +G, +S, etc.
2019-10-05 09:48:33 +02:00
Bram Matthys 798f502875 Mass change (at least this one could be fully automated): 'chptr' -> 'channel'
to be consistent with the 'sptr' -> 'client' rename earlier.
2019-10-05 08:49:10 +02:00
Bram Matthys 3a64077f51 Use 'client' everywhere (if there is no confusion) instead of 'sptr' or 'cptr'.
This so I - and others - don't constantly have to wonder whether the client
is called sptr, cptr or acptr in a simple routine.
Insane --> 212 files changed, 6814 insertions(+), 6945 deletions(-)
Couldn't just mass-replace of course since there are places where there
are multiple clients involved. So had to check each function.
Also renamed some 'acptr' to 'target' and such.

I will write a page with new style rules later.. but in short if there is
only 1 client involved it will now be called 'client'.
2019-10-04 15:25:35 +02:00
Bram Matthys 3126a3fae4 BIG changes internally that will break all modules and required many
code changes in UnrealIRCd itself:
1) Clients are no longer freed directly by exit_client. Most fields
   are freed, but 'sptr' itself is not, so you can use IsDead() on it.
2) exit_client now returns void rather than int
3) ALL command functions return void rather than int.
   Of course this also affects do_cmd, command overrides, etc.

This is a direct consequence of the removal of 'cptr' earlier, as that
was used to signal certain things that are now no longer possible
(and it raises the question if things were always correctly signaled
in the first place, so may fix some bugs).
It also makes the code more resillient against cases where you forgot
to check if the client was freed. Still, you are encouraged to do an
IsDead(sptr) if you are calling functions that may kill clients,
such as command functions or things that may use spamfilter.

More changes will follow, such as the removal of FLUSH_BUFFER.
2019-10-04 10:28:41 +02:00
Bram Matthys 4ac8015f84 Remove 'cptr' from all commands, hooks, etc. It only confuses people and
'sptr' is sufficient and in most cases the only one you should care about.
Should you need it, you can access sptr->direction in cases where you
need the old information (usually only for some sendto_* functions
and some protoctl checks), so 'cptr' was redundant too.

[!] This change likely introduces some bugs. This was many hours of work.
I only cut some corners in 4 functions, which will be fixed at a later
stage..... yes, more major changes to come.

On the plus side, I likely fixed some bugs in the process. Situations
where cptr vs sptr usage was incorrect. Eg using cptr->name (near server)
when sptr->name should be used (the actual source server), etc....
2019-10-02 14:25:40 +02:00
Bram Matthys d7ef752888 Detect combination of non-UTF8 nickchars in use and websocket type text.
In such a case we refuse to run since the consequences are too big.
(Actually I may change the non-UTF8 channel warning to an error as well,
 right now it isn't.. simply because I cannot read a certain setting)

From both the non-UTF8 channel and user warning/error, we now refer to:
https://www.unrealircd.org/docs/WebSocket_support#websockets-and-non-utf8
which contains a bit more detailed information as to the WHY.
2019-09-23 10:20:38 +02:00
Bram Matthys 4ae374477f Add websocket support for 'text' instead of current 'binary'. And change
how you use websockets in the configuration file:
In addition to loading the websocket module you now ALSO have to mark
specific listen blocks with listen::options::websocket, and you have
to specify a type as well. Example:
listen {
	ip *;
	port 1234;
	options {
		websocket { type binary; }
	}
}
The type 'text' is compatible with kiwi although this is currently
completely untested. Also I should add something to the release notes
about this change. Tomorrow...
2019-09-22 20:49:37 +02:00