~emersion/soju

v0.5.1 18 days ago .tar.gz browse log

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 22 days ago .tar.gz browse log

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 5 months ago .tar.gz browse log

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 8 months ago .tar.gz browse log

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 10 months ago .tar.gz browse log

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 10 months ago .tar.gz browse log

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 11 months ago .tar.gz browse log

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 1 year, 3 months ago .tar.gz browse log

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 1 year, 3 months ago .tar.gz browse log

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 1 year, 3 months ago .tar.gz browse log

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