Skip to content

Tags

Tags give the ability to mark specific points in history as being important
  • v0.6.2
    soju v0.6.2
    
    Simon Ser (5):
          service: reject params for commands that don't take any
          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
    
  • v0.6.1
    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.0
    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.2
    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.1
    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.0
    f37aedea · downstream: reply to INFO ·
    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.0
    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.0
    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.2
    soju v0.2.2
    
    Alex Karle (1):
          chathistory: Fix truncated backlog due to timezones
    
    Simon Ser (3):
          db_sqlite: fix realname not fetched in ListUsers
          Close DB on shutdown
          Add limit for RSA bits
    
  • v0.2.1
    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.0
    8adf65ad · Upgrade dependencies ·
    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.2
    463e234e · contrib/weechat: fix typo ·
    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.1
    soju v0.1.1
    
    This release fixes a bug in the command deleting users, which caused
    data loss by deleting the current user instead of the provided user.
    
    Eyal Sawady (1):
          handleUserDelete: delete the correct user
    
  • v0.1.0
    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