1
0
mirror of https://github.com/anope/anope.git synced 2026-06-12 20:34:48 +02:00

Compare commits

...

912 Commits

Author SHA1 Message Date
Sadie Powell 9930fa01ac Release 2.1.16. 2025-07-01 10:56:40 +01:00
Sadie Powell 40929a0490 Update the change logs. 2025-07-01 10:13:36 +01:00
Sadie Powell 783be31f64 Update author list. 2025-07-01 09:48:19 +01:00
Sadie Powell 0f5f2aef2e Bump the minimum OpenSSL version to 1.1.1.
Close #517.
2025-07-01 00:00:55 +01:00
Sadie Powell 6cc997c4e9 When unsetting a temporary ban delete the unset timer.
This prevents Anope from unsetting a later-added ban,

Resolves MantisBT bug 1709.
2025-06-25 19:16:15 +01:00
Sadie Powell eda6d8cc0f Fix storing the setter of a list mode. 2025-06-25 19:10:49 +01:00
Sadie Powell 3440b38a21 Merge branch '2.0' into 2.1. 2025-06-25 17:50:01 +01:00
Sadie Powell fca421aa2a Fix resetpass confirming accounts when not using email confirmation.
Fixes MantisBT bug 1734.
2025-06-25 17:36:16 +01:00
Sadie Powell 035905d321 Fix example messages using .site which is a real TLD now. 2025-06-25 15:39:35 +01:00
Sadie Powell d1cd57d98e Resynchronise the en_US language file. 2025-06-25 15:34:01 +01:00
Sadie Powell 48daeeac1d Merge branch '2.0' into 2.1. 2025-06-25 15:33:36 +01:00
Sadie Powell 9bcf46f8ea Fix using service's instead of services' where appropriate. 2025-06-25 15:29:16 +01:00
Sadie Powell 0b6c7ce5d6 Update some messages for the language used by modern BIND versions. 2025-06-25 15:28:54 +01:00
Sadie Powell a0d21b207b Fix reading the purge time in cs_seen. 2025-06-25 14:08:44 +01:00
Sadie Powell 3cc5b5143f Remove the old 1.8-style seen system. 2025-06-25 14:06:59 +01:00
Sadie Powell da738126a4 Merge branch '2.0' into 2.1. 2025-06-25 12:07:36 +01:00
Sadie Powell 0bb1bc5c67 Backport various minor config changes from 2.1. 2025-06-25 12:00:33 +01:00
Sadie Powell 72010cd1a9 Fix messages that say IRC Operator when they mean Services Operator. 2025-06-24 13:58:47 +01:00
Sadie Powell c48b3af3d4 Remove an obsolete workaround from Config. 2025-06-24 09:29:33 +01:00
Sadie Powell 85c129701b Clarify how to migrate db_flatfile databases to db_json. 2025-06-23 23:39:20 +01:00
Sadie Powell a9e5a79e91 Remove some unused strings in os_news. 2025-06-22 15:45:21 +01:00
Sadie Powell adc1343d6c Serialize item types as strings instead of integers.
Using the type cast to an integer here was undefined behaviour.
2025-06-22 15:45:21 +01:00
Sadie Powell 8aa1102c7a Default to db_json. 2025-06-22 15:45:21 +01:00
TehPeGaSuS 1a89d32926 Document NS_STATS and CS_STATS. 2025-06-21 17:09:26 +01:00
Sadie Powell ad06853edf Fix suggesting unloaded commands in the "did you mean" message. 2025-06-21 09:56:02 +01:00
Sadie Powell 66ae20e0f2 Tweak a message to make it easier for ESL speakers to understand. 2025-06-21 09:48:01 +01:00
Sadie Powell 2850e3c65c Implement serializer hashing in db_json. 2025-06-21 00:31:02 +01:00
Sadie Powell 80b8856254 Consistently use "account" instead of "nick group". 2025-06-20 20:30:21 +01:00
Sadie Powell 21c8164539 When assigning a new display nick use the oldest not the first. 2025-06-20 20:27:39 +01:00
Sadie Powell a4abd27ffd Fix the grammar of a message in ns_confirm. 2025-06-20 19:43:02 +01:00
Sadie Powell b912b403f0 Fix a comment in CommandInfo. 2025-06-20 19:43:02 +01:00
Sadie Powell 59e9d47667 Update another message to use pluralisation. 2025-06-18 20:53:11 +01:00
Sadie Powell 1108e54250 We don't need to reserialize aliases now we use account identifiers. 2025-06-17 14:50:36 +01:00
Sadie Powell 8b37cdb5d5 Make the access description more useful when importing from Atheme. 2025-06-17 14:50:36 +01:00
Sadie Powell c5bff3a099 Fix various issues with language strings. 2025-06-16 12:30:42 +01:00
Sadie Powell 61b0c82884 Rework how confirmation works and make it modular. 2025-06-16 10:00:41 +01:00
Sadie Powell c4c159d197 Fix showing the MORE_INFO message. 2025-06-15 11:49:26 +01:00
Sadie Powell 04a32be1e1 Add support for code authentication via IRC.
This breaks spambots which try to register but that can't handle
reading the response from services.
2025-06-15 11:22:03 +01:00
Sadie Powell fe4b8ee669 When a command is missing in GetQueryCommand just return (MISSING). 2025-06-15 11:20:34 +01:00
Sadie Powell 34b451f36c The require_privilege option should default to yes not no. 2025-06-11 09:28:46 +01:00
Sadie Powell 16aff210fd Allow configuring fantasy commands to not require the FANTASY priv. 2025-06-10 16:05:11 +01:00
Sadie Powell 5702fb9145 Add a PREPEND subcommand to chanserv/topic. 2025-06-10 12:06:02 +01:00
Sadie Powell 783ba3fd74 Undocument DISCOURAGED; we do not use this anymore. 2025-06-08 16:21:08 +01:00
Sadie Powell f1ddd7cd02 Promote NickServ from OPTIONAL to RECOMMENDED.
Not sure why this wasn't already.
2025-06-08 16:09:43 +01:00
Sadie Powell c424c4d24d Document cs_statusupdate in the same way as other modules. 2025-06-08 12:22:45 +01:00
Sadie Powell 2d88383d9e Group some more chanserv commands. 2025-06-08 12:18:10 +01:00
Sadie Powell c73a6c621f Make the set_misc help format consistent with other set commands. 2025-06-07 13:27:30 +01:00
Sadie Powell 96a503b4d9 Fix a memory leak in the db_json module.
This reworks the module to store Data instead of a yyjson document
which does not free until yyjson_doc_free even if an array is cleared
(which annoyingly was only documented using a single comment in the
yyjson docs).
2025-06-05 22:01:45 +01:00
Sadie Powell 0632abd111 Banish irc2sql to the shadow realm. 2025-06-05 18:22:13 +01:00
TehPeGaSuS 1043e2189c Remove a reference to a config option that doesn't exist.
There's no `memoreceipt` anywhere, as far as I could check.
2025-06-01 15:29:35 +01:00
Sadie Powell 85f0d56c39 Bump for 2.1.16-git. 2025-06-01 10:14:44 +01:00
Sadie Powell cebc3f757b Release 2.1.15. 2025-06-01 10:13:49 +01:00
Sadie Powell 447a59d6f5 Update author list. 2025-06-01 10:06:05 +01:00
Sadie Powell 75aa633d87 Update yyjson. 2025-06-01 10:05:49 +01:00
Sadie Powell 7833a96dde Update the change logs. 2025-06-01 10:04:36 +01:00
Sadie Powell d326f869a3 Add the rpc_user module. 2025-06-01 09:50:29 +01:00
Sadie Powell b724617a8d Revert "Optimise the maths for the jsonrpc oversize integer workaround".
This reverts commit 937404e311.
2025-05-30 18:09:37 +01:00
Sadie Powell 76f0c78ece Remove some unused Windows code. 2025-05-30 14:43:54 +01:00
Sadie Powell 13491bd960 Add {nickserv}:enforcerreal and cache enforcer config on reload. 2025-05-29 17:36:28 +01:00
Sadie Powell bade5ea109 Tweak some help messages for consistency. 2025-05-29 16:46:55 +01:00
Sadie Powell 682a6a6ad4 Fix unsetting vhosts when cloaking isn't available on InspIRCd. 2025-05-29 15:46:31 +01:00
Sadie Powell 50030e07fa Make CTCP support more modular. 2025-05-27 15:30:09 +01:00
Sadie Powell 7b2f0f5790 Fix some trivial wrong types when getting config values. 2025-05-27 13:21:55 +01:00
Sadie Powell 23e72fc934 Convert Anope::Debug to an unsigned value. 2025-05-24 16:54:49 +01:00
Sadie Powell e182519e4d Fix using the wrong command name in the help module. 2025-05-24 15:20:47 +01:00
Sadie Powell 4317b5557e Redocument sendmailpath. 2025-05-23 23:18:12 +01:00
Sadie Powell f97448f48a Modernize some bits of Command. 2025-05-22 10:49:38 +01:00
Sadie Powell cb334fbae1 Remove the pidfile before restarting.
Fixes being unable to restart now we only allow one instance.
2025-05-17 20:04:41 +01:00
Sadie Powell d3bb930a5e Fix some inconsistencies with account lookups. 2025-05-17 19:35:03 +01:00
Sadie Powell 0fc1eb3133 Rename one last use of time_registered. 2025-05-17 15:05:13 +01:00
Sadie Powell 0ac9d70d63 Update the change logs. 2025-05-16 17:07:03 +01:00
Sadie Powell a3d61e3d18 Rename id to uniqueid to avoid shadowing. 2025-05-16 15:23:09 +01:00
Sadie Powell cac10aaa41 Always store a unique identifier in the database. 2025-05-16 15:18:24 +01:00
Sadie Powell be5a0e8108 Serialize using mutable objects not immutable ones. 2025-05-16 15:18:00 +01:00
Sadie Powell 3da8244de5 Log any startup error to the terminal. 2025-05-16 15:15:42 +01:00
Sadie Powell 8722daa6e7 Only allow one instance of Anope at once. 2025-05-16 15:15:30 +01:00
Sadie Powell a0e98acea8 Fix the codelength default. 2025-05-15 01:42:13 +01:00
Sadie Powell c5a2f40666 Move the ssl extensible into the METADATA handler on InspIRCd. 2025-05-14 21:02:48 +01:00
Sadie Powell 1daafff79d Merge various email modules into one module.
In the future this will become the basis of the email contact
module and will encapsulate everything relating to email but for
now its mostly kept as-is.
2025-05-12 14:00:47 +01:00
Sadie Powell 3dd20975aa Also require services operators to confirm their email addresses.
Closes #468.
2025-05-11 22:59:20 +01:00
Sadie Powell 368d8e8b1c Remove first_commit which snuck into an earlier commit. 2025-05-11 18:24:57 +01:00
Sadie Powell 7c5d2c09fa Be more specific in the generator field in db_json. 2025-05-11 17:16:35 +01:00
Sadie Powell 41e702d853 Prefix the special db_json columns with an @. 2025-05-11 16:52:46 +01:00
Sadie Powell 19f83eaa34 Fix loading databases in db_json. 2025-05-11 16:45:44 +01:00
Sadie Powell b1212f9e89 Enable db_json by default. 2025-05-11 15:09:39 +01:00
Sadie Powell 3e9f516d55 Consistently use yes/no instead of true/false in the configs. 2025-05-11 12:49:25 +01:00
Sadie Powell 744b8bc4dc Redocument db_sql(_live) in the example configs. 2025-05-11 12:44:45 +01:00
Sadie Powell e9a0a214b0 Refactor Anope::strftime. 2025-05-10 14:40:12 +01:00
Sadie Powell 46c5570b1d Use UTC in timestamps shown to users. 2025-05-10 14:40:12 +01:00
Sadie Powell 151795a1df Remove an outdated comment in the memoserv example config. 2025-05-10 14:40:12 +01:00
Sadie Powell 50f17ea8e1 Consistently use realname instead of gecos. 2025-05-10 14:40:12 +01:00
Sadie Powell 2609ff44c6 Add defaults for service:{user,host,gecos}. 2025-05-10 14:40:12 +01:00
Sadie Powell ca30bb2370 Fix some remaining uses of vHost in the configs. 2025-05-10 13:32:45 +01:00
Sadie Powell f36b311f84 Add a note to irc2sql about using rpc_data instead. 2025-05-10 11:50:40 +01:00
Sadie Powell fec85376e7 Remove some duplicate chanstats settings. 2025-05-10 11:29:23 +01:00
Sadie Powell 0bf14650fa Always use the same stats object when deserialising stats.
Closes #509.
2025-05-10 10:23:11 +01:00
Sadie Powell 49f93b7670 Use more appropriate types for MaxUserCount and OperCount. 2025-05-10 00:59:20 +01:00
Sadie Powell ce0982cc4a There's no need to count the servers in os_stats. 2025-05-10 00:54:39 +01:00
Sadie Powell b4150841ec Try to ensure we only have use Stats instance.
This probably only happens when a user has a broken database but
its best to be more robust.
2025-05-10 00:54:39 +01:00
Sadie Powell eec428b0c7 Build buffers a bit smarter in cs_access/cs_xop/help. 2025-05-09 22:36:50 +01:00
Sadie Powell b706a6259e Add an accessor to Serialize::Reference and deduplicate code. 2025-05-09 22:25:10 +01:00
Sadie Powell 2cf8f003ce Allow using an account identifier in the anope.account RPC method. 2025-05-09 22:02:06 +01:00
Sadie Powell 07f57b1108 Be more explicit about what versions compatibility code is for. 2025-05-09 21:43:35 +01:00
Sadie Powell 5d648f9f1c Revert "Force the MySQL module to use UTC for connections".
This results in a deadlock. We have other ways for dealing with
this problem anyway.

Closes #506.
2025-05-09 15:35:02 +01:00
Sadie Powell 46e6b0adde Fix some forward declarations in the httpd header. 2025-05-09 15:35:02 +01:00
Sadie Powell 977780d8ef Store user away state and add it to the anope.user RPC event. 2025-05-09 14:47:31 +01:00
Sadie Powell 459f3d07c9 Add TLS usage to the anope.user RPC event. 2025-05-09 14:17:55 +01:00
Sadie Powell b76b407b33 Move HTTP types to the HTTP namespace. 2025-05-09 12:36:42 +01:00
Sadie Powell 8b089ab1a7 Stringify all parameters in the example RPC clients. 2025-05-09 11:33:20 +01:00
Sadie Powell fbec4d04a5 Merge branch '2.0' into 2.1. 2025-05-08 16:55:59 +01:00
Sadie Powell 34582a40ef Change Command::Run to return true on success. 2025-05-08 16:53:10 +01:00
Sadie Powell 4b15ca0232 Bump for 2.0.19-git. 2025-05-08 15:03:03 +01:00
Sadie Powell 997302f861 Release 2.0.18. 2025-05-08 15:01:58 +01:00
Sadie Powell b3b6e9f862 Update the change log. 2025-05-08 14:59:37 +01:00
Sadie Powell d23bfb0113 Fix being able to group guest nicknames.
This does not affect 2.1 because grouped nicknames work differently
on that branch.

Reported by @ValwareIRC.
2025-05-08 14:51:56 +01:00
Val Lorentz 0b7b4aa42d Fix French translation of "last used" 2025-05-06 10:18:58 +01:00
Sadie Powell fab8589e1e Remove rpc_main. 2025-05-05 21:18:27 +01:00
Sadie Powell 937404e311 Optimise the maths for the jsonrpc oversize integer workaround. 2025-05-05 21:11:51 +01:00
Sadie Powell c5ad774ce5 Add a workaround for JavaScript truncating integers in RPC. 2025-05-05 16:53:03 +01:00
Sadie Powell 1321f4f071 Add an example Ruby JSON-RPC client. 2025-05-05 13:25:40 +01:00
Sadie Powell 4319b6428f Fix various documentation errors in the JavaScript JSON-RPC client. 2025-05-05 13:24:23 +01:00
Sadie Powell e1f6d0ca16 Document the existence of the example JSON-RPC client. 2025-05-04 14:45:00 +01:00
Sadie Powell bb9074cbd5 Fix HTTP headers to be case insensitive as required by the spec. 2025-05-04 14:39:51 +01:00
Sadie Powell 72f5e3580f Also allow hashed RPC tokens in the config file. 2025-05-04 14:39:20 +01:00
Sadie Powell 4b854d3935 Add support for bearer tokens for authorising with RPC. 2025-05-04 14:14:19 +01:00
Sadie Powell 0b2b00b37d Send list mode changes with BMASK or EBMASK on Solanum. 2025-05-04 11:28:49 +01:00
Sadie Powell 196a3c32c2 Request EBMASK on Solanum.
TODO: also send this.
2025-05-04 03:18:23 +01:00
Sadie Powell 8955c53088 Zero-initialize a variable in BuildModeChange. 2025-05-04 02:56:59 +01:00
Sadie Powell 88c71fba64 Request SJSBY from UnrealIRCd.
We don't send this yet because its not ergonomic to do so with
the current API. Bleh.
2025-05-04 02:07:15 +01:00
Sadie Powell 21f61981ca Enable hidenetsplitquit by default. 2025-05-04 00:18:09 +01:00
Sadie Powell 5752c07a56 Fix a missing override keyword. 2025-05-03 21:40:21 +01:00
Sadie Powell 010beb52b1 Store the setter and ts for all modes and try to restore them.
This is mostly for preserving channel list mode info.
2025-05-03 21:28:56 +01:00
Sadie Powell c955941413 Remove the unused template overload of SendMode. 2025-05-03 19:01:35 +01:00
Sadie Powell 2e2515b9f0 Always use SVSLOGIN on UnrealIRCd. 2025-05-03 19:00:58 +01:00
Sadie Powell f0b26c9b44 Drop support for Bahamut as it has no non-DALnet users.
Closes #438.
2025-05-03 18:41:59 +01:00
Sadie Powell f953f7f006 Bump the minimum version of ircd-hybrid to 8.2.34.
This is 5 years old and allows us to remove the SVSACCOUNT hack.
2025-05-03 18:10:24 +01:00
Sadie Powell 84baf15620 Don't send join numerics to our own clients. 2025-05-03 17:16:05 +01:00
Sadie Powell 89f61ac91b Remove the inconsistently used [auto memo] prefix from some memos. 2025-05-02 12:25:15 +01:00
Sadie Powell b091184c60 Remove an obsolete comment about Windows. 2025-05-02 11:38:17 +01:00
Sadie Powell 6b1a491694 Add a note to LANGUAGE about control characters in messages. 2025-05-02 11:37:23 +01:00
Sadie Powell 66d3293ae6 Remove double spacing after a full stop in help messages.
This hasn't been considered a best practice since the age of the
typewriter.

https://english.stackexchange.com/questions/2544/how-many-spaces-should-come-after-a-period-full-stop
2025-05-02 11:10:35 +01:00
Sadie Powell a4691f9d4d Fix some typos in the change log. 2025-05-02 11:01:38 +01:00
Sadie Powell 51c7a15c45 Bump for 2.1.15-git. 2025-05-02 09:52:40 +01:00
Sadie Powell b51c6453ae Release 2.1.14. 2025-05-02 09:52:40 +01:00
Sadie Powell 8a44b9c0ea Update the change logs. 2025-05-02 09:52:40 +01:00
Sadie Powell 0dd5430c94 Deduplicate code in cs_access. 2025-04-27 20:58:35 +01:00
Sadie Powell 046fa5c848 Show the reason why a config file failed to open. 2025-04-27 14:16:10 +01:00
Sadie Powell 551f3504c8 Fix broken handling of colour codes in LineWrapper.
Closes #504.
2025-04-27 13:01:29 +01:00
Sadie Powell c11638db98 Allow disabling the timestamp in os_news messages. 2025-04-25 13:08:26 +01:00
Sadie Powell 9ca69a7b49 Fix a typo in ns_alist. 2025-04-24 15:01:54 +01:00
Sadie Powell 459c7947ce Fix skipping lone $ values within config values. 2025-04-24 12:48:48 +01:00
Sadie Powell fad0a4a0e8 Add support for hashing operator passwords in the config.
Closes #327.
2025-04-24 12:46:58 +01:00
Sadie Powell 1630ccedb1 Remove some double lookups in User::BadPassword. 2025-04-24 11:59:21 +01:00
Sadie Powell 36d69b1e5c Update the change logs. 2025-04-23 17:34:33 +01:00
Sadie Powell 627b89ec7b Fix a minor regression in serialising channel data. 2025-04-23 17:33:01 +01:00
Sadie Powell 9373677610 Respect NEVEROP in chanserv/set/{founder,successor}. 2025-04-23 03:21:08 +01:00
Sadie Powell bbb65ddc33 When deleting a single list item show the deleted item not a count.
Closes #487.
2025-04-23 01:57:02 +01:00
Sadie Powell 508bbe11e6 Show all privileges in nickserv/alist.
Closes #502.
2025-04-23 00:33:48 +01:00
Sadie Powell 095ed3c8c8 Allow users to unmark themselves as a channel successor.
Closes #501.
2025-04-22 22:53:40 +01:00
Sadie Powell f3743cd37d Remove hardcoded command names from most messages. 2025-04-22 18:56:26 +01:00
Sadie Powell 0c155e0c05 Replace hard linebreaks in RPC and webcpanel messages. 2025-04-22 18:16:31 +01:00
Sadie Powell f362959834 Fix splitting in the middle of some command names. 2025-04-22 18:16:31 +01:00
Sadie Powell f5a85c69d2 Remove time from the name of some variables where its obvious. 2025-04-19 22:53:49 +01:00
Sadie Powell c8b3819767 Add the anope.account and anope.listAccounts RPC events. 2025-04-19 22:31:49 +01:00
Sadie Powell e6a1982922 Fix various typos in the rpc_data docs. 2025-04-19 21:49:33 +01:00
Sadie Powell 40a1dc9536 Document the rpc_data result better. 2025-04-19 17:22:06 +01:00
Sadie Powell 70bf013ef0 Allow syntax messages to take a predicate. 2025-04-19 16:54:26 +01:00
Sadie Powell 18dfa62626 Add expanded data to the rpc_data list events. 2025-04-19 15:16:07 +01:00
Sadie Powell d815906393 Get rid of the internal block wrapper.
This only existed for compatibility with old 2.0 modules and 2.1
has already broken compatibility with them.
2025-04-19 12:49:06 +01:00
Sadie Powell 452e62c050 Add support for local password comparison in sql_authentication. 2025-04-19 12:38:32 +01:00
Sadie Powell 151f9c2bcc Backport the Windows CI runner to 2.0.
[skip ubuntu ci]
2025-04-18 18:24:29 +01:00
Sadie Powell 4916e1dbfc Use windows-2025 for the Windows CI.
[skip alpine ci]
[skip ubuntu ci]
2025-04-18 12:53:47 +01:00
Sadie Powell fa7ed12aad Use a duration string when telling people to wait before emailing. 2025-04-16 03:00:52 +01:00
Sadie Powell 94c20f3084 Use duration strings when reporting the expiry period. 2025-04-16 02:52:31 +01:00
Sadie Powell 597d4a1aee Update the change logs. 2025-04-16 02:45:53 +01:00
Sadie Powell 1e95d0f536 Fix some text strings that should be marked as translatable. 2025-04-16 02:19:17 +01:00
Sadie Powell ad0b4d1aa0 Rename TextSplitter to LineWrapper. 2025-04-16 01:53:50 +01:00
Sadie Powell 74e9a9d2fe Automatically wrap the help output. 2025-04-16 01:50:59 +01:00
Sadie Powell d2aee394ea Fix a compiler warning on Clang. 2025-04-16 00:14:46 +01:00
Sadie Powell 3e696fae0f Reduce the maximum line length from 120 to 100.
This should fit on user screens a bit better.
2025-04-16 00:07:33 +01:00
Sadie Powell ce362854a3 Update as many messages as possible for automatic line wrapping. 2025-04-16 00:04:30 +01:00
Sadie Powell a883b616a1 Automatically line wrap messages sent by services. 2025-04-15 19:30:59 +01:00
Sadie Powell b421ba258e Show the protection time in the INFO output. 2025-04-15 19:26:32 +01:00
Sadie Powell 3691887297 Add / to the default vhost chars. 2025-04-15 18:18:15 +01:00
Sadie Powell 75e2501500 Allow unbanning virtual modes, add the !unmute fantasy command. 2025-04-15 15:59:51 +01:00
Sadie Powell 1c6db37681 Fix a typo in cs_unban. 2025-04-15 15:29:59 +01:00
Sadie Powell 5c2fc1cedd Allow clearing other list modes using ClearBans. 2025-04-15 15:00:25 +01:00
Sadie Powell d891f2bcbd Sync the GitHub templates with the ones InspIRCd uses. 2025-04-15 13:51:51 +01:00
Sadie Powell 5eb13f4420 Use Anope::Template in db_json. 2025-04-15 13:04:09 +01:00
Sadie Powell bd9d3b0f7d Add support for monthly backups to db_json. 2025-04-15 13:00:34 +01:00
Sadie Powell cbb41241d4 Merge branch '2.0' into 2.1. 2025-04-15 11:42:49 +01:00
Sadie Powell b9acaa6d51 Ask people to file PRs on GitHub as well as emailing team@. 2025-04-15 10:05:51 +01:00
Sadie Powell 9d18fdf0f6 Update the change logs. 2025-04-14 11:56:40 +01:00
Sadie Powell d04a312d0d Add Anope::Templace and switch all template strings to use it. 2025-04-14 11:31:19 +01:00
Sadie Powell 099f0ce43a Purge the seen database after 90 days. 2025-04-14 01:51:40 +01:00
Sadie Powell 07bd1bbec9 Switch enc_sha2 default from sha256 to sha512. 2025-04-14 01:01:24 +01:00
Sadie Powell aa0a687a58 Fix a typo in the example config. 2025-04-14 01:00:17 +01:00
Sadie Powell b89cc47642 Resort the Implementation list. 2025-04-13 16:05:06 +01:00
Sadie Powell d87fa4d781 Add a matcher for the InspIRCd oper name extban. 2025-04-13 13:15:05 +01:00
Sadie Powell 9351debd73 Expand GetQueryCommand to take a command name. 2025-04-10 13:34:25 +01:00
Sadie Powell 40d558ef21 Make the length of confirmation codes configurable. 2025-04-07 12:27:45 +01:00
Sadie Powell e1224ac486 Ignore the SLOG message on UnrealIRCd. 2025-04-05 07:13:08 +01:00
Sadie Powell ddd33e65b4 Add a log message for when we receive a weirdly targeted message. 2025-04-05 07:11:54 +01:00
Sadie Powell e4f88d44cd Deduplicate checks in ns_cert. 2025-04-05 06:53:40 +01:00
Sadie Powell 063b4a9918 Merge branch '2.0' into 2.1. 2025-04-02 23:01:04 +01:00
Sadie Powell c6065ff0f3 Update the change log. 2025-04-02 23:00:12 +01:00
Sadie Powell a5aae4f41d Fix building in a post-CMP0082 world. 2025-04-02 23:00:12 +01:00
Sadie Powell d019da673d Replace NormalizeBuffer implementation with the one from InspIRCd.
This is more robust and will handle more formatting code types.
2025-04-02 17:04:47 +01:00
Sadie Powell 4d7adbf2b7 Fix an unnecessary substr in irc2sql. 2025-04-02 16:37:49 +01:00
Sadie Powell 404bf77ef5 Add a message handler for messages that can be safely ignored. 2025-04-02 13:17:38 +01:00
Sadie Powell 69393a5f14 Fix building in a post-CMP0082 world. 2025-04-02 13:12:19 +01:00
Sadie Powell 97c63822fc Bump the minimum CMake version to 3.20.
This should hopefully prevent us from being burned by CMake
dropping old version compatibility for a long time.
2025-04-02 10:11:21 +01:00
Sadie Powell 698dd78ef8 Merge branch '2.0' into 2.1. 2025-04-02 10:09:58 +01:00
Sadie Powell 0b36ddfaf3 Fix building on old versions of RHEL. 2025-04-02 09:58:49 +01:00
Sadie Powell 947ddc9e1b Fix building on CMake 4.
This is a partial backport from 2.1.
2025-04-02 09:53:10 +01:00
Sadie Powell 59d516d5b0 Refactor and document the rest of the SASL header. 2025-04-01 16:57:28 +01:00
Sadie Powell 2ecb667d1c Bump the minimum CMake version in the docs. 2025-04-01 16:29:11 +01:00
Sadie Powell c21f6ac597 Bump for 2.1.14-git. 2025-04-01 11:06:38 +01:00
Sadie Powell 390d0482fc Release 2.1.13. 2025-04-01 11:04:29 +01:00
Sadie Powell 65bb0a374b Move SASL::IdentifyRequest to ns_sasl.
This is only useful for plain authentication and doesn't need to
be in the header.
2025-03-31 16:58:22 +01:00
Sadie Powell ea4877dc16 Update the changelogs. 2025-03-30 13:06:48 +01:00
Sadie Powell 4024598bd8 Execute SQL updates atomically.
If the Serialize call alters any tables they would have previously
been missed here.
2025-03-30 13:01:13 +01:00
Sadie Powell a154532e98 Use insert_or_assign when creating ChannelInfo instances. 2025-03-30 12:42:18 +01:00
Sadie Powell 665b0fdef8 Refuse to import data that already exists in db_atheme. 2025-03-30 12:17:23 +01:00
Sadie Powell 0802d9d3ff Reference accounts in the database by their id not their nick. 2025-03-30 11:57:47 +01:00
Sadie Powell 8d3b8c08b3 Add NickAlias::FindId. 2025-03-30 11:04:46 +01:00
Sadie Powell f3e5ccf353 Initialize ChannelInfo in the Modern C++ way. 2025-03-26 11:23:05 +00:00
Sadie Powell b5213d5a81 Initialize Channel in the Modern C++ way. 2025-03-26 11:08:02 +00:00
Sadie Powell dc09408f1a Add a typedef for the serializable id. 2025-03-26 10:22:42 +00:00
Sadie Powell 49d86527ef Initialize the db_flatfile LoadData stream reference from the ctor. 2025-03-26 09:32:29 +00:00
Sadie Powell 65183c3c49 Update the change logs. 2025-03-26 09:18:56 +00:00
Sadie Powell c60477384c Add the db_json module. 2025-03-26 09:08:55 +00:00
Sadie Powell 25c3fd51b7 Fix a missing format argument in ns_maxemail. 2025-03-22 21:45:29 +00:00
Sadie Powell a40eaeb2a3 Use a plural form translation for the ns_maxemail error. 2025-03-22 21:04:25 +00:00
Sadie Powell e14a650cb9 Read the ns_maxemail limit as unsigned instead of int. 2025-03-22 21:02:52 +00:00
Sadie Powell 6401e328bb Merge branch '2.0' into 2.1. 2025-03-22 20:52:25 +00:00
Sadie Powell 43dc6f7509 Fix ns_maxemail miscounting email addresses in some cases. 2025-03-22 20:19:50 +00:00
Sadie Powell 8f0ee6f383 Update more messages to use gettext plural forms. 2025-03-22 08:58:24 +00:00
Sadie Powell 1adbce61cb Fix a semicolon that was missing from the previous commit. 2025-03-22 08:43:38 +00:00
Sadie Powell fe60c9a085 Fix an unclear message in gl_queue. 2025-03-22 08:36:57 +00:00
Sadie Powell 39bb5825ad Deduplicate requirename code in os_shutdown. 2025-03-22 08:33:21 +00:00
Sadie Powell 602ff60e21 Document the migration path for removed config options.
Also resort the config changelog so it is listed alphabetically.
2025-03-22 08:17:28 +00:00
Sadie Powell 8d0399e356 Document the default value for new config options in the changelog. 2025-03-22 08:04:55 +00:00
Sadie Powell a4d0213bcb Update the changelogs. 2025-03-22 07:59:54 +00:00
Sadie Powell ecbf53ba6c Allow customising the length at which lines are wrapped after.
Closes #485.
2025-03-22 07:33:02 +00:00
Sadie Powell 6d72fd67d8 Improve logging about the protocol module on startup. 2025-03-19 13:37:11 +00:00
Sadie Powell 0a11bc7693 Merge branch '2.0' into 2.1. 2025-03-19 13:08:14 +00:00
Sadie Powell e86fa67e38 Use a set instead of a vector for storing memo ignores. 2025-03-19 10:12:02 +00:00
Sadie Powell 1fc2642034 Make it clear that an ignore list is for memos in ms_ignore.
Closes #484.
2025-03-19 09:55:32 +00:00
Sadie Powell 1641f6415a RPC::service is not necessary anymore. 2025-03-17 19:06:14 +00:00
Sadie Powell bb1f93f150 Switch RPC event registration to use the service system. 2025-03-17 12:58:22 +00:00
Sadie Powell 85fbc500d8 Simplify the requirename logic. 2025-03-17 11:23:19 +00:00
Sadie Powell 99bcc6d3b7 Improve the error reporting in os_shutdown. 2025-03-16 20:21:34 +00:00
Sadie Powell 5fd2145821 Update author list. 2025-03-16 12:16:02 +00:00
Sadie Powell 4700d48b35 Import a slightly modified version of mkauthors from InspIRCd. 2025-03-16 12:16:02 +00:00
Sadie Powell 019b2aafef Update the mailmap. 2025-03-16 12:16:01 +00:00
Sadie Powell 3744649320 Move the RPC service interface to the RPC header. 2025-03-15 23:49:58 +00:00
Sadie Powell 30593321f4 Fix getting the IP of a user in CommandSource. 2025-03-15 21:08:49 +00:00
Sadie Powell 3b35199a53 Add NickCore::FindId for finding an account by its id. 2025-03-15 21:08:26 +00:00
Sadie Powell 5ac5e1068e Use custom-cloak when setting the SASL hostname too. 2025-03-15 00:17:18 +00:00
Sadie Powell 0ebc43f0dc Refactor the InspIRCd METADATA handler to actually be readable. 2025-03-14 23:21:42 +00:00
Sadie Powell 5ff86ea2c5 Implement support for the new way of setting vhosts on InspIRCd. 2025-03-14 19:45:43 +00:00
Sadie Powell 1bdc9c0a64 Fix {nickserv}:defaults still documenting the old nick protection. 2025-03-14 12:13:13 +00:00
Sadie Powell d0d46408bc Improve JSON-RPC error messages. 2025-03-14 11:49:01 +00:00
Sadie Powell fdc33b0f6d Warn if enc_bcrypt is the first module and maxpasslen is >72. 2025-03-14 11:09:35 +00:00
Sadie Powell 6a43370e13 Deduplicate response building code in the jsonrpc module. 2025-03-13 16:01:16 +00:00
Sadie Powell 1fcd045aff Fix the jsonrpc not having a root element one is not specified. 2025-03-13 15:49:33 +00:00
Sadie Powell b4d068b01a Fix the messageUser function in the JavaScript library. 2025-03-13 15:27:07 +00:00
Sadie Powell 23d548336a Document the required RPC modules in the JavaScript library. 2025-03-13 15:24:48 +00:00
Sadie Powell 82371dc279 Update the changelogs. 2025-03-13 15:17:08 +00:00
Sadie Powell fd6770373f Add the rpc_message module, remove the notice RPC event. 2025-03-13 15:12:47 +00:00
Sadie Powell 645f969d70 Fix sending global messages with the default sender. 2025-03-13 15:12:47 +00:00
Sadie Powell 3187233783 Fix setting keepbackups to 0 in db_flatfile. 2025-03-13 13:37:54 +00:00
Sadie Powell 8b932dc459 Fix a crash in the ns_sasl module.
Closes #481.
2025-03-13 12:52:50 +00:00
Sadie Powell a357ba38fb Fix deleting old db_flatfile database backups. 2025-03-13 12:14:17 +00:00
Sadie Powell 9f8525e3b2 Refactor the TIME handler. 2025-03-13 10:47:18 +00:00
Sadie Powell ace82596d8 Fix a warning on Clang. 2025-03-13 10:43:37 +00:00
Sadie Powell 09e10d2a02 Add an ALLTIME handler on InspIRCd. 2025-03-13 10:39:14 +00:00
Sadie Powell 9ec3f6abd6 Refactor and redocument Serialize::Type. 2025-03-12 16:52:46 +00:00
Sadie Powell e7b18609f6 Add defines for the core serialisation type names. 2025-03-12 15:53:52 +00:00
Sadie Powell cdcf0e2f9a Move serialization from Serializable to a Serialize::Type child. 2025-03-12 15:53:52 +00:00
Sadie Powell 718f2e922a Const correct Serialize::Type::GetName(). 2025-03-12 01:00:02 +00:00
Sadie Powell 2b2b6f75a1 Fix the id data type in db_flatfile. 2025-03-12 00:55:21 +00:00
Sadie Powell 883367c1d2 Fix importing some data from 1.8. 2025-03-12 00:33:41 +00:00
Sadie Powell 2276c62ff0 Move serialization data type logic from sql.h to the core. 2025-03-12 00:16:15 +00:00
Sadie Powell fb0ee27df0 Save the databases on SIGUSR1. 2025-03-12 00:16:15 +00:00
Sadie Powell b14befc77c Fix an outdated comment. 2025-03-10 13:10:13 +00:00
Sadie Powell 64fd5a862a Add an XML-RPC method to rpc_system for debugging RPC responses. 2025-03-10 13:03:29 +00:00
Sadie Powell 0ff170c671 Add a config option for disabling the i8 XML-RPC extension. 2025-03-10 12:48:13 +00:00
Sadie Powell ea0d5c4d70 Add a config option for disabling the nil XML-RPC extension. 2025-03-10 12:48:13 +00:00
Sadie Powell b96dbfc9ba Fix a memory leak in the xmlrpc module. 2025-03-10 11:07:29 +00:00
Sadie Powell e221c7642a Update the changelogs. 2025-03-09 20:14:03 +00:00
Sadie Powell b8c28419da Add a missing override keyword. 2025-03-09 19:49:28 +00:00
Sadie Powell 1c4f9042e7 Simplify some weird logic in bs_bot. 2025-03-09 19:31:58 +00:00
Sadie Powell a3f483ad87 Fix a forward declaration on Clang. 2025-03-09 18:58:49 +00:00
Sadie Powell 6e90a8ea55 Don't tell users that services is shutting down when its restarting. 2025-03-09 18:56:27 +00:00
Sadie Powell 6d7fe69cdf Add support for oper-only quit messages.
This currently only works on InspIRCd but I believe that other
servers also support this.
2025-03-09 18:51:03 +00:00
Sadie Powell 314ef60900 Fix a compiler warning on Clang. 2025-03-09 14:36:57 +00:00
Sadie Powell 1e8ac58bb4 Sync the chanserv defaults between the code and config. 2025-03-09 14:33:29 +00:00
Sadie Powell badcf31499 Make config variables a lot more useful.
- Config variables now no longer conflict with regular values.

- Config variables can now be read from the environment.
  (e.g. ${env.USER}).

- Config variables can now be used as partial values
  (e.g. support@${network.domain})
2025-03-09 14:20:34 +00:00
Sadie Powell c98602bf19 Fix various webcpanel bugs relating to nickname protection. 2025-03-08 14:45:26 +00:00
Sadie Powell 50bec959e5 Turn on channel persistence by default. 2025-03-08 14:25:08 +00:00
Sadie Powell 62bfa33464 Rework how nickname protection works.
- Rename the command and module from kill to protect (this command
  hasn't actually killed users in a long time).
- Replace QUICK/IMMED with a duration option.
2025-03-08 14:07:15 +00:00
Sadie Powell b4ab7dadb9 Use a C++11 lambda instead of a channel sorting method. 2025-03-08 12:41:22 +00:00
Sadie Powell df0cd3ef3e Move some headers around. 2025-03-08 12:22:07 +00:00
Sadie Powell 9e37a643f1 Fix some minor issues with db_atheme error messages. 2025-03-07 12:34:19 +00:00
Sadie Powell b30bfb5d2b Import misc channel and user metadata in db_atheme. 2025-03-07 12:31:42 +00:00
Sadie Powell cccdf0431b Don't warn when importing an external auth account from Atheme.
This happens when Atheme was using LDAP to authenticate users. We
will replace the temporary password at a later date if Anope is set
up to use LDAP too.
2025-03-06 23:31:56 +00:00
Sadie Powell 0005ebbbc3 Import logon and oper news from Atheme. 2025-03-06 23:05:38 +00:00
Sadie Powell 161841925d Force the MySQL module to use UTC for connections.
This prevents conversion issues when the MySQL server is in a
different timezone to the services server.
2025-03-06 20:51:13 +00:00
Sadie Powell e099180d8f Fix a REPRODUCIBLE_BUILD check after the previous commit. 2025-03-06 11:29:47 +00:00
Sadie Powell 2091dc68bc Move REPRODUCIBLE_BUILD to sysconf. 2025-03-06 01:24:39 +00:00
Sadie Powell 9926ac5a05 Fix reading the config of some modules. 2025-03-05 16:25:17 +00:00
Sadie Powell 14342f6375 Fix the on start library version logging to include the module. 2025-03-05 16:03:23 +00:00
Sadie Powell a0a9d433dc Blacklist an old UnrealIRCd contrib module that breaks Anope. 2025-03-04 17:15:07 +00:00
Sadie Powell c88fac1a20 Document {ns_sasl}:agent. 2025-03-04 00:50:20 +00:00
Sadie Powell 64d26f7c61 Remove GetAgent and SendMechs from the SASL interface.
These are only used by ns_sasl.
2025-03-04 00:43:06 +00:00
Sadie Powell 34896cefe9 Misc cleanup of ns_sasl and sasl.h. 2025-03-03 23:57:12 +00:00
Sadie Powell c0c7046a6d Check if users really want to use 2.1 in Config. 2025-03-03 23:29:53 +00:00
Sadie Powell 937ea7dab4 SASL::ProtocolInterface should not be exported. 2025-03-03 22:53:16 +00:00
Sadie Powell bfd2b0fa8e Merge branch '2.0' into 2.1. 2025-03-03 22:48:23 +00:00
Sadie Powell 7f2c281121 Fix a compiler warning on newer versions of MSVC. 2025-03-03 22:46:12 +00:00
Sadie Powell 224caf32c7 Rename sasl to ns_sasl, move to nickserv.example.conf. 2025-03-03 22:02:48 +00:00
Sadie Powell 5828cdba45 Move SASL protocol messages to the SASL header. 2025-03-03 21:45:59 +00:00
Sadie Powell 4526fbed96 Add a helper method for getting a description of an uplink. 2025-03-02 15:42:25 +00:00
Sadie Powell f9911dde52 Return references instead of pointers from the config system.
We used to return NULL from these methods but now we return an empty
block so this can never actually be null now.
2025-03-02 15:27:47 +00:00
Sadie Powell a5e5eb5eb0 Return EmptyBlock instead of NULL from GetModule. 2025-03-02 14:43:57 +00:00
Sadie Powell 82aecd6c7e Bump for 2.1.13-git. 2025-02-28 16:11:40 +00:00
Sadie Powell 3cef83c8c5 Release 2.1.12. 2025-02-28 16:10:09 +00:00
Sadie Powell 0781f8a82a Update the changelogs. 2025-02-28 09:58:23 +00:00
Sadie Powell fb03d745c5 Add a JavaScript library for accessing the JSON-RPC API. 2025-02-26 17:18:03 +00:00
Sadie Powell 752f5e269e Deduplicate RPC parameter count checks. 2025-02-25 23:13:54 +00:00
Sadie Powell bb3e124bdb Deduplicate some SASL logic. 2025-02-25 20:45:34 +00:00
Sadie Powell 07610ad2d9 Improve the rpc_system module config. 2025-02-25 20:06:44 +00:00
Sadie Powell e500258ce4 Add the rpc_data module.
- Add rewritten and namespaced versions of the channel, oper, user
  events.

- Add the following new events:
  * anope.listChannels
  * anope.listOpers
  * anope.listServers
  * anope.listUsers
  * anope.server
2025-02-25 19:59:23 +00:00
Sadie Powell 801a748e25 Add the system.listMethods RPC method.
Still to implement:

- system.getCapabilities
- system.methodHelp
- system.methodSignature
2025-02-24 03:59:52 +00:00
Sadie Powell a111b40560 Allow use of a non-map type as the root RPC element. 2025-02-24 03:41:06 +00:00
Sadie Powell 2ccd182d2e Add support for RPC arrays, simplify the RPC objects. 2025-02-24 03:07:22 +00:00
Sadie Powell ee08b3e880 Rename RPC::Block to RPC::Map. 2025-02-23 17:50:05 +00:00
Sadie Powell a4bfd52b7e If a user is already connected on SASL fail just call BadPassword. 2025-02-23 17:50:05 +00:00
Sadie Powell 34a539ba78 Fix detecting whether translations are disabled in ns_set_language. 2025-02-23 11:44:52 +00:00
Sadie Powell 096c996900 Fix resetting the SASL password limit. 2025-02-23 11:44:52 +00:00
Robby ab0a67c35c Update the dutch language file. 2025-02-23 04:22:45 +01:00
Robby b448a20f40 Update the dutch language file. 2025-02-23 04:22:33 +01:00
Sadie Powell d5f4b06972 Improve SASL log messages for post-connection authentication. 2025-02-20 21:35:17 +00:00
Sadie Powell ff8aca1db4 Apply bad password logic to SASL too. 2025-02-20 21:20:00 +00:00
Sadie Powell 8da52bf121 Clean up some session code in the SASL module. 2025-02-20 21:19:31 +00:00
Sadie Powell 0c193f8149 Store the source address in the identify request. 2025-02-20 19:49:01 +00:00
Sadie Powell fa0f78b937 Add error constants for the custom error range. 2025-02-20 15:08:37 +00:00
Sadie Powell 96839ae1b8 Move RPC types to the RPC namespace. 2025-02-20 14:57:55 +00:00
Sadie Powell 5420f48580 Use an enum for standard RPC error codes. 2025-02-20 14:57:22 +00:00
Sadie Powell 5967bf4176 Log the version of xmlrpc-c on module load. 2025-02-20 13:31:51 +00:00
Sadie Powell bf68d1c0e0 Merge branch '2.0' into 2.1. 2025-02-20 13:07:14 +00:00
Sadie Powell 227caba783 Fix sql_live on recent MariaDB. 2025-02-20 13:05:22 +00:00
Sadie Powell b498f4f4d9 Add support for more RPC data types. 2025-02-20 12:53:15 +00:00
Sadie Powell 8330cd119a Fix sending RPC responses after the previous commit. 2025-02-18 21:27:46 +00:00
Sadie Powell 3c55fbe650 Rework how the RPC interface stores its events. 2025-02-18 17:01:33 +00:00
Sadie Powell 98320d130f Rewrite the xmlrpc module using libxmlrpc-c. 2025-02-18 16:15:58 +00:00
Sadie Powell 37f21a2e1e Fix building the LDAP module on Windows. 2025-02-18 12:00:22 +00:00
Sadie Powell 9f82a960e4 Log the version of third-party libraries on load. 2025-02-18 11:48:43 +00:00
Sadie Powell 3bba87b655 Make the password optional in operserv/login. 2025-02-16 12:12:38 +00:00
Sadie Powell 515dc96d6c Merge branch '2.0' into 2.1. 2025-02-14 21:55:06 +00:00
Sadie Powell b51dff0b1a Update the CI for the upcoming Ubuntu 20.04 removal. 2025-02-14 21:51:47 +00:00
Sadie Powell 69bc149f7f Reduce indentation in rpc_main. 2025-02-14 21:47:33 +00:00
Sadie Powell 3c340f550a Update the XMLRPC example to use JSON-RPC instead. 2025-02-14 21:13:10 +00:00
Sadie Powell 420f83bbbf Use RPC error responses correctly. 2025-02-14 20:54:06 +00:00
Sadie Powell 84b0859e8d Fix the naming convention of the RPC methods. 2025-02-14 19:47:33 +00:00
Sadie Powell ddce28c055 Merge branch '2.0' into 2.1. 2025-02-14 18:15:56 +00:00
Sadie Powell fbb8442252 Reset the stats properly.
Closes #465.
2025-02-14 18:15:51 +00:00
Sadie Powell 8110fddfe5 Document the sql_live performance limitations. 2025-02-14 18:09:34 +00:00
Sadie Powell 947eabed6c Keep going in cs_mode if a target doesn't exist. 2025-02-14 15:06:04 +00:00
Sadie Powell 94ccd03790 Allow changing the status modes of multiple people at once.
Closes #473.
2025-02-14 15:00:12 +00:00
Sadie Powell 84dbb5c9a3 Tidy up the change logs. 2025-02-13 04:55:15 +00:00
Sadie Powell 4b2b47fc95 Remove some debugging code from the JSON-RPC module. 2025-02-13 04:26:42 +00:00
Sadie Powell 9e621cca11 Add the new JSON-RPC module to compliment the XMLRPC one. 2025-02-13 04:19:39 +00:00
Sadie Powell 1e82b4075e Make the RPC API sanitize automatically. 2025-02-13 01:54:57 +00:00
Sadie Powell f8c1b8f4f9 Rework the RPC modules in preparation for the new JSON-RPC module. 2025-02-13 01:45:20 +00:00
Sadie Powell eaa00c7c9e Vendor yyjson. 2025-02-13 01:45:13 +00:00
Sadie Powell 2d48d9ef0d Disable operserv/quit by default.
This is dangerous and almost never what is actually wanted.
2025-02-12 15:40:13 +00:00
Sadie Powell 3e986b215e Add extra protections to avoid rebooting the wrong network. 2025-02-12 15:39:41 +00:00
Sadie Powell 8486962fef Merge branch '2.0' into 2.1. 2025-02-11 13:52:53 +00:00
Sadie Powell 1f7aa241bb Prioritise operserv/ignore above other modules.
Closes #471.
2025-02-11 13:48:11 +00:00
Sadie Powell e3abae44a7 Make email confirmation a bit smarter. 2025-02-11 11:57:34 +00:00
Sadie Powell a8be208da1 Add some options to botserv/botlist to make admining easier. 2025-02-07 01:14:12 +00:00
Sadie Powell abbb602463 Fix SASL on UnrealIRCd. 2025-02-06 19:01:10 +00:00
Sadie Powell 86805a6b3b Add the bot real name to the botlist info.
This is actually shown by modern clients so its useful info.
2025-02-05 19:56:55 +00:00
Sadie Powell 5d9344b677 Fix the pluralisation of a message in bs_info. 2025-02-05 19:38:36 +00:00
Sadie Powell 8d3755af5b Use fallback certs when doing SASL authentication. 2025-02-05 13:45:15 +00:00
Sadie Powell 115c9eb5a0 Merge the SASL data and ext parameters.
There might be more than this so its better to just store it in a
1+ parameter vector.
2025-02-05 13:45:15 +00:00
Sadie Powell ee18083bb7 Make it easier to fail and delete SASL sessions. 2025-02-05 12:49:29 +00:00
Sadie Powell 3af8f35d3a Import more data from Atheme. 2025-02-05 00:46:52 +00:00
Sadie Powell da2f2fd852 Fix a typo in the enc_sha2 docs. 2025-01-30 13:38:49 +00:00
Sadie Powell d460b267e3 Reject passwords bigger than Bcrypt can handle. 2025-01-25 17:54:49 +00:00
Sadie Powell a8eda0676d Backport logging the reason sending email failed to the 2.0 branch.
Closes #463.
2025-01-23 19:23:32 +00:00
Sadie Powell 9bab54af79 Qualify a use of auto. 2025-01-17 23:54:53 +00:00
Sadie Powell 0a82366a6b Merge branch '2.0' into 2.1. 2025-01-14 13:41:19 +00:00
Sadie Powell f0bc9536e6 Merge branch '2.0' into 2.1. 2025-01-14 13:35:55 +00:00
Sadie Powell da7f47c1c7 Update the copyright headers for 2025. 2025-01-14 13:30:07 +00:00
Sadie Powell 9d165f13e7 Allow skipping user modes in keepmodes. 2025-01-13 15:35:13 +00:00
Sadie Powell 3582bc0f58 Move keepmodes to its own module. 2025-01-13 15:10:31 +00:00
Sadie Powell 97589e5c62 Enable activate_on_set by default. 2025-01-13 14:38:15 +00:00
Sadie Powell 098074ba8b Add an option to re-cloak opers on logout.
Closes: #421
2025-01-13 14:36:55 +00:00
Sadie Powell c680cb6c58 Fix the build error introduced in the previous commit.
TODO: learn to spell `git add` correctly.
2025-01-10 14:42:16 +00:00
Sadie Powell a603f39b4b Warn users of the old InspIRCd protocol that support is deprecated.
We will drop this later in the year when that branch goes EOL.
2025-01-10 13:59:49 +00:00
Sadie Powell 78b548628c Add example code for how to validate SHA2 passwords in PHP. 2024-12-15 13:23:31 +00:00
Sadie Powell d0e24a50b8 Add Service::GetServices. 2024-12-13 10:57:19 +00:00
Sadie Powell 69b94fe041 Switch Service::GetServiceKeys to use a range-for loop. 2024-12-13 10:57:03 +00:00
Sadie Powell 6ba0224f7b Use a more useful setting example in os_config. 2024-12-12 17:11:41 +00:00
Sadie Powell a92f09153a Bump for 2.0.18-git. 2024-12-08 12:18:55 +00:00
Sadie Powell 73714420d1 Release 2.0.17. 2024-12-08 12:15:26 +00:00
Sadie Powell ea96f2ad40 Update the change log. 2024-12-08 12:13:28 +00:00
Sadie Powell b6f5b50086 Bump for 2.1.12-git. 2024-12-01 10:06:34 +00:00
Sadie Powell 3ae4a022eb Release 2.1.11. 2024-12-01 10:04:21 +00:00
Sadie Powell ea8a692191 Add support for numerics associated with cs_set_misc entries.
This is mainly to allow the URL entry to use RPL_CHANNELURL.
2024-11-29 20:39:22 +00:00
Sadie Powell 026d6c461d Update the change logs. 2024-11-29 17:24:13 +00:00
Sadie Powell 3cbac4bcea Update Send and Recv to use ssize_t instead of int. 2024-11-25 16:14:17 +00:00
Sadie Powell e42b4c21b7 Use the Module * overload of GetModule() in the nickserv module. 2024-11-25 14:43:23 +00:00
Sadie Powell 2464913200 Simplify the duration string logic in Anope::Expires.
This is just duplicating Anope::Duration there's no need to reimplement
a worse version of that here.
2024-11-25 03:02:24 +00:00
Sadie Powell ebea728957 Fix pluralising languages which use the same plural for 0 as 1. 2024-11-25 01:20:03 +00:00
Sadie Powell 233a5bf4cd Add a missing override keyword. 2024-11-25 00:20:25 +00:00
Sadie Powell 7019b27e59 Rework how guest nicks work.
- Use the config setting as a string template instead of as a prefix.
- Allow users of IRCds that have UIDs to use that as the guest nick.
- Fall back to a UID before killing if a guest nick can not be found.
2024-11-25 00:08:30 +00:00
Sadie Powell 70227dc882 Take a constant pointer in GetModule. 2024-11-24 22:36:53 +00:00
Sadie Powell 6178ea644a Fix some minor issues with the Turkish translation. 2024-11-24 01:30:57 +00:00
Sadie Powell df7f0730dd Fix the signon time of services pseudoclients on InspIRCd. 2024-11-23 20:24:08 +00:00
Sadie Powell 331168379f Don't escape messages in the pot file.
This can't be applied to the po files so there's no point doing it.
2024-11-23 15:46:39 +00:00
Val Lorentz 5220963be1 Update the French translation. 2024-11-23 10:59:55 +00:00
Sadie Powell 436dab3eb8 Convert some more strings to plural forms. 2024-11-22 15:32:39 +00:00
Sadie Powell c3055e1cfa Add a plural form overload of SendMessage. 2024-11-22 15:22:23 +00:00
Sadie Powell a27be92e4b Skip removed columns when migrating the database schema. 2024-11-22 14:09:26 +00:00
Sadie Powell faf0ad5f35 Improve language selection.
- Allow selecting languages using an abbreviated language code
  (e.g. en for en_US.UTF-8).
- Preprocess the language list on load as it never changes. This
  allows us to stop special casing the English language.
2024-11-22 13:06:58 +00:00
Sadie Powell e9202916b2 Emplace services when registering them with the core. 2024-11-19 19:55:34 +00:00
Sadie Powell 2cb20ded78 Remove some code that should have been removed in the merge. 2024-11-19 19:55:34 +00:00
Sadie Powell 687bcaa83f Add a plural form overload of CommandSource::Reply. 2024-11-19 17:10:29 +00:00
Sadie Powell 1fb8a624f9 Make an untranslated string translatable. 2024-11-19 17:00:19 +00:00
Sadie Powell b4b51d4828 Merge branch '2.0' into 2.1. 2024-11-19 00:40:24 +00:00
Sadie Powell 7083c424c2 Only process sockets after loading the db when using db_sql{_live}.
This avoids slow startups for the 95% of users who are using the
db_flatfile database backend.
2024-11-19 00:39:00 +00:00
Sadie Powell c55d8450a4 Move the set option to its own module.
This is the first step of rewriting nickname protection.
2024-11-18 12:40:24 +00:00
Sadie Powell 7a20f26b84 Only auto-add timers if they actually have a tick time. 2024-11-18 00:48:50 +00:00
Sadie Powell de16238e01 Process all socket events before connecting to the uplink.
This ensures that the SQL import actually succeeds before we do
something that might terminate the process.
2024-11-16 12:49:45 +00:00
Sadie Powell 240f8b9e50 Halt the column migration if any of the queries fail. 2024-11-16 12:13:17 +00:00
Sadie Powell 656ca80dd0 Migrate old SQL schemas to the current layout. 2024-11-16 03:45:03 +00:00
Sadie Powell d40cbdb8cf Merge branch '2.0' into 2.1. 2024-11-15 15:57:57 +00:00
Sadie Powell a668c8b520 Clarify how to import databases from flatfile to SQL.
Closes #456.
2024-11-15 15:57:41 +00:00
Sadie Powell bc44195a3d Make the account id map also use a checker. 2024-11-15 15:12:50 +00:00
Sadie Powell a7cbe2a139 Add default values to the MySQL tables and use when a column is null. 2024-11-14 13:00:03 +00:00
Sadie Powell 8408bf95c7 Fix an inverted condition. 2024-11-13 12:10:38 +00:00
Sadie Powell 309c342b86 Use the remaining wait time in the registration delay message.
Closes #452.
2024-11-13 11:56:50 +00:00
Sadie Powell 4de59d61d8 Use durations instead of seconds in waiting messages. 2024-11-13 11:56:11 +00:00
Sadie Powell 0dc65cc162 Clean up Anope::Duration and switch to use plural form translation. 2024-11-13 02:57:15 +00:00
Sadie Powell 2e6c90d502 Add support for plural form translation.
Closes #340.
2024-11-13 02:48:13 +00:00
Sadie Powell 127ea3e68a Process all socket events before connecting to the uplink.
This ensures that the SQL import actually succeeds before we do
something that might terminate the process.
2024-11-12 17:24:14 +00:00
Sadie Powell ba11b5eab0 Update the Turkish translation.
Co-authored-by: CaPa CuL <capacul@gmail.com>
2024-11-11 21:59:57 +00:00
Sadie Powell df1c6176b3 Merge branch '2.0' into 2.1. 2024-11-11 17:13:01 +00:00
Sadie Powell 96ccfe4cbe Fix using User::Account where User::IsIdentified should be used.
The former causes a dereference which cause a database update. This
is not good for performance with db_sql_live on bigger networks.
2024-11-11 16:46:56 +00:00
Sadie Powell 8634594cd1 Merge branch '2.0' into 2.1. 2024-11-11 15:45:05 +00:00
Sadie Powell ee160842b3 Fix serialising boolean extension items. 2024-11-11 15:24:40 +00:00
Sadie Powell 613452acba Remove an unnecessary function from db_sql_live. 2024-11-11 10:56:53 +00:00
Sadie Powell 9411dac991 Add a helper function to db_sql(_live) for getting a table name. 2024-11-11 10:44:20 +00:00
TehPeGaSuS aa32f7c926 More updates to the pt_PT translation. 2024-11-08 23:08:41 +00:00
Sadie Powell 517810b208 Make the grammar of the SET privilege description less weird. 2024-11-08 14:25:05 +00:00
Sadie Powell b7f7a91dfb Make the en_US translation file more suitable as a template. 2024-11-08 14:00:15 +00:00
Sadie Powell b6e4c7302e Remove the integer width from chanstats and irc2sql columns.
These are ignored by MySQL so specifying them is meaningless.
2024-11-08 13:21:06 +00:00
Sadie Powell b7590e20c1 Merge branch '2.0' into 2.1. 2024-11-08 13:10:16 +00:00
Sadie Powell 4952a9c852 Migrate from Markdown to YAML issue templates. 2024-11-08 12:07:19 +00:00
Sadie Powell 59647baff9 Avoid unnecessary string copies when calling IsFile. 2024-11-08 00:26:51 +00:00
Sadie Powell 1393518555 Fix some compiler warnings from not checking chdir. 2024-11-07 19:34:46 +00:00
Sadie Powell 51827b94ad Simplify account identifier generation. 2024-11-07 19:33:01 +00:00
Sadie Powell 98c840eb02 Expand the size of some chanstats columns.
Closes #444.
2024-11-07 12:31:47 +00:00
Sadie Powell 24cbb84009 Bump for 2.1.11-git. 2024-11-01 10:00:11 +00:00
Sadie Powell f3c94e5d23 Release 2.1.10. 2024-11-01 09:48:52 +00:00
Sadie Powell f2ab092742 Merge branch '2.0' into 2.1. 2024-10-27 16:14:09 +00:00
Sadie Powell 7d5ca5c90b Switch the city version of geoipupdate to a non-corrupt database.
Closes #439.
2024-10-27 16:13:51 +00:00
Sadie Powell 8ee85efd70 Fix parsing mode changes from users on UnrealIRCd. 2024-10-25 14:50:04 +01:00
Sadie Powell 0cab675825 Fix a typo in the change log. 2024-10-22 16:53:21 +01:00
Sadie Powell f1751dcb21 Replace usestrictprivmsg with something actually useful.
Every IRC server we support (other than Bahamut which is probably
on the chopping bock) uses UIDs so this setting does nothing.

Instead, allow configuring a server-side alias for each service
and use that when servicealias is enabled.
2024-10-22 16:29:22 +01:00
Sadie Powell 8b02613549 Fix some stuff that was missed in commit b94c3740b9. 2024-10-22 14:59:18 +01:00
Sadie Powell c9625ccf3f Update the change logs. 2024-10-22 14:41:52 +01:00
Sadie Powell 435ce51196 Move nickserv/set/message to a new module, kill options:useprivmsg. 2024-10-22 14:27:30 +01:00
TehPeGaSuS 57ac7cb4db Update the cron file name.
name
2024-10-20 23:53:23 +01:00
Sadie Powell 8cb2b801e9 Use the target nick as the default desc for mask access entries. 2024-10-19 17:40:24 +01:00
Sadie Powell 66b45534a8 Deduplicate the access code in cs_statusupdate. 2024-10-19 12:17:33 +01:00
Sadie Powell 499077826c Replace the Facebook ns_set_misc example with a non-URL alternative.
This makes it more clear you can use this for more than just an
URL to an external service.
2024-10-18 18:54:22 +01:00
Sadie Powell bc4d34ebd8 Merge branch '2.0' into 2.1 2024-10-18 11:50:54 +01:00
Sadie Powell f40719787f Fix a change that was missing from the previous commit. 2024-10-18 11:45:19 +01:00
Sadie Powell 934a13c21f Merge branch '2.0' into 2.1. 2024-10-18 11:41:53 +01:00
Sadie Powell e5602f956d Fix marking channels as persistent on InspIRCd and UnrealIRCd. 2024-10-18 11:26:03 +01:00
Sadie Powell de11a19e03 Updated the supported versions in the README. 2024-10-17 16:00:43 +01:00
Sadie Powell b437468b84 Add support for name-only extbans on InspIRCd. 2024-10-16 13:06:47 +01:00
Sadie Powell 0a99571c0f Merge branch '2.0' into 2.1. 2024-10-13 17:17:34 +01:00
Sadie Powell e704fa6266 Update the IRC server to point to Teranova. 2024-10-13 17:15:26 +01:00
Sadie Powell f908514095 Zero errno before calling popen. 2024-10-12 17:54:36 +01:00
Sadie Powell bafcba023c Switch geoipupdate.sh to use a mirror as the original data is gone. 2024-10-12 12:01:00 +01:00
Sadie Powell 9a44b74186 Let the user know about their cert being auto-added to their account. 2024-10-11 18:55:22 +01:00
Sadie Powell 883935c3e0 Merge branch '2.0' into 2.1. 2024-10-11 16:55:36 +01:00
Sadie Powell 6d34054b78 Change the mode lock before removing/adding the PERM mode.
This fixes being unable to unset mlock on the first attempt.
2024-10-11 15:45:02 +01:00
Sadie Powell 3da9b6df0d Fix matching stacked extbans. 2024-10-04 19:04:31 +01:00
Sadie Powell 0ab0e4737c Remove some unnecessary debug logging. 2024-10-04 15:08:44 +01:00
Sadie Powell cdf356ed33 Fix validating named extbans on UnrealIRCd. 2024-10-04 14:57:09 +01:00
Sadie Powell 7d268bb4ca Implement NEXTBANS support on UnrealIRCd.
Closes #431.
2024-10-04 13:25:44 +01:00
Sadie Powell 184350ff4a Fix extracting the mode parameters from MODE on UnrealIRCd. 2024-10-04 13:25:10 +01:00
Sadie Powell 4cdbf560e1 Fix matching extended bans in services.
Extended bans are stored without their prefix. Therefore, we should
not try to strip their prefix before matching.

Closes #288.

Co-authored-by: k4be <k4be@pirc.pl>
2024-10-04 13:01:29 +01:00
Sadie Powell cbccc79d37 Fix parsing extbans on InspIRCd v4. 2024-10-04 11:40:40 +01:00
Sadie Powell 9b188a6c04 Respect EXTBANFORMAT on InspIRCd v4. 2024-10-04 11:20:19 +01:00
Sadie Powell 2f74513246 Change User::SetModesInternal to take a split mode change. 2024-10-02 23:54:36 +01:00
Sadie Powell 94dbb19593 Remove the formatting overload of User::SetModesInternal. 2024-10-02 11:15:42 +01:00
Sadie Powell 8232759a92 Change Channel::SetModesInternal to take a split mode change. 2024-10-02 11:12:24 +01:00
Sadie Powell b006966d25 Bump for 2.1.10-git. 2024-10-01 11:47:23 +01:00
Sadie Powell 6037f63ae5 Release 2.1.9. 2024-10-01 11:46:13 +01:00
Sadie Powell 5cdb65ca52 Update the change log. 2024-10-01 11:42:25 +01:00
Sadie Powell f9e4ca4d06 Raise the default nickname expiry time to one year. 2024-10-01 11:31:50 +01:00
Sadie Powell 66c9be8627 Respect nonicknameownership on InspIRCd v4. 2024-09-26 19:38:44 +01:00
Sadie Powell 546f65c38e Fix some messages not being marked as translatable. 2024-09-26 13:26:02 +01:00
Sadie Powell 9fcb022d5e Allow sending an oper account on InspIRCd. 2024-09-26 12:51:54 +01:00
Sadie Powell 5a0c6b1f18 Fix setting +o on opers on login. 2024-09-26 12:51:54 +01:00
Sadie Powell ade8db023e Bump minimum UnrealIRCd version to 6.0. 2024-09-24 19:56:13 +01:00
Sadie Powell 2ae733bcd1 Merge branch '2.0' into 2.1. 2024-09-17 12:32:33 +01:00
Sadie Powell cc37e6d69a Remove config option for options:warningtimeout.
This hasn't done anything since the early 1.9 releases I'm not sure
why it hasn't been removed already.
2024-09-17 12:27:13 +01:00
Sadie Powell 101c68f786 Fix the Argon2 module not having test vectors. 2024-09-04 23:50:01 +01:00
Sadie Powell ec0cd9e7f9 Bump for 2.1.9-git. 2024-09-01 09:50:24 +01:00
Sadie Powell ab0b851d28 Release 2.1.8. 2024-09-01 09:46:17 +01:00
Sadie Powell 4e3720b810 Merge branch '2.0' into 2.1. 2024-09-01 09:43:38 +01:00
TehPeGaSuS 4b48fc98d3 Fix the documentation of mail:usemail.
`nickserv:registration` only has as options: none, admin, mail.

I assume that `mail` is the word that should replace `yes`
2024-09-01 09:41:32 +01:00
Sadie Powell 82993c8d1e Update the changelogs. 2024-08-30 14:49:43 +01:00
Sadie Powell d352718a39 Fix parsing named extbans on InspIRCd. 2024-08-30 14:49:39 +01:00
Sadie Powell d44632e57d Use CMake's -B option instead of cding to the build directory. 2024-08-30 14:48:31 +01:00
Sadie Powell 80451011dd Remove pointless semicolons in the config for the webcpanel module. 2024-08-29 13:40:39 +01:00
Sadie Powell b4e673b2f4 Refactor ns_getemail slightly. 2024-08-29 13:21:18 +01:00
Sadie Powell 58a78e9aa5 Allow server admins to require that a display nick drops last.
Closes #348.
2024-08-29 13:14:39 +01:00
Sadie Powell 6da4a148fa Fix translating mail:memo_message. 2024-08-24 12:27:05 +01:00
Sadie Powell a3edb09eda Use CanClearBans/SendClearBans when enforcing smartjoin. 2024-08-22 00:29:30 +01:00
Sadie Powell 27beb8f877 Improve the CTCP version output. 2024-08-21 15:38:35 +01:00
Sadie Powell 136680f917 Fix the grammar of some info messages. 2024-08-18 03:17:33 +01:00
Sadie Powell 378ae21ac7 Add account identifier to nickserv/info output. 2024-08-18 01:19:39 +01:00
Sadie Powell e35a86661d Remove support for MinGW.
All of our builds are fully native on Windows so there's no need
for this anymore.
2024-08-15 12:14:06 +01:00
Sadie Powell 528b5938ec Automatically determine SQL column type from the field.
Also add more column types to ensure we are storing data in the
best format in the database.
2024-08-14 05:47:55 +01:00
Sadie Powell 03bee17063 Remove the unused KeySet method in Serialize::Data. 2024-08-14 00:10:12 +01:00
Sadie Powell fe18050c49 Fix parsing SVSMODE and SVS2MODE messages on UnrealIRCd.
At some point UnrealIRCd made an undocumented change to the protocol
where the last parameter on a server-source message would not be a
timestamp. This behaviour is preserved for MODE.
2024-08-09 20:39:46 +01:00
Wilson Birney aa0496f69b Add <cstring> include to services.h to fix build on some musl systems.
Co-authored-by: blackbeard420 <blackbeard@blackbeard420.me>
2024-08-06 11:00:47 +01:00
Sadie Powell 4ee22ab05e Merge branch '2.0' into 2.1. 2024-07-28 22:50:30 +01:00
Sadie Powell 63ad540e55 Add a note to LANGUAGE about rebuilding from scratch. 2024-07-20 19:25:58 +01:00
Sadie Powell a1165eea94 Fix the type of the InspIRCd IJOIN chants when converting. 2024-07-20 19:25:58 +01:00
Sadie Powell bfca74f6b3 Bump for 2.0.17-git. 2024-07-19 13:24:41 +01:00
Sadie Powell 3acf74483c Release 2.0.16. 2024-07-19 12:49:56 +01:00
Sadie Powell a3ec8329f4 Document the previous commit. 2024-07-19 12:48:44 +01:00
Sadie Powell 7d0184ca34 Merge branch '2.0' into 2.1. 2024-07-19 01:43:41 +01:00
Sadie Powell 31bc597c81 Send the vhost/vident before the account name on InspIRCd.
This fixes IRCd-side account cloaks causing CHGHOST spam.
2024-07-19 01:11:32 +01:00
Sadie Powell e0b687f289 Merge branch '2.0' into 2.1. 2024-07-14 16:42:26 +01:00
Sadie Powell 2de0dddb1c Fix joining channels with keys on InspIRCd v3. 2024-07-14 16:39:37 +01:00
Sadie Powell ff65b68dfa Fix the name of the key parameter in SendSVSJoin. 2024-07-14 15:21:00 +01:00
Sadie Powell 94456a6063 Fix sending global messages to remotely linked servers. 2024-07-14 11:44:22 +01:00
Sadie Powell 41ea346551 Update the change log. 2024-07-11 01:13:59 +01:00
Sadie Powell 439ad3e736 Make it clear that inspircd3 also works with InspIRCd 4. 2024-07-11 01:13:59 +01:00
Sadie Powell 347d82f59b Qualify a use of auto in db_atheme. 2024-07-08 00:53:47 +01:00
Sadie Powell fe68f40634 Remove some obsolete echo compatibility wrappers. 2024-07-08 00:53:47 +01:00
ItsOnlyBinary 08b1344056 Add UNIX socket support to mysql module.
Ref: #419
2024-07-04 13:13:56 +01:00
Sadie Powell ff67a80a71 Bump for 2.1.8-git. 2024-07-01 10:08:16 +01:00
Sadie Powell 230e85798d Release 2.1.7. 2024-07-01 10:06:17 +01:00
Sadie Powell 9604690e9d Update the change logs. 2024-06-29 16:25:17 +01:00
Sadie Powell 01e0cf4868 Add support for sending tag messages. 2024-06-24 14:46:41 +01:00
Sadie Powell 693eeed762 Rework how CTCP messages are sent and received. 2024-06-24 14:29:55 +01:00
Sadie Powell 6e5713d64a Remove the formatting overloads of SendNotice/SendPrivmsg. 2024-06-24 13:30:17 +01:00
Sadie Powell 249ad3dfea Update the Turkish translation.
Co-authored-by: CaPa CuL <capacul@gmail.com>
2024-06-23 18:36:00 +01:00
Sadie Powell b94c3740b9 Make the language around fantasy commands less weird. 2024-06-23 14:36:03 +01:00
Sadie Powell 59ec42f0e6 Rename suspend in cs_expire to suspendexpire to match ns_expire. 2024-06-23 13:55:25 +01:00
Sadie Powell 8a65f116b6 Merge branch '2.0' into 2.1. 2024-06-23 13:52:46 +01:00
Sadie Powell 8105607257 Fix the default config for channel suspensions. 2024-06-23 13:51:53 +01:00
Sadie Powell 601da1141e Fix the default config for channel suspensions. 2024-06-23 13:50:50 +01:00
Sadie Powell 8c0edef714 Split nickserv/{sa,}set/language out to its own module. 2024-06-22 17:46:42 +01:00
Sadie Powell c3efd9426d Update the change log. 2024-06-20 17:16:16 +01:00
Sadie Powell a386439f86 Misc improvements to db_atheme. 2024-06-20 17:16:16 +01:00
Sadie Powell 016a5b3903 Fix importing Atheme mode locks. 2024-06-20 17:16:16 +01:00
Sadie Powell 60aeb2a71a Silently ignore some Atheme metadata that we know we can't import. 2024-06-19 22:45:43 +01:00
Sadie Powell 54ea63df66 Avoid creating extra service references in db_atheme. 2024-06-19 22:44:31 +01:00
Sadie Powell 01fc3ea22e Fix importing Atheme opers. 2024-06-19 22:44:31 +01:00
Sadie Powell 3388736fab Use auto in more places in db_atheme. 2024-06-19 22:44:31 +01:00
Sadie Powell 0065a0f405 Only import clones from Atheme if we recognise the database version. 2024-06-19 22:44:16 +01:00
Sadie Powell 490f832dc0 Fix importing Atheme session limits. 2024-06-19 21:12:28 +01:00
Sadie Powell a44acb6de5 Fix importing Atheme forbid reasons. 2024-06-19 20:31:55 +01:00
Sadie Powell 13e5ddf807 Fix importing Atheme akick reasons. 2024-06-19 20:22:57 +01:00
Sadie Powell e42c728ab8 Log the channel that a mode lock was unable to be imported for. 2024-06-19 19:41:16 +01:00
Sadie Powell 4eec5c5435 Save the databases directly after importing. 2024-06-19 19:30:24 +01:00
Sadie Powell 2667d9e90c Update the databases more regularly. 2024-06-19 11:28:21 +01:00
Sadie Powell f2b66278aa Fix a string that should be marked as translatable in ns_info. 2024-06-12 17:53:15 +01:00
Sadie Powell 5b7d952626 Remove the broken Catalan, Hungarian, and Russian translations. 2024-06-12 17:50:00 +01:00
Sadie Powell 24375d53e6 Add support for looking up account information from a nick.
Closes #407.
2024-06-12 17:46:07 +01:00
Sadie Powell 88ac47e217 The sender can be null in OnBotUnAssign. 2024-06-10 12:51:56 +01:00
Sadie Powell 8a1bffba9b Fix a crash in ns_cert. 2024-06-10 11:16:05 +01:00
TehPeGaSuS 01eef7a392 Rename example.chk to cron.example.sh. 2024-06-07 23:23:44 +01:00
Sadie Powell 67b76fadca Fix a memory leak in os_akill and os_sxline. 2024-06-07 22:39:08 +01:00
Sadie Powell 7861712437 Add nullability attributes to the module events. 2024-06-07 22:15:58 +01:00
Sadie Powell ccc088d946 Log a user out fully when their nick gets suspended.
Closes #409.
2024-06-04 22:41:32 +01:00
Sadie Powell 4468fe77fa Fix an inverted if in the global odule. 2024-06-03 20:02:03 +01:00
Sadie Powell e71a9e2894 Avoid NickAlias lookups by storing a pointer in the NickCore. 2024-06-03 16:04:53 +01:00
Sadie Powell f80bdf06ba Fix a null pointer dereference in the sasl module. 2024-06-03 14:39:08 +01:00
Sadie Powell 2d6033c73f Bump for 2.1.7-git. 2024-06-01 09:44:43 +01:00
Sadie Powell 756dc49813 Release 2.1.6. 2024-06-01 09:43:36 +01:00
Sadie Powell aa92559aa0 Document the previous commit. 2024-06-01 09:43:20 +01:00
Sadie Powell eb12a89b8e Fix creating the runtime directory on Windows. 2024-05-28 01:07:27 +01:00
Sadie Powell d4a34308e5 Update the change logs. 2024-05-23 16:02:54 +01:00
Sadie Powell aab3a8e5b6 Clarify that one non-deprecated protocol module must be loaded. 2024-05-23 15:40:56 +01:00
Sadie Powell c72e12d0a6 Fix setting the history mode on UnrealIRCd.
Closes #406.
2024-05-22 15:08:13 +01:00
Sadie Powell bce0d629fd Fix another iterator invalidation issue. 2024-05-22 14:30:18 +01:00
Sadie Powell 7d0dacc86c Change --modulesdir to be singular like the other config options. 2024-05-22 10:30:03 +01:00
Sadie Powell 729aa4ab4a Fix parsing the flood mode on UnrealIRCd. 2024-05-18 18:36:17 +01:00
Sadie Powell 18e9e12261 Fix an iterator invalidation issue in cs_set and ns_set. 2024-05-18 16:35:35 +01:00
TehPeGaSuS 9d68b29c9e Initial Portuguese retranslation. 2024-05-17 17:24:24 +01:00
Sadie Powell a4792412ba Merge branch '2.0' into 2.1. 2024-05-16 18:00:13 +01:00
Sadie Powell 8bb83f6b1a Explicitly specify ROW_FORMAT=DYNAMIC when creating tables.
Resolves the issues some people were having with extremely wide rows.
2024-05-16 17:29:25 +01:00
Sadie Powell da99a53dfa Don't specify a width for DT_INT columns.
This isn't actually used by MySQL for the column width.
2024-05-16 17:28:15 +01:00
Sadie Powell a9e9ac32a0 Store boolean extension items as DT_INT. 2024-05-16 17:28:15 +01:00
Sadie Powell 05e6df23a2 Mark boolean columns as DT_INT in bs_kick. 2024-05-16 16:50:41 +01:00
Sadie Powell 3f9fc23270 Remove some unnecessary advice. 2024-05-16 16:44:38 +01:00
Sadie Powell cb21c7c1fa Fix some untranslated strings in the Turkish translation. 2024-05-11 18:35:17 +01:00
Sadie Powell 4008e64f26 Store when the account name was registered in the NickCore. 2024-05-11 17:40:38 +01:00
Sadie Powell 1cf5918574 Merge branch '2.0' into 2.1. 2024-05-11 14:24:37 +01:00
Sadie Powell afe87bf693 Ensure we are connected to MySQL before trying to escape data. 2024-05-11 11:36:29 +01:00
Sadie Powell ff1c5adb8b Always use server-side topic and mode locks where available. 2024-05-10 19:03:50 +01:00
Sadie Powell c36030c826 Remove CanSVSLogout and implement logout support on Plexus. 2024-05-09 18:54:40 +01:00
Sadie Powell 33a02b1223 Require a reason when throwing an exception. 2024-05-09 18:37:16 +01:00
Sadie Powell 68f4556609 Store an IP in CommandSource for IRC messages too. 2024-05-06 17:08:37 +01:00
Sadie Powell 23db58a303 Change badpasslimit from int to unsigned int. 2024-05-06 16:42:13 +01:00
Sadie Powell ee69dc3105 Fix parsing backup client certificate fingerprints on InspIRCd. 2024-05-01 21:21:19 +01:00
Sadie Powell e9243c3fde Add the ReplaceCert method to CertService. 2024-05-01 21:20:31 +01:00
Sadie Powell 4cfee23303 Simplify InspIRCd user metadata handler slightly. 2024-05-01 20:20:47 +01:00
Sadie Powell be3822523b Automatically add client certificates to the cert list on register. 2024-05-01 17:23:10 +01:00
dependabot[bot] 111f81aa95 Bump microsoft/setup-msbuild from 1.3 to 2
Bumps [microsoft/setup-msbuild](https://github.com/microsoft/setup-msbuild) from 1.3 to 2.
- [Release notes](https://github.com/microsoft/setup-msbuild/releases)
- [Changelog](https://github.com/microsoft/setup-msbuild/blob/main/building-release.md)
- [Commits](https://github.com/microsoft/setup-msbuild/compare/v1.3...v2)

---
updated-dependencies:
- dependency-name: microsoft/setup-msbuild
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-01 17:20:06 +01:00
Sadie Powell f12e1ad222 Bump for 2.1.6-git. 2024-05-01 14:37:06 +01:00
Sadie Powell 72318a6bf0 Release 2.1.5. 2024-05-01 14:16:09 +01:00
Sadie Powell 2f77cb38e2 Update the changelogs. 2024-05-01 14:15:17 +01:00
Sadie Powell 84ca4c0d27 Update the inspircd module for recent 1206 protocol changes. 2024-05-01 14:03:11 +01:00
Sadie Powell 1f9a197b18 Merge branch '2.0' into 2.1. 2024-04-29 08:36:23 +01:00
Sadie Powell 0c5bf51378 Skip serializing data without a type in db_flatfile. 2024-04-29 08:16:45 +01:00
Sadie Powell 1647968c50 Fix message truncation in global/global and global/server. 2024-04-28 08:52:16 +01:00
Sadie Powell 5473311bd7 Only enable os_noop on IRCDs that actually have a SendSVSNOOP impl. 2024-04-15 21:08:40 +01:00
Sadie Powell f3ebb67469 Make SendChannel abstract. 2024-04-15 21:00:10 +01:00
Sadie Powell 0d149ce195 Install a systemd service file on Linux. 2024-04-15 20:29:57 +01:00
Sadie Powell d68ba1b570 Implement support for BIGLINES on UnrealIRCd. 2024-04-15 20:05:43 +01:00
Sadie Powell 1877833e73 Bump Bahamut support to require 2.0 or newer. 2024-04-15 18:29:36 +01:00
Sadie Powell 63c3710785 Fix some missing translations in the tr_TR translation. 2024-04-15 15:32:19 +01:00
Sadie Powell 0043d137e5 Update the Turkish translation for the changes in 2.1.4.
Co-authored-by: CaPa CuL <capacul@gmail.com>
2024-04-15 15:26:55 +01:00
Sadie Powell 3e5d3c5bdc Avoid packaging unnecessary .lib files on Windows.
[skip alpine ci]
[skip ubuntu ci]
2024-04-15 12:41:56 +01:00
Sadie Powell 62deedfa75 Automatically upload the Windows package on release.
[skip alpine ci]
[skip ubuntu ci]
2024-04-15 11:57:40 +01:00
Sadie Powell 44af4eac6b Update the Windows CI to the latest Conan. 2024-04-15 11:11:40 +01:00
Sadie Powell 5fdc637327 Expand relative paths when installing. 2024-04-14 12:23:19 +01:00
Sadie Powell 7c93007aa6 Avoid duplicate entries in ReplaceCert. 2024-04-14 12:23:19 +01:00
Robert Scheck e8fee93a7e Fix a typo in the example configs. 2024-04-14 09:21:50 +01:00
Sadie Powell 260539e987 Add more documentation for overriding confirmation codes. 2024-04-07 15:52:24 +01:00
Sadie Powell 4603cd467b Add an operator privilege to allow overriding drop codes.
Closes #392
2024-04-05 14:14:10 +01:00
Sadie Powell 00549bc9b2 Merge branch '2.0' into 2.1. 2024-04-04 19:59:19 +01:00
Sadie Powell e0a6f7456b Fix extracting timestamps from UnrealIRCd MODE messages.
Oversight from commit 04e1a4f5c8.
2024-04-04 19:48:34 +01:00
Sadie Powell 5a54b37aeb Remove the g prefix from git hashes. 2024-04-04 14:16:21 +01:00
Sadie Powell 2e43665266 Log the services directory when chdiring to it. 2024-04-04 14:02:57 +01:00
Sadie Powell 8b4cd65e2a Fix erroring out when sendmailpath is empty.
This has a default now.
2024-04-02 16:52:41 +01:00
Sadie Powell c08aaa86d1 Sync the build system directory names with the core. 2024-04-02 16:52:41 +01:00
Sadie Powell 87a8af0ad7 Use the paths from the build system instead of hardcoding them. 2024-04-02 16:45:49 +01:00
Sadie Powell 4691dfa3f0 Bump for 2.1.5-git. 2024-04-01 11:26:07 +01:00
Sadie Powell 507eefc820 Release 2.1.4. 2024-04-01 11:24:48 +01:00
Sadie Powell 72af764861 Fix some typos in the changelog. 2024-03-31 15:21:18 +01:00
Sadie Powell 1b631e96bd Add a default value for sendmailpath. 2024-03-31 15:17:03 +01:00
Sadie Powell 3b4a4da52d Update the changelogs. 2024-03-29 14:24:17 +00:00
Sadie Powell 2e59aac025 Fix the default value of accessmax in cs_access. 2024-03-29 14:21:51 +00:00
Sadie Powell 3de6da80c6 Alias ACCESS to ALIST now the former is unused. 2024-03-27 23:32:16 +00:00
Sadie Powell 2829c83118 Add more nick options to webcpanel's nickserv/info page. 2024-03-26 14:27:52 +00:00
Sadie Powell f58012ea0e Remove some leftover references to nickserv/access. 2024-03-26 13:40:53 +00:00
Sadie Powell f8605ec188 Allow specifying the webcpanel template directory directly.
There's no need to hardcode a base path here.
2024-03-26 12:59:03 +00:00
Sadie Powell 5a12beff15 Fix some spelling issues in the webcpanel that were missed earlier. 2024-03-26 12:33:59 +00:00
Sadie Powell 6b1f8de885 Use consistent headers and footers on all webcpanel templates. 2024-03-26 11:52:04 +00:00
Sadie Powell 33be5de66e Flatten the webcpanel hierarchy slightly. 2024-03-26 11:22:43 +00:00
Sadie Powell 4399eeaa58 Add the --nopid option to disable writing a pidfile.
This is useful for init scripts that don't fork.
2024-03-20 21:34:28 +00:00
Sadie Powell 38cfb0603a Fix deleting pidfiles. 2024-03-20 21:34:18 +00:00
Sadie Powell 1a3844e74e Fix the Windows build. 2024-03-19 15:58:41 +00:00
Sadie Powell bfed2e1bf5 Use paths relative to data/conf in the config file.
This was done in some places already but not consistently.

Closes #349.
2024-03-19 15:51:55 +00:00
Sadie Powell e488f294a1 Put the webcpanel directory in the data directory not a subdir. 2024-03-19 15:19:15 +00:00
Sadie Powell fde3438ef2 Allow using absolute paths in more places. 2024-03-19 15:11:40 +00:00
Sadie Powell 1575dea5b9 Redocument deprecated encryption modules. 2024-03-19 12:40:01 +00:00
Sadie Powell a1972ba9b6 Prevent using enc_posix as a primary encryption module. 2024-03-19 11:54:39 +00:00
Sadie Powell 5a72d8783e Add verify-only support for POSIX crypt() hashes from Atheme. 2024-03-18 22:17:14 +00:00
Sadie Powell e6770bc2fd Fix an off by one error in enc_sha2. 2024-03-18 22:04:57 +00:00
Sadie Powell 413fed474e Fix unnecessary uses of std::string. 2024-03-18 12:47:43 +00:00
Sadie Powell 60083834f8 Improve sending email.
- Use consistent line endings as expected by the email spec.
- Don't require admins to escape . at the start of lines.
- Log the reason why sending email fails.
2024-03-18 12:34:34 +00:00
Sadie Powell 9ac4da0489 Fix not storing the start time after calling UpdateTime. 2024-03-18 11:45:33 +00:00
Sadie Powell cb3848b7db Use clock_gettime if it is available. 2024-03-18 11:27:10 +00:00
Sadie Powell d41764bfd6 Fix sending emails to nicks ending with a backslash. 2024-03-15 18:52:12 +00:00
Sadie Powell 753119c4a1 Use consistent casing when referring to vhosts and vidents. 2024-03-15 12:42:13 +00:00
Sadie Powell d996c3aa8f Fix a format-extra-args warning on some versions on GCC. 2024-03-15 12:22:22 +00:00
dependabot[bot] ac6e8c617d Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-15 12:19:07 +00:00
Sadie Powell 3b09f4aa54 Merge branch '2.0' into 2.1. 2024-03-15 12:17:49 +00:00
Sadie Powell 10f4724b6b Dependabot requires that the target-branch is a string. 2024-03-15 12:17:15 +00:00
Sadie Powell ad86535024 Consistently use READ_ONLY_MODE everywhere. 2024-03-15 12:09:58 +00:00
Sadie Powell 628f4d2a7e Merge branch '2.0' into 2.1. 2024-03-15 11:58:09 +00:00
Sadie Powell 8d5be77c93 Send dependabot pull requests to the 2.1 branch. 2024-03-15 11:56:56 +00:00
Sadie Powell 13a556df89 Initialize timer members with constructor initialization. 2024-03-14 23:19:32 +00:00
Sadie Powell 4e9d183523 Restore some functionality that was removed in an earlier commit. 2024-03-14 23:10:53 +00:00
Sadie Powell 074dfb63a7 Fix a warning when building with Clang. 2024-03-14 21:37:18 +00:00
Sadie Powell beaf09de7b Rework sending global notices.
Admins can now queue multiple messages and send them when they are
ready. This is fully compatible with the previous global behaviour.

Admins can now also send messages to individual servers. This is
useful for informing users of maintenance due to downtime.
2024-03-14 21:35:17 +00:00
Sadie Powell c8d8978cd0 Require that at least one encryption module is loaded. 2024-03-12 21:57:38 +00:00
Sadie Powell 11edba04fe Add command handlers for encap commands on InspIRCd. 2024-03-12 21:57:06 +00:00
Sadie Powell 22ba54b00d Show the full command in CONFIRM_DROP. 2024-03-12 19:24:31 +00:00
Sadie Powell 6fd7ca39e2 Fix the reason when kicking users from suspended channels.
Closes #372.
2024-03-12 17:00:42 +00:00
Sadie Powell b8cd00b412 Merge branch '2.0' into 2.1. 2024-03-12 16:50:30 +00:00
Sadie Powell f4bd43e898 Add a workaround for users matching expired sqlines.
I'll fix this properly in 2.1 because I don't want to make big
changes to 2.0.

Closes #384.
2024-03-12 16:47:57 +00:00
Sadie Powell 7d7664444a Fix expiring forbids. 2024-03-12 16:26:33 +00:00
Sadie Powell 1a8bbd6004 Respect --noexpire in cs_suspend and ns_suspend. 2024-03-12 14:43:12 +00:00
Sadie Powell e725c880a9 Fix expiring channel suspensions.
Closes #386.
2024-03-12 14:12:37 +00:00
Sadie Powell f5abcd1c4c Fix expiring nick suspensions.
Closes #376.
2024-03-12 14:02:16 +00:00
Sadie Powell 1986aa6581 Fix duplicate messages when synconset/syncongroup is set.
Closes #366.
2024-03-12 13:26:25 +00:00
Sadie Powell b52e1b2b02 Implement support for challenge authentication on InspIRCd. 2024-03-12 13:19:20 +00:00
Sadie Powell 54719fbfc6 Allow protocol modules to declare that they have no line/mode limit.
InspIRCd allows us to send infinite length lines and mode changes
and will restack before sending to users.
2024-03-12 12:39:33 +00:00
Sadie Powell 06add0e5fc Simplify limit extraction code. 2024-03-12 12:24:02 +00:00
Sadie Powell 63d682314b Merge branch '2.0' into 2.1. 2024-03-12 11:53:14 +00:00
Sadie Powell 1a6060ac5b Fix sending SVSTOPIC when topiclock is loaded on InspIRCd. 2024-03-12 11:46:41 +00:00
Sadie Powell a302f8f1be Refactor sending vhosts in the InspIRCd protocol module. 2024-03-12 11:43:21 +00:00
Sadie Powell 04e1a4f5c8 Add a protocol module function for extracting timestamps. 2024-03-12 11:02:08 +00:00
Sadie Powell 1538909ac0 Add ProtocolException and use it to send fatal errors. 2024-03-12 00:17:49 +00:00
Sadie Powell a15f165a1d Fix an inverted condition in enc_bcrypt. 2024-03-12 00:17:49 +00:00
Sadie Powell 77435dd0d9 Merge branch '2.0' into 2.1. 2024-03-11 22:43:29 +00:00
Sadie Powell 6f57907416 Fix the TIME message on InspIRCd. 2024-03-11 22:38:15 +00:00
Sadie Powell 7c1cfd2849 Fix comparing passwords in enc_sha256. 2024-03-11 21:07:39 +00:00
Sadie Powell 259b10b83a Fix some InspIRCd 1206 protocol compatibility issues. 2024-03-11 20:27:30 +00:00
Sadie Powell 02355546ff Reject registrations and password changes if password encryption fails. 2024-03-11 19:39:47 +00:00
Sadie Powell 6ad3430ac4 Clean up some dead code in ns_register. 2024-03-11 19:30:57 +00:00
Sadie Powell 29e7674e56 Replace convertTo/stringify with non-throwing alternatives.
Having these throw is terrible for ergonomics and there are loads
of places where the exception was either silently ignored or not
handled at all. Having a function which returns an optional and
another that returns a default works a lot better imo.
2024-03-11 19:17:29 +00:00
Bram Matthys b09632d1c3 Fix OS SQLINE expiry with UnrealIRCd 2024-03-11 18:30:55 +00:00
Sadie Powell e2df7d4d01 Ensure that verify-only encryption modules can never encrypt passwords.
If another module was loaded first and then later unloaded it was
possible for a deprecated module to encrypt passwords.
2024-03-10 20:46:03 +00:00
Sadie Powell 9a984a8148 Implement verify-only support for raw SHA-2 passwords. 2024-03-10 20:46:03 +00:00
Sadie Powell fb9c8950ed Refactor the enc_bcrypt module and expose an encryption provider. 2024-03-10 20:46:03 +00:00
Sadie Powell a849a81ac3 Refactor the enc_old module. 2024-03-10 20:28:00 +00:00
Sadie Powell f919bb0748 Add self-tests to the encryption providers. 2024-03-10 20:20:24 +00:00
Sadie Powell 3b85a8071f Add some missing documentation comments. 2024-03-10 15:58:58 +00:00
Sadie Powell 9a8cac060d Add support for encrypting passwords with the Argon2 algorithm.
Closes #369.
2024-03-10 15:09:38 +00:00
Sadie Powell 0353338436 Replace the custom SHA-2 implementation in enc_sha256. 2024-03-10 12:27:49 +00:00
Sadie Powell defb8348a7 Move the HMAC function to the encryption header.
This will be useful for doing challenge authentication on InspIRCd.
2024-03-09 22:51:23 +00:00
Sadie Powell 1b86665d81 Add a stats category for password encryption algorithms. 2024-03-09 22:22:56 +00:00
Sadie Powell 2f52fa723c Redocument the encryption module config. 2024-03-09 22:22:56 +00:00
Sadie Powell 6e0f0b8896 Add the enc_sha2 module which hashes passwords with HMAC-SHA-2.
Using HMAC instead of changing the IV is a lot safer.
2024-03-09 22:22:56 +00:00
Sadie Powell 2c5b2c649e Convert enc_md5 to use a vendored MD5 library. 2024-03-09 22:22:56 +00:00
Sadie Powell a6bc4cab9d Misc improvements to the encryption API. 2024-03-09 22:22:56 +00:00
Sadie Powell ef37daf44a Clean up the services.h includes. 2024-03-09 22:22:56 +00:00
Sadie Powell 39d288f99f Rename hash_map to unordered_map to match the underlying container. 2024-03-09 22:22:56 +00:00
Sadie Powell 9ead3f15c3 Save the last email time for accounts. 2024-03-09 22:22:55 +00:00
Sadie Powell 272104af95 Modernize the initialisation of NickAlias and NickCore. 2024-03-09 22:22:55 +00:00
Bram Matthys 51e95d72e3 Enable message-tags support for UnrealIRCd 2024-03-09 14:53:38 +00:00
Sadie Powell 12486f6cee Tweak the config default limits slightly. 2024-03-09 11:43:38 +00:00
Sadie Powell 891375baca Use a separate CAPAB handler on InspIRCd to avoid pollution. 2024-03-08 19:05:12 +00:00
Sadie Powell 41a295202e Only enable InspIRCd parser logging when using --protocoldebug. 2024-03-08 18:17:17 +00:00
Sadie Powell 722c5b7d61 Implement support for the InspIRCd 1206 protocol. 2024-03-08 17:12:44 +00:00
Sadie Powell 52216b56a1 Merge branch '2.0' into 2.1. 2024-03-08 17:05:49 +00:00
Sadie Powell cd614831de Fix feature detection on InspIRCd. 2024-03-08 16:49:55 +00:00
Sadie Powell 1d0a836a2e Improve protocol debug messages. 2024-03-08 12:24:44 +00:00
Sadie Powell 46b7064834 Keep the InspIRCd protocol version around for later use. 2024-03-08 11:07:30 +00:00
Sadie Powell bb8df01e25 Move some modules which can be built by default out of extra. 2024-03-07 23:18:08 +00:00
Sadie Powell 16700b0e30 Remove a guarantee that may not necessarily be correct. 2024-03-07 23:09:25 +00:00
Sadie Powell 4e04a11995 Consistently use email instead of e-mail. 2024-03-07 22:52:41 +00:00
Sadie Powell 76e5480be9 Update the changelogs. 2024-03-07 22:52:41 +00:00
Sadie Powell 464e6b8010 Use the C++11 random number generator instead of rand().
This is safer, faster, and doesn't require seeding.
2024-03-07 22:52:41 +00:00
Sadie Powell 3272c1bbc6 Require new accounts to have email addresses. 2024-03-07 22:25:32 +00:00
Sadie Powell 307ffea951 Update the English translation for the previous commit.
y
2024-03-07 21:19:47 +00:00
Sadie Powell bb94f286f5 Also use drop confirmation codes for nicknames. 2024-03-07 21:18:06 +00:00
Sadie Powell 86e3556438 Fix some misc bugs in the InspIRCd protocol module.
Closes #373.
2024-03-07 20:55:22 +00:00
Sadie Powell 12214bee72 Add the initial version of the Atheme database importer. 2024-03-07 18:50:36 +00:00
Sadie Powell 08a35231ef Merge branch '2.0' into 2.1. 2024-03-04 12:10:22 +00:00
Sadie Powell 9649dc78a1 When using ldap/sql auth prevent displays expiring before their group.
This prevents zombie accounts from being left around that can't be
authenticated to.

Closes #355.
2024-03-04 12:08:28 +00:00
Sadie Powell 9970b4e37b Bump for 2.1.4-git. 2024-03-04 11:09:51 +00:00
Sadie Powell a5a615d5c7 Release 2.1.3. 2024-03-04 11:09:51 +00:00
Sadie Powell ce97fdd1c6 Update the changelogs. 2024-03-04 11:09:51 +00:00
Sadie Powell 1a8ae513b4 Add NickAlias::GetVhostMask for getting the vident@vhost. 2024-03-04 11:09:50 +00:00
Sadie Powell d15ac93a8f Clean up some more CMake flags. 2024-02-29 23:50:10 +00:00
Sadie Powell 4e0f94bcce Fix some oversights from previous commits. 2024-02-29 23:18:46 +00:00
Sadie Powell 1c1645096f If a user runs an invalid command try to suggest a valid one. 2024-02-29 21:56:14 +00:00
Sadie Powell e0ac5509b4 Consolidate some header files. 2024-02-29 19:32:44 +00:00
Sadie Powell 190c37a68b Rework some platform compatibility code. 2024-02-29 19:11:37 +00:00
Sadie Powell a67bef2dee Update the changelogs. 2024-02-29 17:15:15 +00:00
Sadie Powell 893bbf9251 Fix some oversights. 2024-02-29 17:15:15 +00:00
Sadie Powell 5441093211 Merge branch '2.0' into 2.1. 2024-02-29 16:32:14 +00:00
Sadie Powell ee7455daa8 Fix a copy/paste error in webcpanel. 2024-02-29 16:27:24 +00:00
Sadie Powell 579af3c442 Rip out ns_access and related code.
This is wildly insecure and has been disabled by default for at
least a decade.
2024-02-29 16:14:15 +00:00
Sadie Powell 25bdcfcbc4 Add names for the numerics used by the core. 2024-02-29 13:07:14 +00:00
Sadie Powell 26919f41d2 If a PRIVMSG or NOTICE is empty then send a single space instead.
Currently a bunch of code does source.Reply(" ") to ensure that an
empty line gets rendered but this is a much better way to handle
this problem.

The code that does this already will be updated in a future commit
to avoid breaking translations in progress.
2024-02-29 12:31:19 +00:00
Sadie Powell 5f735b2570 Fix matching extbans on InspIRCd and implement missing matchers. 2024-02-27 20:33:43 +00:00
Sadie Powell 9c80f9e34e Replace OnChannelUnban with an IRCDProto function.
This was added for (and is only used for) for unbanning users on
UnrealIRCd which is an IRCd protocol function so it should be in
IRCDProto.
2024-02-27 13:40:47 +00:00
Sadie Powell b5b3c74477 Make functions that don't use this static. 2024-02-27 10:48:55 +00:00
Sadie Powell 73d4ac6de0 Remove redundant uses of const. 2024-02-27 10:34:27 +00:00
Sadie Powell 7640fad30c Simplify several boolean expressions. 2024-02-27 10:19:44 +00:00
Sadie Powell 9f6d378755 Fix write_pidfile on Windows.
Microsoft's documentation lies again.
2024-02-27 10:19:36 +00:00
Sadie Powell 642e68f53a Fix sending numerics on InspIRCd. 2024-02-26 23:57:55 +00:00
Sadie Powell eb658f87a3 Use fstream for accessing files where possible. 2024-02-26 23:57:55 +00:00
Sadie Powell 1e87849e5c Rework IRCDMessage/IRCDMessageFlag. 2024-02-26 23:56:07 +00:00
Sadie Powell 5fa4acb195 Refactor User::IsServicesOper. 2024-02-26 22:00:21 +00:00
Sadie Powell 79f215606d Allow using more than one fingerprint in an oper block.
Closes #362.
2024-02-26 21:55:59 +00:00
Sadie Powell 2fd4b45f81 Deduplicate InspIRCd CAPAB parsing. 2024-02-26 19:26:21 +00:00
Sadie Powell d3b4a4bd05 Update translator names. 2024-02-26 18:56:11 +00:00
Sadie Powell d914febbec Fix a typo in UnrealIRCd's SendGlobops. 2024-02-26 17:23:15 +00:00
Sadie Powell 2962a0be8c Fix bs_kick not using the correct kick message for automatic kicks.
Closes #354.
2024-02-26 16:45:28 +00:00
Sadie Powell 6be4df3b39 Remove several string format IRCDProto function overloads. 2024-02-26 16:45:28 +00:00
Sadie Powell 4789751e50 Fix a missing override keyword. 2024-02-26 16:45:28 +00:00
Sadie Powell 57674f5869 Replace IRCDProto::CanSendTags with IsTagValid.
Not every IRC server accepts arbitrary tags so this is a better
way to handle tag filtering.
2024-02-26 15:50:35 +00:00
Sadie Powell c6cb4ba159 Fix some coding style issues. 2024-02-26 15:34:17 +00:00
Sadie Powell e341cac8d6 Implement support for the IRCv3 +draft/channel-context tag.
Closes #358.
2024-02-26 15:34:17 +00:00
Sadie Powell 83dd96b9f2 Extract should privmsg logic to its own function. 2024-02-26 14:41:50 +00:00
Sadie Powell cabaa079df Kill checks for obsolete versions of Windows.
Because of the required system functionality Anope will not build
or run on these systems anyway.
2024-02-25 23:56:46 +00:00
Sadie Powell 273e7f249c Remove duplicate suffix from socketengine file names. 2024-02-25 23:54:12 +00:00
Sadie Powell 8c9ca23900 Remove a function which exists for compat with old versions of VS. 2024-02-25 23:49:07 +00:00
Sadie Powell 8e3da86283 Remove a reference to 1.8. 2024-02-25 23:42:14 +00:00
Sadie Powell 97b65b2255 Use unique_ptr for managing std::thread ownership. 2024-02-25 21:54:40 +00:00
Sadie Powell b26f198489 Fix formatting messages on ngircd. 2024-02-22 19:54:09 +00:00
Sadie Powell a99a00d7c5 Fix sending the ngircd PASS handler. 2024-02-22 19:07:11 +00:00
Sadie Powell 283137841f Refactor the InspIRCd module static variables and method. 2024-02-22 17:47:14 +00:00
Sadie Powell 3290ebd36a GetMaxListFor: use size_t and add a default like the other fields. 2024-02-22 17:25:47 +00:00
Sadie Powell c4e9c0bf85 If the IRCd sends a field limit then use it over that of the config. 2024-02-22 17:05:30 +00:00
Sadie Powell 84ad85ee85 Fix a bug in the unrealircd protocol module. 2024-02-22 15:58:23 +00:00
Sadie Powell 9789c3bd8c Deduplicate User::SendMessage. 2024-02-22 14:14:23 +00:00
Sadie Powell a75afb597b Add the IRCv3 reply tag to messages sent as responses to a user. 2024-02-22 13:23:18 +00:00
Sadie Powell f93d9e7698 Store the source message identifier in CommandSource. 2024-02-22 13:19:36 +00:00
Sadie Powell 7423fa9998 Route message tags into more message functions. 2024-02-22 13:03:53 +00:00
Sadie Powell 7cba665270 Fix some oversights in commit 82fa7e1467. 2024-02-22 11:18:05 +00:00
Sadie Powell 9502567453 Fix the NickServ help message showing a wrong min password length.
Closes #357.
2024-02-22 11:01:41 +00:00
Sadie Powell 14472c5a95 Increase minpasslen and maxpasslen slightly. 2024-02-22 10:46:30 +00:00
Sadie Powell d4f4bcf23c Remove UplinkSocket::Message now nothing uses it. 2024-02-22 00:14:08 +00:00
Sadie Powell 82fa7e1467 Convert protocol modules over to Uplink::Send. 2024-02-22 00:14:08 +00:00
Sadie Powell aefbb4fbda Rework SendModeInternal to be usable with Uplink::Send. 2024-02-22 00:14:08 +00:00
Sadie Powell 9b77fdf5b6 Rework SendNumericInternal to be usable with Uplink::Send. 2024-02-22 00:14:08 +00:00
Sadie Powell 7a6979c814 Convert most core protocol handlers to use Uplink::Send. 2024-02-22 00:14:08 +00:00
Sadie Powell c4ab550ec7 Add Uplink::Send, rework message formatting.
This is the new way of sending messages to the uplink inspired by
the work done in the old git master. This will allow us to do new
things involving tags in the future.
2024-02-22 00:14:08 +00:00
Sadie Powell 3ecf6b495b Document IRCDProto::Parse. 2024-02-22 00:14:08 +00:00
Sadie Powell 8475697e3b Inline, constify, and document GetProtocolName. 2024-02-22 00:14:08 +00:00
Sadie Powell 85687781d1 Include tags in OnMessage. 2024-02-22 00:14:08 +00:00
TehPeGaSuS ccfaca32a2 Fix a typo in cs_drop. 2024-02-21 23:09:09 +00:00
Sadie Powell 07373c8cf2 Move IRCDProto member initializers to the header. 2024-02-21 13:55:48 +00:00
Sadie Powell 89594d4557 Add a method to the ns_cert API for replacing a certificate.
This will be used for upgrading certificate fingerprints when the
InspIRCd 1206 protocol support is added.
2024-02-21 13:30:16 +00:00
Sadie Powell b478a1cb53 Make ModuleManager::SetPriority more readable. 2024-02-20 18:38:52 +00:00
Sadie Powell 1fb77e414d Increase the size of the random codes in ns_register and ns_set. 2024-02-19 22:31:07 +00:00
Sadie Powell 22fe5bb724 Require users to use a confirmation code when dropping channels. 2024-02-19 22:20:36 +00:00
Robert Scheck 909b9b2679 Remove a leftover use of the m_ module prefix. 2024-02-17 21:34:03 +00:00
Sadie Powell 49ea709027 Merge branch '2.0' into 2.1. 2024-02-17 20:50:31 +00:00
Sadie Powell 4ea2bc5e46 Mark as 2.0.16-git. 2024-02-17 20:08:10 +00:00
Sadie Powell eabc8b641e Release 2.0.15. 2024-02-17 20:07:09 +00:00
Sadie Powell 2f1ed186d1 Update the change log. 2024-02-17 20:06:08 +00:00
Sadie Powell 4cc68397dc Update the copyright headers for 2024. 2024-02-17 19:58:17 +00:00
Sadie Powell 2b7872139c Prevent resetting the password of suspended accounts.
Closes #351.
2024-02-17 19:52:39 +00:00
TehPeGaSuS e47ad6ed3f Fix some typos in the config change log. 2024-02-17 18:59:17 +00:00
Sadie Powell f3b14694c6 Bump for 2.1.3-git. 2024-02-17 18:15:38 +00:00
Sadie Powell e9424b529c Release 2.1.2. 2024-02-17 18:14:10 +00:00
Sadie Powell a60c796cf6 Update the config changelog. 2024-02-17 18:13:30 +00:00
Sadie Powell fcf16ab20a Merge branch '2.0' into 2.1. 2024-02-11 21:35:31 +00:00
Sadie Powell 8e3be20387 Update the Windows dependencies. 2024-02-11 21:34:00 +00:00
Sadie Powell 689dd44d3b Add a GitHub security policy. 2024-02-11 21:32:23 +00:00
Sadie Powell a25d0aa60e Update the changelog. 2024-02-11 21:14:59 +00:00
Sadie Powell c50d1dc2b5 Remove some outdated development docs. 2024-02-11 21:08:17 +00:00
Sadie Powell 274bb19d03 Switch Thread to use the C++11 equivalent, remove win32/pthread. 2024-02-11 20:35:21 +00:00
Sadie Powell 2c5b84bd1d Replace Condition and Mutex with the C++11 standard equivalents. 2024-02-11 19:53:05 +00:00
Sadie Powell 5c50bcb9c7 Remove the time_t parameter from Tick and TickTimers.
Most uses of Tick do not use the parameter and even when it is used
it is always the same as CurTime.
2024-02-11 18:18:18 +00:00
Sadie Powell cef56abea4 Consistently use time_t for the timer duration. 2024-02-11 18:10:38 +00:00
Sadie Powell 30b9f12711 Remove the now parameter from the Timer class.
This was never actually changed from the default.
2024-02-11 17:56:35 +00:00
Sadie Powell c9e0245f23 Revert "Document ns_no_expire nick default".
This reverts commit 9c9df2ad1f.

Closes #350.
2024-02-11 16:22:01 +00:00
Robby 5337326cc9 Update the dutch language file. 2024-01-31 06:17:01 +01:00
Robby 73d8c85879 Update the dutch language file. 2024-01-31 06:17:00 +01:00
Robby 6237245ab7 Remove an extraneous space in cs_xop, part 2. 2024-01-31 03:20:35 +01:00
Robby 7ae20c2a6d Remove an extraneous space in cs_xop. 2024-01-31 03:08:54 +01:00
Robby ae1829e5a8 Fix a typo in the PASSWORD_TOO_SHORT text string. 2024-01-30 19:15:19 +01:00
Sadie Powell 026661c9a2 Fix irc2sql and webcpanel not being put into the modules folder. 2024-01-30 14:53:08 +00:00
Sadie Powell ec7223ace2 Convert map/multimap/hash_map to an alias template. 2024-01-30 14:29:17 +00:00
Sadie Powell 1f31621bbf Remove various references to old versions. 2024-01-30 14:01:07 +00:00
Sadie Powell dfd41b9b94 Fix Clang and GCC disagreeing about whether a move is needed. 2024-01-24 16:12:29 +00:00
Sadie Powell fdd4aade3b Add a CI workflow for Alpine. 2024-01-24 15:14:21 +00:00
Sadie Powell 0a53f4c26e Merge branch '2.0' into 2.1. 2024-01-24 14:48:53 +00:00
Sadie Powell d6a826a09c Backport CI changes from the 2.1 branch. 2024-01-24 14:45:57 +00:00
Sadie Powell 484160eb4e Shuffle modules around a bit. 2024-01-24 12:34:34 +00:00
Sadie Powell 7ac1fe5847 Rename several modules to remove the m_ prefix. 2024-01-24 12:22:51 +00:00
Sadie Powell 72acef4e15 Mark types that have no inheritors as final. 2024-01-23 16:53:06 +00:00
Sadie Powell a6a0f6c447 Improve the layout of types that inherit from another type. 2024-01-23 15:28:23 +00:00
Sadie Powell 398d674cf4 Fix some CoreExport types that should be DllExport. 2024-01-23 14:06:46 +00:00
Sadie Powell 1467de1c7e Mark all exception types as CoreExport.
From the GCC docs:

>Exception catching of a user defined type in a binary other than
>the one which threw the exception requires a typeinfo lookup.

Closes #335.
2024-01-22 20:06:57 +00:00
Sadie Powell c5023fdfa0 Update the Turkish translation for the changes in 2.1 git.
Co-authored-by: CaPa CuL <capacul@gmail.com>
2024-01-22 19:52:06 +00:00
Sadie Powell 97782248af Merge branch '2.0' into 2.1. 2024-01-22 18:35:12 +00:00
Sadie Powell 016761776b Add a new Turkish translation contributed by CaPa CuL.
Co-authored-by: CaPa CuL <capacul@gmail.com>
2024-01-22 16:29:20 +00:00
Victor Coss c2450eabab Fix typo 2024-01-22 00:38:23 +00:00
Sadie Powell d6ced86021 Fix some module names that were missed in commit 4056af00e3. 2024-01-11 17:13:14 +00:00
Sadie Powell 0d8d1675f7 Fix an oversight in build_subdir. 2024-01-10 17:49:02 +00:00
Sadie Powell 4056af00e3 Parse InspIRCd module names in a way which is 1206 compatible. 2024-01-10 17:47:27 +00:00
Sadie Powell 99b4305573 Add a wrapper for std::string::compare to Anope::string. 2024-01-10 17:07:17 +00:00
Sadie Powell 113301dbba Update the changelogs. 2024-01-09 21:25:44 +00:00
Sadie Powell 349ae043b6 Always build the stats modules.
These have no external dependencies so it makes no sense to not
always build them.
2024-01-09 21:25:44 +00:00
Sadie Powell 710e7dd3a2 Bump the minimum OpenSSL version to 1.1. 2024-01-09 21:25:44 +00:00
Sadie Powell 1e9c6d7931 Always disable SSLv3 support, allow disabling TLSv1.[012]. 2024-01-09 21:25:44 +00:00
Sadie Powell 5772b924cc Drop support for ancient versions of GnuTLS. 2024-01-09 21:25:44 +00:00
Sadie Powell fce5f4cc0f Update the default SSL filenames to use the Certbot names. 2024-01-09 21:25:44 +00:00
Sadie Powell fa7ad6b3df Use native file extensions on macOS and Windows. 2024-01-09 14:35:49 +00:00
Sadie Powell fc2df00cfc Put modules into their own folder on Windows. 2024-01-09 13:57:32 +00:00
Sadie Powell f92c5471c2 Add a string overload of Channel::Kick. 2024-01-08 14:37:50 +00:00
Sadie Powell 0439e3b21b Add a string overload of User::SetModes. 2024-01-08 14:14:57 +00:00
Sadie Powell 5b23fae8bf Add a string overload of Channel::SetModes. 2024-01-08 14:14:37 +00:00
Sadie Powell aac4b0f0a3 Bump the up to date languages for the recent format changes. 2024-01-08 13:47:39 +00:00
Sadie Powell f083795c79 Fix various format string issues. 2024-01-08 13:11:50 +00:00
Sadie Powell 5db79c1e24 Add a non-formatting overload of User::SetModesInternal. 2024-01-08 13:11:50 +00:00
Sadie Powell a4dddfd5f1 Mark format strings with the GNU printf attribute. 2024-01-08 13:11:50 +00:00
Valentin Lorentz 7ddc865cde fr_FR: Generalize gender-neutral grammar
'(e)' and 'le/la' were used in a few places, I generalized them to all
strings referring to people.

I also made role names gender-neutral using contraction (eg. "fondateur"
-> "fondateurice"), and adapted specifiers accordingly.
2024-01-06 23:22:10 +00:00
Sadie Powell 688ecf1c1d Fix an oversight in the mysql module. 2024-01-06 23:19:18 +00:00
Sadie Powell c0453cfec1 Fix a sign conversion issue in the mysql module. 2024-01-06 13:39:03 +00:00
Sadie Powell a9ab0c72a6 Use auto in places where the type is unambiguous. 2024-01-06 13:23:37 +00:00
Robert Scheck de918ef9cf Add missing whitespace in multi-line comment 2024-01-06 12:41:31 +00:00
Sadie Powell 0ee9874112 Update translations for the recent services case fix. 2024-01-05 21:44:08 +00:00
Val Lorentz 388858aee6 Fix inconsistent capitalization of 'services'. 2024-01-05 21:34:26 +00:00
Sadie Powell f22703df59 Fix a translation string and enable translations on CI. 2024-01-05 21:28:54 +00:00
Val Lorentz 4715b76dbe fr_FR: msgmerge + update fuzzy strings. 2024-01-05 21:21:43 +00:00
Sadie Powell 50bd385ccf Add an alias for chanserv/status for the name used by Atheme.
Closes #336.
2024-01-05 21:21:17 +00:00
Sadie Powell e738da9b11 Merge branch '2.0' into 2.1. 2024-01-05 19:52:56 +00:00
Val Lorentz 6e6e053384 fr_FR: Update fuzzy strings 2024-01-05 19:49:56 +00:00
Valentin Lorentz 5edf19d230 fr_FR: Fix trailing spaces 2024-01-05 19:00:19 +00:00
Sadie Powell 4573e1925d Use normal exit codes when exiting the process. 2024-01-05 12:00:28 +00:00
Sadie Powell a40f8e0b9d Update the copyright headers for 2024. 2024-01-04 22:25:48 +00:00
Sadie Powell 9db49ec790 Bump for 2.1.2-git. 2024-01-04 17:55:44 +00:00
Sadie Powell eb2aaf22ed Fix a copy/paste error in the default channel settings. 2024-01-01 17:32:37 +00:00
492 changed files with 59152 additions and 67396 deletions
+44
View File
@@ -0,0 +1,44 @@
---
name: Bug report
description: Report a non-security bug in Anope.
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report! Please make sure to answer the questions properly and don't just enter the same text into every field as this will make it harder for us to fix your bug.
If you're looking for help with setting up your services please post on [our support forum](https://github.com/orgs/anope/discussions/categories/support) instead.
If you're reporting a crash or other security issue [please read our security policy](https://github.com/anope/anope/security/policy#reporting-a-vulnerability) for how to report security issues privately.
- type: textarea
attributes:
label: Description
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce the issue
validations:
required: true
- type: textarea
attributes:
label: Describe the results you received
validations:
required: true
- type: textarea
attributes:
label: Describe the results you expected
validations:
required: true
- type: input
attributes:
label: Anope version
description: |-
Either the output of `services --version` (2.0) or `anope --version` (2.1).
validations:
required: true
-33
View File
@@ -1,33 +0,0 @@
---
name: Bug report
about: Report a non-security issue with Anope.
---
<!--
Please fill in the template below. It will help us process your bug report a lot faster. If you have multiple bugs to report then please open one issue for each bug.
-->
**Description**
**Steps to reproduce the issue:**
1.
2.
3.
**Describe the results you received:**
**Describe the results you expected:**
**Additional information you deem important (e.g. issue happens only occasionally):**
**Output of `services --version`:**
+20
View File
@@ -0,0 +1,20 @@
---
name: Feature request
description: Request that a new feature is added to Anope.
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this feature request!
- type: textarea
attributes:
label: Description
validations:
required: true
- type: textarea
attributes:
label: Why this would be useful?
validations:
required: true
-15
View File
@@ -1,15 +0,0 @@
---
name: Feature request
about: Request that a new feature is added to Anope.
---
<!--
Please fill in the template below. It will help us process your feature request a lot faster. If you have multiple features to request then please open one issue for each feature.
-->
**Description**
**Why this would be useful**
+4
View File
@@ -1 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Support forum
url: https://github.com/orgs/anope/discussions/categories/support
about: Please ask support questions here.
+13
View File
@@ -24,3 +24,16 @@ I have tested this pull request on:
**Operating system name and version:** <!-- e.g. Linux 3.11 -->
**Compiler name and version:** <!-- e.g. GCC 4.2.0 -->
## Checks
<!--
Tick the boxes for the checks you have made.
-->
I have ensured that:
- [ ] The code I am submitting is my own work and/or I have permission from the author to share it.
- [ ] Generative AI (Copilot, ChatGPT, etc) was not used to create any part of this pull request.
- [ ] I have documented any features added by this pull request.
- [ ] This pull request does not introduce any incompatible API changes (stable branches only, delete if not applicable).
+19
View File
@@ -0,0 +1,19 @@
# Security Policy
## Supported Versions
Currently the 2.0 (stable) branch is actively receiving security fixes.
The 2.1 (development) branch is still early in development and currently only receives security fixes when they are synced from the 2.0 branch.
Version | Supported
------- | ---------
2.1.x | :warning:
2.0.x | :white_check_mark:
1.8.x | :x:
## Reporting a Vulnerability
Please do not report security vulnerabilities on GitHub. Instead, email the details to team@anope.org or get the attention of a developer in our development IRC channel at irc.teranova.net #anope-devel and PM them the details.
We will triage your issue as soon as possible and try to release a fixed version within a week of receiving your report.
+1
View File
@@ -4,3 +4,4 @@ updates:
directory: /
schedule:
interval: monthly
target-branch: "2.1"
+59
View File
@@ -0,0 +1,59 @@
name: Alpine CI
on:
pull_request:
push:
schedule:
- cron: '0 0 * * 0'
jobs:
build:
if: "!contains(github.event.head_commit.message, '[skip alpine ci]')"
container: alpine:edge
runs-on: ubuntu-latest
env:
CXX: ${{ matrix.compiler }}
CXXFLAGS: -Werror
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
apk update
apk add \
argon2-dev \
clang \
cmake \
g++ \
gettext \
git \
gnutls-dev \
mariadb-dev \
openldap-dev \
openssl-dev \
pcre2-dev \
samurai \
sqlite-dev \
tre-dev
- name: Enable extras
run: |
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
do
ln -s $PWD/modules/extra/$MODULE.cpp $PWD/modules
done
- name: Run CMake
run: |
mkdir build && cd build
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=DEBUG -DINSTDIR:STRING=$(readlink -f ../run) ..
- name: Build Anope
run: |
ninja -C build install
strategy:
fail-fast: false
matrix:
compiler:
- clang++
- g++
+12 -4
View File
@@ -1,22 +1,26 @@
name: Linux CI
name: Ubuntu CI
on:
- pull_request
- push
jobs:
build:
runs-on: ubuntu-20.04
if: "!contains(github.event.head_commit.message, '[skip ubuntu ci]')"
runs-on: ubuntu-24.04
env:
CXX: ${{ matrix.compiler }}
CXXFLAGS: -Werror
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update --assume-yes
sudo apt-get install --assume-yes --no-install-recommends \
clang \
g++ \
gettext \
git \
libargon2-dev \
libgnutls28-dev \
libldap2-dev \
libmysqlclient-dev \
@@ -25,19 +29,23 @@ jobs:
libssl-dev \
libtre-dev \
ninja-build
- name: Enable extras
run: |
for MODULE in m_ldap.cpp m_ldap_authentication.cpp m_ldap_oper.cpp m_mysql.cpp m_regex_pcre2.cpp m_regex_posix.cpp m_regex_tre.cpp m_sql_authentication.cpp m_sql_log.cpp m_sql_oper.cpp m_sqlite.cpp m_ssl_gnutls.cpp m_ssl_openssl.cpp stats
for MODULE in enc_argon2 enc_posix ldap mysql regex_pcre2 regex_posix regex_tre sqlite ssl_gnutls ssl_openssl
do
ln -s ${{ github.workspace }}/modules/extra/$MODULE ${{ github.workspace }}/modules
ln -s ${{ github.workspace }}/modules/extra/$MODULE.cpp ${{ github.workspace }}/modules
done
- name: Run CMake
run: |
mkdir build && cd build
cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=DEBUG -DINSTDIR:STRING=${{ github.workspace }}/run ..
- name: Build Anope
run: |
ninja -C ${{ github.workspace }}/build install
strategy:
fail-fast: false
matrix:
+40 -6
View File
@@ -2,33 +2,67 @@ name: Windows CI
on:
pull_request:
push:
release:
types:
- published
schedule:
- cron: '0 0 * * 0'
jobs:
build:
runs-on: windows-2019
if: "!contains(github.event.head_commit.message, '[skip windows ci]')"
runs-on: windows-2025
env:
BUILD_TYPE: ${{ github.event_name == 'release' && 'Release' || 'Debug' }}
CONAN_USER_HOME: ${{ github.workspace }}/win/build
CONAN_USER_HOME_SHORT: None
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Setup NSIS
run: |-
choco install nsis
- name: Setup MSBuild
uses: microsoft/setup-msbuild@v1.3
uses: microsoft/setup-msbuild@v2
- name: Setup Conan
uses: turtlebrowser/get-conan@v1.2
with:
version: 1.59.0
version: 1.66.0
- name: Try to restore libraries from the cache
uses: actions/cache/restore@v4
id: library-cache
with:
key: conan-${{ hashFiles('src/win32/conanfile.txt') }}
path: ${{ env.CONAN_USER_HOME }}/.conan
- name: Install libraries
run: |
conan install ${{ github.workspace }}\src\win32 --build=missing
- name: Save libraries to the cache
if: ${{ steps.library-cache.outputs.cache-hit != 'true' }}
uses: actions/cache/save@v4
with:
key: ${{ steps.library-cache.outputs.cache-primary-key }}
path: ${{ env.CONAN_USER_HOME }}/.conan
- name: Run CMake
run: |
mkdir ${{ github.workspace }}\build
cd ${{ github.workspace }}\build
cmake -A "x64" -G "Visual Studio 16 2019" ..
cmake -A x64 -D "CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }}" -G "Visual Studio 17 2022" ..
- name: Build Anope
working-directory: ${{ github.workspace }}\build
run: |
msbuild PACKAGE.vcxproj /M:3 /P:Configuration=Release /P:Platform=x64 /VERBOSITY:MINIMAL
msbuild PACKAGE.vcxproj /M:5 /P:Configuration=${{ env.BUILD_TYPE }} /P:Platform=x64 /VERBOSITY:MINIMAL
- name: Upload installer
if: "${{ github.event_name == 'release' }}"
working-directory: ${{ github.workspace }}\build
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload ${{ github.event.release.tag_name }} $(Get-ChildItem anope-*.exe)
+12 -14
View File
@@ -1,20 +1,18 @@
build/
config.cache
include/sysconf.h
modules/m_ldap.cpp
modules/m_ldap_authentication.cpp
modules/m_ldap_oper.cpp
modules/m_mysql.cpp
modules/m_regex_pcre.cpp
modules/m_regex_pcre2.cpp
modules/m_regex_posix.cpp
modules/m_regex_tre.cpp
modules/m_sql_authentication.cpp
modules/m_sql_log.cpp
modules/m_sql_oper.cpp
modules/m_sqlite.cpp
modules/m_ssl_gnutls.cpp
modules/m_ssl_openssl.cpp
modules/enc_argon2.cpp
modules/enc_posix.cpp
modules/ldap.cpp
modules/mysql.cpp
modules/regex_pcre2.cpp
modules/regex_posix.cpp
modules/regex_tre.cpp
modules/sqlite.cpp
modules/ssl_gnutls.cpp
modules/ssl_openssl.cpp
modules/stats
modules/xmlrpc.cpp
run/
*.mo
*.pot
+13 -3
View File
@@ -12,39 +12,49 @@ Charles Kingsley <chaz@anope.org>
Charles Kingsley <chaz@anope.org> <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>
Cronus <cronus@nite-serv.com>
Daniel Engel <dane@zero.org> <dane dane@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
David Robson <rob@anope.org> <robbeh@5417fbe8-f217-4b02-8779-1006273d7864>
David Robson <rob@anope.org> <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
David Robson <rob@anope.org> <robbeh@5417fbe8-f217-4b02-8779-1006273d7864>
Dennis Friis <peavey@inspircd.org> <peavey peavey@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
Dragone2 <dragone2@risposteinformatiche.it> <davide.paolini8@gmail.com>
Fabio Scotoni <cculex@gmail.com>
Filippo Cortigiani <simos@simosnap.org> <devel@devel.crtnet.it>
Filippo Cortigiani <simos@simosnap.org> <simos@H7-25.fritz.box>
Florian Schulze <certus@anope.org> <certus certus@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
Gabriel Acevedo H. <drstein@anope.org> <drstein drstein@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
Harakiri <harakiri@overstack.fr>
Hendrik Jäger <gitcommit@henk.geekmail.org> <github@henk.geekmail.org>
Jan Milants <viper@anope.org>
Jan Milants <viper@anope.org> <jantje_85@5417fbe8-f217-4b02-8779-1006273d7864>
Jan Milants <viper@anope.org> <viper viper@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
Jens Voss <dukepyrolator@anope.org> <anope@s15355730.onlinehome-server.info>
Jens Voss <dukepyrolator@anope.org> <DukePyrolator@5417fbe8-f217-4b02-8779-1006273d7864>
Jens Voss <dukepyrolator@anope.org> <DukePyrolator@anope.org>
Jens Voss <dukepyrolator@anope.org> Jens Voß <jens@pyrobook.(none)>
Jens Voss <dukepyrolator@anope.org> <jens@pyrobook.(none)>
k4be <k4be@pirc.pl> <34816207+k4bek4be@users.noreply.github.com>
Lee Holmes <lethality@anope.org>
Lee Holmes <lethality@anope.org> <lee@lethality.me.uk>
Mark Summers <mark@goopler.net> <mark mark@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
Matt Schatz <genius3000@g3k.solutions>
Matt Ullman <matt@airraidsirens.com> <blindsight@gamesurge.net>
Michael Hazell <michaelhazell@hotmail.com> <Techman-@users.noreply.github.com>
Michael Stapelberg <michael@robustirc.net> <stapelberg@users.noreply.github.com>
Michael Wobst <wobst.michael@web.de>
Michael Wobst <wobst.michael@web.de> <michael@static.163.129.251.148.clients.your-server.de>
Michael Wobst <wobst.michael@web.de> <michael@wobst.at>
Naram Qashat <cyberbotx@anope.org> <cyberbotx@5417fbe8-f217-4b02-8779-1006273d7864>
Naram Qashat <cyberbotx@anope.org> <cyberbotx@cyberbotx.com>
Naram Qashat <cyberbotx@anope.org> <Naram Qashat cyberbotx@cyberbotx.com@5417fbe8-f217-4b02-8779-1006273d7864>
PeGaSuS <droider.pc@gmail.com>
PeGaSuS <droider.pc@gmail.com> <25697531+TehPeGaSuS@users.noreply.github.com>
Pieter Bootsma <geniusdex@anope.org> <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
Robby <robby@chatbelgie.be> <robby@anope.org>
Robby <robby@chatbelgie.be> <robby@chat.be>
Robert Scheck <robert@fedoraproject.org> <robert-scheck@users.noreply.github.com>
Robin Burchell <w00t@inspircd.org> <rburchell@5417fbe8-f217-4b02-8779-1006273d7864>
Robin Burchell <w00t@inspircd.org> <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>
Sadie Powell <sadie@witchery.services> Peter Powell <petpow@saberuk.com>
Sadie Powell <sadie@witchery.services> <petpow@saberuk.com>
Sebastian Barfurth <github@afreshmelon.com>
Sebastian V. <hal9000@denorastats.org>
Sebastian V. <hal9000@denorastats.org> <pimpmylinux@5417fbe8-f217-4b02-8779-1006273d7864>
Trystan S. Lee <trystan@nomadirc.net> <trystan trystan@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>
Val Lorentz <progval+git@progval.net> <progval+git@progval.net>
+37 -68
View File
@@ -1,5 +1,5 @@
# This usage of CMake requires at least version 3.8
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
# This usage of CMake requires at least version 3.20
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
# Set the project as C++ primarily, but have C enabled for the checks required later
project(Anope CXX)
@@ -22,18 +22,17 @@ set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Put modules in their own folder
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# If we are using a GNU compiler (have to use CXX because it seems to fail on C), we will be able to determine it's default paths for libraries and includes
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang$")
# First look for the compiler's default library directories
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs OUTPUT_VARIABLE LINES OUTPUT_STRIP_TRAILING_WHITESPACE)
# Find only the part after "libraries: "
string(REGEX REPLACE ".*\nlibraries: (.*)$" "\\1" LINE "${LINES}")
# Replace the colons in the list with semicolons (only when not on MinGW, which uses semicolons already), and if on MinGW, just copy the line
if(NOT MINGW)
string(REGEX REPLACE ":" ";" LIBRARIES ${LINE})
else()
set(LIBRARIES "${LINE}")
endif()
# Replace the colons in the list with semicolons
string(REGEX REPLACE ":" ";" LIBRARIES ${LINE})
# Iterate through the libraries
foreach(LIBRARY ${LIBRARIES})
# Check if the first character is an equal sign, and skip that library directory as it is (I believe) the primary default and shows up later in the list anyways
@@ -103,13 +102,6 @@ if(NOT MSVC)
endif()
endif()
# If running under MinGW, we have to force the resource compiler settings (hopefully this will be fixed in a later version of CMake)
if(MINGW)
set(CMAKE_RC_COMPILER_INIT windres)
enable_language(RC)
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
endif()
# Include the checking functions used later in this CMakeLists.txt
include(CheckFunctionExists)
include(CheckTypeSize)
@@ -150,11 +142,6 @@ include_directories(
${Anope_SOURCE_DIR}/vendor
)
# Pass on REPRODUCIBLE_BUILD
if(REPRODUCIBLE_BUILD)
add_definitions(-DREPRODUCIBLE_BUILD)
endif()
if(WIN32)
# If using Windows, include the windows specific folder for anope_windows.h
include_directories(${Anope_SOURCE_DIR}/src/win32)
@@ -167,12 +154,12 @@ if(MSVC)
string(REPLACE "/GX " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(REPLACE "/W3 " "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
# Set the compile flags to have warnings on the max setting (but disable a few annoying ones), exception handling turned on, the proper defines
set(CXXFLAGS "${CXXFLAGS} /W4 /wd4100 /wd4127 /wd4250 /wd4251 /wd4355 /wd4706 /wd4800 /wd4996 /EHs")
set(CXXFLAGS "${CXXFLAGS} /W4 /wd4100 /wd4127 /wd4250 /wd4251 /wd4267 /wd4275 /wd4355 /wd4706 /wd4800 /wd4996 /EHs")
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
# Otherwise, we're not using Visual Studio
else()
# Set the compile flags to have all warnings on (including shadowed variables)
set(CXXFLAGS "${CXXFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -Wpedantic -Wno-unused-parameter ${CMAKE_CXX_FLAGS}")
set(CXXFLAGS "${CXXFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wextra -Wformat=2 -Wmissing-format-attribute -Wpedantic -Wno-format-nonliteral -Wno-format-zero-length -Wno-unused-parameter ${CMAKE_CXX_FLAGS}")
endif()
# If CMake has found that the given system requires a special library for dl* calls, include it with the linker flags
@@ -180,9 +167,10 @@ if(CMAKE_DL_LIBS)
list(APPEND LINK_LIBS ${CMAKE_DL_LIBS})
endif()
# Under MinGW, the -shared flag isn't properly set in the module-specific linker flags, add it from the C flags for shared libraries
if(MINGW)
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}")
# Find the linker flags required for using threads.
find_package("Threads" REQUIRED)
if(CMAKE_THREAD_LIBS_INIT)
list(APPEND LINK_LIBS ${CMAKE_THREAD_LIBS_INIT})
endif()
if(NOT PROGRAM_NAME)
@@ -197,29 +185,6 @@ if(NOT MSVC)
if(HAVE_PIPE_FLAG)
set(CXXFLAGS "${CXXFLAGS} -pipe")
endif()
# The following are additional library checks, they are not required for Windows
if(NOT WIN32)
# Check if socket is within the socket library (if the library exists), and add it to the linker flags if needed
check_library_exists(socket socket "" HAVE_SOCKET_LIB)
if(HAVE_SOCKET_LIB)
list(APPEND LINK_LIBS socket)
endif()
# Check if inet_addr is within the nsl library (if the library exists), and add it to the linker flags if needed
check_library_exists(nsl inet_addr "" HAVE_NSL_LIB)
if(HAVE_NSL_LIB)
list(APPEND LINK_LIBS nsl)
endif()
# Check if pthread_create is within the pthread library (if the library exists), and add it to the linker flags if needed
check_library_exists(pthread pthread_create "" HAVE_PTHREAD)
if(HAVE_PTHREAD)
if(NOT APPLE)
set(LDFLAGS "${LDFLAGS} -pthread")
endif()
else()
message(FATAL_ERROR "The pthread library is required to build Anope")
endif()
endif()
endif()
# If DEFUMASK wasn't passed to CMake, set a default depending on if RUNGROUP was passed in or not
@@ -238,6 +203,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINF
endif()
# Check for the existence of the following functions
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
check_function_exists(umask HAVE_UMASK)
check_function_exists(epoll_wait HAVE_EPOLL)
check_function_exists(poll HAVE_POLL)
@@ -269,8 +235,8 @@ endif()
if(NOT BIN_DIR)
set(BIN_DIR "bin")
endif()
if(NOT DB_DIR)
set(DB_DIR "data")
if(NOT DATA_DIR)
set(DATA_DIR "data")
endif()
if(NOT DOC_DIR)
set(DOC_DIR "doc")
@@ -278,14 +244,14 @@ endif()
if(NOT CONF_DIR)
set(CONF_DIR "conf")
endif()
if(NOT LIB_DIR)
set(LIB_DIR "lib")
if(NOT MODULE_DIR)
set(MODULE_DIR "modules")
endif()
if(NOT LOCALE_DIR)
set(LOCALE_DIR "locale")
endif()
if(NOT LOGS_DIR)
set(LOGS_DIR "logs")
if(NOT LOG_DIR)
set(LOG_DIR "logs")
endif()
# Version number processing
@@ -350,28 +316,22 @@ if(${Anope_SOURCE_DIR} STREQUAL ${Anope_BINARY_DIR})
endif()
endif()
# Go into the following directories and run their CMakeLists.txt as well
add_subdirectory(data)
add_subdirectory(docs)
add_subdirectory(language)
add_subdirectory(src)
add_subdirectory(modules)
add_subdirectory(include)
# Get the filename of the Anope binary, to use later
set(SERVICES_BINARY "$<TARGET_FILE:${PROGRAM_NAME}>")
get_filename_component(SERVICES_BINARY ${SERVICES_BINARY} NAME)
# At install time, create the following additional directories
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DB_DIR}/backups\")")
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${LOGS_DIR}\")")
get_filename_component(ABSOLUTE_DATA_DIR ${DATA_DIR} REALPATH BASE_DIR ${CMAKE_INSTALL_PREFIX})
get_filename_component(ABSOLUTE_LOG_DIR ${LOG_DIR} REALPATH BASE_DIR ${CMAKE_INSTALL_PREFIX})
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
if(WIN32)
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DB_DIR}/runtime\")")
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/runtime\")")
endif()
# On non-Windows platforms, if RUNGROUP is set, change the permissions of the below directories, as well as the group of the data directory
if(NOT WIN32 AND RUNGROUP)
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${DB_DIR}/backups\")")
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${LOGS_DIR}\")")
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}${ABSOLUTE_DATA_DIR}/backups\")")
install(CODE "execute_process(COMMAND ${CHMOD} 2775 \"\$ENV{DESTDIR}${ABSOLUTE_LOG_DIR}\")")
install(CODE "execute_process(COMMAND ${CHGRP} -R ${RUNGROUP} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\")")
endif()
# On Windows platforms, install extra files
@@ -381,7 +341,8 @@ if(WIN32)
)
endif()
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${LIB_DIR}/modules\")")
get_filename_component(ABSOLUTE_MODULE_DIR ${MODULE_DIR} REALPATH BASE_DIR ${CMAKE_INSTALL_PREFIX})
install(CODE "file(REMOVE_RECURSE \"$ENV{DESTDIR}${ABSOLUTE_MODULE_DIR}\")")
# Only process the CPack section if we have CPack
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
@@ -427,3 +388,11 @@ if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
set(CPACK_MONOLITHIC_INSTALL TRUE)
include(CPack)
endif()
# Go into the following directories and run their CMakeLists.txt as well
add_subdirectory(data)
add_subdirectory(docs)
add_subdirectory(language)
add_subdirectory(src)
add_subdirectory(modules)
add_subdirectory(include)
+51 -55
View File
@@ -2,7 +2,7 @@
#
# Configuration script for Anope.
#
# Anope (C) 2003-2023 Anope Team
# Anope (C) 2003-2025 Anope Team
# Contact us at team@anope.org
#
# This program is free but copyrighted software; see the file COPYING for
@@ -13,18 +13,6 @@
#
###########################################################################
echo2 () {
$ECHO2 "$*$ECHO2SUF" # these are defined later
}
exists () { # because some shells don't have test -e
if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
return 0
else
return 1
fi
}
Load_Cache () {
if [ -f $SOURCE_DIR/config.cache -a -r $SOURCE_DIR/config.cache -a ! "$IGNORE_CACHE" ] ; then
echo "Using defaults from config.cache. To ignore, $SOURCE_DIR/Config -nocache"
@@ -42,7 +30,6 @@ Run_Build_System () {
WITH_PERM=""
EXTRA_INCLUDE=""
EXTRA_LIBS=""
GEN_TYPE=""
if [ "$INSTDIR" != "" ] ; then
WITH_INST="-DINSTDIR:STRING=$INSTDIR"
@@ -70,45 +57,25 @@ Run_Build_System () {
EXTRA_LIBS="-DEXTRA_LIBS:STRING=$EXTRA_LIB_DIRS"
fi
if [ "$SOURCE_DIR" = "." ] ; then
pwdsave=`pwd`
test -d build || mkdir build
cd "build"
REAL_SOURCE_DIR=".."
else
REAL_SOURCE_DIR="$SOURCE_DIR"
fi
BUILD_PATHS="-B ${SOURCE_DIR}/build ${SOURCE_DIR}"
echo "cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR"
CMAKE="cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $BUILD_PATHS"
echo $CMAKE
$CMAKE
cmake $GEN_TYPE $WITH_INST $WITH_RUN $WITH_PERM $BUILD_TYPE $EXTRA_INCLUDE $EXTRA_LIBS $EXTRA_CONFIG_ARGS $REAL_SOURCE_DIR
if [ $? -ne 0 ]; then
echo "You should fix these issues and then run ./Config -quick to rerun CMake."
exit 1
fi
echo ""
if [ "$SOURCE_DIR" = "." ] ; then
echo "Now cd build, then run make to build Anope."
cd "$pwdsave"
else
if [ "$PWD" = "${SOURCE_DIR}/build" ]; then
echo "Now run make to build Anope."
else
echo "Now cd build, then run make to build Anope."
fi
}
ECHO2SUF=''
if [ "`echo -n a ; echo -n b`" = "ab" ] ; then
ECHO2='echo -n'
elif [ "`echo 'a\c' ; echo 'b\c'`" = "ab" ] ; then
ECHO2='echo' ; ECHO2SUF='\c'
elif [ "`printf 'a' 2>&1 ; printf 'b' 2>&1`" = "ab" ] ; then
ECHO2='printf "%s"'
else
# oh well...
ECHO2='echo'
fi
export ECHO2 ECHO2SUF
###########################################################################
# Init values
###########################################################################
@@ -121,7 +88,7 @@ EXTRA_INCLUDE_DIRS=
EXTRA_LIB_DIRS=
EXTRA_CONFIG_ARGS=
CAN_QUICK="no"
SOURCE_DIR=`dirname $0`
SOURCE_DIR="$(cd "$(dirname "$0")" && pwd)"
###########################################################################
# Check out the options
@@ -138,7 +105,8 @@ while [ $# -ge 1 ] ; do
exit 0
elif [ $1 = "-devel" ] ; then
DEBUG="yes"
INSTDIR="$PWD/run"
DEVEL="yes"
INSTDIR="$SOURCE_DIR/run"
elif [ $1 = "-nocache" ] ; then
IGNORE_CACHE="1"
elif [ $1 = "-nointro" ] ; then
@@ -163,7 +131,7 @@ done
cmake --version 2>&1 > /dev/null
if [ $? -ne 0 ] ; then
clear
echo "Anope requires CMake 3.8 or newer, which can be downloaded at https://cmake.org/ or through your system's package manager."
echo "Anope requires CMake 3.20 or newer, which can be downloaded at https://cmake.org/ or through your system's package manager."
echo "If you have installed CMake already, ensure it is in your PATH environment variable."
exit 0
fi
@@ -196,20 +164,47 @@ export ok INPUT
####
TEMP_YN="n"
if [ "$DEVEL" = "yes" ] ; then
TEMP_YN="y"
fi
echo "You are building the 2.1 development branch. This branch is not as well tested"
echo "as the 2.0 stable branch and may have compatibility breaks without notice. Are"
echo "you sure you want to use this version?"
echo -n "[$TEMP_YN] "
read YN
if [ "$YN" ] ; then
if [ "$YN" = "y" ] ; then
DEVEL="yes"
else
DEVEL="no"
fi
fi
echo ""
if [ "$DEVEL" != "yes" ] ; then
echo "If you are building from Git you can run \`git checkout 2.0\` to get the latest"
echo "stable code. Otherwise, you can download the latest 2.0 release tarball from"
echo "https://github.com/anope/anope/releases/latest"
exit 1
fi
####
ok=0
echo "In what directory should Anope be installed?"
while [ $ok -eq 0 ] ; do
echo2 "[$INSTDIR] "
echo -n "[$INSTDIR] "
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
if [ ! "$INPUT" ] ; then
INPUT=$INSTDIR
fi
if [ ! -d "$INPUT" ] ; then
if exists "$INPUT" ; then
if [ -e "$INPUT" ]; then
echo "$INPUT exists, but is not a directory!"
else
echo "$INPUT does not exist. Create it?"
echo2 "[y] "
echo -n "[y] "
read YN
if [ "$YN" != "n" ] ; then
if mkdir -p $INPUT ; then
@@ -217,7 +212,7 @@ while [ $ok -eq 0 ] ; do
fi
fi
fi
elif exists "$INPUT/include/services.h" ; then
elif [ -e "$INPUT/include/services.h" ]; then
echo "You cannot use the Anope source directory as a target directory."
else
ok=1
@@ -238,7 +233,7 @@ else
echo "should not force files to be owned by a particular group, just press"
echo "Return.)"
fi
echo2 "[$RUNGROUP] "
echo -n "[$RUNGROUP] "
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
if [ "$INPUT" ] ; then
if [ "$INPUT" = "none" ] ; then
@@ -263,7 +258,7 @@ ok=0
echo "What should the default umask for data files be (in octal)?"
echo "(077 = only accessible by owner; 007 = accessible by owner and group)"
while [ $ok -eq 0 ] ; do
echo2 "[$UMASK] "
echo -n "[$UMASK] "
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
if [ ! "$INPUT" ] ; then
INPUT=$UMASK
@@ -287,7 +282,7 @@ if [ "$DEBUG" = "yes" ] ; then
TEMP_YN="y"
fi
echo "Would you like to build a debug version of Anope?"
echo2 "[$TEMP_YN] "
echo -n "[$TEMP_YN] "
read YN
if [ "$YN" ] ; then
if [ "$YN" = "y" ] ; then
@@ -305,7 +300,7 @@ echo "You may only need to do this if CMake is unable to locate"
echo "missing dependencies without hints."
echo "Separate directories with semicolons."
echo "If you need no extra include directories, enter NONE in all caps."
echo2 "[$EXTRA_INCLUDE_DIRS] "
echo -n "[$EXTRA_INCLUDE_DIRS] "
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
if [ "$INPUT" ] ; then
if [ "$INPUT" = "NONE" ] ; then
@@ -323,7 +318,7 @@ echo "You may only need to do this if CMake is unable to locate"
echo "missing dependencies without hints."
echo "Separate directories with semicolons."
echo "If you need no extra library directories, enter NONE in all caps."
echo2 "[$EXTRA_LIB_DIRS] "
echo -n "[$EXTRA_LIB_DIRS] "
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
if [ "$INPUT" ] ; then
if [ "$INPUT" = "NONE" ] ; then
@@ -338,7 +333,7 @@ echo ""
echo "Are there any extra arguments you wish to pass to CMake?"
echo "If you need no extra arguments to CMake, enter NONE in all caps."
echo2 "[$EXTRA_CONFIG_ARGS] "
echo -n "[$EXTRA_CONFIG_ARGS] "
if read INPUT ; then : ; else echo "" ; exit 1 ; fi
if [ "$INPUT" ] ; then
if [ "$INPUT" = "NONE" ] ; then
@@ -355,13 +350,14 @@ echo ""
# Store values
################################################################################
echo2 "Saving configuration results in config.cache... "
echo -n "Saving configuration results in config.cache... "
cat <<EOT >$SOURCE_DIR/config.cache
INSTDIR="$INSTDIR"
RUNGROUP="$RUNGROUP"
UMASK=$UMASK
DEBUG="$DEBUG"
DEVEL="$DEVEL"
EXTRA_INCLUDE_DIRS="$EXTRA_INCLUDE_DIRS"
EXTRA_LIB_DIRS="$EXTRA_LIB_DIRS"
EXTRA_CONFIG_ARGS="$EXTRA_CONFIG_ARGS"
+2 -2
View File
@@ -4,7 +4,7 @@ Anope is an open source set of IRC services. It is highly modular, with a vast n
* [Website](https://anope.org)
* [GitHub](https://github.com/anope)
* IRC \#anope on irc.anope.org
* IRC \#anope on irc.teranova.net
## Installation
@@ -33,7 +33,7 @@ Copy conf/anope.example.conf to conf/anope.conf
$ cp conf/anope.example.conf conf/anope.conf
```
Edit anope.conf, configuring the uplink, serverinfo, and protocol module configurations. Example link blocks for popular IRCds are included in the anope.example.conf documentation. The [Anope wiki](https://wiki.anope.org) is also a good source of information. Our support channel is located at #anope on [irc.anope.org](irc://irc.anope.org/#anope).
Edit anope.conf, configuring the uplink, serverinfo, and protocol module configurations. Example link blocks for popular IRCds are included in the the example.conf documentation. The [Anope wiki](https://wiki.anope.org) is also a good source of information. Our support channel is located at #anope on [irc.teranova.net](ircs://irc.teranova.net/anope).
Note that the example configuration file includes other example configuration files. If you want to modify the other example configuration files, copy them (e.g. `modules.example.conf` to `modules.conf`) and modify the `include` directive in `anope.conf` to include the new file.
+2 -2
View File
@@ -1,6 +1,6 @@
# Only install example.chk and anope.example.conf from this directory
# Only install cron.example.sh and anope.example.conf from this directory
# NOTE: I would've had this just find all files in the directory, but that would include files not needed (like this file)
set(DATA example.chk anope.example.conf botserv.example.conf hostserv.example.conf modules.example.conf operserv.example.conf chanserv.example.conf global.example.conf memoserv.example.conf nickserv.example.conf chanstats.example.conf irc2sql.example.conf stats.standalone.example.conf)
set(DATA cron.example.sh anope.example.conf botserv.example.conf hostserv.example.conf modules.example.conf operserv.example.conf chanserv.example.conf global.example.conf memoserv.example.conf nickserv.example.conf chanstats.example.conf)
install(FILES ${DATA}
DESTINATION ${CONF_DIR}
)
+354 -235
View File
@@ -65,10 +65,6 @@
* will typically be disabled. If this is not the case, more
* information will be given in the documentation.
*
* [DISCOURAGED]
* Indicates a directive which may cause undesirable side effects if
* specified.
*
* [DEPRECATED]
* Indicates a directive which will disappear in a future version of
* Anope, usually because its functionality has been either
@@ -79,13 +75,16 @@
/*
* [OPTIONAL] Defines
*
* You can define values to other values, which can be used to easily change
* many values in the configuration at once.
* You can use defines for repeated information, which can be used to easily change many
* values in the configuration at once.
*
* To use a define called foo.bar you use ${foo.bar} in your config file. You can also use
* environment variables by prefixing their name with "env." like ${env.USER}.
*/
/*
* The services.host define is used in multiple different locations throughout the
* configuration for services clients hostnames.
* configuration for the server name and pseudoclient hostnames.
*/
define
{
@@ -211,7 +210,7 @@ serverinfo
* other server names on the rest of your IRC network. Note that it does not have
* to be an existing hostname, just one that isn't on your network already.
*/
name = "services.example.com"
name = "${services.host}"
/*
* The text which should appear as the server's information in /WHOIS and similar
@@ -238,15 +237,15 @@ serverinfo
/*
* The filename containing the Anope process ID. The path is relative to the
* services root directory.
* data directory.
*/
pid = "data/anope.pid"
pid = "anope.pid"
/*
* The filename containing the Message of the Day. The path is relative to the
* services root directory.
* config directory.
*/
motd = "conf/motd.txt"
motd = "motd.txt"
}
/*
@@ -256,7 +255,6 @@ serverinfo
* You MUST modify this to match the IRCd you run.
*
* Supported:
* - bahamut
* - hybrid
* - inspircd
* - ngircd
@@ -265,26 +263,7 @@ serverinfo
* - solanum
* - unrealircd
*/
module
{
name = "inspircd"
/*
* Some protocol modules can enforce mode locks server-side. This reduces the spam caused by
* services immediately reversing mode changes for locked modes.
*
* If the protocol module you have loaded does not support this, this setting will have no effect.
*/
use_server_side_mlock = yes
/*
* Some protocol modules can enforce topic locks server-side. This reduces the spam caused by
* services immediately reversing topic changes.
*
* If the protocol module you have loaded does not support this, this setting will have no effect.
*/
use_server_side_topiclock = yes
}
module { name = "inspircd" }
/*
* [REQUIRED] Network Information
@@ -302,30 +281,31 @@ networkinfo
/*
* Set this to the maximum allowed nick length on your network.
* Be sure to set this correctly, as setting this wrong can result in
* Anope being disconnected from the network.
* Anope being disconnected from the network. Defaults to 31.
*/
nicklen = 31
#nicklen = 31
/* Set this to the maximum allowed ident length on your network.
* Be sure to set this correctly, as setting this wrong can result in
* Anope being disconnected from the network.
* Anope being disconnected from the network. Defaults to 10.
*/
userlen = 10
#userlen = 10
/* Set this to the maximum allowed hostname length on your network.
* Be sure to set this correctly, as setting this wrong can result in
* Anope being disconnected from the network.
* Anope being disconnected from the network. Defaults to 64.
*/
hostlen = 64
#hostlen = 64
/* Set this to the maximum allowed channel length on your network.
* Defaults to 32.
*/
chanlen = 32
#chanlen = 32
/* The maximum number of list modes settable on a channel (such as b, e, I).
* Comment out or set to 0 to disable.
* Set to 0 to disable. Defaults to 100.
*/
modelistsize = 100
#modelistsize = 100
/*
* Characters allowed in nicknames. This always includes the characters described
@@ -341,29 +321,29 @@ networkinfo
* The characters allowed in hostnames. This is used for validating hostnames given
* to services, such as BotServ bot hostnames and user vhosts. Changing this is not
* recommended unless you know for sure your IRCd supports whatever characters you are
* wanting to use. Telling services to set a vHost containing characters your IRCd
* wanting to use. Telling services to set a vhost containing characters your IRCd
* disallows could potentially break the IRCd and/or Anope.
*
* It is recommended you DON'T change this.
*/
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-/"
/*
* If set to true, allows vHosts to not contain dots (.).
* If enabled, allows vhosts to not contain dots (.).
* Newer IRCds generally do not have a problem with this, but the same warning as
* vhost_chars applies.
*
* It is recommended you DON'T change this.
*/
allow_undotted_vhosts = false
allow_undotted_vhosts = no
/*
* The characters that are not allowed to be at the very beginning or very ending
* of a vHost. The same warning as vhost_chars applies.
* of a vhost. The same warning as vhost_chars applies.
*
* It is recommended you DON'T change this.
*/
disallow_start_or_end = ".-"
disallow_start_or_end = ".-/"
}
/*
@@ -394,19 +374,6 @@ options
*/
casemap = "ascii"
/*
* This key is used to initiate the random number generator. This number
* MUST be random as you want your passcodes to be random. Don't give this
* key to anyone! Keep it private!
*
* NOTE: If you don't uncomment this or keep the default values, any talented
* programmer would be able to easily "guess" random strings used to mask
* information. Be safe, and come up with a 7-digit number.
*
* This directive is optional, but highly recommended.
*/
#seed = 9866235
/*
* Sets the number of invalid password tries before services removes a user
* from the network. If a user enters a number of invalid passwords equal to
@@ -433,7 +400,7 @@ options
/*
* Sets the delay between automatic database updates.
*/
updatetimeout = 5m
updatetimeout = 2m
/*
* Sets the delay between checks for expired nicknames and channels.
@@ -445,12 +412,6 @@ options
*/
readtimeout = 5s
/*
* Sets the interval between sending warning messages for program errors via
* WALLOPS/GLOBOPS.
*/
warningtimeout = 4h
/*
* Sets the (maximum) frequency at which the timeout list is checked. This,
* combined with readtimeout above, determines how accurately timed events,
@@ -467,26 +428,11 @@ options
timeoutcheck = 3s
/*
* If set, this will allow users to let services send PRIVMSGs to them
* instead of NOTICEs. Also see the "msg" option of nickserv:defaults,
* which also toggles the default communication (PRIVMSG or NOTICE) to
* use for unregistered users.
*
* This is a feature that is against the IRC RFC and should be used ONLY
* if absolutely necessary.
*
* This directive is optional, and not recommended.
* If set Anope will tell users to use a server-side alias for messaging
* services instead of /msg. The alias for each service defaults to the
* bot name but can be configured in the service block.
*/
#useprivmsg = yes
/*
* If set, will force services to only respond to PRIVMSGs addresses to
* Nick@ServerName - e.g. NickServ@example.com. This should be used in
* conjunction with IRCd aliases. This directive is optional.
*
* This option will have no effect on some IRCds, such as TS6 IRCds.
*/
#usestrictprivmsg = yes
#servicealias = yes
/*
* If set, Anope will only show /stats o to IRC Operators. This directive
@@ -522,6 +468,32 @@ options
*/
hideregisteredcommands = yes
/*
* If set, the maximum difference between an invalid and valid command name to allow
* as a suggestion. Defaults to 4.
*/
didyoumeandifference = 4
/*
* The length of codes used for confirming actions like dropping a channel or a
* nickname.
*
* Defaults to 15 if not set.
*/
codelength = 15
/*
* If set, the maximum number of bytes after which to wrap services messages. This
* can be set a bit higher than the default but should be well under the maximum
* message length imposed by your IRC server or messages will end up truncated.
*
* NOTE: this currently only applies to tables but will be expanded to all messages
* in a later release.
*
* Defaults to 100 if not set.
*/
linelength = 100
/* The regex engine to use, as provided by the regex modules.
* Leave commented to disable regex matching.
*
@@ -536,7 +508,7 @@ options
*
* Removing .UTF-8 will instead use the default encoding for the language, e.g. iso-8859-1 for western European languages.
*/
languages = "ca_ES.UTF-8 de_DE.UTF-8 el_GR.UTF-8 es_ES.UTF-8 fr_FR.UTF-8 hu_HU.UTF-8 it_IT.UTF-8 nl_NL.UTF-8 pl_PL.UTF-8 pt_PT.UTF-8 ru_RU.UTF-8 tr_TR.UTF-8"
languages = "de_DE.UTF-8 el_GR.UTF-8 es_ES.UTF-8 fr_FR.UTF-8 it_IT.UTF-8 nl_NL.UTF-8 pl_PL.UTF-8 pt_PT.UTF-8 tr_TR.UTF-8"
/*
* Default language that non- and newly-registered nicks will receive messages in.
@@ -611,7 +583,7 @@ include
}
/*
* [OPTIONAL] NickServ
* [RECOMMENDED] NickServ
*
* Includes nickserv.example.conf, which is necessary for NickServ functionality.
*
@@ -748,7 +720,6 @@ log
* You may define groups of commands and privileges, as well as who may use them.
*
* This block is recommended, as without it you will be unable to access most oper commands.
* It replaces the old ServicesRoot directive amongst others.
*
* The command names below are defaults and are configured in the *serv.conf's. If you configure
* additional commands with permissions, such as commands from third party modules, the permissions
@@ -756,21 +727,25 @@ log
*
* Available privileges:
* botserv/administration - Can view and assign private BotServ bots
* botserv/fantasy - Can use fantasy commands without the FANTASIA privilege
* botserv/fantasy - Can use fantasy commands without the FANTASY privilege
* chanserv/administration - Can modify the settings of any channel (including changing of the owner!)
* chanserv/access/list - Can view channel access and akick lists, but not modify them
* chanserv/access/modify - Can modify channel access and akick lists, and use /chanserv enforce
* chanserv/auspex - Can see any information with /CHANSERV INFO
* chanserv/no-register-limit - May register an unlimited number of channels and nicknames
* chanserv/kick - Can kick and ban users from channels through ChanServ
* chanserv/drop/override - Allows dropping channels without using a confirmation code
* memoserv/info - Can see any information with /MEMOSERV INFO
* memoserv/set-limit - Can set the limit of max stored memos on any user and channel
* memoserv/no-limit - Can send memos through limits and throttles
* nickserv/access - Can modify other users access and certificate lists
* nickserv/alist - Can see the channel access list of other users
* nickserv/auspex - Can see any information with /NICKSERV INFO
* nickserv/confirm - Can confirm other users nicknames
* nickserv/cert - Can modify other users certificate lists
* nickserv/confirm/email - Can confirm other users email address change
* nickserv/confirm/register - Can confirm other users account registration
* nickserv/drop - Can drop other users nicks
* nickserv/drop/display - Allows dropping display nicks when preservedisplay is enabled
* nickserv/drop/override - Allows dropping nicks without using a confirmation code
* nickserv/recover - Can recover other users nicks
* operserv/config - Can modify services's configuration
* operserv/oper/modify - Can add and remove operators with at most the same privileges
@@ -789,14 +764,14 @@ log
*
* nickserv/getemail nickserv/suspend nickserv/ajoin nickserv/list
*
* nickserv/saset/autoop nickserv/saset/email nickserv/saset/greet nickserv/saset/password
* nickserv/saset/display nickserv/saset/kill nickserv/saset/language nickserv/saset/message
* nickserv/saset/private nickserv/saset/secure nickserv/saset/url nickserv/saset/noexpire
* nickserv/saset/keepmodes nickserv/saset/neverop
* nickserv/saset/autoop nickserv/saset/display nickserv/saset/email nickserv/saset/greet
* nickserv/saset/keepmodes nickserv/saset/language nickserv/saset/message nickserv/saset/neverop
* nickserv/saset/noexpire nickserv/saset/password nickserv/saset/private nickserv/saset/protect
* nickserv/saset/url
*
* hostserv/set hostserv/del hostserv/list
*
* global/global
* global/global global/queue global/server
*
* operserv/news operserv/stats operserv/kick operserv/exception operserv/seen
* operserv/mode operserv/session operserv/modinfo operserv/ignore operserv/chanlist
@@ -839,15 +814,13 @@ opertype
commands = "chanserv/list chanserv/suspend chanserv/topic memoserv/staff nickserv/list nickserv/suspend operserv/mode operserv/chankill operserv/akill operserv/session operserv/modinfo operserv/sqline operserv/oper operserv/kick operserv/ignore operserv/snline"
/* What privs (see above) this opertype has */
privs = "chanserv/auspex chanserv/no-register-limit memoserv/* nickserv/auspex nickserv/confirm"
privs = "chanserv/auspex chanserv/no-register-limit memoserv/* nickserv/auspex nickserv/confirm/*"
/*
* Modes to be set on users when they identify to accounts linked to this opertype.
*
* This can be used to automatically oper users who identify for services operator accounts, and is
* useful for setting modes such as Plexus's user mode +N.
*
* Note that some IRCds, such as InspIRCd, do not allow directly setting +o, and this will not work.
*/
#modes = "+o"
}
@@ -898,14 +871,24 @@ opertype
/* An optional password. If defined, the user must login using "/OPERSERV LOGIN" first */
#password = "secret"
/*
* The algorithm which the above password is hashed with. If this is not set then services will
* assume the above password is not hashed.
*
* You will need to have the appropriate encryption module (e.g. enc_bcrypt) loaded in order
* for this to work.
*
*/
#password_hash = "bcrypt"
/* An optional SSL fingerprint. If defined, it's required to be able to use this opertype. */
#certfp = "ed3383b3f7d74e89433ddaa4a6e5b2d7"
/* An optional list of user@host masks. If defined the user must be connected from one of them */
#host = "*@*.anope.org ident@*"
/* An optional vHost to set on users who identify for this oper block.
* This will override HostServ vHosts, and may not be available on all IRCds
/* An optional vhost to set on users who identify for this oper block.
* This will override HostServ vhosts, and may not be available on all IRCds
*/
#vhost = "oper.mynet"
}
@@ -925,7 +908,7 @@ opertype
/*
* [OPTIONAL] Mail Config
*
* This section contains settings related to the use of e-mail from services.
* This section contains settings related to the use of email from services.
* If the usemail directive is set to yes, unless specified otherwise, all other
* directives are required.
*
@@ -939,36 +922,38 @@ mail
* If set, this option enables the mail commands in Anope. You may choose
* to disable it if you have no Sendmail-compatible mailer installed. Whilst
* this directive (and entire block) is optional, it is required if
* nickserv:registration is set to yes.
* nickserv:registration is set to mail.
*/
usemail = yes
/*
* This is the command-line that will be used to call the mailer to send an
* e-mail. It must be called with all the parameters needed to make it
* scan the mail input to find the mail recipient; consult your mailer
* documentation.
* The command used for sending emails. It is assumed that this behaves like
* sendmail (i.e. it reads the email from the standard input stream) but you
* should probably use Postfix or some other sendmail-compatible emailer
* instead of sendmail as sendmail is very hard to configure correctly. If
* you are using Windows then https://www.glob.com.au/sendmail/ is probably
* the best option currently.
*
* Postfix users must use the compatible sendmail utility provided with
* it. This one usually needs no parameters on the command-line. Most
* sendmail applications (or replacements of it) require the -t option
* to be used.
*
* If you are running on Windows you should use a Windows sendmail port
* like https://www.glob.com.au/sendmail/ for sending emails.
* If your emailer sends emails directly from the services host you will
* need to configure DKIM, DMARC, and SPF to avoid email hosts from marking
* your services emails as spam. It is important that you do this *BEFORE*
* sending emails for the first time as some email providers will add your
* host to a DNSBL like Spamhaus if they consider your emails to be spam. If
* this is too difficult then you may want to consider sending emails via an
* external email provider using a forwarder like msmtp.
*/
sendmailpath = "/usr/sbin/sendmail -t"
#sendmailpath = "/usr/sbin/sendmail -it"
/*
* This is the e-mail address from which all the e-mails are to be sent from.
* This is the email address from which all the emails are to be sent from.
* It should really exist.
*/
sendfrom = "services@example.com"
/*
* This controls the minimum amount of time a user must wait before sending
* another e-mail after they have sent one. It also controls the minimum time
* a user must wait before they can receive another e-mail.
* another email after they have sent one. It also controls the minimum time
* a user must wait before they can receive another email.
*
* This feature prevents users from being mail bombed using services and
* it is highly recommended that it be used.
@@ -979,10 +964,10 @@ mail
/*
* If set, Anope will not put quotes around the TO: fields
* in e-mails.
* in emails.
*
* This directive is optional, and as far as we know, it's only needed
* if you are using ESMTP or QMail to send out e-mails.
* if you are using ESMTP or QMail to send out emails.
*/
#dontquoteaddresses = yes
@@ -998,76 +983,76 @@ mail
* The subject and message of emails sent to users when they register accounts.
*
* Available tokens for this template are:
* %n - Gets replaced with the nickname
* %N - Gets replaced with the network name
* %c - Gets replaced with the confirmation code
* {nick} - Gets replaced with the nickname
* {network} - Gets replaced with the network name
* {code} - Gets replaced with the confirmation code
*/
registration_subject = "Nickname registration for %n"
registration_subject = "Nickname registration for {nick}"
registration_message = "Hi,
You have requested to register the nickname %n on %N.
Please type \" /msg NickServ CONFIRM %c \" to complete registration.
You have requested to register the nickname {nick} on {network}.
Please type \" /msg NickServ CONFIRM REGISTER {code} \" to complete registration.
If you don't know why this mail was sent to you, please ignore it silently.
%N administrators."
{network} administrators."
/*
* The subject and message of emails sent to users when they request a new password.
*
* Available tokens for this template are:
* %n - Gets replaced with the nickname
* %N - Gets replaced with the network name
* %c - Gets replaced with the confirmation code
* {nick} - Gets replaced with the nickname
* {network} - Gets replaced with the network name
* {code} - Gets replaced with the confirmation code
*/
reset_subject = "Reset password request for %n"
reset_subject = "Reset password request for {nick}"
reset_message = "Hi,
You have requested to have the password for %n reset.
To reset your password, type \" /msg NickServ CONFIRM %n %c \"
You have requested to have the password for {nick} reset.
To reset your password, type \" /msg NickServ CONFIRM RESETPASS {nick} {code} \"
If you don't know why this mail was sent to you, please ignore it silently.
%N administrators."
{network} administrators."
/*
* The subject and message of emails sent to users when they request a new email address.
*
* Available tokens for this template are:
* %e - Gets replaced with the old email address
* %E - Gets replaced with the new email address
* %n - Gets replaced with the nickname
* %N - Gets replaced with the network name
* %c - Gets replaced with the confirmation code
* {old_email} - Gets replaced with the old email address
* {new_email} - Gets replaced with the new email address
* {account} - Gets replaced with the nickname
* {network} - Gets replaced with the network name
* {code} - Gets replaced with the confirmation code
*/
emailchange_subject = "Email confirmation"
emailchange_message = "Hi,
You have requested to change your email address from %e to %E.
Please type \" /msg NickServ CONFIRM %c \" to confirm this change.
You have requested to change your email address from {old_email} to {new_email}.
Please type \" /msg NickServ CONFIRM EMAIL {code} \" to confirm this change.
If you don't know why this mail was sent to you, please ignore it silently.
%N administrators."
{network} administrators."
/*
* The subject and message of emails sent to users when they receive a new memo.
*
* Available tokens for this template are:
* %n - Gets replaced with the nickname
* %s - Gets replaced with the sender's nickname
* %d - Gets replaced with the memo number
* %t - Gets replaced with the memo text
* %N - Gets replaced with the network name
* {receiver} - Gets replaced with the receiver's nickname
* {sender} - Gets replaced with the sender's nickname
* {number} - Gets replaced with the memo number
* {text} - Gets replaced with the memo text
* {network} - Gets replaced with the network name
*/
memo_subject = "New memo"
memo_message = "Hi %n,
memo_message = "Hi {receiver},
You've just received a new memo from %s. This is memo number %d.
You've just received a new memo from {sender}. This is memo number {number}.
Memo text:
%t"
{text}"
}
/*
@@ -1100,11 +1085,32 @@ mail
}
/*
* [RECOMMENDED] db_flatfile
* db_atheme
*
* This is the default flatfile database format.
* This allows importing databases from Atheme. You should load another database module as
* well as this as it can only read Atheme databases not write them.
*/
module
#module
{
name = "db_atheme"
/*
* The database name db_atheme should use.
*/
database = "atheme.db"
}
/*
* db_flatfile
*
* Stores your database in a custom flatfile format.
*
* This was the recommended database module in 2.0 but it is now recommended
* that you use db_json instead. You can migrate your db_flatfile database to
* db_json by loading db_flatfile BEFORE db_json, sending SIGUSR1 to force a
* database write, and then unloading db_flatfile.
*/
#module
{
name = "db_flatfile"
@@ -1117,11 +1123,9 @@ module
* Sets the number of days backups of databases are kept. If you don't give it,
* or if you set it to 0, Anope won't backup the databases.
*
* NOTE: Anope must run 24 hours a day for this feature to work.
*
* This directive is optional, but recommended.
*/
keepbackups = 3
keepbackups = 7
/*
* Allows Anope to continue file write operations (i.e. database saving)
@@ -1142,28 +1146,79 @@ module
* This is only useful with very large databases, with hundreds
* of thousands of objects, that have a noticeable delay from
* writing databases.
*
* If your database is large enough cause a noticeable delay when
* saving you should consider a more powerful alternative such
* as db_sql or db_redis, which incrementally update their
* databases asynchronously in real time.
*/
fork = no
}
/*
* [RECOMMENDED] db_json
*
* Stores your database in a JSON file.
*/
module
{
name = "db_json"
/*
* The file that db_json will write your main database to.
*
* This is relative to your data directory.
*/
database = "anope.json"
/*
* The file that db_json will write third-party databases to.
*
* {name} will be replaced with the name of the module.
*
* This is relative to your data directory.
*/
module_database = "{name}.module.json"
/*
* Sets how many days and months worth of backups should be kept.
*
* It is recommended that at the very least you keep one backup. Failure to
* do so may result in total data loss if you ever run out of disk space or
* have a power failure during a database write. However, if you're *REALLY*
* sure this won't happen you can disable backups by setting these to 0.
*/
daily_backups = 7
monthly_backups = 3
/*
* The directory in which backups are kept.
*
* This is relative to your data directory.
*/
backup_directory = "backups"
/*
* Allows Anope to continue writing the database even if the original can
* not be backed up. This is not recommended as it may result in total data
* loss during the circumstances described above.
*/
#ignore_backup_failure = yes
}
/*
* db_sql and db_sql_live
*
* db_sql module allows saving and loading databases using one of the SQL engines.
* This module loads the databases once on startup, then incrementally updates
* objects in the database as they are changed within Anope in real time. Changes
* to the SQL tables not done by Anope will have no effect and will be overwritten.
* Allows saving and loading databases to a SQL database.
*
* db_sql_live module allows saving and loading databases using one of the SQL engines.
* This module reads and writes to SQL in real time. Changes to the SQL tables
* will be immediately reflected into Anope. This module should not be loaded
* in conjunction with db_sql.
* db_sql loads the databases once on startup and then incrementally updates in
* in the database as they are changed within Anope. Changes to the SQL tables
* not done by Anope will have no effect and will be overwritten.
*
* db_sql_live module reads and writes to SQL in real time. Changes to the SQL
* tables will be immediately reflected in Anope. This module can not be loaded
* at the same time as db_sql. It should also not be used on large networks as
* it executes quite a lot of queries which can cause performance issues.
*
* IMPORTANT: The SQL schema has changed in the 2.1 branch. Whilst Anope will
* try to update your schema it is recommended that before upgrading you export
* to a file and re-import your database on 2.1. This will remove any obsolete
* columns and change the types of existing columns to match the new schema.
*/
#module
{
@@ -1171,10 +1226,10 @@ module
#name = "db_sql_live"
/*
* The SQL service db_sql(_live) should use, these are configured in modules.conf.
* For MySQL, this should probably be mysql/main.
* The SQL service that db_sql(_live) should use. These are configured in
* modules.example.conf. For MySQL, this should probably be mysql/main.
*/
engine = "sqlite/main"
engine = "mysql/main"
/*
* An optional prefix to prepended to the name of each created table.
@@ -1182,24 +1237,29 @@ module
*/
#prefix = "anope_db_"
/* Whether or not to import data from another database module in to SQL on startup.
* If you enable this, be sure that the database services is configured to use is
* empty and that another database module to import from is loaded before db_sql.
* After you enable this and do a database import you should disable it for
* subsequent restarts.
/*
* Whether or not to import data from another database module in to SQL on
* startup.
*
* Note that you can not import databases using db_sql_live. If you want to import
* databases and use db_sql_live you should import them using db_sql, then shut down
* and start services with db_sql_live.
* If you enable this, be sure that the database Anope is configured to use
* is empty and that another database module to import from is loaded BEFORE
* db_sql. After you enable this and do a database import you MUST disable
* it for subsequent restarts. If you want to keep writing a file database
* after the SQL import is done you should load db_flatfile or db_json AFTER
* this module.
*
* Note that you can not import databases using db_sql_live. If you want to
* import databases and use db_sql_live you should import them using db_sql,
* then shut down and start Anope with db_sql_live.
*/
import = false
import = no
}
/*
* db_redis.
*
* This module allows using Redis (https://redis.io/) as a database backend.
* This module requires that m_redis is loaded and configured properly.
* This module requires that redis is loaded and configured properly.
*
* Redis 2.8 supports keyspace notifications which allows Redis to push notifications
* to Anope about outside modifications to the database. This module supports this and
@@ -1211,7 +1271,7 @@ module
name = "db_redis"
/*
* Redis database to use. This must be configured with m_redis.
* Redis database to use. This must be configured with redis.
*/
engine = "redis/main"
}
@@ -1219,49 +1279,121 @@ module
/*
* [RECOMMENDED] Encryption modules.
*
* The encryption modules are used when dealing with passwords. This determines how
* the passwords are stored in the databases, and does not add any security as
* far as transmitting passwords over the network goes.
*
* Without any encryption modules loaded users will not be able to authenticate unless
* there is another module loaded that provides authentication checking, such as
* m_ldap_authentication or m_sql_authentication.
*
* With enc_none, passwords will be stored in plain text, allowing for passwords
* to be recovered later but it isn't secure and therefore is not recommended.
*
* The other encryption modules use one-way encryption, so the passwords can not
* be recovered later if those are used.
*
* The first encryption module loaded is the primary encryption module. All new passwords are
* encrypted by this module. Old passwords stored in another encryption method are
* automatically re-encrypted by the primary encryption module on next identify.
*
* enc_md5, enc_sha1, and enc_old are deprecated, and are provided for users
* to upgrade to a newer encryption module. Do not use them as the primary
* encryption module. They will be removed in a future release.
* The encryption modules are used when dealing with passwords. This determines
* how the passwords are stored in the databases.
*
* The first encryption module loaded is the primary encryption module. All new
* passwords are encrypted by this module. Old passwords encrypted with another
* encryption method are automatically re-encrypted with the primary encryption
* module the next time the user identifies.
*/
#module { name = "enc_bcrypt" }
module { name = "enc_sha256" }
/*
* [DEPRECATED] Deprecated encryption modules. You can only use these for compatibility with
* old databases and will need to load one of the above modules as your primary encryption
* module.
*/
#module { name = "enc_md5" }
#module { name = "enc_none" }
#module { name = "enc_sha1" }
/*
* enc_old is Anope's previous (broken) MD5 implementation used from 1.4.x to 1.7.16.
* If your databases were made using that module, load it here to allow conversion to the primary
* encryption method.
* enc_sha2
*
* Provides support for encrypting passwords using the HMAC-SHA-2 algorithm. See
* https://en.wikipedia.org/wiki/SHA-2 and https://en.wikipedia.org/wiki/HMAC
* for more information.
*/
#module { name = "enc_old" }
module
{
name = "enc_sha2"
/** The sub-algorithm to use. Can be set to sha224 for SHA-224, sha256 for
* SHA-256, sha384 for SHA-384, or sha512 for SHA-512. Defaults to sha512.
*/
#algorithm = "sha512"
}
/*
* [EXTRA] enc_argon2
*
* Provides support for encrypting passwords using the Argon2 algorithm. See
* https://en.wikipedia.org/wiki/Argon2 for more information.
*/
#module
{
name = "enc_argon2"
/** The sub-algorithm to use. Can be set to argon2d for Argon2d, argon2i for
* Argon2i, or argon2id for Argon2id. Defaults to argon2id.
*/
#algorithm = "argon2id"
/** The memory hardness in kibibytes of the Argon2 algorithm. Defaults to
* 128 mebibytes.
*/
#memory_cost = 121072
/** The time hardness (iterations) of the Argon2 algorithm. Defaults to 3.
*/
#time_cost = 3
/** The amount of parallel threads to use when encrypting passwords.
* Defaults to 1.
*/
#parallelism = 1
/** The length in bytes of an Argon2 hash. Defaults to 32. */
#hash_length = 32
/** The length in bytes of an Argon2 salt. Defaults to 32. */
#salt_length = 32
}
/*
* enc_bcrypt
*
* Provides support for encrypting passwords using the Bcrypt algorithm. See
* https://en.wikipedia.org/wiki/Bcrypt for more information.
*/
#module
{
name = "enc_bcrypt"
/** The number of Bcrypt rounds to perform on passwords. Can be set to any
* number between 10 and 32 but higher numbers are more CPU intensive and
* may impact performance.
*/
#rounds = 10
}
/*
* [EXTRA] enc_posix
*
* Provides verify-only support for passwords encrypted using the POSIX crypt()
* function. Load this if you are migrating from another services packages such
* as Atheme. See https://en.wikipedia.org/wiki/Crypt_(C) for more information.
*
* You must load another encryption method before this to re-encrypt passwords
* with when a user logs in.
*/
#module { name = "enc_posix" }
/*
* [DEPRECATED] enc_md5, enc_none, enc_old, enc_sha1, enc_sha256
*
* Provides verify-only support for passwords encrypted using encryption methods
* from older versions of Anope. These methods are no longer considered secure
* and will be removed in a future version of Anope. Only load them if you are
* upgrading from a previous version of Anope that used them.
*
* enc_md5: Verifies passwords encrypted with the MD5 algorithm
* enc_none: Verifies passwords that are not encrypted
* enc_sha1: Verifies passwords encrypted with the SHA1 algorithm
* enc_old: Verifies passwords encrypted with the broken MD5 algorithm used
* before 1.7.17.
* enc_sha256: Verifies passwords encrypted with the SHA256 algorithm using a
* custom initialisation vector as a salt.
*
* You must load another encryption method before this to re-encrypt passwords
* with when a user logs in.
*/
#module { name = "enc_md5" }
#module { name = "enc_none" }
#module { name = "enc_old" }
#module { name = "enc_sha1" }
#module { name = "enc_sha256" }
/* Extra (optional) modules. */
include
@@ -1279,16 +1411,3 @@ include
type = "file"
name = "chanstats.example.conf"
}
/*
* IRC2SQL Gateway
* This module collects data about users, channels and servers. It doesn't build stats
* itself, however, it gives you the database, it's up to you how you use it.
*
* Requires a MySQL Database and MySQL version 5.5 or higher
*/
#include
{
type = "file"
name = "irc2sql.example.conf"
}
+22 -10
View File
@@ -31,12 +31,12 @@ service
/*
* The hostname of the BotServ client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the BotServ client.
*/
gecos = "Bot Service"
real = "Bot Service"
/*
* The modes this client should use.
@@ -59,6 +59,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "BS"
}
/*
@@ -183,7 +194,7 @@ module
/*
* The maximum number of entries a single bad words list can have.
*/
badwordsmax = 32
badwordsmax = 50
/*
* If set, BotServ will use case sensitive checking for badwords.
@@ -249,7 +260,7 @@ command { service = "BotServ"; name = "INFO"; command = "botserv/info"; }
* botserv/kick/italics - Configures BotServ's italics kicker.
* botserv/kick/repeat - Configures BotServ's repeat kicker.
* botserv/kick/reverses - Configures BotServ's reverse kicker.
* botserv/kick/underlines - Configures BotServ's reverse kicker.
* botserv/kick/underlines - Configures BotServ's underline kicker.
* botserv/set/dontkickops - Used for preventing BotServ from kicking channel operators.
* botserv/set/dontkickvoices - Used for preventing BotServ from kicking voices.
*
@@ -334,10 +345,10 @@ privilege
/*
* fantasy
*
* Allows 'fantasist' commands to be used in channels.
* Allows fantasy commands (e.g. !kick) to be used in channels.
*
* Provides the commands:
* botserv/set/fantasy - Used for enabling or disabling BotServ's fantasist commands.
* botserv/set/fantasy - Used for enabling or disabling BotServ's fantasy commands.
*/
module
{
@@ -376,15 +387,15 @@ fantasy { name = "ENFORCE"; command = "chanserv/enforce"; }
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg"; }
fantasy { name = "FLAGS"; command = "chanserv/flags"; }
fantasy { name = "HALFOP"; command = "chanserv/modes"; }
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = false; }
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = no; }
fantasy { name = "HOP"; command = "chanserv/xop"; }
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = false; }
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = no; }
fantasy { name = "INVITE"; command = "chanserv/invite"; }
fantasy { name = "K"; command = "chanserv/kick"; }
fantasy { name = "KB"; command = "chanserv/ban"; }
fantasy { name = "KICK"; command = "chanserv/kick"; }
fantasy { name = "LEVELS"; command = "chanserv/levels"; }
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = false; }
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = no; }
fantasy { name = "LOG"; command = "chanserv/log"; }
fantasy { name = "MODE"; command = "chanserv/mode"; }
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET"; }
@@ -392,13 +403,14 @@ fantasy { name = "OP"; command = "chanserv/modes"; }
fantasy { name = "OWNER"; command = "chanserv/modes"; }
fantasy { name = "PROTECT"; command = "chanserv/modes"; }
fantasy { name = "QOP"; command = "chanserv/xop"; }
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = false; }
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = no; }
fantasy { name = "SOP"; command = "chanserv/xop"; }
fantasy { name = "STATUS"; command = "chanserv/status"; }
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; }
fantasy { name = "SYNC"; command = "chanserv/sync"; }
fantasy { name = "TOPIC"; command = "chanserv/topic"; }
fantasy { name = "UNBAN"; command = "chanserv/unban"; }
fantasy { name = "UNMUTE"; command = "chanserv/unban"; mode = "QUIET"; }
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; }
fantasy { name = "UP"; command = "chanserv/up"; }
fantasy { name = "VOICE"; command = "chanserv/modes"; }
+50 -48
View File
@@ -21,12 +21,12 @@ service
/*
* The hostname of the ChanServ client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the ChanServ client.
*/
gecos = "Channel Registration Service"
real = "Channel Registration Service"
/*
* The modes this client should use.
@@ -49,6 +49,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "CS"
}
/*
@@ -76,8 +87,6 @@ module
* access level or superior
* - cs_private: Hide the channel from ChanServ's LIST command
* - restricted: Kick/ban users who are restricted from the channel
* - cs_secure: Enable channel security, requiring the user to be identified with NickServ in
* order to be considered for being on the access list of the channel
* - secureops: Only allow operator status to be given if the user is on the access list
* - securefounder: Only allow the real founder of the channel to drop the channel, change its
* password, or change the founder or successor
@@ -91,12 +100,13 @@ module
* not in use.
* - cs_no_expire: Enables no expire. Needs founder, successor (if set) or anyone in the access list
* to be a registered nick, otherwise the channel will be dropped.
* - cs_stats: Enable Chanstats for newly registered channels
* - none: No defaults
*
* This directive is optional, if left blank, the options will default to keeptopic, cs_secure, securefounder,
* and signkick. If you really want no defaults, use "none" by itself as the option.
* This directive is optional, if left blank, the options will default to cs_keep_modes, keeptopic, peace,
* persist, securefounder, and signkick. If you really want no defaults, use "none" by itself as the option.
*/
defaults = "keeptopic peace cs_secure securefounder signkick"
defaults = "cs_keep_modes keeptopic peace persist securefounder signkick"
/*
* The maximum number of channels which may be registered to a single nickname.
@@ -109,22 +119,21 @@ module
/*
* The length of time before a channel registration expires.
*
* This directive is optional, but recommended.
* If not set, the default is 30 days.
* This directive is optional. If not set, the default is never.
*/
expire = 30d
#expire = 90d
/*
* The maximum number of entries on a channel's access list.
* If not set, the default is 1024. This can be set to 0 for unlimited.
* If not set, the default is 1000. This can be set to 0 for unlimited.
*/
accessmax = 1024
accessmax = 1000
/*
* The length of time ChanServ stays in a channel after kicking a user from a channel they are not
* permitted to be in. This only occurs when the user is the only one in the channel.
*/
inhabit = 15s
inhabit = 1m
/*
* Allow only IRC Operators to use ChanServ.
@@ -155,27 +164,27 @@ module
/*
* The message formatting to use for signed kick messages.
* %n is the nick of the kicker
* %m is the message specified
* {nick} is the nick of the kicker
* {message} is the message specified
*/
signkickformat = "%m (%n)"
signkickformat = "{message} ({nick})"
/*
* If set, prevents channel access entries from containing hostmasks.
*/
disallow_hostmask_access = false
disallow_hostmask_access = no
/*
* If set, prevents channels from being on access lists.
*/
disallow_channel_access = false
disallow_channel_access = no
/*
* If set, ChanServ will always lower the timestamp of registered channels to their registration date.
* This prevents several race conditions where unauthorized users can join empty registered channels and set
* modes etc. prior to services deopping them.
*/
always_lower_ts = false
always_lower_ts = no
}
/*
@@ -394,7 +403,7 @@ privilege
}
/*
* FANTASIA privilege.
* FANTASY privilege.
*
* Used by botserv/main and chanserv/xop.
*
@@ -402,7 +411,7 @@ privilege
*/
privilege
{
name = "FANTASIA"
name = "FANTASY"
desc = _("Allowed to use fantasy commands")
rank = 30
level = 3
@@ -729,7 +738,7 @@ privilege
privilege
{
name = "SET"
desc = _("Allowed to set channel settings")
desc = _("Allowed to modify channel settings")
rank = 320
level = 9999
flag = "s"
@@ -915,7 +924,7 @@ module
/*
* The maximum number of entries on a channel's autokick list.
*/
autokickmax = 32
autokickmax = 50
/*
* The default reason for an autokick if none is given.
@@ -938,7 +947,7 @@ command { service = "ChanServ"; name = "AKICK"; command = "chanserv/akick"; grou
* Used for banning users from channels.
*/
module { name = "cs_ban" }
command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; }
command { service = "ChanServ"; name = "BAN"; command = "chanserv/ban"; group = "chanserv/management"; }
/*
* cs_clone
@@ -1039,7 +1048,7 @@ command { service = "ChanServ"; name = "INVITE"; command = "chanserv/invite"; }
* Used for kicking users from channels.
*/
module { name = "cs_kick" }
command { service = "ChanServ"; name = "KICK"; command = "chanserv/kick"; }
command { service = "ChanServ"; name = "KICK"; command = "chanserv/kick"; group = "chanserv/management"; }
/*
* cs_list
@@ -1128,7 +1137,7 @@ module
*
* This directive is optional.
*/
max = 32
max = 50
}
command { service = "ChanServ"; name = "MODE"; command = "chanserv/mode"; group = "chanserv/management"; }
@@ -1170,11 +1179,8 @@ module
{
name = "cs_seen"
/* If set, uses the older 1.8 style seen, which is less resource intensive */
simple = false
/* Sets the time to keep seen entries in the seen database. */
purgetime = "30d"
purgetime = 90d
}
command { service = "OperServ"; name = "SEEN"; command = "operserv/seen"; permission = "operserv/seen"; }
@@ -1220,7 +1226,7 @@ module
* If set, persistent channels have their creation times lowered to their
* original registration dates.
*/
persist_lower_ts = true
persist_lower_ts = yes
}
command { service = "ChanServ"; name = "SET"; command = "chanserv/set"; group = "chanserv/management"; }
command { service = "ChanServ"; name = "SET AUTOOP"; command = "chanserv/set/autoop"; }
@@ -1248,8 +1254,8 @@ command { service = "ChanServ"; name = "SET NOEXPIRE"; command = "chanserv/saset
* A field named misc_description may be given for use with help output.
*/
module { name = "cs_set_misc" }
command { service = "ChanServ"; name = "SET URL"; command = "chanserv/set/misc"; misc_description = _("Associate a URL with the channel"); }
command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc"; misc_description = _("Associate an E-mail address with the channel"); }
command { service = "ChanServ"; name = "SET URL"; command = "chanserv/set/misc"; misc_description = _("Associate a URL with the channel"); misc_numeric = 328; }
command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc"; misc_description = _("Associate an email address with the channel"); }
/*
* cs_status
@@ -1261,6 +1267,15 @@ command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc
*/
module { name = "cs_status" }
command { service = "ChanServ"; name = "STATUS"; command = "chanserv/status"; }
command { service = "ChanServ"; name = "WHY"; command = "chanserv/status"; hide = yes; }
/*
* cs_statusupdate
*
* This module automatically updates users' status on channels when the
* channel's access list is modified.
*/
module { name = "cs_statusupdate" }
/*
* cs_suspend
@@ -1279,7 +1294,7 @@ module
* This directive is optional.
* If not set, the default is never.
*/
expire = 90d
suspendexpire = 90d
/*
* Settings to show to non-opers in ChanServ's INFO output.
@@ -1321,7 +1336,7 @@ command { service = "ChanServ"; name = "SET KEEPTOPIC"; command = "chanserv/set/
* Used for unbanning users from channels.
*/
module { name = "cs_unban" }
command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; }
command { service = "ChanServ"; name = "UNBAN"; command = "chanserv/unban"; group = "chanserv/management"; }
/*
* cs_updown
@@ -1354,16 +1369,3 @@ command { service = "ChanServ"; name = "SOP"; command = "chanserv/xop"; group =
command { service = "ChanServ"; name = "AOP"; command = "chanserv/xop"; group = "chanserv/access"; }
command { service = "ChanServ"; name = "HOP"; command = "chanserv/xop"; group = "chanserv/access"; }
command { service = "ChanServ"; name = "VOP"; command = "chanserv/xop"; group = "chanserv/access"; }
/*
* Extra ChanServ related modules.
*/
/*
* cs_statusupdate
*
* This module automatically updates users' status on channels when the
* channel's access list is modified.
*/
module { name = "cs_statusupdate" }
+5 -7
View File
@@ -1,11 +1,15 @@
/*
* Example configuration file for Chanstats.
*
* You can enable Chanstats by default by adding CS_STATS to {chanserv}:defaults
* and NS_STATS to {nickserv}:defaults.
*
* Make sure BotServ, ChanServ and NickServ are running.
*/
module
{
name = "m_chanstats"
name = "chanstats"
/*
* The name of this engine.
@@ -23,12 +27,6 @@ module
smileyshappy = ":) :-) ;) ;-) :D :-D :P :-P"
smileyssad = ":( :-( ;( ;-("
smileysother = ":/ :-/"
/*
* Enable Chanstats for newly registered nicks / channels.
*/
ns_def_chanstats = yes
cs_def_chanstats = yes
}
command { service = "ChanServ"; name = "SET CHANSTATS"; command = "chanserv/set/chanstats"; }
command { service = "NickServ"; name = "SET CHANSTATS"; command = "nickserv/set/chanstats"; }
+40 -3
View File
@@ -21,12 +21,12 @@ service
/*
* The hostname of the Global client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the Global client.
*/
gecos = "Global Noticer"
real = "Global Noticer"
/*
* The modes this client should use.
@@ -49,6 +49,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "GL"
}
/*
@@ -82,7 +93,7 @@ module
#globaloncycleup = "Services are now back online - have a nice day"
/*
* If set, Anope will hide the IRC Operator's nick in a global
* If set, Anope will hide the Services Operator's nick in a global
* message/notice.
*
* This directive is optional.
@@ -113,3 +124,29 @@ command { service = "Global"; name = "HELP"; command = "generic/help"; }
*/
module { name = "gl_global" }
command { service = "Global"; name = "GLOBAL"; command = "global/global"; permission = "global/global"; }
/*
* gl_queue
*
* Provides the command global/queue.
*
* Used for queuing messages to send to every online user.
*/
module
{
name = "gl_queue"
/* The maximum number of messages in a message queue. Defaults to 10. */
maxqueue = 10
}
command { service = "Global"; name = "QUEUE"; command = "global/queue"; permission = "global/queue"; }
/*
* gl_server
*
* Provides the command global/server.
*
* Used for sending a message to every online user on a server.
*/
module { name = "gl_server" }
command { service = "Global"; name = "SERVER"; command = "global/server"; permission = "global/server"; }
+31 -15
View File
@@ -21,12 +21,12 @@ service
/*
* The hostname of the HostServ client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the HostServ client.
*/
gecos = "vHost Service"
real = "Hostname Service"
/*
* The modes this client should use.
@@ -49,6 +49,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "HS"
}
/*
@@ -68,7 +79,12 @@ module
/*
* If enabled, vhosts are activated on users immediately when they are set.
*/
activate_on_set = false
activate_on_set = yes
/*
* If enabled, vhosts are activated on users immediately when they log out of an operator account.
*/
activate_on_deoper = yes
}
/*
@@ -90,7 +106,7 @@ command { service = "HostServ"; name = "HELP"; command = "generic/help"; }
*
* Provides the commands hostserv/del and hostserv/delall.
*
* Used for removing users' vHosts.
* Used for removing users' vhosts.
*/
module { name = "hs_del" }
command { service = "HostServ"; name = "DEL"; command = "hostserv/del"; permission = "hostserv/del"; }
@@ -101,21 +117,21 @@ command { service = "HostServ"; name = "DELALL"; command = "hostserv/delall"; pe
*
* Provides the command hostserv/group.
*
* Used for grouping one vHost to many nicks.
* Used for syncing one vhost to many nicks.
*/
module
{
name = "hs_group"
/*
* Upon nickserv/group, this option syncs the nick's main vHost to the grouped nick.
* Upon nickserv/group, this option syncs the nick's main vhost to the grouped nick.
*/
syncongroup = true
syncongroup = yes
/*
* This makes vhosts act as if they are per account.
*/
synconset = true
synconset = yes
}
command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
@@ -124,7 +140,7 @@ command { service = "HostServ"; name = "GROUP"; command = "hostserv/group"; }
*
* Provides the command hostserv/list.
*
* Used for listing actively set vHosts.
* Used for listing actively set vhosts.
*/
module { name = "hs_list" }
command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permission = "hostserv/list"; }
@@ -134,7 +150,7 @@ command { service = "HostServ"; name = "LIST"; command = "hostserv/list"; permis
*
* Provides the command hostserv/off.
*
* Used for turning off your vHost.
* Used for turning off your vhost.
*/
module { name = "hs_off" }
command { service = "HostServ"; name = "OFF"; command = "hostserv/off"; }
@@ -144,7 +160,7 @@ command { service = "HostServ"; name = "OFF"; command = "hostserv/off"; }
*
* Provides the command hostserv/on.
*
* Used for turning on your vHost.
* Used for turning on your vhost.
*/
module { name = "hs_on" }
command { service = "HostServ"; name = "ON"; command = "hostserv/on"; }
@@ -154,20 +170,20 @@ command { service = "HostServ"; name = "ON"; command = "hostserv/on"; }
*
* Provides the commands hostserv/request, hostserv/activate, hostserv/reject, and hostserv/waiting.
*
* Used to manage vHosts requested by users.
* Used to manage vhosts requested by users.
*/
module
{
name = "hs_request"
/*
* If set, Anope will send a memo to the user requesting a vHost when it's been
* If set, Anope will send a memo to the user requesting a vhost when it's been
* approved or rejected.
*/
#memouser = yes
/*
* If set, Anope will send a memo to all services staff when a new vHost is requested.
* If set, Anope will send a memo to all services staff when a new vhost is requested.
*/
#memooper = yes
}
@@ -181,7 +197,7 @@ command { service = "HostServ"; name = "WAITING"; command = "hostserv/waiting";
*
* Provides the commands hostserv/set and hostserv/setall.
*
* Used for setting users' vHosts.
* Used for setting users' vhosts.
*/
module { name = "hs_set" }
command { service = "HostServ"; name = "SET"; command = "hostserv/set"; permission = "hostserv/set"; }
-97
View File
@@ -1,97 +0,0 @@
/*
* Example configuration file for the irc2sql gateway
*
*/
service
{
/*
* The name of the StatServ client.
*/
nick = "StatServ"
/*
* The username of the StatServ client.
*/
user = "StatServ"
/*
* The hostname of the StatServ client.
*/
host = "stats.host"
/*
* The realname of the StatServ client.
*/
gecos = "Statistical Service"
/*
* The modes this client should use.
* Do not modify this unless you know what you are doing.
*
* These modes are very IRCd specific. If left commented, sane defaults
* are used based on what protocol module you have loaded.
*
* Note that setting this option incorrectly could potentially BREAK some, if
* not all, usefulness of the client. We will not support you if this client is
* unable to do certain things if this option is enabled.
*/
#modes = "+o"
/*
* An optional comma separated list of channels this service should join. Outside
* of log channels this is not very useful, as the service will just idle in the
* specified channels, and will not accept any types of commands.
*
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#stats,#mychan"
}
module
{
name = "irc2sql"
/*
* The name of the client that should send the CTCP VERSION requests.
* It must already exist or must be defined in the following service block.
*/
client = "StatServ"
/*
* The name of the SQL engine to use.
* This must be MySQL and must match the name in the mysql{} block
*/
engine = "mysql/main"
/*
* An optional prefix to prepended to the name of each created table.
* Do not use the same prefix for other programs.
*/
prefix = "anope_"
/*
* GeoIP - Automatically adds users geoip location to the user table.
* Tables are created by irc2sql, you have to run the
* geoipupdate script after you started Anope to download
* and import the GeoIP database.
*
* The geoip database can be the smaller "country" database or the
* larger "city" database. Comment to disable geoip lookup.
*/
geoip_database = "country"
/*
* Get the CTCP version from users
* The users connecting to the network will receive a CTCP VERSION
* request from the above configured stats client
*/
ctcpuser = "yes"
/*
* Send out CTCP VERSION requests to users during burst.
* Disable this if you restart Anope often and don't want to
* annoy your users.
*/
ctcpeob = "yes"
}
+17 -9
View File
@@ -21,12 +21,12 @@ service
/*
* The hostname of the MemoServ client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the MemoServ client.
*/
gecos = "Memo Service"
real = "Memo Service"
/*
* The modes this client should use.
@@ -49,6 +49,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "MS"
}
/*
@@ -78,12 +89,11 @@ module
/*
* The delay between consecutive uses of the MemoServ SEND command. This can help prevent spam
* as well as denial-of-service attacks from sending large numbers of memos and filling up disk
* space (and memory). The default 3-second wait means a maximum average of 150 bytes of memo
* per second per user under the current IRC protocol.
* space (and memory).
*
* This directive is optional, but recommended.
*/
senddelay = 3s
senddelay = 30s
}
/*
@@ -146,7 +156,7 @@ module
*
* This directive is optional.
*/
max = 32
max = 50
}
command { service = "MemoServ"; name = "IGNORE"; command = "memoserv/ignore"; }
@@ -186,8 +196,6 @@ command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
* Provides the command memoserv/rsend.
*
* Used to send a memo requiring a receipt be sent back once it is read.
*
* Requires configuring memoserv:memoreceipt.
*/
#module
{
@@ -198,7 +206,7 @@ command { service = "MemoServ"; name = "READ"; command = "memoserv/read"; }
*
* This directive is optional.
*/
operonly = false
operonly = no
}
#command { service = "MemoServ"; name = "RSEND"; command = "memoserv/rsend"; }
+295 -121
View File
@@ -19,14 +19,14 @@
module { name = "help" }
/*
* m_dns
* dns
*
* Adds support for the DNS protocol. By itself this module does nothing useful,
* but other modules such as m_dnsbl and os_dns require this.
* but other modules such as dnsbl and os_dns require this.
*/
#module
{
name = "m_dns"
name = "dns"
/*
* The nameserver to use for resolving hostnames, must be an IP or a resolver configuration file.
@@ -59,13 +59,13 @@ module { name = "help" }
* SOA record information.
*/
/* E-mail address of the DNS administrator. */
/* Email address of the DNS administrator. */
admin = "admin@example.com"
/* This should be the names of the public facing nameservers serving the records. */
nameservers = "ns1.example.com ns2.example.com"
/* The time slave servers are allowed to cache. This should be reasonably low
/* The time secondary servers are allowed to cache for. This should be reasonably low
* if you want your records to be updated without much delay.
*/
refresh = 3600
@@ -80,7 +80,7 @@ module { name = "help" }
}
/*
* m_dnsbl
* dnsbl
*
* Allows configurable DNS blacklists to check connecting users against. If a user
* is found on the blacklist they will be immediately banned. This is a crucial module
@@ -88,7 +88,7 @@ module { name = "help" }
*/
#module
{
name = "m_dnsbl"
name = "dnsbl"
/*
* If set, Anope will check clients against the DNSBLs when services connect to its uplink.
@@ -119,15 +119,15 @@ module { name = "help" }
time = 4h
/* Reason for akill.
* %n is the nick of the user
* %u is the ident/username of the user
* %g is the realname of the user
* %h is the hostname of the user
* %i is the IP of the user
* %r is the reply reason (configured below). Will be nothing if not configured.
* %N is the network name set in networkinfo:networkname
* {nick} is the nick of the user
* {user} is the ident/username of the user
* {real} is the realname of the user
* {host} is the hostname of the user
* {ip} is the IP of the user
* {reply} is the reply reason (configured below). Will be nothing if not configured.
* {network} is the network name set in networkinfo:networkname
*/
reason = "You are listed in the EFnet RBL, visit https://rbl.efnetrbl.org/?i=%i for info"
reason = "You are listed in the EFnet RBL, visit https://rbl.efnetrbl.org/?i={ip} for info"
/* Replies to ban and their reason. If no replies are configured, all replies get banned. */
reply
@@ -171,7 +171,7 @@ module { name = "help" }
{
name = "dnsbl.dronebl.org"
time = 4h
reason = "You have a host listed in the DroneBL. For more information, visit https://dronebl.org/lookup_branded?ip=%i&network=%N"
reason = "You have a host listed in the DroneBL. For more information, visit https://dronebl.org/lookup?ip={ip}&network={network}"
}
/* Exempt localhost from DNSBL checks */
@@ -179,19 +179,19 @@ module { name = "help" }
}
/*
* m_helpchan
* helpchan
*
* Gives users who are op in the specified help channel usermode +h (helpop).
*/
#module
{
name = "m_helpchan"
name = "helpchan"
helpchannel = "#help"
}
/*
* m_httpd
* httpd
*
* Allows services to serve web pages. By itself, this module does nothing useful.
*
@@ -200,7 +200,7 @@ module { name = "help" }
*/
#module
{
name = "m_httpd"
name = "httpd"
httpd
{
@@ -233,13 +233,13 @@ module { name = "help" }
}
/*
* m_ldap [EXTRA]
* [EXTRA] ldap
*
* This module allows other modules to use LDAP. By itself, this module does nothing useful.
*/
#module
{
name = "m_ldap"
name = "ldap"
ldap
{
@@ -254,14 +254,14 @@ module { name = "help" }
}
/*
* m_ldap_authentication [EXTRA]
* ldap_authentication
*
* This module allows many commands such as IDENTIFY, RELEASE, RECOVER, GHOST, etc. use
* LDAP to authenticate users. Requires m_ldap.
* LDAP to authenticate users. Requires ldap.
*/
#module
{
name = "m_ldap_authentication"
name = "ldap_authentication"
/*
* The distinguished name used for searching for users's accounts.
@@ -270,10 +270,10 @@ module { name = "help" }
/*
* The search filter used to look up users's accounts.
* %account is replaced with the user's account.
* %object_class is replaced with the object_class configured below.
* {account} is replaced with the user's account.
* {object_class} is replaced with the object_class configured below.
*/
search_filter = "(&(uid=%account)(objectClass=%object_class))"
search_filter = "(&(uid={account})(objectClass={object_class}))"
/*
* The object class used by LDAP to store user account information.
@@ -304,30 +304,30 @@ module { name = "help" }
*
* If not set, then registration is not blocked.
*/
#disable_register_reason = "To register on this network visit https://some.misconfigured.site/register"
#disable_register_reason = "To register on this network visit https://some.misconfigured.site.example/register"
/*
* If set, the reason to give the users who try to "/msg NickServ SET EMAIL".
* If not set, then email changing is not blocked.
*/
#disable_email_reason = "To change your email address visit https://some.misconfigured.site"
#disable_email_reason = "To change your email address visit https://some.misconfigured.site.example"
}
/*
* m_ldap_oper [EXTRA]
* ldap_oper
*
* This module dynamically ties users to Anope opertypes when they identify
* via LDAP group membership. Requires m_ldap.
* via LDAP group membership. Requires ldap.
*
* Note that this doesn't give the user privileges on the IRCd, only in Anope.
*/
#module
{
name = "m_ldap_oper"
name = "ldap_oper"
/*
* An optional binddn to use when searching for groups.
* %a is replaced with the account name of the user.
* {account} is replaced with the account name of the user.
*/
#binddn = "cn=Manager,dc=anope,dc=org"
@@ -343,9 +343,9 @@ module { name = "help" }
/*
* The filter to use when searching for users.
* %a is replaced with the account name of the user.
* {account} is replaced with the account name of the user.
*/
filter = "(member=uid=%a,ou=users,dc=anope,dc=org)"
filter = "(member=uid={account},ou=users,dc=anope,dc=org)"
/*
* The attribute of the group that is the name of the opertype.
@@ -355,13 +355,13 @@ module { name = "help" }
}
/*
* m_mysql [EXTRA]
* [EXTRA] mysql
*
* This module allows other modules to use MySQL.
*/
#module
{
name = "m_mysql"
name = "mysql"
mysql
{
@@ -372,17 +372,18 @@ module { name = "help" }
username = "anope"
password = "mypassword"
port = 3306
socket = ""
}
}
/*
* m_redis
* redis
*
* This module allows other modules to use Redis.
*/
#module
{
name = "m_redis"
name = "redis"
/* A redis database */
redis
@@ -401,29 +402,29 @@ module { name = "help" }
}
/*
* m_regex_pcre2 [EXTRA]
* [EXTRA] regex_pcre2
*
* Provides the regex engine regex/pcre, which uses version 2 of the Perl Compatible Regular
* Expressions library.
*/
#module { name = "m_regex_pcre2" }
#module { name = "regex_pcre2" }
/*
* m_regex_posix [EXTRA]
* [EXTRA] regex_posix
*
* Provides the regex engine regex/posix, which uses the POSIX compliant regular expressions.
*/
#module { name = "m_regex_posix" }
#module { name = "regex_posix" }
/*
* m_regex_stdlib
* regex_stdlib
*
* Provides the regex engine regex/stdlib, which uses the regular expression library that is part of
* the C++ standard library.
*/
*/
module
{
name = "m_regex_stdlib"
name = "regex_stdlib"
/*
* The syntax scheme to use. Can be set to awk to use the regular expression grammar used by the
@@ -439,24 +440,24 @@ module
}
/*
* m_regex_tre [EXTRA]
* [EXTRA] regex_tre
*
* Provides the regex engine regex/tre, which uses the TRE regex library.
*/
#module { name = "m_regex_tre" }
#module { name = "regex_tre" }
/*
* m_rewrite
* rewrite
*
* Allows rewriting commands sent to/from clients.
*/
#module { name = "m_rewrite" }
#module { name = "rewrite" }
#command
{
service = "ChanServ"; name = "CLEAR"; command = "rewrite"
/* Enable m_rewrite. */
rewrite = true
/* Enable rewrite. */
rewrite = yes
/* Source message to match. A $ can be used to match anything. */
rewrite_source = "CLEAR $ USERS"
@@ -476,7 +477,7 @@ module
}
/*
* m_proxyscan
* proxyscan
*
* This module allows you to scan connecting clients for open proxies.
* Note that using this will allow users to get the IP of your services.
@@ -490,7 +491,7 @@ module
*/
#module
{
name = "m_proxyscan"
name = "proxyscan"
/*
* The target IP services tells the proxy to connect back to. This must be a publicly
@@ -549,47 +550,38 @@ module
/*
* The reason to ban the user for.
* %h is replaced with the type of proxy found.
* %i is replaced with the IP of proxy found.
* %p is replaced with the port.
* {type} is replaced with the type of proxy found.
* {ip} is replaced with the IP of proxy found.
* {port} is replaced with the port.
*/
reason = "You have an open proxy running on your host (%t:%i:%p)"
reason = "You have an open proxy running on your host ({type}:{ip}:{port})"
}
}
/*
* m_sasl
*
* Some IRCds allow "SASL" authentication to let users identify to services
* during the IRCd user registration process. If this module is loaded, Anope will allow
* authenticating users through this mechanism. Supported mechanisms are:
* PLAIN, EXTERNAL.
*/
module { name = "m_sasl" }
/*
* m_ssl_gnutls [EXTRA]
* [EXTRA] ssl_gnutls
*
* This module provides SSL services to Anope using GnuTLS, for example to
* connect to the uplink server(s) via SSL.
*
* You may only load either m_ssl_gnutls or m_ssl_openssl, but not both.
* You may only load either ssl_gnutls or ssl_openssl, but not both.
*/
#module
{
name = "m_ssl_gnutls"
name = "ssl_gnutls"
/*
* An optional certificate and key for m_ssl_gnutls to give to the uplink.
* An optional certificate and key for ssl_gnutls to give to the uplink. All
* paths are relative to the config directory.
*
* You can generate your own certificate and key pair by using:
*
* certtool --generate-privkey --bits 2048 --outfile anope.key
* certtool --generate-self-signed --load-privkey anope.key --outfile anope.crt
* certtool --generate-privkey --bits 2048 --outfile privkey.pem
* certtool --generate-self-signed --load-privkey privkey.pem --outfile fullchain.pem
*
*/
cert = "data/anope.crt"
key = "data/anope.key"
cert = "fullchain.pem"
key = "privkey.pem"
/*
* Diffie-Hellman parameters to use when acting as a server. This is only
@@ -602,53 +594,55 @@ module { name = "m_sasl" }
* certtool --generate-dh-params --bits 2048 --outfile dhparams.pem
*
*/
# dhparams = "data/dhparams.pem"
#dhparams = "dhparams.pem"
}
/*
* m_ssl_openssl [EXTRA]
* [EXTRA] ssl_openssl
*
* This module provides SSL services to Anope using OpenSSL, for example to
* connect to the uplink server(s) via SSL.
*
* You may only load either m_ssl_openssl or m_ssl_gnutls, but not both.
* You may only load either ssl_openssl or ssl_gnutls, but not both.
*
*/
#module
{
name = "m_ssl_openssl"
name = "ssl_openssl"
/*
* An optional certificate and key for m_ssl_openssl to give to the uplink.
* An optional certificate and key for ssl_openssl to give to the uplink.
* All paths are relative to the config directory.
*
* You can generate your own certificate and key pair by using:
*
* openssl genrsa -out anope.key 2048
* openssl req -new -x509 -key anope.key -out anope.crt -days 1095
* openssl genrsa -out privkey.pem 2048
* openssl req -new -x509 -key privkey.pem -out fullchain.pem -days 1095
*/
cert = "data/anope.crt"
key = "data/anope.key"
cert = "fullchain.pem"
key = "privkey.pem"
/*
* As of 2014 SSL 3.0 is considered insecure, but it might be enabled
* on some systems by default for compatibility reasons.
* You can use the following option to enable or disable it explicitly.
* Leaving this option not set defaults to the default system behavior.
* If you wish to increase security you can disable support for older
* versions of TLS with no known vulnerabilities but that provide less
* security. For your security SSLv2 and SSLv3 are always disabled.
*/
#sslv3 = no
#tlsv10 = no
#tlsv11 = no
#tlsv12 = yes
}
/*
* m_sql_authentication [EXTRA]
* sql_authentication
*
* This module allows authenticating users against an external SQL database using a custom
* query.
*/
#module
{
name = "m_sql_authentication"
name = "sql_authentication"
/* SQL engine to use. Should be configured elsewhere with m_mysql, m_sqlite, etc. */
/* SQL engine to use. Should be configured elsewhere with mysql, sqlite, etc. */
engine = "mysql/main"
/* Query to execute to authenticate. A non empty result from this query is considered a success,
@@ -676,24 +670,41 @@ module { name = "m_sasl" }
*/
query = "SELECT `email_addr` AS `email` FROM `my_users` WHERE `username` = @a@ AND `password` = MD5(CONCAT('salt', @p@))"
/*
* If your database uses a password hashing algorithm that can not be compared using a simple
* comparison function then you can specify it here to compare locally.
*
* You will need to have the appropriate encryption module (e.g. enc_bcrypt) loaded in order
* for this to work.
*/
#password_hash = "bcrypt"
/*
* If using the password_hash field (above) you will need to specify the name of the field to
* fetch the password from.
*
* Defaults to "password" if not set.
*/
#password_field = "password"
/*
* If set, the reason to give the users who try to "/msg NickServ REGISTER".
* If not set, then registration is not blocked.
*/
#disable_reason = "To register on this network visit https://some.misconfigured.site/register"
#disable_reason = "To register on this network visit https://some.misconfigured.site.example/register"
/*
* If set, the reason to give the users who try to "/msg NickServ SET EMAIL".
* If not set, then email changing is not blocked.
*/
#disable_email_reason = "To change your email address visit https://some.misconfigured.site"
#disable_email_reason = "To change your email address visit https://some.misconfigured.site.example"
}
/*
* m_sql_log [EXTRA]
* sql_log
*
* This module adds an additional target option to log{} blocks
* that allows logging Service's logs to SQL. To log to SQL, add
* that allows logging Services' logs to SQL. To log to SQL, add
* the SQL service name to log:targets prefixed by sql_log:. For
* example:
*
@@ -707,19 +718,19 @@ module { name = "m_sasl" }
* it if it doesn't exist. This module does not create any indexes (keys)
* on the table and it is recommended you add them yourself as necessary.
*/
#module { name = "m_sql_log" }
#module { name = "sql_log" }
/*
* m_sql_oper [EXTRA]
* sql_oper
*
* This module allows granting users services operator privileges and possibly IRC Operator
* privileges based on an external SQL database using a custom query.
* This module allows granting users Services Operator privileges based on an
* external SQL database using a custom query.
*/
#module
{
name = "m_sql_oper"
name = "sql_oper"
/* SQL engine to use. Should be configured elsewhere with m_mysql, m_sqlite, etc. */
/* SQL engine to use. Should be configured elsewhere with mysql, sqlite, etc. */
engine = "mysql/main"
/* Query to execute to determine if a user should have operator privileges.
@@ -736,13 +747,13 @@ module { name = "m_sasl" }
}
/*
* m_sqlite [EXTRA]
* [EXTRA] sqlite
*
* This module allows other modules to use SQLite.
*/
#module
{
name = "m_sqlite"
name = "sqlite"
/* A SQLite database */
sqlite
@@ -751,7 +762,7 @@ module { name = "m_sasl" }
name = "sqlite/main"
/* The database name, it will be created if it does not exist. */
database = "anope.db"
database = "anope.sqlite"
}
}
@@ -762,40 +773,203 @@ module { name = "m_sasl" }
* as they could over IRC. If you are using the default configuration you should be able to access
* this panel by visiting http://127.0.0.1:8080 in your web browser from the machine Anope is running on.
*
* This module requires m_httpd.
* This module requires httpd.
*/
#module
{
name = "webcpanel"
/* Web server to use. */
server = "httpd/main";
server = "httpd/main"
/* Template to use. */
template = "default";
/*
* The directory containing the webcpanel templates. This is relative to the
* data directory.
*/
template_dir = "webcpanel/templates/default"
/* Page title. */
title = "Anope IRC Services";
title = "Anope IRC Services"
}
/*
* m_xmlrpc
* jsonrpc
*
* Allows remote applications (websites) to execute queries in real time to retrieve data from Anope.
* By itself this module does nothing, but allows other modules (m_xmlrpc_main) to receive and send XMLRPC queries.
* Allows remote applications to execute methods within Anope using the JSON-RPC
* protocol. See https://www.jsonrpc.org/specification for more information.
*
* By itself this module does nothing. You should load a RPC method module like
* rpc_data which actually provides RPC methods.
*
* See docs/RPC/jsonrpc.js for an example JavaScript JSON-RPC client.
* See docs/RPC/jsonrpc.rb for an example Ruby JSON-RPC client.
*
* IMPORTANT: this can not be loaded at the same time as the xmlrpc module.
*/
#module
{
name = "m_xmlrpc"
name = "jsonrpc"
/* Web service to use. Requires m_httpd. */
/*
* The maximum number of bits an integer can be have in its native type.
*
* By default Anope will emit integers as their native JSON type. If you are
* using JavaScript (which has 53 bit integers) or another language with
* native integer types smaller than 64 bits you may need to limit the size
* of integers emitted by Anope.
*
* If this is enabled a string will be used for values outside of the range
* supported by the native data type.
*/
#integer_bits = 53
/* Web service to use. Requires httpd. */
server = "httpd/main"
/*
* You can also specify one or more authorization tokens to protect access
* to the JSON-RPC interface. These tokens should be sent using the Bearer
* authorization header as defined in RFC 6750.
*/
#token
{
/* The token used for authentication. */
token = "BmcxTaiYjoBtayfnxCFq"
/*
* The algorithm which the above token is hashed with. If this is not
* set then services will assume the above password is not hashed.
*
* You will need to have the appropriate encryption module (e.g.
* enc_bcrypt) loaded in order for this to work.
*/
#token_hash = "bcrypt"
/** A list of glob patterns for methods the token can execute. */
methods = "~anope.message* anope.*"
}
}
/*
* m_xmlrpc_main
* [EXTRA] xmlrpc
*
* Adds the main XMLRPC core functions.
* Requires m_xmlrpc.
* Allows remote applications to execute methods within Anope using the XML-RPC
* protocol. See https://xmlrpc.com/spec.md for more information.
*
* By itself this module does nothing. You should load a RPC method module like
* rpc_data which actually provides RPC methods.
*
* IMPORTANT: this can not be loaded at the same time as the jsonrpc module.
*/
#module { name = "m_xmlrpc_main" }
#module
{
name = "xmlrpc"
/*
* Whether to enable the use of XML-RPC extensions.
*
* By default Anope will use some extended XML-RPC types. If your XML-RPC
* client can not handle these you will need to disable them.
*
* If i8 is disabled a string will be used for values outside of the range
* supported by the 32-bit int data type.
*
* If nil is disabled an empty struct will be used instead.
*/
#enable_i8 = no
#enable_nil = no
/* Web service to use. Requires httpd. */
server = "httpd/main"
/*
* You can also specify one or more authorization tokens to protect access
* to the XML-RPC interface. These tokens should be sent using the Bearer
* authorization header as defined in RFC 6750.
*/
#token
{
/* The token used for authentication. */
token = "BmcxTaiYjoBtayfnxCFq"
/*
* The algorithm which the above token is hashed with. If this is not
* set then services will assume the above password is not hashed.
*
* You will need to have the appropriate encryption module (e.g.
* enc_bcrypt) loaded in order for this to work.
*/
#token_hash = "bcrypt"
/** A list of glob patterns for methods the token can execute. */
methods = "~anope.message* anope.*"
}
}
/*
* rpc_user
*
* Adds support for the following RPC methods:
*
* anope.checkCredentials anope.identify
* anope.listCommands anope.command
*
* Requires either the jsonrpc or xmlrpc module.
*
* See docs/RPC/rpc_user.md for API documentation.
*/
#module
{
name = "rpc_user"
/*
* Some commands can only be executed by a real IRC user. You can work around
* this executing them as an IRC user logged into the account if one exists.
*/
pretenduser = no
}
/*
* rpc_data
*
* Adds support for the following RPC methods:
*
* anope.listAccounts anope.account
* anope.listChannels anope.channel
* anope.listOpers anope.oper
* anope.listServers anope.server
* anope.listUsers anope.user
*
* Requires either the jsonrpc or xmlrpc module.
*
* See docs/RPC/rpc_data.md for API documentation.
*/
#module { name = "rpc_data" }
/*
* rpc_message
*
* Adds support for the following RPC methods:
*
* anope.messageNetwork anope.messageServer
* anope.messageUser
*
* Requires either the jsonrpc or xmlrpc module.
*
* See docs/RPC/rpc_message.md for API documentation.
*/
#module { name = "rpc_message" }
/*
* rpc_system
*
* Adds support for the following RPC methods:
*
* system.listMethods
*
* Requires either the jsonrpc or xmlrpc module.
*
* See https://gggeek.github.io/phpxmlrpc/doc-1.1/ch08.html for API
* documentation.
*/
#module { name = "rpc_system" }
+233 -150
View File
@@ -21,12 +21,12 @@ service
/*
* The hostname of the NickServ client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the NickServ client.
*/
gecos = "Nickname Registration Service"
real = "Nickname Registration Service"
/*
* The modes this client should use.
@@ -49,6 +49,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "NS"
}
/*
@@ -66,20 +77,23 @@ module
client = "NickServ"
/*
* Force users to give an e-mail address when they register a nick.
* Requires users to give an email address when they register a nick.
*
* This directive defaults to "yes" and is recommended to be enabled. This is required if e-mail registration is enabled.
* This directive defaults to "yes" and is recommended to be enabled.
*/
forceemail = yes
/*
* Require users who change their email address to confirm they
* own their new email.
*
* If {ns_register}:registration is set to mail then this defaults
* to yes. Otherwise, it defaults to no.
*/
confirmemailchanges = no
#confirmemailchanges = yes
/*
* A message sent to users on connect if they use an unregistered nick. %n will be replaced with the user's nickname.
* A message sent to users on connect if they use an unregistered nick. {nick} will be replaced with the user's nickname.
*
* This directive is optional.
*/
@@ -91,15 +105,8 @@ module
* by spaces.
*
* The options are:
* - killprotect: Kill nick if not identified within 60 seconds
* - kill_quick: Kill nick if not identified within 20 seconds, this one overrides the killprotect
* option and the killprotect option must be specified with this one
* - kill_immed: Kill nick immediately if not identified, this one overrides both the killprotect
* and kill_quick options and the killprotect option must be specified with this one
* - ns_secure: Enable nickname security, requiring the nick's password before any operations
* can be done on it
* - ns_private: Hide the nick from NickServ's LIST command
* - hide_email: Hide the nick's e-mail address from NickServ's INFO command
* - hide_email: Hide the nick's email address from NickServ's INFO command
* - hide_mask: Hide the nick's last or current user@host from NickServ's INFO command
* - hide_status: Hide the nick's services operator access status from NickServ's INFO command
* - hide_quit: Hide the nick's last quit message from NickServ's INFO command
@@ -108,28 +115,28 @@ module
* - memo_mail: Notify user if they have a new memo by mail
* - autoop: User will be automatically opped in channels they enter and have access to
* - neverop: User can not be added to access lists
* - msg: Messages will be sent as PRIVMSGs instead of NOTICEs, requires options:useprivmsg
* to be enabled as well
* - msg: Messages will be sent as PRIVMSGs instead of NOTICEs
* - ns_keep_modes: Enables keepmodes, which retains user modes across sessions
* - ns_no_expire: Enables no expire. Unconfirmed expire overrules this.
* - protect: Protects the registered nickname from use by unidentified users.
* - ns_stats: Enable Chanstats for newly registered nicks
*
* This directive is optional, if left blank, the options will default to ns_secure, memo_signon, and
* This directive is optional, if left blank, the options will default to memo_signon, and
* memo_receive. If you really want no defaults, use "none" by itself as the option.
*/
defaults = "killprotect ns_secure ns_private hide_email hide_mask memo_signon memo_receive autoop"
defaults = "autoop hide_email hide_mask memo_receive memo_signon ns_private protect"
/*
* The minimum length of time between consecutive uses of NickServ's REGISTER command. This
* directive is optional, but recommended. If not set, this restriction will be disabled.
*/
regdelay = 30s
regdelay = 5m
/*
* The length of time before a nick's registration expires.
*
* This directive is optional, but recommended. If not set, the default is 90 days.
* This directive is optional, but recommended. If not set, the default is one year.
*/
expire = 90d
expire = 1y
/*
* Prevents the use of the ACCESS and CERT (excluding their LIST subcommand), DROP, FORBID, SUSPEND
@@ -158,14 +165,28 @@ module
* If set, Anope will not show netsplits in the last quit message field
* of NickServ's INFO command.
*/
hidenetsplitquit = no
hidenetsplitquit = yes
/*
* If set, is the length of time NickServ's killquick and kill options wait before
* forcing users off of protected nicknames.
* The default period to force users to stop using a protected nickname after.
*
* Defaults to 1 minute.
*/
killquick = 20s
kill = 60s
defaultprotect = 1m
/*
* The minimum period that a user can have a user forced off their protected nickname after.
*
* Defaults to 10 seconds.
*/
minprotect = 10s
/*
* The maximum period that a user can have a user forced off their protected nickname after.
*
* Defaults to 10 minutes.
*/
maxprotect = 10m
/*
* If set, forbids the registration of nicks that contain an existing
@@ -182,11 +203,13 @@ module
#restrictopernicks = yes
/*
* The username, and possibly hostname, used for fake users created when Anope needs to
* hold a nickname.
* The username, hostname, and real name used for pseudoclients created when
* Anope needs to hold a nickname. This is only used if your IRCd does not
* support SVSHOLDs.
*/
enforceruser = "enforcer"
enforcerhost = "services.host"
enforcerhost = "${services.host}"
enforcerreal = "Services Enforcer"
/*
* The length of time Anope should hold nicknames for.
@@ -196,13 +219,17 @@ module
releasetimeout = 1m
/*
* When a user's nick is forcibly changed to enforce a "nick kill", their new nick will start
* with this value. The rest will be made up of 6 or 7 digits.
* Make sure this is a valid nick and Nicklen+7 is not longer than the allowed Nicklen on your ircd.
* When a user's nick is forcibly changed to enforce nickname protection their new
* nick will be based on this value. Any # in the value will be replaced with a random
* number. If your IRCd has support for unique identifiers you can also set this to an
* empty string to change a user's nick to their unique identifier.
*
* This directive is optional. If not set it defaults to "Guest"
* Make sure this is a valid nick and that it is is not longer than the maximum nick
* length on your IRCd.
*
* This directive is optional. If not set it defaults to "Guest####"
*/
guestnickprefix = "Guest"
guestnick = "Guest####"
/*
* If set, Anope does not allow ownership of nick names, only ownership of accounts.
@@ -212,16 +239,22 @@ module
/*
* The minimum length of passwords
*
* This directive is optional. If not set it defaults to 8.
* This directive is optional. If not set it defaults to 10.
*/
minpasslen = 8
minpasslen = 10
/*
* The maximum length of passwords
*
* This directive is optional. If not set it defaults to 32.
* This directive is optional. If not set it defaults to 50.
*/
maxpasslen = 32
maxpasslen = 50
/*
* Whether all of the secondary nicks of an account have to expire or be
* dropped before the display nick can expire or be dropped.
*/
preservedisplay = no
}
/*
@@ -249,33 +282,6 @@ command_group
/* Give it a help command. */
command { service = "NickServ"; name = "HELP"; command = "generic/help"; }
/*
* ns_access
*
* Provides the command nickserv/access.
*
* Used for configuring what hosts have access to your account.
*/
module
{
name = "ns_access"
/*
* The maximum number of entries allowed on a nickname's access list.
* If not set, the default is 32. This number cannot be set to 0.
*/
accessmax = 32
/*
* If set, Anope will add the usermask of registering users to the access list of their
* newly created account. If not set, users will always have to identify to NickServ before
* being recognized, unless they manually add an address to the access list of their account.
* This directive is optional.
*/
addaccessonreg = no
}
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/access"; }
/*
* ns_ajoin
*
@@ -303,6 +309,7 @@ command { service = "NickServ"; name = "AJOIN"; command = "nickserv/ajoin"; }
*/
module { name = "ns_alist" }
command { service = "NickServ"; name = "ALIST"; command = "nickserv/alist"; }
command { service = "NickServ"; name = "ACCESS"; command = "nickserv/alist"; hide = yes; }
/*
* ns_cert
@@ -315,6 +322,12 @@ module
{
name = "ns_cert"
/*
* Should users who are connected with a SSL client certificate have its fingerprint be added to
* their account when they register. Defaults to yes.
*/
automatic = yes
/*
* The maximum number of entries allowed on a nickname's certificate fingerprint list.
* The default is 5. This number cannot be set to 0.
@@ -323,6 +336,16 @@ module
}
command { service = "NickServ"; name = "CERT"; command = "nickserv/cert"; }
/*
* ns_confirm
*
* Provides the command nickserv/confirm.
*
* Used for confirming previous account actions.
*/
module { name = "ns_confirm" }
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm"; }
/*
* ns_drop
*
@@ -334,21 +357,51 @@ module { name = "ns_drop" }
command { service = "NickServ"; name = "DROP"; command = "nickserv/drop"; }
/*
* ns_getemail
* ns_email
*
* Provides the command nickserv/getemail.
* Provides various functionality relating to email addresses. This includes the
* following commands:
*
* Used for getting registered accounts by searching for emails.
* - nickserv/confirm/email: Used for confirming email changes.
* - nickserv/getemail: Used for getting accounts by searching for emails.
* - nickserv/set/email, nickserv/saset/email: Used for setting an account's
* emailvaddress.
*/
module { name = "ns_getemail" }
module
{
name = "ns_email"
/*
* The amount of time a user has after requesting a change of email address
* before it expires. Defaults to 1 day.
*/
#changeexpire = 1d
/*
* The limit to how many registered accounts can use the same email address.
* If set to 0 or left commented there will be no limit enforced when
* registering new accounts or using /msg NickServ SET EMAIL.
*/
#maxemails = 1
/*
* Whether to attempt to remove aliases when counting email addresses. This
* means removing dots (.) and anything after a plus (+) in the user part of
* the address, e.g. foo.bar+baz@example.com -> foobar@example.com.
*/
#remove_aliases = yes
}
command { service = "NickServ"; name = "CONFIRM EMAIL"; command = "nickserv/confirm/email"; }
command { service = "NickServ"; name = "GETEMAIL"; command = "nickserv/getemail"; permission = "nickserv/getemail"; group = "nickserv/admin"; }
command { service = "NickServ"; name = "SET EMAIL"; command = "nickserv/set/email"; }
command { service = "NickServ"; name = "SASET EMAIL"; command = "nickserv/saset/email"; permission = "nickserv/saset/email"; }
/*
* ns_group
*
* Provides the commands nickserv/group, nickserv/glist, and nickserv/ungroup.
*
* Used for controlling nick groups.
* Used for controlling grouped nicknames.
*/
module
{
@@ -359,7 +412,7 @@ module
*
* This directive is optional, but recommended. If not set or set to 0, no limits will be applied.
*/
maxaliases = 16
maxaliases = 10
/*
* If set, the NickServ GROUP command won't allow any group changes. This is recommended to
@@ -390,7 +443,7 @@ module
*/
maxlogins = 10
}
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = true; }
command { service = "NickServ"; name = "ID"; command = "nickserv/identify"; hide = yes; }
command { service = "NickServ"; name = "IDENTIFY"; command = "nickserv/identify"; }
/*
@@ -463,13 +516,13 @@ module
command { service = "NickServ"; name = "RECOVER"; command = "nickserv/recover"; }
# For compatibility with Anope 1.8 and Atheme.
command { service = "NickServ"; name = "GHOST"; command = "nickserv/recover"; hide = true; }
command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; hide = true; }
command { service = "NickServ"; name = "GHOST"; command = "nickserv/recover"; hide = yes; }
command { service = "NickServ"; name = "RELEASE"; command = "nickserv/recover"; hide = yes; }
/*
* ns_register
*
* Provides the commands nickserv/confirm, nickserv/register, and nickserv/resend.
* Provides the commands nickserv/confirm/register, nickserv/register, and nickserv/resend.
*
* Used for registering accounts.
*/
@@ -478,9 +531,13 @@ module
name = "ns_register"
/*
* Registration confirmation setting. Set to "none" for no registration confirmation,
* "mail" for email confirmation, and "admin" to have services operators manually confirm
* every registration. Set to "disable" to completely disable all registrations.
* The method for confirming account registrations. Possible values are:
*
* "admin" to require confirmation by a Services Operator.
* "code" to require confirmation with a code provided via IRC.
* "disable" to disable account registration.
* "mail" to require confirmation with a code provided via email.
* "none" to automatically confirm (this is the default).
*/
registration = "none"
@@ -497,7 +554,7 @@ module
*
* This directive is optional.
*/
#nickregdelay = 30s
nickregdelay = 15s
/*
* The length of time a user using an unconfirmed account has
@@ -505,20 +562,51 @@ module
*/
#unconfirmedexpire = 1d
}
command { service = "NickServ"; name = "CONFIRM"; command = "nickserv/confirm"; }
command { service = "NickServ"; name = "CONFIRM REGISTER"; command = "nickserv/confirm/register"; }
command { service = "NickServ"; name = "REGISTER"; command = "nickserv/register"; }
command { service = "NickServ"; name = "RESEND"; command = "nickserv/resend"; }
/*
* ns_resetpass
*
* Provides the command nickserv/resetpass.
* Provides the command nickserv/confirm/resetpass and nickserv/resetpass.
*
* Used for resetting passwords by emailing users a temporary one.
*/
module { name = "ns_resetpass" }
module
{
name = "ns_resetpass"
/*
* The amount of time a user has after requesting a password reset before it
* expires. Defaults to 1 day.
*/
#resetexpire = 1d
}
command { service = "NickServ"; name = "CONFIRM RESETPASS"; command = "nickserv/confirm/resetpass"; }
command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpass"; }
/*
* ns_sasl
*
* Provides support for authentication to services via IRCv3 SASL. This is a standardised
* alternative to ns_identify that is supported by several IRCds.
*
* You will need to configure your IRCd to use SASL. See the following links for details:
*
* InspIRCd: https://docs.inspircd.org/4/modules/sasl/
* UnrealIRCd: https://www.unrealircd.org/docs/SASL#Enabling_SASL_on_the_server
*/
module
{
name = "ns_sasl"
/*
* The nick of the client which operates as the SASL agent.
*/
#agent = "NickServ"
}
/*
* ns_set
*
@@ -526,27 +614,12 @@ command { service = "NickServ"; name = "RESETPASS"; command = "nickserv/resetpas
* nickserv/set, nickserv/saset - Dummy help wrappers for the SET and SASET commands.
* nickserv/set/autoop, nickserv/saset/autoop - Determines whether or not modes are automatically set users when joining a channel.
* nickserv/set/display, nickserv/saset/display - Used for setting a users display name.
* nickserv/set/email, nickserv/saset/email - Used for setting a users email address.
* nickserv/set/keepmodes, nickserv/saset/keepmodes - Configure whether or not services should retain a user's modes across sessions.
* nickserv/set/kill, nickserv/saset/kill - Used for configuring nickname protection.
* nickserv/set/language, nickserv/saset/language - Used for configuring what language services use.
* nickserv/set/message, nickserv/saset/message - Used to configure how services send messages to you.
* nickserv/set/password, nickserv/saset/password - Used for changing a users password.
* nickserv/set/secure, nickserv/saset/secure - Used for configuring whether a user can identify by simply being recognized by nickserv/access.
* nickserv/set/neverop, nickserv/saset/neverop - Used to configure whether a user can be added to access lists
* nickserv/saset/noexpire - Used for configuring noexpire, which prevents nicks from expiring.
* nickserv/set/password, nickserv/saset/password - Used for changing a users password.
*/
module
{
name = "ns_set"
/*
* Allow the use of the IMMED option in the NickServ SET KILL command.
*
* This directive is optional.
*/
#allowkillimmed = yes
}
module { name = "ns_set" }
command { service = "NickServ"; name = "SET"; command = "nickserv/set"; }
command { service = "NickServ"; name = "SASET"; command = "nickserv/saset"; permission = "nickserv/saset/"; group = "nickserv/admin"; }
@@ -557,32 +630,60 @@ command { service = "NickServ"; name = "SASET AUTOOP"; command = "nickserv/saset
command { service = "NickServ"; name = "SET DISPLAY"; command = "nickserv/set/display"; }
command { service = "NickServ"; name = "SASET DISPLAY"; command = "nickserv/saset/display"; permission = "nickserv/saset/display"; }
command { service = "NickServ"; name = "SET EMAIL"; command = "nickserv/set/email"; }
command { service = "NickServ"; name = "SASET EMAIL"; command = "nickserv/saset/email"; permission = "nickserv/saset/email"; }
command { service = "NickServ"; name = "SET KEEPMODES"; command = "nickserv/set/keepmodes"; }
command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/saset/keepmodes"; permission = "nickserv/saset/keepmodes"; }
command { service = "NickServ"; name = "SET KILL"; command = "nickserv/set/kill"; }
command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/kill"; permission = "nickserv/saset/kill"; }
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/set/language"; }
command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language"; }
command { service = "NickServ"; name = "SET MESSAGE"; command = "nickserv/set/message"; }
command { service = "NickServ"; name = "SASET MESSAGE"; command = "nickserv/saset/message"; permission = "nickserv/saset/message"; }
command { service = "NickServ"; name = "SET PASSWORD"; command = "nickserv/set/password"; }
command { service = "NickServ"; name = "SASET PASSWORD"; command = "nickserv/saset/password"; permission = "nickserv/saset/password"; }
command { service = "NickServ"; name = "SET SECURE"; command = "nickserv/set/secure"; }
command { service = "NickServ"; name = "SASET SECURE"; command = "nickserv/saset/secure"; permission = "nickserv/saset/secure"; }
command { service = "NickServ"; name = "SET NEVEROP"; command = "nickserv/set/neverop"; }
command { service = "NickServ"; name = "SASET NEVEROP"; command = "nickserv/saset/neverop"; permission = "nickserv/saset/neverop"; }
command { service = "NickServ"; name = "SASET NOEXPIRE"; command = "nickserv/saset/noexpire"; permission = "nickserv/saset/noexpire"; }
/*
* ns_set_keepmodes
*
* Provides the command nickserv/set/keepmodes and nickserv/saset/keepmodes.
*
* Allows configuring services to keep user modes across logins.
*/
module
{
name = "ns_set_keepmodes"
/*
* Anope will try to not restore user modes that aren't settable by users. However, if
* you have modes that you don't want to be automatically restored you can list them
* here.
*/
#norestore = "ABCabc"
}
command { service = "NickServ"; name = "SET KEEPMODES"; command = "nickserv/set/keepmodes"; }
command { service = "NickServ"; name = "SASET KEEPMODES"; command = "nickserv/saset/keepmodes"; permission = "nickserv/saset/keepmodes"; }
/*
* ns_set_language
*
* Provides the command nickserv/set/language and nickserv/saset/language.
*
* Allows configuring the language that services uses.
*/
module { name = "ns_set_language" }
command { service = "NickServ"; name = "SET LANGUAGE"; command = "nickserv/set/language"; }
command { service = "NickServ"; name = "SASET LANGUAGE"; command = "nickserv/saset/language"; permission = "nickserv/saset/language"; }
/*
* ns_set_message
*
* Provides the commands nickserv/set/message and nickserv/saset/message.
*
* Allows users to let services send them PRIVMSGs instead of NOTICEs.
*
* This might cause problems with badly written clients as the IRC RFC
* requires that automatic responses to a PRIVMSG use a NOTICE to avoid
* message loops. Only enable this if you are sure this can not happen.
*/
#module { name = "ns_set_message" }
#command { service = "NickServ"; name = "SET MESSAGE"; command = "nickserv/set/message"; }
#command { service = "NickServ"; name = "SASET MESSAGE"; command = "nickserv/saset/message"; permission = "nickserv/saset/message"; }
/*
* ns_set_misc
@@ -597,21 +698,26 @@ command { service = "NickServ"; name = "SET URL"; command = "nickserv/set/misc";
command { service = "NickServ"; name = "SASET URL"; command = "nickserv/saset/misc"; misc_description = _("Associate a URL with this account"); permission = "nickserv/saset/url"; group = "nickserv/admin"; }
#command { service = "NickServ"; name = "SET DISCORD"; command = "nickserv/set/misc"; misc_description = _("Associate a Discord account with your account"); }
#command { service = "NickServ"; name = "SASET DISCORD"; command = "nickserv/saset/misc"; misc_description = _("Associate a Discord account with this account"); permission = "nickserv/saset/discord"; group = "nickserv/admin"; }
#command { service = "NickServ"; name = "SET FACEBOOK"; command = "nickserv/set/misc"; misc_description = _("Associate a Facebook URL with your account"); }
#command { service = "NickServ"; name = "SASET FACEBOOK"; command = "nickserv/saset/misc"; misc_description = _("Associate a Facebook URL with this account"); permission = "nickserv/saset/facebook"; group = "nickserv/admin"; }
#command { service = "NickServ"; name = "SET MASTODON"; command = "nickserv/set/misc"; misc_description = _("Associate a Mastodon account with your account"); }
#command { service = "NickServ"; name = "SASET MASTODON"; command = "nickserv/saset/misc"; misc_description = _("Associate a Mastodon account with this account"); permission = "nickserv/saset/mastodon"; group = "nickserv/admin"; }
#command { service = "NickServ"; name = "SET TIMEZONE"; command = "nickserv/set/misc"; misc_description = _("Associate a time zone with your account"); }
#command { service = "NickServ"; name = "SASET TIMEZONE"; command = "nickserv/saset/misc"; misc_description = _("Associate a time zone with this account"); permission = "nickserv/saset/timezone"; group = "nickserv/admin"; }
/*
* ns_status
* ns_set_protect
*
* Provides the nickserv/status command.
* Provides the commands nickserv/set/protect and kickserv/saset/protect.
*
* Used to determine if a user is recognized or identified by services.
* Used for configuring nickname protection.
*/
module { name = "ns_status" }
command { service = "NickServ"; name = "STATUS"; command = "nickserv/status"; }
module { name = "ns_set_protect" }
command { service = "NickServ"; name = "SET PROTECT"; command = "nickserv/set/protect"; }
command { service = "NickServ"; name = "SASET PROTECT"; command = "nickserv/saset/protect"; permission = "nickserv/saset/kill"; }
# For compatibility with Anope 2.0.
command { service = "NickServ"; name = "SET KILL"; command = "nickserv/set/protect"; hide = yes; }
command { service = "NickServ"; name = "SASET KILL"; command = "nickserv/saset/protect"; permission = "nickserv/saset/protect"; hide = yes; }
/*
* ns_suspend
@@ -646,30 +752,7 @@ command { service = "NickServ"; name = "UNSUSPEND"; command = "nickserv/unsuspen
*
* Provides the command nickserv/update.
*
* Used to update your status on all channels, turn on your vHost, etc.
* Used to update your status on all channels, turn on your vhost, etc.
*/
module { name = "ns_update" }
command { service = "NickServ"; name = "UPDATE"; command = "nickserv/update"; }
/*
* Extra NickServ related modules.
*/
/*
* ns_maxemail
*
* Limits how many times the same email address may be used in Anope
* to register accounts.
*/
#module
{
name = "ns_maxemail"
/*
* The limit to how many registered nicks can use the same e-mail address. If set to 0 or left
* commented, there will be no limit enforced when registering new accounts or using
* /msg NickServ SET EMAIL.
*/
maxemails = 1
}
+39 -11
View File
@@ -21,12 +21,12 @@ service
/*
* The hostname of the OperServ client.
*/
host = "services.host"
host = "${services.host}"
/*
* The realname of the OperServ client.
*/
gecos = "Operator Service"
real = "Operator Service"
/*
* The modes this client should use.
@@ -49,6 +49,17 @@ service
* Prefixes may be given to the channels in the form of mode characters or prefix symbols.
*/
#channels = "@#services,#mychan"
/*
* The server alias that can be used to securely message this service. If
* your IRC server does not have an alias for this service you can set this
* to an empty string to tell users to use /msg instead.
*
* This setting is ignored when options:servicealias is disabled.
*
* Defaults to the nick of the service if not set.
*/
#alias = "OS"
}
/*
@@ -100,7 +111,7 @@ module
killonsqline = yes
/*
* Adds the nickname of the IRC Operator issuing an AKILL to the kill reason.
* Adds the nickname of the Services Operator issuing an AKILL to the kill reason.
*
* This directive is optional.
*/
@@ -267,7 +278,7 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
*
* Provides the command operserv/dns.
*
* This module requires that m_dns is loaded.
* This module requires that dns is loaded.
*
* This module allows controlling a DNS zone. This is useful for
* controlling what servers users are placed on for load balancing,
@@ -276,15 +287,15 @@ command { service = "OperServ"; name = "CHANKILL"; command = "operserv/chankill"
* To use this module you must set a nameserver record for services
* so that DNS queries go to services.
*
* Alternatively, you may use a slave DNS server to hide service's IP,
* Alternatively, you may use a secondary DNS server to hide services' IP,
* provide query caching, and provide better fault tolerance.
*
* To do this using BIND, configure similar to:
*
* options { max-refresh-time 60; };
* zone "irc.example.com" IN {
* type slave;
* masters { 127.0.0.1 port 5353; };
* type secondary;
* primaries { 127.0.0.1 port 5353; };
* };
*
* Where 127.0.0.1:5353 is the IP and port services are listening on.
@@ -491,6 +502,13 @@ module
* This directive is optional, if not set it will default to 3.
*/
#newscount = 3
/*
* Whether to show the datetime at which the news entry was added.
*
* This directive is optional, if not set it will default to yes.
*/
#showdate = yes
}
command { service = "OperServ"; name = "LOGONNEWS"; command = "operserv/logonnews"; permission = "operserv/news"; }
command { service = "OperServ"; name = "OPERNEWS"; command = "operserv/opernews"; permission = "operserv/news"; }
@@ -503,7 +521,7 @@ command { service = "OperServ"; name = "RANDOMNEWS"; command = "operserv/randomn
*
* Used to NOOP a server, which prevents users from opering on that server.
*/
module { name = "os_noop" }
#module { name = "os_noop" }
command { service = "OperServ"; name = "NOOP"; command = "operserv/noop"; permission = "operserv/noop"; }
/*
@@ -569,7 +587,7 @@ module
*
* This directive is optional, if not set, nothing will be sent.
*/
sessionlimitexceeded = "The session limit for your IP %IP% has been exceeded."
sessionlimitexceeded = "The session limit for your IP {ip} has been exceeded."
/*
* Same as above, but should be used to provide a website address where users can find out more
@@ -638,8 +656,18 @@ command { service = "OperServ"; name = "SET"; command = "operserv/set"; permissi
*
* Used to quit, restart, or shutdown services.
*/
module { name = "os_shutdown" }
command { service = "OperServ"; name = "QUIT"; command = "operserv/quit"; permission = "operserv/quit"; }
module
{
name = "os_shutdown"
/*
* If enabled then server operators will be required to provide the network
* name to confirm that they are quitting, restarting, or shutting down the
* right server.
*/
requirename = yes
}
#command { service = "OperServ"; name = "QUIT"; command = "operserv/quit"; permission = "operserv/quit"; }
command { service = "OperServ"; name = "RESTART"; command = "operserv/restart"; permission = "operserv/restart"; }
command { service = "OperServ"; name = "SHUTDOWN"; command = "operserv/shutdown"; permission = "operserv/shutdown"; }
-517
View File
@@ -1,517 +0,0 @@
/*
* Example configuration file for Anope. After making the appropriate
* changes to this file, place it in the Anope conf directory (as
* specified in the "Config" script, default /home/username/anope/conf)
* under the name "anope.conf".
*
* The format of this file is fairly simple: three types of comments are supported:
* - All text after a '#' on a line is ignored, as in shell scripting
* - All text after '//' on a line is ignored, as in C++
* - A block of text like this one is ignored, as in C
*
* Outside of comments, there are three structures: blocks, keys, and values.
*
* A block is a named container, which contains a number of key to value pairs
* - you may think of this as an array.
*
* A block is created like so:
* foobar
* {
* moo = "cow"
* foo = bar
* }
*
* Note that nameless blocks are allowed and are often used with comments to allow
* easily commenting an entire block, for example:
* #foobar
* {
* moo = "cow"
* foo = bar
* }
* is an entirely commented block.
*
* Keys are case insensitive. Values depend on what key - generally, information is
* given in the key comment. The quoting of values (and most other syntax) is quite
* flexible, however, please do not forget to quote your strings:
*
* "This is a parameter string with spaces in it"
*
* If you need to include a double quote inside a quoted string, precede it
* by a backslash:
*
* "This string has \"double quotes\" in it"
*
* Time parameters can be specified either as an integer representing a
* number of seconds (e.g. "3600" = 1 hour), or as an integer with a unit
* specifier: "s" = seconds, "m" = minutes, "h" = hours, "d" = days.
* Combinations (such as "1h30m") are not permitted. Examples (all of which
* represent the same length of time, one day):
*
* "86400", "86400s", "1440m", "24h", "1d"
*
* In the documentation for each directive, one of the following will be
* included to indicate whether an option is required:
*
* [REQUIRED]
* Indicates a directive which must be given. Without it, Anope will
* not start.
*
* [RECOMMENDED]
* Indicates a directive which may be omitted, but omitting it may cause
* undesirable side effects.
*
* [OPTIONAL]
* Indicates a directive which is optional. If not given, the feature
* will typically be disabled. If this is not the case, more
* information will be given in the documentation.
*
* [DISCOURAGED]
* Indicates a directive which may cause undesirable side effects if
* specified.
*
* [DEPRECATED]
* Indicates a directive which will disappear in a future version of
* Anope, usually because its functionality has been either
* superseded by that of other directives or incorporated into the main
* program.
*/
/*
* [OPTIONAL] Defines
*
* You can define values to other values, which can be used to easily change
* many values in the configuration at once.
*/
/*
* The stats.host define is used in multiple different locations throughout the
* configuration for the stats client hostname.
*/
define
{
name = "stats.host"
value = "stats.example.com"
}
/*
* [OPTIONAL] Additional Includes
*
* You can include additional configuration files here.
* You may also include executable files, which will be executed and
* the output from it will be included into your configuration.
*/
#include
{
type = "file"
name = "some.conf"
}
#include
{
type = "executable"
name = "/usr/bin/wget -q -O - https://some.misconfigured.network.com/stats.conf"
}
/*
* [REQUIRED] IRCd Config
*
* This section is used to set up Anope to connect to your IRC network.
* This section can be included multiple times, and Anope will attempt to
* connect to each server until it finally connects.
*
* Each uplink IRCd should have a corresponding configuration to allow Anope
* to link to it.
*
* An example configuration for InspIRCd that is compatible with the below uplink
* and serverinfo configuration would look like:
*
* # This goes in inspircd.conf, *NOT* your Anope config!
* <link name="stats.example.com"
* ipaddr="127.0.0.1"
* port="7000"
* sendpass="mypassword"
* recvpass="mypassword">
* <uline server="stats.example.com" silent="yes">
* <bind address="127.0.0.1" port="7000" type="servers">
*
* An example configuration for UnrealIRCd that is compatible with the below uplink
* and serverinfo configuration would look like:
*
* // This goes in unrealircd.conf, *NOT* your Anope config!
* listen {
* ip 127.0.0.1;
* port 7000;
* options {
* serversonly;
* };
* };
* link stats.example.com {
* incoming {
* mask *@127.0.0.1;
* };
* password "mypassword";
* class servers;
* };
* ulines { stats.example.com; };
*/
uplink
{
/*
* The IP address, hostname, or UNIX socket path of the IRC server you wish
* to connect Anope to.
* Usually, you will want to connect over 127.0.0.1 (aka localhost).
*
* NOTE: On some shell providers, this will not be an option.
*/
host = "127.0.0.1"
/*
* The protocol that Anope should use when connecting to the uplink. Can
* be set to "ipv4" (the default), "ipv6", or "unix".
*/
protocol = "ipv4"
/*
* Enable if Anope should connect using SSL.
* You must have an SSL module loaded for this to work.
*/
ssl = no
/*
* The port to connect to.
* The IRCd *MUST* be configured to listen on this port, and to accept
* server connections.
*
* Refer to your IRCd documentation for how this is to be done.
*/
port = 7000
/*
* The password to send to the IRC server for authentication.
* This must match the link block on your IRCd.
*
* Refer to your IRCd documentation for more information on link blocks.
*/
password = "mypassword"
}
/*
* [REQUIRED] Server Information
*
* This section contains information about the services server.
*/
serverinfo
{
/*
* The hostname that Anope will be seen as, it must have no conflicts with any
* other server names on the rest of your IRC network. Note that it does not have
* to be an existing hostname, just one that isn't on your network already.
*/
name = "stats.example.com"
/*
* The text which should appear as the server's information in /WHOIS and similar
* queries.
*/
description = "Anope IRC Statistics"
/*
* The local address that Anope will bind to before connecting to the remote
* server. This may be useful for multihomed hosts. If omitted, Anope will let
* the Operating System choose the local address. This directive is optional.
*
* If you don't know what this means or don't need to use it, just leave this
* directive commented out.
*/
#localhost = "nowhere."
/*
* What Server ID to use for this connection?
* Note: This should *ONLY* be used for TS6/P10 IRCds. Refer to your IRCd documentation
* to see if this is needed.
*/
#id = "00A"
/*
* The filename containing the Anope process ID. The path is relative to the
* services root directory.
*/
pid = "data/anope.pid"
/*
* The filename containing the Message of the Day. The path is relative to the
* services root directory.
*/
motd = "conf/motd.txt"
}
/*
* [REQUIRED] Protocol module
*
* This directive tells Anope which IRCd Protocol to speak when connecting.
* You MUST modify this to match the IRCd you run.
*
* Supported:
* - bahamut
* - hybrid
* - inspircd
* - ngircd
* - plexus
* - ratbox
* - solanum
* - unrealircd
*/
module
{
name = "inspircd"
}
/*
* [REQUIRED] Network Information
*
* This section contains information about the IRC network that Anope will be
* connecting to.
*/
networkinfo
{
/*
* This is the name of the network that Anope will be running on.
*/
networkname = "LocalNet"
/*
* Set this to the maximum allowed nick length on your network.
* Be sure to set this correctly, as setting this wrong can result in
* Anope being disconnected from the network.
*/
nicklen = 31
/* Set this to the maximum allowed ident length on your network.
* Be sure to set this correctly, as setting this wrong can result in
* Anope being disconnected from the network.
*/
userlen = 10
/* Set this to the maximum allowed hostname length on your network.
* Be sure to set this correctly, as setting this wrong can result in
* Anope being disconnected from the network.
*/
hostlen = 64
/* Set this to the maximum allowed channel length on your network.
*/
chanlen = 32
/* The maximum number of list modes settable on a channel (such as b, e, I).
* Comment out or set to 0 to disable.
*/
modelistsize = 100
/*
* The characters allowed in hostnames. This is used for validating hostnames given
* to services, such as BotServ bot hostnames and user vhosts. Changing this is not
* recommended unless you know for sure your IRCd supports whatever characters you are
* wanting to use. Telling services to set a vHost containing characters your IRCd
* disallows could potentially break the IRCd and/or Anope.
*
* It is recommended you DON'T change this.
*/
vhost_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"
/*
* If set to true, allows vHosts to not contain dots (.).
* Newer IRCds generally do not have a problem with this, but the same warning as
* vhost_chars applies.
*
* It is recommended you DON'T change this.
*/
allow_undotted_vhosts = false
/*
* The characters that are not allowed to be at the very beginning or very ending
* of a vHost. The same warning as vhost_chars applies.
*
* It is recommended you DON'T change this.
*/
disallow_start_or_end = ".-"
}
/*
* [REQUIRED] Anope Options
*
* This section contains various options which determine how Anope will operate.
*/
options
{
/*
* On Linux/UNIX systems Anope can setuid and setgid to this user and group
* after starting up. This is useful if Anope has to bind to privileged ports.
*/
#user = "anope"
#group = "anope"
/*
* The case mapping used by services. This must be set to a valid locale name
* installed on your machine. Anope uses this case map to compare, with
* case insensitivity, things such as nick names, channel names, etc.
*
* We provide two special casemaps shipped with Anope, ascii and rfc1459.
*
* This value should be set to what your IRCd uses, which is probably rfc1459,
* however Anope has always used ascii for comparison, so the default is ascii.
*
* Changing this value once set is not recommended.
*/
casemap = "ascii"
/*
* Sets the timeout period for reading from the uplink.
*/
readtimeout = 5s
/*
* Sets the interval between sending warning messages for program errors via
* WALLOPS/GLOBOPS.
*/
warningtimeout = 4h
/*
* If set, Anope will only show /stats o to IRC Operators. This directive
* is optional.
*/
#hidestatso = yes
/*
* A space-separated list of U-lined servers on your network, it is assumed that
* the servers in this list are allowed to set channel modes and Anope will
* not attempt to reverse their mode changes.
*
* WARNING: Do NOT put your normal IRC user servers in this directive.
*
* This directive is optional.
*/
#ulineservers = "services.your.network"
/*
* How long to wait between connection retries with the uplink(s).
*/
retrywait = 60s
}
/*
* [RECOMMENDED] Logging Configuration
*
* This section is used for configuring what is logged and where it is logged to.
* You may have multiple log blocks if you wish. Remember to properly secure any
* channels you choose to have Anope log to!
*/
log
{
/*
* Target(s) to log to, which may be one of the following:
* - a channel name
* - a filename
* - globops
*/
target = "stats.log"
/* Log to both stats.log and the channel #stats
*
* Note that some older IRCds, such as Ratbox, require services to be in the
* log channel to be able to message it. To do this, configure service:channels to
* join your logging channel.
*/
#target = "stats.log #stats"
/*
* The source(s) to only accept log messages from. Leave commented to allow all sources.
* This can be a users name, a channel name, one of our clients (e.g. OperServ), or a server name.
*/
#source = ""
/*
* The bot used to log generic messages which have no predefined sender if there
* is a channel in the target directive.
*/
bot = "Global"
/*
* The number of days to keep log files, only useful if you are logging to a file.
* Set to 0 to never delete old log files.
*
* Note that Anope must run 24 hours a day for this feature to work correctly.
*/
logage = 7
/*
* What types of log messages should be logged by this block. There are nine general categories:
*
* servers - Server actions, linking, squitting, etc.
* channels - Actions in channels such as joins, parts, kicks, etc.
* users - User actions such as connecting, disconnecting, changing name, etc.
* other - All other messages without a category.
* rawio - Logs raw input and output from services
* debug - Debug messages (log files can become VERY large from this).
*
* These options determine what messages from the categories should be logged. Wildcards are accepted, and
* you can also negate values with a ~. For example, "~operserv/akill operserv/*" would log all operserv
* messages except for operserv/akill. Note that processing stops at the first matching option, which
* means "* ~operserv/*" would log everything because * matches everything.
*
* Valid server options are:
* connect, quit, sync, squit
*
* Valid channel options are:
* create, destroy, join, part, kick, leave, mode
*
* Valid user options are:
* connect, disconnect, quit, nick, ident, host, mode, maxusers, oper, away
*
* Rawio and debug are simple yes/no answers, there are no types for them.
*
* Note that modules may add their own values to these options.
*/
servers = "*"
#channels = "~mode *"
users = "connect disconnect nick"
other = "*"
rawio = no
debug = no
}
/*
* [REQUIRED] MySQL Database configuration.
*
* m_mysql
*
* This module allows other modules to use MySQL.
*/
module
{
name = "m_mysql"
mysql
{
/* The name of this service. */
name = "mysql/main"
database = "anope"
server = "127.0.0.1"
username = "anope"
password = "mypassword"
port = 3306
}
}
/*
* IRC2SQL Gateway
* This module collects data about users, channels and servers. It doesn't build stats
* itself, however, it gives you the database, it's up to you how you use it.
*
* Requires a MySQL Database and MySQL version 5.5 or higher
*/
include
{
type = "file"
name = "irc2sql.example.conf"
}
-1
View File
@@ -1 +0,0 @@
astyle --style=java --indent=tab --brackets=break-closing --indent-switches --indent-cases --brackets=break
+92
View File
@@ -0,0 +1,92 @@
Since the first commit in March 2004 88 people have submitted patches, commits,
and other useful contributions to Anope. These people, ordered by the number of
contributions they have made, are:
* Adam <adam@anope.org>
* Sadie Powell <sadie@witchery.services>
* Robin Burchell <w00t@inspircd.org>
* Naram Qashat <cyberbotx@anope.org>
* Pieter Bootsma <geniusdex@anope.org>
* Jens Voss <dukepyrolator@anope.org>
* David Robson <rob@anope.org>
* Florian Schulze <certus@anope.org>
* Daniel Engel <dane@zero.org>
* Trystan S. Lee <trystan@nomadirc.net>
* Robby <robby@chatbelgie.be>
* Charles Kingsley <chaz@anope.org>
* Lee Holmes <lethality@anope.org>
* Gabriel Acevedo H. <drstein@anope.org>
* Jan Milants <viper@anope.org>
* Adam Kramer <ribosome@anope.org>
* Attila Molnar <attilamolnar@hush.com>
* Michael Wobst <wobst.michael@web.de>
* Mark Summers <mark@goopler.net>
* Matt Schatz <genius3000@g3k.solutions>
* PeGaSuS <droider.pc@gmail.com>
* Daniel Vassdal <shutter@canternet.org>
* MatthewM <mcm@they-got.us>
* Sebastian V. <hal9000@denorastats.org>
* Alvaro Toledo <atoledo@keldon.org>
* Dragone2 <dragone2@risposteinformatiche.it>
* Björn Stiddien <keeper@anope.org>
* n0kS Phr33d0m <god@politeia.in>
* Hendrik Jäger <gitcommit@henk.geekmail.org>
* k4be <k4be@pirc.pl>
* Thomas Fargeix <t.fargeix@gmail.com>
* Val Lorentz <progval+git@progval.net>
* Bram Matthys <syzop@vulnscan.org>
* Federico G. Schwindt <fgsch@lodoss.net>
* Alexander Barton <alex@barton.de>
* CaPa CuL <capacul@gmail.com>
* Cronus <cronus@nite-serv.com>
* H7-25 <simos@simosnap.org>
* Jyzee <jyzee.git@gmail.com>
* Sebastian Barfurth <github@afreshmelon.com>
* Zantox <jyoerger10@msn.com>
* Zoddo <zoddo.ino@gmail.com>
* Dominic Hargreaves <dom@earth.li>
* Michael Hazell <michaelhazell@hotmail.com>
* Robert Scheck <robert@fedoraproject.org>
* Dennis Friis <peavey@inspircd.org>
* Filippo Cortigiani <simos@simosnap.org>
* Michał Zegan <webczat_200@poczta.onet.pl>
* AlphaTech <alphat3ch@icloud.com>
* Austin Ellis <siniStar@IRC4Fun.net>
* bonnedav <theD_2011@hotmail.com>
* Denis M. (Phr33d0m) <god@politeia.in>
* Harakiri <harakiri@overstack.fr>
* Marcin Łabanowski <marcin@6irc.net>
* Matt Ullman <matt@airraidsirens.com>
* Michael Stapelberg <michael@robustirc.net>
* Alexander Maassen <outsider@twingoversum.scarynet.org>
* artemiiav <artemiiav@gmail.com>
* blackbeard420 <blackbeard@blackbeard420.me>
* BoGu5 <bogus@onzin.org>
* Chris Langsenkamp <chris@langsenkamp.com>
* Clem Morton
* Daniel Oaks <danneh@danneh.net>
* Fabio Scotoni <cculex@gmail.com>
* ItsOnlyBinary
* Jason Foster <retsofaj@gmail.com>
* Jeremy <jeremy@ssnet.ca>
* Josh Soref
* KindOne <ineedalifetoday@live.com>
* linuxdaemon
* Mantas Mikulėnas <grawity@gmail.com>
* Matthew Beeching <jobe@mdbnet.co.uk>
* Michael <michaelhazell@hotmail.com>
* Mingjie Shen <shen497@purdue.edu>
* nekoswag
* Peter Tseng <pht24@cornell.edu>
* Romain Rivière <lecoyote@lecoyote.org>
* Sam James (sam_c) <sam@cmpct.info>
* ShutterQuick <shutter@canternet.org>
* Sketch <denverfreeburn@outlook.com>
* Tim Gunter <tim@vanillaforums.com>
* Toni Kaija <diftraku@gmail.com>
* Victor Coss <gtaxl@gtaxl.net>
* VisioN <vision@myirc.us>
* westor <westor7@gmail.com>
* Wilson Birney <wpb@360scada.com>
* Yann Sionneau <yann@sionneau.net>
* Zach Bloomquist <zrbq@live.com>
-1
View File
@@ -1 +0,0 @@
For all bug reports / updates please see https://github.com/anope/anope/issues
-111
View File
@@ -1,111 +0,0 @@
C++-style Casting
=================
In C, you can cast in one of two ways:
(type)var
type(var)
The problem with C-style casting is that it allows a programmer to get away
with too much, and is also not designed to handle C++ classes.
C++ has 4 types of casting in addition to allowing C-style casting. They are:
static_cast
const_cast
dynamic_cast
reinterpret_cast
The syntax is usually *_cast<type>(var).
static_cast
-----------
From my experience, this cast is closest to C-style casting for non-pointer
types as well as between some (but not all) pointer types. This type of cast,
like C-style casting, is performed at compile-time. static_cast can also do
a downcast of a derived class to a base class, but only if the base class is
not a virtual base class. Sometimes the result of this cast can become
undefined. static_cast is a bit more strict that C-style casting, though. It
disallows certain class conversions that would've been allowed with a C-style
cast. static_cast also doesn't allow you to cast to an incomplete type. In
these cases, I would try either dynamic_cast or reinterpret_cast.
const_cast
----------
This cast is mainly to add or remove const-ness or volatile-ness from a
variable. This is safer than using a C-style cast to change the const-ness
of a variable. In most cases if you try to use one of the other casts and it
complains about const-ness, you will want to either use this cast instead or
wrap the other cast around this cast. An example:
const int *a;
static_cast<void *>(a); <-- This will fail.
To remedy the above, you would might try this:
const int *a;
const_cast<void *>(a); <-- But this will still fail.
The real solution is this:
const int *a;
static_cast<void *>(const_cast<int *>(a));
It is not recommended to use const_cast on the this variable within a member
function of a class that is declared const. Instead you should use the mutable
keyword on the variable in the class's definition.
dynamic_cast
------------
This cast can only be used on pointers or references to classes. It can cast a
derived class to a base class, a derived class to another derived class
(provided that both are children of the same base class), or a base class to a
derived class. You can also use this to cast a class to void *. This cast is
done at run-time as opposed to the other casts, and relies on C++'s RTTI to be
enabled. It is meant to be used on polymorphic classes, so use static_cast on
non-polymorphic classes.
derived-to-base conversions are actually done statically, so you use either
dynamic_cast or static_cast on them, regardless of if the classes are
polymorphic or not.
derived-to-derived or base-to-derived conversions, however, rely on run-time
type information, and this cast is used on those classes that are polymorphic.
This is safer than C-style casting in that an invalid pointer conversion will
return a NULL pointer, and an invalid reference conversion will throw a
Bad_cast exception.
Note that in Anope we prefer if Anope::debug_cast is used.
This uses dynamic_cast (and checks for a NULL pointer return) on debug builds
and static_cast on release builds, to speed up the program because of dynamic_cast's
reliance on RTTI.
reinterpret_cast
----------------
This cast I would use only as a last resort if static_cast isn't allowed on a
conversion. It allows for conversions between two unrelated types, such as
going from char * to int *. It can also be used to convert a pointer to an
integral type and vica versa. The sites I've read mention how the result is
non-portable, which I assume means the resulting object code is non-portable,
so since the code is compiled on many systems anyways, I don't see this as
being a huge issue. It is recommended to only use this if necessary, though.
Links
=====
The following links are web sites I've used to get this information, and might
describe some of the above a bit better than I have. :P
https://www.acm.org/crossroads/xrds3-1/ovp3-1.html
http://www.cplusplus.com/doc/tutorial/typecasting.html
http://www.codeguru.com/forum/showthread.php?t=312456
https://web.archive.org/web/20170810222238/http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/cast.html
https://www.microsoft.com/en-us/download/details.aspx?id=55984
https://en.wikibooks.org/wiki/C%2B%2B_Programming/Type_Casting
https://web.archive.org/web/20160510114447/http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=134
-- CyberBotX, Nov 23, 2008
+1 -1
View File
@@ -7,7 +7,7 @@ if(WIN32)
# Add README.txt to list of files for CPack to ignore
add_to_cpack_ignored_files("README.txt$" TRUE)
endif()
set(DOCS Changes Changes.conf DEFCON FAQ INSTALL LANGUAGE MODULES NEWS ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.txt)
set(DOCS Changes Changes.conf DEFCON FAQ INSTALL LANGUAGE MODULES ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.txt)
install(FILES ${DOCS}
DESTINATION ${DOC_DIR}
)
-239
View File
@@ -1,239 +0,0 @@
Originally pulled from: https://wiki.inspircd.org/Coding_Guidelines
---
InspIRCd Coding Guidelines
The following are a set of guidelines for writing patches to InspIRCd, or for
creating modules for distribution with the official package. These guidelines
were written a time after InspIRCd development started, and so not all code
yet follows these. This will be rectified with time.
1. Comments
* Multi Line
Multiple line comments should follow the C-style comment, for example:
/*
* This is a multiple line comment, huzzah..
*/
* Single Line
Single line comments should also be in the C style, for example:
/* This is a boring one-line comment */
* Doxygen commenting
If you wish your comment to show in doxygen, the comment should be directly
above the item you are documenting (a class, function, enum, etc) and the
first line should be "/**". For example:
/** This is a doxygen multiline comment.
* Description of thingymebob here.
*/
The first line after the "**" is used as the short description of the item
(up to the full stop) and everything afterwards as the detailed description.
2. Indentation
Tabs. Tabs. ONLY TABS. Use a single tab for each level of indentation,
for example:
int main()
{
<tab>if (condition)
<tab>{
<tab><tab>code
<tab>}
}
3. Separation
Always put a space in between a keyword like if/while and the condition,
for example:
if (foo == bar)
NOT
if(foo == bar)
4. Braces
Always put braces opening and closing blocks on separate lines, see the
indentation example. For example, place braces like this:
if (apples == "green")
{
cout << "Apples are green" << endl;
}
and not:
if (apples == "green") {
cout << "Apples are green" << endl;
}
The one exception to this is if you are declaring a class method which is
only one line long, in that case the following is acceptable in most cases:
class foo : public bar
{
foo() { }
getrandomfoo() { return rand(); }
};
5. Templates
Where possible, use templates rather than #defines. Avoid use of RTTI.
6. Structs
Structs should be declared in the following fashion:
struct BodyPartBasket
{
int arms;
int legs;
int scrotalsacs;
};
and not like this:
typedef struct
{
int arms;
int legs;
int scrotalsacs;
} BodyPartBasket;
The second way is not required in C++ to be able to do this:
BodyPartBasket mybasket;
Plus, placing the name at the bottom of the declaration makes readability
more difficult (as you have to scroll down to the bottom of the struct to
find its name). (where possible, call them classes rather than structs.)
7. Variable naming
Class and struct names should be in camel case with a leading capital letter,
for example "MyBagOfBones" and not "my_bag_of_bones" or "mybagofbones".
Variable names can be in either camel case with a leading capital letter or
alternatively all lower case, so long as the same naming convention is
adhered to throughout the class. No classes or variables should be named in
capitals unless this makes sense for the name (for example "class DNS").
Constants and enum values should always be completely in CAPITALS and
underscores may be used, for example:
enum DecayState
{
DECAYED_MOULDY = 0,
DECAYED_SMELLY = 1,
DECAYED_MAGGOTS = 2
};
All value names in an enum should be started with the same text which should
be related in some way to the enum's use. For example "DNS_CNAME, DNS_A,
DNS_AAAA".
8. Use of references
Wherever possible, when dealing with any complex class, pass a const reference
rather than a copy of the class. For example:
MyThingy::MyThingy(const std::string &thingyvalue)
{
}
Of course, if you intended to change the string you can just omit the 'const'.
9. Use of char pointers
Whenever you use char pointers (char*, char**) try to use const equivalents.
This is much safer and avoids ugly and dangerous casts. For example:
MyThingy::Thingify(const char* const* wotsits)
{
}
If it is possible without performance loss, consider avoiding char pointers
altogether and using std::string instead.
10. Use of STL
For more information on use of STL in InspIRCd, please see the separate
STL FAQ.
11. Making copies of data
Never ever make a copy of a piece of data unless it is absolutely necessary.
For example, don't use strlcpy() to make a copy of the const char* string
returned by std::string::c_str(), if the change can be done to the std::string
itself. The same goes for unnecessary variable assignments, especially those
which assign large classes.
12. namespace std
Avoid the following:
using namespace std;
It might take a bit more typing, but things work better if you don't set
(then later assume) the namespace -- specify it explicitly when you want to
use it.
13. Linefeeds
Unix linefeeds only please. We do not like to see our screens covered in ^M.
14. Portability
Always make sure your code is portable to all supported operating systems,
remember of course that as of 1.1.8 this includes windows. Don't write code
that only works on windows, or only works on Linux. Test your code on all
platforms or ask for help from other developers who have the platforms you
want to test on.
* new() and delete(), malloc() and free()
Apart from the fact that using malloc() and free() is bad practice in C++
code, you must never use malloc() or free() in InspIRCd, within its modules
or within the core. This is because if you use malloc() or free() in windows,
the memory is claimed from the program's local heap.
In windows, each shared object (module, dll) has its own heap, which is
protected from other dlls and executables. To get around this issue and
allow more posix-like memory access from other dlls in the program (other
modules), InspIRCd overrides the operators new and delete to ensure that
memory allocated by them comes from the windows global heap. If you use
malloc() and free() for this, the ircd will segfault when another module
tries to access the memory you have allocated!
* strdup()
As with malloc(), above, strdup() should be avoided. Where strdup() is
absolutely necessary, use strnewdup() which is our strdup() implementation
that calls operator new instead of using malloc().
char arrays allocated by strnewdup() should be deleted with operator delete[].
* CoreExport and DllImport
Prefix all types you want to import or export to other modules with CoreExport
and DllImport macros. These do nothing in POSIX operating systems, however
in windows these are expanded to the instructions __declspec(dllimport) and
__declspec(dllexport) respectively depending on where they are used and how.
15. External Dependencies
If a module is compiled as standard, or the code is part of the core, you must
not use any dependencies that are not available as standard on all supported
operating systems beyond libstdc++, libc, and whatever else is currently
required to build the core. Modules which use nonstandard dependencies belong
in the modules/extra directory.
16. Profiling and Performance
It is one thing to assume that code performs bad, it is another thing to prove
that it actually is. A lot of experienced programmers talk about 'premature
optimisation', and here is what it means: if you have a piece of code called
once on startup that takes 10 seconds instead of one second to run, and a
piece of code that takes 0.05 seconds to run when it should take 0.01, and
it is called once per second, the second piece of code is the priority.
In other words, make sure that what you think is slow, and a performance
problem in Insp actually is.
To do this, use the callgrind tool from Valgrind (valgrind --tool=cachegrind
bin/inspircd -nofork -debug), and kcachegrind (or similar) to view the output
files.
+270
View File
@@ -1,3 +1,273 @@
Anope Version 2.1.16
--------------------
Added support for on-IRC code confirmation.
Added the ability for fantasy commands to be executable without the FANTASY privilege.
Added the ability to prepend to topics as well as appending to them.
Changed various fields to serialize to the database as a string not an integer.
Disabled db_flatfile by default in preparation for becoming import-only.
Fixed a memory leak in the db_json module.
Fixed building on OpenSSL 1.1.1 (for now).
Fixed removed and later re-added temporary bans being removed automatically.
Fixed sometimes sending malformed LMODE messages on InspIRCd.
Fixed the "did you mean" message suggesting unloaded commands.
Fixed various issues with the example config files.
Marked db_json as the recommended database module.
Moved the BAN, UNBAN, and KICK commands to the chanserv/management group.
Removed support for the 1.8-style seen command.
Reworked confirmation to allow confirmation of multiple account actions.
When dropping a display nickname the new display will now be the oldest in the group.
Anope Version 2.1.15
--------------------
Added a workaround to the jsonrpc module for JavaScript truncating big integers.
Added an example Ruby library for accessing the RPC interface.
Added away state and tls usage to the anope.user RPC event.
Added support for looking up accounts by identifier in the anope.account RPC event.
Added support for storing the setter and set time and setter of list modes and restoring them on InspIRCd and Solanum.
Added support for token authentication to the RPC modules.
Added the anope.checkCredentials, anope.identify, anope.listCommands, and anope.command RPC events to the new rpc_user module.
Bumped the minimum supported version of ircd-hybrid to 8.2.34.
Deprecated irc2sql in favour of rpc_data.
Dropped support for Bahamut as it has no known users.
Fixed creating duplicate Stats rows on some servers.
Fixed loading databases in db_json.
Fixed restoring cloaked hosts on InspIRCd when the cloak module is not loaded.
Fixed some variable shadowing that potentially caused issues with the SQL database backends.
Fixed sometimes writing accounts to the database without a unique identifier.
Fixed various documentation issues with the example JavaScript JSON-RPC client.
Improved CTCP handling and added support for more CTCP types.
Anope Version 2.1.14
--------------------
Added a detail specifier to the anope.list{Channels,Opers,Servers,Users} RPC methods.
Added a matcher for the InspIRCd oper extban.
Added support for hashed operator passwords.
Added support for hiding the date news was added in os_news.
Added support for local password comparison to the sql_authentication module.
Added support for monthly backups to db_json.
Added support for unbanning virtual modes using cs_unban.
Added the !unmute fantasy command.
Added the anope.account and anope.listAccounts RPC methods to the rpc_data module.
Added the protection time to the INFO output.
Allowed unprivileged channel successors to remove themselves from succession.
Bumped the minimum required CMake version to 3.20.
Changed deletion callbacks to specify the mask that was deleted if only one was.
Changed nickserv/alist to show all permissions not just the highest ranked one.
Fixed NEVEROP not being respected in chanserv/set/founder and chanserv/set/successor.
Fixed stripping IRC formatting codes from messages.
Messages are now automatically line wrapped to options:linelength.
Redocumented the ns_sasl module.
Removed hardcoded command names from several messages.
Updated the Windows CI to Windows Server 2025 and Visual Studio 2022.
Anope Version 2.1.13
--------------------
Added a Config check to ensure users actually want to use the development branch.
Added a flag to the version string when Anope is compiled in reproducible mode.
Added a warning on rehash when the max password is longer than the maximum bcrypt password length.
Added an ALLTIME handler on InspIRCd.
Added an opt-out for extended XML-RPC types.
Added RPC messages for sending global messages.
Added support for importing cs_set_misc and ns_set_misc data from Atheme.
Added support for importing news from Atheme.
Added support for oper-only quit messages.
Added support for the experimental "services cloak" system from the InspIRCd development branch.
Added support for using defines from the environment.
Added support for using defines within the value of a variable.
Blacklisted an old version of an UnrealIRCd module that is known to send malformed S2S messages.
Changed RPC events to be registered as core services.
Changed the database to refer to accounts by their account identifier instead of their display nick.
Changed the syntax of defines from "foo" to "${foo}".
Deduplicated JSON generation code in the jsonrpc module.
Fixed a warning when importing an Atheme account that uses external authentication.
Fixed counting email addresses in ns_maxemail.
Fixed db_atheme creating duplicate accounts, bots, and nicks when importing over an existing database.
Fixed deleting old database backups after Anope has been restarted.
Fixed importing user metadata from Anope 1.8.
Fixed including a port in uplink messages when connecting to a UNIX socket endpoint.
Fixed memo ignores being erroneously case sensitive.
Fixed modules with third-party dependencies writing generic log messages instead of module log messages.
Fixed not performing SQL database updates in some rare circumstances.
Fixed sending global messages with the default sender.
Imported mkauthors from InspIRCd and used it to generate docs/AUTHORS.txt
Moved around a bunch of module headers.
Moved database serialization from the serializable to the serializable type.
Moved the SASL protocol interface to its own service.
Refactored handling S2S metadata on InspIRCd.
Updated more messages to use gettext plural forms.
Anope Version 2.1.12
--------------------
Added an example JavaScript library for accessing the RPC interface.
Added an option to require specifying the server name when running destructive network commands like restart or shutdown.
Added support for importing X-line identifiers from Atheme.
Added support for JSON-RPC to the RPC interface.
Added support for killing SASL users that fail to log in repeatedly.
Added support for more RPC response types to the RPC interface.
Added support for multiple targets in chanserv/modes.
Added support for SSL client certificate fallback fingerprints on InspIRCd.
Added the anope. prefix to the channel and user RPC events and moved them to the rpc_data module.
Added the anope.listChannels, anope.listServers, anope.listUsers, and anope.server RPC events to the new rpc_data module.
Added the OPERONLY, UNUSED and VANITY filters to botserv/botlist.
Added the system.listMethods RPC event to the new rpc_system module.
Deprecated support for InspIRCd v3 (scheduled to be removed in around a year).
Fixed enc_bcrypt silently truncating passwords longer than 71 characters.
Fixed ns_set_language being able to be loaded when Anope was built without language support.
Fixed sql_authentication not being able to use the IP address of a RPC, SASL, or web user in SQL queries.
Made modules that use third-party libraries log the version in use on load.
Redesigned the RPC interface to add support for emitting multiple data types.
Replaced the opers RPC event with rpc.listOpers and rpc.oper events in the new rpc_data module.
Updated the Dutch translation.
Anope Version 2.1.11
--------------------
Added support for database migrations to the mysql module.
Added support for renicking users to their UID when enforcing nickname protection.
Added support for sending channel URLs to joining users.
Allowed selecting languages using a shorter version of their name.
Changed various messages to use human-readable durations instead of seconds.
Improved the creation of expiry and duration messages.
Improved the translation system with support for plural forms.
Reworked how guest nicknames are generated.
Simplified how account identifiers are allocated.
Anope Version 2.1.10
--------------------
Added support for NEXTBANS on UnrealIRCd.
Changed hostmask access entries added by nick to use that nick as the default description.
Changed modes to be handled internally in their split form.
Changed ns_cert to notify a user that their certificate is being automatically added to their account.
Fixed matching users against extended bans.
Fixed parsing name-only extended bans on InspIRCd.
Fixed respecting the preferred extended ban format on InspIRCd.
Fixed the name of the cron script in the docs.
Updated the list of supported IRCds.
Updated the location of the Anope IRC channels
Anope Version 2.1.9
-------------------
Bumped the minimum supported version of UnrealIRCd to 6.
Fixed granting IRC operator status to services operators.
Fixed making users an IRC operator on InspIRCd.
Fixed nonicknameownership on InspIRCd v4.
Fixed some messages not being translatable.
Fixed the Argon2 module not having test vectors.
Increased the default nickname expiry period to one year.
Anope Version 2.1.8
-------------------
Added account identifiers to the nickserv/info output.
Added support for bool, float, and uint SQL columns.
Added the ability to automatically determine SQL column types based on the native type.
Added UNIX socket support to mysql module.
Changed smartjoin to use SendClearBans where available.
Dropped support for MinGW in favour of native builds.
Fixed parsing named extbans on InspIRCd.
Fixed parsing SVSMODE and SVS2MODE from UnrealIRCd.
Fixed sending global messages to remotely linked servers.
Removed the services server name from the CTCP version response.
Anope Version 2.1.7
-------------------
Added importing of akick reasons, forbid reasons, opers and session exceptions to db_atheme.
Added support for sending tag messages.
Added the ability to look up account information of an authenticated user.
Fixed a crash in ns_cert when an IRC user is not present during a nick registration.
Fixed a null pointer dereference in the global module.
Fixed a rare memory leak in os_akill and os_sxline.
Improved the performance of some code that looks up the primary nick from an account.
Removed the broken Catalan, Hungarian, and Russian translations.
Reworked the protocol interface for sending messages.
Updated the Turkish translation.
Anope Version 2.1.6
-------------------
Added opportunistic upgrading of TLS fingerprints to more secure algorithms on InspIRCd.
Added support for logging out partially connected users on Plexus.
Added the account registration time to nickserv/info.
Changed ns_cert to automatically add a TLS fingerprint to new accounts if available.
Clarified that a non-deprecated encryption module must be loaded.
Fixed creating the runtime directory on Windows.
Fixed mistakenly allowing badpasslimit to be set to a negative value.
Fixed parsing backup TLS fingerprints on InspIRCd.
Fixed parsing the flood mode on UnrealIRCd.
Fixed parsing the history mode on UnrealIRCd.
Fixed various iterator invalidation issues.
Partially rewrote the Portuguese translation.
Removed some incorrect strings from the Turkish translation.
Renamed the --modulesdir option to --moduledir to match the name of other path options.
Anope Version 2.1.5
-------------------
Added an example systemd unit file.
Added support for BIGLINES on UnrealIRCd.
Bumped the minimum supported version of Bahamut to 2.0.
Fixed truncating messages in global/global and global/server.
Improved building Anope for use as a system package.
Updated the Turkish translation.
Anope Version 2.1.4
-------------------
Added a check for a non-deprecated encryption module on start.
Added a way for protocol modules to report an error to the uplink.
Added more account settings to the webcpanel.
Added self-test functionality for all encryption modules.
Added support for challenge authentication on InspIRCd.
Added support for importing databases from Atheme.
Added support for sending client tags on UnrealIRCd.
Added support for the InspIRCd 1206 (v4) protocol.
Added the --nopid option to disable writing a pid file.
Added the enc_argon2 module to encrypt passwords with Argon2.
Added the enc_sha2 module to encrypt passwords with HMAC-SHA-2.
Added the global/queue command for queueing multi-line messages.
Added the global/server command for sending messages to an individual server.
Added the PASSWORD category to operserv/stats to view password encryption methods.
Added the verify-only enc_posix module to validate passwords from Atheme that were encrypted with Argon2.
Changed nickserv/drop to use confirmation codes to confirm a nickname drop.
Changed various paths to be relative to the data and config directories.
Converted some IRCDProto member functions to variables.
Converted the enc_md5, enc_none, enc_old, enc_sha1, and enc_sha256 modules to be verify-only.
Deduplicated page headers and footers in the webcpanel templates.
Deprecated the enc_sha256 module.
Fixed inconsistent spelling/casing of email, vhost, and vident.
Fixed various bugs in the inspircd module.
Improved portability of email sending.
Improved protocol debug messages.
Improved the performance and reliability of internal conversion logic.
Improved the randomness of randomly generated numbers.
Refactored the enc_bcrypt module and exposed it as an encryption context.
Removed several duplicate translation strings.
Replaced the custom MD5 implementation in enc_md5 with a vendored one.
Replaced the custom SHA256 implementation in enc_sha256 with a vendored one.
The ldap_authentication, ldap_oper, sql_authentication, sql_log, and sql_oper modules are now always enabled.
Anope Version 2.1.3
-------------------
Added alternate command suggestions when a user runs an invalid command.
Added support for the IRCv3 +draft/channel-context tag.
Added support for the IRCv3 +draft/reply tag.
Allow using more than one fingerprint in an oper block.
Changed chanserv/drop to use confirmation codes to confirm a channel drop.
Cleaned up more of the codebase to use Modern C++17.
Enabled using more field limits sent by the IRC server instead of requiring the user to configure them.
Fixed NickServ lying about the minimum password length.
Fixed a crash when sending emails.
Fixed bs_kick not using the correct kick message for automatic kicks.
Increased the security of randomly generated confirmation codes.
Removed the ns_access module and associated cs_secure and ns_secure options.
Removed the ns_status module.
Reworked how messages are sent in protocol modules to allow sending message tags.
Anope Version 2.1.2
-------------------
Bumped the minimum OpenSSL version to 1.1.0.
Bumped the minimum GnuTLS version to 3.0.0.
Disabled SSLv3 support in the m_ssl_openssl module.
Modernized mutex and thread code to use Modern C++.
Normalised the program exit codes.
Updated the Dutch translation.
Updated the French translation.
Anope Version 2.1.1
-------------------
Added the UNBANME privilege to allow users to unban themselves.
+163 -4
View File
@@ -1,3 +1,162 @@
Anope Version 2.1.16
--------------------
Added fantasy:require_privilege (defaults to yes).
Added the nickserv/confirm/email command.
Added the nickserv/confirm/email oper privilege.
Added the nickserv/confirm/register command.
Added the ns_confirm module.
Added {ns_email}:changeexpire (defaults to 1 day).
Added {ns_resetpass}:resetexpire (defaults to 1 day).
Removed the irc2sql module (migrate to JSON-RPC instead).
Removed {ns_seen}:simple (1.8-style seen has been removed).
Renamed the nickserv/confirm oper privilege to nickserv/confirm/register.
Anope Version 2.1.15
--------------------
Added the ns_email module.
Added the rpc_user module.
Added {jsonrpc}:integer_bits (defaults to 64).
Added {jsonrpc}:token.
Added {nickserv}:enforcerreal (defaults to "Services Enforcer").
Added {xmlrpc}:token.
Moved nickserv/set/email and nickserv/saset/email to the ns_email module.
Removed the bahamut module.
Removed the ns_getemail module (load ns_email instead).
Removed the ns_maxemail module (load ns_email instead).
Removed the rpc_main module (migrate to the other RPC modules).
Removed {chanstats}:cs_def_chanstats (add CS_STATS to {chanserv}:defaults instead).
Removed {chanstats}:ns_def_chanstats (add NS_STATS to {nickserv}:defaults instead).
Renamed service:gecos to service:real.
Anope Version 2.1.14
--------------------
Added oper:password_hash.
Added options:codelength (defaults to 15).
Added {os_news}:showdate (defaults to yes).
Added {sql_authentication}:password_field (defaults to "password").
Added {sql_authentication}:password_hash.
Changed the default value for options:linelength to "100".
Changed the default value for {enc_sha2}:algorithm to "sha512".
Changed the default value for {ns_seen}:purgetime to "90d".
Changed the syntax for template variables in mail:emailchange_message, mail:emailchange_subject, mail:memo_message, mail:memo_subject, mail:registration_message, mail:registration_subject, mail:reset_message, mail:reset_subject, {chanserv}:signkickformat, {dnsbl}:blacklist:reason, {ldap_authentication}:search_filter, {ldap_oper}:binddn, {ldap_oper}:filter, {nickserv}:unregistered_notice, {os_session}:sessionlimitexceeded, {proxyscan}:proxyscan:reason.
Anope Version 2.1.13
--------------------
Added options:linelength (defaults to 120).
Added the db_json module.
Added the rpc_message module.
Added {nickserv}:defaultprotect (defaults to 1m).
Added {nickserv}:maxprotect (defaults to 10m).
Added {nickserv}:minprotect (defaults to 10s)
Added {xmlrpc}:enable_i8 (defaults to yes).
Added {xmlrpc}:enable_nil (defaults to yes).
Changed the syntax for using defines (all existing defines will need to be updated).
Removed {nickserv}:kill (replaced by custom protection timer durations).
Removed {nickserv}:killquick (replaced by custom protection timer durations).
Removed {ns_set_kill}:allowkillimmed (replaced by custom protection timer durations).
Renamed the nickserv/saset/kill command to nickserv/saset/protect.
Renamed the nickserv/saset/kill oper privilege to nickserv/saset/protect.
Renamed the nickserv/set/kill command to nickserv/set/protect.
Renamed the ns_set_kill module to ns_set_protect.
Renamed the sasl module to ns_sasl and moved it to nickserv.example.conf.
Anope Version 2.1.12
--------------------
Added the jsonrpc module.
Added the rpc_data module.
Added the rpc_system module.
Added {hostserv}:activate_on_deoper (defaults to yes).
Added {os_shutdown}:requirename (defaults to yes).
Moved nickserv/set/keepmodes and nickserv/saset/keepmodes to the ns_set_keepmodes module.
Moved the xmlrpc module to extra.
Renamed the xmlrpc_main module to rpc_main.
Anope Version 2.1.11
--------------------
Moved nickserv/set/kill and nickserv/saset/kill to the ns_set_kill module.
Moved {ns_set}:allowkillimmed to {ns_set_kill}:allowkillimmed.
Replaced {nickserv}:guestnickprefix with {nickserv}:guestnick (defaults to Guest####).
Anope Version 2.1.10
--------------------
Added options:servicealias (defaults to no)
Moved nickserv/set/message and nickserv/saset/message to the ns_set_message module.
Removed options:useprivmsg (replaced by loading the ns_set_message module to enable).
Removed options:usestrictprivmsg (feature unusable on modern servers, consider migrating to options:servicealias instead).
Anope Version 2.1.9
-------------------
No significant changes.
Anope Version 2.1.8
-------------------
Added the nickserv/drop/display oper privilege.
Added {nickserv}:preservedisplay (defaults to no).
Anope Version 2.1.7
-------------------
Moved nickserv/set/language and nickserv/saset/language to the ns_set_language module.
Renamed the FANTASIA channel privilege to FANTASY.
Renamed {cs_suspend}:expire to {cs_suspend}:suspendexpire.
Anope Version 2.1.6
-------------------
Added {ns_cert}:automatic (defaults to yes).
Removed {hybrid,inspircd,solanum,unrealircd}:use_server_side_mlock (now always enabled).
Removed {inspircd}:use_server_side_topiclock (now always enabled).
Anope Version 2.1.5
-------------------
Added the nickserv/drop/override and chanserv/drop/override oper privileges.
Anope Version 2.1.4
-------------------
Added the db_atheme module.
Added the enc_argon2 module.
Added the enc_posix module.
Added the enc_sha2 module.
Added the gl_queue module.
Added the gl_server module.
Added the global/queue oper privilege.
Added the global/server oper privilege.
Changed serverinfo:motd to be relative to the config directory.
Changed serverinfo:pid to be relative to the data directory.
Changed the default value of mail:sendmailpath to "/usr/sbin/sendmail -it".
Changed the default value of {chanserv}:accessmax to 1000.
Changed the default value of {chanserv}:inhabit to 1 minute.
Changed the default value of {cs_mode}:max to 50.
Changed the default value of {ms_ignore}:max to 50.
Removed options:seed (not needed with modern random number generation).
Replaced {webcpanel}:template with {webcpanel}:template_dir (defaults to webcpanel/templates/default).
Anope Version 2.1.3
-------------------
Added options:didyoumeandifference (defaults to 4).
Added support for multiple SSL fingerprints in oper:certfp.
Added the chanserv/cert oper privilege for modifying other user's certificate lists.
Changed networkinfo:chanlen to default to 32 if not set.
Changed networkinfo:hostlen to default to 64 if not set.
Changed networkinfo:modelistsize to default to 100 if not set.
Changed networkinfo:nicklen to default to 31 if not set.
Changed networkinfo:userlen to default to 10 if not set.
Increased the default maximum password length to 50 characters.
Increased the default minimum password length to 10 characters.
Removed the cs_secure option in {chanserv}:defaults (now always enabled as support for nick access lists has been removed).
Removed the nickserv/saset/secure command (support for nick access lists has been removed).
Removed the nickserv/saset/secure oper privilege (support for nick access lists has been removed).
Removed the nickserv/set/secure command (support for nick access lists has been removed).
Removed the nickserv/status command (obsolete with modern IRCv3 extensions and the removal of nick access lists).
Removed the ns_access module (support for nick access lists has been removed).
Removed the ns_secure option in {nickserv}:defaults (now always enabled as support for nick access lists has been removed).
Anope Version 2.1.2
-------------------
Added {ssl_openssl}:tlsv10 for configuring whether TLSv1.0 is usable (defaults to no).
Added {ssl_openssl}:tlsv11 for configuring whether TLSv1.1 is usable (defaults to yes).
Added {ssl_openssl}:tlsv12 for configuring whether TLSv1.2 is usable (defaults to yes).
Removed the m_ prefix from the names of the chanstats, dns, dnsbl, helpchan, httpd, ldap, ldap_oper, mysql, proxyscan, redis, regex_pcre2, regex_posix, regex_stdlib, regex_tre, rewrite, sasl, sql_log, sql_oper, sqlite, ssl_gnutls, ssl_openssl, xmlrpc, and xmlrpc_main modules.
Removed {ssl_openssl}:sslv3 (now always disabled).
Anope Version 2.1.1
-------------------
Added the m_regex_stdlib module.
@@ -5,14 +164,14 @@ Removed the m_regex_pcre module (use m_regex_pcre2 instead).
Anope Version 2.1.0
-------------------
Added nickserv:minpasslen for configuring the minimum password length.
Removed nickserv:strictpasswords as it is obsolete now nickserv:minpasslen exists.
Added {nickserv}:minpasslen for configuring the minimum password length (defaults to 8).
Removed {nickserv}:strictpasswords (obsolete now {nickserv}:minpasslen exists).
Removed the inspircd12 and inspircd20 modules (use inspircd instead).
Removed the ns_getpass module (no supported encryption modules).
Removed the os_oline module (no supported IRCds).
Removed the unreal module (use unrealircd instead).
Renamed nickserv:passlen to nickserv:maxpasslen.
Renamed {nickserv}:passlen to {nickserv}:maxpasslen.
Renamed the charybdis module to solanum.
Renamed the inspircd3 module to inspircd.
Renamed the unreal4 module to unrealircd.
Replaced uplink:ipv6 with uplink:protocol.
Replaced uplink:ipv6 with uplink:protocol (defaults to ipv4).
+2 -2
View File
@@ -10,7 +10,7 @@ Anope DefCon
1) Introduction
Anope 1.6 onwards supports a unique protection mechanism based on the
Anope supports a unique protection mechanism based on the
military "Defense Readiness Condition" (DefCon) system. It is based on
5 levels of defense readiness defined as:
@@ -90,4 +90,4 @@ Anope DefCon
6) Support
You might get DefCon support by posting on our online forum, or maybe on
our #anope channel at /server irc.anope.org.
our #anope channel at /server irc.teranova.net.
-31
View File
@@ -1,31 +0,0 @@
Anope Internal Events
---------------------
1) Intro
2) Using Events
1) Introduction to Internal Events
Internal Events are setup to give module developers more information
about what the core is doing at different times. This information can
be as complex as data we are feeding to the uplink, to simple triggered
events such as the databases being saved.
Additionally there is a module included with the core
which can provide some clue as to how to use the code in your modules.
The rest of this document assumes that you are used to writing modules.
2) Using Events
Each Event in Anope calls a function.
You must override these functions in your main modules class.
The full list of functions and parameters are in modules.h. In this
case, you would be overriding OnJoinChannel() and OnPartChannel() like so:
void OnJoinChannel(User *u, Channel *c) override { }
void OnPartChannel(User *u, Channel *c) override { }
Some of these event overrides can be used to prevent or allow things to
happen that would normally not be allowed or denied. You can also use
ModuleManager (not explained here) to set control which order the modules
are queried (when multiple modules hook to the same event).
+7 -7
View File
@@ -27,7 +27,7 @@ Note: You should also read the README and FAQ files!
cmake --version
If it's installed, you will get a line that says something similar to
"cmake version 2.8.12.2". If the version is less than 2.4 or you get
"cmake version 3.28.3". If the version is less than 3.20.0 or you get
an error saying the command was not found, you will not be able to use
CMake unless you install it yourself into your home directory. CMake
can be downloaded from:
@@ -37,7 +37,7 @@ Note: You should also read the README and FAQ files!
Next, unpack the package in your home directory, and go into the created
directory.
If there are any extra modules you want to enable, such as m_mysql, run
If there are any extra modules you want to enable, such as mysql, run
the 'extras' script to enable them. If you do not know you can come back
later and enable them.
@@ -60,7 +60,7 @@ Note: You should also read the README and FAQ files!
most likely not work!
If you need help, you should visit https://forum.anope.org/ or #anope on
irc.anope.org. Provide *complete* error output, along with other relevant
irc.teranova.net. Provide *complete* error output, along with other relevant
information eg. OS, compiler and C++ library versions.
See the README file for more information.
@@ -111,17 +111,17 @@ Note: You should also read the README and FAQ files!
A crontab entry will allow you to check periodically whether Anope is
still running, and restart it if not.
First rename the example.chk script that is in Anope path (by default,
this is ~/anope/conf) to anope.chk and edit it. You'll need to
First rename the cron.example.sh script that is in Anope path (by default,
this is ~/anope/conf) to cron.sh and edit it. You'll need to
modify the CONFIGURATION part of the file. Then ensure that the file is
marked as executable by typing chmod +x anope.chk, and try to launch the
marked as executable by typing chmod +x cron.sh, and try to launch the
script to see if it works (Anope must not be running when you do this ;))
When this is done, you'll have to add the crontab entry. Type crontab -e.
This will open the default text editor with the crontab file. Enter the
following (with correct path):
*/5 * * * * /home/ircd/anope/conf/anope.chk >/dev/null 2>&1
*/5 * * * * /home/ircd/anope/conf/cron.sh >/dev/null 2>&1
The */5 at the beginning means "check every 5 minutes". You may replace
the 5 with other another number if you want (but less than 60). Consult
+7 -7
View File
@@ -27,7 +27,7 @@ Note : Vous devrez également lire les fichiers README et FAQ !
cmake --version
Si CMake est installé, vous aurez une ligne qui dit quelque chose comme
"cmake version 2.8.12.2". Si la version est inférieure à 2.4 ou si vous
"cmake version 3.28.3". Si la version est inférieure à 3.20.0 ou si vous
obtenez une erreur disant que la commande n'a pas été trouvée, vous ne
pourrez pas utiliser CMake à moins de l'installer vous-même dans votre
répertoire home. CMake peut être téléchargé ici :
@@ -37,7 +37,7 @@ Note : Vous devrez également lire les fichiers README et FAQ !
Ensuite, décompressez le package dans votre répertoire home, et allez
dans le répértoire qui vient d'être créé.
Si il y a des modules facultatifs que vous voulez activer comme m_mysql,
Si il y a des modules facultatifs que vous voulez activer comme mysql,
exécuter le script 'extras' pour les activer. Si vous ne savez pas, vous
pouvez les activer plus tard.
@@ -64,7 +64,7 @@ Note : Vous devrez également lire les fichiers README et FAQ !
recommandée, et Anope ne fonctionnera probablement pas !
Si vous avez besoin d'aide, vous pouvez aller sur le site
https://forum.anope.org/ ou le canal #anope sur irc.anope.org.
https://forum.anope.org/ ou le canal #anope sur irc.teranova.net.
Fournissez *l'essemble* des erreurs qui apparaîssent, en plus de
toutes informations utiles, comme les versions de votre OS, du
compilateur utilisé et de la librairie C++. Lisez le fichier README
@@ -121,11 +121,11 @@ Note : Vous devrez également lire les fichiers README et FAQ !
Une entrée crontab vous permettra de vérifier périodiquement si Anope
est toujours en cours d'exécution et de le redémarrer s'il n'est pas.
D'abord renommez le script example.chk qui est dans les dossiers
d'Anope (par défaut, ~/anope/conf) en anope.chk et modifiez-le.
D'abord renommez le script cron.example.sh qui est dans les dossiers
d'Anope (par défaut, ~/anope/conf) en cron.sh et modifiez-le.
Vous aurez besoin de modifier la partie CONFIGURATION du fichier.
Assurez-vous ensuite que le fichier est marqué comme exécutable en
tapant chmod +x anope.chk et essayez de lancer le script pour voir
tapant chmod +x cron.sh et essayez de lancer le script pour voir
si cela fonctionne (Anope ne doit pas être en marche lorsque vous
testez cela ;))
@@ -133,7 +133,7 @@ Note : Vous devrez également lire les fichiers README et FAQ !
crontab -e. Cela va ouvrir l'éditeur de texte par défaut avec le
fichier crontab. Entrez la ligne suivante (avec le chemin correct) :
*/5 * * * * /home/ircd/anope/conf/anope.chk > /dev/null 2>&1
*/5 * * * * /home/ircd/anope/conf/cron.sh > /dev/null 2>&1
Le */5 au début signifie "vérifier toutes les 5 minutes". Vous pouvez
remplacer le 5 par un autre numéro si vous voulez (mais moins de 60).
+8 -4
View File
@@ -19,6 +19,8 @@ Anope Multi Language Support
Then execute:
dpkg-reconfigure locales
If you have already built Anope you will need to delete the build directory and rebuild from scratch.
Building Anope on Windows with gettext support is explained in docs/WIN32.txt
2) Adding a new language
@@ -27,15 +29,17 @@ Anope Multi Language Support
install gettext and run `msginit -l language -o anope.language.po -i anope.pot`. For example if I was translating to
Spanish I could run `msginit -l es_ES -o anope.es_ES.po -i anope.pot`. Open the newly generating .po file and start
translating. Once you are done simply rerun ./Config; make && make install and add the language to your anope.conf.
Note that on Windows it is not quite this simple, windows.cpp must be edited and Anope recompiled and restarted.
Poedit (https://poedit.net/) is a popular po file editor, and we recommend using it or another editor designed to edit
po files (especially on Windows).
If you have finished a language file translation and you want others to use it, please send it to team@anope.org
(don't forget to mention clearly your (nick)name, your e-mail and the language name). You'll of course get full credit for it.
There are several control characters within the messages. These are mostly IRC formatting codes (https://modern.ircdocs.horse/formatting)
but 0x1A is special to Anope and is used to prevent the automatic linewrapper from breaking messages in the middle of
text that should not be split (e.g. commands). Your editor may not show these so be careful you don't delete them!
NOTE: There is no guarantee we will use your work so please do not be offended if we say no thanks.
If you have finished a language file translation and you want others to use it, please file a pull request on GitHub
or send it to team@anope.org (don't forget to mention clearly your (nick)name, your email and the language name).
You'll of course get full credit for it.
3) Using languages with modules
+2 -2
View File
@@ -12,7 +12,7 @@ Anope Modules
1) Introduction
Anope 1.6 onwards supports external modules. External modules are pieces
Anope supports external modules. External modules are pieces
of code that can be attached to a running Anope process dynamically. These
modules can serve several purposes, and perform all kind of operations to
enhance your network.
@@ -111,7 +111,7 @@ Anope Modules
Use modules at your own risk, and make sure you get them from a
reputable source. You might get module support by contacting the module
author, posting on our online forum, or maybe on our #anope channel
at /server irc.anope.org.
at /server irc.teranova.net.
7) Information for Developers
-6
View File
@@ -1,6 +0,0 @@
Highlighted News in Anope 1.9
=============================
* Added in live updating SQL and the ability to execute commands through SQL
* Re-designed configuration file
* Code refresh / rewrite into C++
+6 -7
View File
@@ -1,7 +1,7 @@
Anope -- a set of IRC services for IRC networks
-----------------------------------------------
Anope is 2003-2023 Anope Team <team@anope.org>.
Anope is 2003-2025 Anope Team <team@anope.org>.
Based on Epona 2000-2002 PegSoft <epona@pegsoft.net>.
Based on Services 1996-1999 Andrew Church <achurch@achurch.org>.
@@ -160,20 +160,19 @@ Table of Contents
they log on, to set modes and to kick users from any channel, to
send notices quickly to the entire network, and much more!
* HostServ, a neat service that allows users to show custom vHosts
* HostServ, a neat service that allows users to show custom vhosts
(virtual hosts) instead of their real IP address; this only works
on daemons supporting ip cloaking, such as UnrealIRCd.
Anope currently works with:
* Bahamut 1.4.27 or later (including 1.8)
* ircd-hybrid 8.2.23 or later
* InspIRCd 3 or later
* ircd-hybrid 8.2.34 or later
* ircd-ratbox 3 or later
* ngIRCd 19.2 or later
* Plexus 3 or later
* Ratbox 2.0.6 or later
* Solanum (all versions)
* UnrealIRCd 4 or later
* UnrealIRCd 6 or later
Anope could also work with some of the daemons derived by the ones listed
above, but there's no support for them if they work or don't work.
@@ -245,7 +244,7 @@ Table of Contents
If you read the documentation carefully, and didn't find the answer to
your question, feel free to post on the website forums or join our irc
channel (irc.anope.org #anope). Once you join our Support channel be as
channel (irc.teranova.net #anope). Once you join our Support channel be as
precise as possible when asking a question, because we have no extraordinary
powers and can't guess things if they aren't provided.
+1 -1
View File
@@ -1,4 +1,4 @@
Starting in Anope 1.9.9, Anope has Redis database support (https://redis.io/).
Anope has Redis database support (https://redis.io/).
This document explains the data structure used by Anope, and explains how
keyspace notification works.
+270
View File
@@ -0,0 +1,270 @@
// SPDX-License-Identifier: CC0-1.0
"use strict";
/** Implements methods for accessing an Anope JSON-RPC server. */
class AnopeRPC {
/**
* Initializes a new AnopeRPC instance with the specified RPC host.
*
* @param {string} host The RPC host base URL.
* @param {string} token The bearer token for authorizing with the RPC interface.
*/
constructor(host, token = "") {
this.host = host;
this.token = token;
}
/**
* Executes an arbitrary RPC query.
*
* @param {string} method The name of the method to execute.
* @param {...*} params The parameters pass to the method.
* @returns {*} The result of the RPC query.
*/
async run(method, ...params) {
const body = JSON.stringify({
"jsonrpc": "2.0",
"method": method,
"params": params.map((p) => p.toString()),
"id": Math.random().toString(36).slice(2)
});
const headers = new Headers();
if (this.token) {
headers.append("Authorization", `Bearer ${btoa(this.token)}`);
}
const response = await fetch(this.host, {
method: 'POST',
headers: headers,
body: body
});
if (!response.ok) {
throw new Error(`HTTP returned ${response.status}`)
}
const json = await response.json();
if ("error" in json) {
throw new Error(`JSON-RPC returned ${json.error.code}: ${json.error.message}`)
}
if ("result" in json) {
return json.result;
}
return null;
}
/**
* Retrieves a list of accounts.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} detail The level of detail to request.
* @returns {(array|object)} A list of accounts.
*/
listAccounts(detail = "name") {
return this.run("anope.listAccounts", detail);
}
/**
* Retrieves information about the specified account.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} name The name of the account.
* @returns {object} An object containing information about the account.
*/
account(name) {
return this.run("anope.account", name);
}
/**
* Retrieves a list of channels.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} detail The level of detail to request.
* @returns {(array|object)} A list of channels.
*/
listChannels(detail = "name") {
return this.run("anope.listChannels", detail);
}
/**
* Retrieves information about the specified channel.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} name The name of the channel.
* @returns {object} An object containing information about the channel.
*/
channel(name) {
return this.run("anope.channel", name);
}
/**
* Retrieves a list of services operators.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} detail The level of detail to request.
* @returns {(array|object)} A list of services operators.
*/
listOpers(detail = "name") {
return this.run("anope.listOpers", detail);
}
/**
* Retrieves information about the specified services operator.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} name The name of the services operator.
* @returns {object} An object containing information about the services operator.
*/
oper(name) {
return this.run("anope.oper", name);
}
/**
* Retrieves a list of servers.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} detail The level of detail to request.
* @returns {(array|object)} A list of servers.
*/
listServers(detail = "name") {
return this.run("anope.listServers", detail);
}
/**
* Retrieves information about the specified server.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} name The name of the server.
* @returns {object} An object containing information about the server.
*/
server(name) {
return this.run("anope.server", name);
}
/**
* Retrieves a list of users.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} detail The level of detail to request.
* @returns {(array|object)} A list of users.
*/
listUsers(detail = "name") {
return this.run("anope.listUsers", detail);
}
/**
* Retrieves information about the specified user.
*
* Requires the rpc_data module to be loaded.
*
* @param {string} nick The nick of the user.
* @returns {object} An object containing information about the user.
*/
user(nick) {
return this.run("anope.user", nick);
}
/**
* Sends a message to every user on the network.
*
* Requires the rpc_message module to be loaded.
*
* @param {...*} messages One or more messages to send.
*/
messageNetwork(...messages) {
return this.run("anope.messageNetwork", ...messages);
}
/**
* Sends a message to every user on the specified server.
*
* Requires the rpc_message module to be loaded.
*
* @param {string} name The name of the server.
* @param {...*} messages One or more messages to send.
*/
messageServer(server, ...messages) {
return this.run("anope.messageServer", server, ...messages);
}
/**
* Sends a message to the specified user.
*
* Requires the rpc_message module to be loaded.
*
* @param {string} source The source pseudoclient to send the message from.
* @param {string} target The target user to send the message to.
* @param {...*} messages One or more messages to send.
*/
messageUser(source, target, ...messages) {
return this.run("anope.messageUser", source, target, ...messages);
}
/**
* Checks whether the specified credentials are valid.
*
* Requires the rpc_user module to be loaded.
*
* @param {string} account A nickname belonging to the account to check.
* @param {string} password The password for the specified account.
* @returns {object} An object containing basic information about the account.
*/
checkCredentials(account, password) {
return this.run("anope.checkCredentials", account, password);
}
/**
* Identifies an IRC user to the specified account.
*
* Requires the rpc_user module to be loaded.
*
* @param {string} account Either an account identifier or nickname belonging to the account to
* identify to.
* @param {string} password The nickname of the IRC user to identify to the account.
*/
identify(account, user) {
return this.run("anope.identify", account, user);
}
/**
* Lists all commands that exist on the network.
*
* Requires the rpc_user module to be loaded.
*
* @param {...*} services The nicknames of the services to list commands for.
* @returns {object} An object containing information about the available commands.
*/
listCommands(...services) {
return this.run("anope.listCommands", ...services);
}
/**
* Lists all commands that exist on the network.
*
* Requires the rpc_user module to be loaded.
*
* @param {string} account If non-empty then the account to execute the command as.
* @param {string} service The service which the command exists on.
* @param {...*} command The the command to execute and any parameters to pass to it.
* @returns {object} An object containing information about the available commands.
*/
command(account, service, ...command) {
return this.run("anope.command", account, service, ...command);
}
}
/*
const arpc = new AnopeRPC("http://127.0.0.1:8080/jsonrpc");
arpc.listServers("full").then(servers => {
console.log(servers);
}).catch (error => {
console.log(error);
});
*/
+242
View File
@@ -0,0 +1,242 @@
# SPDX-License-Identifier: CC0-1.0
require "base64"
require "json"
require "net/http"
# Implements methods for accessing an Anope JSON-RPC server.
class AnopeRPC
# The RPC host base URL.
attr_accessor :host
# The bearer token for authorizing with the RPC interface.
attr_accessor :token
# Initializes a new AnopeRPC instance with the specified RPC host.
#
# @param host [String] The RPC host base URL.
# @param token [String] The bearer token for authorizing with the RPC interface.
def initialize(host, token = nil)
@host = URI(host)
@token = token
end
# Executes an arbitrary RPC query.
#
# @param method [String] The name of the method to execute.
# @param params [Object] The parameters pass to the method.
# @return [Object] The result of the RPC query.
private def run(method, *params)
body = {
jsonrpc: "2.0",
method: method,
params: params.map(&:to_s),
id: rand(36**16).to_s(36)
}.to_json
headers = {}
headers["Authorization"] = "Bearer #{Base64.strict_encode64(@token)}" if @token
response = Net::HTTP.post(@host, body, headers)
raise "HTTP returned #{response.status}" unless response.is_a?(Net::HTTPSuccess)
json = JSON.parse(response.body, symbolize_names: true)
raise "JSON-RPC returned #{json[:error][:code]}: #{json[:error][:message]}" if json.key?(:error)
json.dig(:result)
end
# Retrieves a list of accounts.
#
# Requires the rpc_data module to be loaded.
#
# @param detail [Symbol] detail The level of detail to request.
# @return [Array] If the detail level is set to :name then an array of account names.
# @return [Hash] If the detail level is set to :full then a hash of information about the
# accounts.
def list_accounts(detail = :name)
self.run("anope.listAccounts", detail)
end
# Retrieves information about the specified account.
#
# Requires the rpc_data module to be loaded.
#
# @param name [String] The name of the account.
# @return [Hash] A hash containing information about the account.
def account(name)
self.run("anope.account", name)
end
# Retrieves a list of channels.
#
# Requires the rpc_data module to be loaded.
#
# @param detail [Symbol] detail The level of detail to request.
# @return [Array] If the detail level is set to :name then an array of channel names.
# @return [Hash] If the detail level is set to :full then a hash of information about the
# channels.
def list_channels(detail = :name)
self.run("anope.listChannels", detail)
end
# Retrieves information about the specified channel.
#
# Requires the rpc_data module to be loaded.
#
# @param name [String] The name of the channel.
# @return [Hash] A hash containing information about the channel.
def channel(name)
self.run("anope.channel", name)
end
# Retrieves a list of services operators.
#
# Requires the rpc_data module to be loaded.
#
# @param detail [Symbol] detail The level of detail to request.
# @return [Array] If the detail level is set to :name then an array of services operator names.
# @return [Hash] If the detail level is set to :full then a hash of information about the
# services operators.
def list_opers(detail = :name)
self.run("anope.listOpers", detail)
end
# Retrieves information about the specified services operator.
#
# Requires the rpc_data module to be loaded.
#
# @param name [String] The name of the services operator.
# @return [Hash] A hash containing information about the services operator.
def oper(name)
self.run("anope.oper", name)
end
# Retrieves a list of servers.
#
# Requires the rpc_data module to be loaded.
#
# @param detail [Symbol] detail The level of detail to request.
# @return [Array] If the detail level is set to :name then an array of server names.
# @return [Hash] If the detail level is set to :full then a hash of information about the
# servers.
def list_servers(detail = :name)
self.run("anope.listServers", detail)
end
# Retrieves information about the specified server.
#
# Requires the rpc_data module to be loaded.
#
# @param name [String] The name of the server.
# @return [Hash] A hash containing information about the server.
def server(name)
self.run("anope.server", name)
end
# Retrieves a list of users.
#
# Requires the rpc_data module to be loaded.
#
# @param detail [Symbol] detail The level of detail to request.
# @return [Array] If the detail level is set to :name then an array of user nicknames.
# @return [Hash] If the detail level is set to :full then a hash of information about the
# users.
def list_users(detail = :name)
self.run("anope.listUsers", detail)
end
# Retrieves information about the specified user.
#
# Requires the rpc_data module to be loaded.
#
# @param name [String] The name of the user.
# @return [Hash] A hash containing information about the user.
def user(name)
self.run("anope.user", name)
end
# Sends a message to every user on the network.
#
# Requires the rpc_message module to be loaded.
#
# @param messages [Array<String>] One or more messages to send.
def message_network(*messages)
self.run("anope.messageNetwork", *messages)
end
# Sends a message to every user on the specified server.
#
# Requires the rpc_message module to be loaded.
#
# @param name [String] The name of the server.
# @param messages [Array<String>] One or more messages to send.
def message_server(server, *messages)
self.run("anope.messageServer", server, *messages)
end
# Sends a message to the specified user.
#
# Requires the rpc_message module to be loaded.
#
# @param source [String] The source pseudoclient to send the message from.
# @param target [String] The target user to send the message to.
# @param messages [Array<String>] One or more messages to send.
def message_user(source, target, *messages)
self.run("anope.messageUser", source, target, *messages)
end
# Checks whether the specified credentials are valid.
#
# Requires the rpc_user module to be loaded.
#
# @param account [String] A nickname belonging to the account to check.
# @param password [String] The password for the specified account.
# @return [Hash] A hash containing basic information about the account.
def check_credentials(account, password)
self.run("anope.checkCredentials", account, password)
end
# Identifies an IRC user to the specified account.
#
# Requires the rpc_user module to be loaded.
#
# @param account [String] Either an account identifier or nickname belonging to the account to
# identify to.
# @param password [String] The nickname of the IRC user to identify to the account.
def identify(account, user)
self.run("anope.identify", account, user)
end
# Lists all commands that exist on the network.
#
# Requires the rpc_user module to be loaded.
#
# @param services [Array<String>] The nicknames of the services to list commands for.
# @return [Hash] A hash containing information about the available commands.
def list_commands(*services)
self.run("anope.listCommands", *services)
end
# Lists all commands that exist on the network.
#
# Requires the rpc_user module to be loaded.
#
# @param account [String] If non-empty then the account to execute the command as.
# @param service [String] The service which the command exists on.
# @param command [Array<String>] The the command to execute and any parameters to pass to it.
# @return [Hash] A hash containing information about the available commands.
def command(account, service, *command)
self.run("anope.command", account, service, *command)
end
end
=begin
arpc = AnopeRPC.new("http://127.0.0.1:8080/jsonrpc")
begin
pp arpc.list_servers(:full)
rescue StandardError => err
STDERR.puts err
end
=end
+463
View File
@@ -0,0 +1,463 @@
# Anope `rpc_data` RPC interface
## `anope.listAccounts`
Lists all accounts that exist on the network.
### Parameters
Index | Description
----- | -----------
0 | If specified then the level of detail to retrieve. Can be set to "full" to retrieve all information or "name" to just retrieve the account names. Defaults to "name".
### Errors
Code | Description
------ | -----------
-32099 | The specified detail level does not exist.
### Result
If the detail level is not specified or is "name" then an array of account names.
If the detail level is "full" then a mapping of account names to information about the account. See `anope.account` for more information on the data structure.
#### Example
```json
["account1", "account2", "account3"]
```
## `anope.account`
Retrieves information about the specified account.
### Parameters
Index | Description
----- | -----------
0 | Either a nickname belonging to the account or an account identifier.
### Errors
Code | Description
------ | -----------
-32099 | The specified account does not exist.
### Result
Returns a map containing information about the account.
Key | Type | Description
--- | ---- | -----------
display | string | The display nickname of the account.
email | string or null | The email address associated with the account or null if one has not been specified.
extensions | map | A key-value map of the extensions set on this account by modules.
language | string or null | The language associated with the account or null if the account uses the default language.
lastmail | int | The time at which an email was last sent for this account.
nicks | map | Information about nicknames that belong to the account keyed by the nickname.
nicks.\*.extensions | map | A key-value map of the extensions set on this nickname by modules.
nicks.\*.lastseen | int | The time at which this nickname was last used.
nicks.\*.registered | int | The time at which this nickname was registered.
nicks.\*.vhost | map or null | The vhost associated with the account or null if the user has no vhost.
nicks.\*.vhost.created | int | The time at which the vhost was created.
nicks.\*.vhost.creator | string | The nickname of the creator of the vhost.
nicks.\*.vhost.host | string | The host segment of the vhost.
nicks.\*.vhost.ident | string or null | The ident segment of the vhost or null if there is not one.
nicks.\*.vhost.mask | string | The user@host or host mask of the vhost.
opertype | map or null | The oper type associated with the account or null if they are not a services operator.
opertype.commands | array[string] | The commands that the services operator type can use.
opertype.name | string | The name of the services operator type.
opertype.privileges | array[string] | The privileges that the services operator type has.
registered | int | The time at which the account was registered.
uniqueid | uint | The unique immutable identifier of the account.
users | array[string] | The IRC users who are currently logged in to this account.
#### Example
```json
{
"display": "foo",
"email": "example@example.com",
"extensions": {
"AUTOOP": true,
"HIDE_EMAIL": true,
"HIDE_MASK": true,
"MEMO_RECEIVE": true,
"MEMO_SIGNON": true,
"NS_PRIVATE": true,
"PROTECT": true,
"PROTECT_AFTER": 69
},
"language": null,
"lastmail": 1745071858,
"nicks": {
"foo": {
"extensions": {
"NS_NO_EXPIRE": true
},
"lastseen": 1745074153,
"registered": 1745071857,
"vhost": null
},
"bar": {
"extensions": {},
"lastseen": 1745072602,
"registered": 1745071857,
"vhost": {
"created": 1745072653,
"creator": "foo",
"host": "bar.baz",
"ident": "foo",
"mask": "foo@bar.baz"
}
}
},
"opertype": {
"commands": ["hostserv/*", "operserv/session"],
"name": "Helper",
"privileges": ["chanserv/no-register-limit"]
},
"registered": 1745071857,
"uniqueid": 11085415958920757000,
"users": [
"foo"
]
}
```
## `anope.listChannels`
Lists all channels that exist on the network.
### Parameters
Index | Description
----- | -----------
0 | If specified then the level of detail to retrieve. Can be set to "full" to retrieve all information or "name" to just retrieve the channel names. Defaults to "name".
### Errors
Code | Description
------ | -----------
-32099 | The specified detail level does not exist.
### Result
If the detail level is not specified or is "name" then an array of channel names.
If the detail level is "full" then a mapping of channel names to information about the channel. See `anope.channel` for more information on the data structure.
#### Example
```json
["#chan1", "#chan2", "#chan3"]
```
## `anope.channel`
Retrieves information about the specified channel.
### Parameters
Index | Description
----- | -----------
0 | The name of the channel.
### Errors
Code | Description
------ | -----------
-32099 | The specified channel does not exist.
### Result
Returns a map containing information about the channel.
Key | Type | Description
--- | ---- | -----------
created | int | The UNIX time at which the channel was originally created.
listmodes | map | List modes which are set on the channel keyed by the mode character.
modes | array[string] | Flag and parameter modes which are set on the channel.
name | string | The name of the channel.
registered | boolean | Whether the channel is registered.
topic | map or null | The channel topic or null if no topic is set.
topic.setat | int | The time at which the topic was set.
topic.setby | string | The nick or nuh of the user who set the topic.
topic.value | string | The text of the topic.
users | array[string] | The users that are current in the channel prefixed by their status mode prefixes.
#### Example
```json
{
"created": 1740402691,
"listmodes": {
"b": ["foo!bar@baz", "account:bax"],
},
"modes": ["+knrt", "secret"],
"name": "#chan1",
"registered": true,
"topic": {
"setat": 1740404706,
"setby": "nick1",
"value": "Example channel topic"
},
"users": ["@nick1", "nick2"]
}
```
## `anope.listOpers`
Lists all services operators that exist on the network.
### Parameters
Index | Description
----- | -----------
0 | If specified then the level of detail to retrieve. Can be set to "full" to retrieve all information or "name" to just retrieve the services operator nicknames. Defaults to "name".
### Errors
Code | Description
------ | -----------
-32099 | The specified detail level does not exist.
### Result
If the detail level is not specified or is "name" then an array of services operator names.
If the detail level is "full" then a mapping of services operator names to information about the services operator. See `anope.oper` for more information on the data structure.
#### Example
```json
["nick1", "nick2", "nick3"]
```
## `anope.oper`
Retrieves information about the specified services operator.
### Parameters
Index | Description
----- | -----------
0 | The name of the services operator.
### Errors
Code | Description
------ | -----------
-32099 | The specified services operator does not exist.
### Result
Returns a map containing information about the services operator.
Key | Type | Description
--- | ---- | -----------
fingerprints | array[string] or null | The client certificate fingerprints that a user must be using to log in as this services operator or null if there are no client certificate restrictions.
hosts | array[string] or null | The user@ip and user@ip masks that a user must be connecting from to log in as this services operator or null if there are no host restrictions.
name | string | The name of the services operator.
operonly | boolean | Whether a user has to be a server operator to log in as this services operator.
opertype | map | The oper type associated with the services operator.
opertype.commands | array[string] | The commands that the services operator type can use.
opertype.name | string | The name of the services operator type.
opertype.privileges | array[string] | The privileges that the services operator type has.
password | boolean | Whether a user has to specify a password to log in as the services operator.
vhost | string or null | The vhost of the services operator or null if there is no vhost.
#### Example
```json
{
"fingerprints": null,
"hosts": ["*@*.example.com"],
"name": "stest",
"operonly": true,
"opertype": {
"commands": ["hostserv/*", "operserv/session"],
"name": "Helper",
"privileges": ["chanserv/no-register-limit"]
},
"password": false,
"vhost": null
}
```
## `anope.listServers`
Lists all servers that exist on the network.
### Parameters
Index | Description
----- | -----------
0 | If specified then the level of detail to retrieve. Can be set to "full" to retrieve all information or "name" to just retrieve the server names. Defaults to "name".
### Errors
Code | Description
------ | -----------
-32099 | The specified detail level does not exist.
### Result
If the detail level is not specified or is "name" then an array of server names.
If the detail level is "full" then a mapping of server names to information about the server. See `anope.server` for more information on the data structure.
#### Example
```json
["irc1.example.com", "irc2.example.com", "services.example.com"]
```
## `anope.server`
Retrieves information about the specified server.
### Parameters
Index | Description
----- | -----------
0 | The name of the server.
### Errors
Code | Description
------ | -----------
-32099 | The specified server does not exist.
### Result
Returns a map containing information about the server.
Key | Type | Description
--- | ---- | -----------
description | string | The description of the server.
downlinks | array[string] | The servers which are behind this server
juped | boolean | Whether the server has been juped.
name | string | The name of the server.
sid | string or null | The unique immutable identifier of the server or null if the IRCd does not use SIDs.
synced | boolean | Whether the server has finished syncing.
ulined | boolean | Whether the server is U-lined.
uplink | string or null | The server in front of this server or null if it is the services server.
#### Example
```json
{
"description": "Anope IRC Services",
"downlinks": ["irc.example.com"],
"juped": false,
"name": "services.example.com",
"sid": "00B",
"synced": true,
"ulined": true,
"uplink": null
}
```
## `anope.listUsers`
Lists all users that exist on the network.
### Parameters
Index | Description
----- | -----------
0 | If specified then the level of detail to retrieve. Can be set to "full" to retrieve all information or "name" to just retrieve the user nicknames. Defaults to "name".
### Errors
Code | Description
------ | -----------
-32099 | The specified detail level does not exist.
### Result
If the detail level is not specified or is "name" then an array of user nicknames.
If the detail level is "full" then a mapping of user nicknames to information about the user. See `anope.user` for more information on the data structure.
#### Example
```json
["nick1", "nick2", "nick3"]
```
## `anope.user`
Retrieves information about the specified user.
### Parameters
Index | Description
----- | -----------
0 | The nickname of the user.
### Errors
Code | Description
------ | -----------
-32099 | The specified user does not exist.
### Result
Returns a map containing information about the user.
Key | Type | Description
--- | ---- | -----------
account | map or null | The user's account or null if they are not logged in to an account.
account.display | string | The display nickname of the account.
account.opertype | string or null | The account's oper type or null if the account is not a services operator.
account.uniqueid | uint | The unique immutable identifier of the account.
address | string | The IP address the user is connecting from.
away | map or null | The user's away state or null if they are not away.
away.message | string | The away message specified by the user.
away.time | int | The UNIX time at which the user went away.
channels | array[string] | The channels that the user is in prefixed by their status mode prefixes.
chost | string or null | The cloaked hostname of the user or null if they have no cloak.
fingerprint | string or null | The fingerprint of the user's client certificate or null if they are not using one.
host | string | The real hostname of the user.
ident | string | The username (ident) of the user.
modes | array[string] | Flag and parameter modes which are set on the user.
nick | string | The nickname of the user.
nickchanged | int | The time at which the user last changed their nickname.
real | string | The real name of the user.
server | string | The server that the user is connected to.
signon | int | The time at which the user connected to the network.
tls | bool | Whether the user is connected using TLS (SSL).
uid | string or null | The unique immutable identifier of the user or null if the IRCd does not use UIDs.
vhost | string or null | The virtual host of the user or null if they have no vhost.
vident | string or null | The virtual ident (username) of the user or null if they have no vident.
#### Example
```json
{
"account": {
"display": "nick1",
"opertype": "Services Root",
"uniqueid": "17183514657819486040"
},
"address": "127.0.0.1",
"away": null,
"channels": ["@#chan1", "#chan2"],
"chost": "localhost",
"fingerprint": null,
"host": "localhost",
"id": "9TSAAAAAA",
"ident": "user1",
"modes": ["+r"],
"nick": "nick1",
"nickchanged": 1740408318,
"real": "An IRC User",
"server": "irc.example.com",
"signon": 1740408296,
"tls": true,
"vhost": "staff.example.com",
"vident": null,
}
```
+67
View File
@@ -0,0 +1,67 @@
# Anope `rpc_message` RPC interface
## `anope.messageNetwork`
Sends a message to all users on the network.
### Parameters
Index | Description
----- | -----------
0+ | One or more messages to send.
### Errors
Code | Description
------ | -----------
-32099 | The global service is not available.
### Result
This procedure returns no result.
## `anope.messageServer`
Sends a message to all users on the specified server.
### Parameters
Index | Description
----- | -----------
0 | The name of the server to message users on.
1+ | One or more messages to send.
### Errors
Code | Description
------ | -----------
-32099 | The global service is not available.
-32098 | The specified server does not exist.
### Result
This procedure returns no result.
## `anope.messageUser`
Sends a message to the specified user.
### Parameters
Index | Description
----- | -----------
0 | The source pseudoclient to send the message from.
1 | The target user to send the message to.
2+ | One or more messages to send.
### Errors
Code | Description
------ | -----------
-32099 | The specified source does not exist.
-32098 | The specified target does not exist.
### Result
This procedure returns no result.
+175
View File
@@ -0,0 +1,175 @@
# Anope `rpc_user` RPC interface
## `anope.checkCredentials`
Checks whether the specified credentials are valid.
### Parameters
Index | Description
----- | -----------
0 | A nickname belonging to the account to check.
1 | The password for the specified account.
### Errors
Code | Description
------ | -----------
-32099 | The specified account does not exist.
-32098 | The specified password is not correct.
-32097 | The specified account is suspended.
### Result
Returns a map containing basic information about the account. More information about the account can be found by calling [the `anope.account` event using the value from the `uniqueid` field (requires the rpc_data module)](./rpc_user.md).
Key | Type | Description
--- | ---- | -----------
account | string | The display nickname of the account.
confirmed | boolean | Whether the account has been confirmed.
uniqueid | uint | The unique immutable identifier of the account.
#### Example
```json
{
"account": "foo",
"confirmed": true,
"uniqueid": 11085415958920757000,
}
```
## `anope.identify`
Identifies an IRC user to the specified account.
### Parameters
Index | Description
----- | -----------
0 | Either an account identifier or nickname belonging to the account to identify to.
1 | The nickname of the IRC user to identify to the account.
### Errors
Code | Description
------ | -----------
-32099 | The specified account does not exist.
-32098 | The specified IRC user does not exist.
### Result
This procedure returns no result.
## `anope.listCommands`
Lists all commands that exist on the network.
### Parameters
Index | Description
----- | -----------
0...n | The nicknames of the services to list commands for. If none are specified then all commands are returned.
### Errors
Code | Description
------ | -----------
-32098 | The specified service does not exist.
### Result
Returns a map containing information about the available commands.
Key | Type | Description
--- | ---- | -----------
\* | map | A key-value map of services to the commands that exist on them.
\*.\* | string | A key-value map of commands to information about the commands.
\*.\*.group | string or null | The group that the command belongs to or null if the command is not grouped.
\*.\*.hidden | boolean | Whether the command is visible in the help output.
\*.\*.maxparams | uint or null | The maximum number of parameters that the command accepts or null if there is no limit.
\*.\*.minparams | uint | The minimum number of parameters that the command accepts.
\*.\*.permission | string or null | The services operator permission required to execute the command or null if no permissions are required.
\*.\*.requiresaccount | boolean | Whether a caller must be logged into an account to execute the command.
\*.\*.requiresuser | boolean | Whether an IRC user is required to execute the command.
#### Example
```json
{
"Global": {
"GLOBAL": {
"group": null,
"hidden": false,
"maxparams": 1,
"minparams": 0,
"permission": "global/global",
"requiresaccount": true,
"requiresuser": false
},
"HELP": {
"group": null,
"hidden": false,
"maxparams": null,
"minparams": 0,
"permission": null,
"requireaccount": false,
"requireuser": false
},
"QUEUE": {
"group": null,
"hidden": false,
"maxparams": 2,
"minparams": 1,
"permission": "global/queue",
"requireaccount": true,
"requireuser": false
},
"SERVER": {
"group": null,
"hidden": false,
"maxparams": 2,
"minparams": 1,
"permission": "global/server",
"requireaccount": true,
"requireuser": false
}
}
}
```
## `anope.commands`
Executes the specified command.
### Parameters
Index | Description
----- | -----------
0 | If non-empty then the account to execute the command as.
1 | The service which the command exists on.
2...n | The the command to execute and any parameters to pass to it.
### Errors
Code | Description
------ | -----------
-32099 | The specified account does not exist.
-32098 | The specified service does not exist.
-32097 | The specified command does not exist.
### Result
Returns an array of messages returned by the command.
#### Example
```json
[
"Global commands:",
" GLOBAL Send a message to all users",
" HELP Displays this list and give information about commands",
" QUEUE Manages your pending message queue.",
" SERVER Send a message to all users on a server"
]
```
+1 -1
View File
@@ -70,7 +70,7 @@ Anope for Windows
If you cannot find whats causing the error, please visit our forums or
our IRC Support channel for assistance.
Some Anope modules require third party libraries, such as m_mysql and
Some Anope modules require third party libraries, such as mysql and
the SSL modules. If these libraries are installed in nonstandard
locations, cmake will probably not find them and should be told where
they are by passing their location to Config.
-29
View File
@@ -1,29 +0,0 @@
Starting with Anope 1.9.4 XMLRPC using PHP's xmlrpc_encode_request and xmlrpc_decode functions is supported.
This allows external applications, such as websites, to execute remote procedure calls to Anope in real time.
Currently there are 5 supported XMLRPC calls, provided by m_xmlrpc_main:
checkAuthentication - Takes two parameters, an account name and a password. Checks if the account name is valid and the password
is correct for the account name, useful for making login pages on websites.
command - Takes three parameters, a service name (BotServ, ChanServ, NickServ), a user name (whether online or not), and the command
to execute. This will execute the given command to Anope using the given service name. If the user given is online, the
command reply will go to them, if not it is returned by XMLRPC.
stats - Takes no parameters, returns miscellaneous stats that can be found in the /operserv stats command.
channel - Takes one parameter, a channel name, and returns real time information regarding that channel, such as users, modes
(ban lists and such), topic etc.
user - Takes one parameter, a user name, and returns real time information regarding that user.
opers - Takes no parameters, returns opertypes, their privileges and commands.
notice - Takes three parameters, source user, target user, and message. Sends a message to the user.
XMLRPC was designed to be used with db_sql, and will not return any information that can be pulled from the SQL
database, such as accounts and registered channel information. It is instead used for pulling realtime data such
as users and channels currently online. For examples on how to use these calls in PHP, see xmlrpc.php in docs/XMLRPC.
Also note that the parameter named "id" is reserved for query ID. If you pass a query to Anope containing a value for id. it will
be stored by Anope and the same id will be passed back in the result.
-145
View File
@@ -1,145 +0,0 @@
<?php
/**
* XMLRPC Functions
*
* (C) 2003-2023 Anope Team
* Contact us at team@anope.org
*/
class AnopeXMLRPC
{
/**
* The XMLRPC host
*
* @var string
*/
private $host;
/**
* Initiate a new AnopeXMLRPC instance
*
* @param $host
*/
public function __construct($host)
{
$this->host = $host;
}
/**
* Run an XMLRPC command. Name should be a query name and params an array of parameters, eg:
* $this->raw("checkAuthentication", ["adam", "qwerty"]);
* If successful returns back an array of useful information.
*
* Note that $params["id"] is reserved for query ID, you may set it to something if you wish.
* If you do, the same ID will be passed back with the reply from Anope.
*
* @param $name
* @param $params
* @return array|null
*/
public function run($name, $params)
{
$xmlquery = xmlrpc_encode_request($name, $params);
$context = stream_context_create(["http" => [
"method" => "POST",
"header" => "Content-Type: text/xml",
"content" => $xmlquery]]);
$inbuf = file_get_contents($this->host, false, $context);
$response = xmlrpc_decode($inbuf);
if ($response) {
return $response;
}
return null;
}
/**
* Do Command on Service as User, eg:
* $anope->command("ChanServ", "Adam", "REGISTER #adam");
* Returns an array of information regarding the command execution, if
* If 'online' is set to yes, then the reply to the command was sent to the user on IRC.
* If 'online' is set to no, then the reply to the command is in the array member 'return'
*
* @param $service
* @param $user
* @param $command
* @return array|null
*/
public function command($service, $user, $command)
{
return $this->run("command", [$service, $user, $command]);
}
/**
* Check an account/nick name and password to see if they are valid
* Returns the account display name if valid
*
* @param $account
* @param $pass
* @return string|null
*/
public function auth($account, $pass)
{
$ret = $this->run("checkAuthentication", [$account, $pass]);
if ($ret && $ret["result"] == "Success") {
return $ret["account"];
}
return null;
}
/**
* Returns an array of misc stats regarding Anope
*
* @return array|null
*/
public function stats()
{
return $this->run("stats", null);
}
/**
* Look up data for a channel
* Returns an array containing channel information, or an array of size one
* (just containing the name) if the channel does not exist
*
* @param $channel
* @return array|null
*/
public function channel($channel)
{
return $this->run("channel", [$channel]);
}
/**
* Sent a notice to a user.
* Returns an array containing channel information, or an array of size one
* (just containing the name) if the channel does not exist
*
* @param $source
* @param $target
* @param $message
* @return array|null
*/
public function notice($source, $target, $message)
{
return $this->run("notice", [$source, $target, $message]);
}
/**
* Like channel(), but different.
*
* @param $user
* @return array|null
*/
public function user($user)
{
return $this->run("user", [$user]);
}
}
$anope = new AnopeXMLRPC("http://127.0.0.1:8080/xmlrpc");
+19 -10
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -27,7 +27,7 @@ enum
* backing each ChanAccess determines whether that ChanAccess has a given
* privilege.
*/
struct CoreExport Privilege
struct CoreExport Privilege final
{
Anope::string name;
Anope::string desc;
@@ -38,7 +38,7 @@ struct CoreExport Privilege
bool operator==(const Privilege &other) const;
};
class CoreExport PrivilegeManager
class CoreExport PrivilegeManager final
{
static std::vector<Privilege> Privileges;
public:
@@ -52,7 +52,8 @@ public:
/* A provider of access. Only used for creating ChanAccesses, as
* they contain pure virtual functions.
*/
class CoreExport AccessProvider : public Service
class CoreExport AccessProvider
: public Service
{
public:
AccessProvider(Module *owner, const Anope::string &name);
@@ -70,8 +71,19 @@ public:
};
/* Represents one entry of an access list on a channel. */
class CoreExport ChanAccess : public Serializable
class CoreExport ChanAccess
: public Serializable
{
public:
struct Type final
: public Serialize::Type
{
Type();
void Serialize(Serializable *obj, Serialize::Data &data) const override;
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override;
};
private:
Anope::string mask;
/* account this access entry is for, if any */
Serialize::Reference<NickCore> nc;
@@ -95,9 +107,6 @@ public:
const Anope::string &Mask() const;
NickCore *GetAccount() const;
void Serialize(Serialize::Data &data) const override;
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
static const unsigned int MAX_DEPTH = 4;
/** Check if this access entry matches the given user or account
@@ -105,7 +114,7 @@ public:
* @param nc The account
* @param next Next channel to check if any
*/
virtual bool Matches(const User *u, const NickCore *nc, ChannelInfo* &next) const;
virtual bool Matches(const User *u, const NickCore *nc, ChannelInfo *&next) const;
/** Check if this access entry has the given privilege.
* @param name The privilege name
@@ -133,7 +142,7 @@ public:
/* A group of access entries. This is used commonly, for example with ChannelInfo::AccessFor,
* to show what access a user has on a channel because users can match multiple access entries.
*/
class CoreExport AccessGroup
class CoreExport AccessGroup final
{
public:
/* access entries + paths */
+63 -86
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -17,21 +17,33 @@
#include "memo.h"
#include "base.h"
typedef Anope::hash_map<NickAlias *> nickalias_map;
typedef Anope::hash_map<NickCore *> nickcore_map;
typedef Anope::unordered_map<NickAlias *> nickalias_map;
typedef Anope::unordered_map<NickCore *> nickcore_map;
typedef std::unordered_map<uint64_t, NickCore *> nickcoreid_map;
extern CoreExport Serialize::Checker<nickalias_map> NickAliasList;
extern CoreExport Serialize::Checker<nickcore_map> NickCoreList;
extern CoreExport nickcoreid_map NickCoreIdList;
extern CoreExport Serialize::Checker<nickcoreid_map> NickCoreIdList;
/* A registered nickname.
* It matters that Base is here before Extensible (it is inherited by Serializable)
*/
class CoreExport NickAlias : public Serializable, public Extensible
class CoreExport NickAlias final
: public Serializable
, public Extensible
{
public:
struct Type final
: public Serialize::Type
{
Type();
void Serialize(Serializable *obj, Serialize::Data &data) const override;
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override;
};
private:
Anope::string vhost_ident, vhost_host, vhost_creator;
time_t vhost_created;
time_t vhost_created = 0;
public:
Anope::string nick;
@@ -41,8 +53,9 @@ public:
Anope::string last_usermask;
/* Last uncloaked usermask, requires nickserv/auspex to see */
Anope::string last_realhost;
time_t time_registered;
time_t last_seen;
time_t registered = Anope::CurTime;
time_t last_seen = Anope::CurTime;
/* Account this nick is tied to. Multiple nicks can be tied to a single account. */
Serialize::Reference<NickCore> nc;
@@ -53,63 +66,78 @@ public:
NickAlias(const Anope::string &nickname, NickCore *nickcore);
~NickAlias();
void Serialize(Serialize::Data &data) const override;
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
/** Set a vhost for the user
* @param ident The ident
* @param host The host
* @param creator Who created the vhost
* @param time When the vhost was created
*/
void SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created = Anope::CurTime);
void SetVHost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created = Anope::CurTime);
/** Remove a users vhost
**/
void RemoveVhost();
void RemoveVHost();
/** Check if the user has a vhost
* @return true or false
*/
bool HasVhost() const;
bool HasVHost() const;
/** Retrieve the vhost ident
* @return the ident
*/
const Anope::string &GetVhostIdent() const;
const Anope::string &GetVHostIdent() const;
/** Retrieve the vhost host
* @return the host
*/
const Anope::string &GetVhostHost() const;
const Anope::string &GetVHostHost() const;
/** Retrieve the vhost mask
* @param the mask
*/
Anope::string GetVHostMask() const;
/** Retrieve the vhost creator
* @return the creator
*/
const Anope::string &GetVhostCreator() const;
const Anope::string &GetVHostCreator() const;
/** Retrieve when the vhost was created
* @return the time it was created
*/
time_t GetVhostCreated() const;
time_t GetVHostCreated() const;
/** Finds a registered nick
* @param nick The nick to lookup
* @return the nick, if found
*/
static NickAlias *Find(const Anope::string &nick);
static NickAlias *FindId(uint64_t uid);
};
/* A registered account. Each account must have a NickAlias with the same nick as the
* account's display.
* It matters that Base is here before Extensible (it is inherited by Serializable)
*/
class CoreExport NickCore : public Serializable, public Extensible
class CoreExport NickCore final
: public Serializable
, public Extensible
{
public:
struct Type final
: public Serialize::Type
{
Type();
void Serialize(Serializable *obj, Serialize::Data &data) const override;
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override;
};
private:
/* Channels which reference this core in some way (this is on their access list, akick list, is founder, successor, etc) */
Serialize::Checker<std::map<ChannelInfo *, int> > chanaccess;
/* Unique identifier for the account. */
uint64_t id;
uint64_t uniqueid;
public:
/* Name of the account. Find(display)->nc == this. */
Anope::string display;
@@ -118,11 +146,12 @@ public:
Anope::string email;
/* Locale name of the language of the user. Empty means default language */
Anope::string language;
/* Access list, contains user@host masks of users who get certain privileges based
* on if NI_SECURE is set and what (if any) kill protection is enabled. */
std::vector<Anope::string> access;
/* Last time an email was sent to this user */
time_t lastmail = 0;
/* The time this account was registered */
time_t registered = Anope::CurTime;
MemoInfo memos;
std::map<Anope::string, Anope::string> last_modes;
std::map<Anope::string, ModeData> last_modes;
/* Nicknames registered that are grouped to this account.
* for n in aliases, n->nc == this.
@@ -130,14 +159,14 @@ public:
Serialize::Checker<std::vector<NickAlias *> > aliases;
/* Set if this user is a services operator. o->ot must exist. */
Oper *o;
Oper *o = nullptr;
/* Unsaved data */
/** The display nick for this account. */
Serialize::Reference<NickAlias> na;
/* Number of channels registered by this account */
uint16_t channelcount;
/* Last time an email was sent to this user */
time_t lastmail;
uint16_t channelcount = 0;
/* Users online now logged into this account */
std::list<User *> users;
@@ -148,79 +177,25 @@ public:
NickCore(const Anope::string &nickdisplay, uint64_t nickid = 0);
~NickCore();
void Serialize(Serialize::Data &data) const override;
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
/** Changes the display for this account
* @param na The new display, must be grouped to this account.
*/
void SetDisplay(const NickAlias *na);
void SetDisplay(NickAlias *na);
/** Checks whether this account is a services oper or not.
* @return True if this account is a services oper, false otherwise.
*/
virtual bool IsServicesOper() const;
/** Add an entry to the nick's access list
*
* @param entry The nick!ident@host entry to add to the access list
*
* Adds a new entry into the access list.
*/
void AddAccess(const Anope::string &entry);
/** Get an entry from the nick's access list by index
*
* @param entry Index in the access list vector to retrieve
* @return The access list entry of the given index if within bounds, an empty string if the vector is empty or the index is out of bounds
*
* Retrieves an entry from the access list corresponding to the given index.
*/
Anope::string GetAccess(unsigned entry) const;
/** Get the number of entries on the access list for this account.
*/
unsigned GetAccessCount() const;
/** Retrieves the account id for this user */
uint64_t GetId();
/** Find an entry in the nick's access list
*
* @param entry The nick!ident@host entry to search for
* @return True if the entry is found in the access list, false otherwise
*
* Search for an entry within the access list.
*/
bool FindAccess(const Anope::string &entry);
/** Erase an entry from the nick's access list
*
* @param entry The nick!ident@host entry to remove
*
* Removes the specified access list entry from the access list.
*/
void EraseAccess(const Anope::string &entry);
/** Clears the entire nick's access list
*
* Deletes all the memory allocated in the access list vector and then clears the vector.
*/
void ClearAccess();
/** Is the given user on this accounts access list?
*
* @param u The user
*
* @return true if the user is on the access list
*/
bool IsOnAccess(const User *u) const;
/** Finds an account
* @param nick The account name to find
* @return The account, if it exists
*/
static NickCore* Find(const Anope::string &nick);
static NickCore *Find(const Anope::string &nick);
static NickCore *FindId(uint64_t uid);
void AddChannelReference(ChannelInfo *ci);
void RemoveChannelReference(ChannelInfo *ci);
@@ -237,6 +212,7 @@ class CoreExport IdentifyRequest
Module *owner;
Anope::string account;
Anope::string password;
Anope::string address;
std::set<Module *> holds;
bool dispatched = false;
@@ -245,7 +221,7 @@ class CoreExport IdentifyRequest
static std::set<IdentifyRequest *> Requests;
protected:
IdentifyRequest(Module *o, const Anope::string &acc, const Anope::string &pass);
IdentifyRequest(Module *o, const Anope::string &acc, const Anope::string &pass, const Anope::string &ip);
virtual ~IdentifyRequest();
public:
@@ -256,6 +232,7 @@ public:
Module *GetOwner() const { return owner; }
const Anope::string &GetAccount() const { return account; }
const Anope::string &GetPassword() const { return password; }
const Anope::string &GetAddress() const { return address; }
/* Holds this request. When a request is held it must be Released later
* for the request to complete. Multiple modules may hold a request at any time,
+120 -103
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -22,7 +22,7 @@ namespace Anope
* allow us to only require one type of string everywhere that can be converted
* at any time to a specific type of string.
*/
class CoreExport string
class CoreExport string final
{
private:
/**
@@ -39,6 +39,7 @@ namespace Anope
typedef std::string::reverse_iterator reverse_iterator;
typedef std::string::const_reverse_iterator const_reverse_iterator;
typedef std::string::size_type size_type;
typedef std::string::value_type value_type;
static const size_type npos = static_cast<size_type>(-1);
/**
@@ -140,8 +141,8 @@ namespace Anope
*/
inline void push_back(char c) { return this->_string.push_back(c); }
inline string& append(const string &s) { this->_string.append(s.str()); return *this; }
inline string& append(const char *s, size_t n) { this->_string.append(s, n); return *this; }
inline string &append(const string &s) { this->_string.append(s.str()); return *this; }
inline string &append(const char *s, size_t n) { this->_string.append(s, n); return *this; }
/**
* Resizes the string content to n characters.
@@ -159,21 +160,21 @@ namespace Anope
* Trim leading and trailing white spaces from the string.
*/
inline string& ltrim(const Anope::string &what = " \t\r\n")
inline string &ltrim(const Anope::string &what = " \t\r\n")
{
while (!this->_string.empty() && what.find(this->_string[0]) != Anope::string::npos)
this->_string.erase(this->_string.begin());
return *this;
}
inline string& rtrim(const Anope::string &what = " \t\r\n")
inline string &rtrim(const Anope::string &what = " \t\r\n")
{
while (!this->_string.empty() && what.find(this->_string[this->_string.length() - 1]) != Anope::string::npos)
this->_string.erase(this->_string.length() - 1);
return *this;
}
inline string& trim(const Anope::string &what = " \t\r\n")
inline string &trim(const Anope::string &what = " \t\r\n")
{
this->ltrim(what);
this->rtrim(what);
@@ -210,12 +211,24 @@ namespace Anope
inline size_type find_last_not_of(const string &_str, size_type pos = npos) const { return this->_string.find_last_not_of(_str._string, pos); }
inline size_type find_last_not_of_ci(const string &_str, size_type pos = npos) const { return ci::string(this->_string.c_str()).find_last_not_of(ci::string(_str._string.c_str()), pos); }
inline int compare(size_t pos, size_t len, const string &str) const { return ci::string(this->_string.c_str()).compare(pos, len, ci::string(str.c_str())); }
inline int compare(size_t pos, size_t len, const string &str, size_t subpos, size_type sublen = npos) const { return ci::string(this->_string.c_str()).compare(pos, len, ci::string(str.c_str()), subpos, sublen); }
inline int compare(size_t pos, size_t len, const char *s, size_type n = npos) const { return ci::string(this->_string.c_str()).compare(pos, len, s, n); }
/**
* Determine if string consists of only numbers.
*/
inline bool is_number_only() const { return this->find_first_not_of("0123456789.-") == npos; }
inline bool is_pos_number_only() const { return this->find_first_not_of("0123456789.") == npos; }
/**
* In IRC messages we use a substitute (ASCII 0x1A) instead of a space
* (ASCII 0x20) so it doesn't get line wrapped when put into a message.
* The line wrapper will convert this to a space before it is sent to
* clients.
*/
inline Anope::string nobreak() const { return this->replace_all_cs("\x20", "\x1A"); }
/**
* Replace parts of the string.
*/
@@ -308,7 +321,7 @@ namespace Anope
inline const string operator+(const char *_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
inline const string operator+(const std::string &_str, const string &str) { string tmp(_str); tmp += str; return tmp; }
struct hash_ci
struct hash_ci final
{
inline size_t operator()(const string &s) const
{
@@ -316,7 +329,7 @@ namespace Anope
}
};
struct hash_cs
struct hash_cs final
{
inline size_t operator()(const string &s) const
{
@@ -324,7 +337,7 @@ namespace Anope
}
};
struct compare
struct compare final
{
inline bool operator()(const string &s1, const string &s2) const
{
@@ -332,11 +345,16 @@ namespace Anope
}
};
template<typename T> class map : public std::map<string, T, ci::less> { };
template<typename T> class multimap : public std::multimap<string, T, ci::less> { };
template<typename T> class hash_map : public std::unordered_map<string, T, hash_ci, compare> { };
template<typename T>
using map = std::map<string, T, ci::less>;
#ifndef REPRODUCIBLE_BUILD
template<typename T>
using multimap = std::multimap<string, T, ci::less>;
template<typename T>
using unordered_map = std::unordered_map<string, T, hash_ci, compare>;
#if !REPRODUCIBLE_BUILD
static const char *const compiled = __TIME__ " " __DATE__;
#endif
@@ -357,14 +375,15 @@ namespace Anope
* Use this unless you need very specific time checks
*/
extern CoreExport time_t CurTime;
extern CoreExport long long CurTimeNs;
/** The debug level we are running at.
*/
extern CoreExport int Debug;
extern CoreExport unsigned Debug;
/** Other command line options.
*/
extern CoreExport bool ReadOnly, NoFork, NoThird, NoExpire, ProtocolDebug;
extern CoreExport bool ReadOnly, NoFork, NoThird, NoPID, NoExpire, ProtocolDebug;
/** The root of the Anope installation. Usually ~/anope
*/
@@ -416,7 +435,7 @@ namespace Anope
* initializing language support, loading modules, and loading databases.
* @throws CoreException if something bad went wrong
*/
extern void Init(int ac, char **av);
extern bool Init(int ac, char **av);
/** Calls the save database event
*/
@@ -460,14 +479,7 @@ namespace Anope
* @param src The source string to encrypt
* @param dest The destination where the encrypted string is placed
*/
extern CoreExport void Encrypt(const Anope::string &src, Anope::string &dest);
/** Hashes a buffer with SipHash-2-4
* @param src The start of the buffer to hash
* @param src_sz The total number of bytes in the buffer
* @param key A 16 byte key to hash the buffer with.
*/
extern CoreExport uint64_t SipHash24(const void *src, unsigned long src_sz, const char key[16]);
extern CoreExport bool Encrypt(const Anope::string &src, Anope::string &dest);
/** Returns a sequence of data formatted as the format argument specifies.
** After the format parameter, the function expects at least as many
@@ -476,7 +488,7 @@ namespace Anope
* @param ... any number of parameters
* @return a Anope::string
*/
extern CoreExport string printf(const char *fmt, ...);
extern CoreExport string printf(const char *fmt, ...) ATTR_FORMAT(1, 2);
/** Return the last error code
* @return The error code
@@ -486,7 +498,7 @@ namespace Anope
/** Return the last error, uses errno/GetLastError() to determine this
* @return An error message
*/
extern CoreExport const string LastError();
extern CoreExport string LastError();
/** Determines if a path is a file
*/
@@ -525,10 +537,18 @@ namespace Anope
*/
extern CoreExport Anope::string NormalizeBuffer(const Anope::string &);
/** Main processing routine. Parses the message and takes the appropriate action.
* @param Raw message from the uplink
/** Parses a raw message from the uplink and calls its command handler.
* @param message Raw message from the uplink
*/
extern void Process(const Anope::string &);
extern void Process(const Anope::string &message);
/** Calls the command handler for an already parsed message.
* @param source Source of the message.
* @param command Command name.
* @param params Any extra parameters.
* @param tags IRCv3 message tags.
*/
extern CoreExport void ProcessInternal(MessageSource &src, const Anope::string &command, const std::vector<Anope::string> &params, const Anope::map<Anope::string> & tags);
/** Does a blocking dns query and returns the first IP.
* @param host host to look up
@@ -548,6 +568,61 @@ namespace Anope
* @param len The length of the string returned
*/
extern CoreExport Anope::string Random(size_t len);
/** Generate a random number. */
extern CoreExport int RandomNumber();
/** Calculates the levenshtein distance between two strings.
* @param s1 The first string.
* @param s2 The second string.
*/
extern CoreExport size_t Distance(const Anope::string &s1, const Anope::string &s2);
/** Update the current time. */
extern CoreExport void UpdateTime();
/** Expands a path fragment that is relative to the base directory.
* @param base The base directory that it is relative to.
* @param fragment The fragment to expand.
*/
extern CoreExport Anope::string Expand(const Anope::string &base, const Anope::string &fragment);
/** Expands a config path. */
inline auto ExpandConfig(const Anope::string &path) { return Expand(ConfigDir, path); }
/** Expands a data path. */
inline auto ExpandData(const Anope::string &path) { return Expand(DataDir, path); }
/** Expands a locale path. */
inline auto ExpandLocale(const Anope::string &path) { return Expand(LocaleDir, path); }
/** Expands a log path. */
inline auto ExpandLog(const Anope::string &path) { return Expand(LogDir, path); }
/** Expands a module path. */
inline auto ExpandModule(const Anope::string &path) { return Expand(ModuleDir, path); }
/** Formats a CTCP message for sending to a client.
* @param name The name of the CTCP.
* @param body If present then the body of the CTCP.
* @return A formatted CTCP ready to send to a client.
*/
extern CoreExport Anope::string FormatCTCP(const Anope::string &name, const Anope::string &body = "");
/** Parses a CTCP message received from a client.
* @param text The raw message to parse.
* @param name The location to store the name of the CTCP.
* @param body The location to store body of the CTCP if one is present.
* @return True if the message was a well formed CTCP; otherwise, false.
*/
extern CoreExport bool ParseCTCP(const Anope::string &text, Anope::string &name, Anope::string &body);
/** Replaces template variables within a string with values from a map.
* @param str The string to template from.
* @param vars The variables to replace within the string.
* @return The specified string with all variables replaced within it.
*/
extern CoreExport Anope::string Template(const Anope::string &str, const Anope::map<Anope::string> &vars);
}
/** sepstream allows for splitting token separated lists.
@@ -575,6 +650,9 @@ public:
*/
sepstream(const Anope::string &source, char separator, bool allowempty = false);
/** Retrieves the underlying string. */
const auto &GetString() const { return tokens; }
/** Fetch the next token from the stream
* @param token The next token from the stream is placed here
* @return True if tokens still remain, false if there are none left
@@ -591,7 +669,7 @@ public:
/** Gets every token from this stream
* @param token Tokens are pushed back here
*/
template<typename T> void GetTokens(T& token)
template<typename T> void GetTokens(T &token)
{
token.clear();
Anope::string t;
@@ -614,7 +692,7 @@ public:
/** Fetch the entire remaining stream, without tokenizing
* @return The remaining part of the stream
*/
const Anope::string GetRemaining();
Anope::string GetRemaining();
/** Returns true if the end of the stream has been reached
* @return True if the end of the stream has been reached, otherwise false
@@ -624,7 +702,8 @@ public:
/** A derived form of sepstream, which separates on commas
*/
class commasepstream : public sepstream
class commasepstream final
: public sepstream
{
public:
/** Initialize with comma separator
@@ -634,7 +713,8 @@ public:
/** A derived form of sepstream, which separates on spaces
*/
class spacesepstream : public sepstream
class spacesepstream final
: public sepstream
{
public:
/** Initialize with space separator
@@ -648,7 +728,8 @@ public:
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
*/
class CoreException : public std::exception
class CoreExport CoreException
: public std::exception
{
protected:
/** Holds the error message to be displayed
@@ -658,9 +739,6 @@ protected:
*/
Anope::string source;
public:
/** Default constructor, just uses the error message 'Core threw an exception'.
*/
CoreException() : err("Core threw an exception"), source("The core") { }
/** This constructor can be used to specify an error message before throwing.
*/
CoreException(const Anope::string &message) : err(message), source("The core") { }
@@ -687,13 +765,10 @@ public:
}
};
class ModuleException : public CoreException
class CoreExport ModuleException
: public CoreException
{
public:
/** Default constructor, just uses the error message 'Module threw an exception'.
*/
ModuleException() : CoreException("Module threw an exception", "A Module") { }
/** This constructor can be used to specify an error message before throwing.
*/
ModuleException(const Anope::string &message) : CoreException(message, "A Module") { }
@@ -704,66 +779,6 @@ public:
virtual ~ModuleException() noexcept = default;
};
class ConvertException : public CoreException
{
public:
ConvertException(const Anope::string &reason = "") : CoreException(reason) { }
virtual ~ConvertException() noexcept = default;
};
/** Convert something to a string
*/
template<typename T> inline Anope::string stringify(const T &x)
{
std::ostringstream stream;
if (!(stream << x))
throw ConvertException("Stringify fail");
return stream.str();
}
template<typename T> inline void convert(const Anope::string &s, T &x, Anope::string &leftover, bool failIfLeftoverChars = true)
{
leftover.clear();
std::istringstream i(s.str());
char c;
if (!(i >> x))
throw ConvertException("Convert fail");
if (failIfLeftoverChars)
{
if (i.get(c))
throw ConvertException("Convert fail");
}
else
{
std::string left;
getline(i, left);
leftover = left;
}
}
template<typename T> inline void convert(const Anope::string &s, T &x, bool failIfLeftoverChars = true)
{
Anope::string Unused;
convert(s, x, Unused, failIfLeftoverChars);
}
template<typename T> inline T convertTo(const Anope::string &s, Anope::string &leftover, bool failIfLeftoverChars = true)
{
T x;
convert(s, x, leftover, failIfLeftoverChars);
return x;
}
template<typename T> inline T convertTo(const Anope::string &s, bool failIfLeftoverChars = true)
{
T x;
convert(s, x, failIfLeftoverChars);
return x;
}
/** Casts to be used instead of dynamic_cast, this uses dynamic_cast
* for debug builds and static_cast on release builds
* to speed up the program because dynamic_cast relies on RTTI.
@@ -783,3 +798,5 @@ template<typename T, typename O> inline T anope_dynamic_static_cast(O ptr)
return static_cast<T>(ptr);
}
#endif
#include "convert.h"
+5 -4
View File
@@ -1,7 +1,7 @@
/*
*
* (C) 2008-2011 Adam <Adam@anope.org>
* (C) 2008-2023 Anope Team <team@anope.org>
* (C) 2008-2025 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -43,7 +43,8 @@ public:
* no longer be valid once the object it refers is destructed.
*/
template<typename T>
class Reference : public ReferenceBase
class Reference
: public ReferenceBase
{
protected:
T *ref = nullptr;
@@ -102,14 +103,14 @@ public:
return NULL;
}
inline T* operator->()
inline T *operator->()
{
if (operator bool())
return this->ref;
return NULL;
}
inline T* operator*()
inline T *operator*()
{
if (operator bool())
return this->ref;
+26 -6
View File
@@ -1,7 +1,7 @@
/*
*
* (C) 2008-2011 Robin Burchell <w00t@inspircd.org>
* (C) 2008-2023 Anope Team <team@anope.org>
* (C) 2008-2025 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -19,8 +19,20 @@ typedef Anope::map<BotInfo *> botinfo_map;
extern CoreExport Serialize::Checker<botinfo_map> BotListByNick, BotListByUID;
/* A service bot (NickServ, ChanServ, a BotServ bot, etc). */
class CoreExport BotInfo : public User, public Serializable
class CoreExport BotInfo final
: public User
, public Serializable
{
public:
struct Type final
: public Serialize::Type
{
Type();
void Serialize(Serializable *obj, Serialize::Data &data) const override;
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override;
};
private:
/* Channels this bot is assigned to */
Serialize::Checker<std::set<ChannelInfo *> > channels;
public:
@@ -29,6 +41,10 @@ public:
time_t lastmsg;
/* Map of actual command names -> service name/permission required */
CommandInfo::map commands;
/** CTCP responses this bot can send. */
Anope::map<std::function<void(BotInfo *, User *, const Anope::string &)>> ctcps;
/* The server-side alias used to message this bot. */
Anope::string alias;
/* Modes the bot should have as configured in service:modes */
Anope::string botmodes;
/* Channels the bot should be in as configured in service:channels */
@@ -54,7 +70,7 @@ public:
virtual ~BotInfo();
void Serialize(Serialize::Data &data) const;
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
static Serializable *Unserialize(Serializable *obj, Serialize::Data &);
void GenerateUID();
@@ -106,8 +122,9 @@ public:
/** Called when a user messages this bot
* @param u The user
* @param message The users' message
* @params tags Message tags
*/
virtual void OnMessage(User *u, const Anope::string &message);
virtual void OnMessage(User *u, const Anope::string &message, const Anope::map<Anope::string> &tags);
/** Link a command name to a command in services
* @param cname The command name
@@ -115,7 +132,7 @@ public:
* @param permission Permission required to execute the command, if any
* @return The commandinfo for the newly created command
*/
CommandInfo& SetCommand(const Anope::string &cname, const Anope::string &sname, const Anope::string &permission = "");
CommandInfo &SetCommand(const Anope::string &cname, const Anope::string &sname, const Anope::string &permission = "");
/** Get command info for a command
* @param cname The command name
@@ -123,10 +140,13 @@ public:
*/
CommandInfo *GetCommand(const Anope::string &cname);
/** Get the command that users can use to send a message to this bot. */
Anope::string GetQueryCommand(const Anope::string &command = "", const Anope::string &extra = "") const;
/** Find a bot by nick
* @param nick The nick
* @param nick_only True to only look by nick, and not by UID
* @return The bot, if it exists
*/
static BotInfo* Find(const Anope::string &nick, bool nick_only = false);
static BotInfo *Find(const Anope::string &nick, bool nick_only = false);
};
+31 -26
View File
@@ -1,6 +1,6 @@
/* Channel support
*
* (C) 2008-2023 Anope Team
* (C) 2008-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -13,12 +13,13 @@
#include "modes.h"
#include "serialize.h"
typedef Anope::hash_map<Channel *> channel_map;
typedef Anope::unordered_map<Channel *> channel_map;
extern CoreExport channel_map ChannelList;
/* A user container, there is one of these per user per channel. */
struct ChanUserContainer : public Extensible
struct ChanUserContainer final
: public Extensible
{
User *user;
Channel *chan;
@@ -28,12 +29,14 @@ struct ChanUserContainer : public Extensible
ChanUserContainer(User *u, Channel *c) : user(u), chan(c) { }
};
class CoreExport Channel : public Base, public Extensible
class CoreExport Channel final
: public Base
, public Extensible
{
static std::vector<Channel *> deleting;
public:
typedef std::multimap<Anope::string, Anope::string> ModeList;
typedef std::multimap<Anope::string, ModeData> ModeList;
private:
/** A map of channel modes with their parameters set on this channel
*/
@@ -45,11 +48,11 @@ public:
/* Set if this channel is registered. ci->c == this. Contains information relevant to the registered channel */
Serialize::Reference<ChannelInfo> ci;
/* When the channel was created */
time_t creation_time;
time_t created;
/* If the channel has just been created in a netjoin */
bool syncing;
bool syncing = false;
/* Is configured in the conf as a channel bots should be in */
bool botchannel;
bool botchannel = false;
/* Users in the channel */
typedef std::map<User *, ChanUserContainer *> ChanUserList;
@@ -63,15 +66,15 @@ public:
* This is the time the topic was *originally set*. When we restore the topic we want to change the TS back
* to this, but we can only do this on certain IRCds.
*/
time_t topic_ts;
time_t topic_ts = 0;
/* The actual time the topic was set, probably close to Anope::CurTime */
time_t topic_time;
time_t topic_time = 0;
time_t server_modetime; /* Time of last server MODE */
time_t chanserv_modetime; /* Time of last check_modes() */
int16_t server_modecount; /* Number of server MODEs this second */
int16_t chanserv_modecount; /* Number of check_mode()'s this sec */
int16_t bouncy_modes; /* Did we fail to set modes here? */
time_t server_modetime = 0; /* Time of last server MODE */
time_t chanserv_modetime = 0; /* Time of last check_modes() */
int16_t server_modecount = 0; /* Number of server MODEs this second */
int16_t chanserv_modecount = 0; /* Number of check_mode()'s this sec */
bool bouncy_modes = false; /* Did we fail to set modes here? */
private:
/** Constructor
@@ -107,7 +110,7 @@ public:
* @param status The status to give the user, if any
* @return The UserContainer for the user
*/
ChanUserContainer* JoinUser(User *u, const ChannelStatus *status);
ChanUserContainer *JoinUser(User *u, const ChannelStatus *status);
/** Remove a user internally from the channel
* @param u The user
@@ -145,10 +148,10 @@ public:
/** Set a mode internally on a channel, this is not sent out to the IRCd
* @param setter The setter
* @param cm The mode
* @param param The param
* @param data Data about the mode.
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
*/
void SetModeInternal(MessageSource &source, ChannelMode *cm, const Anope::string &param = "", bool enforce_mlock = true);
void SetModeInternal(MessageSource &source, ChannelMode *cm, const ModeData &data = {}, bool enforce_mlock = true);
/** Remove a mode internally on a channel, this is not sent out to the IRCd
* @param setter The Setter
@@ -161,19 +164,19 @@ public:
/** Set a mode on a channel
* @param bi The client setting the modes
* @param cm The mode
* @param param Optional param arg for the mode
* @param data Data about the mode
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
*/
void SetMode(BotInfo *bi, ChannelMode *cm, const Anope::string &param = "", bool enforce_mlock = true);
void SetMode(BotInfo *bi, ChannelMode *cm, const ModeData &data = {}, bool enforce_mlock = true);
/**
* Set a mode on a channel
* @param bi The client setting the modes
* @param name The mode name
* @param param Optional param arg for the mode
* @param data Data about the mode
* @param enforce_mlock true if mlocks should be enforced, false to override mlock
*/
void SetMode(BotInfo *bi, const Anope::string &name, const Anope::string &param = "", bool enforce_mlock = true);
void SetMode(BotInfo *bi, const Anope::string &name, const ModeData &data = {}, bool enforce_mlock = true);
/** Remove a mode from a channel
* @param bi The client setting the modes
@@ -204,14 +207,15 @@ public:
* @param enforce_mlock Should mlock be enforced on this mode change
* @param cmodes The modes to set
*/
void SetModes(BotInfo *bi, bool enforce_mlock, const char *cmodes, ...);
void SetModes(BotInfo *bi, bool enforce_mlock, const char *cmodes, ...) ATTR_FORMAT(4, 5);
void SetModes(BotInfo *bi, bool enforce_mlock, const Anope::string &cmodes);
/** Set a string of modes internally on a channel
* @param source The setter
* @param mode the modes
* @param enforce_mlock true to enforce mlock
*/
void SetModesInternal(MessageSource &source, const Anope::string &mode, time_t ts = 0, bool enforce_mlock = true);
void SetModesInternal(MessageSource &source, const Anope::string &modes, const std::vector<Anope::string> &params, time_t ts = 0, bool enforce_mlock = true);
/** Does the given user match the given list? (CMODE_BAN, CMODE_EXCEPT, etc, a list mode)
* @param u The user
@@ -233,7 +237,8 @@ public:
* @param reason The reason for the kick
* @return true if the kick was successful, false if a module blocked the kick
*/
bool Kick(BotInfo *bi, User *u, const char *reason = NULL, ...);
bool Kick(BotInfo *bi, User *u, const char *reason = NULL, ...) ATTR_FORMAT(4, 5);
bool Kick(BotInfo *bi, User *u, const Anope::string &reason);
/** Get all modes set on this channel, excluding status modes.
* @return a map of modes and their optional parameters.
@@ -297,7 +302,7 @@ public:
* @param name The channel to find
* @return The channel, if found
*/
static Channel* Find(const Anope::string &name);
static Channel *Find(const Anope::string &name);
/** Finds or creates a channel
* @param name The channel name
+29 -21
View File
@@ -1,6 +1,6 @@
/* Declarations for command data.
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -14,14 +14,15 @@
#include "service.h"
#include "anope.h"
#include "channels.h"
#include "textproc.h"
struct CommandGroup
struct CommandGroup final
{
Anope::string name, description;
};
/* Used in BotInfo::commands */
struct CommandInfo
struct CommandInfo final
{
typedef Anope::map<CommandInfo> map;
@@ -31,10 +32,12 @@ struct CommandInfo
Anope::string permission;
/* Group this command is in */
Anope::string group;
/* whether or not to hide this command in help output */
/* Whether to hide this command in help and suggestions */
bool hide = false;
/* Only used with fantasy */
/* Whether to prepend the channel name (only used with fantasy) */
bool prepend_channel = false;
/* Whether to require the FANTASY privilege (only used with fantasy) */
bool require_privilege = true;
};
/* Where the replies from commands go to. User inherits from this and is the normal
@@ -44,10 +47,11 @@ struct CoreExport CommandReply
{
virtual ~CommandReply() = default;
virtual void SendMessage(BotInfo *source, const Anope::string &msg) = 0;
virtual void SendMessage(CommandSource &source, const Anope::string &msg);
};
/* The source for a command */
class CoreExport CommandSource
class CoreExport CommandSource final
{
/* The nick executing the command */
Anope::string nick;
@@ -61,15 +65,17 @@ public:
/* Where the reply should go */
CommandReply *reply;
/* Channel the command was executed on (fantasy) */
Reference<Channel> c;
Reference<Channel> c = nullptr;
/* The service this command is on */
Reference<BotInfo> service;
/* The actual name of the command being executed */
Anope::string command;
/* The permission of the command being executed */
Anope::string permission;
/* The unique identifier of the executing message. */
Anope::string msgid;
CommandSource(const Anope::string &n, User *user, NickCore *core, CommandReply *reply, BotInfo *bi);
CommandSource(const Anope::string &n, User *user, NickCore *core, CommandReply *reply, BotInfo *bi, const Anope::string &m = "");
const Anope::string &GetNick() const;
User *GetUser();
@@ -77,7 +83,8 @@ public:
AccessGroup AccessFor(ChannelInfo *ci);
bool IsFounder(ChannelInfo *ci);
void Reply(const char *message, ...);
void Reply(const char *message, ...) ATTR_FORMAT(2, 3);
void Reply(int count, const char *singular, const char *plural, ...) ATTR_FORMAT(4, 5);
void Reply(const Anope::string &message);
bool HasCommand(const Anope::string &cmd);
@@ -88,14 +95,15 @@ public:
/** Every services command is a class, inheriting from Command.
*/
class CoreExport Command : public Service
class CoreExport Command
: public Service
{
Anope::string desc;
std::vector<Anope::string> syntax;
std::vector<std::pair<Anope::string, std::function<bool(CommandSource&)>>> syntax;
/* Allow unregistered users to use this command */
bool allow_unregistered;
bool allow_unregistered = false;
/* Command requires that a user is executing it */
bool require_user;
bool require_user = false;
public:
/* Maximum parameters accepted by this command */
@@ -123,15 +131,15 @@ protected:
void SetDesc(const Anope::string &d);
void ClearSyntax();
void SetSyntax(const Anope::string &s);
void SetSyntax(const Anope::string &s, const std::function<bool(CommandSource&)> &p = nullptr);
void SendSyntax(CommandSource &);
void AllowUnregistered(bool b);
void RequireUser(bool b);
public:
bool AllowUnregistered() const;
bool RequireUser() const;
inline bool AllowUnregistered() const { return this->allow_unregistered; }
inline bool RequireUser() const { return this->require_user; }
/** Get the command description
* @param source The source wanting the command description
@@ -145,10 +153,10 @@ public:
*/
virtual void Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;
/** Called when HELP is requested for the client this command is on.
/** Called when help is requested for the client this command is on.
* @param source The source
*/
virtual void OnServHelp(CommandSource &source);
virtual void OnServHelp(CommandSource &source, HelpWrapper &help);
/** Requested when the user is requesting help on this command. Help on this command should be sent to the user.
* @param source The source
@@ -167,9 +175,9 @@ public:
* @param source The source of the command
* @param message The full message to run, the command is at the beginning of the message
*/
static void Run(CommandSource &source, const Anope::string &message);
static bool Run(CommandSource &source, const Anope::string &message);
void Run(CommandSource &source, const Anope::string &, const CommandInfo &, std::vector<Anope::string> &params);
bool Run(CommandSource &source, const Anope::string &, const CommandInfo &, std::vector<Anope::string> &params);
/** Looks up a command name from the service name.
* Note that if the same command exists multiple places this will return the first one encountered
@@ -178,5 +186,5 @@ public:
* @param name If found, is set to the command name, eg REGISTER
* @return true if the given command service exists
*/
static bool FindCommandFromService(const Anope::string &command_service, BotInfo* &bi, Anope::string &name);
static bool FindCommandFromService(const Anope::string &command_service, BotInfo *&bi, Anope::string &name);
};
+24 -41
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -15,15 +15,12 @@
#include "regchannel.h"
#include "users.h"
#include "opertype.h"
#include <stack>
namespace Configuration
{
namespace Internal
{
class CoreExport Block
{
friend struct Configuration::Conf;
friend class Configuration::Conf;
public:
typedef Anope::map<Anope::string> item_map;
@@ -42,43 +39,25 @@ namespace Configuration
Block(const Anope::string &);
const Anope::string &GetName() const;
int CountBlock(const Anope::string &name) const;
const Block* GetBlock(const Anope::string &name, int num = 0) const;
Block* GetMutableBlock(const Anope::string &name, int num = 0);
const Block &GetBlock(const Anope::string &name, int num = 0) const;
Block *GetMutableBlock(const Anope::string &name, int num = 0);
template<typename T> inline T Get(const Anope::string &tag) const
template<typename T> T Get(const Anope::string &tag, const Anope::string &def = "") const
{
return this->Get<T>(tag, "");
}
/* VS 2008 has an issue with having a default argument here (def = ""), which is why the above
* function exists.
*/
template<typename T> T Get(const Anope::string &tag, const Anope::string &def) const
{
const Anope::string &value = this->Get<const Anope::string>(tag, def);
if (!value.empty())
try
{
return convertTo<T>(value);
}
catch (const ConvertException &) { }
return T();
return Anope::TryConvert<T>(this->Get<const Anope::string>(tag, def)).value_or(T());
}
bool Set(const Anope::string &tag, const Anope::string &value);
const item_map &GetItems() const;
};
template<> CoreExport const Anope::string Block::Get(const Anope::string &tag, const Anope::string& def) const;
template<> CoreExport const Anope::string Block::Get(const Anope::string &tag, const Anope::string &def) const;
template<> CoreExport time_t Block::Get(const Anope::string &tag, const Anope::string &def) const;
template<> CoreExport bool Block::Get(const Anope::string &tag, const Anope::string &def) const;
} // namespace Internal
typedef const Internal::Block Block;
typedef Internal::Block MutableBlock;
/** Represents a configuration file
*/
class File
class File final
{
Anope::string name;
bool executable;
@@ -98,25 +77,27 @@ namespace Configuration
struct Uplink;
struct CoreExport Conf : Block
class CoreExport Conf final
: public Block
{
private:
/** Replaces defined variables within a string. */
Anope::string ReplaceVars(const Anope::string &str, const File &file, int linenumber);
public:
/* options:readtimeout */
time_t ReadTimeout;
/* options:useprivmsg */
bool UsePrivmsg;
/* If we should default to privmsging clients */
bool DefPrivmsg;
/* Default language */
Anope::string DefLanguage;
/* options:timeoutcheck */
time_t TimeoutCheck;
/* options:usestrictprivmsg */
bool UseStrictPrivmsg;
/* options:servicealias */
bool ServiceAlias;
/* networkinfo:nickchars */
Anope::string NickChars;
/* either "/msg " or "/" */
Anope::string StrictPrivmsg;
/* List of uplink servers to try and connect to */
std::vector<Uplink> Uplinks;
/* A vector of our logfile options */
@@ -144,15 +125,15 @@ namespace Configuration
void LoadConf(File &file);
void Post(Conf *old);
Block *GetModule(Module *);
Block *GetModule(const Anope::string &name);
Block &GetModule(const Module *);
Block &GetModule(const Anope::string &name);
BotInfo *GetClient(const Anope::string &name);
const Block *GetCommand(CommandSource &);
const Block &GetCommand(CommandSource &);
};
struct Uplink
struct Uplink final
{
Anope::string host;
unsigned port;
@@ -162,6 +143,7 @@ namespace Configuration
Uplink(const Anope::string &_host, int _port, const Anope::string &_password, int _protocol) : host(_host), port(_port), password(_password), protocol(_protocol) { }
inline bool operator==(const Uplink &other) const { return host == other.host && port == other.port && password == other.password && protocol == other.protocol; }
inline bool operator!=(const Uplink &other) const { return !(*this == other); }
Anope::string str() const;
};
}
@@ -171,7 +153,8 @@ namespace Configuration
* be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
* attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
*/
class ConfigException : public CoreException
class CoreExport ConfigException final
: public CoreException
{
public:
/** Default constructor, just uses the error message 'Config threw an exception'.
+132
View File
@@ -0,0 +1,132 @@
/*
*
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*/
#pragma once
#include <optional>
namespace Anope
{
/** Attempts to convert a string to any type.
* @param in The value to convert.
* @param leftover If non-nullptr then the location to store leftover data.
*/
template<typename T>
inline std::optional<T> TryConvert(const Anope::string &in, Anope::string *leftover = nullptr)
{
std::istringstream tmp(in.str());
T out;
if (!(tmp >> out))
return std::nullopt;
if (leftover)
{
leftover->clear();
std::getline(tmp, leftover->str());
}
else
{
char extra;
if (tmp >> extra)
return std::nullopt;
}
return out;
}
/** Converts a string to any type.
* @param in The value to convert.
* @param def The default to use if the conversion failed.
* @param leftover If non-nullptr then the location to store leftover data.
*/
template<typename T>
inline T Convert(const Anope::string &in, T def, Anope::string *leftover = nullptr)
{
return TryConvert<T>(in, leftover).value_or(def);
}
/** Attempts to convert any type to a string.
* @param in The value to convert.
*/
template <class T>
inline std::optional<Anope::string> TryString(const T &in)
{
std::ostringstream tmp;
if (!(tmp << in))
return std::nullopt;
return tmp.str();
}
/** No-op function that returns the string that was passed to it.
* @param in The string to return.
*/
inline const string &ToString(const string &in)
{
return in;
}
/** Converts a std::string to a string.
* @param in The value to convert.
*/
inline string ToString(const std::string &in)
{
return in;
}
/** Converts a char array to a string.
* @param in The value to convert.
*/
inline string ToString(const char *in)
{
return string(in);
}
/** Converts a char to a string.
* @param in The value to convert.
*/
inline string ToString(char in)
{
return string(1, static_cast<string::value_type>(in));
}
/** Converts an unsigned char to a string.
* @param in The value to convert.
*/
inline string ToString(unsigned char in)
{
return string(1, static_cast<string::value_type>(in));
}
/** Converts a bool to a string.
* @param in The value to convert.
*/
inline string ToString(bool in)
{
return (in ? "1" : "0");
}
/** Converts a type that std::to_string is implemented for to a string.
* @param in The value to convert.
*/
template<typename Stringable>
inline std::enable_if_t<std::is_arithmetic_v<Stringable>, string> ToString(const Stringable &in)
{
return std::to_string(in);
}
/** Converts any type to a string.
* @param in The value to convert.
*/
template <class T>
inline std::enable_if_t<!std::is_arithmetic_v<T>, string> ToString(const T &in)
{
return TryString(in).value_or(Anope::string());
}
}
+3 -2
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -19,11 +19,12 @@ class ChanAccess;
class Channel;
class ChannelInfo;
class ChannelStatus;
struct ModeData;
struct ChanUserContainer;
class ClientSocket;
class Command;
class CommandSource;
namespace Configuration { struct Conf; }
namespace Configuration { class Conf; }
class ConnectionSocket;
namespace DNS { struct Query; }
class Entry;
+35 -29
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -15,7 +15,8 @@
class Extensible;
class CoreExport ExtensibleBase : public Service
class CoreExport ExtensibleBase
: public Service
{
protected:
std::map<Extensible *, void *> items;
@@ -40,12 +41,12 @@ public:
void UnsetExtensibles();
template<typename T> T* GetExt(const Anope::string &name) const;
template<typename T> T *GetExt(const Anope::string &name) const;
bool HasExt(const Anope::string &name) const;
template<typename T> T* Extend(const Anope::string &name, const T &what);
template<typename T> T* Extend(const Anope::string &name);
template<typename T> T* Require(const Anope::string &name);
template<typename T> T *Extend(const Anope::string &name, const T &what);
template<typename T> T *Extend(const Anope::string &name);
template<typename T> T *Require(const Anope::string &name);
template<typename T> void Shrink(const Anope::string &name);
static void ExtensibleSerialize(const Extensible *, const Serializable *, Serialize::Data &data);
@@ -53,7 +54,8 @@ public:
};
template<typename T>
class BaseExtensibleItem : public ExtensibleBase
class BaseExtensibleItem
: public ExtensibleBase
{
protected:
virtual T *Create(Extensible *) = 0;
@@ -75,17 +77,17 @@ public:
}
}
T* Set(Extensible *obj, const T &value)
T *Set(Extensible *obj, const T &value)
{
T* t = Set(obj);
T *t = Set(obj);
if (t)
*t = value;
return t;
}
T* Set(Extensible *obj)
T *Set(Extensible *obj)
{
T* t = Create(obj);
T *t = Create(obj);
Unset(obj);
items[obj] = t;
obj->extension_items.insert(this);
@@ -100,7 +102,7 @@ public:
delete value;
}
T* Get(const Extensible *obj) const
T *Get(const Extensible *obj) const
{
std::map<Extensible *, void *>::const_iterator it = items.find(const_cast<Extensible *>(obj));
if (it != items.end())
@@ -113,9 +115,9 @@ public:
return items.find(const_cast<Extensible *>(obj)) != items.end();
}
T* Require(Extensible *obj)
T *Require(Extensible *obj)
{
T* t = Get(obj);
T *t = Get(obj);
if (t)
return t;
@@ -124,10 +126,11 @@ public:
};
template<typename T>
class ExtensibleItem : public BaseExtensibleItem<T>
class ExtensibleItem
: public BaseExtensibleItem<T>
{
protected:
T* Create(Extensible *obj) override
T *Create(Extensible *obj) override
{
return new T(obj);
}
@@ -136,10 +139,11 @@ public:
};
template<typename T>
class PrimitiveExtensibleItem : public BaseExtensibleItem<T>
class PrimitiveExtensibleItem
: public BaseExtensibleItem<T>
{
protected:
T* Create(Extensible *obj) override
T *Create(Extensible *obj) override
{
return new T();
}
@@ -151,7 +155,7 @@ template<>
class PrimitiveExtensibleItem<bool> : public BaseExtensibleItem<bool>
{
protected:
bool* Create(Extensible *) override
bool *Create(Extensible *) override
{
return NULL;
}
@@ -160,15 +164,16 @@ public:
};
template<typename T>
class SerializableExtensibleItem : public PrimitiveExtensibleItem<T>
class SerializableExtensibleItem
: public PrimitiveExtensibleItem<T>
{
public:
SerializableExtensibleItem(Module *m, const Anope::string &n) : PrimitiveExtensibleItem<T>(m, n) { }
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const override
{
T* t = this->Get(e);
data[this->name] << *t;
T *t = this->Get(e);
data.Store(this->name, *t);
}
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
@@ -189,7 +194,7 @@ public:
void ExtensibleSerialize(const Extensible *e, const Serializable *s, Serialize::Data &data) const override
{
data[this->name] << true;
data.Store(this->name, this->HasExt(e));
}
void ExtensibleUnserialize(Extensible *e, Serializable *s, Serialize::Data &data) override
@@ -204,13 +209,14 @@ public:
};
template<typename T>
struct ExtensibleRef : ServiceReference<BaseExtensibleItem<T> >
struct ExtensibleRef final
: ServiceReference<BaseExtensibleItem<T> >
{
ExtensibleRef(const Anope::string &n) : ServiceReference<BaseExtensibleItem<T> >("Extensible", n) { }
};
template<typename T>
T* Extensible::GetExt(const Anope::string &name) const
T *Extensible::GetExt(const Anope::string &name) const
{
ExtensibleRef<T> ref(name);
if (ref)
@@ -221,16 +227,16 @@ T* Extensible::GetExt(const Anope::string &name) const
}
template<typename T>
T* Extensible::Extend(const Anope::string &name, const T &what)
T *Extensible::Extend(const Anope::string &name, const T &what)
{
T* t = Extend<T>(name);
T *t = Extend<T>(name);
if (t)
*t = what;
return t;
}
template<typename T>
T* Extensible::Extend(const Anope::string &name)
T *Extensible::Extend(const Anope::string &name)
{
ExtensibleRef<T> ref(name);
if (ref)
@@ -241,7 +247,7 @@ T* Extensible::Extend(const Anope::string &name)
}
template<typename T>
T* Extensible::Require(const Anope::string &name)
T *Extensible::Require(const Anope::string &name)
{
if (HasExt(name))
return GetExt<T>(name);
+8 -5
View File
@@ -1,7 +1,7 @@
/*
*
* (C) 2002-2011 InspIRCd Development Team
* (C) 2009-2023 Anope Team <team@anope.org>
* (C) 2009-2025 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -27,7 +27,8 @@ namespace Anope
/* ASCII case insensitive ctype. */
template<typename char_type>
class ascii_ctype : public std::ctype<char_type>
class ascii_ctype
: public std::ctype<char_type>
{
public:
char_type do_toupper(char_type c) const override
@@ -49,7 +50,8 @@ namespace Anope
/* rfc1459 case insensitive ctype, { = [, } = ], and | = \ */
template<typename char_type>
class rfc1459_ctype : public ascii_ctype<char_type>
class rfc1459_ctype final
: public ascii_ctype<char_type>
{
public:
char_type do_toupper(char_type c) const override
@@ -78,7 +80,8 @@ namespace ci
* This class is used to implement ci::string, a case-insensitive, ASCII-
* comparing string class.
*/
struct CoreExport ci_char_traits : std::char_traits<char>
struct CoreExport ci_char_traits final
: std::char_traits<char>
{
/** Check if two chars match.
* @param c1st First character
@@ -123,7 +126,7 @@ namespace ci
*/
typedef std::basic_string<char, ci_char_traits, std::allocator<char> > string;
struct CoreExport less
struct CoreExport less final
{
/** Compare two Anope::strings as ci::strings and find which one is less
* @param s1 The first string
+59 -26
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2008-2023 Anope Team
* (C) 2008-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -55,27 +55,64 @@ namespace Language
*/
extern CoreExport const char *Translate(const NickCore *nc, const char *string);
/** Translatesa string to the given language.
/** Translates a string to the given language.
* @param lang The language to translate to
* @param string The string to translate
* @return The translated string if found, else the original string.
*/
extern CoreExport const char *Translate(const char *lang, const char *string);
/** Translates a plural string to the default language.
* @param count The number of items the string is counting.
* @param singular The string to translate if there is one of \p count
* @param plural The string to translate if there is multiple of \p count
* @return The translated string if found, else the original string.
*/
extern CoreExport const char *Translate(int count, const char *singular, const char *plural);
/** Translates a plural string to the language of the given user.
* @param u The user to translate the string for
* @param count The number of items the string is counting.
* @param singular The string to translate if there is one of \p count
* @param plural The string to translate if there is multiple of \p count
* @return The translated string if found, else the original string.
*/
extern CoreExport const char *Translate(User *u, int count, const char *singular, const char *plural);
/** Translates a plural string to the language of the given account.
* @param nc The account to translate the string for
* @param count The number of items the string is counting.
* @param singular The string to translate if there is one of \p count
* @param plural The string to translate if there is multiple of \p count
* @return The translated string if count, else the original string
*/
extern CoreExport const char *Translate(const NickCore *nc, int count, const char *singular, const char *plural);
/** Translates a plural string to the given language.
* @param lang The language to translate to
* @param count The number of items the string is counting.
* @param singular The string to translate if there is one of \p count
* @param plural The string to translate if there is multiple of \p count
* @return The translated string if found, else the original string.
*/
extern CoreExport const char *Translate(const char *lang, int count, const char *singular, const char *plural);
} // namespace Language
/* Commonly used language strings */
#define MORE_INFO _("\002%s%s HELP %s\002 for more information.")
#define CONFIRM_DROP _("Please confirm that you want to drop \002%s\002 with \002%s\032%s\032%s\002")
#define SERVICE_UNAVAILABLE _("Sorry, %s is temporarily unavailable.")
#define MORE_INFO _("Type \002%s\002 for more information.")
#define BAD_USERHOST_MASK _("Mask must be in the form \037user\037@\037host\037.")
#define BAD_EXPIRY_TIME _("Invalid expiry time.")
#define USERHOST_MASK_TOO_WIDE _("%s coverage is too wide; Please use a more specific mask.")
#define READ_ONLY_MODE _("Services are in read-only mode!")
#define READ_ONLY_MODE _("Services are temporarily in read-only mode.")
#define PASSWORD_INCORRECT _("Password incorrect.")
#define ACCESS_DENIED _("Access denied.")
#define MORE_OBSCURE_PASSWORD _("Please try again with a more obscure password. Passwords should not be\n" \
"something that could be easily guessed (e.g. your real name or your nick) and\n" \
"cannot contain the space or tab characters.\n")
#define PASSWORD_TOO_SHORT _("Your password is too short. It must must be longer than %u characters.")
#define MORE_OBSCURE_PASSWORD _("Please try again with a more obscure password. Passwords should not be " \
"something that could be easily guessed (e.g. your real name or your nick) and " \
"cannot contain the space or tab characters.")
#define PASSWORD_TOO_SHORT _("Your password is too short. It must be longer than %u characters.")
#define PASSWORD_TOO_LONG _("Your password is too long. It must be shorter than %u characters.")
#define NICK_NOT_REGISTERED _("Your nick isn't registered.")
#define NICK_X_NOT_REGISTERED _("Nick \002%s\002 isn't registered.")
@@ -86,20 +123,17 @@ namespace Language
#define CHAN_X_NOT_REGISTERED _("Channel \002%s\002 isn't registered.")
#define CHAN_X_NOT_IN_USE _("Channel \002%s\002 doesn't exist.")
#define NICK_IDENTIFY_REQUIRED _("You must be logged into an account to use that command.")
#define MAIL_X_INVALID _("\002%s\002 is not a valid e-mail address.")
#define MAIL_X_INVALID _("\002%s\002 is not a valid email address.")
#define UNKNOWN _("<unknown>")
#define NO_EXPIRE _("does not expire")
#define LIST_INCORRECT_RANGE _("Incorrect range specified. The correct syntax is \002#\037from\037-\037to\037\002.")
#define NICK_IS_REGISTERED _("This nick is owned by someone else. Please choose another.\n" \
"(If this is your nick, type \002%s%s IDENTIFY \037password\037\002.)")
#define NICK_IS_SECURE _("This nickname is registered and protected. If it is your\n" \
"nick, type \002%s%s IDENTIFY \037password\037\002. Otherwise,\n" \
#define NICK_IS_SECURE _("This nickname is registered and protected. If it is your " \
"nick, type \002%s\032\037password\037\002. Otherwise, " \
"please choose a different nick.")
#define FORCENICKCHANGE_NOW _("This nickname has been registered; you may not use it.")
#define NICK_CANNOT_BE_REGISTERED _("Nickname \002%s\002 may not be registered.")
#define NICK_ALREADY_REGISTERED _("Nickname \002%s\002 is already registered!")
#define NICK_SET_DISPLAY_CHANGED _("The new display is now \002%s\002.")
#define NICK_CONFIRM_INVALID _("Invalid passcode has been entered, please check the e-mail again, and retry.")
#define CHAN_NOT_ALLOWED_TO_JOIN _("You are not permitted to be on this channel.")
#define CHAN_X_INVALID _("Channel %s is not a valid channel.")
#define CHAN_REACHED_CHANNEL_LIMIT _("Sorry, you have already reached your limit of \002%d\002 channels.")
@@ -108,23 +142,22 @@ namespace Language
#define CHAN_SETTING_CHANGED _("%s for %s set to %s.")
#define CHAN_SETTING_UNSET _("%s for %s unset.")
#define CHAN_ACCESS_LEVEL_RANGE _("Access level must be between %d and %d inclusive.")
#define CHAN_INFO_HEADER _("Information for channel \002%s\002:")
#define CHAN_INFO_HEADER _("Information about channel \002%s\002:")
#define CHAN_EXCEPTED _("\002%s\002 matches an except on %s and cannot be banned until the except has been removed.")
#define MEMO_NEW_X_MEMO_ARRIVED _("There is a new memo on channel %s.\n" \
"Type \002%s%s READ %s %d\002 to read it.")
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s.\n" \
"Type \002%s%s READ %d\002 to read it.")
#define MEMO_NEW_X_MEMO_ARRIVED _("There is a new memo on channel %s. " \
"Type \002%s\032%s\032%zu\002 to read it.")
#define MEMO_NEW_MEMO_ARRIVED _("You have a new memo from %s. " \
"Type \002%s\032%zu\002 to read it.")
#define MEMO_HAVE_NO_MEMOS _("You have no memos.")
#define MEMO_X_HAS_NO_MEMOS _("%s has no memos.")
#define MEMO_SEND_DISABLED _("Sorry, memo sending is temporarily disabled.")
#define MEMO_HAVE_NO_NEW_MEMOS _("You have no new memos.")
#define MEMO_X_HAS_NO_NEW_MEMOS _("%s has no new memos.")
#define BOT_DOES_NOT_EXIST _("Bot \002%s\002 does not exist.")
#define BOT_NOT_ASSIGNED _("You must assign a bot to the channel before using this command.")
#define BOT_NOT_ON_CHANNEL _("Bot is not on channel \002%s\002.")
#define HOST_SET_ERROR _("A vHost must be in the format of a valid hostname.")
#define HOST_SET_IDENT_ERROR _("A vHost ident must be in the format of a valid ident.")
#define HOST_SET_TOOLONG _("Error! The vHost is too long, please use a hostname shorter than %d characters.")
#define HOST_SET_IDENTTOOLONG _("Error! The vHost ident is too long, please use an ident shorter than %d characters.")
#define HOST_NOT_ASSIGNED _("Please contact an Operator to get a vHost assigned to this nick.")
#define HOST_NO_VIDENT _("Your IRCd does not support vIdent's, if this is incorrect, please report this as a possible bug")
#define HOST_SET_ERROR _("A vhost must be in the format of a valid hostname.")
#define HOST_SET_IDENT_ERROR _("A vident must be in the format of a valid ident.")
#define HOST_SET_TOOLONG _("Error! The vhost is too long, please use a hostname shorter than %zu characters.")
#define HOST_SET_IDENTTOOLONG _("Error! The vident is too long, please use an ident shorter than %zu characters.")
#define HOST_NOT_ASSIGNED _("Please contact an Operator to get a vhost assigned to this nick.")
#define HOST_NO_VIDENT _("Your IRCd does not support vidents. If this is incorrect please report this as a possible bug.")
+3 -3
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -60,7 +60,7 @@ public:
/** This class handles formatting LIST/VIEW replies.
*/
class CoreExport ListFormatter
class CoreExport ListFormatter final
{
public:
typedef std::map<Anope::string, Anope::string> ListEntry;
@@ -78,7 +78,7 @@ public:
/** This class handles formatting INFO replies
*/
class CoreExport InfoFormatter
class CoreExport InfoFormatter final
{
NickCore *nc;
std::vector<std::pair<Anope::string, Anope::string> > replies;
+4 -4
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -37,7 +37,7 @@ enum LogType
LOG_DEBUG_4
};
struct LogFile
struct LogFile final
{
Anope::string filename;
std::ofstream stream;
@@ -48,7 +48,7 @@ struct LogFile
};
/* Represents a single log message */
class CoreExport Log
class CoreExport Log final
{
public:
/* Bot that should log this message */
@@ -109,7 +109,7 @@ public:
};
/* Configured in the configuration file, actually does the message logging */
class CoreExport LogInfo
class CoreExport LogInfo final
{
public:
BotInfo *bot = nullptr;
+4 -3
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -22,9 +22,11 @@ namespace Mail
extern CoreExport bool Validate(const Anope::string &email);
/* A email message being sent */
class Message : public Thread
class Message final
: public Thread
{
private:
Anope::string error;
Anope::string sendmail_path;
Anope::string send_from;
Anope::string mail_to;
@@ -34,7 +36,6 @@ namespace Mail
Anope::string content_type;
bool dont_quote_addresses;
bool success = false;
public:
/** Construct this message. Once constructed call Thread::Start to launch the mail sending.
* @param sf Config->SendFrom
+13 -7
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -14,18 +14,24 @@
#include "anope.h"
#include "serialize.h"
class CoreExport Memo : public Serializable
class CoreExport Memo final
: public Serializable
{
public:
struct Type final
: public Serialize::Type
{
Type();
void Serialize(Serializable *obj, Serialize::Data &data) const override;
Serializable *Unserialize(Serializable *obj, Serialize::Data &data) const override;
};
MemoInfo *mi;
bool unread;
bool receipt;
Memo();
~Memo();
void Serialize(Serialize::Data &data) const override;
static Serializable* Unserialize(Serializable *obj, Serialize::Data &);
Anope::string owner;
/* When it was sent */
time_t time;
@@ -36,11 +42,11 @@ public:
/* Memo info structures. Since both nicknames and channels can have memos,
* we encapsulate memo data in a MemoInfo to make it easier to handle.
*/
struct CoreExport MemoInfo
struct CoreExport MemoInfo final
{
int16_t memomax = 0;
Serialize::Checker<std::vector<Memo *> > memos;
std::vector<Anope::string> ignores;
std::set<Anope::string, ci::less> ignores;
MemoInfo();
Memo *GetMemo(unsigned index) const;
+67 -39
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -21,37 +21,49 @@
namespace Message
{
struct CoreExport Away : IRCDMessage
struct CoreExport Away
: IRCDMessage
{
Away(Module *creator, const Anope::string &mname = "AWAY") : IRCDMessage(creator, mname, 0) { SetFlag(IRCDMESSAGE_REQUIRE_USER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Away(Module *creator, const Anope::string &mname = "AWAY") : IRCDMessage(creator, mname, 0) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Capab : IRCDMessage
struct CoreExport Capab
: IRCDMessage
{
Capab(Module *creator, const Anope::string &mname = "CAPAB") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Capab(Module *creator, const Anope::string &mname = "CAPAB") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Error : IRCDMessage
struct CoreExport Error
: IRCDMessage
{
Error(Module *creator, const Anope::string &mname = "ERROR") : IRCDMessage(creator, mname, 1) { }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Invite : IRCDMessage
struct CoreExport Ignore final
: IRCDMessage
{
Invite(Module *creator, const Anope::string &mname = "INVITE") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_REQUIRE_USER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Ignore(Module *creator, const Anope::string &mname);
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Invite
: IRCDMessage
{
Invite(Module *creator, const Anope::string &mname = "INVITE") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Join : IRCDMessage
struct CoreExport Join
: IRCDMessage
{
Join(Module *creator, const Anope::string &mname = "JOIN") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Join(Module *creator, const Anope::string &mname = "JOIN") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
@@ -61,113 +73,129 @@ namespace Message
* @param source The source of the SJOIN
* @param chan The channel the users are joining to
* @param ts The TS for the channel
* @param modes The modes sent with the SJOIN, if any
* @param modes The mode letters sent with the SJOIN, if any
* @param modeparams The mode parameters sent with the SJOIN, if any
* @param users The users and their status, if any
*/
static void SJoin(MessageSource &source, const Anope::string &chan, time_t ts, const Anope::string &modes, const std::list<SJoinUser> &users);
static void SJoin(MessageSource &source, const Anope::string &chan, time_t ts, const Anope::string &modes, const std::vector<Anope::string> &modeparams, const std::list<SJoinUser> &users);
};
struct CoreExport Kick : IRCDMessage
struct CoreExport Kick
: IRCDMessage
{
Kick(Module *creator, const Anope::string &mname = "KICK") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Kick(Module *creator, const Anope::string &mname = "KICK") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Kill : IRCDMessage
struct CoreExport Kill
: IRCDMessage
{
Kill(Module *creator, const Anope::string &mname = "KILL") : IRCDMessage(creator, mname, 2) { }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Mode : IRCDMessage
struct CoreExport Mode
: IRCDMessage
{
Mode(Module *creator, const Anope::string &mname = "MODE") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Mode(Module *creator, const Anope::string &mname = "MODE") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport MOTD : IRCDMessage
struct CoreExport MOTD
: IRCDMessage
{
MOTD(Module *creator, const Anope::string &mname = "MOTD") : IRCDMessage(creator, mname, 1) { }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Notice : IRCDMessage
struct CoreExport Notice
: IRCDMessage
{
Notice(Module *creator, const Anope::string &mname = "NOTICE") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_REQUIRE_USER); }
Notice(Module *creator, const Anope::string &mname = "NOTICE") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Part : IRCDMessage
struct CoreExport Part
: IRCDMessage
{
Part(Module *creator, const Anope::string &mname = "PART") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Part(Module *creator, const Anope::string &mname = "PART") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Ping : IRCDMessage
struct CoreExport Ping
: IRCDMessage
{
Ping(Module *creator, const Anope::string &mname = "PING") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Ping(Module *creator, const Anope::string &mname = "PING") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Privmsg : IRCDMessage
struct CoreExport Privmsg
: IRCDMessage
{
Privmsg(Module *creator, const Anope::string &mname = "PRIVMSG") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_REQUIRE_USER); }
Privmsg(Module *creator, const Anope::string &mname = "PRIVMSG") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Quit : IRCDMessage
struct CoreExport Quit
: IRCDMessage
{
Quit(Module *creator, const Anope::string &mname = "QUIT") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); }
Quit(Module *creator, const Anope::string &mname = "QUIT") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport SQuit : IRCDMessage
struct CoreExport SQuit
: IRCDMessage
{
SQuit(Module *creator, const Anope::string &mname = "SQUIT") : IRCDMessage(creator, mname, 2) { }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Stats : IRCDMessage
struct CoreExport Stats
: IRCDMessage
{
Stats(Module *creator, const Anope::string &mname = "STATS") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Stats(Module *creator, const Anope::string &mname = "STATS") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_REQUIRE_USER); SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Time : IRCDMessage
struct CoreExport Time
: IRCDMessage
{
Time(Module *creator, const Anope::string &mname = "TIME") : IRCDMessage(creator, mname, 0) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Time(Module *creator, const Anope::string &mname = "TIME") : IRCDMessage(creator, mname, 0) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Topic : IRCDMessage
struct CoreExport Topic
: IRCDMessage
{
Topic(Module *creator, const Anope::string &mname = "TOPIC") : IRCDMessage(creator, mname, 2) { SetFlag(IRCDMESSAGE_REQUIRE_USER); }
Topic(Module *creator, const Anope::string &mname = "TOPIC") : IRCDMessage(creator, mname, 2) { SetFlag(FLAG_REQUIRE_USER); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Version : IRCDMessage
struct CoreExport Version
: IRCDMessage
{
Version(Module *creator, const Anope::string &mname = "VERSION") : IRCDMessage(creator, mname, 0) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Version(Module *creator, const Anope::string &mname = "VERSION") : IRCDMessage(creator, mname, 0) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
struct CoreExport Whois : IRCDMessage
struct CoreExport Whois
: IRCDMessage
{
Whois(Module *creator, const Anope::string &mname = "WHOIS") : IRCDMessage(creator, mname, 1) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
Whois(Module *creator, const Anope::string &mname = "WHOIS") : IRCDMessage(creator, mname, 1) { SetFlag(FLAG_SOFT_LIMIT); }
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override;
};
+55 -24
View File
@@ -1,7 +1,7 @@
/* Mode support
*
* (C) 2008-2011 Adam <Adam@anope.org>
* (C) 2008-2023 Anope Team <team@anope.org>
* (C) 2008-2025 Anope Team <team@anope.org>
*
* Please read COPYING and README for further details.
*/
@@ -33,9 +33,24 @@ enum ModeClass
MC_USER
};
struct ModeData final
{
Anope::string value;
Anope::string set_by;
time_t set_at;
ModeData(const Anope::string &v = "", const Anope::string &s = "", time_t t = 0)
: value(v)
, set_by(s)
, set_at(t)
{
}
};
/** This class is the basis of all modes in Anope
*/
class CoreExport Mode : public Base
class CoreExport Mode
: public Base
{
public:
/* Mode name */
@@ -64,7 +79,8 @@ public:
/** This class is a user mode, all user modes use this/inherit from this
*/
class CoreExport UserMode : public Mode
class CoreExport UserMode
: public Mode
{
public:
/** constructor
@@ -74,7 +90,8 @@ public:
UserMode(const Anope::string &name, char mc);
};
class CoreExport UserModeParam : public UserMode
class CoreExport UserModeParam
: public UserMode
{
public:
/** constructor
@@ -92,7 +109,8 @@ public:
/** This class is a channel mode, all channel modes use this/inherit from this
*/
class CoreExport ChannelMode : public Mode
class CoreExport ChannelMode
: public Mode
{
public:
/* channel modes that can possibly unwrap this mode */
@@ -123,7 +141,8 @@ public:
/** This is a mode for lists, eg b/e/I. These modes should inherit from this
*/
class CoreExport ChannelModeList : public ChannelMode
class CoreExport ChannelModeList
: public ChannelMode
{
public:
/** constructor
@@ -161,7 +180,8 @@ public:
/** This is a mode with a parameter, eg +k/l. These modes should use/inherit from this
*/
class CoreExport ChannelModeParam : public ChannelMode
class CoreExport ChannelModeParam
: public ChannelMode
{
public:
/** constructor
@@ -183,7 +203,8 @@ public:
/** This is a mode that is a channel status, eg +v/h/o/a/q.
*/
class CoreExport ChannelModeStatus : public ChannelMode
class CoreExport ChannelModeStatus
: public ChannelMode
{
public:
/* The symbol, eg @ % + */
@@ -206,11 +227,15 @@ public:
* but we still have a representation for it.
*/
template<typename T>
class CoreExport ChannelModeVirtual : public T
class CoreExport ChannelModeVirtual
: public T
{
Anope::string base;
private:
ChannelMode *basech;
protected:
Anope::string base;
public:
ChannelModeVirtual(const Anope::string &mname, const Anope::string &basename);
@@ -224,7 +249,7 @@ public:
};
/* The status a user has on a channel (+v, +h, +o) etc */
class CoreExport ChannelStatus
class CoreExport ChannelStatus final
{
Anope::string modes;
public:
@@ -239,7 +264,8 @@ public:
Anope::string BuildModePrefixList() const;
};
class CoreExport UserModeOperOnly : public UserMode
class CoreExport UserModeOperOnly
: public UserMode
{
public:
UserModeOperOnly(const Anope::string &mname, char um) : UserMode(mname, um) { }
@@ -247,7 +273,8 @@ public:
bool CanSet(User *u) const override;
};
class CoreExport UserModeNoone : public UserMode
class CoreExport UserModeNoone
: public UserMode
{
public:
UserModeNoone(const Anope::string &mname, char um) : UserMode(mname, um) { }
@@ -257,7 +284,8 @@ public:
/** Channel mode +k (key)
*/
class CoreExport ChannelModeKey : public ChannelModeParam
class CoreExport ChannelModeKey
: public ChannelModeParam
{
public:
ChannelModeKey(char mc) : ChannelModeParam("KEY", mc) { }
@@ -267,7 +295,8 @@ public:
/** This class is used for oper only channel modes
*/
class CoreExport ChannelModeOperOnly : public ChannelMode
class CoreExport ChannelModeOperOnly
: public ChannelMode
{
public:
ChannelModeOperOnly(const Anope::string &mname, char mc) : ChannelMode(mname, mc) { }
@@ -278,7 +307,8 @@ public:
/** This class is used for channel modes only servers may set
*/
class CoreExport ChannelModeNoone : public ChannelMode
class CoreExport ChannelModeNoone
: public ChannelMode
{
public:
ChannelModeNoone(const Anope::string &mname, char mc) : ChannelMode(mname, mc) { }
@@ -292,9 +322,10 @@ public:
* This also contains a mode stacker that will combine multiple modes and set
* them on a channel or user at once
*/
class CoreExport ModeManager
class CoreExport ModeManager final
{
public:
using Change = std::multimap<Mode *, std::pair<bool, ModeData>>;
/* Number of generic channel and user modes we are tracking */
static unsigned GenericChannelModes;
@@ -362,18 +393,18 @@ public:
* @param c The channel
* @param cm The channel mode
* @param set true for setting, false for removing
* @param param The param, if there is one
* @param data Data about the mode.
*/
static void StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool set, const Anope::string &param = "");
static void StackerAdd(BotInfo *bi, Channel *c, ChannelMode *cm, bool set, const ModeData &data = {});
/** Add a mode to the stacker to be set on a user
* @param bi The client to set the modes from
* @param u The user
* @param um The user mode
* @param set true for setting, false for removing
* @param param The param, if there is one
* @param data Data about the mode.
*/
static void StackerAdd(BotInfo *bi, User *u, UserMode *um, bool set, const Anope::string &param = "");
static void StackerAdd(BotInfo *bi, User *u, UserMode *um, bool set, const ModeData &data = {});
/** Process all of the modes in the stacker and send them to the IRCd to be set on channels/users
*/
@@ -388,7 +419,7 @@ public:
/** Represents a mask set on a channel (b/e/I)
*/
class CoreExport Entry
class CoreExport Entry final
{
Anope::string name;
Anope::string mask;
@@ -406,9 +437,9 @@ public:
/** Get the banned mask for this entry
* @return The mask
*/
const Anope::string GetMask() const;
Anope::string GetMask() const;
const Anope::string GetNUHMask() const;
Anope::string GetNUHMask() const;
/** Check if this entry matches a user
* @param u The user
+5 -5
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -45,7 +45,7 @@
#include "users.h"
#include "xline.h"
#include "modules/pseudoclients/chanserv.h"
#include "modules/pseudoclients/global.h"
#include "modules/pseudoclients/memoserv.h"
#include "modules/pseudoclients/nickserv.h"
#include "modules/chanserv/service.h"
#include "modules/global/service.h"
#include "modules/memoserv/service.h"
#include "modules/nickserv/service.h"
+268 -171
View File
File diff suppressed because it is too large Load Diff
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -46,13 +46,13 @@ struct BadWords
* @param type The type (SINGLE START END)
* @return The badword
*/
virtual BadWord* AddBadWord(const Anope::string &word, BadWordType type) = 0;
virtual BadWord *AddBadWord(const Anope::string &word, BadWordType type) = 0;
/** Get a badword structure by index
* @param index The index
* @return The badword
*/
virtual BadWord* GetBadWord(unsigned index) const = 0;
virtual BadWord *GetBadWord(unsigned index) const = 0;
/** Get how many badwords are on this channel
* @return The number of badwords in the vector
@@ -1,6 +1,6 @@
/* BotServ core functions
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -20,7 +20,8 @@ protected:
EntryMsg() = default;
};
struct EntryMessageList : Serialize::Checker<std::vector<EntryMsg *> >
struct EntryMessageList
: Serialize::Checker<std::vector<EntryMsg *> >
{
protected:
EntryMessageList() : Serialize::Checker<std::vector<EntryMsg *> >("EntryMsg") { }
@@ -32,5 +33,5 @@ public:
delete (*this)->at(i - 1);
}
virtual EntryMsg* Create() = 0;
virtual EntryMsg *Create() = 0;
};
@@ -1,6 +1,6 @@
/* ChanServ core functions
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -29,7 +29,8 @@ protected:
LogSetting() = default;
};
struct LogSettings : Serialize::Checker<std::vector<LogSetting *> >
struct LogSettings
: Serialize::Checker<std::vector<LogSetting *> >
{
typedef std::vector<LogSetting *>::iterator iterator;
@@ -1,6 +1,6 @@
/* ChanServ core functions
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -8,7 +8,8 @@
#pragma once
class ChanServService : public Service
class ChanServService
: public Service
{
public:
ChanServService(Module *m) : Service(m, "ChanServService", "ChanServ")
+18 -8
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -79,7 +79,7 @@ namespace DNS
Question(const Anope::string &n, QueryType t, unsigned short c = 1) : name(n), type(t), qclass(c) { }
inline bool operator==(const Question & other) const { return name == other.name && type == other.type && qclass == other.qclass; }
struct hash
struct hash final
{
size_t operator()(const Question &q) const
{
@@ -88,7 +88,8 @@ namespace DNS
};
};
struct ResourceRecord : Question
struct ResourceRecord final
: Question
{
unsigned int ttl = 0;
Anope::string rdata;
@@ -113,7 +114,8 @@ namespace DNS
/** DNS manager
*/
class Manager : public Service
class Manager
: public Service
{
public:
Manager(Module *creator) : Service(creator, "DNS::Manager", "dns/manager") { }
@@ -131,7 +133,9 @@ namespace DNS
/** A DNS query.
*/
class Request : public Timer, public Question
class Request
: public Timer
, public Question
{
Manager *manager;
public:
@@ -142,8 +146,14 @@ namespace DNS
/* Creator of this request */
Module *creator;
Request(Manager *mgr, Module *c, const Anope::string &addr, QueryType qt, bool cache = false) : Timer(0), Question(addr, qt), manager(mgr),
use_cache(cache), creator(c) { }
Request(Manager *mgr, Module *c, const Anope::string &addr, QueryType qt, bool cache = false)
: Timer(0)
, Question(addr, qt)
, manager(mgr)
, use_cache(cache)
, creator(c)
{
}
virtual ~Request()
{
@@ -163,7 +173,7 @@ namespace DNS
/** Used to time out the query, xalls OnError and lets the TimerManager
* delete this request.
*/
void Tick(time_t) override
void Tick() override
{
Log(LOG_DEBUG_2) << "Resolver: timeout for query " << this->name;
Query rr(*this);
+120 -10
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -13,25 +13,135 @@
namespace Encryption
{
typedef std::pair<const unsigned char *, size_t> Hash;
typedef std::pair<const uint32_t *, size_t> IV;
/** Base class for encryption contexts. */
class Context
{
public:
virtual ~Context() = default;
/** Updates the encryption context with the specified data.
* @param str The data to update the context with.
*/
inline void Update(const Anope::string &str)
{
Update(reinterpret_cast<const unsigned char *>(str.c_str()), str.length());
}
/** Updates the encryption context with the specified data.
* @param data The data to update the context with.
* @param len The length of the data.
*/
virtual void Update(const unsigned char *data, size_t len) = 0;
virtual void Finalize() = 0;
virtual Hash GetFinalizedHash() = 0;
/** Finalises the encryption context and returns the digest. */
virtual Anope::string Finalize() = 0;
};
class Provider : public Service
/** Provider of encryption contexts. */
class Provider
: public Service
{
public:
Provider(Module *creator, const Anope::string &sname) : Service(creator, "Encryption::Provider", sname) { }
/** The byte size of the block cipher. */
const size_t block_size;
/** The byte size of the resulting digest. */
const size_t digest_size;
/** Creates a provider of encryption contexts.
* @param creator The module that created this provider.
* @param algorithm The name of the encryption algorithm.
* @param bs The byte size of the block cipher.
* @param ds The byte size of the resulting digest.
*/
Provider(Module *creator, const Anope::string &algorithm, size_t bs, size_t ds)
: Service(creator, "Encryption::Provider", algorithm)
, block_size(bs)
, digest_size(ds)
{
}
virtual ~Provider() = default;
virtual Context *CreateContext(IV * = NULL) = 0;
virtual IV GetDefaultIV() = 0;
/** Checks whether a plain text value matches a hash created by this provider. */
virtual bool Compare(const Anope::string &hash, const Anope::string &plain)
{
return !hash.empty() && hash.equals_cs(ToPrintable(Encrypt(plain)));
}
/** Called on initialising a encryption provider to check it works properly. */
void Check(const Anope::map<Anope::string> &checks)
{
for (const auto &[hash, plain] : checks)
{
if (!Compare(hash, plain))
throw ModuleException("BUG: unable to generate " + this->name + " hashes safely! Please report this!");
}
Log(LOG_DEBUG) << "The " << this->name << " encryption provider appears to be working correctly.";
}
/** Creates a new encryption context. */
virtual std::unique_ptr<Context> CreateContext() = 0;
/** Quickly encrypts the specified values and returns the digest. */
template<typename... Args>
Anope::string Encrypt(Args &&...args)
{
auto context = CreateContext();
context->Update(std::forward<Args>(args)...);
return context->Finalize();
}
/** Calculates the RFC 2104 hash-based message authentication code for the specified data. */
inline Anope::string HMAC(const Anope::string &key, const Anope::string &data)
{
if (!block_size)
return {};
auto keybuf = key.length() > block_size ? Encrypt(key) : key;
keybuf.resize(block_size);
Anope::string hmac1;
Anope::string hmac2;
for (size_t i = 0; i < block_size; ++i)
{
hmac1.push_back(static_cast<char>(keybuf[i] ^ 0x5C));
hmac2.push_back(static_cast<char>(keybuf[i] ^ 0x36));
}
hmac2.append(data);
hmac1.append(Encrypt(hmac2));
return Encrypt(hmac1);
}
/** Converts a hash to its printable form. */
virtual Anope::string ToPrintable(const Anope::string &hash)
{
return Anope::Hex(hash);
}
};
/** Helper template for creating simple providers of encryption contexts. */
template <typename T>
class SimpleProvider final
: public Provider
{
public:
/** Creates a simple provider of encryption contexts.
* @param creator The module that created this provider.
* @param algorithm The name of the encryption algorithm.
* @param bs The byte size of the block cipher.
* @param ds The byte size of the resulting digest.
*/
SimpleProvider(Module *creator, const Anope::string &algorithm, size_t bs, size_t ds)
: Provider(creator, algorithm, bs, ds)
{
}
/** @copydoc Encryption::Provider::CreateContext. */
std::unique_ptr<Context> CreateContext() override
{
return std::make_unique<T>();
}
};
}
+75
View File
@@ -0,0 +1,75 @@
/*
*
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*/
#pragma once
#define GLOBAL_NO_MESSAGE _("You do not have any messages queued and did not specify a message to send.")
#define GLOBAL_QUEUE_CONFLICT _("You can not send a single message while you have messages queued.")
class GlobalService
: public Service
{
public:
GlobalService(Module *m)
: Service(m, "GlobalService", "Global")
{
}
/** Retrieves the bot which sends global messages unless otherwise specified. */
virtual Reference<BotInfo> GetDefaultSender() const = 0;
/** Clears any queued messages for the specified account.
* @param nc The account to clear queued messages for.
*/
virtual void ClearQueue(NickCore *nc) = 0;
/** Retrieves the size of the messages queue for the specified user.
* @param nc The account to count queued messages for.
*/
inline size_t CountQueue(NickCore* nc) const
{
auto *q = GetQueue(nc);
return q ? q->size() : 0;
}
/** Retrieves the messages queue for the specified user.
* @param nc The account to retrieve queued messages for.
*/
virtual const std::vector<Anope::string> *GetQueue(NickCore* nc) const = 0;
/** Queues a message to be sent later.
* @param nc The account to queue the message for.
* @param message The message to queue.
* @return The new number of messages in the queue.
*/
virtual size_t Queue(NickCore *nc, const Anope::string &message) = 0;
/** Sends a single message to all users on the network.
* @param message The message to send.
* @param source If non-nullptr then the source of the message.
* @param sender If non-nullptr then the bot to send the message from.
* @param server If non-nullptr then the server to send messages to.
* @return If the message was sent then true; otherwise, false.
*/
virtual bool SendSingle(const Anope::string &message, CommandSource *source = nullptr, BotInfo *sender = nullptr, Server *server = nullptr) = 0;
/** Sends a message queue to all users on the network.
* @param source The source of the message.
* @param sender If non-nullptr then the bot to send the message from.
* @param server If non-nullptr then the server to send messages to.
* @return If the message queue was sent then true; otherwise, false.
*/
virtual bool SendQueue(CommandSource &source, BotInfo *sender = nullptr, Server *server = nullptr) = 0;
/** Unqueues a message from the message queue.
* @param nc The account to unqueue the message from.
* @param idx The index of the item to remove.
* @return Whether the message was removed from the queue.
*/
virtual bool Unqueue(NickCore *nc, size_t idx) = 0;
};
+23
View File
@@ -0,0 +1,23 @@
/*
*
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*/
#pragma once
class HostRequest
{
protected:
HostRequest() = default;
public:
Anope::string nick;
Anope::string ident;
Anope::string host;
time_t time = 0;
virtual ~HostRequest() = default;
};
+68 -37
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2012-2023 Anope Team
* (C) 2012-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -8,28 +8,39 @@
#pragma once
enum HTTPError
namespace HTTP
{
HTTP_ERROR_OK = 200,
HTTP_FOUND = 302,
HTTP_BAD_REQUEST = 400,
HTTP_PAGE_NOT_FOUND = 404,
HTTP_NOT_SUPPORTED = 505
};
struct Reply;
struct Message;
class Page;
class Client;
class Provider;
enum Error
{
OK = 200,
FOUND = 302,
BAD_REQUEST = 400,
PAGE_NOT_FOUND = 404,
NOT_SUPPORTED = 505,
};
}
/* A message to someone */
struct HTTPReply
struct HTTP::Reply final
{
HTTPError error = HTTP_ERROR_OK;
HTTP::Error error = HTTP::OK;
Anope::string content_type;
std::map<Anope::string, Anope::string, ci::less> headers;
typedef std::list<std::pair<Anope::string, Anope::string> > cookie;
std::vector<cookie> cookies;
HTTPReply() = default;
HTTPReply& operator=(const HTTPReply &) = default;
Reply() = default;
Reply &operator=(const HTTP::Reply &) = default;
HTTPReply(const HTTPReply& other) : error(other.error), length(other.length)
Reply(const HTTP::Reply &other)
: error(other.error)
, length(other.length)
{
content_type = other.content_type;
headers = other.headers;
@@ -39,14 +50,14 @@ struct HTTPReply
out.push_back(new Data(datum->buf, datum->len));
}
~HTTPReply()
~Reply()
{
for (const auto *datum : out)
delete datum;
out.clear();
}
struct Data
struct Data final
{
char *buf;
size_t len;
@@ -81,25 +92,27 @@ struct HTTPReply
};
/* A message from someone */
struct HTTPMessage
struct HTTP::Message final
{
std::map<Anope::string, Anope::string> headers;
std::map<Anope::string, Anope::string> cookies;
std::map<Anope::string, Anope::string> get_data;
std::map<Anope::string, Anope::string> post_data;
std::map<Anope::string, Anope::string, ci::less> headers;
std::map<Anope::string, Anope::string, ci::less> cookies;
std::map<Anope::string, Anope::string, ci::less> get_data;
std::map<Anope::string, Anope::string, ci::less> post_data;
Anope::string content;
};
class HTTPClient;
class HTTPProvider;
class HTTPPage : public virtual Base
class HTTP::Page
: public virtual Base
{
Anope::string url;
Anope::string content_type;
public:
HTTPPage(const Anope::string &u, const Anope::string &ct = "text/html") : url(u), content_type(ct) { }
Page(const Anope::string &u, const Anope::string &ct = "text/html")
: url(u)
, content_type(ct)
{
}
const Anope::string &GetURL() const { return this->url; }
@@ -112,10 +125,13 @@ public:
* @param The HTTP header sent from the client to request the page
* @param The HTTP header that will be sent back to the client
*/
virtual bool OnRequest(HTTPProvider *, const Anope::string &, HTTPClient *, HTTPMessage &, HTTPReply &) = 0;
virtual bool OnRequest(HTTP::Provider *, const Anope::string &, HTTP::Client *, HTTP::Message &, HTTP::Reply &) = 0;
};
class HTTPClient : public ClientSocket, public BinarySocket, public Base
class HTTP::Client
: public ClientSocket
, public BinarySocket
, public Base
{
protected:
void WriteClient(const Anope::string &message)
@@ -124,18 +140,26 @@ protected:
}
public:
HTTPClient(ListenSocket *l, int f, const sockaddrs &a) : ClientSocket(l, a), BinarySocket() { }
Client(ListenSocket *l, int f, const sockaddrs &a)
: ClientSocket(l, a)
, BinarySocket()
{
}
virtual const Anope::string GetIP()
{
return this->clientaddr.addr();
}
virtual void SendError(HTTPError err, const Anope::string &msg) = 0;
virtual void SendReply(HTTPReply *) = 0;
virtual void SendError(HTTP::Error err, const Anope::string &msg) = 0;
virtual void SendReply(HTTP::Reply *) = 0;
};
class HTTPProvider : public ListenSocket, public Service
#define HTTP_PROVIDER "HTTP::Provider"
class HTTP::Provider
: public ListenSocket
, public Service
{
Anope::string ip;
unsigned short port;
@@ -144,7 +168,14 @@ public:
std::vector<Anope::string> ext_ips;
std::vector<Anope::string> ext_headers;
HTTPProvider(Module *c, const Anope::string &n, const Anope::string &i, const unsigned short p, bool s) : ListenSocket(i, p, i.find(':') != Anope::string::npos), Service(c, "HTTPProvider", n), ip(i), port(p), ssl(s) { }
Provider(Module *c, const Anope::string &n, const Anope::string &i, const unsigned short p, bool s)
: ListenSocket(i, p, i.find(':') != Anope::string::npos)
, Service(c, HTTP_PROVIDER, n)
, ip(i)
, port(p)
, ssl(s)
{
}
const Anope::string &GetIP() const
{
@@ -161,12 +192,12 @@ public:
return this->ssl;
}
virtual bool RegisterPage(HTTPPage *page) = 0;
virtual void UnregisterPage(HTTPPage *page) = 0;
virtual HTTPPage* FindPage(const Anope::string &name) = 0;
virtual bool RegisterPage(HTTP::Page *page) = 0;
virtual void UnregisterPage(HTTP::Page *page) = 0;
virtual HTTP::Page *FindPage(const Anope::string &name) = 0;
};
namespace HTTPUtils
namespace HTTP
{
inline Anope::string URLDecode(const Anope::string &url)
{
@@ -174,7 +205,7 @@ namespace HTTPUtils
for (unsigned i = 0; i < url.length(); ++i)
{
const char& c = url[i];
const char &c = url[i];
if (c == '%' && i + 2 < url.length())
{
+49
View File
@@ -0,0 +1,49 @@
/*
*
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*/
#pragma once
class OperInfo
{
protected:
OperInfo() = default;
OperInfo(const Anope::string &t, const Anope::string &i, const Anope::string &a, time_t c)
: target(t)
, info(i)
, adder(a)
, created(c)
{
}
public:
Anope::string target;
Anope::string info;
Anope::string adder;
time_t created = 0;
virtual ~OperInfo() = default;
};
class OperInfoList
: public Serialize::Checker<std::vector<OperInfo *>>
{
public:
OperInfoList()
: Serialize::Checker<std::vector<OperInfo *>>("OperInfo")
{
}
virtual ~OperInfoList()
{
for (auto *info : *(*this))
delete info;
}
virtual OperInfo *Create() = 0;
};
+8 -6
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -8,7 +8,7 @@
#pragma once
class LDAPException : public ModuleException
class DllExport LDAPException : public ModuleException
{
public:
LDAPException(const Anope::string &reason) : ModuleException(reason) { }
@@ -16,7 +16,7 @@ public:
virtual ~LDAPException() noexcept = default;
};
struct LDAPModification
struct LDAPModification final
{
enum LDAPOperation
{
@@ -31,7 +31,8 @@ struct LDAPModification
};
typedef std::vector<LDAPModification> LDAPMods;
struct LDAPAttributes : public std::map<Anope::string, std::vector<Anope::string> >
struct LDAPAttributes final
: public std::map<Anope::string, std::vector<Anope::string>>
{
size_t size(const Anope::string &attr) const
{
@@ -74,7 +75,7 @@ enum QueryType
QUERY_MODIFY
};
struct LDAPResult
struct LDAPResult final
{
std::vector<LDAPAttributes> messages;
Anope::string error;
@@ -122,7 +123,8 @@ public:
virtual void OnDelete() { }
};
class LDAPProvider : public Service
class LDAPProvider
: public Service
{
public:
LDAPProvider(Module *c, const Anope::string &n) : Service(c, "LDAPProvider", n) { }
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -8,7 +8,8 @@
#pragma once
class MemoServService : public Service
class MemoServService
: public Service
{
public:
enum MemoResult
@@ -1,6 +1,6 @@
/* NickServ core functions
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -54,6 +54,15 @@ public:
*/
virtual void EraseCert(const Anope::string &entry) = 0;
/** Replaces a fingerprint in the nick's certificate list
*
* @param oldentry The old fingerprint to remove
* @param newentry The new fingerprint to add
*
* Replaces the specified fingerprint in the cert list.
*/
virtual void ReplaceCert(const Anope::string &oldentry, const Anope::string &newentry) = 0;
/** Clears the entire nick's cert list
*
* Deletes all the memory allocated in the certificate list vector and then clears the vector.
@@ -63,10 +72,12 @@ public:
virtual void Check() = 0;
};
class CertService : public Service
class CertService
: public Service
{
public:
CertService(Module *c) : Service(c, "CertService", "certs") { }
virtual NickCore* FindAccountFromCert(const Anope::string &cert) = 0;
virtual NickCore *FindAccountFromCert(const Anope::string &cert) = 0;
virtual void ReplaceCert(const Anope::string &oldcert, const Anope::string &newcert) = 0;
};
+195
View File
@@ -0,0 +1,195 @@
/*
*
* (C) 2014-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*/
#pragma once
namespace SASL
{
class Mechanism;
struct Message;
class ProtocolInterface;
struct Service;
struct Session;
/** The SASL interface implemented by the protocol modules. */
static ServiceReference<SASL::ProtocolInterface> protocol_interface("SASL::ProtocolInterface", "sasl");
/** The SASL interface implemented by ns_sasl. */
static ServiceReference<SASL::Service> service("SASL::Service", "sasl");
}
/** Represents a single SASL message. */
struct SASL::Message final
{
/** The source UID or name. */
Anope::string source;
/** The target UID or name. */
Anope::string target;
/** The type of message. */
Anope::string type;
/** One or more data parameters. */
std::vector<Anope::string> data;
};
/** Sends IRCd messages used by the SASL module. */
class SASL::ProtocolInterface
: public ::Service
{
protected:
ProtocolInterface(Module *o)
: ::Service(o, "SASL::ProtocolInterface", "sasl")
{
}
public:
/** Sends the list of SASL mechanisms to the IRCd
* @param mechs The list of SASL mechanisms.
*/
virtual void SendSASLMechanisms(std::vector<Anope::string> &mechs) { };
/** Sends a SASL message to the IRCd.
* @param message The SASL message to send.
*/
virtual void SendSASLMessage(const SASL::Message &message) = 0;
/** Sends a login or logout for \p uid to \p na.
* @param uid The uid of the user to log in.
* @param na The nick alias to log the user in as or logout if nullptr.
*/
virtual void SendSVSLogin(const Anope::string &uid, NickAlias *na) = 0;
};
/** SASL service interface. */
struct SASL::Service
: ::Service
{
Service(Module *o)
: ::Service(o, "SASL::Service", "sasl")
{
}
virtual void DeleteSessions(Mechanism *mech, bool da = false) = 0;
/** Fails a SASL session. This notifies the client and increments the
* failed attempt counter which may kill the client if the bad password
* limit has been reached.
*
* @param sess The session to fail.
*/
virtual void Fail(Session *sess) = 0;
/** Retrieves the session for the specified user identifier. */
virtual Session *GetSession(const Anope::string &uid) = 0;
/** Processes a SASL authentication message from the uplink.
* @param m The message to process.
*/
virtual void ProcessMessage(const Message &m) = 0;
/** Removes the specified SASL session from the service.
* @param sess The session to remove.
*/
virtual void RemoveSession(Session *sess) = 0;
/** Sends a SASL message for the specified session.
* @param type The type of message to send.
* @param data The contents of the SASL message.
*/
virtual void SendMessage(SASL::Session *sess, const Anope::string &type, const Anope::string &data) = 0;
/** Completes a successful authentication.
* @param sess The session which finished authentication.
* @param nc The account which has been logged into.
*/
virtual void Succeed(Session *sess, NickCore *nc) = 0;
};
/** Represents a single SASL session. */
struct SASL::Session
{
/** The time at which the session was created. */
const time_t created;
/** The hostname and IP address of the authenticating user. */
Anope::string hostname, ip;
/** A reference to the mechanism that the session is authenticating using. */
Reference<Mechanism> mech;
/** The unique identifier of the authenticating user. */
const Anope::string uid;
/** Creates a new authentication session.
* @param m The mechanism that the session is authenticating with.
* @param u The unique identifier of the authenticating user.
*/
Session(Mechanism *m, const Anope::string &u)
: created(Anope::CurTime)
, mech(m)
, uid(u)
{
}
virtual ~Session()
{
if (service)
service->RemoveSession(this);
}
/** Retrieves a description of the user this session is associated with. */
inline Anope::string GetUserInfo()
{
auto *u = User::Find(uid);
if (u)
return u->GetMask();
if (!hostname.empty() && !ip.empty())
return Anope::printf("%s (%s)", hostname.c_str(), ip.c_str());
return "A user";
};
};
/* Represents an authentication mechanism. */
class SASL::Mechanism
: public ::Service
{
protected:
/** Creates a new authentication mechanism.
* @param o The module that owns this instance.
* @param sname The name of the authentication mechanism (e.g. PLAIN).
*/
Mechanism(Module *o, const Anope::string &sname)
: Service(o, "SASL::Mechanism", sname)
{
}
public:
virtual ~Mechanism()
{
if (service)
service->DeleteSessions(this, true);
}
/** Creates a new SASL session.
* @param uid The unique identifier of the authenticating user.
*/
virtual Session *CreateSession(const Anope::string &uid)
{
return new Session(this, uid);
}
/** Processes an authentication message from the authenticating user.
* @param session The session for which the message applies.
* @param m The message sent by the user.
* @return True if the message was processed successfully or false if
* the session should be aborted.
*/
virtual bool ProcessMessage(Session *sess, const Message &m) = 0;
};
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -8,7 +8,8 @@
#pragma once
class NickServService : public Service
class NickServService
: public Service
{
public:
NickServService(Module *m) : Service(m, "NickServService", "NickServ")
@@ -18,4 +19,5 @@ public:
virtual void Validate(User *u) = 0;
virtual void Collide(User *u, NickAlias *na) = 0;
virtual void Release(NickAlias *na) = 0;
virtual bool IsGuestNick(const Anope::string &nick) const = 0;
};
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -31,7 +31,8 @@ protected:
ForbidData() = default;
};
class ForbidService : public Service
class ForbidService
: public Service
{
public:
ForbidService(Module *m) : Service(m, "ForbidService", "forbid") { }
@@ -40,7 +41,7 @@ public:
virtual void RemoveForbid(ForbidData *d) = 0;
virtual ForbidData* CreateForbid() = 0;
virtual ForbidData *CreateForbid() = 0;
virtual ForbidData *FindForbid(const Anope::string &mask, ForbidType type) = 0;
@@ -1,6 +1,6 @@
/* OperServ ignore interface
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -23,7 +23,8 @@ protected:
IgnoreData() = default;
};
class IgnoreService : public Service
class IgnoreService
: public Service
{
protected:
IgnoreService(Module *c) : Service(c, "IgnoreService", "ignore") { }
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -15,14 +15,8 @@ enum NewsType
NEWS_OPER
};
struct NewsMessages
{
NewsType type;
Anope::string name;
const char *msgs[10];
};
struct NewsItem : Serializable
struct NewsItem
: Serializable
{
NewsType type;
Anope::string text;
@@ -32,7 +26,8 @@ struct NewsItem : Serializable
NewsItem() : Serializable("NewsItem") { }
};
class NewsService : public Service
class NewsService
: public Service
{
public:
NewsService(Module *m) : Service(m, "NewsService", "news") { }
+16
View File
@@ -0,0 +1,16 @@
/*
*
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*/
#pragma once
struct MyOper final
: Oper
, Serializable
{
MyOper(const Anope::string &n, OperType *o) : Oper(n, o), Serializable("Oper") { }
};
@@ -1,6 +1,6 @@
/*
*
* (C) 2011-2023 Anope Team
* (C) 2011-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -8,7 +8,7 @@
#pragma once
struct Session
struct Session final
{
cidr addr; /* A cidr (sockaddrs + len) representing this session */
unsigned count = 1; /* Number of clients with this host */
@@ -17,7 +17,8 @@ struct Session
Session(const sockaddrs &ip, int len) : addr(ip, len) { }
};
struct Exception : Serializable
struct Exception final
: Serializable
{
Anope::string mask; /* Hosts to which this exception applies */
unsigned limit; /* Session limit for exception */
@@ -27,11 +28,10 @@ struct Exception : Serializable
time_t expires; /* Time when it expires. 0 == no expiry */
Exception() : Serializable("Exception") { }
void Serialize(Serialize::Data &data) const override;
static Serializable* Unserialize(Serializable *obj, Serialize::Data &data);
};
class SessionService : public Service
class SessionService
: public Service
{
public:
typedef std::unordered_map<cidr, Session *, cidr::hash> SessionMap;
@@ -57,35 +57,3 @@ public:
};
static ServiceReference<SessionService> session_service("SessionService", "session");
void Exception::Serialize(Serialize::Data &data) const
{
data["mask"] << this->mask;
data["limit"] << this->limit;
data["who"] << this->who;
data["reason"] << this->reason;
data["time"] << this->time;
data["expires"] << this->expires;
}
Serializable* Exception::Unserialize(Serializable *obj, Serialize::Data &data)
{
if (!session_service)
return NULL;
Exception *ex;
if (obj)
ex = anope_dynamic_static_cast<Exception *>(obj);
else
ex = new Exception;
data["mask"] >> ex->mask;
data["limit"] >> ex->limit;
data["who"] >> ex->who;
data["reason"] >> ex->reason;
data["time"] >> ex->time;
data["expires"] >> ex->expires;
if (!obj)
session_service->AddException(ex);
return ex;
}
-27
View File
@@ -1,27 +0,0 @@
/*
*
* (C) 2011-2023 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*/
#pragma once
class GlobalService : public Service
{
public:
GlobalService(Module *m) : Service(m, "GlobalService", "Global")
{
}
/** Retrieves the bot which sends global messages unless otherwise specified. */
virtual Reference<BotInfo> GetDefaultSender() = 0;
/** Send out a global message to all users
* @param sender Our client which should send the global
* @param source The sender of the global
* @param message The message
*/
virtual void SendGlobal(BotInfo *sender, const Anope::string &source, const Anope::string &message) = 0;
};
+4 -3
View File
@@ -1,6 +1,6 @@
/*
*
* (C) 2003-2023 Anope Team
* (C) 2003-2025 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
@@ -10,7 +10,7 @@
namespace Redis
{
struct Reply
struct Reply final
{
enum Type
{
@@ -55,7 +55,8 @@ namespace Redis
virtual void OnError(const Anope::string &error) { Log(owner) << error; }
};
class Provider : public Service
class Provider
: public Service
{
public:
Provider(Module *c, const Anope::string &n) : Service(c, "Redis::Provider", n) { }

Some files were not shown because too many files have changed in this diff Show More