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