Skip to content
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