Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8500fef
Allow importing custom Atheme metadata to {cs,ns}_set_misc.
sadiepowell Feb 19, 2026
4549678
Add more configuration options to {cs,ns}_set_misc.
sadiepowell Feb 19, 2026
66f5312
Add support for disabling automatic login.
sadiepowell Feb 22, 2026
f380b27
Move fingerprints to their own table.
sadiepowell Feb 22, 2026
f91cf17
Fix db_json restoring the object identifier when unserialising.
sadiepowell Feb 24, 2026
3244eef
Update the change log.
sadiepowell Feb 24, 2026
7aeac28
Rewrite the Windows install docs to reflect how it works now.
sadiepowell Feb 24, 2026
538b2cf
Refactor the logic in ns_cert.
sadiepowell Feb 24, 2026
d0c2bae
Add a type for wrapping examples instead of using manual linewraps.
sadiepowell Feb 24, 2026
8062d01
Rework the output of nickserv/list.
sadiepowell Feb 24, 2026
aa41fff
Remove some obsolete InspIRCd compatibility code.
sadiepowell Feb 24, 2026
a01cd48
Send the clock synchronisation TS token on UnrealIRCd.
sadiepowell Feb 24, 2026
5db1a57
Fix handling incoming FIDENT messages on InspIRCd.
sadiepowell Feb 25, 2026
da723d5
Fix the missing command blocks for nickserv/{sa,}set/autologin.
sadiepowell Feb 25, 2026
d77fd4b
Update the change log.
sadiepowell Feb 25, 2026
3ea5b07
Fix some minor typos in the change log.
sadiepowell Feb 25, 2026
6c86cd1
Add a default command help implementation.
sadiepowell Feb 25, 2026
a02b81f
Fix iterating the status mode list while unsetting modes.
sadiepowell Feb 25, 2026
9409560
Tweak the layout and ergonomics the ExampleWrapper class.
sadiepowell Feb 25, 2026
decbab5
Fix translating examples.
sadiepowell Feb 25, 2026
0df341f
Fix echoing tags on Solanum.
sadiepowell Feb 25, 2026
95fc992
Update the mailmap.
sadiepowell Feb 26, 2026
1ffeb85
Allow mkauthors to omit users that don't want to be included.
sadiepowell Feb 26, 2026
be6a454
Update author list.
sadiepowell Feb 26, 2026
2ca5045
Update the change log.
sadiepowell Feb 28, 2026
f912e30
Disable autologin by default in the example configs.
sadiepowell Mar 1, 2026
99f7ea8
Clarify the purpose of the autologin option in the change log.
sadiepowell Mar 1, 2026
dde9113
Fix erroneously repeating the command name in the example wrapper.
sadiepowell Mar 1, 2026
e961498
Release 2.1.22.
sadiepowell Mar 1, 2026
1fc58c7
Bump for 2.1.23-git.
sadiepowell Mar 1, 2026
1563577
Update the Romanian translation.
KidProtect Mar 1, 2026
9870305
Bump actions/upload-artifact from 6 to 7
dependabot[bot] Mar 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ jobs:

- name: Upload artifact
if: "${{ github.event_name != 'release' }}"
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: windows-installer
path: ${{ github.workspace }}\build\\anope-*.exe
1 change: 0 additions & 1 deletion .mailmap
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ Daniel Engel <dane@zero.org> <dane dane@31f1291d-b8d6-0310-a050-a5561fc1590b@541
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>
Expand Down
28 changes: 28 additions & 0 deletions data/anope.example.conf
Original file line number Diff line number Diff line change
Expand Up @@ -1084,6 +1084,34 @@ mail
* The file that db_atheme will import your main database from.
*/
database = "atheme.db"

/*
* If you have custom data in your Atheme database that you want converted
* to Anope misc data to be shown with cs_set_misc you can configure that
* using one or more cs_set_misc blocks.
*/
#cs_set_misc
{
/* The key name used by Atheme. */
atheme = "private:misc:data"

/* The cs_set_misc entry to import into. */
anope = "MISC_DATA"
}

/*
* If you have custom data in your Atheme database that you want converted
* to Anope misc data to be shown with ns_set_misc you can configure that
* using one or more ns_set_misc blocks.
*/
#ns_set_misc
{
/* The key name used by Atheme. */
atheme = "private:misc:data"

/* The ns_set_misc entry to import into. */
anope = "MISC_DATA"
}
}

/*
Expand Down
18 changes: 14 additions & 4 deletions data/chanserv.example.conf
Original file line number Diff line number Diff line change
Expand Up @@ -1264,12 +1264,22 @@ command { service = "ChanServ"; name = "SET SUCCESSOR"; command = "chanserv/set/
*
* Provides the command chanserv/set/misc.
*
* Allows you to create arbitrary commands to set data, and have that data show up in chanserv/info.
* A field named misc_description may be given for use with help output.
* Allows you to create arbitrary commands to set data, and have that data show
* up in chanserv/info. You can configure this using the following fields:
*
* misc_description: A description of the command to show in the help.
* misc_title: A human-readable description of the stored data.
* misc_numeric: If defined then the numeric (in the range 1-999) to send the
* data to users with when they join the channel.
* misc_pattern: If defined then a regex pattern (using the engine specified
* in <options:regexengine> to validate the data with).
* misc_syntax: If defined then the syntax to show in the help output and, if
* misc_pattern is defined, when a user specifies an invalid
* value.
*/
module { name = "cs_set_misc" }
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") }
command { service = "ChanServ"; name = "SET URL"; command = "chanserv/set/misc"; misc_description = _("Associate a URL with the channel"); misc_numeric = 328; misc_pattern = "^https?:\/\/\S+$" }
#command { service = "ChanServ"; name = "SET EMAIL"; command = "chanserv/set/misc"; misc_description = _("Associate an email address with the channel"); misc_pattern = "^\S+@\S.\S+$"; misc_title = _("Email address") }

/*
* cs_status
Expand Down
25 changes: 20 additions & 5 deletions data/nickserv.example.conf
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ module
* - memo_signon: Notify user if they have a new memo when they sign into the nick
* - memo_receive: Notify user if they have a new memo as soon as it's received
* - memo_mail: Notify user if they have a new memo by mail
* - autologin: User will be automatically logged in when they connect with a known SSL cert.
* - 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
Expand Down Expand Up @@ -335,6 +336,9 @@ module
max = 5
}
command { service = "NickServ"; name = "CERT"; command = "nickserv/cert" }
command { service = "NickServ"; name = "SET AUTOLOGIN"; command = "nickserv/set/autologin" }
command { service = "NickServ"; name = "SASET AUTOLOGIN"; command = "nickserv/saset/autologin"; permission = "nickserv/saset/autologin" }


/*
* ns_confirm
Expand Down Expand Up @@ -732,15 +736,26 @@ command { service = "NickServ"; name = "SASET LAYOUT"; command = "nickserv/saset
*
* Provides the command nickserv/set/misc.
*
* Allows you to create arbitrary commands to set data, and have that data show up in nickserv/info.
* A field named misc_description may be given for use with help output.
* Allows you to create arbitrary commands to set data, and have that data show
* up in nickserv/info. You can configure this using the following fields:
*
* misc_description: A description of the command to show in the help.
* misc_title: A human-readable description of the stored data.
* misc_pattern: If defined then a regex pattern (using the engine specified
* in <options:regexengine> to validate the data with).
* misc_syntax: If defined then the syntax to show in the help output and, if
* misc_pattern is defined, when a user specifies an invalid
* value.
* misc_swhois: Whether to also show the data in the WHOIS output of logged
* in users. Requires that your IRCd supports multiple swhois
entries.
*/
module { name = "ns_set_misc" }
command { service = "NickServ"; name = "SET URL"; command = "nickserv/set/misc"; misc_description = _("Associate a URL with your account") }
command { service = "NickServ"; name = "SET URL"; command = "nickserv/set/misc"; misc_description = _("Associate a URL with your account"); misc_pattern = "^https?:\/\/\S+$"; misc_swhois = yes }
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 MASTODON"; command = "nickserv/set/misc"; misc_description = _("Associate a Mastodon account with your account") }
#command { service = "NickServ"; name = "SET MASTODON"; command = "nickserv/set/misc"; misc_description = _("Associate a Mastodon account with your account"); misc_pattern = "^@\S+@\S+\.\S+$"; misc_title = _("Mastodon") }
#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 LOCATION"; command = "nickserv/set/misc"; misc_description = _("Associate a location with your account") }
#command { service = "NickServ"; name = "SET LOCATION"; command = "nickserv/set/misc"; misc_description = _("Associate a location with your account"); misc_title = _("Location") }
#command { service = "NickServ"; name = "SASET LOCATION"; command = "nickserv/saset/misc"; misc_description = _("Associate a location with this account"); permission = "nickserv/saset/location"; group = "nickserv/admin" }

/*
Expand Down
2 changes: 1 addition & 1 deletion docs/AUTHORS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ contributions they have made, are:
* 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>
Expand All @@ -39,6 +38,7 @@ contributions they have made, are:
* Federico G. Schwindt <fgsch@lodoss.net>
* Alexander Barton <alex@barton.de>
* Cronus <cronus@nite-serv.com>
* Dragone2 <dragone2@risposteinformatiche.it>
* H7-25 <simos@simosnap.org>
* Jyzee <jyzee.git@gmail.com>
* Sebastian Barfurth <github@afreshmelon.com>
Expand Down
71 changes: 69 additions & 2 deletions docs/CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,81 @@
# Anope Change Log

## Anope 2.1.22 (unreleased)
## Anope 2.1.22 (2026-03-01)

### Breaking Changes

* Automatic login using a known SSL fingerprint now requires the `AUTOLOGIN` option to be set on accounts with `/NS SET AUTOLOGIN ON`. Automatic login is largely obsolete now SASL EXTERNAL exists and is widely supported.

* Conan 2 is now used for packaging dependencies on Windows. If you are building from source you will need to upgrade Conan.

* Non-breaking spaces in translatable messages now use 0x1B instead of 0x1A due to recent msgfmt releases treating 0x1A as an EOF character. If you have an out of tree translation you will need to update it.

## Changes
* User TLS certificates are now stored in their own `NSCert` table instead of as a column in the `NickCore` table. If you are reading this information you will need to update your code.

### Changes

* Fixed `{botserv}:botmodes` erroneously allowing setting non-status modes on channels.

* Fixed echoing message tags on Solanum.

* Fixed handling incoming `FIDENT` messages on InspIRCd.

* Fixed matching stacked extended bans on InspIRCd and UnrealIRCd.

* Fixed parameter modes in `chanserv/mode` locks erroneously requiring a parameter to unset a lock.

* Fixed restoring the object identifier when unserialising objects in db_json.

* Fixed the consistency of indenting and line wrapping command examples in help output.

* Redesigned the output of `nickserv/list` to show more relevant information.

```
/NICKSERV LIST *
-NickServ- List of entries matching *:
-NickServ- alice (account: alice)
-NickServ- alice|work (account: alice)
-NickServ- bob -- Unconfirmed (account: bob)
-NickServ- mallory -- Suspended (account: mallory)
-NickServ- End of list - 4/4 matches shown.
```

* The cs_set_misc and ns_set_misc modules now can use a separate title from the command name.

```
/NICKSERV SET MASTODON @example@mastodon.social
-NickServ- Mastodon for testuser set to @example@mastodon.social
```

* The cs_set_misc and ns_set_misc modules now support validation of user-specified data.

```
/NICKSERV SET MASTODON example.mastodon.social
-NickServ- Mastodon syntax is invalid.
-NickServ- Syntax: SET MASTODON [@user@host.tld]
```

* The db_atheme module can now import arbitrary metadata to fields from the ns_set_misc module.

* The local clock will now be checked for synchronisation with the IRCd clock on UnrealIRCd.

* The `nickserv/cert` command will now show the time a TLS certificate was created and the nickname of the creator if the `VIEW` subcommand is used.

```
/NICKSERV CERT VIEW
-NickServ- d41d8cd98f00b204e9800998ecf8427e -- created by nick1 at Wed 25 Feb 00:18:50 GMT
```

* The ns_set_misc module can now add account data to the WHOIS output of authenticated users on InspIRCd (with the swhois_ext module) and UnrealIRCd.

```
/WHOIS nick1
* [nick1] (nick1@example.com): nick1
* [nick1] Mastodon: @example@mastodon.social
* [nick1] irc.example.com :Example-IRC server
...
* [nick1] End of WHOIS list.
```

* The regex_posix module is now available on Windows (using the PCRE2 POSIX compatibility layer).

Expand Down
2 changes: 1 addition & 1 deletion docs/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ if(WIN32)
# Only install given files 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)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
set(DOCS CHANGES.md DEFCON FAQ INSTALL LANGUAGE MODULES ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.txt)
set(DOCS CHANGES.md DEFCON FAQ INSTALL LANGUAGE MODULES ${CMAKE_CURRENT_BINARY_DIR}/README.txt WIN32.md)
install(FILES ${DOCS}
DESTINATION ${DOC_DIR}
)
Expand Down
2 changes: 1 addition & 1 deletion docs/LANGUAGE
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Anope Multi Language Support

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
Building Anope on Windows with gettext support is explained in docs/WIN32.md

2) Adding a new language

Expand Down
57 changes: 57 additions & 0 deletions docs/WIN32.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Building Anope on Windows

## Dependencies

You will need the following software installed to build Anope:

* [CMake 3.20 or newer](https://cmake.org/download/#latest)
* [Conan 2 or newer](https://conan.io/downloads) (optional if you don't want to build extra modules)
* [NSIS 3 or newer](https://nsis.sourceforge.io/Download)
* [Visual Studio 2022 or newer](https://visualstudio.microsoft.com/downloads/) (*NOT* Visual Studio Code)

## Building

First you need to download the latest version of the Anope source code from [the releases page](https://github.com/anope/anope/releases) and unpack it using Windows Explorer.

---

Once you have the source code unpacked you need open the Command Prompt and move to the directory in which Anope has been unpacked. You can do this by pressing Control+R and then entering `cmd.exe` and pressing enter. Once the terminal opens you can move to the directory using the following command (assuming you unpacked to `C:\Users\Example\Downloads\anope-2.1`):

```cmd
cd C:\Users\Example\Downloads\anope-2.1
```

---

If you want to build with multiple-language support or want to use the enc_argon2, mysql, regex_pcre2, regex_posix, regex_tre, sqlite, or ssl_openssl extra modules you will now need to install the third-party dependencies using Conan. Before you can do this you need to create a Conan profile for C++17 using the following command:

```cmd
conan profile detect
notepad ~\.conan2\profiles\default
```

When Notepad opens you should find the line beginning with `compiler.cppstd=` and replace the entire line with `compiler.cppstd=17` and save the file.

Now you're ready to install the third-party dependencies using the following command:


```cmd
conan install .\src\win32 --build missing --deployer runtime_deploy --deployer-folder .\build\extradll --output-folder .
call .\conanbuild.bat
```

This will probably take a long time if its the first time you have run it.

---

Now you're ready to build Anope.

```cmd
cd .\build
cmake -A x64 -D "CMAKE_BUILD_TYPE=Release" -D "CMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake" ..
msbuild PACKAGE.vcxproj /P:Configuration=Release /P:Platform=x64 /VERBOSITY:MINIMAL
```

Once the build finishes the installer will be available in the build directory. You can install this by opening the directory in Windows Explorer and then running it as you would with most Windows installers.

Once installed Anope will be available at `C:\Program Files\Anope`.
Loading
Loading