Releases: PyLink/PyLink
PyLink 3.1-beta1
Feature changes
- PyLink now requires Python >= 3.7
- protocols/inspircd now defaults to InspIRCd 3.x mode (
target_version=insp3
) - Default to system IPv4/IPv6 preference when resolving hostnames. For existing users, this means that PyLink will most likely default to IPv6 when resolving hostnames if your server supports it!
- You can override this by setting
ipv6: false
in your server config block or using an explicitbindhost
. Connections made to IPs directly are not affected.
- You can override this by setting
- [SECURITY] exec and raw plugins are now locked behind config options, to disable running arbitrary code by admins
- Implement path configuration for PyLink data files (#659)
Bug fixes
- Various fixes detected by pylint, thanks to @Celelibi for reporting
- ircs2s_common: fix parsing clash if the sender's nick matches an IRC command (e.g. on UnrealIRCd)
- ircs2s_common: gracefully handle QUIT messages without a reason (seen on Anope / InspIRCd)
- Properly handle EAGAIN in non-blocking sockets
- relay: fix "channel not found" errors on LINK when the remote casemapping differs. This mainly affects channels with "|" and other RFC1459 special cases in their name
- unreal: bounce attempts to CHGIDENT/HOST/NAME services clients
- unreal: fix formatting of outgoing
/kill
(#671) - opercmds: remove double "Killed by" prefixes in the
kill
command
Internal improvements
PyLink 3.0.0
Changes since 3.0-rc1:
- Added new install instructions via Docker
- global: fix type-safety errors when connected to pylink-discord
- Various code cleanup
For a broader summary of changes since 2.0.x, consult the below release notes for PyLink 3.0-rc1.
PyLink 3.0-rc1
PyLink 3.0 brings PyLink up to date with the latest IRCds (InspIRCd 3, UnrealIRCd 5), and introduces Discord integration via the pylink-discord contrib module. It also improves support for Unicode nicks in Relay and Clientbot.
Major changes since PyLink 2.0.x
- Added support for InspIRCd 3 and UnrealIRCd 5.x:
- To enable InspIRCd 3 link mode (highly recommended) on InspIRCd 3 networks, set the
target_version: insp3
option in the relevant network'sserver
block. - For UnrealIRCd 5 support, no changes in PyLink are necessary.
- To enable InspIRCd 3 link mode (highly recommended) on InspIRCd 3 networks, set the
- Updated list of required dependencies: added cachetools, removed ircmatch and expiringdict
- Relay: added an optional dependency on unidecode, to translate Unicode nicks to ASCII on networks not supporting it.
- Also, nick normalization is now skipped on protocols where it is not necessary (Clientbot, Discord)
- Relay now tracks kill/mode/topic clashes and will stop relaying when it detects such a conflict (issue#23)
- Changehost now supports network-specific configuration (issue#611) and listening for services account changes - this allows for consistent account based hostmasks for SASL gateways, etc.
- Clientbot: added an option to continuously rejoin channels the bot is not in. issue#647
- Antispam: added optional quit/part message filtering (issue#617)
API changes
- API Break: Channel, Server, and User keys may now be type
int
- previously, they were always strings. - API Break: PyLink now supports having multiple UIDs mapping to the same nick, as this is common on platforms like Discord.
nick_to_uid()
has been reworked to optionally return multiple nicks whenmulti=True
- Using
nick_to_uid()
without this option will raise a warning if duplicate nicks are present, and may be deprecated in the future.
- Added
utils.match_text()
, a general (regex-based) glob matcher to replaceircmatch
calls (issue#636). - Editing hook payloads is now officially supported in plugin hook handlers (issue#452)
- Added new protocol module capabilities:
can-manage-bot-channels
freeform-nicks
has-irc-modes
virtual-server
- SQUIT hooks now track a list of affected servers (SIDs) in the
affected_servers
field
This branch was previously known as PyLink 2.1. For more detailed changes between 3.0-rc1 and individual 2.1 snapshots, see their separate changelogs.
Changes since PyLink 2.1-beta1
Feature changes
- Added a Dockerfile for PyLink, thanks to @jameswritescode. Official images will be available on Docker Hub before the final 3.0 release.
- unreal: declare support for usermodes +G (censor) and +Z (secureonlymsg)
- The
version
command now prints the Python interpreter version to assist with debugging
Bug fixes
- Fix desync when removing multiple ban modes in one MODE command (regression from 2.1-beta1)
- p10: properly ignore ACCOUNT subcommands other than R, M, and U
- Fix extraneous lowercasing of the network name in the
$account
exttarget, causing per-network matches to fail if the network name had capital letters - inspircd: negotiate casemapping setting on link for InspIRCd 3. issue#654
- ircs2s_common: fix crash when failing to extract KILL reason
Documentation changes
relay-quickstart
: describe delinking another network from channels owned by the caller's network- Refreshed mode list documentation
Internal improvements
- Debug logs for mode parsers and other miscellaneous internals are now less noisy
- inspircd: warn when using InspIRCd 2 compat mode on an InspIRCd 3 uplink - some commands like KICK are not translated correctly in this mode
- classes: fix
SyntaxWarning: "is" with a literal
on Python 3.8
PyLink 2.1-beta1
Feature changes
- Declare support for UnrealIRCd 5.0.0-rc2+. Since the S2S protocol has not changed significantly, no protocol changes are needed for this to work.
- UnrealIRCd 5.0.0-rc1 suffers from a message routing bug and is not supported.
- clientbot: added an option to continuously rejoin channels the bot is not in. issue#647
- changehost: added support for network-specific options. issue#611
- changehost: listen for services account changes - this allows for consistent account based hostmasks for SASL gateways, etc.
- relay_clientbot:
rpm
now deals with duplicate nicks and nicks including spaces (e.g. on Discord) - Relay now merges together network specific
clientbot_styles
options with global settings, instead of ignoring the latter if the network specific options are set. issue#642 - ts6: add support for hiding PyLink servers (
(H)
in server description) - commands: various improvements to the
showuser
command
Bug fixes
- More fixes for InspIRCd 3 support:
- Fix crash on receiving SVSTOPIC on InspIRCd 3
- Fix incorrect handling of PING to PyLink subservers - this caused harmless but confusing "high latency" warnings
- inspircd: revert change disallowing
_
in hosts; this has been enabled by default for quite some time - Fixed various edge cases in mode handling (+b-b ban cycles, casefolding mode arguments, etc.)
- automode: add better handling for protocols where setting IRC modes isn't possible
- automode: disable on networks where IRC modes aren't supported. issue#638
Internal improvements
- Added test cases for shared protocol code (mode parsers, state checks, etc.)
- Added more IRC parsing tests based off ircdocs/parser-tests
- Add
get_service_options
method to merge together global & local network options. issue#642 - Enhancements to UnrealIRCd protocol module:
- unreal: read supported user modes on link when available (UnrealIRCd 4.2.3 and later)
- unreal: stop sending NETINFO on link; this suppresses protocol version/network name mismatch warnings
- unreal: declare support for msgbypass and timedban extbans
- Added new protocol capabilities:
has-irc-modes
,can-manage-bot-channels
- relay: handle acting extbans for ban exceptions
+e
, which is supported by InspIRCd and UnrealIRCd
PyLink 2.0.3
Changes since 2.0.2:
Feature changes
- Switch to more secure password hashing defaults, using pbkdf2-sha256 as the default hash method
- Introduce a
login::cryptcontext_settings
option to further tweak passlib settings if desired
Bug fixes
- SECURITY: Only allow the defined
login:user
to take all permissions when legacy accounts are enabled - clientbot: fix /names handling on networks with colours in hostnames
- clientbot: fix crash when MODES is defined in ISUPPORT but given no value (affects connections to Oragono)
- changehost: only send a host change if new host != original
- relay: fix inconsistent handling of the hideoper setting. issue#629
- unreal: work around a potential race when sending kills on join
PyLink 2.1-alpha2
PyLink now requires Python 3.5 or later!
This release includes all changes from PyLink 2.0.3, plus the following:
Feature changes
- Added cachetools as a core runtime dependency (relay and servprotect)
- Added beta support for InspIRCd 3 (issue#644):
- The target IRCd version can be configured via a
target_version
server option, which supportsinsp20
(InspIRCd 2.0, default) andinsp3
.
- The target IRCd version can be configured via a
- Removed dependencies on ircmatch (issue#636) and expiringdict (issue#445)
- Increased Passlib requirement to 1.7.0+ to remove deprecated calls
- pylink-mkpasswd: use
hash()
instead ofencrypt()
- pylink-mkpasswd: use
- Relay updates:
- Relay now tracks kill/mode/topic clashes and will stop relaying when it detects such a conflict (issue#23)
- Skip nick normalization on protocols where they aren't actually required (Clientbot, Discord)
- Support
@servicenick
as a fantasy trigger prefix (useful on Discord) - commands: add a
shownet
command to show server info (issue#578) - antispam: added optional quit/part message filtering (issue#617)
Bug fixes
- SECURITY: only whitelist permissions for the defined
login:user
if a legacy account is enabled - clientbot: fix crash when
MODES
is defined in ISUPPORT without a value (affects connections to Oragono) - relay: fix KILL message formatting (regression from issue#520)
- relay: consistency fixes when handling hideoper mode changes (issue#629)
- exttargets: coerse services_account to string before matching (issue#639)
Internal improvements
- API Break: Reworked
PyLinkNetworkCore.nick_to_uid()
specification to support duplicate nicks and user filtering- Reworked most plugins (
commands
,bots
,opercmds
) to deal with duplicate nicks more robustly
- Reworked most plugins (
- Revised handling of KILL and QUIT hooks: the
userdata
argument is now always defined- If we receive both a KILL and a QUIT for any client, only the one received first will be sent as a hook.
- Added new protocol module capabilities:
freeform-nicks
,virtual-server
- Added
utils.match_text()
, a general glob matching function to replace ircmatch calls (issue#636) - Editing hook payloads is now officially supported in plugin hook handlers (issue#452)
- ClientbotWrapperProtocol: override
_get_UID()
to only return non-virtual clients, ensuring separate namespaces between internal and external clients. - ClientbotBaseProtocol: disallow
part()
from the main pseudoclient by default, as this may cause desyncs if not supported - Moved IRCv3 message tags parser from
clientbot
toircs2s_common
- Merged relay's
showchan
,showuser
commands into thecommands
plugin, for better tracking of errors and duplicate nicks
PyLink 2.1-alpha1
Released 2019-05-02. This release focuses on internal improvements to better integrate with pylink-discord. It includes all fixes from 2.0.2, plus the following:
Feature changes
- Various Relay improvements:
- Relay now sanitizes UTF-8 nicks and idents where not supported, optionally using the unidecode module to decode Unicode names more cleanly to ASCII
- This introduces a new option
relay::use_unidecode
which is enabled by default when the module is installed
- This introduces a new option
- The fallback character to replace invalid nick characters is now
-
instead of|
- Add protocol-level support for hiding users in Relay - this is used by pylink-discord to optionally hide invisible/offline users
- Relay now sanitizes UTF-8 nicks and idents where not supported, optionally using the unidecode module to decode Unicode names more cleanly to ASCII
- Decrease default log file size from 50 MiB to 20 MiB
Bug fixes
- changehost: only send a host change if new host != original
- This prevents duplicate host changes on InspIRCd, since it echoes back successful host changes
- clientbot: fix /names parsing errors on networks supporting colors in hosts. issue#641
- inspircd: disallow
_
in hosts since CHGHOST does not treat it as valid - relay: allow trailing .'s in subserver names (e.g.
relay.
is now an accepted server suffix) - stats: hide login blocks in
/stats O
when not relevant to the caller's network - unreal: work around a potential race when sending kills on join
Internal improvements
- log: use pylinkirc as logger name; this prevents other libraries' debug output from making it to the PyLink log by default
- clientbot: properly bounce kicks on networks not implementing them
- classes: remove channels, modes substitutions from
User.get_fields()
- various: type-safety fixes to support numeric channel, server, and user IDs (they were previously always strings)
- SQUIT hooks now track a list of affected servers (SIDs) in the
affected_servers
field - relay: minor optimizations
PyLink 2.0.2
Changes since 2.0.1:
Feature changes
- Antispam now supports filtering away Unicode lookalike characters when processing text
- Allow disabling dynamic channels via a new "join_empty_channels" option
- relay: add an explicit
forcetag
command, since IRC kills are now relayed between networks
Bug fixes
- launcher: fix crash when --no-pid is set
- relay: fix DB corruption when editing modedelta modes
- automode: fix sending joins to the wrong network when editing remote channels
Internal improvements
- relay: minor optimizations and cleanup
- Disable throttling on S2S links by default, since it usually isn't necessary there
PyLink 2.0.1
Changes since 2.0.0:
Feature changes
- Slashes (
/
) in hosts is now supported on UnrealIRCd. - Added an
ignore_ts_errors
server option to suppress bogus TS warnings.
Bug fixes
- clientbot: fix desync when the bot is told to kick itself (issue#377)
- launcher: fix PID files not being read if psutil isn't installed
- relay_clientbot no longer relays list modes set during a server burst (issue#627)
- Fixed stray "bogus TS 0" warnings on some UnrealIRCd mode commands
Internal improvements
- unreal: bump protocol version to 4200 (UnrealIRCd 4.2.0)
- unreal: use SJOIN in
join()
to work around non-deterministic TS when forwarding to other servers
PyLink 2.0.0
Changes since 2.0-rc1:
- Fixed various bugs affecting Relay and Clientbot:
- handlers: don't delete the PyLink service UID if it leaves all cahnnels
- Relay sometimes sent an empty channel to
kick()
when relaying kills to kick - Fix "Relay plugin unloaded" parts on Clientbot links causing a flood of "Clientbot was force parted" kicks
- setup.py: Work around TypeError in
distutils.util.rfc822_escape()
when installing on Python 3.4
For a broader summary of changes since 1.3.x, consult the release notes for PyLink 2.0-rc1.