Simon Ser
997fe723f0
xirc: move ChannelStatus over
2022-05-29 17:28:25 +02:00
Simon Ser
4af7a1b8e5
Rename join to generateJoin
...
For consistency with other functions.
2022-05-09 17:20:17 +02:00
Simon Ser
c50fb4a26d
xirc: move command constants over
2022-05-09 17:18:51 +02:00
Simon Ser
b92afa7cca
Introduce an xirc package
2022-05-09 16:15:00 +02:00
Simon Ser
3a7dee8128
Introduce a database package
2022-05-09 15:08:04 +02:00
Simon Ser
27f21eab94
upstream: fix panic in isChannel
...
Fixes the following:
goroutine 4380762 [running]:
runtime/debug.Stack()
runtime/debug/stack.go:24 +0x65
git.sr.ht/~emersion/soju.(*Server)addUserLocked.func1.1()
git.sr.ht/~emersion/soju/server.go:318 +0x66
panic({0x563f090c4460, 0xc002bff998})
runtime/panic.go:1038 +0x215
git.sr.ht/~emersion/soju.(*upstreamConn).isChannel(...)
git.sr.ht/~emersion/soju/upstream.go:288
git.sr.ht/~emersion/soju.(*downstreamConn).handleMessageRegistered(0xc00c23a000, {0x563f0910eb20, 0xc0027539e0}, 0xc01b8d6240)
git.sr.ht/~emersion/soju/downstream.go:1836 +0xd4ec
git.s.ht/~emersion/soju.(*downstreamConn).handleMessage(0xc00c3a000, {0x563f0910eae8, 0xc000026058}, 0xc01b8d6240)
git.sr.ht/~emersion/soju/downstream.go:697 +0xde
git.sr.ht/~emersion/soju.(*user).run(0xc00be4a0b0)
git.sr.ht/~emersion/soju/user.go:675 +0xbe5
git.sr.ht/~emersion/soju.(*Server).addUserLocked.func1()
git.sr.ht/~emersion/soju/server.go:328 +0x70
2022-05-07 09:28:53 +02:00
Simon Ser
d321fcd9f0
upstream: fix missing WHOIS in abortPendingCommands
...
Fixes the following panic:
2022/05/03 08:05:32 panic serving user "asdf": Unsupported pending command "WHOIS"
goroutine 15 [running]:
runtime/debug.Stack()
/opt/go/src/runtime/debug/stack.go:24 +0x65
git.sr.ht/~emersion/soju.(*Server).addUserLocked.func1.1()
~/soju/server.go:317 +0x5d
panic({0xa18da0, 0x6815bf10})
/opt/go/src/runtime/panic.go:838 +0x207
git.sr.ht/~emersion/soju.(*upstreamConn).abortPendingCommands(0x6811c9c0)
~/soju/upstream.go:338 +0x953
git.sr.ht/~emersion/soju.(*user).handleUpstreamDisconnected(0x680b7080, 0x6811c9c0)
~/soju/user.go:744 +0x6d
git.sr.ht/~emersion/soju.(*user).updateNetwork(0x680b7080, {0xb99a00, 0x684690e0}, 0x681343c0)
~/soju/user.go:936 +0x387
git.sr.ht/~emersion/soju.handleServiceNetworkUpdate({0xb99a00, 0x684690e0}, 0x68116000, {0x681b8a20?, 0x40429108?, 0x10?})
~/soju/service.go:590 +0x14f
git.sr.ht/~emersion/soju.handleServicePRIVMSG({0xb99a00, 0x684690e0}, 0x68116000, {0x680af5d5?, 0x1?})
~/soju/service.go:146 +0x7df
git.sr.ht/~emersion/soju.(*downstreamConn).handleMessageRegistered(0x68116000, {0xb99a00, 0x684690e0}, 0x681b8940)
~/soju/downstream.go:2503 +0x9e9e
git.sr.ht/~emersion/soju.(*downstreamConn).handleMessage(0x68116000, {0xb999c8?, 0x680240a0?}, 0x681b8940)
~/soju/downstream.go:727 +0xde
git.sr.ht/~emersion/soju.(*user).run(0x680b7080)
~/soju/user.go:690 +0xe05
git.sr.ht/~emersion/soju.(*Server).addUserLocked.func1()
~/soju/server.go:327 +0x70
created by git.sr.ht/~emersion/soju.(*Server).addUserLocked
~/soju/server.go:314 +0x178
2022-05-03 08:33:20 +02:00
Simon Ser
2ba13fdefc
upstream: use context to set connectToUpstream timeout
...
This allows the timeout to apply to the whole sequence of
operations, as opposed to just Dial.
2022-04-14 19:42:02 +02:00
delthas
abe5291b62
Add support for the upstream echo-message capability
...
This adds support for upstream echo-message. This capability is
enabled when the upstream supports labeled-response.
When it is enabled, we don't echo downstream messages in the downstream
handler, but rather wait for the upstream to echo it, to produce it to
downstreams.
When it is disabled, we keep the same behaviour as before: produce the
message to all downstreams as soon as it is received from the
downstream.
In other words, the main functional difference is that when the upstream
supports labeled-response, the client will now receive an echo for its
messages when the server acknowledges them, rather than when soju acks
them.
Additionally, uc.produce was refactored to take an ID rather than a
downstream.
2022-04-11 17:27:47 +02:00
delthas
12577c10bb
upstream: handle CAP ACK -name
...
We'll need this for echo-message.
2022-04-11 17:27:47 +02:00
Simon Ser
fb20cff45b
upstream: pass context to upstreamConn.requestCaps
2022-04-04 13:43:00 +02:00
Simon Ser
846c99dedc
Queue WHOIS commands
...
This avoids having more than one in flight at a time (avoids
hitting rate limits a bit) and routes back replies to the correct
downstream connection (even if labeled-response isn't supported).
Closes: https://todo.sr.ht/~emersion/soju/193
2022-04-04 09:58:26 +02:00
Simon Ser
57eb54fb34
upstream: use labeled-response for queued commands
2022-04-04 09:55:32 +02:00
Simon Ser
747263fc2d
Simplify and improve WHOIS forwarding
...
Group together most WHOIS replies. While at it, add a few missing
replies.
2022-04-04 09:28:04 +02:00
Simon Ser
16e43ee3a3
upstream: don't populate time tag for numerics
...
Allows us to save a few bytes, e.g. in WHO replies.
2022-03-22 21:14:02 +01:00
Simon Ser
09513e63fe
Remove unnecessary zero initialization
2022-03-22 21:10:06 +01:00
Simon Ser
5defd29509
Ensure all incoming messages have a prefix set
...
Per the spec:
> If the source is missing from a message, it’s is assumed to have originated
> from the client/server on the other end of the connection the message was
> received on.
2022-03-21 17:01:15 +01:00
Simon Ser
e403b88a3d
Add support for chghost
2022-03-21 16:30:58 +01:00
Simon Ser
78d9a84a6f
Add support for RPL_VISIBLEHOST
2022-03-21 16:09:45 +01:00
Simon Ser
6e094b1099
Use capRegistry for upstreamConn
2022-03-14 19:25:49 +01:00
Simon Ser
74fd506fef
Use capRegistry for downstreamConn
2022-03-14 19:25:49 +01:00
Simon Ser
fdf9727600
Mark BouncerServ as online in MONITOR, don't forward to upstream
2022-03-08 21:29:04 +01:00
Simon Ser
9a79c66921
upstream: use network case-mapping in updateMonitor
...
We were using the downstream case-mapping.
2022-03-08 21:27:43 +01:00
Simon Ser
1a56b2f658
Introduce formatServerTime
...
It's too easy to forget to convert to UTC.
2022-02-16 14:45:09 +01:00
delthas
cae248f672
Add support for the wip soju.im/read capability and READ command
...
READ lets downstream clients share information between each other about
what messages have been read by other downstreams.
Each target/entity has an optional corresponding read receipt, which is
stored as a timestamp.
- When a downstream sends:
READ #chan timestamp=2020-01-01T01:23:45.000Z
the read receipt for that target is set to that date
- soju sends READ to downstreams:
- on JOIN, if the client uses the soju.im/read capability
- when the read receipt timestamp is set by any downstream
The read receipt date is clamped by the previous receipt date and the
current time.
2022-02-11 19:41:46 +01:00
Simon Ser
b1a83529e1
Fix flags variable name in RPL_WHOREPLY handler
...
This param doesn't contain modes, it contains user flags (such as
H/G for away status).
2022-02-09 15:20:32 +01:00
Simon Ser
e72c896bb4
Add context to upstreamConn.register
2022-02-08 16:38:34 +01:00
Simon Ser
375ac53f74
Add context to upstreamConn.runUntilRegistered
2022-02-08 16:37:31 +01:00
Simon Ser
de7d1f7784
Add context to upstreamConn.handleCapAck
2021-12-10 12:28:16 +01:00
Simon Ser
fe564af756
Handle upstream multi-line SASL
...
References: https://todo.sr.ht/~emersion/soju/173
2021-12-10 10:46:41 +01:00
Simon Ser
e397cc2a1f
Block RPL_{CREATIONTIME,TOPICWHOTIME} for detached channels
...
Closes: https://todo.sr.ht/~emersion/soju/132
2021-12-09 12:12:20 +01:00
Simon Ser
66aea1b4a2
Add context to {conn,upstreamConn}.SendMessage
...
This avoids blocking on upstream message rate limiting for too
long.
2021-12-08 18:03:40 +01:00
Simon Ser
b6c47a517c
Use more descriptive errors when aborting pending commands
2021-12-06 22:33:50 +01:00
Simon Ser
d7f7e351af
Improve msgStore.Append log message wording
2021-12-06 18:46:10 +01:00
Simon Ser
f881a42b4b
Stop incrementing hopcount in RPL_WHOREPLY
...
It's extra code for something clients should ignore because it's
unreliable and useless.
2021-12-06 18:08:53 +01:00
Simon Ser
548b1c6930
Read nickname from RPL_WELCOME
...
References: https://github.com/ircdocs/modern-irc/pull/146
2021-12-06 17:58:54 +01:00
Simon Ser
1c285a1b72
Fallback to alt nick
...
If the nickname we want is taken, fallback to another one by
appending underscores. Use MONITOR to figure out when we can request
our desired nick again.
Closes: https://todo.sr.ht/~emersion/soju/35
2021-12-04 20:07:23 +01:00
Simon Ser
f2a28f6e22
Avoid forwarding MONITOR requests if upstream doesn't support it
...
Clients aren't supposed to do this, but in case they do, let's
send them an error.
2021-12-04 19:29:39 +01:00
Simon Ser
04b0c2fd6b
Add context to upstreamConn.handleMessage
2021-12-02 23:27:12 +01:00
Simon Ser
a413681253
Cancel pending commands on downstream disconnect
...
If a client queues a high number of commands and then disconnects,
remove all of the pending commands. This avoids unnecessarily
sending commands whose results won't be used.
2021-12-02 19:29:44 +01:00
Simon Ser
1620344f0a
Mark ACCOUNT_REQUIRED error as permanent connection failure
...
There's no point in retrying to connect in this case.
2021-12-02 17:58:56 +01:00
Simon Ser
fd9a935f3e
Don't retry connecting on permanent failure
...
Closes: https://todo.sr.ht/~emersion/soju/164
2021-12-02 17:33:11 +01:00
Simon Ser
73287f242e
Add context to connectToUpstream
2021-12-02 10:53:43 +01:00
Simon Ser
23fd727618
Add support for draft/account-registration proxying
...
This adds support for the draft/account-registration extension [1].
This allows downstreams to register on upstream networks.
[1]: https://ircv3.net/specs/extensions/account-registration
2021-11-30 12:02:54 +01:00
Simon Ser
e3d7c33bcd
Remove sasl cap after registration if network doesn't support it
...
This will stop clients from trying to issue AUTHENTICATE requests
after connection registration.
2021-11-21 16:28:38 +01:00
Simon Ser
313c6e7f97
Add support for post-connection-registration upstream SASL auth
...
Once the downstream connection has logged in with their bouncer
credentials, allow them to issue more SASL auths which will be
redirected to the upstream network. This allows downstream clients
to provide UIs to login to transparently login to upstream networks.
2021-11-21 16:10:54 +01:00
Simon Ser
c2a5461cb8
Use RPL_LOGGEDIN/OUT to mirror upstream status
...
This will allow clients to properly show/hide UI to login and
register.
2021-11-19 19:21:48 +01:00
Simon Ser
c6f5508765
Add missing account-notify to permanentUpstreamCaps
2021-11-19 11:55:22 +01:00
Simon Ser
5a5c93a756
Add message counter metrics
2021-11-17 15:58:19 +01:00
Simon Ser
55840312b4
Add per-user IP addresses
...
The new upstream-user-ip directive allows bouncer operators to
assign one IP address per user.
2021-11-17 15:07:58 +01:00