This project is mirrored from https://git.sr.ht/~emersion/soju.
Pull mirroring failed .
Repository mirroring has been paused due to too many failed attempts. It can be resumed by a project maintainer or owner.
Last successful update .
Repository mirroring has been paused due to too many failed attempts. It can be resumed by a project maintainer or owner.
Last successful update .
-
v0.8.06d0f7330 · ·
soju v0.8.0 This release contains the following new features: - Support for a new file-upload IRC extension, to allow clients to upload files to the bouncer. The extension is disabled by default and requires an HTTP listener to be set up. - Unix domain sockets are now supported for HTTP and WebSocket listeners. - Round-robien DNS resolution is used when per-user IP addresses are set up, to better spread load for larger bouncer deployments. - Highlights are now ignored when they appear inside a URL. Full commit history below. Alex McGrath (1): fileupload: add CORS header fields Egor (1): Add unix domain socket listeners for HTTP and WS Henrique Dias (1): Upgrade to go-sqlite3 to fix musl build Moritz Poldrack (2): Fix crash on start when file-upload is disabled doc: add documentation for the file-upload key Simon Ser (43): doc/man: add note that memory message store is basic Add .b4-config contrib/certbot: new document contrib/tlstunnel: new document database: move schema into separate file contrib/certbot: set -eu in renewal hook server: fix malformed Web Push subscriber URI downstream: use fresh context to send timeout errors Add conn.Shutdown upstream: consoldate TCP dial into function config: use scfg unmarshaler Add https:// and http+insecure:// listeners cmd/soju: add withDefaultPort helper config: fix MaxUserNetworks default value service: don't send PART if not joined in "channel delete" doc/per-user-ip: fix subnet length in ip route command Upgrade dependencies doc/ext/bouncer-networks: drop work-in-progress disclaimer Add support for file uploads Add http-ingress config directive doc/ext/filehost: fix heading level downstream: fix FILEHOST endpoint fileupload: serve select MIME types as inline doc: note that file uploads require an HTTP listener config: validate http-origin patterns Upgrade dependencies Wire up server logger to testing package Ignore highlights in URLs fileupload: append ext to filename if missing fileupload: hardcode a few primary file extensions fileupload: URL-escape output filename upstream: use round-robin DNS resolution when per-user IPs are set up Upgrade dependencies upstream: fix conditional for resolveIPAddr auth/pam: upgrade to github.com/msteinert/pam v2 server: print error on getOrCreateUser failure fileupload: fix http-origin pattern matching upstream: fix panic on malformed RPL_CHANNELMODEIS downstream: shallow copy message in SendMessage instead of deep copy downstream: ensure numerics always carry a source prefix Drop unnecessary prefixes for numerics Drop source prefix from most non-numeric server messages Remove RLIMIT_NOFILE bump Tomasz Hołubowicz (1): contrib/clients: update information on ERC for Emacs delthas (1): Automatically join a stored channel on INVITE dubious (1): Upstream change for senpai jacob1 (2): Fix missing prefix on away numerics Include prefix in CAP messages again
-
v0.7.067f7d9aa · ·
soju v0.7.0 This is a smaller release, it contains small new features and bug fixes. - The new draft/pre-away extension allows short-lived and background clients (e.g. chathistorysync and Goguma's background worker) to not toggle the auto-away status. - The new draft/no-implicit-names extension allows clients with low bandwidth to connect faster (e.g. Goguma with 3G). - The contrib/migrate-db script is now a lot faster. - SASL ANONYMOUS is now supported to log out from an upstream network. - STATUSMSG messages are now properly routed. Full commit history below. Antonio Mika (1): Update user.go to not broadcast a push notification when generated from us Calvin Lee (4): fix empty CHATHISTORY TARGETS database: batch msg inserts contrib/migrate-db: use explicit src/dest network Fix saving `+draft/react` is msgstores Eric Mertens (7): Fix capability associated with account message-tag Don't drop RPL_LISTSTART - passthrough to downstream ERR_NOSUCHSERVER unqueues WHOIS Pass MODE and TOPIC through for unjoined channels Add support for STATUSMSG Forward complete MODE message to upstream when changing modes Only log unhandled messages in debug mode Simon Ser (62): downstream: set CLIENTTAGDENY=* when upstream is missing message-tags upstream: add forwardMsgByID upstream: forward ERR_NOSUCHNICK upstream: don't print "unhandled message" for registration errors downstream: return channel in cached WHO reply gitignore: add doc/sojuctl.1 user: fix dup upstream connections due to race user: unconditonally stop network in updateNetwork() downstream: return FAIL on unknown BOUNCER command before registration downstream: take irc.Message in handleCap Improve Server.Handle readability downstream: inline authenticate function user: fix upstream connections closed after 1 minute downstream: fix connection registration Stop setting *user in downstreamConn.register downstream: rename downstreamRegistration.password to pass downstream: add support for ANONYMOUS SASL auth downstream: error out if SASL PLAIN identity is specified upstream: introduce upstreamConn.forwardMessage downstream: pass context to SendMessage contrib/systemd: add AmbientCapabilities=CAP_NET_BIND_SERVICE doc/packaging: add section about binding to privileged ports database/sqlite: fix missing argument in DeleteUser Panic if isHighlight is called with empty nick Use database.GetNick in network.isHighlight service: reject params for commands that don't take any Rename Config.Log{Driver,Path} to MsgStore Add CHATHISTORY test downstream: fix nick in auth error message msgstore/znclog: fix panic on malformed input line msgstore/znclog: fix error message downstream: improve SASL error logging Upgrade dependencies server: add metric for goroutine panics Introduce soju.im/pre-away Replace soju.im/pre-away with draft/pre-away service: add a way to reset a network certfp Upgrade dependencies doc: expand on message store specificities doc: clarify that client suffixes are not required for chathistory doc: remove mention of dropped multi-upstream mode contrib/clients: drop mention of single-upstream mode Use * instead of nick in some numeric replies server: drop TODO about configurable vars Use downstreamConn.upstreamForCommand when handling user MODE Remove remnant comments about multi-upstream mode Don't send bouncer-networks updates for removed networks build: cleanup all man pages build: improve readability of Go -ldflags service: convert network certfp to lower-case doc: add openssl command to fetch server fingerprint go fmt database: add NewNetwork database: fix default value for Network.AutoAway database: add NewUser cmd/sojudb: use User.SetPassword contrib/znc-import: leave password empty by default database: drop unnecessary comment Upgrade dependencies upstream: use unspecified AWAY reason if possible conn: drop ErrClosed workaround for WebSocket Add support for draft/no-implicit-names delthas (1): Fix SEARCH queries with special characters on SQLite sentriz (1): database: use postgresQueryTimeout for PostgresDB StoreMessages
-
v0.6.11e99e08c · ·
soju v0.6.1 Simon Ser (14): downstream: set CLIENTTAGDENY=* when upstream is missing message-tags upstream: add forwardMsgByID upstream: forward ERR_NOSUCHNICK upstream: don't print "unhandled message" for registration errors downstream: return channel in cached WHO reply gitignore: add doc/sojuctl.1 user: fix dup upstream connections due to race user: unconditonally stop network in updateNetwork() downstream: return FAIL on unknown BOUNCER command before registration user: fix upstream connections closed after 1 minute downstream: error out if SASL PLAIN identity is specified database/sqlite: fix missing argument in DeleteUser Panic if isHighlight is called with empty nick Use database.GetNick in network.isHighlight
-
v0.6.0f2b6d086 · ·
soju v0.6.0 Note to packagers: a new document (docs/packaging.md) has been added to explain how soju should be integrated in distributions. This release contains many changes around the build process and installation. Highlights for this release: - A new database message store has been introduced. Instead of being stored in plain-text files, messages can be stored in the database. This is useful for improved performance, full-text search, and retaining IRCv3 message tags. - The old sojuctl has been renamed to sojudb. The new sojuctl is a tool which executes service commands on a running soju instance. An admin Unix socket is used for this purpose and needs to be enabled in the configuration file. - External authentication has been added. This can be used to integrate with an OAuth 2.0 server or PAM. - New service commands: "channel delete" is a more convenient way to get rid of channels saved but not joined, "user run" executes command as another user, "user status" to list registered users - Users can be disabled to not use any runtime resource while keeping their on-disk data intact. There are new configuration options to automatically disable inactive users after a delay and re-enable inactive users on authentication. - WHO information is now cached, reducing latency and mitigating rate limits when multiple clients are connected. - TLS certificate pinning for upstream servers has been implemented. This can be useful to connect to servers with a self-signed certificate. - Auto-away can now be disabled. - Multi-upstream mode has been completely removed. The multi-upstream-mode configuration option has been dropped. - Go 1.19 is now the minimum required Go version. Full commit history below. Enterprisey (1): contrib/clients: Warn about Hexchat password limit Kirill Primak (1): service: update "user {create,update}" help Sandra Snan (1): Be more clear that -connect-command needs quotes Simon Ser (100): config: use structs to group DB/MsgAuth database/sqlite: make optional Upgrade dependencies downstream: don't echo back SASL mechanism downstream: fix CHATHISTORY LATEST without a bound downstream: remove outdated Web Push TODO server: close queued up connections on shutdown server: log when waiting for user goroutines on shutdown downstream: refuse to enable multi-upstream mode downstream: drop downstreamConn.isMultiUpstream downstream: drop downstreamConn.unmarshalText downstream: drop downstreamConn.marshalUserPrefix downstream: drop downstreamConn.marshalMessage downstream: drop downstreamConn.marshalEntity upstream: remove heuristic to marshal nick in errors upstream: use forEachDownstreamByID to forward RPL_AWAY irc: drop needMarshaling from applyChannelModes return values doc: drop multi-upstream mode bits config: drop multi-upstream-mode downstream: drop downstreamConn.unmarshalEntity{,Network} downstream: stop sending HTTP OPTIONS request on WEBPUSH REGISTER Use ratified extended-monitor cap name Use ratified extended-monitor cap name for needAllDownstreamCaps contrib/clients: reference read_marker.py for Weechat Upgrade to gopkg.in/irc.v4 Upgrade dependencies Add WHO cache downstream: check channel name validity on JOIN downstream: use ERR_BADCHANMASK for invalid channel name service: add channel delete command service: send PART in channel delete service: fix typo in network -cerfp flag name doc: document command parsing rules for the service downstream: set empty CHANTYPES for bouncer connection doc: add "user run" to man page service: drop unnecessary admin check in handleUserRun database/sqlite: introduce sqliteTime type database: store user creation date user: take context in user.stop Add a flag to disable users service: indicate which users are disabled in "user status" Add user downstream interaction time Add disable-inactive-user config option Add enable-user-on-auth config directive service: add -disable-password Use database.User.SetPassword in server tests Add infrastructure for external authentication Add support for external OAuth 2.0 authentication Add support for SASL OAUTHBEARER Auto-create users after external auth when enable-user-on-auth is on Add support for PAM authentication config: add missing "pam" case downstream: only send CHATHISTORY ISUPPORT when supported Add a default path for the config file build: add sharedstatedir variable build: add RUNDIR variable build: don't record DESTDIR in config.DefaultPath build: invoke `go build` once only Drop permissions on Unix admin socket database/postgres: fix nil time errors downstream: send MSGREFTYPES ISUPPORT msgstore: move ZNC log functions to separate package Rate limit Web Push checks readme: merge paragraphs about GOFLAGS doc/packaging: new page Bump minimum Go version to 1.19 Drop isErrClosed Remove legacy Go build comments identd: reference RFC identd: use UNKNOWN for OS name Silence "Web Push subscription expired" errors Move authError to auth package upstream: drop unnecessary casemapIsSet field upstream: convert ISUPPORT tokens to upper-case downstream: reset map with correct casemapping on MONITOR C upstream: drop unnecessary network nil check Drop unused partialCasemap() helper Add downstreamConn.updateCasemapping() Pass-through ISUPPORT CASEMAPPING Use generics for casemapMap Migrate case-mapping to xirc Rename casemapMap.setCasemapping to setCaseMapping Take case-mapping as param in newCasemapMap() Migrate casemapMap to xirc xirc: drop CaseMappingNone xirc: improve CaseMapping docs service: use database.User.SetPassword instead of bcrypt Introduce UserUpdateFunc downstream: fix nickCM out-of-sync with effective case-mapping downstream: fix nil pointer deref in downstreamConn.setUser Move DefaultUnixAdminPath to config package doc: add man page for sojuctl makefile: add variable with command list Set User-Agent when sending Web Push notifications Prune old Web Push subscriptions Bump update time on success in network.broadcastWebPush Simplify push subscription pruning logic database/sqlite: delete push subscriptions and msgstore in DeleteUser downstream: fix panic due to nil user in setUser doc/packaging: clarify and expand delthas (19): Truncate message times to the second when using the FS message store Fix clearing webpush targets after any MARKREAD Avoid sending push notifications for all channel context messages Store only select TAGMSG types in message stores service: reject commands with unexpected arguments service: refactor downstreamConn to serviceContext service: add user run service: add user status xirc: Fix sending hostnames starting with ':' in WHO replies service: Store the admin capability independently the user service: Enable running service commands without users service: Enable running additional commands from a global context service: Return the error rather than printing it sojuctl: rename to sojudb Add administrative unix listen endpoint Listen on the default unix admin endpoint in the default configuration Add cmd/sojuctl Add a database store for messages Add support for explicit PostgreSQL schema prefixes for tests palm93 (2): gitignore: add sojudb build: fix binaries not being built rj1 (1): Implement TLS fingerprint pinning sentriz (1): database/postgres: fix StoreNetwork positional arguments zsrv (1): Make the auto-away functionality configurable Łukasz Margiela (1): Add build tag for modernc/sqlite driver Дамјан Георгиевски (1): add an example systemd service file
-
v0.5.2aee65cd2 · ·
soju v0.5.2 Ember Sawady (2): Fix NICK on upstreams supporting MONITOR Fix labeled-response without downstream echo-message Jeff Martin (1): server: fix panic stacktrace print formatting Petr Ročkai (1): downstream: fix inverted range in CHATHISTORY LATEST with a timestamp Reto Brunner (1): Use output given to NewLogger Simon Ser (8): downstream: re-format doc comment with Go 1.19 style upstream: add timeout for pending commands Downgrade Web Push urgency for unimportant messages Broadcast Web Push subscriptions in a new goroutine downstream: break findWebPushSubscription in two functions downstream: add hard limit on Web Push subscriptions go fmt Pass-through ISUPPORT LINELEN
-
v0.5.1ce19f766 · ·
soju v0.5.1 This bugfix release addresses issues in the PostgreSQL database backend. Simon Ser (5): database/postgres: fix inverted network and user in StoreWebPushSubscription database/postgres: make WebPushSubscription.user NOT NULL database/postgres: set max open conns database/postgres: fix inverted networkID check in StoreWebPushSubscription database/postgres: fix inverted networkID check in ListWebPushSubscriptions
-
v0.5.0f37aedea · ·
soju v0.5.0 Highlights for this release: - Add support for soju.im/webpush for push notification support on mobile platforms. - Add support for soju.im/search to query message stores. - Add support for draft/read-marker to synchronize read markers between clients of the same user. - Add support for chghost, echo-message and @+draft/channel-context - Allow users to delete their own account. - Multi-upstream mode now requires a "/*" suffix to be added to the username to be enabled. Note, multi-upstream mode will be dropped in a future version. Full commit history below. Brett Cornwall (1): doc/getting-started: Fix simple misspelling. Frank Steinborn (1): contrib/clients: Add information about irssi Simon Ser (119): downstream: drop delivery receipts when client supports chathistory upstream: use network case-mapping in updateMonitor downstream: set case-mapping for monitored Mark BouncerServ as online in MONITOR, don't forward to upstream irc: introduce capRegistry Use capRegistry for downstreamConn Use capRegistry for upstreamConn downstream: atomically ack/nak capabilities service: limit number of -connect-command flags Warn about non-FQDN hostnames doc/soju.1: recommend using a FQDN for the hostname downstream: improve ERR_ERRONEUSNICKNAME message a bit Enable bot mode for BouncerServ downstream: ignore nickname during connection registration downstream: move multi-upstream name handling to loadNetwork downstream: reject negative or zero network IDs in parseBouncerNetID downstream: process BOUNCER BIND in downstreamConn.welcome downstream: improve grouping of downstreamConn fields downstream: move negotiatingCaps to downstreamRegistration downstream: explain when downstreamConn.sasl is nil Add support for RPL_VISIBLEHOST doc/soju.1: fix syntax error Add support for chghost downstream: rejigger hostname logic in newDOwnstreamConn downstream: always populate downstreamConn.username Ensure all incoming messages have a prefix set downstream: copy message when degrading extended-join downstream: strip back "*" prefix Add the soju.im/no-implicit-names extension Remove unnecessary zero initialization upstream: don't populate time tag for numerics downstream: clarify "user not active" error message downstream: send RPL_ENDOFWHO on unmarshalEntity error doc: split off multi-upstream documentation contrib/clients: senpai now supports soju.im/bouncer-networks doc/getting-started: add paragraph about client names doc/getting-started: mention TLS and on-disk logs Allow nil network in Get{Nick,Username,Realname} downstream: set realname for network-less connections Use SETNAME when updating user-wide realname downstream: update user realname on SETNAME Refuse to change nick on bouncer connection Simplify and improve WHOIS forwarding server: print panic stack trace as string upstream: use labeled-response for queued commands Queue WHOIS commands Remove unnecessary lastDownstreamID initialization upstream: pass context to upstreamConn.requestCaps downstream: unify PRIVMSG/NOTICE and TAGMSG codepaths downstream: use upstream user/host for echo message doc/getting-started: ask to install soju upstream: use context to set connectToUpstream timeout Split upstream connection handling to separate function Add timeout for upstream connection registration Add TODO for upstreamConn.register race Drop user.forEachDownstream Add user.notifyBouncerNetworkState downstream: improve error message on unrecognized message readme: restrict CI badge to master branch doc/ext/bouncer-networks: specify how attributes are cleared in notifications upstream: fix missing WHOIS in abortPendingCommands doc/ext/bouncer-networks: remove BOUNCER BIND auth restriction downstream: fix setting tls=0 in bouncer-networks db_sqlite: drop mutex upstream: fix panic in isChannel Introduce a database package msgstore: add loadMessageOptions msgstore: rename searchMessageOptions, export fields Introduce an xirc package Add msgstore package Move identd to separate package Rename "log" config directive to "message-store" config: add `message-store memory` xirc: move command constants over Rename join to generateJoin xirc: move ChannelStatus over xirfc: move over message generation functions xirc: encode tokens in GenerateIsupport xirc: move over CapRegistry xirc: move over WHOX helpers xirc: move over Membership xirc: add GenerateSASL Move batch struct to upstream.go Remove bridge.go Add soju.im/account-required Drop casemapMap.OriginalKey Drop size arg from newCasemapMap Make casemapMap more type-safe Don't provide name in channel casemapMap Set and ForEach database: add User.{Check,Set}Password Upgrade dependencies Add webpush extension downstream: fix panic in findWebPushSubscription for unbound conns database: add missing user column to WebPushSubscription table database/sqlite: add migration for WebPushSubscription.user upstream: rename variables to clear up target confusion upstream: improve server message detection readme: copy over updated description from website upstream: add support for @+draft/channel-context Add support for draft/read-marker Fix draft/read-marker entry in permanentDownstreamCaps contrib/znc-import: move to subdir upstream: unset SASL state on RPL_TRYAGAIN upstream: handle ERR_UNKNOWNERROR and ERR_NEEDMOREPARAMS for queued commands upstream: fix server message detection for wildcard targets upstream: compare service nick with case-mapping upstream: drop upstreamConn.nickCM downstream: fix MARKREAD/READ command name in broadcast Send MARKREAD push notifications Add per-user default nickname downstream: simplify NICK handling when disconnected downstream: relay SETNAME with upstreamConn.SendMessageLabeled upstream: ignore RPL_ENDOFWHO without pending command Aggregate AWAY status from all connected clients dowstream: remove noop WEBPUSH REGISTER downstream: fix downstream check for draft/read-marker upstream: pre-registration NOTICEs come from servers upstream: regain desired nick when MONITOR is missing downstream: reply to INFO delthas (12): downstream: Enable handling READ when upstream is disconnected Fix build on systems without syscall.Rlimit Send any welcome error messages to the downstream Require an explicit `*` network suffix for multi-upstream Enable resetting a BOUNCER NETWORK port bouncer-networks: Add a read-only error attribute upstream: handle CAP ACK -name Add support for the upstream echo-message capability Enable message-tags only when all upstreams support it Add support for the SEARCH extension Keep batch tag for downstreams with batch cap Fix network.forEachDownstream exiting on first non-match gildarts (4): Add detach option to channel update contrib/migrate-db: new script Add ability for a user to delete themselves database: upgrade bcrypt cost as needed jesopo (1): contrib/clients: correct comment about catgirl
-
v0.4.0421d3f25 · ·
soju v0.4.0 Highlights for this release: - Add support for the new soju.im/read extension - Add support for proxying sasl and draft/account-registration after connection registration - Improved BouncerServ commands: make network argument optional, add "sasl status" - Fallback to alternative nick if unavailable (and use MONITOR to roll back to the preferred nick as soon as possible) - Add exponential backoff when re-connecting to upstream servers Full commit history below. Chris Howey (1): bump required go version to 1.15 Simon Ser (76): Add missing account-notify to permanentUpstreamCaps Abort SASL if in-progress while completing registration Use RPL_LOGGEDIN/OUT to mirror upstream status Send RPL_LOGGEDIN with bouncer account in multi-upstream mode Add support for post-connection-registration upstream SASL auth Remove sasl cap after registration if network doesn't support it Return more descriptive auth failure errors downstream: improve unmarshalEntityNetwork error message doc/soju.1: add `network create` example Add support for draft/account-registration proxying Add "sasl status" command Validate address in user.checkNetwork Add context to connectToUpstream Fix upstream gauge metric Add soju_upstream_connect_errors_total metric Add exponential backoff when re-connecting to upstream Don't retry connecting on permanent failure Mark ACCOUNT_REQUIRED error as permanent connection failure Cancel pending commands on downstream disconnect Add context to upstreamConn.handleMessage Add context to network.storeClientDeliveryReceipts Use golang.org/x/time/rate Avoid forwarding MONITOR requests if upstream doesn't support it Fallback to alt nick Read nickname from RPL_WELCOME Stop incrementing hopcount in RPL_WHOREPLY Remove Logger.Print Add Logger.Debugf Downgrade conn log messages to debug Improve msgStore.Append log message wording Add username to downstreamConn log messages Disallow ',' in nicknames Use more descriptive errors when aborting pending commands Improve error message when downstream doesn't authenticate Use dc.nick instead of "*" for RPL_* messages service: send summary when executing "server notice" server: cleanup user in defer Add context to {conn,upstreamConn}.SendMessage Don't forward duplicate JOIN commands Block RPL_{CREATIONTIME,TOPICWHOTIME} for detached channels Add support for downstream multi-line AUTHENTICATE commands Handle upstream multi-line SASL Add context to upstreamConn.handleCapAck Don't send RPL_NOTOPIC on JOIN Retry on temporary net.Listener failure Fix incorrect listen addr in error message Drop user.forEachNetwork Ensure consistent network ordering Fix capitalization of handleServiceSASLStatus service: switch to -network flag for certfp and sasl commands service: make name arg optional for network commands Forbid empty and flag-looking network names db_postgres: use enum for sasl_mechanism makefile: switch to BSD/GNU make Add context to upstreamConn.runUntilRegistered Add context to upstreamConn.register Refactor generateWHOXReply Fix flags variable name in RPL_WHOREPLY handler doc: move read spec to ext/ Ignore READ commands for service Introduce formatServerTime irc: add isHighlight tests irc: simplify isHighlight msgstore_fs: fix direct message targets downstream: panic when registering twice downstream: be less strict when picking up client name downstream: fail on client or network name mismatch Upgrade dependencies downstream: fix network name msimatch check being too strict downstream: re-format illegalNickChars doc comment downstream: disallow '.' in nicknames doc/ext: add README contrib/clients: warn about catgirl contrib/clients: add goguma db: allow registering multiple metrics collectors db_postgres: report network metrics with hostname label Theodor Thornhill (1): contrib/clients: Add information about emacs irc clients delthas (2): Fix echo-message for TAGMSG Add support for the wip soju.im/read capability and READ command
-
v0.3.04831b611 · ·
soju v0.3.0 Highlights for this release: - Improved protocol support: MONITOR, WHOX, ELIST, account-notify, CHATHISTORY LATEST, draft/event-playback, draft/extended-monitor - PostgreSQL support for larger deployments - Instrumentation via Prometheus and a new "server status" BouncerServ command - New config options: custom MOTD and bouncer title, maximum number of networks per user, globally disable multi-upstream mode, per-user IP addresses - Robustness improvements: add cancellation and timeouts throughout - Most configuration options can be reloaded at runtime - Add testing infrastructure Full commit history below. Alex Karle (1): chathistory: Fix truncated backlog due to timezones Alexey Yerin (1): downstream: handle name=... in BOUNCER Hubert Hirtz (8): Dismiss TAGMSGs directed to BouncerServ Send back TAGMSGs to self Correctly send back PRIVMSGs and NOTICEs to self PostgreSQL support db_postgres: handle both constraints on network updates Set hard timeouts on DB transactions Skip list/type A mode arguments Allow AUTHENTICATE before NICK Simon Ser (109): db_sqlite: switch to sql.Named Add support for IRCv3 WebSocket text subprotocol db_sqlite: fix realname not fetched in ListUsers Close DB on shutdown Add basic server test Use isErrClosed in Server.Serve test: add upstream test: add NOTICE broadcast test: get rid of testUpstream Add "server status" command Add limit for RSA bits Add DB stats msgstore_fs: add limit on number of opened files Add WHOIS reply for BouncerServ doc/soju.1: mention that accept-proxy-ip affects PROXY proto Add max-user-networks config option build: don't clobber config file Split CertFP logic into separate file Add "server notice" command db_sqlite: add migration test db_postgres: add migration test Run server test with PostgreSQL too Fix unused imports in tests ci: run PostgreSQL tests service: allow updating other users Upgrade dependencies Fix printf formatting in error message msgstore_fs: fix ListTargets error on missing log dir Stop sending RPL_CREATED doc/soju.1: use angle-brackets for URL doc/soju.1: add descriptions for all flags for "user create" doc.soju.1: fix typo and improve formatting for "certfp generate" contrib/clients: update IRCv3 caps for Weechat 3.3 db_postgres: fix constraints errors Add bouncer MOTD Don't strip spaces at start of MOTD db_postgres: quote table name in StoreClientDeliveryReceipts db_postgres: use tx for all queries in StoreClientDeliveryReceipts db_postgres: remove unnecessary DEFAULT NULL in schema msgstore_fs: add reference to ZNC ci: switch to alpine/latest msgstore_fs: rename log dir when network is renamed Send BOUNCER REGISTRATION_IS_COMPLETED error Remove unused REGISTRATION_IS_COMPLETED in handleMessageUnregistered Add support for account-notify Unify away-notify and account-notify handling Remove incorrect AWAY TODO in downstreamConn.SendMessage Remove unnecessary downstream cap checks Add context args to Database interface Always reply ERR_SASLABORTED on SASL abort Unify BOUNCER ADDNETWORK and CHANGENETWORK Get rid of io.EOF errors in logs Fix missing imports in server.go Mark BouncerServ as server operator Mark admins as server operators in self WHO/WHOIS replies Fix operator flag in RPL_WHOREPLY Add support for WHOX Mark bouncer users and BouncerServ as authenticated in WHOX/WHOIS Add title config option db_sqlite: use TEXT instead of VARCHAR Make Network.Nick optional msgstore: take Network as arg instead of network msgstore: add context to messageStore methods msgstore_fs: abort on timeout msgstore_memory: add comment about Append dropping messages Turn CHATHISTORY and backlog limits into constants Set mode +o on admins for bouncer-only connections Add plus sign in RPL_UMODEIS reply Fix upstream USER command when both username and nick are empty Plumb context in downstreamConn.handleMessageRegistered Add context support to user and network mutations Add context support to service Check context cancellation in handleServiceServerNotice Add partial context support to handleUserUpdate Add context support to Server.createUser Remove support for mixed multi-upstream LIST Add a queue for WHO commands Add ELIST support in single-upstream mode Add support for MONITOR cmd/soju: bump max number of opened files Add panic handlers for user and downstream goroutines Don't send user in prefix for echo messages Allow most config options to be reloaded Add downstreamConn.isMultiUpstream Set isMultiUpstream flag in downstreamConn.welcome() Add config option to globally disable multi-upstream mode sojuctl: use background context contrib/znc-import: use background context Use background context in tests Add context arg to sanityCheckServer Lower sanityCheckServer timeout to 15s Add context to downstreamConn.handleMessageUnregistered Add context arg to downstreamConn.welcome() Lift up context to downstreamConn.handleMessage Introduce conn.NewContext Add timeout for downstream connection registration Add per-user IP addresses Update downstream caps/nick/realname before sending MOTD Add basic Prometheus metrics exporter Add basic active users and downstreams metrics Add int64 gauge abstraction Add number of upstream connections to metrics Add message counter metrics Add Prometheus instrumentation for the database Add pprof HTTP server Upgrade dependencies doc/per-user-ip: new documentation article Disallow empty string for nick contrib/clients: WeeChat 3.3 enables all IRCv3 caps by default Thomas Vigouroux (1): Add CHATHISTORY LATEST support delthas (4): Add support for draft/event-playback Add support for draft/extended-monitor Send the downstream host for PRIVMSG echo messages Return an empty CHATHISTORY TARGETS batch when in multi-upstream
-
v0.2.16b9c9982 · ·
soju v0.2.1 This is a bug fix release for soju v0.2.0. Chris Smith (1): Set a higher timeout for proxyproto listeners Hubert Hirtz (5): Explicitly close connection to SQLite on failed upgrade Use NULL-tolerant comparison for DeliveryReceipts Allow CAP negotiation to happen with CAP REQ msgstore_fs: escape "." and ".." Fix DeliveryReceipt not being cleaned up Simon Ser (2): readme: add note to use system libsqlite3 Workaround lack of net.ErrClosed in WebSocket library
-
v0.2.08adf65ad · ·
soju v0.2.0 This release brings a set of bug fixes and new features. New features include: - Support for a new soju.im/bouncer-networks extension, allowing clients to automatically integrate with soju's multi-network functionality. gamja and Weechat (via a script) take advantage of it. - Support for CHATHISTORY BETWEEN and TARGETS, allowing better chat history integration in clients. - Improved handling of MOTD, LUSERS, STATS and unknown IRC commands Alexey Yerin (1): service: show SHA-512 fingerprint Drew DeVault (1): db: refactor into interface Gregory Anders (3): Forward MOTD messages downstream Forward user mode changes in single-upstream mode Slightly relax new log file permissions Hubert Hirtz (6): Implement CHATHISTORY BETWEEN Fix CAP LIST listing disabled capabilities Don't forward label tags Don't build soju when calling "make install" Hand-made word splitter for BouncerServ Add a C compiler to the list of dependencies Jake Nelson (1): Sort `channel status` channels by name Philip K (1): Directly return self-messages to user in multi-upstream mode Rafael Castillo (1): Check for TLS config in wss listeners Simon Ser (57): Add more context to chathistory errors Check message stores implement expected interfaces contrib/clients: add gamja and senpai Silence net.ErrClosed errors Relay self-WHO/WHOIS in single-upstream mode readme: move quickstart to dedicated doc page readme: add link to IRC channel doc/soju.1: document -connect-command doc/soju.1: document user delete command readme: link to rendered man page Pass-through the BOT ISUPPORT token Implement the soju.im/bouncer-networks extension Add pass to bouncer network attributes Send network settings in LISTNETWORKS Introduce the soju.im/bouncer-networks-notify capability Don't send connection status NOTICEs with bouncer-networks Vendor BATCH bouncer-networks type contrib/clients: add note about bouncer-networks Add channel status service command Add support for IRCv3 setname doc/getting-started: s/Freenode/Libera Chat/ Allow networks to be disabled Broadcast BOUNCER notifications to all downstream connections Fix typo in BOUNCER notifications: s/status/state/ Reject JOIN with invalid channel names Send placeholder when no network/channel is returned by BouncerServ Forward unknown commands to upstream in single-upstream mode doc/ext/bouncer-networks: fix typo Implement CHATHISTORY TARGETS Prune detached channels from CHATHISTORY TARGETS Add downstreamConn.SendBatch helper Make user MODE commands fail in multi-upstream mode Don't suggest users to /motd in multi-upstream mode doc/soju.1: explain http-origin defaults contrib/clients: add reference to Weechat script Add support for account-tag Add support for utf8-only Forward LUSERS and STATS messages after initial registration Unify downstream PRIVMSG and NOTICE handling Allow admins to broadcast message to all bouncer users doc/soju.1: document bouncer-wide broadcasts Disallow '$' in nicks readme: list dependencies Add per-user realname setting Only update realname if specified in "user udpate" Merge "change-password" into "user update" doc/soju.1: improve "user create" docs Introduce user.updateUser ci: add gofmt check contrib/clients: sort alphabetically and wrap lines Pass-through CLIENTTAGDENY in ISUPPORT go fmt: add go:build tags Don't send network notification when removed Split unmarshalEntity into two functions Don't require upstream to be connected for CHATHISTORY Send empty history for service Upgrade dependencies delthas (2): service: Introduce network quote contrib/clients: Mention Hexchat
-
v0.1.2463e234e · ·
soju v0.1.2 Alexey Yerin (3): db: match placeholders with columns Makefile: mark soju and sojuctl as .PHONY contrib/weechat: fix typo Hubert Hirtz (2): Handle casemapping on BouncerServ Don't directly reply to network-specific NICK Simon Ser (1): contrib/weechat: explain how to enable IRCv3 features
-
v0.1.0706b6e33 · ·
soju v0.1.0 This is the first soju release. Any database created with this version of soju is guaranteed to work with future versions. The configuration file format, the CLI interface and the BouncerServ interface may be changed in future releases. Dan Shick (1): Fix store user query values Eyal Sawady (1): Join all channels with a single JOIN message Hubert Hirtz (24): Send the full user mask in RPL_LOGGEDIN Don't save corrupted NickServ credentials Send compact channel name lists Fix help message for BouncerServ's network update More explicit error message on KICK with the wrong network More explicit error message on INVITE with the wrong network Fix marshalling of channel name in RPL_CREATIONTIME Reject downstream NICK with illegal characters Forward RPL_TOPICWHOTIME to downstreams Make sure that WebSocket messages are valid UTF-8 Make DB.DeleteChannel take the channel ID Don't send TAGMSG to upstreams that don't support it Prevent downstreams from changing their nick to service's Uphold echo-message even with BouncerServ Advertise all caps, CAP DEL them on registration Improve dc.authenticate()'s error messages Don't forward batch tags Request invite-notify to upstreams if true return true else return false Send correct CHATHISTORY error messages Implement casemapping Fix CHATHISTORY target not being casemapped Make casemapping work over bytes instead of runes Drop TAGMSG in detached channels Kalyan Sriram (1): sojuctl: change-password: check if user exists Kenny Levinsen (2): docs: Fix manpage syntax service: Handle zero-value in stringPtrFlag.String Nomeji (1): readme: expand usage Simon Ser (405): Add basic IRC listener Add LICENSE and README.md Send "unknown command" replies Handle NICK and USER Add connection registration Send ERR_NOMOTD on registration Handle PING Rename conn to downstreamConn Add Server.Logger Connect to upstream servers Add basic upstream message handler Log upstream server errors Split downstram and upstream code into separate files Ignore some upstream messages Send standard user/channel modes to downstream connections Handle upstream RPL_MYINFO messages Handle MODE messages from upstream servers Handle NOTICE from upstream servers Join channels on upstream servers Split IRC helpers to separate file Add per-upstream logger Maintain a list of downstream connections Allow Server to have access to upstreamConn Remove downstream conn from list on disconnect Mark channel info as complete on RPL_ENDOFNAMES Write to downstream conn in dedicated goroutine Forward channel information De-duplicate downstream QUIT handling Keep track of upstream connections in a list Send channel info to downstream on registration Remove downstreamConn.WriteMessage Add missing bridge.go, oops Use a dedicated goroutine to write upstream messages Handle third-party JOIN and PART messages Handle channel mode changes Forward PRIVMSG messages Per-user connections Add Server.getUser Add user.forEachUpstream Add user.forEachDownstream Skip unregistered and closed upstream connections Allow changing nickname Add parseMessageParams helper Add upstreamConn.register Close connection from writer goroutine Handle downstream MODE messages Send fake RPL_CREATED message Handle downstream JOIN messages Handle downstream PART messages Add an in-memory ring buffer Add names to consumers Switch license to AGPLv3 readme: add some high-level goals, add contributing links Don't write to downstreamConn.messages directly Abbreviate {upstream,downstream}Conn with uc and dc Add downstreamConn.writeMessages Fix issues related to Ring Forward PRIVMSG coming from downstream Document Ring Add upstreamConn.SendMessage Add CLI flags for listening address and hostname Add config file Fix panic when closing downstream connection Add a -debug flag Don't leave connections half-opened Properly handle PING messages Enable TCP keep-alive on all connections Fix PING handlers, again Add functions to translate between upstream and downstream names cmd/jounce: fix non-TLS listener address Retry connecting to upstream servers Remove upstream prefix for outgoing MODE and PRIVMSG Allow clients to specify an upstream name in their username Fix TOPIC parsing, broadcast to downstream clients Remove unused user.getChannel, move getUpstream to user Rename network to upstreamName Add SQLite database readme: add instructions to initialize database go fmt readme: pipe commands into sqlite3 instead of using -init Use a RWMutex for DB Pass-through NICK messages for other users Pass-through QUIT messages cmd/jouncectl: new command Add support for PASS to downstream schema: make User.password NOT NULL schema: add UNIQUE constraints Fix nil dereference when network is specified in username Update DB on JOIN and PART Store NICK changes in the DB Auto-save IRC networks Add upstream CAP LS support Add support for upstream PASS command schema: add Channel.key Add support for SASL authentication Update dependencies Forward NOTICE messages coming from upstream connections Rename project to soju Add sojuctl to .gitignore Strip client & network name from username Split user logic into its own file Rename messages channels to outgoing Per-user dispatcher goroutine Rename consumption to ringMessage Echo downstream PRIVMSGs to other downstream connections Make downstreamConn.runUntilegistered exit with an error on EOF Don't reply to PING when client is unregistered Add CAP support for downstream connections Protect upstreamConn.history with a lock Log downstream messages before registration Allow CAP command when registered Add downstream SASL support Fix echo PRIVMSG messages Fix typo ci: add builds.sr.ht manifest Add basic infrastructure for bouncer service man: add basic man page man: fix typo readme: add ref to man page, add link to GitHub repo Fix history name Remove some IRCv3 constants Add basic Makefile Fix deadlocks in single-upstream mode Move upstreamConn.history to network Avoid sending JOIN twice for the same channel Drop messages on closed connections Fix empty SASL challenge message Fix typo Add network.upstream helper Add user.{add,remove}Downstream Add more details to ring buffer panics Move upstreamConn.ring to network Consume ring buffer for networks added on-the-fly Handle downstream JOIN/PART with multiple channel names Add support for channel keys gitignore: add soju.db and soju.1 Error out when storing unsupported SASL mechanism in DB Correctly set Channel.ID in DB.StoreChannel Make BouncerServ commands a tree Add a "network status" command Introduce a user.events channel Add eventDownstreamConnected Add eventDownstreamDisconnected Nuke user.lock Move man page to doc/ doc: add basic architecture document Get rid of Server.downstreamConns Stop accessing user data in downstreamConn.authenticate Fix race condition in upstreamConn.Close Introduce eventUpstreamDisconnected Document functions safe to call from any goroutine s/List/LIST/ when referring to the command Update password on NickServ SET PASSWORD message Add downstreamConn.clientName Remove downstreamConn.username Use clientName to decide whether or not history should be sent Fix missing upstreamConn.closed initialization Rename AppendLog to appendLog Consume ring messages outside of writer goroutine readme: advise connecting with "<username>/<network>" Make "@" and "/" indicate client name and network, respectively Expose message-tags capability downstream Avoid directly forwarding NOTICE messages Request server-time cap Add downstream support for server-time Fix log dir permission Add eventUpstreamConnected Only set network.conn when registered Auto away Set network.conn in user goroutine config: use shlex Make user.getNetwork handle Network.Name Add "network delete" service command Stop ring consumers when deleting network Simplify ring consumer goroutine Set write deadlines Set connect timeout Fix SQL error logged on JOIN doc: document "network delete" Fix writer goroutine races Introduce conn for common connection logic Add support for downstream echo-message extension Use conn.ReadMessage instead of irc.Conn.ReadMessage Log self-messages too doc: document auto-away feature Introduce messageLogger Add time tag to all messages Add NOTICE messages to ring buffer Add network.{createUpdate,delete}Channel Use Network.GetName in network status NOTICE messages Only print addr if necessary in network status service command Use Network.GetName for logs path Introduce upstreamConn.produce Remove per-network ring buffer goroutines Remove channel from ring buffer consumers Remove locks from ring buffer Remove downstreamConn.lock Remove downstreamConn.ringConsumers Remove RingConsumer.Close Simplify ring consumer loop Fix NOTICE log formatting Log TOPIC messages Remove downstreamConn.ourMessages Remove network.lock Add origin argument to upstreamConn.produce Make upstreamConn.produce log messages Fix server-time tags timezone Remove Ring.Close Make Ring.NewConsumer seq argument mandatory Remove Ring.consumers Fix upstream NICK handling Centralize logged messages marshaling Remove outdated comment Extract logic to build log filepath into a function Make newMessageLogger take a *network instead of an *upstreamConn Document downstreamConn.{,un}marshalEntity Parse timestamp from message tags in messageLogger.Append Per-entity ring buffers doc: fix SQL driver name in manpage Set up DB migration infrastructure Add support for downstream batch & chathistory Unify downstreamConn.marshal{Entity,Nick,Channel} Disallow marshalling for anotehr network Kill downstreamConn.marshal{Nick,Channel} Make downstreamConn.marshal{Entity,UserPrefix} take a network Support sending history when upstream is disconnected Fix typo doc: describe more default settings readme: fix ref to manpage doc/architecture: ring buffers are now per-channel Add network.channels, remove DB.GetChannel Abbreviate net status service reply Forward RPL_AWAY messages Check upstream NOTICE prefix is non-nil Don't use forEachDownstreamByID when forwarding RPL_AWAY Add downstream support for cap-notify Add support for away-notify Rename upstreamConn.caps to supportedCaps Add upstreamConn.caps Remove network.upstream Use a lock to protect conn.{closed,outgoing} Add upstream cap-notify support Introduce permanentUpstreamCaps Add support for detached channels Don't clear channel key on JOIN Unify upstream NOTICE and PRIVMSG handling Send service NOTICE on highlight in detached channel Improve highlight matching readme: add CI badge Add time tag to echo messages Unexport network.Stop Only send JOIN message if we have channels to join Introduce network.isClosed Close net.Conn in conn.Close Add network update command Remove setKeepAlive Introduce ircConn Remove keepAlivePeriod Allow multiple listeners, default to ircs doc: add missing change-password service command doc: update URL to sr.ht hub in man page Fail auth on empty password in DB Add support for WebSocket connections Introduce User.Created ci: check scdoc is happy Fix missing appendServiceCommandSetHelp argument readme: add link to website readme: extend copyright notice to all contributors service: list commands in lexicographic order Return io.EOF on websocket connection closure Handle registration failures Reply to WHO BouncerServ Extract X-Forwarded-* headers for WebSocket connections Only read X-Forwarded-* if remote address is loopback Add RemoteAddr to ircConn interface Accept "irc" WebSocket subprotocol Make length check clearer in sendNames Sort and split JOIN messages Check upstream address with net.SplitHostPort Parse upstream URLs with net/url Add support for upstream Unix socket connections Strip network name from nickname when auto-saving network Broadcast unhandled messages to downstream connections Fix deadlock in DB.Close contrib/znc-import: new utility Add unix as supported upstream URL scheme to service Prevent error handler from falling through in user.run Implement CHATHISTORY AFTER doc: document the network update command go fmt Add a `sasl set-plain` command Rename `certfp reset` to `sasl reset` doc: mention SASL EXTERNAL in the CertFP docs readme: mention the znc-import tool doc: add example config file in man page Change unix:// to irc+unix:// Add accept-proxy-ip config directive config: make http-origin directive overwrite previous list readme: update mailing list link Add DB.DeleteUser Add user.stop Make user.stop block Remove user from Server map when stopped Add `user delete` command cmd/sojuctl: read user from DB before updating it Don't perform TLS handshake in connectToUpstream Add User.ID Add ircConn.LocalAddr Add conn.{Local,Remote}Addr Add an ident server doc: add ident server to man page Extract history loading into functions Add missing ident.go Handle ERR_NOPERMFORHOST and ERR_YOUREBANNEDCREEP Handle upstream ERROR messages Parse NOTICE messages from logs Format CTCP ACTION messages in logs ident: remove leftover debug log Encode idents to hex instead of base64 Strip message tags in error message Escape user/network/entity characters in log file path Implement rate limiting for upstream messages Improve registration error messages go fmt Replace networkHistory.offlineClients with clients Introduce internal message IDs Introduce loadHistoryLatestID Nuke in-memory ring buffer Update dependencies Allow '/' in nickname Fix downstream PING argument handling Fix panic in downstreamConn.sendNetworkHistory Don't update history when msgID is empty in appendLog Set Server.AcceptProxyIPs Add support for the PROXY protocol Add id column to User table Switch DB API to user IDs Switch to sql.NullString Add message store abstraction Switch to go-scfg Upgrade dependencies Don't accept any IP as a proxy by default Implement delivery receipts via PING messages Fix nickname in ERR_ERRONEOUSNICKNAME Add .editorconfig Turn messageStore into an interface Add store-agnostic message ID format Make chat history operations optional in messageStore Add in-memory message store go fmt Update dependencies Send RPL_ISUPPORT CHATHISTORY token Forward ISUPPORT NETWORK token Add support for graceful shutdown Rename sendNetworkHistory to sendNetworkBacklog Rename network.history to network.delivered Introduce downstreamConn.sendTargetBacklog Use sendTargetBacklog when re-attaching a channel Add irc to ALPN protocols Add Network.{URL,GetUsername,GetRealname} Extract ISUPPORT CHANMODES/PREFIX to separate functions Simplify if block in ISUPPORT handler Maintain state for upstream ISUPPORT Use upstream ISUPPORT map for NETWORK Properly handle all ISUPPORT negations Passthrough some ISUPPORT tokens Improve ERR_NOSUCHCHANNEL error messages Correctly set WebSocket read/write deadline Add Unix socket listener Send NOTICE to downstream when upstream is disconnected Don't store history for NickServ Don't update downstream caps in upstream RPL_WELCOME handler Don't add "irc" in ALPN list for WebSocket servers Drop "irc" WebSocket subprotocol Add support for the Forwarded HTTP header Fix Forwarded HTTP header handling Stop reading X-Forwarded-Port Reload TLS certs on SIGHUP Fix panic on GetCertificate Introduce deliveredClientMap contrib/casemap-logs.sh: new utility script Simplify network.offlineClients Move network.clients to user Ensure targets are case-mapped before being passed to messageStore Introduce deliveredStore Make NickServ detection casemapping-aware Rename user.clients to clientNames Use BARE for internal message IDs Save delivery receipts in DB Update dependencies cmd/soju: allow specifying -listen multiple times Introduce per-user logger Panic on unknown user event type Take msg ID in sendTargetBacklog Skip backlog logic in downstreamConn.welcome on chathistory Store last internal msg ID in DB when detaching Move isHighlight to irc.go Relay detached channel backlog as BouncerServ NOTICE if necessary Error out on network name conflict Add per-network logger Add user prefix to upstream logger sojuctl: don't use log.Fatalf in readPassword readme: mention Makefile, assume soju is installed system-wide Add default configuration file Make db and log config options more future-proof Thorben Günther (4): Add ability to change password Allow users to change password in client Allow to read password when stdin is not a tty. doc: fix typo in man page delthas (65): Add upstream INVITE support schema: add Network.name Add suffixing for multi-upstream connections Add create-network bouncer service command Add WHO support Add WHOIS support Fix MODE downstream support Add MODE arguments support Add downstream NAMES support Add user hostname to downstream user prefix Add downstream self WHO and WHOIS support Add upstream message-tags capability support Add upstream batch capability support Add a server-unique id to each downstream Add upstream labeled-response capability support Route NAMES, WHO, WHOIS replies to the requesting downstream Fix wrong handling of members parameter of RPL_NAMREPLY Simplify error handling for downstream JOIN/PART Add KICK support Add downstream TOPIC support Fix capitalization of 'id' Add upstream RPL_CREATIONTIME support Add downstream INVITE support Add downstream NOTICE support Marshal NOTICE user prefixes and channels Fix parsing wrong empty element in RPL_WHOISCHANNELS channel list Make upstream.SendMessageLabeled use an uint64 id Add LIST support Add support for bouncer logs Send one NOTICE on new upstream disconnect/connect errors Send the last error for disconnected networks in network status Fill all fields of the service user prefix Remove unused entityLog struct Add support for custom network on-connect commands Unmarshal nicks in texts of PRIVMSG and NOTICE from downstreams Add support for IRC address schemes Add support for the irc+insecure address scheme Fix joining only one saved channel per network Fix not properly marshaling self in single-server mode Add support for multiple user channel memberships Fix parsing MODE messages by updating channel memberships Fix a null access due to assigning nil to the member memberships map Fix sending CAP END twice when SASL is not used Update downstream nicks in single-server mode and after NICK Add support for downstream NICK to a single upstream Add support for downstream LIST to a single upstream Add support for downstream WHOIS nick/network nick/network Add support for upstream ban, invite, and exception lists Send a label with all messages sent from downstream Forward all labeled errors and unknown messages to their downstream Add support for TAGMSG and client message tags Fix parsing upstream RPL_INVITING messages Add support for downstream CHATHISTORY Rename handleServiceCreateNetwork to handleServiceNetworkCreate Fix: Check the stdin scanner for errors when reading the password Add an admin flag to users Add support for admin-restricted service commands Add support for the user create admin service command sojuctl: Add support for creating admin users Fix sending messages from detached channels Add support for the extended-join capability Introduce Channel.{RelayDetached,ReattachOn,DetachAfter,DetachOn} Add customizable auto-detaching, auto-reattaching, relaying. service: Introduce `channel update` Increase downstream TCP keepalive interval to 1 hour fox.cpp (3): Implement upstream SASL EXTERNAL support Fix handling of empty response to SASL challenge Do not panic if BouncerServ command without handler is sent