3
0
mirror of https://github.com/ergochat/ergo.git synced 2025-08-02 10:47:31 +02:00

Compare commits

...

4864 Commits

Author SHA1 Message Date
Shivaram Lingamneni
65295cbafa
Merge pull request #2283 from slingamn/makefile
refactor makefile to label individual targets phony
2025-06-26 22:17:06 -04:00
Shivaram Lingamneni
f0b1f34da7 refactor makefile to label individual targets phony 2025-06-26 22:14:19 -04:00
Shivaram Lingamneni
f918e28513 bump irctest 2025-06-26 01:31:51 -04:00
Shivaram Lingamneni
8798676ae9
update metadata corresponding to spec edits (#2282)
* spec update: metadata keys are lowercase

* add batch parameter to metadata batches

* fix: connecting clients receive METADATA, not RPL_KEYVALUE

* spec update: send RPL_METADATASUBS in a metadata-subs batch

* move some helpers

* bump irctest to forked hash

This is https://github.com/progval/irctest/pull/314 but I don't want to
couple the merges

* fix: empty value is valid

* fix: deleting a nonexistent key gets a FAIL
2025-06-22 18:59:42 -04:00
Shivaram Lingamneni
cca400de73 fix: actually broadcast prereg updates to subscribers
Missed in #2281, needs a test presumably :-)
2025-06-22 13:59:36 -04:00
Shivaram Lingamneni
73e51333ad
implement metadata before-connect (#2281)
* metadata spec update: disallow colon entirely

* refactor key validation

* implement metadata before-connect

* play the metadata in reg burst to all clients with the cap

* bump irctest

* remove all case normalization for keys

From spec discussion, we will most likely either require keys to be lowercase,
or else treat them as case-opaque, similar to message tag keys.
2025-06-22 13:57:46 -04:00
Shivaram Lingamneni
a5e435a26b bump irctest 2025-06-21 22:04:33 -04:00
Shivaram Lingamneni
17ed01c1ed
Merge pull request #2279 from slingamn/doc
fix some documentation
2025-06-19 13:29:08 -04:00
Shivaram Lingamneni
8f18454e8f fix help string for HISTORY 2025-06-19 13:25:34 -04:00
Shivaram Lingamneni
23844d4103 update documentation for globalUtf8EnforcementSetting 2025-06-19 13:22:07 -04:00
Shivaram Lingamneni
3b7db7fff7
round 1 of follow-up for metadata (#2277)
* refactoring
* send an empty batch if necessary, as per spec
* don't broadcast no-op updates
* don't trim spaces before validating the key
* bump irctest to cover metadata
* replay existing metadata to reattaching always-on clients
* use canonicalized name everywhere
* use utils.SafeErrorParam in FAIL lines
* validate key names for sub
* fix error for METADATA CLEAR
* max-keys is enforced for channels as well
* remove unlimited configurations
* maintain the limit exactly without off-by-one cases
* add final channel registration check
2025-06-18 00:22:49 -04:00
thatcher-gaming
4dcbc48159
metadata-2 (#2273)
Initial implementation of draft/metadata-2
2025-06-15 04:06:45 -04:00
Shivaram Lingamneni
0f5603eca2 bump irctest to upstream master 2025-06-09 02:20:49 -04:00
Shivaram Lingamneni
7d4f5e4adf
Merge pull request #2271 from slingamn/register
fix #2270
2025-06-09 02:19:55 -04:00
Shivaram Lingamneni
16568c5ab7 fix #2270
REGISTER should strip the guest format when applicable, same as NS REGISTER.
2025-06-08 16:50:34 -04:00
Shivaram Lingamneni
9a186f8e54
Fix invalid FAIL codes in REGISTER (#2269)
* nickserv.go: Update FAIL codes to match spec

* handlers.go: Fix FAIL code

* use ACCOUNT_EXISTS for errNameReserved

* bump irctest to development version

---------

Co-authored-by: Valerie Liu <79415174+ValwareIRC@users.noreply.github.com>
2025-06-08 01:43:43 -04:00
Shivaram Lingamneni
7828218bc7
Merge pull request #2264 from slingamn/cutprefix
fix #2147
2025-05-26 01:56:06 -04:00
Shivaram Lingamneni
7138e76151 fix #2147
use strings.CutPrefix when possible
2025-05-25 01:59:55 -04:00
Sarah Rose
e4aac56bda
API enhancements (#2261)
Fixes #2257 and #2260

* add `/v1/status` endpoint
* add `/v1/account_list` endpoint
* add fields to `/v1/account_details` response
2025-05-25 00:47:20 -04:00
Shivaram Lingamneni
4da6511674
Merge pull request #2262 from slingamn/constant
clean up constant redefinition
2025-05-23 00:36:46 -04:00
Shivaram Lingamneni
253972a9d2 clean up constant redefinition 2025-05-23 00:18:36 -04:00
Shivaram Lingamneni
a1c46a4be7 clarify channel registration instructions 2025-05-19 00:02:04 -04:00
Shivaram Lingamneni
7718081440
Merge pull request #2258 from slingamn/deps
upgrade dependencies for 2.17 release cycle
2025-05-18 02:07:40 -04:00
Shivaram Lingamneni
e7501ef847 upgrade go-msgauth 2025-05-18 01:28:48 -04:00
Shivaram Lingamneni
e404942d83 upgrade x dependencies 2025-05-18 01:27:52 -04:00
Shivaram Lingamneni
0a947115d6 set up new development version 2025-05-18 01:15:11 -04:00
Shivaram Lingamneni
9b9c39ddd4 changelog entry for API config 2025-05-18 01:09:13 -04:00
Shivaram Lingamneni
e200e9fd8f bump version and changelog for v2.16.0 2025-05-18 00:37:21 -04:00
Shivaram Lingamneni
66a7a488b7
bump version and changelog for v2.16.0-rc1 (#2255) 2025-05-11 01:07:13 -04:00
Shivaram Lingamneni
28ed16261c
Merge pull request #2254 from ergochat/shivaram_alwaysonbug.1
fix #2252
2025-05-08 00:14:51 -04:00
Shivaram Lingamneni
686ce4d5b2 fix #2252
Fix SAREGISTER creating always-on clients with no user modes.

Also fix UNREGISTER/ERASE not deleting the stored push subscriptions.
2025-05-07 22:09:08 -04:00
Shivaram Lingamneni
808799b100
Merge pull request #2253 from slingamn/batchname
fix isupport batch name
2025-05-01 22:18:08 -04:00
Shivaram Lingamneni
e382036ddb fix isupport batch name 2025-05-01 14:43:06 -04:00
Shivaram Lingamneni
43fe72f83e
clean up redundant caching (#2251) 2025-04-28 00:52:40 -04:00
Shivaram Lingamneni
4ab1a10eec clean up redundant caching 2025-04-28 00:29:40 -04:00
Shivaram Lingamneni
54b17b0700
improve robustness of timestamp parsing (#2250)
* Clamp CHATHISTORY timestamp selectors to be in [0, MaxInt64]
* Convert everything to UTC up front (probably a no-op)
2025-04-24 23:37:48 -04:00
Shivaram Lingamneni
2cf569c5d9
Merge pull request #2249 from slingamn/targetspanic
validate that CHATHISTORY limit parameters are nonnegative
2025-04-24 23:37:32 -04:00
Shivaram Lingamneni
a4194c38d8 validate that CHATHISTORY limit parameters are nonnegative
See #2248. Reported by @prdes
2025-04-24 12:33:53 -04:00
Shivaram Lingamneni
5bab190d33
fix #2244 (#2247)
Fix #2244

Produce an explicit error on receiving the UTF-8 BOM
2025-04-21 22:37:53 -04:00
Shivaram Lingamneni
68cee9e2cd
use emersion/go-msgauth for DKIM (#2242)
Fixes #1041 (support ed25519-sha256 for DKIM)
2025-04-07 00:24:08 -04:00
Shivaram Lingamneni
9c3173f573
safer 005 length limits (#2241)
* Limit the payload to 380 bytes instead of 400
* Don't translate the final parameter

This leaves about 60 bytes for the server name.
2025-04-06 02:59:03 -04:00
Shivaram Lingamneni
98e04c10a8
fix #2220 (#2240)
Allow publishing arbitrary ISUPPORT via the config file
2025-04-06 01:41:03 -04:00
Shivaram Lingamneni
a6df370bd9
block HTTP DoS attacks (#2239)
Block uses of the JS Fetch API to send HTTP message bodies that are also valid
IRC. The constraint on such messages is that they must begin with a valid HTTP
verb; we can detect this and reject them immediately.
2025-03-30 21:33:06 -04:00
Shivaram Lingamneni
9791606f62
allow customizing the NPC and SCENE nickmasks (#2237)
See #2229
2025-03-30 21:32:55 -04:00
Shivaram Lingamneni
7256d83ff0
implement command aliases (#2236)
See #2229
2025-03-30 21:32:37 -04:00
Shivaram Lingamneni
f5bb5afdd6
bump CI to noble (#2235) 2025-03-30 02:48:51 -04:00
Shivaram Lingamneni
d3eb787a1e bump irctest 2025-03-27 05:20:22 -04:00
Shivaram Lingamneni
19dbe10c99
fix panic on KILL (#2234)
Introduced by #2218, reported by knolle
2025-03-26 21:21:05 -04:00
Shivaram Lingamneni
467df24914
fix #2228 (#2233)
If the server is UTF8ONLY, validate that the MOTD is UTF8
2025-03-22 23:13:31 -04:00
Shivaram Lingamneni
9dc2fd52ed
Merge pull request #2232 from ergochat/dependabot/go_modules/github.com/golang-jwt/jwt/v5-5.2.2
Bump github.com/golang-jwt/jwt/v5 from 5.2.1 to 5.2.2
2025-03-22 20:52:14 -04:00
dependabot[bot]
a46732f6ab
Bump github.com/golang-jwt/jwt/v5 from 5.2.1 to 5.2.2
Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.2.1 to 5.2.2.
- [Release notes](https://github.com/golang-jwt/jwt/releases)
- [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md)
- [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.1...v5.2.2)

---
updated-dependencies:
- dependency-name: github.com/golang-jwt/jwt/v5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 22:14:08 +00:00
Shivaram Lingamneni
ea81ec86e1
MVP for HTTP API (#2231)
Co-authored-by: Klaas Tammling <klaas@tammling.hamburg>
2025-03-18 23:13:03 -04:00
Shivaram Lingamneni
4bcd008416
fix CHATHISTORY TARGETS from MySQL backend using server local TZ (#2224)
time.Unix() returns a time.Time with the Location populated to the server's
timezone. Such times will format incorrectly with IRCv3TimestampFormat unless
they are manually converted to UTC.
2025-03-17 02:22:25 -04:00
Shivaram Lingamneni
aed216a62e update filenames in docker documentation 2025-03-16 16:18:16 -04:00
Shivaram Lingamneni
f3e24c7bdb
Merge pull request #2223 from slingamn/saferate
add SAFERATE to 005
2025-03-09 21:41:24 -04:00
Shivaram Lingamneni
23b65e225b add SAFERATE to 005
See discussion at https://github.com/ircv3/ircv3-specifications/pull/556
2025-03-06 13:30:17 -05:00
Shivaram Lingamneni
4ced4ef328
Merge pull request #2219 from slingamn/quit_tags
fix #2218
2025-02-16 02:20:13 -05:00
Shivaram Lingamneni
ec3417be79 fix #2218
The client's own QUIT line should respect server-time
2025-02-16 01:33:24 -05:00
Shivaram Lingamneni
7e18362d35
upgrade to go 1.24 (#2217) 2025-02-12 21:15:21 -05:00
Shivaram Lingamneni
eb84ede5f7
Merge pull request #2216 from slingamn/redact
fix #2215
2025-02-06 01:39:32 -05:00
Shivaram Lingamneni
d50f1471eb fix #2215
Hide the message-redaction capability if allow-individual-delete is disabled.
(Technically REDACT can still be used, but only by ircops, so advertising it
is misleading in the most common case).
2025-02-06 01:36:02 -05:00
Shivaram Lingamneni
d9f663c400
Merge pull request #2214 from slingamn/logline.2
minor refactoring
2025-02-06 00:21:15 -05:00
Shivaram Lingamneni
e1b5a05c27 refactor service help sorting 2025-02-05 00:47:23 -05:00
Shivaram Lingamneni
a850602bcc refactor 005 token generation 2025-02-05 00:47:23 -05:00
Shivaram Lingamneni
d1126b53eb return constant strings in 004/005 2025-02-05 00:47:23 -05:00
Shivaram Lingamneni
4851825d4f use slices.SortFunc for modes 2025-02-05 00:47:23 -05:00
Shivaram Lingamneni
8fa6e19c2e fix #2213
We intended to suppress 324 and 329 when there is no valid mode change, only
unknown modes. Fix these checks.
2025-02-03 21:35:51 -05:00
Shivaram Lingamneni
07669f9eb4 remove hashset from mode parsing 2025-02-03 21:29:34 -05:00
Shivaram Lingamneni
4dfb7cc7ae use slices.Contains in irc/modes 2025-02-03 21:29:34 -05:00
Shivaram Lingamneni
b6a8cc20c2 add conn ID to SASL auth logline 2025-02-03 21:29:34 -05:00
Shivaram Lingamneni
cf7db4bc2a
Merge pull request #2212 from slingamn/deps
upgrade dependencies for v2.16 release cycle
2025-01-26 13:07:34 -05:00
Shivaram Lingamneni
b6f6959acc upgrade buntdb 2025-01-26 04:17:34 -05:00
Shivaram Lingamneni
af124cd964 upgrade x dependencies 2025-01-26 00:58:13 -05:00
Shivaram Lingamneni
e60afda556 set up new development version 2025-01-26 00:55:31 -05:00
Shivaram Lingamneni
c92f23b0cb bump version and changelog for v2.15.0 2025-01-25 22:55:19 -05:00
Shivaram Lingamneni
656eea43e7 add more warnings about push notifications and tor 2025-01-25 18:25:59 -05:00
Shivaram Lingamneni
881f403164 bump webpush-go to release version 2025-01-16 01:04:37 -05:00
Shivaram Lingamneni
b38ca31ced
Merge pull request #2211 from slingamn/pushsync
fix buggy persistence of push timestamps
2025-01-15 21:22:57 -08:00
Shivaram Lingamneni
7b71839615 fix buggy persistence of push timestamps
getPushSubscriptions() could have a stale view of the latest subscription
renewal and successful push times. We don't want to rebuild on every renewal
or every push, so add a boolean refresh argument that controls rebuilding.
2025-01-16 00:06:11 -05:00
Shivaram Lingamneni
9dd7a2bbcb
Merge pull request #2200 from slingamn/download_url
fix download link
2025-01-15 20:50:01 -08:00
Shivaram Lingamneni
148d743eb1 update changelog 2025-01-15 23:27:33 -05:00
Shivaram Lingamneni
2a79f64f2d
Merge pull request #2210 from slingamn/rearrange
tweaks to logging and NS PUSH LIST
2025-01-15 20:22:23 -08:00
Shivaram Lingamneni
799e1b14f4 delete services debug line 2025-01-15 22:12:40 -05:00
Shivaram Lingamneni
2163d96348 add connID to another logline 2025-01-15 22:12:40 -05:00
Shivaram Lingamneni
e520ba7e0e list push subscription times as well 2025-01-15 22:12:40 -05:00
Shivaram Lingamneni
92e2aa987e move debug log ID within NS CLIENTS LIST output 2025-01-15 22:12:40 -05:00
Shivaram Lingamneni
ab2d842b27
changelog and version updates for v2.15.0-rc1 (#2209) 2025-01-13 22:57:04 -05:00
Shivaram Lingamneni
21ee867ebb
fix #2198 (#2199)
Add require-sasl support to KLINE / UBAN on NUH masks
2025-01-13 22:20:47 -05:00
Shivaram Lingamneni
36e5451aa5
implement draft/webpush (#2205) 2025-01-13 21:47:21 -05:00
Shivaram Lingamneni
efd3764337
add unique connection ID to debug logs (#2207)
Fixes #2206
2025-01-11 23:07:04 -05:00
Shivaram Lingamneni
375079e636
Merge pull request #2201 from donatj/patch-1
Improve Docker "Persisting Data" Section
2024-12-19 01:26:23 +01:00
Jesse Donat
38862b0529
Improve Docker "Persisting Data" Section
`pwd` is case sensitive on linux
Add missing `--name ergo`
2024-12-18 09:23:48 -06:00
Shivaram Lingamneni
2bb9980e56 fix download link 2024-12-11 22:50:24 -05:00
Shivaram Lingamneni
1bdc45ebb4
clarify role of database file (#2190) 2024-11-17 15:21:06 -05:00
Shivaram Lingamneni
eddd4cc723
fix incorrect batch parameter in draft/extended-isupport (#2197) 2024-10-26 22:11:20 -04:00
Shivaram Lingamneni
726d997d07
advertise SAFELIST (#2196)
LIST is implemented via blocking (*ResponseBuffer).Send, so it can never
exceed the sendq limit.
2024-10-06 12:11:34 -04:00
Shivaram Lingamneni
9577e87d9a
bump irc-go to v0.5.0-rc2 (#2194) 2024-09-27 00:42:09 -04:00
Shivaram Lingamneni
7586520032
implement draft/extended-isupport (#2184) 2024-09-27 00:40:56 -04:00
Shivaram Lingamneni
f68d32b4ee
remove GCStats.Pause initialization (#2189)
It's too small anyway so the runtime has to reallocate it.
2024-09-08 01:48:47 -04:00
Shivaram Lingamneni
796bc198ed
upgrade go to 1.23 (#2187) 2024-08-15 23:50:27 -04:00
Shivaram Lingamneni
df6aa4c34b
enable building for solaris (#2183) 2024-08-02 15:09:28 -04:00
Shivaram Lingamneni
30f47a9b22 bump irctest 2024-07-07 02:34:51 -04:00
Shivaram Lingamneni
92a23229f8
update to goreleaser v2 (#2169)
* update goreleaser config:

* --rm-dist is replaced by --clean
* `replacements` is removed:
   https://goreleaser.com/deprecations/#archivesreplacements

* update to goreleaser v2

* goreleaser version must be specified in .goreleaser.yml
* --skip-publish is replaced by --skip=publish
2024-07-05 17:18:08 -04:00
Shivaram Lingamneni
825b4298b8
Merge pull request #2175 from slingamn/deps.1
upgrade dependencies for new release cycle
2024-07-05 23:15:16 +02:00
Shivaram Lingamneni
eba6d532ea go mod tidy 2024-07-05 16:40:07 -04:00
Shivaram Lingamneni
7d3971835e upgrade x dependencies 2024-07-05 16:39:22 -04:00
Shivaram Lingamneni
99393d49bf upgrade golang-jwt 2024-07-05 16:37:44 -04:00
Shivaram Lingamneni
82c50cc497 upgrade buntdb 2024-07-05 16:36:53 -04:00
Shivaram Lingamneni
ce41f501c9 set up new development version 2024-07-01 01:07:21 -04:00
Shivaram Lingamneni
d25fc2a758 bump version and changelog for v2.14.0 2024-06-30 23:36:28 -04:00
Shivaram Lingamneni
f598da300d
add linux/riscv64 release (#2173)
* add riscv64 release

* undo Alpine upgrade

* exclude *bsd/riscv64 releases

---------

Co-authored-by: Meng Zhuo <mzh@golangcn.org>
2024-06-20 23:55:20 -04:00
Shivaram Lingamneni
bb6c7ee158
Merge pull request #2171 from slingamn/rc2
bump version and changelog for v2.14.0-rc2
2024-06-16 10:51:20 +02:00
Shivaram Lingamneni
958eb43393 bump version and changelog for v2.14.0-rc2 2024-06-16 04:40:00 -04:00
Shivaram Lingamneni
9b8562c211
Merge pull request #2170 from slingamn/validate.1
fix truncation check
2024-06-11 23:17:35 +02:00
Shivaram Lingamneni
2bb0a9c8e3 bump irctest to fork's master 2024-06-11 17:06:58 -04:00
Shivaram Lingamneni
0b333c7e72 fix truncation check
* The message target was not being counted :-(
* The additional character added to the target by STATUSMSG was not counted
2024-06-11 01:42:57 -04:00
Shivaram Lingamneni
2aec5e167c
Merge pull request #2168 from slingamn/fix_defaultconfig
don't require a config file for defaultconfig
2024-06-09 09:25:19 +02:00
Shivaram Lingamneni
3127353b84 don't require a config file for defaultconfig 2024-06-09 03:20:33 -04:00
Shivaram Lingamneni
654381071b
update version and changelog for v2.14.0-rc1 (#2164)
* changelog for v2.14.0-rc1

* bump version string for rc1

* bump irctest
2024-06-09 03:11:33 -04:00
Shivaram Lingamneni
71671405f3
Merge pull request #2167 from slingamn/lowerlimit
lower recommended ban list limit to 100
2024-06-09 06:08:04 +02:00
Shivaram Lingamneni
aa6be594b9 lower recommended ban list limit to 100
Insp and Libera use 100, seems a bit safer
2024-06-09 00:04:54 -04:00
Shivaram Lingamneni
6326982767
Merge pull request #2165 from slingamn/banlimit
fix #2081
2024-06-04 05:53:47 +02:00
Shivaram Lingamneni
0517b5571d fix #2081
Increase default/recommended mask list size limit to 150;
SAMODE overrides enforcement of the limit.
2024-06-03 23:39:08 -04:00
Shivaram Lingamneni
1117680fdd
clean up RPL_CHANNELMODEIS logic (#2163)
Don't send RPL_CHANNELMODEIS for no-op changes to channel-user modes
2024-06-03 23:28:08 -04:00
Shivaram Lingamneni
f44d902ce3
Merge pull request #2162 from slingamn/issue2043
fix #2043
2024-06-03 00:46:57 +02:00
Shivaram Lingamneni
7318e48629 fix #2043
Add human-readable description parameters to multiline fail messages,
since they are technically required by the standard-replies spec
(although the utility of showing them to users is dubious)
2024-06-02 03:34:11 -04:00
Shivaram Lingamneni
60f7d1122d
Merge pull request #2161 from slingamn/logerror
fix #2141
2024-05-29 08:25:42 +02:00
Shivaram Lingamneni
289b78d2fd fix #2141
Log errors from attempting to delete a unix domain socket path
2024-05-29 02:24:08 -04:00
Shivaram Lingamneni
ad0149be5e
Merge pull request #2160 from slingamn/embed
fix #2157
2024-05-29 08:04:25 +02:00
Shivaram Lingamneni
d81494ac09
Merge pull request #2159 from ergochat/casefolding.2
fix #2099
2024-05-29 08:04:14 +02:00
Shivaram Lingamneni
54ca659e57
Merge pull request #2158 from slingamn/ircv3bearer.2
remove draft/bearer in favor of IRCV3BEARER
2024-05-29 08:00:07 +02:00
Shivaram Lingamneni
794b4a2483 allow null bytes in bearer tokens
(Haven't decided what to do at the spec level yet)
2024-05-29 01:54:12 -04:00
Shivaram Lingamneni
af521c844f fix #2157
Embed a copy of the ergo default config in the binary;
add `ergo defaultconfig` to print it to stdout
2024-05-27 23:08:11 -04:00
Shivaram Lingamneni
7772b55cab fix #2099
Add optional support for rfc1459 and rfc1459-strict casemappings
2024-05-27 22:16:20 -04:00
Shivaram Lingamneni
ed683bff79 remove draft/bearer in favor of IRCV3BEARER 2024-05-27 20:40:04 -04:00
Shivaram Lingamneni
5ee32cda1c
Merge pull request #2156 from slingamn/throttle.1
fix login throttle handling
2024-05-28 02:25:11 +02:00
Shivaram Lingamneni
218f6f2454 fix login throttle handling
We were checking the login throttle at the beginning of every SASL
conversation. This had several problems:

1. Pidgin (on Windows?) tries every mechanism in order, regardless of
the CAP advertisement. It would use up the default throttle allowance
trying unsupported mechanisms like CRAM-MD5.
2. The throttle was actually checked twice for AUTHENTICATE PLAIN
(once at the start of the conversation and once in AuthenticateByPassphrase).

The general pattern here is that we should check the throttle every time we
do something "expensive" (bcrypt verification, send a reset email) or
"dangerous" (anything that could lead to a bruteforce attack on passwords).
Therefore, delete the check from the AUTHENTICATE handler, and add one at
the beginning of the SCRAM conversation to replace it.
2024-05-26 05:19:41 -04:00
Shivaram Lingamneni
ca4b9c15c5
Merge pull request #2151 from slingamn/modes_forwardport
fix deadlock on channel state mutex
2024-05-06 08:47:23 +02:00
Shivaram Lingamneni
6abb291290 fix deadlock on channel state mutex 2024-05-06 02:32:40 -04:00
Shivaram Lingamneni
ccc362be84
Merge pull request #2148 from slingamn/i2p
add i2pd b32 address directions
2024-05-06 07:00:19 +02:00
Shivaram Lingamneni
19b9867409 add i2pd b32 address directions
Fixes #1686
2024-05-05 21:18:29 -04:00
Shivaram Lingamneni
f6626ddb6e bump irctest 2024-05-01 11:40:19 -04:00
Shivaram Lingamneni
40ceb4956c
Merge pull request #2145 from slingamn/issue2144
fix #2144
2024-04-15 03:22:19 +02:00
Shivaram Lingamneni
74fa04c5ea
Merge pull request #2143 from slingamn/emailsending.1
fix #2142
2024-04-15 03:22:06 +02:00
Shivaram Lingamneni
15d686c593
Merge pull request #2146 from slingamn/webirc.1
add a config switch to accept hostnames from WEBIRC
2024-04-14 20:46:01 +02:00
Shivaram Lingamneni
f96f918ff1 fix #2144
RPL_NAMREPLY should send = for normal channels and @ for secret channels,
as per Modern docs.
2024-04-13 21:51:59 -04:00
Shivaram Lingamneni
7726160ec7 add a config switch to accept hostnames from WEBIRC
See #1686; this allows i2pd to pass the i2p address to Ergo, which may be
useful for moderation under some circumstances.
2024-04-13 21:43:41 -04:00
Shivaram Lingamneni
b426dd8f93 fix #2142
Allow specifying TCP4 or TCP6 for outgoing email sending, or choosing a
specific local address to send from.
2024-04-07 15:47:01 -04:00
Shivaram Lingamneni
1f4b5248a0
Merge pull request #2140 from slingamn/issue2139
fix #2139
2024-03-29 22:50:22 +01:00
Shivaram Lingamneni
0c804f8ea3 bump irctest 2024-03-29 13:34:52 -04:00
Shivaram Lingamneni
3d2f014d4c fix #2139
Database backup filenames contained a colon character, which is disallowed
on Windows; use period instead
2024-03-29 12:32:42 -04:00
Shivaram Lingamneni
d56e4ea301
Merge pull request #2136 from slingamn/issue2135_nicknameinuse
fix #2135
2024-03-20 10:48:27 -04:00
Shivaram Lingamneni
8d082865da
fix #2133 (#2137)
* fix #2133

Don't record NICK and QUIT in history for invisible auditorium members
2024-03-17 11:42:39 -04:00
Shivaram Lingamneni
837f6ac1a2 fix #2135
Handling of reserved nicknames is special-cased due to #1594, but we want to send
ERR_NICKNAMEINUSE if the nickname is actually in use, since that doesn't pose any
client compatibility problems.
2024-03-11 01:32:39 -04:00
Shivaram Lingamneni
681e8b1292
fix #2129 (#2132)
* fix #2129

Don't print the values of environment variable overrides, just the keys

* fix unit tests
2024-02-25 10:05:36 -05:00
Shivaram Lingamneni
432d4ea860
Merge pull request #2131 from slingamn/issue2130
fix #2130
2024-02-25 03:55:54 -05:00
Shivaram Lingamneni
78f342655d clean up dead code 2024-02-25 03:52:52 -05:00
Shivaram Lingamneni
cab192e2af fix #2130
We load registered channels unconditionally; reloading them again on rehash
is incorrect. This caused buggy behavior when channel registration was
disabled in the config, but some registered channels were already loaded.
2024-02-25 03:34:21 -05:00
Matt Hamilton
c67835ce5c
Gracefully handle NS cert add myself <fp> (#2128)
* Gracefully handle NS cert add myself <fp>

A non-operator with the nick "mynick" attempts to register
a fingerprint to their authenticated account.

They /msg NickServ cert add mynick <fingerprint>

NickServ responds with "Insufficient privileges" because
they've accidentally invoked the operator syntax (to action
other accounts).

This patch allows the user to add the fingerprint if the client's
account is identical to the target account.

Signed-off-by: Matt Hamilton <m@tthamilton.com>

* Update nickserv.go

Compare the case-normalized target to Account()

---------

Signed-off-by: Matt Hamilton <m@tthamilton.com>
Co-authored-by: Shivaram Lingamneni <slingamn@cs.stanford.edu>
2024-02-14 09:56:37 -05:00
Shivaram Lingamneni
7afd6dbc74 bearer: close open jwt key files 2024-02-13 21:32:37 -05:00
Shivaram Lingamneni
ee7f818674
implement SASL OAUTHBEARER and draft/bearer (#2122)
* implement SASL OAUTHBEARER and draft/bearer
* Upgrade JWT lib
* Fix an edge case in SASL EXTERNAL
* Accept longer SASL responses
* review fix: allow multiple token definitions
* enhance tests
* use SASL utilities from irc-go
* test expired tokens
2024-02-13 18:58:32 -05:00
Shivaram Lingamneni
8475b62da4 bump irctest 2024-02-12 23:43:28 -05:00
Shivaram Lingamneni
52d15a483c
Merge pull request #2127 from slingamn/isupport_thirteen
pull out max parameters constant in isupport impl
2024-02-12 23:40:54 -05:00
Shivaram Lingamneni
f691b8c058 pull out max parameters constant in isupport impl 2024-02-11 12:38:49 -05:00
Shivaram Lingamneni
6b7bfe0c09 set up new development version 2024-02-11 00:12:22 -05:00
Shivaram Lingamneni
2098cc9f2b
Merge pull request #2126 from slingamn/go122
upgrade to go 1.22
2024-02-11 00:02:28 -05:00
Shivaram Lingamneni
4b9aa725cb upgrade to go 1.22 2024-02-10 23:46:34 -05:00
Shivaram Lingamneni
24ac3b68b4
Merge pull request #2124 from slingamn/realnamelimit
fix #2123
2024-02-10 23:25:31 -05:00
Shivaram Lingamneni
0918564edc bump irctest 2024-02-08 00:46:26 -05:00
Shivaram Lingamneni
921651f664 fix #2123
Add a configurable limit on realname length
2024-02-08 00:03:12 -05:00
Shivaram Lingamneni
d97e964b35 v2.13.0: fix go release version in changelog 2024-01-14 17:42:34 -05:00
Shivaram Lingamneni
010875ec9a bump version and changelog for v2.13.0 2024-01-14 17:40:50 -05:00
Neale Pickett
7b525f8899
Add caddy reverse proxy websocket example (#2119)
* Add caddy reverse proxy websocket example

* Use consistent hostname for caddy reverse proxy
2024-01-12 13:30:53 -05:00
Neale Pickett
3839f8ae60
Explain reverse proxy setup for websockets (#2121)
* Explain reverse proxy setup for websockets

* Update MANUAL.md

Clarify that we only support `X-Forwarded-For`

---------

Co-authored-by: Shivaram Lingamneni <slingamn@cs.stanford.edu>
2024-01-11 23:20:26 -05:00
Shivaram Lingamneni
4e574b99f3 fix changelog typo 2024-01-07 01:07:36 -05:00
Shivaram Lingamneni
9d388d8cdb
Merge pull request #2118 from slingamn/changelog
bump version and changelog for 2.13.0-rc1
2024-01-07 00:42:46 -05:00
Shivaram Lingamneni
24cf5fac45 fix #2101 2024-01-07 00:38:10 -05:00
Shivaram Lingamneni
d238eaac67 bump version and changelog for 2.13.0-rc1 2024-01-07 00:30:39 -05:00
Shivaram Lingamneni
0f059ea2cc
Merge pull request #2117 from slingamn/handlepanic
add panic handler to async client/channel writes
2024-01-05 00:21:23 -05:00
Shivaram Lingamneni
dfe2a21b17 add panic handler to async client/channel writes
See #2113 for motivation
2024-01-05 00:18:46 -05:00
Shivaram Lingamneni
1d8bbde95c
Merge pull request #2115 from slingamn/issue2114_relaymsg
fix #2114
2024-01-04 01:03:57 -05:00
Shivaram Lingamneni
580fc7096d fix #2114
Channels with slashes (or other relaymsg separators) in their names
were being falsely detected as relaymsg identifiers.
2024-01-04 01:02:10 -05:00
Shivaram Lingamneni
15c074078a
Merge pull request #2116 from slingamn/issue2113_panic
fix #2113
2024-01-04 01:01:43 -05:00
Shivaram Lingamneni
4aa1aa371d fix #2113
Persisting always-on clients was panicking if client X believed it was
a member of channel Y, but channel Y didn't have a record of client X.
2024-01-03 10:52:34 -05:00
Shivaram Lingamneni
a4d160b76d bump irctest 2023-12-24 05:14:00 -05:00
Shivaram Lingamneni
430387dec6 bump irctest 2023-12-21 12:33:54 -05:00
Shivaram Lingamneni
ce162e9279
fix #2109 (#2111)
Remove numerics associated with the retired ACC spec
2023-12-21 01:10:50 -05:00
Shivaram Lingamneni
97d6f9eddb
Merge pull request #2110 from slingamn/msgid
fix #2108
2023-12-21 01:10:24 -05:00
Shivaram Lingamneni
6be1ec3ad6
Merge pull request #2107 from ergochat/dependabot/go_modules/golang.org/x/crypto-0.17.0
Bump golang.org/x/crypto from 0.5.0 to 0.17.0
2023-12-21 01:09:32 -05:00
dependabot[bot]
16ab0a67b5
Bump golang.org/x/crypto from 0.5.0 to 0.17.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.5.0 to 0.17.0.
- [Commits](https://github.com/golang/crypto/compare/v0.5.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-21 04:32:32 +00:00
Shivaram Lingamneni
cc1c491afe
Merge pull request #2112 from slingamn/testvector
include a fixed test vector in password tests
2023-12-20 23:30:40 -05:00
Shivaram Lingamneni
8d80cb52e6 include a fixed test vector in password tests 2023-12-20 23:28:55 -05:00
Shivaram Lingamneni
e11bda643e fix #2108
Send Message-ID even if DKIM is not enabled, for compatibility with Gmail:

* A workaround for Ergo 2.12.0 is to enable DKIM
* You need to enable either DKIM or SPF (preferably both) to send to Gmail anyway
* You also need forward-confirmed reverse DNS, which can be tricky for IPv6...
2023-12-20 22:18:48 -05:00
Shivaram Lingamneni
b1a0e7cc5c
bump docker base image to alpine 3.19 (#2104)
* bump docker base image to alpine 3.19

Fixes #2103
2023-12-17 23:20:55 -08:00
Shivaram Lingamneni
2d44ab1cbf
Merge pull request #2100 from slingamn/dockercomposeinit
add `init: true` to docker-compose.yml
2023-11-15 07:45:39 -08:00
Shivaram Lingamneni
3102babec8 add init: true to docker-compose.yml
Follows up from #2096, #2097
2023-11-15 10:32:56 -05:00
Shivaram Lingamneni
a5af245102
add --init to suggested docker run invocations (#2097)
* add --init to suggested docker run invocations

See #2096; this should fix unreaped zombies when using an auth-script or
ip-check-script that spawns its own subprocesses, then exits before reaping
them.

* add a note on why --init
2023-11-15 00:19:32 -05:00
Shivaram Lingamneni
4fabeed895 bump irctest 2023-11-11 18:37:04 -05:00
Shivaram Lingamneni
5671ee2a36 set up new development version 2023-10-11 11:20:45 -04:00
Shivaram Lingamneni
4d9e80fe5b bump version and changelog for v2.12.0 2023-10-10 22:11:15 -04:00
Shivaram Lingamneni
7b3778989e fix ergo invocation in readme 2023-09-28 14:03:12 -04:00
Shivaram Lingamneni
e3bcb9b8a0 fix ergo invocation in readme 2023-09-28 13:56:47 -04:00
Shivaram Lingamneni
70dfe9f594
Merge pull request #2094 from slingamn/bump_irctest
bump irctest
2023-09-24 12:05:38 -07:00
Shivaram Lingamneni
70a98ac2f1 upgrade CI image to jammy 2023-09-24 13:22:46 -04:00
Shivaram Lingamneni
046ef8ce94 bump irctest 2023-09-24 13:19:59 -04:00
Shivaram Lingamneni
baf5a8465d changelog entry for #2092 2023-09-24 10:48:27 -04:00
Shivaram Lingamneni
b33e1051f7
Merge pull request #2092 from progval/patch-5
Fix typo in ACCOUNT_NAME_MUST_BE_NICK code
2023-09-24 07:34:28 -07:00
Val Lorentz
ddb804b622
Fix typo in ACCOUNT_NAME_MUST_BE_NICK code 2023-09-24 14:16:49 +02:00
Shivaram Lingamneni
3ec7f0e5cc clarify address-blacklist syntax 2023-09-18 19:46:39 -04:00
Shivaram Lingamneni
48d139a532 bump irctest 2023-09-18 19:46:38 -04:00
Shivaram Lingamneni
556bcba465 bump irctest 2023-09-17 23:46:15 -04:00
Shivaram Lingamneni
20bfb285f0 changelog tweaks 2023-09-17 23:40:52 -04:00
Shivaram Lingamneni
29b4be83bc bump version for v2.12.0-rc1 2023-09-17 23:07:54 -04:00
Shivaram Lingamneni
399b0b3f39
changelog for v2.12.0-rc1 (#2090)
* changelog for v2.12.0-rc1

* bump date
2023-09-17 23:04:34 -04:00
Shivaram Lingamneni
e7597876d9
Merge pull request #2089 from slingamn/ident
upgrade go-ident
2023-09-11 22:44:31 -07:00
Shivaram Lingamneni
3bd3c6a88a upgrade go-ident
Fixes a socket leak (that doesn't seem to be affecting tilde.town?)
2023-09-12 01:39:49 -04:00
Shivaram Lingamneni
2013beb7c8
fix #1997 (#2088)
* Fix #1997 (allow the use of an external file for the email blacklist)
* Change config key names for blacklist (compatibility break)
* Accept globs rather than regexes for blacklist by default
* Blacklist comparison is now case-insensitive
2023-09-12 01:06:55 -04:00
Simon
6b386ce2ac Update MANUAL.md for Debian 12 syntax. 2023-09-10 01:52:38 -04:00
Shivaram Lingamneni
ee22bda09c
Merge pull request #2086 from slingamn/dockerio
explicit docker.io in Dockerfile
2023-09-09 21:35:58 -07:00
Shivaram Lingamneni
202de687df explicit docker.io in Dockerfile
See #2082
2023-09-10 00:13:48 -04:00
Shivaram Lingamneni
4b00c6c48e bump irctest 2023-09-05 03:07:35 -04:00
Shivaram Lingamneni
8ac488a1ff bump irctest 2023-08-28 13:17:42 -04:00
Shivaram Lingamneni
f07707dfbc
Merge pull request #2083 from slingamn/nonames.2
implement draft/no-implicit-names
2023-08-16 08:47:05 -07:00
Shivaram Lingamneni
3b3e8c0004
Merge pull request #2084 from slingamn/go_upgrade_121
bump go to v1.21
2023-08-16 08:46:34 -07:00
Shivaram Lingamneni
f77d430d25 use maps.Clone from go1.21 2023-08-15 20:57:52 -04:00
Shivaram Lingamneni
28d9a7ff63 use slices.Contains from go1.21 2023-08-15 20:55:09 -04:00
Shivaram Lingamneni
b3abd0bf1d use slices.Reverse from go1.21 2023-08-15 20:45:00 -04:00
Shivaram Lingamneni
cc873efd0f bump go to v1.21 2023-08-15 20:37:58 -04:00
Shivaram Lingamneni
3f74612e2b implement draft/no-implicit-names 2023-08-15 20:29:57 -04:00
Shivaram Lingamneni
24ba72cfd6 bump irctest 2023-08-11 17:18:57 -04:00
Shivaram Lingamneni
17b21c8521
Merge pull request #2079 from slingamn/autojoin.1
add channel autojoin feature
2023-07-16 10:12:19 -07:00
Shivaram Lingamneni
75bd63d0bc add channel autojoin feature
See discussion on #2077
2023-07-04 21:44:18 -04:00
Shivaram Lingamneni
3c4f83cf6e
Merge pull request #2078 from tacerus/apparmor
Import AppArmor profile
2023-07-02 08:16:08 -07:00
67d10bc63b
Import AppArmor profile
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
2023-07-02 00:07:59 +02:00
Shivaram Lingamneni
6d642bfe93
Merge pull request #2074 from slingamn/ircgo_upgrade
upgrade to irc-go v0.4.0
2023-06-13 23:53:52 -07:00
Shivaram Lingamneni
ad3ad97047 upgrade to irc-go v0.4.0 2023-06-14 02:46:14 -04:00
Shivaram Lingamneni
d14ff9b3d5
Merge pull request #2073 from slingamn/issue2013.1
fix #2013
2023-06-08 07:06:44 -07:00
Shivaram Lingamneni
dfe84bc1c2 bump irctest 2023-06-05 04:22:40 -04:00
Shivaram Lingamneni
0f39fde647 remove insecure reattach check
See #2013; given that plaintext is deprecated now, it seems like there is no
added value from continuing to police this.
2023-06-05 04:22:40 -04:00
Shivaram Lingamneni
7d6e48ed2a bump irctest 2023-06-04 03:23:11 -04:00
Shivaram Lingamneni
e4c8f041f2
Merge pull request #2072 from csmith/misc/docker-alpine-upgrade
Dockerfile: `apk upgrade` before `add`
2023-06-02 16:38:51 -07:00
Chris Smith
783b579003 Dockerfile: apk upgrade before add
The base golang image ships with some packages pre-installed,
but they're not necessarily the latest. If we try to add a
package that (transitively) depends on one of the existing ones,
it'll fail if it's expecting a newer version.

To address this, simply `apk upgrade` before trying to `apk add`.

Closes #2071
2023-06-03 00:15:58 +01:00
Shivaram Lingamneni
07cc4f8354
Merge pull request #2070 from slingamn/batchfix
fix incorrect chathistory batch types
2023-06-02 04:00:34 -07:00
Shivaram Lingamneni
f100c1d0fa fix incorrect chathistory batch types
This was introduced in 38a6d17ee5ce6e1096c3dfd6d11f6f35d9a71ca6
2023-06-02 06:56:45 -04:00
Shivaram Lingamneni
2aded271c5
Merge pull request #2069 from slingamn/nestedbatch.1
some cleanups
2023-06-02 00:53:35 -07:00
Shivaram Lingamneni
3d4d8228aa bump irctest 2023-06-02 02:58:32 -04:00
Shivaram Lingamneni
60af8ee491 clean up force-trailing logic 2023-06-02 02:58:09 -04:00
Shivaram Lingamneni
38a6d17ee5 clean up nested batch logic 2023-06-01 06:29:22 -04:00
Shivaram Lingamneni
d082ec7ab9
don't send multiline responses to CAP LS 301 (#2068)
* don't send multiline responses to CAP LS 301

This is more or less explicitly prohibited by the spec:

https://ircv3.net/specs/extensions/capability-negotiation.html#multiline-replies-to-cap-ls-and-cap-list

* switch to whitelist model to be future-proof

* bump irctest to include test

* add a unit test
2023-05-31 23:22:16 -04:00
Shivaram Lingamneni
3e68694760
Merge pull request #2067 from slingamn/issue2066
fix #2066
2023-05-30 23:12:19 -07:00
Val Lorentz
48f8c341d7
Implement draft/message-redaction (#2065)
* Makefile: Add dependencies between targets

* Implement draft/message-redaction for channels

Permission to use REDACT mirrors permission for 'HistServ DELETE'

* Error when the given targetmsg does not exist

* gofmt

* Add CanDelete enum type

* gofmt

* Add support for PMs

* Fix documentation of allow-individual-delete.

* Remove 'TODO: add configurable fallback'

slingamn says it's probably not desirable, and I'm on the fence.
Out of laziness, let's omit it for now, as it's not a regression
compared to '/msg HistServ DELETE'.

* Revert "Makefile: Add dependencies between targets"

This reverts commit 2182b1da69ceaafad30859e45be0645d6c915b2c.

---------

Co-authored-by: Val Lorentz <progval+git+ergo@progval.net>
2023-05-31 01:16:14 -04:00
Shivaram Lingamneni
00cfe98461 fix #2066
CHATHISTORY TARGETS response should not be in a batch unless the client has
explicitly requested the batch cap.
2023-05-29 22:22:01 -04:00
Shivaram Lingamneni
bf33fba33a
Merge pull request #2064 from slingamn/issue2063
fix #2063
2023-05-22 22:27:33 -07:00
Shivaram Lingamneni
0710c7e12a bump irctest to include regression test for #2063 2023-05-23 01:19:36 -04:00
Shivaram Lingamneni
e84793d7ee fix #2063
In #2058 we introduced two bugs:

* A nil dereference when an outside user attempts to speak
* Ordinary copy of a modes.ModeSet (which should only be accessed via atomics)

This fixes both issues.
2023-05-22 12:29:55 -04:00
Shivaram Lingamneni
2c0928f94d
Merge pull request #2061 from slingamn/xterm.1
upgrade to x/term instead of crypto/ssh/terminal
2023-04-19 01:26:05 -07:00
Shivaram Lingamneni
0d8dcbecf6 upgrade to x/term instead of crypto/ssh/terminal
Simplify some of the password hashing logic. This requires a bump of irctest.
2023-04-19 02:58:50 -04:00
Shivaram Lingamneni
eeec481b8d
tweaks to NAMES implementation (#2058)
* tweaks to NAMES implementation

* tweak member caching

* add a benchmark for NAMES
2023-04-14 02:15:56 -04:00
Shivaram Lingamneni
378d88fee2
Merge pull request #2055 from slingamn/doc_update
add apache websocket example
2023-03-09 17:46:03 -08:00
Shivaram Lingamneni
c4db4984a6
Merge pull request #2056 from avollmerhaus/master
Add bsd-rc init script to distrib
2023-03-09 16:11:09 -08:00
Aljoscha Vollmerhaus
04f8791dd6
add sections + usage information to bsd-rc README 2023-03-09 11:14:29 +01:00
Aljoscha Vollmerhaus
37eb5f5804
Add bsd-rc init script 2023-03-09 11:09:03 +01:00
Shivaram Lingamneni
6e011cd536 add apache websocket example
Fixes #2050
2023-03-09 01:05:34 -05:00
Shivaram Lingamneni
295a567eda
Merge pull request #2041 from mogad0n/killresponseupdate
Update response string when killing always on clients
2023-03-04 23:31:11 -08:00
Shivaram Lingamneni
db0910d82d fix linter error
See #2052
2023-03-04 23:29:16 -08:00
Shivaram Lingamneni
374cf8ef97
Merge pull request #2053 from slingamn/killmsg
tweak KILL message
2023-02-28 19:08:46 -08:00
Shivaram Lingamneni
eb83df420b tweak KILL message
Remove `<no reason supplied>`, make default KILL anonymous
2023-02-27 03:34:38 -05:00
Shivaram Lingamneni
3fca52ba38
Merge pull request #2049 from slingamn/implicittls.1
support implicit TLS for mail submission agents
2023-02-18 19:12:27 -08:00
Shivaram Lingamneni
3d1412a898
Merge pull request #2051 from slingamn/tidy
go mod tidy
2023-02-18 16:34:37 -08:00
Shivaram Lingamneni
b155e5315b go mod tidy 2023-02-18 19:32:19 -05:00
Shivaram Lingamneni
7c53b9430a support implicit TLS for mail submission agents
Fixes #2048
2023-02-17 00:07:21 -05:00
Shivaram Lingamneni
3c59ce964d fix Dockerfile
This broke in #2047
2023-02-11 21:55:57 -05:00
Shivaram Lingamneni
ae04fb3d0a
Merge pull request #2047 from slingamn/make
change default make target to `build`
2023-02-11 18:49:59 -08:00
Shivaram Lingamneni
ba40d57afd bump irctest 2023-02-11 21:36:21 -05:00
Shivaram Lingamneni
697f34995b change default make target to build
Fixes #2046
2023-02-11 21:35:03 -05:00
Shivaram Lingamneni
19dbf3a531
Merge pull request #2045 from slingamn/go_upgrade
upgrade to go 1.20
2023-02-05 21:41:35 -08:00
Shivaram Lingamneni
8b6b2cabc3 upgrade to go 1.20 2023-02-06 00:37:51 -05:00
Shivaram Lingamneni
1da11ae8ae
implement draft/pre-away (#2044)
* implement draft/pre-away
* clean up some subtleties in auto-away aggregation.
* consistently apply auto-away only to always-on
* `AWAY *` should not produce user-visible changes wherever possible
2023-02-05 00:50:14 -05:00
Shivaram Lingamneni
12f7796933
Merge pull request #2042 from slingamn/msgreftypes
publish MSGREFTYPES 005 token
2023-02-04 21:49:27 -08:00
Shivaram Lingamneni
fc89d72045 publish MSGREFTYPES 005 token
https://github.com/ircv3/ircv3-specifications/pull/510
2023-02-02 14:28:37 -05:00
0653f90b4f update response when killing alwayson targets 2023-01-31 13:27:02 +05:30
Shivaram Lingamneni
abb38ce8a1 bump irctest 2023-01-25 21:52:56 -05:00
Shivaram Lingamneni
5ecf19d01e
Merge pull request #2038 from slingamn/ws_optimization.1
tweaks to websocket handling
2023-01-23 04:25:14 -08:00
Shivaram Lingamneni
abc71684f3 always validate UTF8 from websockets 2023-01-22 14:45:16 -05:00
Shivaram Lingamneni
9439e9b9e1 allow resizing the ws read buffer 2023-01-21 19:10:25 -05:00
Shivaram Lingamneni
5eaf7b37e5 reduce websocket read allocations
See #2037
2023-01-21 19:10:17 -05:00
Shivaram Lingamneni
4317016a09
Merge pull request #2028 from slingamn/channels_taketwo.1
refactor of channel persistence to use UUIDs
2023-01-15 08:01:37 -08:00
Shivaram Lingamneni
7193fa3a3c
Merge pull request #2036 from slingamn/docker
bump docker actions
2023-01-15 06:02:21 -08:00
Shivaram Lingamneni
cd36604efe bump docker actions
Should fix https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ ?
2023-01-15 08:59:53 -05:00
Shivaram Lingamneni
8199edee6c
Merge pull request #2035 from slingamn/actions
bump github actions
2023-01-15 05:54:20 -08:00
Shivaram Lingamneni
81832a26bc bump github actions
https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/
2023-01-15 08:46:18 -05:00
Shivaram Lingamneni
8690a7648b
Merge pull request #2034 from slingamn/deps
dependency upgrades for v2.12 release cycle
2023-01-15 05:44:03 -08:00
Shivaram Lingamneni
7e6c658cad bump irc-go 2023-01-15 08:31:00 -05:00
Shivaram Lingamneni
eb84103865 upgrade other x dependencies 2023-01-15 08:30:18 -05:00
Shivaram Lingamneni
7a82554f9d upgrade mysql 2023-01-15 08:28:13 -05:00
Shivaram Lingamneni
05e5fe3444 upgrade x/text 2023-01-15 08:27:18 -05:00
Shivaram Lingamneni
3f5de80afd upgrade buntdb and dependencies 2023-01-15 08:26:32 -05:00
Shivaram Lingamneni
b2087977d0
Merge pull request #2032 from slingamn/scram.1
recommended default: advertise SCRAM
2023-01-15 04:16:28 -08:00
Shivaram Lingamneni
177133a96f
Merge pull request #2033 from slingamn/rehash
fix #2031
2023-01-15 04:13:53 -08:00
Shivaram Lingamneni
b16350e559
Merge pull request #2030 from slingamn/roundtime
round wait times to the nearest millisecond
2023-01-15 04:13:43 -08:00
Shivaram Lingamneni
16e214e4fb fix #2031
Sanitize the in-band error message from REHASH
2023-01-12 06:58:18 -05:00
Shivaram Lingamneni
46d32520c7 recommended default: advertise SCRAM
Fixes #1782
2023-01-11 09:21:47 -05:00
Shivaram Lingamneni
f72a6fa011 round wait times to the nearest millisecond 2023-01-08 06:36:04 -05:00
Shivaram Lingamneni
1e6dee15b2
Merge pull request #2029 from slingamn/listenconfig.2
make ReloadableListener lock-free
2023-01-06 01:40:18 -08:00
Shivaram Lingamneni
3ceff6a8b1 make ReloadableListener lock-free
Also stop attaching the *tls.Config to the wrapped connection,
since this forces it to be retained beyond its natural lifetime.
2023-01-05 20:18:14 -05:00
Shivaram Lingamneni
7ce0636276 refactor of channel persistence to use UUIDs 2023-01-04 05:06:21 -05:00
Shivaram Lingamneni
bceae9b739 add standard-replies capability 2023-01-01 07:08:44 -08:00
Shivaram Lingamneni
30fbfe4cc0 disable cgo for goreleaser 2023-01-01 07:08:10 -08:00
Shivaram Lingamneni
2a828bb783 clarify the meaning of the password section 2022-12-30 07:20:46 -08:00
Shivaram Lingamneni
4b3a6cb611
Merge pull request #2025 from slingamn/cgo
Fix #2023 (disable dynamic linking by default)
2022-12-25 23:41:55 -08:00
Shivaram Lingamneni
f00fd452be Fix #2023
Disable dynamic linking by default.
2022-12-26 02:27:28 -05:00
Shivaram Lingamneni
f6f7315458 bump version for new development cycle 2022-12-25 03:17:21 -05:00
Shivaram Lingamneni
1e1acdae21
Merge pull request #2022 from slingamn/changelog
final updates for v2.11.0-rc1
2022-12-24 23:22:46 -08:00
Shivaram Lingamneni
df8eef5b0a bump version for stable release 2022-12-25 02:09:51 -05:00
Shivaram Lingamneni
23ba58b327 final changelog for v2.11.0 2022-12-25 02:09:33 -05:00
Shivaram Lingamneni
bf4f3008d4
Merge pull request #2021 from FiskFan1999/ns
Fix SAREGISTER short help in SAVERIFY command
2022-12-24 23:02:50 -08:00
William Rehwinkel
63c08ce537
Fix SAREGISTER short help in SAVERIFY command 2022-12-24 13:13:38 -05:00
Shivaram Lingamneni
f7ab0fb59e tweak changelog 2022-12-19 03:55:15 -05:00
Shivaram Lingamneni
d0c01301fd update version number for v2.11.0-rc1 2022-12-18 00:25:50 -05:00
Shivaram Lingamneni
a052b82c78
don't reference SIGUSR1 on windows (#2018) 2022-12-18 00:15:55 -05:00
Shivaram Lingamneni
238407c70e
draft changelog for v2.11.0-rc1 (#2016)
* draft changelog for v2.11.0-rc1

* add another entry

* copyedits
2022-12-18 00:01:32 -05:00
Shivaram Lingamneni
9ab8b6710c
Merge pull request #2015 from slingamn/ascii
change default casefolding to ascii
2022-12-11 18:57:35 -08:00
Shivaram Lingamneni
05e5e88de4 change default casefolding to ascii
See discussion on #1718
2022-12-11 19:41:15 -05:00
Shivaram Lingamneni
d17faf6bcb fix #1975
Provide a nondestructive stack trace dump option even when the http pprof
listener is disabled
2022-12-10 22:15:37 -08:00
Shivaram Lingamneni
77de026961 persistence broadcast needs a cap check 2022-12-10 22:05:46 -08:00
Shivaram Lingamneni
898f84c613 update persistence spec link 2022-12-10 22:05:46 -08:00
Shivaram Lingamneni
ae1de2554e add persistence broadcasting 2022-12-10 22:05:46 -08:00
Shivaram Lingamneni
893922afe0 don't report PERSISTENCE STATUS in reg burst for anonymous clients 2022-12-10 22:05:46 -08:00
Shivaram Lingamneni
99d27ff737 initial implementation of draft/persistence 2022-12-10 22:05:46 -08:00
Shivaram Lingamneni
fa3de3e149 fix #1983
TAGMSG should not get automatic RPL_AWAY replies
2022-12-10 21:01:28 -08:00
Shivaram Lingamneni
2bfa13b7d0
Merge pull request #2012 from slingamn/doc_update
document that persistent history is not affected by buffer limits
2022-12-10 20:54:28 -08:00
Shivaram Lingamneni
25e698d57f document that persistent history is not affected by buffer limits 2022-12-06 00:18:59 -05:00
Shivaram Lingamneni
30b760483e
Merge pull request #2010 from slingamn/who_services.1
fix #1850
2022-12-03 19:06:44 -08:00
Shivaram Lingamneni
825cdab67d fix #1850
Add WHO responses for services
2022-12-02 07:23:29 -05:00
Shivaram Lingamneni
f665525735
Merge pull request #2009 from slingamn/both_005s
re-add draft/CHATHISTORY 005
2022-12-01 22:43:32 -08:00
Shivaram Lingamneni
35b5613349 re-add draft/CHATHISTORY 005
Kiwi expects it due to https://github.com/kiwiirc/kiwiirc/pull/1244 , but
the corresponding spec change only altered the cap name, not the 005 name.
2022-12-02 01:30:46 -05:00
Shivaram Lingamneni
a5983a1bd1
Merge pull request #2008 from slingamn/chathistory_isupport
fix CHATHISTORY 005 token name
2022-11-30 01:16:28 -08:00
Shivaram Lingamneni
ebda5e6d9a bump irctest 2022-11-30 04:13:04 -05:00
Shivaram Lingamneni
e40f550af8 fix CHATHISTORY 005 token name
Unclear where we got draft/CHATHISTORY from, it looks like the merged drafts
have always used unprefixed CHATHISTORY as the token name.
2022-11-30 04:10:47 -05:00
Shivaram Lingamneni
e20c983b57
fix #2002 (#2003)
* fix #2002

`CS AMODE #channel +f nickname` is invalid, but was being accepted
incorrectly.

* simplify logic
2022-11-06 14:41:29 -05:00
Shivaram Lingamneni
c3b3bf9941
Merge pull request #2006 from progval/ratified-extmonitor
Use ratified extended-monitor cap name
2022-11-06 11:40:31 -08:00
Valentin Lorentz
dd8073208c Use ratified extended-monitor cap name
https://github.com/ircv3/ircv3-specifications/pull/508
2022-11-01 07:41:55 +01:00
Shivaram Lingamneni
062491ebfc
Merge pull request #2005 from PeGaSuS-Coder/patch-1
Update MANUAL.md
2022-10-22 16:05:25 -07:00
Shivaram Lingamneni
7df041d0a6
remove emphasis on "after" 2022-10-22 19:03:33 -04:00
PeGaSuS
06a204d0d3
Update MANUAL.md
- Change instructions to place the script from `post` to `deploy` which will only update the certificate and key IF the renewal is successful.
2022-10-21 22:21:02 +02:00
Shivaram Lingamneni
a9c77af1cb
Merge pull request #1998 from slingamn/away
fix #1996
2022-09-11 01:44:18 -07:00
Shivaram Lingamneni
4e0d2d65e8 fix #1996
According to the de facto standard, `AWAY :\r\n` is equivalent to `AWAY\r\n`.
Our behavior was inconsistent before, now it consistently matches the de facto
standard.
2022-09-11 04:09:26 -04:00
Shivaram Lingamneni
57a213123f
Merge pull request #1995 from slingamn/trylock.1
replace some utils.Semaphore with (*sync.Mutex).TryLock
2022-09-07 11:14:22 -07:00
Shivaram Lingamneni
746309e386 replace some utils.Semaphore with (*sync.Mutex).TryLock
See #1994
2022-09-02 04:25:39 -04:00
Shivaram Lingamneni
531a1d6864 bump irctest 2022-08-28 01:58:42 -04:00
Shivaram Lingamneni
0e8f447326
Merge pull request #1993 from slingamn/fakelag_budget.3
exempt a configurable number of MARKREAD commands from fakelag
2022-08-22 20:26:11 -07:00
Shivaram Lingamneni
7ad31497c2 exempt a configurable number of MARKREAD commands from fakelag 2022-08-22 23:23:17 -04:00
Shivaram Lingamneni
7d6ff58bf8
Merge pull request #1992 from slingamn/issue1991_who.1
fix #1991
2022-08-22 20:07:44 -07:00
Shivaram Lingamneni
68bd2d87e0 fix #1991
WHO <nickname> should not respect +i
2022-08-22 23:03:17 -04:00
Shivaram Lingamneni
8ff5a048f3
Merge pull request #1989 from slingamn/atomic_uint64.1
use new aligned atomic types everywhere
2022-08-21 10:02:06 -07:00
Shivaram Lingamneni
594991d6cc
Merge pull request #1988 from mogad0n/fix/ubanlistduration
/UBAN LIST explicitly states 'indefinite' durations for Klines/Dlines
2022-08-20 21:51:01 -07:00
df234b842e uban list explicitly shows indefinite durations 2022-08-11 03:04:20 +05:30
Shivaram Lingamneni
35128bfc23 use new aligned atomic types everywhere
See 69448b13a10a14517 / #1969; the compiler can now ensure that a uint64
intended for atomic access is always aligned to a 64-bit boundary.
Convert atomic operations on uint32s and pointers as well.
2022-08-10 02:47:39 -04:00
Shivaram Lingamneni
507dc2d838
Merge pull request #1987 from slingamn/go_upgrade
upgrade go to 1.19
2022-08-03 18:16:33 -07:00
Shivaram Lingamneni
a99c8a42f9 remove utils.ConfigStore in favor of atomic.Pointer[T] 2022-08-03 00:59:00 -04:00
Shivaram Lingamneni
de1be675f5 upgrade go to 1.19 2022-08-03 00:56:19 -04:00
Shivaram Lingamneni
5b72cd8622 apply go1.19 gofmt 2022-08-03 00:54:50 -04:00
Shivaram Lingamneni
096c12fb52
Merge pull request #1981 from slingamn/issue1980
fix #1980
2022-07-14 19:07:59 -07:00
Shivaram Lingamneni
1d10eb934a fix #1980
Sanitize ::1 to 0::1 in WHOX output
2022-07-14 21:53:36 -04:00
Shivaram Lingamneni
26e0dae11d
Merge pull request #1977 from slingamn/deps
upgrade dependencies for v2.11 release cycle
2022-06-17 07:50:54 -07:00
Shivaram Lingamneni
321ff109b1 upgrade x/crypto 2022-06-17 10:47:28 -04:00
Shivaram Lingamneni
86f124e938 upgrade buntdb 2022-06-17 10:46:22 -04:00
Shivaram Lingamneni
2138847984
Merge pull request #1976 from slingamn/parallelize_testing
parallelize tests via the native go mechanism
2022-06-16 22:03:38 -07:00
Shivaram Lingamneni
f032fda48d parallelize tests via the native go mechanism 2022-06-16 14:56:28 -04:00
Shivaram Lingamneni
2cace0b5a2
Merge pull request #1973 from progval/crowdin-url
Update Crowdin URL
2022-06-11 18:46:53 -07:00
Valentin Lorentz
4208e11571 Update Crowdin URL 2022-06-11 22:33:47 +02:00
Shivaram Lingamneni
c0e7aac862
Merge pull request #1970 from ergochat/devel+issue1969_alignment
fix #1969
2022-06-10 07:53:04 -07:00
Shivaram Lingamneni
69448b13a1 fix #1969
On a 32-bit architecture, 64-bit atomic loads and stores must be aligned to a
64-bit boundary. Since the (mysql.MySQL) struct is directly included in the
Server struct, it is impossible to guarantee this via the standard technique
of putting the 64-bit value at the beginning of the struct definition
(since the point at which it is included in the parent struct may cross a
64-bit boundary).

This optimization is probably pointless anyway, adding an additional
indirection won't make a difference.
2022-06-10 10:35:56 -04:00
Shivaram Lingamneni
810ec75f95 bump irctest 2022-05-29 15:47:34 -04:00
Shivaram Lingamneni
86f7668c68 set up new development version 2022-05-29 15:46:36 -04:00
Shivaram Lingamneni
e8cd87d8fd
Merge pull request #1967 from slingamn/release
bump version and changelog for v2.10.0
2022-05-29 12:14:45 -07:00
Shivaram Lingamneni
101fd53d6d bump version and changelog for v2.10.0 2022-05-29 02:24:18 -04:00
Shivaram Lingamneni
acd95b9924 bump version and changelog for v2.10.0-rc2 2022-05-23 15:16:51 -04:00
Shivaram Lingamneni
40d70b8aeb
Merge pull request #1962 from slingamn/readmarker_again
only send MARKREAD to sessions with the read-marker cap
2022-05-20 02:03:31 -04:00
Shivaram Lingamneni
ef088373a8 only send MARKREAD to sessions with the read-marker cap 2022-05-20 01:58:14 -04:00
Shivaram Lingamneni
ae55a4c660
Merge pull request #1961 from slingamn/readmarker
fix critical bugs in draft/read-marker
2022-05-20 01:51:41 -04:00
Shivaram Lingamneni
2b86660e5c fix read markers not being reloaded on restart 2022-05-20 01:46:41 -04:00
Shivaram Lingamneni
c3d4be45f1 fix timestamp syntax in MARKREAD 2022-05-20 01:46:41 -04:00
Shivaram Lingamneni
67b2f4ccd2
README.md: fix docker repository link 2022-05-16 11:53:33 -04:00
Shivaram Lingamneni
104d0321e8 bump version and changelog for v2.10.0-rc1 2022-05-16 01:25:37 -04:00
Shivaram Lingamneni
14d1614bba
Merge pull request #1956 from slingamn/changelog.2
changelog updates for v2.10.0-rc1
2022-05-16 01:24:23 -04:00
Shivaram Lingamneni
e48c3fa687
Merge pull request #1957 from slingamn/saregister_responses
fix #1905
2022-05-16 00:38:13 -04:00
16b8d9090b
Documentation: add Python3 syntax highlighting, +i/AMODE documentation and add FAQ on AMODE privileges (#1959)
* MANUAL.md: correct shebangs

* docs/{USERGUIDE,MANUAL}.md: mention amode +v joining through +i

* MANUAL.md: add a FAQ on special privileges of AMODEs

* USERGUIDE.md: add missing channel name

* MANUAL.md: mention that special privileges are cumulative

* Revert "MANUAL.md: correct shebangs"

This reverts commit 75a77c55370089f2b144abc4104db5e13dcc2cb7.

* MANUAL.md: restore syntax highlighting for python3
2022-05-15 11:07:49 -04:00
Shivaram Lingamneni
5e5cc3040b
Update CHANGELOG.md
Co-authored-by: Aminda Suomalainen <suomalainen+git@mikaela.info>
2022-05-14 21:31:01 -04:00
Shivaram Lingamneni
bcaed1aff1 update documentation of moderation techniques
Fixes #1697
2022-05-13 17:30:47 -04:00
Shivaram Lingamneni
7192df4592 update documentation of operator capabilities 2022-05-13 17:18:42 -04:00
Shivaram Lingamneni
da07c0072c bump irctest to latest 2022-05-13 16:42:30 -04:00
Shivaram Lingamneni
6f9e07d2a2 fix #1905
NS SAREGISTER should send machine-readable responses. A simple approach:
check if the account-registration cap is enabled, and if so, send the
the same responses that would be sent by the REGISTER command.
2022-05-13 15:35:11 -04:00
Shivaram Lingamneni
52e0f8e7e9 changelog updates for v2.10.0-rc1 2022-05-13 14:53:39 -04:00
Shivaram Lingamneni
d6d5bbe27b
Merge pull request #1955 from slingamn/history_privs
exempt operators from history cutoffs
2022-05-13 02:04:56 -04:00
Shivaram Lingamneni
737697d1d4 exempt operators from history cutoffs
See #1593; this enables a client-side implementation of bulk deletion
2022-05-12 16:43:11 -04:00
Shivaram Lingamneni
dd75eb1084 fix incorrect HOSTSERV HELP SET
Reported by @Mikaela
2022-05-06 14:48:01 -04:00
Shivaram Lingamneni
a13235880c
Merge pull request #1954 from slingamn/accept.1
fix #1688
2022-05-06 11:40:17 -04:00
Shivaram Lingamneni
87789676c0 add tests covering (*AcceptManager).Unaccept 2022-05-05 22:43:33 -04:00
Shivaram Lingamneni
c454c45d6a
Merge pull request #1953 from slingamn/issue1886_unregistered.1
fix #1886
2022-05-05 22:40:50 -04:00
Shivaram Lingamneni
4948b48b8f
Merge pull request #1952 from slingamn/saverify.1
add SAVERIFY command
2022-05-05 22:40:07 -04:00
Shivaram Lingamneni
c5579a6a34 fix #1688
* Add ACCEPT-tracking functionality (authorizing users to send DMs
  despite +R or other applicable restrictions)
* Sending a DM automatically accepts the recipient
* Add explicit ACCEPT command
2022-05-05 22:34:43 -04:00
Shivaram Lingamneni
b11dc1c84c fix #1886
Add more clarify in NS INFO and SAREGISTER about unregistered nicknames
2022-05-05 01:04:28 -04:00
Shivaram Lingamneni
78548aa9df add SAVERIFY command
Fixes #1924
2022-05-04 16:41:01 -04:00
Shivaram Lingamneni
03092769e7 bump irctest 2022-05-04 14:59:10 -04:00
Shivaram Lingamneni
d5814c10ab
Merge pull request #1949 from slingamn/generic_config.2
genericize atomic config changes
2022-05-04 01:30:52 -04:00
Shivaram Lingamneni
34ad3a2dc1 ConfigStore: clarify intended use 2022-05-03 23:27:24 -04:00
Shivaram Lingamneni
f7853b15ca
Merge pull request #1950 from slingamn/kline_snotice.3
fix #1941
2022-05-03 22:54:54 -04:00
Shivaram Lingamneni
077081076c fix #1941
KLINE'd clients would produce a QUIT snotice without a corresponding
CONNECT snotice; explicitly suppress the QUIT snotice.
2022-05-03 13:13:29 -04:00
Shivaram Lingamneni
dea2e7961a
Merge pull request #1948 from slingamn/reverse_again
remove history.ReverseCorrespondents in favor of generics
2022-05-03 12:42:23 -04:00
Shivaram Lingamneni
c603d41d08 genericize atomic config changes 2022-05-03 11:12:11 -04:00
Shivaram Lingamneni
c87dead39b remove history.ReverseCorrespondents in favor of generics 2022-05-03 02:45:36 -04:00
Shivaram Lingamneni
66bf6244f3
Merge pull request #1947 from Mikaela/docs-op-invite
MANUAL.md: clarify appropiate privs for invite
2022-05-01 16:44:51 -04:00
e6905f4543
MANUAL.md: clarify appropiate privs for invite
Resolves: #1946
2022-05-01 23:29:38 +03:00
Shivaram Lingamneni
71fe4ecf48
Merge pull request #1945 from slingamn/generic_reverse
use genericized slice-reversing function
2022-04-30 21:29:25 -04:00
Shivaram Lingamneni
8eaf6f5166
Merge pull request #1944 from slingamn/kline_snotice.1
make quit logging more consistent
2022-04-30 21:29:14 -04:00
Shivaram Lingamneni
2df5fb1956 use genericized slice-reversing function 2022-04-29 13:39:11 -04:00
Shivaram Lingamneni
42883972a8 make quit logging more consistent
Log it at level INFO for parity with connect / connect-ip
2022-04-28 14:19:11 -04:00
Shivaram Lingamneni
2a3b8e648c
Merge pull request #1940 from slingamn/connect_faq
manual: add faq on connection problems
2022-04-28 03:21:38 -04:00
Shivaram Lingamneni
ae5e1fb49f manual: add faq on connection problems 2022-04-27 15:13:02 -04:00
Shivaram Lingamneni
15303d0247
consistently plug Goguma in documentation (#1939)
* consistently plug Goguma in documentation

* fix userguide header
2022-04-27 13:24:27 -04:00
Shivaram Lingamneni
432f0f62d5
Merge pull request #1938 from slingamn/ratified_bot
bump bot mode spec to ratified version
2022-04-26 15:55:05 -04:00
Shivaram Lingamneni
374bd834fd bump irctest temporarily for new bot tag name 2022-04-26 15:51:55 -04:00
Shivaram Lingamneni
5ecba1d40b use ratified bot mode tag name 2022-04-26 15:43:24 -04:00
Shivaram Lingamneni
5c7df07d91
Merge pull request #1936 from slingamn/nick_empty
fix #1933
2022-04-25 18:02:31 -04:00
Shivaram Lingamneni
911b00787b
Merge pull request #1937 from slingamn/whoischannels
fix #1935
2022-04-25 18:01:48 -04:00
Shivaram Lingamneni
2b8eb93c00 clean up magic numbers 2022-04-24 11:57:21 -04:00
Shivaram Lingamneni
51cdebf167 fix #1935
RPL_WHOISCHANNELS didn't have proper line breaks
2022-04-24 02:47:31 -04:00
Shivaram Lingamneni
61fd7a2534 fix the rest of #1933
`NICK :` pre-registration needs to be special-cased to immediately
send ERR_NONICKNAMEGIVEN (unlike erroneous nonempty nicknames,
which are processed when registration is complete)
2022-04-24 01:39:45 -04:00
Shivaram Lingamneni
7201f14b8b partial fix for #1933
If the nickname must equal the account name (because always-on or
force-nick-equals-account), the correct error response to an empty
or otherwise invalid nickname is the usual "You must use your account
name as your nickname".
2022-04-24 00:31:20 -04:00
Shivaram Lingamneni
504cc44bf7
Merge pull request #1934 from progval/patch-5
Fix implementation of `LIST <n`
2022-04-18 23:58:54 -04:00
Val Lorentz
379632a9e6
Fix implementation of LIST <n 2022-04-16 22:55:58 +02:00
Shivaram Lingamneni
1f08c97238
Merge pull request #1926 from slingamn/readmarker.6
implement draft/read-marker capability
2022-04-08 01:33:06 -04:00
Shivaram Lingamneni
2c488f5ebf
Merge pull request #1929 from slingamn/issue1928_list_err
fix #1928
2022-04-07 18:21:55 -04:00
Shivaram Lingamneni
2fb8b836db fix #1928
LIST should not return ERR_NOSUCHCHANNEL for nonexistent channels
2022-04-07 11:44:23 -04:00
Shivaram Lingamneni
ac2fc0da28
Merge pull request #1927 from FiskFan1999/deletemessagewarn
histserv delete now requires two params
2022-04-02 21:27:13 -04:00
William Rehwinkel
934ad1cec2 histserv delete now requires two params 2022-04-01 20:52:09 -04:00
Shivaram Lingamneni
1adda8d42c bump irctest 2022-03-30 23:16:11 -04:00
Shivaram Lingamneni
32f7868bfd implement draft/read-marker capability 2022-03-30 23:16:09 -04:00
Shivaram Lingamneni
6bd94391ef Dockerfile: un-pin alpine version 2022-03-30 11:45:09 -04:00
Shivaram Lingamneni
b7e2bd9f33
Merge pull request #1925 from slingamn/generics
upgrade to go 1.18, start using generics
2022-03-30 11:42:06 -04:00
Shivaram Lingamneni
fd5317e68e bump .github and Dockerfile for go1.18 2022-03-30 01:17:05 -04:00
Shivaram Lingamneni
a549827f17 upgrade to go 1.18, use generics 2022-03-30 00:44:51 -04:00
Shivaram Lingamneni
446c654dea docs: add a caution about operator passwords with spaces 2022-03-15 16:28:01 -04:00
Shivaram Lingamneni
6d892fe371 bump irctest to latest 2022-03-06 02:06:38 -05:00
Shivaram Lingamneni
9f6e26450b make SAREGISTER override DEFCON
DEFCON 4 and lower were blocking SAREGISTER. This is wrong; admins should be
allowed to make new accounts even under DEFCON (this may be needed
specifically to work around the DEFCON restriction).
2022-03-01 07:57:15 -05:00
William Rehwinkel
4010f3fc02
Fix #1911 +s channels don't appear in /list even though on the channel (#1923)
* Fix #1911 +s channels don't appear in /list even though on the channel

* use channel.HasClient instead of custom iterative checker
2022-02-28 20:31:16 -05:00
Shivaram Lingamneni
99294b8968 docs: expand FAQ on coerce-ident 2022-02-23 07:56:28 -05:00
Shivaram Lingamneni
ba474b9b9a bump irctest to latest 2022-02-21 16:56:24 -05:00
Shivaram Lingamneni
302c9cb908
Merge pull request #1919 from slingamn/default
bump recommended CHATHISTORY limit to 1000
2022-02-20 15:42:31 -05:00
Shivaram Lingamneni
87d9addcfc
Merge pull request #1920 from thesamesam/openrc-init
distrib: refine OpenRC init scripts
2022-02-19 22:53:35 -05:00
Sam James
7c766b2096
distrib: refine OpenRC init scripts
- Add logging to init script
- Add delay so OpenRC realises if we crashed quickly b/c of e.g. bad config
   file
- General cleanups (like supporting multiple instances, style changes)

This should make it a lot easier to see what's going wrong when something
breaks.

Bug: ergochat/ergo#1914
Signed-off-by: Sam James <sam@gentoo.org>
2022-02-19 22:39:39 +00:00
Shivaram Lingamneni
b66ea9f56d bump recommended CHATHISTORY limit to 1000
Discussed with emersion, this is the value used in soju and it works fine.
2022-02-18 13:06:24 -05:00
Shivaram Lingamneni
1e7775f6de
Merge pull request #1918 from slingamn/znc_exact
use exact integer parsing for znc.in/playback
2022-02-15 11:28:32 -05:00
Shivaram Lingamneni
197a9d4b5e use exact integer parsing for znc.in/playback 2022-02-15 10:50:38 -05:00
Shivaram Lingamneni
cba3a2fc10
Merge pull request #1916 from slingamn/issue1895_info
fix #1895
2022-02-11 16:27:59 -05:00
Shivaram Lingamneni
2b0d94dfee manual: add note about secure-nets 2022-02-11 13:28:35 -05:00
Shivaram Lingamneni
0a2a850005
Merge pull request #1917 from progval/patch-4
Update help of REGISTER and VERIFY commands
2022-02-08 16:22:58 -05:00
Val Lorentz
e7abd93e90
Update help of REGISTER and VERIFY commands 2022-02-08 20:25:41 +01:00
Shivaram Lingamneni
0afa7edffe fix #1895
Include server start time in INFO output.
2022-02-08 07:38:11 -05:00
Shivaram Lingamneni
59ef59870a
Merge pull request #1915 from slingamn/privileged_kick
fix #1906
2022-02-08 05:52:04 -05:00
Shivaram Lingamneni
b492b8385b bump irctest 2022-02-07 19:11:31 -05:00
Shivaram Lingamneni
fcb86c54f7 fix #1906
Having the 'samode' capability made all KICK commands privileged. This appears
to have been introduced unintentionally by 42316bc04f4761d and I can't find
any discussion of a rationale. Since this goes against our policy that all
ircop (as opposed to channel founder) privileges must be invoked explicitly
(e.g. SAJOIN, SAMODE), remove this.
2022-02-07 19:06:31 -05:00
Shivaram Lingamneni
6c0e9619cb
Merge pull request #1904 from slingamn/prefix.1
bump irc-go to v0.1.0
2022-01-20 18:03:25 -05:00
Shivaram Lingamneni
e3e8136f85 update ergo to work with irc-go v0.1.0 2022-01-20 18:00:04 -05:00
Shivaram Lingamneni
74f3ea1d2e bump irc-go to v0.1.0 2022-01-20 17:59:57 -05:00
Shivaram Lingamneni
fa7b76d66a
Merge pull request #1903 from slingamn/zero_nick
fix #1896
2022-01-19 22:32:08 -05:00
Shivaram Lingamneni
e3c9eb8e71 fix #1896
Don't allow any new uses of 0 as a nickname, since it conflicts with
the use of 0 as a placeholder for account name in WHOX.
2022-01-19 04:14:00 -05:00
Shivaram Lingamneni
c2bf59ca38
Merge pull request #1897 from slingamn/whox_show_ip
show arbitrary IP in WHOX
2022-01-19 02:16:14 -05:00
Shivaram Lingamneni
86c5839044
Merge pull request #1902 from slingamn/amode_v_join
fix #1901
2022-01-19 01:15:58 -05:00
Shivaram Lingamneni
eb477c3793 fix #1901
AMODE +v should allow you to join a +i channel
2022-01-19 00:54:03 -05:00
Shivaram Lingamneni
bf3c0ad70e
Merge pull request #1900 from csmith/docs-faq-webirc-secure
Add FAQ about WebIRC and secure clients
2022-01-19 00:52:22 -05:00
Chris Smith
0da7e68e6d Add FAQ about WebIRC and secure clients 2022-01-18 16:15:48 +00:00
Shivaram Lingamneni
6dc6abc455 set up new development version (again) 2022-01-10 19:03:54 -05:00
Shivaram Lingamneni
a73ad5fc10 bump irctest to latest 2022-01-10 18:58:11 -05:00
Shivaram Lingamneni
1d8a54289f bump version to 2.9.1 2022-01-10 02:33:56 -05:00
Shivaram Lingamneni
d8c9d0ec03 fix changelog 2022-01-10 02:32:27 -05:00
Shivaram Lingamneni
2e26efa55d changelog update for 2.9.1 2022-01-10 02:31:05 -05:00
Shivaram Lingamneni
7347e94da1
Merge pull request #1899 from slingamn/saregister_fix
fix #1898
2022-01-10 02:27:15 -05:00
Shivaram Lingamneni
3162c8a1c8 fix #1898
NS SAREGISTER would fail due to a nil dereference of `client`;
add two safeguards against this.
2022-01-10 01:58:05 -05:00
Shivaram Lingamneni
8605cd2295 correct 2.9.0 changelog credits for posterity 2022-01-09 23:34:10 -05:00
Shivaram Lingamneni
28ab3612e2
Merge pull request #1894 from thesamesam/openrc-init
distrib: add OpenRC init scripts
2022-01-09 17:27:11 -05:00
Shivaram Lingamneni
dba5d3faae show arbitrary IP in WHOX
This extends #1650 to cover WHO as well as WHOIS
2022-01-09 17:24:24 -05:00
Shivaram Lingamneni
1953e90720 set up new development version 2022-01-09 16:11:34 -05:00
Sam James
e6951aca3f README: add Gentoo package
Signed-off-by: Sam James <sam@gentoo.org>
2022-01-09 07:39:14 +00:00
Sam James
2619a23458 distrib: add OpenRC init scripts
Written originally for Gentoo but should work
on Alpine and other OpenRC-consuming distros too.

Signed-off-by: Sam James <sam@gentoo.org>
2022-01-09 07:39:14 +00:00
Shivaram Lingamneni
a0ad42272d bump version and changelog for v2.9.0 2022-01-09 01:47:27 -05:00
Shivaram Lingamneni
7a6e7f05a1
Merge pull request #1892 from slingamn/unregister_warning
add a warning about NS UNREGISTER unregistering channels
2022-01-06 16:00:17 -05:00
Shivaram Lingamneni
6863d58cab add a warning about NS UNREGISTER unregistering channels
See discussion on #1891
2022-01-05 13:30:36 -05:00
Shivaram Lingamneni
d68813927a
Merge pull request #1890 from slingamn/translations
update translations
2022-01-02 18:52:59 -05:00
Shivaram Lingamneni
c2a5853d08 commit the results of updatetranslations.py 2022-01-02 17:38:02 -05:00
Shivaram Lingamneni
d174b5aad6 add disambiguating numbers in translated strings 2022-01-02 17:36:12 -05:00
Shivaram Lingamneni
fb2be58e60 fix instructions for signing the checksum file 2022-01-02 17:29:10 -05:00
Shivaram Lingamneni
abd4cf7d3b bump version to v2.9.0-rc1 2022-01-02 16:37:22 -05:00
Shivaram Lingamneni
2dde9cb464
version and changelog updates for 2.9.0-rc1 (#1889)
* version and changelog updates for 2.9.0-rc1

* review fixes to changelog and documentation
2022-01-02 16:35:20 -05:00
Shivaram Lingamneni
c01e686221
Merge pull request #1888 from slingamn/ip_check_script.1
add ip-check-script.exempt-sasl
2022-01-02 07:44:09 -05:00
Shivaram Lingamneni
0a59f41cf9 add ip-check-script.exempt-sasl 2022-01-02 01:51:31 -05:00
Shivaram Lingamneni
58d8421f44 Revert "disable languages in default.yaml"
This reverts commit 3b3c5b591f5cd6252e8dc3702e7a656bdd25deef.
2022-01-02 01:46:27 -05:00
Shivaram Lingamneni
378f9cc852
Merge pull request #1836 from slingamn/languages_disable
disable languages in default.yaml
2022-01-02 01:40:18 -05:00
Shivaram Lingamneni
d6b8e59462
Merge pull request #1885 from slingamn/issue1844_again
fix the reopened #1844
2022-01-02 01:25:09 -05:00
Shivaram Lingamneni
40bd298a91 fix the reopened #1844 2022-01-02 01:07:37 -05:00
Shivaram Lingamneni
ed75533cb1
optionally protect against multiple starts with flock (#1873)
* optionally protect against multiple starts with flock

Fixes #1823

* use traditional .lock extension

* move config key to top level
2022-01-01 18:56:40 -05:00
Shivaram Lingamneni
e112a78b9b Merge branch 'issue1883' 2021-12-30 13:07:52 -05:00
Shivaram Lingamneni
a57bf46e6a small refactor 2021-12-30 12:59:14 -05:00
William Rehwinkel
b929691470 Fix #1883 Nickserv gives error when user attempt to change password to * 2021-12-30 12:15:30 -05:00
Shivaram Lingamneni
24ad24562e update help entry for CHATHISTORY 2021-12-29 12:45:29 -05:00
Shivaram Lingamneni
000eb760e6
Merge pull request #1880 from progval/patch-3
README: Add link tothe LDAP plugin
2021-12-26 17:21:54 -05:00
Val Lorentz
d84d6756ed
README: Add link tothe LDAP plugin 2021-12-26 23:08:12 +01:00
Shivaram Lingamneni
f5598cfc1c bump irctest 2021-12-23 15:53:54 -05:00
Shivaram Lingamneni
8b74cd1fd3
Merge pull request #1877 from slingamn/issue1876_invite_ban
fix #1876
2021-12-19 20:58:51 -05:00
Shivaram Lingamneni
e15c355f18 fix #1876
INVITE did not exempt from +b unless the channel was coincidentally also +i.
This was a regression introduced in v2.4.0.
2021-12-19 18:30:18 -05:00
Shivaram Lingamneni
5b3ec9a605
Merge pull request #1872 from slingamn/capbug.1
correctly account for nickname in CAP LS arithmetic
2021-12-16 02:18:48 -05:00
Shivaram Lingamneni
76f7748c8a correctly account for nickname in CAP LS arithmetic
The arithmetic was assuming that the nickname is * (which it is
pre-registration). However, we were sending the actual nickname
post-registration. It would be simpler to always send *, but it
appears that the nickname is actually required by the spec:

>Replies from the server must [sic] contain the client identifier name or
>asterisk if one is not yet available.
2021-12-16 01:59:36 -05:00
Shivaram Lingamneni
c5746c5105
Merge pull request #1871 from slingamn/invite_mask_unregistered_join
+I should allow unregistered users to join a +R channel
2021-12-16 00:41:24 -05:00
Shivaram Lingamneni
ec4fb90d2b +I should allow unregistered users to join a +R channel
See #1858: this was the intent all along, but I missed this issue.
2021-12-15 22:52:11 -05:00
Shivaram Lingamneni
aa4a82e0c8
Merge pull request #1869 from slingamn/atheme.1
fix the atheme side of #1864
2021-12-13 03:11:27 -05:00
Shivaram Lingamneni
8fc20d8eed fix the atheme side of #1864
Import stored certfps from Atheme as well.
2021-12-13 02:14:04 -05:00
Shivaram Lingamneni
98e87f6cc0 explicitly close the DB during importdb
There is no change in behavior since committing the transaction
already write(2)'s all the data to disk. But let's comply with
the official buntdb API.
2021-12-12 22:27:05 -05:00
Shivaram Lingamneni
9293858ba1 bump database version generated by importer
This should have been done in 8b2f6de3e0b9, since we updated both
the database schema and the importer then.
2021-12-12 22:09:42 -05:00
15f5f2e9b0
anope2json certfp support (#1867)
* Advanced certfp support

Signed-off-by: Georg <georg@lysergic.dev>

* Moving certfp logic

Signed-off-by: Georg <georg@lysergic.dev>

* Cleaning up certfp logic

Signed-off-by: Georg <georg@lysergic.dev>
2021-12-12 20:18:41 -05:00
Shivaram Lingamneni
0483e3f6ad
Merge pull request #1866 from slingamn/whox
send `*` for WHOX o (oplevel) instead of `0`
2021-12-12 03:16:03 -05:00
Shivaram Lingamneni
f3f805acb8 send * for WHOX o (oplevel) instead of 0
Jobe points out that 0 is a valid oplevel in some contexts,
* is a better placeholder for "unimplemented".
2021-12-12 03:05:56 -05:00
Shivaram Lingamneni
1cd31f4d61 bump irctest 2021-12-10 01:21:40 -05:00
Shivaram Lingamneni
7bc5bfaa5c
Merge pull request #1863 from slingamn/importer_utf8
anope2json, atheme2json: handle non-UTF8 data
2021-12-10 01:20:35 -05:00
Shivaram Lingamneni
4f7356f19a anope2json, atheme2json: handle non-UTF8 data
Also ignore an unrecognized field type in anope
2021-12-09 22:11:24 -05:00
Shivaram Lingamneni
0d0d9e72b4
Merge pull request #1861 from slingamn/issue1860_amode
fix #1860
2021-12-09 04:18:14 -05:00
Shivaram Lingamneni
ac17bf0e9d
Merge pull request #1857 from slingamn/dollarsign
disallow initial $ in nicknames
2021-12-09 04:17:57 -05:00
Shivaram Lingamneni
e5dff58647
Merge pull request #1859 from slingamn/issue1858_registeredmode
fix #1858
2021-12-09 04:16:31 -05:00
Shivaram Lingamneni
9d9ee11224 fix #1860
CS AMODE changes should take immediate effect even if the nick
does not match the account.
2021-12-08 23:47:33 -05:00
Shivaram Lingamneni
3fe8d01d50 update manual for #1858 2021-12-07 01:41:11 -05:00
Shivaram Lingamneni
8be8f0f08d fix #1858
The channel mode +R used to both prevent joins by unregistered users,
and prevent unregistered users who happened to be joined from speaking.
This changes the behavior so that +R only prevents joins:

1. This allows users who were invited or SAJOIN'ed to speak
2. To restore the old semantics, chanops can set +RM
2021-12-07 01:31:07 -05:00
Shivaram Lingamneni
f40d868cf5 disallow initial $ in nicknames
It collides with the massmessage mask syntax. Reported by @emersion
2021-12-06 14:17:45 -05:00
Shivaram Lingamneni
3e32e3f19e
Merge pull request #1851 from slingamn/default_noctcp
make +C (no CTCP) a default channel mode
2021-12-06 12:01:24 -05:00
Shivaram Lingamneni
4d6e0120b2 plug gamja in the userguide 2021-12-06 03:25:55 -05:00
erin
5c7f8faf0c
Build arm64 container images (#1855)
* Build container image on aarch64 platform

* Revert test code & correct typo

Co-authored-by: erin <erin@localhost>
2021-12-04 22:14:21 -05:00
Shivaram Lingamneni
039d8f3f2d
Merge pull request #1854 from erincerys/update-docker-repo-location
Update docker repo location
2021-12-03 15:14:42 -05:00
erin
b8e38819d8 Update oragono references to ergo
- Environment variable prefix
- DNSBL repo URI
- Project and repo names in link to Docker-specific instructions
- Docker container and volume names in docker run command
2021-12-03 12:07:05 -08:00
erin
fba41a26df Update docker repo location in docs and docker-compose.yml 2021-12-03 11:10:52 -08:00
Shivaram Lingamneni
1951e09eea
Merge pull request #1853 from slingamn/note
change FAIL AUTHENTICATE VERIFICATION_REQUIRED to be a NOTE
2021-12-03 02:31:54 -05:00
Shivaram Lingamneni
cb757c703d change FAIL AUTHENTICATE VERIFICATION_REQUIRED to be a NOTE
See discussion on #1852
2021-12-01 12:16:03 -05:00
Shivaram Lingamneni
72959eb1cf
Merge pull request #1852 from slingamn/fail_authenticate
add FAIL AUTHENTICATE VERIFICATION_REQUIRED
2021-11-30 20:35:33 -05:00
Shivaram Lingamneni
8ec9053448
Merge pull request #1849 from slingamn/bugs.2
fix some papercuts
2021-11-30 20:34:33 -05:00
Shivaram Lingamneni
7d66368274 add FAIL AUTHENTICATE VERIFICATION_REQUIRED
From discussion with @emersion, this will help with UX if people try to
log into their unverified accounts.
2021-11-30 15:27:25 -05:00
Shivaram Lingamneni
028f2fcaa4 make +C (no CTCP) a default channel mode 2021-11-30 13:48:34 -05:00
Shivaram Lingamneni
645721f97e fix missing parenthesis in UBAN INFO 2021-11-30 03:40:03 -05:00
Shivaram Lingamneni
8995dd8842 update DEVELOPING.md 2021-11-30 03:35:07 -05:00
Shivaram Lingamneni
fd45529d94 fix #1842
Warn about banning a single IPv6 address
2021-11-30 03:27:40 -05:00
Shivaram Lingamneni
eef9753912 reorder imports 2021-11-30 03:18:01 -05:00
Shivaram Lingamneni
9ff4047fa6 fix #1840
Account registrations pending verification should produce a logline and
send a sno.
2021-11-30 03:18:01 -05:00
Shivaram Lingamneni
ee720f60e2 fix #1826
CS PURGE should send a snomask
2021-11-30 03:18:01 -05:00
Shivaram Lingamneni
c51569420a fix #1844
Send snomasks for HS SET
2021-11-30 03:18:01 -05:00
Shivaram Lingamneni
20270aeb22 docs: fix incorrect naming of GHCR 2021-11-28 02:46:55 -05:00
Shivaram Lingamneni
57c943c812
Merge pull request #1846 from tacerus/SMF
OpenSolaris / Illumos Service Management Facility (SMF) Service
2021-11-28 01:27:31 -05:00
Shivaram Lingamneni
0344e99bc6 update docker readme 2021-11-28 01:26:36 -05:00
Shivaram Lingamneni
72b51c00de fix irctest submodule path 2021-11-27 18:13:04 -05:00
b106c01303
Solaris SMF Service
Signed-off-by: Georg <georg@lysergic.dev>
2021-11-22 17:11:41 +01:00
Shivaram Lingamneni
5c7fd0ec0b readme: clarify self-containedness 2021-11-21 21:55:25 -05:00
Shivaram Lingamneni
14c16a999d
Merge pull request #1839 from mogad0n/fix/suspend_perms_1828
NS SUSPEND now req 'ban' capabs
2021-11-18 12:21:14 -05:00
e0f4fcee61
NS SUSPEND now req 'ban' capabs 2021-11-18 17:11:32 +05:30
Shivaram Lingamneni
ac91beabfd
Merge pull request #1835 from slingamn/who.1
fix two WHO bugs
2021-11-16 21:45:40 -05:00
Shivaram Lingamneni
21e637b8d7 add uncommitted files from dep update
These should have been committed in 8218d1caabad110400303539a381c66f0e185c55
but weren't.
2021-11-16 20:07:39 -05:00
Shivaram Lingamneni
208a6706c5
Merge pull request #1834 from slingamn/goreleaser
fix #1833
2021-11-16 19:17:50 -05:00
Shivaram Lingamneni
43b0e020e8
Merge pull request #1838 from slingamn/relaymute
fix casefolding issue in muting RELAYMSG
2021-11-16 19:16:23 -05:00
Shivaram Lingamneni
86e5f907ea
Merge pull request #1837 from slingamn/deps
update dependencies for 2.9 window
2021-11-16 19:16:10 -05:00
Shivaram Lingamneni
bc5c2a1250 fix casefolding issue in muting RELAYMSG
Reported by @mogad0n; the mute mask was being case-canonicalized,
but the RELAYMSG identifier wasn't being case-canonicalized before
the check.
2021-11-16 18:39:38 -05:00
Shivaram Lingamneni
8218d1caab upgrade dependencies for 2.9 cycle 2021-11-16 18:38:42 -05:00
Shivaram Lingamneni
51fca3cc0b bump irctest to latest 2021-11-16 18:38:42 -05:00
Shivaram Lingamneni
3b3c5b591f disable languages in default.yaml
See #1822
2021-11-16 18:14:00 -05:00
Shivaram Lingamneni
0713d040be make operators hidden by default in default.yaml 2021-11-15 18:43:06 -05:00
Shivaram Lingamneni
2038763e10 fix #1730
`WHO #channel o` is supposed to return only server operators.
This is RFC1459 cruft; just return an empty list in this case.
2021-11-14 15:13:56 -05:00
Shivaram Lingamneni
62b2d0341e fix #1831
RPL_ENDOFWHO should send the original, un-normalized mask
2021-11-14 13:41:27 -05:00
Shivaram Lingamneni
250a95c8e5 include procedures for signing the checksums file 2021-11-14 13:24:14 -05:00
Shivaram Lingamneni
9ceac66b08 fix #1833
Modernize the list of os-arch pairs that get official release builds;
add darwin/arm64 and openbsd/amd64, remove 386 and armv7, add plan9/amd64
for fun.
2021-11-14 13:13:33 -05:00
Shivaram Lingamneni
92f6bf2d03 set up new development version 2021-11-14 13:12:58 -05:00
Shivaram Lingamneni
c70e518eed bump version to v2.8.0 2021-11-14 00:11:19 -05:00
Shivaram Lingamneni
54b1513931 remove gchr.io landing page link from changelog
The landing page link doesn't seem to work right now.
2021-11-14 00:08:37 -05:00
Shivaram Lingamneni
9a007d07f8 update changelog for ghcr announcement 2021-11-13 23:24:15 -05:00
Shivaram Lingamneni
7ee0712401
Merge pull request #1829 from slingamn/changelog
bump changelog for 2.8.0, fix #1827
2021-11-13 21:16:46 -05:00
Shivaram Lingamneni
050e27b31b fix #1798
Improve documentation for use of certificate fingerprints
2021-11-13 19:58:56 -05:00
Shivaram Lingamneni
e74da6c51e fix #1827
Document operator capabilities.
2021-11-13 19:51:07 -05:00
Shivaram Lingamneni
741cd8e8af changelog updates 2021-11-12 14:33:45 -05:00
Shivaram Lingamneni
3d4170ef98
Merge pull request #1825 from slingamn/samode_f
SAMODE +f shouldn't require channel privileges
2021-11-11 12:32:17 -05:00
Shivaram Lingamneni
4bffdba610 SAMODE +f shouldn't require channel privileges
Reported by @Mikaela; normally this requires +o or higher on the
channel that is the target of the forward, but SAMODE should bypass
this check.
2021-11-09 13:23:25 -05:00
Shivaram Lingamneni
4a3ac617a5
Merge pull request #1819 from slingamn/password_message
fix error message for NS SET EMAIL without the password
2021-11-08 03:20:45 -05:00
Shivaram Lingamneni
dc75b24d23 clarify comment on CAP byte arithmetic 2021-11-07 13:32:18 -05:00
Shivaram Lingamneni
9f0c3cdc0e fix error message for NS SET EMAIL without the password 2021-11-04 20:10:56 -04:00
Shivaram Lingamneni
2274ef3fa0
Merge pull request #1818 from slingamn/logo
temporary logo update
2021-11-04 14:48:37 -04:00
Shivaram Lingamneni
63826da693 temporary logo update 2021-11-04 14:47:32 -04:00
Shivaram Lingamneni
e154126ac2
Merge pull request #1817 from tacerus/languages
Languages README.md: Oragono -> Ergo
2021-11-04 14:34:42 -04:00
9d9ae8ce14
Oragono -> Ergo
Signed-off-by: Georg <georg@lysergic.dev>
2021-11-04 19:32:28 +01:00
Shivaram Lingamneni
486bd699eb fix erroneous command name in changelog
Thanks @brettgilio!
2021-11-03 13:48:30 -04:00
Shivaram Lingamneni
ea4b93dd59 bump version to v2.8.0-rc1 2021-11-03 05:33:46 -04:00
Shivaram Lingamneni
4901e67f51
Merge pull request #1816 from slingamn/changelog.2
bump changelog and version for 2.8.0-rc1
2021-11-03 05:17:21 -04:00
Shivaram Lingamneni
b276d23230 bump changelog for v2.8.0-rc1 2021-11-03 05:14:52 -04:00
Shivaram Lingamneni
0f8f8b0de9
Merge pull request #1815 from slingamn/githash
fix some inconsistencies in how git hashes and tags are included in the binary
2021-11-03 02:33:41 -04:00
Shivaram Lingamneni
f9ca172ad7 include git tag in binary when available 2021-11-03 02:15:46 -04:00
Shivaram Lingamneni
9c4fbeabef docker: include git hash in docker-built binary 2021-11-03 01:58:04 -04:00
Shivaram Lingamneni
475814d613
Merge pull request #1814 from slingamn/alpine_downgrade
docker: downgrade alpine to 3.13 again
2021-11-03 01:15:51 -04:00
Shivaram Lingamneni
e620e3b4bf docker: downgrade alpine to 3.13 again
See https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2 ;
this maintains compatibility with older, buggy versions of docker and runc.
Alpine 3.13 is supported until 2022-11-01.
2021-11-03 01:07:02 -04:00
Shivaram Lingamneni
7e93770540
Merge pull request #1813 from slingamn/message_error
CHATHISTORY with nonexistent msgid should send empty batch
2021-11-02 20:59:02 -04:00
Shivaram Lingamneni
d488cf7f57
Merge pull request #1812 from slingamn/cstransfer
fix case where CS TRANSFER as an operator required acceptance
2021-11-02 20:58:51 -04:00
Shivaram Lingamneni
ad8c97c9bb CHATHISTORY with nonexistent msgid should send empty batch
It was sending MESSAGE_ERROR, which was inappropriate. Send an empty batch
for now (this is at parity with the in-memory implementation).
2021-11-02 18:50:41 -04:00
Shivaram Lingamneni
c4e376c8bb fix spurious error logline in schema change 2021-11-02 18:26:51 -04:00
Shivaram Lingamneni
85fabaad6d fix case where CS TRANSFER as an operator required acceptance
Reported by @mogad0n. If a user had both operator privileges and
channel owner privileges, the CS TRANSFER would proceed as though
unprivileged, requiring acceptance by the receiving user. Fix this
to not require acceptance.
2021-11-02 18:26:47 -04:00
Shivaram Lingamneni
4ba35afa85 try to fix docker entrypoint
docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/ircd-bin/run.sh": permission denied: unknown.
2021-11-02 05:15:56 -04:00
Shivaram Lingamneni
759696836e CI: fix invalid variable warning 2021-11-02 04:41:51 -04:00
Shivaram Lingamneni
1ab2e9c294
Add GHCR workflow
See #1808
2021-11-02 04:38:59 -04:00
Shivaram Lingamneni
c9b54ee2b8
Merge pull request #1809 from slingamn/issue1676_again.3
fix #1676, take 2
2021-11-02 03:51:04 -04:00
Shivaram Lingamneni
ea1678ec8f
Merge pull request #1810 from slingamn/nolusers
fix #1802
2021-11-01 23:25:32 -04:00
Shivaram Lingamneni
62043afbb0
Merge pull request #1811 from slingamn/error_line
fix spurious "corrupt account creds" logline
2021-11-01 23:24:13 -04:00
Shivaram Lingamneni
61bce74018 fix spurious "corrupt account creds" logline
Reported by @tacerus. This was most likely introduced by 8b2f6de3e.
2021-11-01 18:48:37 -04:00
Shivaram Lingamneni
51d573d3c9 fix #1802
Add a config option to suppress LUSERS
2021-11-01 04:48:31 -04:00
Shivaram Lingamneni
8c556fe8c5 schema change to remove ReplayJoinsNever
See #1676
2021-11-01 04:36:06 -04:00
Shivaram Lingamneni
4749d7e776 fix #1676, take 2
Ensure the pagination window is full by making sure that every history item
gets a replay line in CHATHISTORY output, even TAGMSG.
2021-11-01 04:34:59 -04:00
Shivaram Lingamneni
3ec5ffa340 Revert "fix #1676"
This reverts commit 5bbee02fe6bb8ed9dea23675df4349604c5fe247.
2021-11-01 04:34:59 -04:00
Shivaram Lingamneni
84a5b83eb1
Merge pull request #1807 from xnaas/docs-touchup
update 'docker kill' command
2021-10-31 18:34:32 -04:00
xnaas
48897596c4
update 'docker kill' command 2021-10-29 09:56:36 -05:00
Shivaram Lingamneni
41089b0e16
Merge pull request #1806 from slingamn/history.2
fix #1676
2021-10-29 05:04:01 -04:00
Shivaram Lingamneni
84fef29760
Merge pull request #1805 from slingamn/bunt_upgrade
upgrade buntdb
2021-10-29 05:02:50 -04:00
Shivaram Lingamneni
5bbee02fe6 fix #1676
Fix various pagination issues with CHATHISTORY; also undo #491
(msgid munging).
2021-10-29 04:50:24 -04:00
Shivaram Lingamneni
b478e93c11
Merge pull request #1804 from slingamn/pwvalidation
make `ergo genpasswd` warn for bad passwords
2021-10-28 22:25:45 -04:00
Shivaram Lingamneni
c972a92e51 upgrade buntdb
Resolves CVE-2021-42836, which probably didn't affect us, but we might as well
upgrade.
2021-10-28 19:47:33 -04:00
Shivaram Lingamneni
7d5cb723b4 make ergo genpasswd warn for bad passwords 2021-10-28 19:29:55 -04:00
Shivaram Lingamneni
404bf6c2a0 update git workflow documentation 2021-10-15 01:08:27 -04:00
Shivaram Lingamneni
1b55520006
Merge pull request #1800 from ajaspers/samode
Send snomask for channel mode changes via SAMODE.
2021-10-03 23:29:28 -04:00
Alex Jaspersen
53a7e8c334 Send snomask for channel mode changes via SAMODE.
Fixes #1787
2021-10-03 17:15:01 -07:00
Shivaram Lingamneni
20d8d269ca
Merge pull request #1797 from slingamn/signals
move signals code to utils/
2021-09-19 04:18:20 -04:00
Shivaram Lingamneni
b0f412538c move signals code to utils/ 2021-09-19 04:02:44 -04:00
Shivaram Lingamneni
3cf1583aed
Merge pull request #1796 from slingamn/reverseproxy_exportable.1
factor out some shared code
2021-09-19 02:48:55 -04:00
Shivaram Lingamneni
2cae19dde5 remove unnecessary indirection in config 2021-09-19 02:09:43 -04:00
Shivaram Lingamneni
284c3d689b remove obsolete resume config field 2021-09-19 02:00:58 -04:00
Shivaram Lingamneni
e0e4791f72 factor out some shared code 2021-09-18 21:28:16 -04:00
Shivaram Lingamneni
657ce0f1a4
Merge pull request #1795 from slingamn/gamjadoc
document gamja
2021-09-13 01:57:22 -04:00
Shivaram Lingamneni
fc711de360 document gamja 2021-09-13 01:53:55 -04:00
Shivaram Lingamneni
e71643eb73 add dependencies workflow to DEVELOPING.md 2021-09-12 11:28:01 -04:00
Shivaram Lingamneni
2b3fc9d38e
Merge pull request #1793 from slingamn/nope
rename oragono.io/nope to ergo.chat/nope
2021-09-12 11:20:17 -04:00
Shivaram Lingamneni
b8009c4a07 rename oragono.io/nope to ergo.chat/nope 2021-09-10 13:05:09 -04:00
Shivaram Lingamneni
bce3d643bc bump irctest 2021-09-10 09:51:55 -04:00
Shivaram Lingamneni
c7b6b6e917 include /msg form of account registration in manual
Thanks to @cxxboy (#1788)
2021-09-09 21:46:12 -04:00
Shivaram Lingamneni
eff6dd242b
Merge pull request #1791 from slingamn/hashmark
add # to disfavoredNameCharacters
2021-09-09 21:34:54 -04:00
Shivaram Lingamneni
cb39c82222
Merge pull request #1792 from slingamn/info
update logo in /INFO response
2021-09-09 21:34:34 -04:00
Shivaram Lingamneni
69d88fb231 update logo in /INFO response 2021-09-09 21:25:07 -04:00
Shivaram Lingamneni
b83479247e add # to disfavoredNameCharacters
Partially fixes #1679, not sure whether to police the relaymsg config or not
2021-09-09 21:04:47 -04:00
Daniel Oaks
39b0d2c6ac Update #ergo text logo
(based on 'slant' figlet font with some tweaks)
2021-09-10 09:45:31 +10:00
Shivaram Lingamneni
a367c20410 fix inconsistent grammar in documentation 2021-09-05 20:33:25 -04:00
Shivaram Lingamneni
d02eecd8ec
Merge pull request #1790 from slingamn/unknowncommand
fix #1530
2021-09-05 20:32:06 -04:00
Shivaram Lingamneni
ffb5e4f986 bump irctest 2021-09-05 20:15:42 -04:00
Shivaram Lingamneni
aa969b7ff7 fix #1530
Warn if the user sent, e.g., /QUOTE /SAMODE instead of /QUOTE SAMODE
2021-09-05 20:14:13 -04:00
Shivaram Lingamneni
585910a9b1
Merge pull request #1786 from majiru/s6
add s6 services to distrib
2021-09-01 01:04:57 -04:00
Jacob Moody
9f7ead07a5
add s6 services to distrib 2021-08-28 18:14:47 -06:00
Shivaram Lingamneni
9b6ec04ca5
Merge pull request #1761 from delthas/feature-extended-monitor
Add support for extended-monitor
2021-08-26 10:14:31 -04:00
Shivaram Lingamneni
55cf1e6781
Merge pull request #1784 from slingamn/issue1650_whoisactually
fix #1650
2021-08-26 00:11:19 -04:00
Shivaram Lingamneni
26cdb4cf36 fix #1650
RPL_WHOISACTUALLY should display some arbitrarily chosen IP address and
hostname.
2021-08-25 22:44:55 -04:00
Shivaram Lingamneni
8b2f6de3e0
Add email-based password reset (#1779)
* Add email-based password reset

Fixes #734

* rename SETPASS to RESETPASS

* review fixes

* abuse mitigations

* SENDPASS and RESETPASS should both touch the client login throttle
* Produce a logline and a sno on SENDPASS (since it actually sends an email)

* don't re-retrieve the settings value

* add email confirmation for NS SET EMAIL

* smtp: if require-tls is disabled, don't validate server cert

* review fixes

* remove cooldown for NS SET EMAIL

If you accidentally set the wrong address, the cooldown would prevent you
from fixing your mistake. Since we touch the registration throttle anyway,
this shouldn't present more of an abuse concern than registration itself.
2021-08-25 22:32:55 -04:00
Shivaram Lingamneni
0baaf0b711
Merge pull request #1783 from slingamn/scram_mechanisms
remove SCRAM-SHA-256 from advertised SASL mechanisms
2021-08-25 21:03:29 -04:00
Shivaram Lingamneni
a1d4b8ac82 bump irctest to latest 2021-08-25 19:00:33 -04:00
Shivaram Lingamneni
12947644e2 remove SCRAM-SHA-256 from advertised SASL mechanisms
Advertising SCRAM-SHA-256 breaks irccloud, which doesn't fall back to PLAIN
if it sees SCRAM advertised but SCRAM then fails (as is the case for any
account password hashed on Ergo 2.7 or lower).

Leave a config option for irctest to enable it in the controller.
2021-08-25 18:34:27 -04:00
Shivaram Lingamneni
9c77f89bc2
Merge pull request #1781 from slingamn/go_upgrade
upgrade go to 1.17
2021-08-20 16:56:26 -04:00
Shivaram Lingamneni
492109f29d upgrade go to 1.17 2021-08-20 15:59:26 -04:00
Shivaram Lingamneni
00255586cc update manual to point to stable branch systemd file 2021-08-19 10:51:46 -04:00
Shivaram Lingamneni
fea8cc1b9a
Merge pull request #1778 from ProgVal/empty-realname
Add missing argument to ERR_NEEDMOREPARAMS on USER commands.
2021-08-13 16:58:53 -04:00
Valentin Lorentz
a90fbf9f2c Add missing argument to ERR_NEEDMOREPARAMS on USER commands.
Refs:

* other instances in the codebase
* https://defs.ircdocs.horse/defs/numerics.html#err-needmoreparams-461
* https://modern.ircdocs.horse/#errneedmoreparams-461
2021-08-13 21:10:46 +02:00
Shivaram Lingamneni
0d438dd0d6
Merge pull request #1776 from ProgVal/kick-default-comment
Make kick messages default to the kicker name instead of the kicked
2021-08-13 14:20:17 -04:00
Valentin Lorentz
f33f41b0eb Make kick messages default to the kicker name instead of the kicked
For consistency with RFC2812, Bahamut, Hybrid, Insp, Plexus4, Unreal.
https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.8

At the expense of consistency with chary/solanum, irc2, and ircu2.
2021-08-13 20:16:37 +02:00
Shivaram Lingamneni
4785a3953a
Merge pull request #1777 from ProgVal/targmax-kick
Advertise support for multiple KICK targets
2021-08-13 14:14:56 -04:00
Valentin Lorentz
f6f25039b7 Advertise support for multiple KICK targets
This is already implemented, but TARGMAX=KICK:1 says it isn't.

Instead, let's advertise that indefinitely many targets are allowed.
Refs:

* https://defs.ircdocs.horse/defs/isupport.html#targmax
* https://github.com/ircdocs/modern-irc/pull/112
2021-08-13 19:42:03 +02:00
Shivaram Lingamneni
5d2d4a99bc
Merge pull request #1775 from slingamn/channelkey
fix handling of +k with an empty key parameter
2021-08-10 15:15:40 -04:00
Shivaram Lingamneni
abfb8442ab fix handling of +k with an empty key parameter
This should be disallowed; `MODE #keytest +k :` should just be an error.
2021-08-10 15:11:11 -04:00
Shivaram Lingamneni
bbb52bf692
Merge pull request #1773 from ProgVal/keyvalidation
Add missing channel parameter to ERR_INVALIDMODEPARAM.
2021-08-10 15:02:02 -04:00
Valentin Lorentz
e894c44960 Add missing channel parameter to ERR_INVALIDMODEPARAM. 2021-08-10 20:33:00 +02:00
Shivaram Lingamneni
ada135d7cf
Merge pull request #1772 from slingamn/bump_irctest
bump irctest
2021-08-08 17:04:32 -04:00
Shivaram Lingamneni
0355c2df1e bump irctest 2021-08-08 14:49:08 -04:00
Shivaram Lingamneni
37c7b97084 documentation: update CI config path 2021-08-08 12:35:55 -04:00
Shivaram Lingamneni
0ac8b6daea
Merge pull request #1770 from ajaspers/patch-1
Document mute extbans
2021-08-04 01:58:45 -04:00
ajaspers
c3fb7f2ad6
Document mute extbans
Fixes #1747.
2021-08-03 21:31:54 -07:00
Shivaram Lingamneni
1c5a485c17
Merge pull request #1768 from slingamn/scram_clientid
fix SCRAM not supporting client IDs
2021-08-03 23:51:10 -04:00
Shivaram Lingamneni
5b93fdfcf2
Merge pull request #1769 from ajaspers/logout
Correct help text for NS CLIENTS LOGOUT.
2021-08-03 23:50:01 -04:00
Alex Jaspersen
ecd878c169 Correct help text for NS CLIENTS LOGOUT.
"LOGOUT ALL" logs out all clients for a user.

Fixes #1712.
2021-08-03 18:54:37 -07:00
Shivaram Lingamneni
117401f293 fix SCRAM not supporting client IDs
reported by @Mikaela
2021-08-03 11:47:00 -04:00
Shivaram Lingamneni
b13776787b
Merge pull request #1767 from slingamn/bunt
upgrade buntdb
2021-08-03 09:58:10 -04:00
Shivaram Lingamneni
c5a9916302 upgrade buntdb 2021-08-03 01:46:43 -04:00
Shivaram Lingamneni
1389d89a9b
Merge pull request #1766 from slingamn/allow_truncation
fix incorrect handling of overlong lines when allow-truncation is enabled
2021-08-03 00:40:54 -04:00
Shivaram Lingamneni
941c12244f
Merge pull request #1765 from slingamn/autorehash
add autogeneration of SCRAM credentials on successful PLAIN
2021-08-03 00:40:47 -04:00
Shivaram Lingamneni
cf25e894e1 fix incorrect handling of overlong lines when allow-truncation is enabled 2021-08-02 21:49:42 -04:00
Shivaram Lingamneni
4dd9af8f06 add autogeneration of SCRAM credentials on successful PLAIN 2021-08-02 12:26:58 -04:00
Shivaram Lingamneni
d8dc24dee8
Merge pull request #1764 from slingamn/scram.3
implement SCRAM-SHA-256
2021-08-01 22:00:14 -04:00
Shivaram Lingamneni
ebe1f84d64 consolidate login throttle checks
We can check once during initialization of the SASL session, e.g.
on receiving `AUTHENTICATE PLAIN` or `AUTHENTICATE EXTERNAL`
2021-07-30 14:06:13 -04:00
Shivaram Lingamneni
41822813c0 clean up redundant check for sasl mechanism 2021-07-30 14:03:40 -04:00
Shivaram Lingamneni
e1401934df implement SCRAM-SHA-256 2021-07-30 12:20:13 -04:00
Shivaram Lingamneni
3264687803
Merge pull request #1763 from slingamn/jwt
replace jwt library
2021-07-29 20:51:23 -04:00
Shivaram Lingamneni
ef92318282 replace jwt library
Fixes #1762
2021-07-29 16:49:35 -04:00
delthas
7fde04ea94 Add support for extended-monitor
See: https://github.com/ircv3/ircv3-specifications/pull/466
2021-07-24 20:52:03 +02:00
Shivaram Lingamneni
ad61f9f213
Merge pull request #1758 from ergochat/channel_creation
fix channel creation bugs
2021-07-15 08:35:29 -04:00
Shivaram Lingamneni
6851901e20 fix #1756
A default channel mode of +i would block channel creation; fix this by treating
initial joins as SAJOINs.

Note that it's nontrivial to detect initial join in (*Channel).Join, because
having 0 members does not necessarily indicate a new channel.
2021-07-15 06:31:27 -04:00
Shivaram Lingamneni
c99b2be403 fix #1757
Allow SAJOIN or implicit always-on join to override channels.operator-only-creation
2021-07-15 06:27:37 -04:00
Shivaram Lingamneni
699921afff
Merge pull request #1755 from mogad0n/enhance/uban_list_timecreated
add timeCreated to /uban list output
2021-07-14 10:17:49 -04:00
99610eae4b add timeCreated to /uban list output 2021-07-14 12:36:45 +05:30
Shivaram Lingamneni
128142ca41
Merge pull request #1753 from slingamn/rename
fix #1751
2021-07-14 02:09:43 -04:00
Shivaram Lingamneni
dc0bf1a02d
Merge pull request #1748 from ProgVal/patch-2
Add support for KICK #chan user1,user2
2021-07-13 08:55:44 -04:00
Shivaram Lingamneni
5b317d4846 fix #1751
RENAME (channel rename) that was a simple case change (e.g.
renaming #chan to #CHAN) would delete the channel :-|
2021-07-13 08:47:16 -04:00
Valentin Lorentz
f58f8531b2 Restore support for multiple channels + single user 2021-07-12 20:59:05 +02:00
Val Lorentz
54c5d35193 Add support for KICK #chan user1,user2
This is one of the two cases of [RFC 2812 kicks](https://datatracker.ietf.org/doc/html/rfc2812#section-3.2.8):
even when there are multiple user targets, the RFC (and Unreal
and Inspircd and probably others) allows a single channel name.
2021-07-10 11:13:52 +02:00
Shivaram Lingamneni
907f82a27e
Merge pull request #1741 from slingamn/greylisting.3
user visible email errors, email timeouts
2021-07-09 07:22:03 -04:00
Shivaram Lingamneni
497aa429b7
Merge pull request #1746 from slingamn/docker_fix
pin docker base image to alpine 3.13
2021-07-08 20:58:51 -04:00
Shivaram Lingamneni
7190770e12 pin docker base image to alpine 3.13
May fix #1726 (broken build on dockerhub)
2021-07-08 20:55:09 -04:00
Shivaram Lingamneni
3fde046a01
Merge pull request #1743 from mogad0n/fix/disconn_sno_help_missing
fix missing disconnect sno help text
2021-07-08 11:04:25 -04:00
Shivaram Lingamneni
29f1afd565
Merge pull request #1742 from slingamn/register_update
update draft/register -> draft/account-registration
2021-07-07 09:17:20 -04:00
b2ea2583f4 add missing disconnect sno help 2021-07-07 18:43:42 +05:30
Shivaram Lingamneni
4693a88421 bump irctest 2021-07-07 09:04:40 -04:00
Shivaram Lingamneni
5d0e4fa023
Merge pull request #1739 from slingamn/issue1738
fix #1738
2021-07-07 08:17:16 -04:00
Shivaram Lingamneni
59bddd066f update draft/register -> draft/account-registration
Fixes #1740
2021-07-07 07:37:46 -04:00
Shivaram Lingamneni
032ca175e4 add support for email timeouts 2021-07-07 07:21:22 -04:00
Shivaram Lingamneni
46572b871f expose a user-visible error if direct email sending fails
See #1659
2021-07-07 07:21:22 -04:00
Shivaram Lingamneni
1c89f996bc fix #1738
Fix error message for privileged NS PASSWD on a nonexistent account
2021-07-06 13:28:25 -04:00
Shivaram Lingamneni
dcfd8d8fe8
Merge pull request #1737 from slingamn/readerror
add a debug logline for client read errors
2021-07-05 03:34:34 -04:00
Shivaram Lingamneni
fedf4a9176 add a debug logline for client read errors
May help clarify TLS configuration issues, possibly others too
2021-07-05 03:30:18 -04:00
Shivaram Lingamneni
98c4d0e399
Merge pull request #1735 from slingamn/systemd
support systemd notifications
2021-07-05 03:10:27 -04:00
Shivaram Lingamneni
5fc7ac41da always mark the service ready after rehash 2021-07-04 19:51:35 -04:00
Shivaram Lingamneni
5e5c86ad86
Merge pull request #1736 from slingamn/uban_kill
fix UBAN ADD of masks (k-lines) not killing clients
2021-07-04 19:37:53 -04:00
Shivaram Lingamneni
364193df4e refactor some start-stop logging 2021-07-04 17:58:48 -04:00
Shivaram Lingamneni
dbfa704eb2 fix UBAN ADD of masks (k-lines) not killing clients 2021-07-04 08:14:38 -04:00
Shivaram Lingamneni
6f24082705 support systemd notifications
Fixes #1733
2021-07-04 07:41:59 -04:00
Shivaram Lingamneni
c53df2dc88 bump irctest 2021-07-04 04:29:21 -04:00
Shivaram Lingamneni
188d8c499d
Merge pull request #1728 from mogad0n/session_disconnect_sno
DISCONNECT Sno for always-on and/or multiclient
2021-07-04 02:25:10 -04:00
Shivaram Lingamneni
77bfdd8619
Merge pull request #1723 from slingamn/vhost_validation
fix #1722
2021-07-04 01:41:38 -04:00
Shivaram Lingamneni
6e72f12992
Merge pull request #1732 from slingamn/issue1731_invalid_target
fix #1731
2021-07-04 01:41:27 -04:00
Shivaram Lingamneni
d0801e45a8 fix #1731
CHATHISTORY INVALID_TARGETS was missing the subcommand parameter
2021-07-04 01:37:59 -04:00
99cb1fd02c DISCONNECT Sno for always-on and/or multiclient 2021-07-03 04:41:42 +05:30
Shivaram Lingamneni
62d78a64cb
Merge pull request #1727 from kylef/kylef/mode-missing-nick
Include nick in ERR_LISTMODEALREADYSET and ERR_LISTMODENOTSET
2021-07-02 18:00:49 -04:00
Kyle Fuller
9adc77498e Include nick in ERR_LISTMODEALREADYSET and ERR_LISTMODENOTSET 2021-07-02 20:09:48 +01:00
Shivaram Lingamneni
1121c71d75 bump irctest 2021-07-02 07:31:04 -04:00
Shivaram Lingamneni
0751f31b9e fix #1722
Validate operator vhosts against the configured (or default)
vhosts.valid-regexp
2021-06-29 10:06:37 -04:00
Shivaram Lingamneni
5daabdd226
Merge pull request #1717 from ajaspers/voice
Allow +v users to talk in +R channels.
2021-06-29 09:11:52 -04:00
Alex Jaspersen
ff3f959d52 Allow +v users to talk in +R channels. 2021-06-28 17:27:50 -07:00
Shivaram Lingamneni
9af6b86868 bump irctest to reintegrated version 2021-06-28 03:52:25 -04:00
Shivaram Lingamneni
0a811f9d9e
Merge pull request #1719 from slingamn/config_panic
fix #1714
2021-06-28 01:51:40 -04:00
Shivaram Lingamneni
b68696eb9b fix #1714
Fix a panic if the operator class title is empty
2021-06-28 01:45:13 -04:00
Shivaram Lingamneni
20aa8efe56
Merge pull request #1716 from obale/readme-fixes
Fixing the AUR package link in the README.md file
2021-06-27 23:55:57 -04:00
Alex Oberhauser
e8839407d4
Fixing AUR maintainer in README.md 2021-06-27 22:45:08 -04:00
Shivaram Lingamneni
f07524111c
Merge pull request #1702 from ajaspers/whowas
Show real IP in WHOWAS to opers with ban capability.
2021-06-22 02:28:56 -04:00
Shivaram Lingamneni
234459a2fe
Merge pull request #1704 from slingamn/issue1703
fix #1703
2021-06-22 02:28:24 -04:00
Shivaram Lingamneni
e60c2a6806
Merge pull request #1705 from dallemon/docker_readme
update docker readme
2021-06-21 19:13:40 -04:00
Daniel Thamdrup
2abfa66802 update docker readme 2021-06-21 11:56:14 +02:00
Alex Jaspersen
b6264a43b6 Rename "realIP" to "ip" in WhoWas struct.
It could be the real IP or the proxied IP.
2021-06-20 11:13:18 -07:00
Shivaram Lingamneni
51c207dc80 fix #1703
`WHOWAS :` should return an error numeric instead of an empty response
2021-06-20 14:12:13 -04:00
Alex Jaspersen
e5c2588eab Show real IP in WHOWAS to opers with ban capability. 2021-06-20 10:26:30 -07:00
Shivaram Lingamneni
6786b87fbd
Merge pull request #1699 from slingamn/issue1696_mode
fix #1696
2021-06-18 19:06:33 -04:00
Shivaram Lingamneni
d03615d29a bump irctest for #1696 2021-06-18 18:58:39 -04:00
Shivaram Lingamneni
99b9312847 fix #1696 2021-06-18 18:26:45 -04:00
Shivaram Lingamneni
21f51dcc3e
Merge pull request #1694 from slingamn/ircgo.1
use ergochat/irc-go instead of goshuirc/irc-go
2021-06-18 03:14:59 -04:00
Shivaram Lingamneni
4910aefa37 use ergochat/irc-go instead of goshuirc/irc-go 2021-06-18 02:43:25 -04:00
Shivaram Lingamneni
66af8cd63c
Merge pull request #1689 from slingamn/notice
add a FAQ entry for global notices
2021-06-16 03:06:37 -04:00
Shivaram Lingamneni
d097d34737
Merge pull request #1692 from mogad0n/help_modes
Help string updates for +f mode
2021-06-16 03:06:24 -04:00
Shivaram Lingamneni
8f8b71761d
Update irc/help.go
Co-authored-by: Mikaela Suomalainen <mikaela@mikaela.info>
2021-06-16 02:52:21 -04:00
8efb2d23c3 help for +f mode
fix help for +f mode
2021-06-16 11:01:34 +05:30
Shivaram Lingamneni
ece82b44fb add links in README.md to manual/userguide 2021-06-15 19:45:29 -04:00
Shivaram Lingamneni
29982e3ffe mention new init script in manual 2021-06-15 14:21:27 -04:00
Shivaram Lingamneni
57c746bd57
Merge pull request #1691 from tacerus/master
Submitting rc.ergo
2021-06-14 22:38:05 -04:00
ca99a65dc4
Submitting rc.ergo
/etc/rc.d/rc.ergo
2021-06-14 11:28:35 +00:00
Shivaram Lingamneni
c53097000b fix remaining references to Freenode in documentation 2021-06-13 15:57:26 -04:00
Shivaram Lingamneni
2f5484a673 clarify mta configuration in manual 2021-06-13 14:15:03 -04:00
Shivaram Lingamneni
725bb7213d add a FAQ entry for global notices 2021-06-13 13:50:58 -04:00
Shivaram Lingamneni
e59d599eed
Merge pull request #1685 from slingamn/next
set up new development version
2021-06-13 00:50:00 -04:00
Shivaram Lingamneni
94afd012fb
Merge pull request #1680 from tamiko/master
update ChanServ OP command documentation
2021-06-13 00:49:53 -04:00
Shivaram Lingamneni
5d4a12f008
Merge pull request #1677 from ajaspers/email
Show email in NS INFO when user has permission.
2021-06-13 00:49:33 -04:00
Shivaram Lingamneni
97d1786378
Merge pull request #1683 from dallemon/master
update dockerfile and minor changes
2021-06-09 16:26:55 -04:00
Daniel Thamdrup
0898a6aa91 update dockerfile and minor changes 2021-06-09 15:24:52 +02:00
Shivaram Lingamneni
fcaefaca9c set up new development version 2021-06-08 10:47:18 -04:00
Shivaram Lingamneni
9851d2e9bc bump version and changelog for official release 2021-06-08 00:51:37 -04:00
Matthias Maier
6cfd8eadc9 update ChanServ OP command documentation
Commit 7ce396931cff32558112c65e1f9c93aacc5c7a1f introduced the ability
that every user with an account in the AMODE list of a channel can use
the OP command to restore their modes. Update the chanserv help message
accordingly.
2021-06-06 13:57:48 -05:00
Alex Jaspersen
1d832ee1bc Show email in NS INFO when user has permission.
Users logged into an account can see their own email.
Opers with the accreg capability can see all users.
2021-06-04 16:44:00 -07:00
Shivaram Lingamneni
36703580fc
Merge pull request #1674 from slingamn/altnicks
clarify the semantics of additional-nick-limit
2021-06-03 12:41:13 -04:00
Shivaram Lingamneni
99a48496fa clarify the semantics of additional-nick-limit 2021-06-02 12:03:32 -04:00
Shivaram Lingamneni
b81757d273 bump version for 2.7.0-rc1 2021-05-31 01:50:02 -04:00
Shivaram Lingamneni
1b894b73a2 add changelog entry 2021-05-30 21:27:12 -04:00
Shivaram Lingamneni
f93e1f1a7d
Merge pull request #1668 from slingamn/changelog.3
changelog, documentation, and distrib updates for ergo 2.7
2021-05-30 21:25:56 -04:00
Shivaram Lingamneni
b9a1cd618e
Merge pull request #1670 from slingamn/snomasks
fix #1669
2021-05-30 21:25:22 -04:00
Shivaram Lingamneni
6b9cdfeed9 bump irctest 2021-05-30 12:42:04 -04:00
Shivaram Lingamneni
33e3b0ce1b fix #1669
Sort snomasks for display rather than displaying them in hash order
2021-05-30 12:35:16 -04:00
Shivaram Lingamneni
612f527033 change branding in default motd 2021-05-30 03:45:25 -04:00
Shivaram Lingamneni
6ff0486aa0 changelog, documentation, and distrib updates for ergo 2.7 2021-05-30 03:45:25 -04:00
Shivaram Lingamneni
75208d2934
Merge pull request #1663 from kashike/feature/badges
Update status badges in readme for project rename
2021-05-30 02:38:24 -04:00
Shivaram Lingamneni
c24254fe45
Merge pull request #1667 from slingamn/playback.2
fix znc.in/playback for individual DM targets
2021-05-30 02:37:46 -04:00
Riley Park
81b5fa865f
Update status badges in readme for project rename 2021-05-28 20:25:32 -07:00
Shivaram Lingamneni
ac806e5c62 fix znc.in/playback for individual DM targets
This is a regression introduced in 0d05ab4ff4249f; playback for an individual
DM target would play all DMs.
2021-05-28 18:07:54 -04:00
Shivaram Lingamneni
202d982866
Merge pull request #1666 from KiloNiner/patch-1
Update run.sh to use newly renamed ergo binaries
2021-05-28 17:36:52 -04:00
Karsten Højgaard
76fa365a7a
Update run.sh to use newly renamed ergo binaries 2021-05-28 23:15:30 +02:00
Daniel Oaks
cf33122f15
Update Dockerfile to work with Ergo naming change 2021-05-29 06:49:14 +10:00
Daniel Oaks
d85fe8c3cc
Merge pull request #1664 from Rene-Montes/better-spanish
Improved Spanish translations
2021-05-29 06:05:10 +10:00
rene
c3592274dc Improved Spanish translations
Notable changes:
* Use of inclusive pronouns and words (think they/them but on a language
  that relies on gender for almost every word). Keep in mind this might
  cause some flame from conservative folks.
* Corrected many computer-generated translations (one of them translated
  "resume" to resumé)
2021-05-28 19:46:35 +00:00
Shivaram Lingamneni
351eb8ad27
Merge pull request #1662 from slingamn/relay_nuh_followup.2
fix #1661
2021-05-27 11:54:36 -04:00
Shivaram Lingamneni
ec48966b68 fix #1661
If the relay bot and the owner share an IP, legacy bots that identify users
by user@host could misinterpret relayed lines as coming from the bot owner.
Try to avoid this by using the bot's account cloak where applicable.
2021-05-27 11:43:21 -04:00
Shivaram Lingamneni
91cdb96bcb fix HS STATUS help strings 2021-05-27 10:51:54 -04:00
Shivaram Lingamneni
98ea150817
Merge pull request #1660 from ergochat/relay_nuh.1
fix #1647
2021-05-27 02:24:08 -04:00
Shivaram Lingamneni
77313e20ad fix #1647
Send a full NUH with RELAYMSG.

Also fix client-only tags with RELAYMSG.
2021-05-27 02:00:59 -04:00
Shivaram Lingamneni
9527850f7c
Merge pull request #1658 from ajaspers/patch-1
Add documentation for +f channel mode.
2021-05-27 00:18:33 -04:00
ajaspers
b0bdbb775c
Add documentation for +f channel mode. 2021-05-26 21:16:17 -07:00
Shivaram Lingamneni
e76b14d036
Merge pull request #1657 from slingamn/ci_update
bump irctest, remove travis
2021-05-27 00:13:14 -04:00
Shivaram Lingamneni
d740a161db remove travis 2021-05-27 00:08:45 -04:00
Shivaram Lingamneni
b5a154d3d1 bump irctest 2021-05-27 00:08:33 -04:00
Shivaram Lingamneni
60d351f9ff
Merge pull request #1656 from kashike/feature/github-actions
feat: build with github actions
2021-05-26 23:30:05 -04:00
Shivaram Lingamneni
d6b8cb9a8d
Merge pull request #1654 from ergochat/dependencies
migrate additional dependencies to ergochat
2021-05-26 23:29:19 -04:00
Shivaram Lingamneni
7944871eb6 migrate additional dependencies to ergochat 2021-05-26 21:58:29 -04:00
Riley Park
67868f85e8
feat: build with github actions 2021-05-26 18:56:29 -07:00
Shivaram Lingamneni
9dad717c04
Merge pull request #1653 from slingamn/ergo.1
first pass at renaming Oragono to Ergo
2021-05-26 18:57:40 -04:00
Shivaram Lingamneni
42296bdc49 add placeholder logo.png 2021-05-26 18:01:24 -04:00
Shivaram Lingamneni
f1ae8051cb update readmes, add placeholder logo 2021-05-26 18:01:11 -04:00
Shivaram Lingamneni
4d4e134008 bump irctest for ergo rename 2021-05-26 16:03:32 -04:00
Shivaram Lingamneni
23c7218bf1 first pass at renaming Oragono to Ergo 2021-05-26 15:55:24 -04:00
Shivaram Lingamneni
7a1695c628
Merge pull request #1652 from oragono/l10n_master
New Crowdin updates
2021-05-24 13:08:02 -04:00
Daniel Oaks
a300524458 New translations nickserv.lang.json (Spanish) 2021-05-25 02:44:41 +10:00
Shivaram Lingamneni
588efd29b4
Merge pull request #1651 from slingamn/configurable_linelen
make MaxLineLen configurable
2021-05-24 01:33:18 -04:00
Shivaram Lingamneni
cc4b958a41 review fix 2021-05-24 01:02:49 -04:00
Shivaram Lingamneni
7c5a8f2013 make MaxLineLen configurable 2021-05-24 00:38:47 -04:00
Shivaram Lingamneni
297f2af827
Merge pull request #1645 from oragono/noresume.4
remove draft/resume-0.5
2021-05-20 02:04:10 -04:00
Shivaram Lingamneni
56a0407ff5 bump irctest to remove draft/resume-0.5 tests 2021-05-18 23:28:13 -04:00
Shivaram Lingamneni
ba21987d03 remove draft/resume-0.5 2021-05-18 23:27:46 -04:00
Shivaram Lingamneni
df49137aca
Merge pull request #1643 from slingamn/auditorium_zerotime
fix #1642
2021-05-05 10:14:50 -04:00
Shivaram Lingamneni
a131507090 fix #1642
Fix auditorium JOIN lines with zero values for the time and msgid tags.
2021-05-05 10:00:19 -04:00
Shivaram Lingamneni
503e575633
Merge pull request #1640 from oragono/l10n_master
New Crowdin updates
2021-04-29 23:19:52 -04:00
Daniel Oaks
b0b4f0492c New translations irc.lang.json (Italian) 2021-04-30 13:04:46 +10:00
Daniel Oaks
14cc20c2a0 New translations irc.lang.json (Romanian) 2021-04-30 13:04:32 +10:00
Daniel Oaks
d35f38f161 New translations irc.lang.json (Spanish) 2021-04-30 13:04:27 +10:00
Daniel Oaks
648ad4a4c3 New translations irc.lang.json (Bosnian) 2021-04-30 13:03:45 +10:00
Daniel Oaks
9100fb7ca1 New translations irc.lang.json (French) 2021-04-30 13:03:16 +10:00
Shivaram Lingamneni
9983478479
Merge pull request #1639 from slingamn/strings
update strings
2021-04-29 22:58:52 -04:00
Shivaram Lingamneni
23ffc6ef91 update strings 2021-04-28 07:12:54 -04:00
Shivaram Lingamneni
a9294e628f
Merge pull request #1638 from oragono/l10n_master
New Crowdin updates
2021-04-28 07:11:59 -04:00
Daniel Oaks
8b693ec24f New translations irc.lang.json (French) 2021-04-28 16:25:34 +10:00
Shivaram Lingamneni
33616df7c4
Merge pull request #1637 from slingamn/config_warning
add a warning for the #1634 case
2021-04-27 08:49:25 -04:00
Shivaram Lingamneni
aa27ad98a8 add a warning for the #1634 case
Configurations with require-sasl and open account registration are valid,
but likely unintended. Show a warning about them.
2021-04-27 08:44:54 -04:00
Shivaram Lingamneni
5c157adf45
Merge pull request #1636 from slingamn/tor_require_sasl
propagate require-sasl into tor-listeners.require-sasl
2021-04-26 10:38:59 -04:00
Shivaram Lingamneni
2d31a16647 propagate require-sasl into tor-listeners.require-sasl 2021-04-26 10:26:16 -04:00
Shivaram Lingamneni
317720bfc8
Merge pull request #1632 from slingamn/mysql_safety
fix #1622
2021-04-25 23:14:40 -04:00
Shivaram Lingamneni
e14aace1da
Merge pull request #1635 from slingamn/pass
fix #1634 (forward-porting to master)
2021-04-25 21:34:12 -04:00
Shivaram Lingamneni
973d7dc1dc
Merge pull request #1633 from slingamn/register_400
fix FAIL REGISTER INVALID_USERNAME case
2021-04-25 20:43:15 -04:00
Shivaram Lingamneni
97ba1c3d63 fix #1634:
1. Fix auth bypass in the default configuration with the addition of
   server.password (the REGISTER command was allowed before connection
   registration, allowing unauthenticated users to REGISTER and then
   take advantage of skip-server-password)
2. Caution operators against the use of require-sasl without disabling
   user-initiated account registration. (Such a configuration is still valid
   in the case of a public server that requires everyone to register.)
2021-04-25 19:22:08 -04:00
Shivaram Lingamneni
75f89a9f1f fix FAIL REGISTER INVALID_USERNAME case 2021-04-25 17:16:34 -04:00
Shivaram Lingamneni
5eed48c077 fix #1622
Allow users to set max MySQL connections and connection lifetime;
set a sane default for max connections if it's not present.
2021-04-23 13:54:44 -04:00
Shivaram Lingamneni
a2b5548c8b
Merge pull request #1631 from slingamn/autoreplay_dms
fix autoreplay of DMs
2021-04-21 11:10:30 -04:00
Shivaram Lingamneni
c53926acde fix autoreplay of DMs
I broke this in #1615 / 0d05ab4ff4249f
2021-04-21 10:53:43 -04:00
Shivaram Lingamneni
0b414cb158
Merge pull request #1625 from slingamn/cleanup_star.2
fix #1615
2021-04-21 09:27:54 -04:00
Shivaram Lingamneni
6b8a487b0c
Merge pull request #1628 from slingamn/issue1627_channel_listing
fix #1627
2021-04-21 07:58:53 -04:00
Shivaram Lingamneni
8bf6231ec6
Merge pull request #1629 from jesopo/global-notice
implement mass/global messaging
2021-04-21 07:58:40 -04:00
jesopo
4700d4c048 make gofmt happey :)) 2021-04-20 11:05:05 +00:00
jesopo
7345ecba48 don't Sprintf for each match, Details().nick -> .Nick() 2021-04-20 11:04:24 +00:00
jesopo
76697dff0f "massmessage" oper capab in traditional.yaml too 2021-04-20 11:00:09 +00:00
jesopo
c74a64b888 add massmessage oper capab to default.yaml 2021-04-20 10:50:52 +00:00
jesopo
0a1537f928 support $$server and $#hostname global messages 2021-04-20 10:46:43 +00:00
Shivaram Lingamneni
88f8caad0b fix #1627
Fix incorrect description of channel ownership in NS INFO
2021-04-19 15:49:56 -04:00
Shivaram Lingamneni
0d05ab4ff4 fix #1615
Remove the CHATHISTORY * and znc.in/playback *self targets,
clean up associated database code, add new mechanisms to play
all missed DMs.
2021-04-19 08:54:40 -04:00
Shivaram Lingamneni
50d32924ef
Merge pull request #1623 from slingamn/close_1577
fix #1577
2021-04-19 07:54:43 -04:00
Shivaram Lingamneni
da216fc699 fix #1577
Remove debugging loglines for truncation
2021-04-19 07:06:49 -04:00
Shivaram Lingamneni
d2278faf75
Merge pull request #1621 from slingamn/deps
upgrade dependencies for 2.7 window
2021-04-19 06:59:08 -04:00
Shivaram Lingamneni
a7db4a669e upgrade yaml 2021-04-19 06:50:34 -04:00
Shivaram Lingamneni
6f56121662 upgrade x/text 2021-04-19 06:49:56 -04:00
Shivaram Lingamneni
c62edcc909 upgrade x/crypto and dependencies 2021-04-19 06:48:51 -04:00
Shivaram Lingamneni
57c5030e91 upgrade mysql driver 2021-04-19 06:42:39 -04:00
Shivaram Lingamneni
3ceb346c61
Merge pull request #1620 from slingamn/bugs
small fixes to kick off the 2.7 window
2021-04-19 06:32:10 -04:00
Shivaram Lingamneni
3e05502c3f bump irctest to latest 2021-04-18 23:16:37 -04:00
Shivaram Lingamneni
517b776b62 don't call (*Config).prepareListeners twice 2021-04-18 21:40:33 -04:00
Shivaram Lingamneni
1a5d079670 fix #1611
Allow setting the minimum TLS version
2021-04-18 21:40:33 -04:00
Shivaram Lingamneni
eb2dfa78c9 fix #1617
Prevent LUSERS stats from getting out of sync when modes are
modified on offline clients.
2021-04-18 20:18:02 -04:00
Shivaram Lingamneni
fed002d11a fix #1618
Allow snomasks to be added via oper config block, even if the oper
doesn't have `ban` or `snomasks` and therefore can't add snomasks
on their own.
2021-04-18 20:06:00 -04:00
Shivaram Lingamneni
3cca1e2c39 fix #1619
Clean up channels during unregistration if necessary.
2021-04-18 20:03:17 -04:00
Shivaram Lingamneni
fed5134a63 set up new development version 2021-04-18 17:03:25 -04:00
Shivaram Lingamneni
7481bf0385 bump version and changelog 2021-04-18 14:30:35 -04:00
Shivaram Lingamneni
41738471ce final tweak to changelog 2021-04-18 13:44:10 -04:00
Shivaram Lingamneni
319b9a6c6e note irctest_stable in release runbook 2021-04-15 07:24:00 -04:00
Shivaram Lingamneni
022330b9b8 manual: clarify SNI preference order 2021-04-14 05:18:35 -04:00
Shivaram Lingamneni
cda268fe1e fix some documentation 2021-04-11 00:05:46 -04:00
Shivaram Lingamneni
197d487f40 bump version for 2.6.0-rc1 2021-04-10 23:51:10 -04:00
Shivaram Lingamneni
2a99a8e2d5
Merge pull request #1614 from slingamn/changelog
changelog updates for 2.6.0-rc1
2021-04-10 23:40:50 -04:00
Shivaram Lingamneni
48932e7ab1 changelog updates for 2.6.0-rc1 2021-04-10 23:40:27 -04:00
Shivaram Lingamneni
a0a4ab4e17
Merge pull request #1612 from slingamn/forward_mode
publish the FORWARD 005 token
2021-04-08 07:33:17 -04:00
Shivaram Lingamneni
8dd12b0693 publish the FORWARD 005 token 2021-04-08 07:10:05 -04:00
Shivaram Lingamneni
639817f014
Merge pull request #1608 from slingamn/sni.1
close remaining 2.6 issues
2021-04-08 05:31:45 -04:00
Shivaram Lingamneni
5cd76f89d4 fix #1545
Warn users that NS UNREGISTER doesn't give them a "do-over";
the account name will remain reserved.
2021-04-08 05:17:37 -04:00
Shivaram Lingamneni
6817186224 fix #1518
UBAN ADD and DEL need to produce snomasks and loglines
2021-04-08 05:17:37 -04:00
Shivaram Lingamneni
745fd764dd fix #1524
Document permissions structure of CS AMODE
2021-04-08 00:55:30 -04:00
Shivaram Lingamneni
db41b2bc34 fix #765
CS INFO with no arguments should list your registered channels
2021-04-07 23:30:24 -04:00
Shivaram Lingamneni
1fc513cef0 document SNI 2021-04-07 23:30:24 -04:00
Shivaram Lingamneni
aecb28a616 support SNI 2021-04-07 23:30:24 -04:00
Shivaram Lingamneni
f9c1a00b91 populate (tls.Certificate).Leaf 2021-04-07 22:35:54 -04:00
Shivaram Lingamneni
2e3e4f72ba fix inverted error check in deleteCorrespondents 2021-04-07 22:16:18 -04:00
Shivaram Lingamneni
f0796b2eb5
Merge pull request #1607 from slingamn/semaphore_update
simplify semaphore release code
2021-04-07 08:56:53 -04:00
Shivaram Lingamneni
b83b051632
Merge pull request #1606 from slingamn/listcorrespondents.2
fix #1592
2021-04-07 08:55:59 -04:00
Shivaram Lingamneni
5b33cd436f remove unnecessary indirection in semaphore 2021-04-07 08:44:17 -04:00
Shivaram Lingamneni
549d06bc98 simplify semaphore release code 2021-04-07 08:33:19 -04:00
Shivaram Lingamneni
18b6e2f1cd implement CHATHISTORY TARGETS 2021-04-07 05:40:39 -04:00
Shivaram Lingamneni
4052cd12fe fix #1592
Implements the new `CHATHISTORY LISTCORRESPONDENTS` API.
2021-04-06 00:46:07 -04:00
Shivaram Lingamneni
2e9a0d4b2d
Merge pull request #1605 from slingamn/bunt_error
try to record buntdb errors from persisting lastSeen
2021-04-02 04:49:52 -04:00
Shivaram Lingamneni
fd3cbab6ee bump buntdb to v1.2.3
Potentially fixes the database corruption seen on #1603
2021-04-01 20:45:15 -04:00
Shivaram Lingamneni
b022c34a23 try to record buntdb errors from persisting lastSeen
See #1603
2021-03-31 07:06:58 -04:00
Shivaram Lingamneni
0b5544831d
Merge pull request #1599 from slingamn/issue1594_warn_nick
fix #1594
2021-03-18 04:45:29 -04:00
Shivaram Lingamneni
1f2f740344
Merge pull request #1600 from slingamn/issue1576
fix #1576
2021-03-18 04:45:11 -04:00
Shivaram Lingamneni
46c32094d7 review fixes
1. Use FAIL instead of WARN
2. Use NICKNAME_RESERVED instead of ACCOUNT_REQUIRED
3. Don't send 433 at all for registered clients, just send the FAIL
2021-03-18 04:38:28 -04:00
Shivaram Lingamneni
ab870c2ffe fix #1576
List IRCv3 CAPs in `NS CLIENTS LIST` output
2021-03-18 04:24:45 -04:00
Shivaram Lingamneni
67ee36f1ed fix #1594
Send a WARN NICK ACCOUNT_REQUIRED on attempt to take a reserved nick
2021-03-18 04:10:32 -04:00
Shivaram Lingamneni
a6cf667f06
Merge pull request #1598 from slingamn/issue1596_truncation
fix #1596
2021-03-18 04:06:38 -04:00
Shivaram Lingamneni
074a5a077e bump irc-go to include new ircutils function 2021-03-18 03:56:57 -04:00
Shivaram Lingamneni
e447c61c73 fix #1596
All truncation must be made UTF8-safe.
2021-03-18 03:49:12 -04:00
Shivaram Lingamneni
cd43fae478
Merge pull request #1597 from slingamn/away_session.1
fix #1531
2021-03-18 03:28:03 -04:00
Shivaram Lingamneni
0db7f88637
Merge pull request #1595 from slingamn/botmode.1
Fix #1562
2021-03-18 03:27:54 -04:00
Shivaram Lingamneni
07edf2dc1f consolidate auto-away string 2021-03-18 03:04:44 -04:00
Shivaram Lingamneni
70b20750aa fix #1531
AWAY status should be tracked per-session:

1. With auto-away enabled, away status is aggregated across sessions
   (if any session is not away, the client is not away, else use
   the away status that was set most recently)
2. With auto-away disabled, we get the legacy behavior where AWAY
   applies directly to the client
2021-03-18 02:53:18 -04:00
Shivaram Lingamneni
88b877fce4 ensure IsBot gets propagated into history 2021-03-17 19:01:38 -04:00
Shivaram Lingamneni
1efde964e1 Fix #1562
Implement the new bot mode spec:
https://github.com/ircv3/ircv3-specifications/pull/439
2021-03-17 14:36:52 -04:00
Shivaram Lingamneni
507d53c507
Merge pull request #1591 from slingamn/grabbag
some small fixes/enhancements
2021-03-11 02:01:08 -05:00
Shivaram Lingamneni
fe8e6551c3 fix #1502
RELAYMSG should respect mutes
2021-03-11 01:21:03 -05:00
Shivaram Lingamneni
76b0e44474 fix #1534
Improve error message for CS TRANSFER
2021-03-11 00:49:12 -05:00
Shivaram Lingamneni
5c4984f45f fix #1544
PerstentStatusMandatory should display as "enabled", not "mandatory",
in the context where it refers to a user-chosen setting.
2021-03-11 00:45:13 -05:00
Shivaram Lingamneni
44ed0b7a38 fix #1565
Allow chanops to delete channel messages from history
2021-03-11 00:45:13 -05:00
Shivaram Lingamneni
4e49a25ba6 fix #1570
Handle panics in rehash, even if it was triggered by SIGHUP
2021-03-10 23:04:16 -05:00
Shivaram Lingamneni
de31430fdc
Merge pull request #1590 from slingamn/ircgo_bump
bump irc-go again
2021-03-10 20:14:31 -05:00
Shivaram Lingamneni
131eb229bc use the new irc-go identifiers 2021-03-10 20:07:43 -05:00
Shivaram Lingamneni
896ed91d45 bump irc-go 2021-03-10 20:07:42 -05:00
Shivaram Lingamneni
19642680d2
Merge pull request #1588 from ajaspers/docs
Fix link to productionizing guide.
2021-03-07 15:53:35 -05:00
Alex Jaspersen
f495d30f1d Fix link to productionizing guide. 2021-03-07 12:36:00 -08:00
Shivaram Lingamneni
6e20e44879
Merge pull request #1587 from slingamn/irctest_bump
bump irctest
2021-03-06 19:55:35 -05:00
Shivaram Lingamneni
c1e9ac4c3c bump irctest 2021-03-05 15:03:35 -05:00
Shivaram Lingamneni
788b37b12a
Merge pull request #1586 from slingamn/issue1577_no_truncation.2
deprecate message truncation
2021-03-04 23:49:35 -05:00
Shivaram Lingamneni
03185ea4a9 deprecate message truncation
Implements #1577, but the issue should remain open until we clean up
the debugging loglines.
2021-03-04 22:29:34 -05:00
Shivaram Lingamneni
6fae02d335
Merge pull request #1585 from slingamn/issue1584_websocket_preference.1
fix #1584
2021-03-04 20:50:48 -05:00
Shivaram Lingamneni
f05c57344e go get and commit the websocket fork 2021-03-04 18:31:58 -05:00
Shivaram Lingamneni
7b8e15ff1d replace (via modules) gorilla/websocket with our fork
See #1584
2021-03-04 18:31:37 -05:00
Shivaram Lingamneni
26cb622f92
Merge pull request #1580 from ajaspers/plusR
Send 477 ERR_NEEDREGGEDNICK when an unregistered user messages a +R user.
2021-03-04 17:14:45 -05:00
Shivaram Lingamneni
ad3306fa3b
Merge pull request #1581 from ajaspers/docs
Minor documentation updates.
2021-03-03 23:59:53 -05:00
Shivaram Lingamneni
780bdc4cd2
Merge pull request #1579 from Mikaela/nginx-proxy-timeout
docs/MANUAL.md: add recommendation for proxy timeout
2021-03-03 22:58:52 -05:00
Alex Jaspersen
9c7e98ab53 Minor documentation updates.
The +M channel mode is documented twice. Merge the two sections.
Clarify that +R restricts both joining and speaking, but does not kick existing unregistered users.
2021-03-03 19:56:47 -08:00
Alex Jaspersen
23164054f6 Send 477 ERR_NEEDREGGEDNICK when an unregistered user messages a +R user.
Fixes #1064.
2021-03-03 19:36:29 -08:00
da84082e0a
docs/MANUAL.md: add recommendation for proxy timeout
Resolves: #1578
2021-03-03 21:12:58 +02:00
Shivaram Lingamneni
1762a168e8
Merge pull request #1558 from slingamn/websocket_compromise
implement candidate compromise proposal for websockets
2021-03-02 00:18:13 -05:00
Shivaram Lingamneni
00edd78f59
Merge pull request #1573 from slingamn/faq
update the FAQ to cover some controversial issues
2021-03-02 00:16:36 -05:00
Shivaram Lingamneni
088f4d1a37
Merge pull request #1574 from slingamn/nspassword
fix #1547
2021-03-02 00:14:43 -05:00
Shivaram Lingamneni
22af40c995 fix #1547
make PASSWORD an alias for PASSWD in nickserv
2021-03-01 22:40:39 -05:00
Shivaram Lingamneni
72f41f6b3f make systemd and letsencrypt two separate manual sections 2021-03-01 22:21:53 -05:00
Shivaram Lingamneni
96f575c739 update the FAQ to cover some controversial issues 2021-03-01 22:10:11 -05:00
Shivaram Lingamneni
872ca646f3
Merge pull request #1572 from slingamn/ircgo_upgrade
bump irc-go to fix buffering issue
2021-03-01 19:13:51 -05:00
Shivaram Lingamneni
992a09dc90 bump irc-go to fix buffering issue 2021-03-01 19:04:02 -05:00
Shivaram Lingamneni
eeb5f9b24d
Merge pull request #1560 from slingamn/configerrors
fix #1559
2021-03-01 17:10:29 -05:00
Shivaram Lingamneni
143e6ba9e3
Merge pull request #1571 from slingamn/validation
validate that passphrases are valid as non-final IRC parameters
2021-03-01 17:09:51 -05:00
Shivaram Lingamneni
d7ba478519 validate that passphrases are valid as non-final IRC parameters 2021-03-01 11:47:29 -05:00
Shivaram Lingamneni
67db9f3564
Merge pull request #1567 from oragono/l10n_master
New Crowdin updates
2021-02-28 17:51:57 -05:00
Shivaram Lingamneni
3a62fde6bd
Merge pull request #1569 from oragono/bump_irctest
bump irctest to latest upstream master
2021-02-28 17:51:17 -05:00
Shivaram Lingamneni
1642121203 bump irctest to latest upstream master 2021-02-28 17:42:06 -05:00
Shivaram Lingamneni
a3e5b3d991
Merge pull request #1568 from slingamn/register_update
improve compatibility with published register spec
2021-02-28 17:22:27 -05:00
Shivaram Lingamneni
8180c2b572 improve compatibility with published register spec
1. Send COMPLETE_CONNECTION_REQUIRED instead of DISALLOWED
2. Include the account name in all FAIL messages
2021-02-28 17:14:10 -05:00
Daniel Oaks
66f1ea9fd4 New translations nickserv.lang.json (French) 2021-03-01 02:34:26 +10:00
Daniel Oaks
19a71849cf New translations irc.lang.json (French) 2021-03-01 02:34:23 +10:00
Shivaram Lingamneni
1d3d9f4cf5
Merge pull request #1564 from slingamn/issue1563_modeparam
fix #1563
2021-02-27 23:26:02 -05:00
Shivaram Lingamneni
16f0170512 fix #1563
ERR_INVALIDMODEPARAM should take both the mode and the invalid parameter
as arguments.
2021-02-27 21:51:14 -05:00
Shivaram Lingamneni
e9d42e02a2 simplify utf8 validation of incoming WS lines
As of #1483, websockets entail enforce-utf8, so there's no need
to check globalUTF8EnforcementSetting when handling websockets.
2021-02-26 03:10:30 -05:00
Shivaram Lingamneni
29666107ab fix #1559
Improve debuggability of some config deserialization errors
2021-02-26 01:10:21 -05:00
Shivaram Lingamneni
d547d05205 implement candidate compromise proposal for websockets
1. Text and binary frames are accepted
2. Text frames are sent by default
3. Binary frames are sent to clients who negotiate `binary.ircv3.net`
4. Non-UTF8 data is not accepted (enabling websockets still enables UTFONLY)
2021-02-24 14:08:04 -05:00
Shivaram Lingamneni
640572e151 update release branch instructions 2021-02-24 13:21:53 -05:00
Shivaram Lingamneni
cbaa6af9bd
Merge pull request #1557 from slingamn/ircgo_bump
bump irc-go to latest
2021-02-22 23:31:38 -05:00
Shivaram Lingamneni
a6f3e2c748 bump irc-go to latest 2021-02-22 22:11:18 -05:00
Shivaram Lingamneni
2681097516
Merge pull request #1555 from slingamn/irctest_upstream
upgrade irctest to new, reintegrated master
2021-02-22 15:36:14 -05:00
Shivaram Lingamneni
cd5b6211b3 upgrade irctest to new, reintegrated master 2021-02-22 14:46:48 -05:00
Shivaram Lingamneni
092f193326
Merge pull request #1554 from slingamn/ircgo_upgrade
bump irc-go to latest
2021-02-21 21:35:44 -05:00
Shivaram Lingamneni
7af94c79fd bump irc-go to latest 2021-02-21 20:22:32 -05:00
Shivaram Lingamneni
08eabea78f
Merge pull request #1553 from slingamn/zncpanic
fix #1552
2021-02-21 16:00:01 -05:00
Shivaram Lingamneni
1f3f9f18d9 fix #1552
ZNC playback LIST was panicking when history was disabled,
and possibly in other cases
2021-02-21 15:29:19 -05:00
Shivaram Lingamneni
56bef19505
Merge pull request #1550 from slingamn/history_cap_disable
fix #1549
2021-02-21 13:28:43 -05:00
Shivaram Lingamneni
9e25a3027a fix #1549
If history is disabled, disable the history CAPs
2021-02-21 13:25:22 -05:00
Shivaram Lingamneni
3fc277e733 update migration script links to point to stable branch 2021-02-17 17:16:12 -05:00
Shivaram Lingamneni
7814694d17
Merge pull request #1543 from oragono/goupgrade
upgrade go to 1.16
2021-02-17 15:18:50 -05:00
Shivaram Lingamneni
430b40fc2f upgrade go to 1.16
Fixes #1510
2021-02-17 15:14:53 -05:00
Shivaram Lingamneni
dc4214a8ca suggest 0700 permissions for the role user homedir 2021-02-17 02:09:01 -05:00
Shivaram Lingamneni
8de7a0edbe
Merge pull request #1541 from oragono/l10n_master
New Crowdin updates
2021-02-16 00:24:19 -05:00
Daniel Oaks
58e3694e84 New translations chanserv.lang.json (Romanian) 2021-02-16 14:14:15 +10:00
Daniel Oaks
82eb55e0b2 New translations irc.lang.json (Romanian) 2021-02-16 14:14:13 +10:00
Shivaram Lingamneni
a6545728bd
Merge pull request #1540 from slingamn/ircmsg_rename
bump irc-go for the IRCMessage rename
2021-02-15 11:34:45 -05:00
Shivaram Lingamneni
e957a89ee2 bump irc-go for the IRCMessage rename 2021-02-15 11:27:04 -05:00
Shivaram Lingamneni
2fbbfb1337
Merge pull request #1539 from oragono/l10n_master
New Crowdin updates
2021-02-15 11:24:04 -05:00
Daniel Oaks
4d3f9dd509 New translations help.lang.json (Dutch) 2021-02-16 02:18:21 +10:00
Daniel Oaks
43cc2bf9be New translations chanserv.lang.json (Portuguese, Brazilian) 2021-02-16 02:16:13 +10:00
Daniel Oaks
d92bcf0358 New translations nickserv.lang.json (Portuguese, Brazilian) 2021-02-16 02:16:02 +10:00
Daniel Oaks
887fda5221 New translations translation.lang.yaml (Albanian) 2021-02-16 02:15:52 +10:00
Daniel Oaks
1fb736b394 New translations irc.lang.json (Portuguese, Brazilian) 2021-02-16 01:57:50 +10:00
Daniel Oaks
155fb3ea21 New translations chanserv.lang.json (Portuguese, Brazilian) 2021-02-16 01:57:48 +10:00
Daniel Oaks
0aa725e9f2 New translations irc.lang.json (Bosnian) 2021-02-16 01:57:42 +10:00
Daniel Oaks
d90124ca42 New translations help.lang.json (Bosnian) 2021-02-16 01:57:40 +10:00
Daniel Oaks
819228fdb5 New translations chanserv.lang.json (Bosnian) 2021-02-16 01:57:39 +10:00
Daniel Oaks
3f6971e087 New translations irc.lang.json (Greek) 2021-02-16 01:57:36 +10:00
Daniel Oaks
bb4a129c9a New translations chanserv.lang.json (German) 2021-02-16 01:57:34 +10:00
Daniel Oaks
6c727dfc1c New translations irc.lang.json (German) 2021-02-16 01:57:32 +10:00
Daniel Oaks
e0d3b54aaf New translations chanserv.lang.json (Albanian) 2021-02-16 01:57:07 +10:00
Daniel Oaks
3a1327966b New translations irc.lang.json (Romanian) 2021-02-16 01:57:05 +10:00
Daniel Oaks
aef082fd71 New translations help.lang.json (Romanian) 2021-02-16 01:57:03 +10:00
Daniel Oaks
a164b7aef9 New translations chanserv.lang.json (Romanian) 2021-02-16 01:57:02 +10:00
Daniel Oaks
7969229a07 New translations irc.lang.json (French) 2021-02-16 01:57:00 +10:00
Daniel Oaks
c0fc2620e3 New translations help.lang.json (French) 2021-02-16 01:56:59 +10:00
Daniel Oaks
3a8e9ec2ff New translations chanserv.lang.json (French) 2021-02-16 01:56:58 +10:00
Daniel Oaks
41fd2cbabe New translations irc.lang.json (Spanish) 2021-02-16 01:56:55 +10:00
Daniel Oaks
7d08b83eff New translations help.lang.json (Spanish) 2021-02-16 01:56:54 +10:00
Daniel Oaks
014d141b88 New translations irc.lang.json (Italian) 2021-02-16 01:56:45 +10:00
Daniel Oaks
e95ddc72af New translations help.lang.json (Italian) 2021-02-16 01:56:40 +10:00
Daniel Oaks
4da60a41d7 New translations irc.lang.json (Turkish) 2021-02-16 01:56:30 +10:00
Daniel Oaks
f1c927bbf8 New translations irc.lang.json (Chinese Simplified) 2021-02-16 01:56:22 +10:00
Daniel Oaks
f71345d096 New translations chanserv.lang.json (Chinese Simplified) 2021-02-16 01:56:20 +10:00
Daniel Oaks
64b868a725 New translations chanserv.lang.json (Italian) 2021-02-16 01:56:11 +10:00
Daniel Oaks
d873426f5b New translations help.lang.json (Dutch) 2021-02-16 01:55:59 +10:00
Daniel Oaks
06e109e347 New translations irc.lang.json (Norwegian) 2021-02-16 01:55:55 +10:00
Daniel Oaks
528678e2c9 New translations irc.lang.json (Polish) 2021-02-16 01:55:52 +10:00
Shivaram Lingamneni
38275601e1
Merge pull request #1538 from slingamn/strings
update strings
2021-02-14 23:03:58 -05:00
Shivaram Lingamneni
fdfa9de79f update strings 2021-02-14 22:58:02 -05:00
Shivaram Lingamneni
8876b61b9c
Merge pull request #1537 from oragono/l10n_master
New Crowdin updates
2021-02-14 22:57:06 -05:00
Daniel Oaks
230fdc57c8 New translations hostserv.lang.json (Albanian) 2021-02-15 13:54:15 +10:00
Daniel Oaks
0956ce78f4 New translations nickserv.lang.json (Albanian) 2021-02-15 13:54:13 +10:00
Daniel Oaks
cf5d6bdf9a New translations chanserv.lang.json (Albanian) 2021-02-15 13:54:12 +10:00
Daniel Oaks
14ff84a504 New translations help.lang.json (Albanian) 2021-02-15 13:54:11 +10:00
Daniel Oaks
6954d04af9 New translations irc.lang.json (Albanian) 2021-02-15 13:54:10 +10:00
Daniel Oaks
5ad165e31e New translations translation.lang.yaml (Albanian) 2021-02-15 13:54:09 +10:00
Shivaram Lingamneni
9fd4210416
Merge pull request #1536 from slingamn/ircreader.1
use the new goshuirc ircreader
2021-02-13 21:06:42 -05:00
Shivaram Lingamneni
d0e11f49ad use the new goshuirc ircreader 2021-02-13 20:58:19 -05:00
Shivaram Lingamneni
ec8ed2ae2a
Merge pull request #1535 from Mikaela/WeeChat-spelling
docs/USERGUIDE.md & irc/handlers.go: fix spelling of WeeChat
2021-02-13 18:42:14 -05:00
4340da9b6e
docs/USERGUIDE.md & irc/handlers.go: fix spelling of WeeChat 2021-02-13 14:44:13 +02:00
Shivaram Lingamneni
d8083e8de8
Merge pull request #1533 from slingamn/userguide_multiclient
explicitly document multiclient in the user guide
2021-02-12 13:17:34 -05:00
Shivaram Lingamneni
a1b33fc176 explicitly document multiclient 2021-02-12 13:16:53 -05:00
Shivaram Lingamneni
bb39399f97
Merge pull request #1528 from slingamn/issue1176_operprivs
enhancements to operator privilege handling
2021-02-09 22:56:58 -05:00
Shivaram Lingamneni
91cfdb963d fix #1074
Make snomask add/remove behavior match other ircds
2021-02-09 22:07:06 -05:00
Shivaram Lingamneni
42316bc04f fix #1176
Transition most "is an operator" checks to require a specific operator
capability
2021-02-09 22:07:06 -05:00
Shivaram Lingamneni
9aeb80dbf3
Merge pull request #1526 from slingamn/issue1516_amode_op
fix #1516
2021-02-09 13:59:29 -05:00
Shivaram Lingamneni
a9cae85052 bump irctest 2021-02-09 01:06:01 -05:00
Shivaram Lingamneni
dfc26d1182 fix a help typo 2021-02-09 01:05:47 -05:00
Shivaram Lingamneni
7ce396931c fix #1516
CS OP should regrant one's stored amode
2021-02-05 13:07:39 -05:00
Shivaram Lingamneni
4c08bc9c49
Merge pull request #1525 from slingamn/issue1523_halfop_topic
fix #1523
2021-02-05 13:07:07 -05:00
Shivaram Lingamneni
5227c144d7
Merge pull request #1522 from slingamn/issue1507_registered_channels
fix #1507
2021-02-05 13:06:54 -05:00
Shivaram Lingamneni
6f1bc9896b fix #1523
Let halfops change the channel topic
2021-02-05 11:02:31 -05:00
Shivaram Lingamneni
cc6be14c1d fix #1507
Registered channels should be eagerly created on startup, and should
remain (and be visible in LIST) even when they have no members.
2021-02-04 15:26:03 -05:00
Shivaram Lingamneni
1fad76b906 set up new development version (again) 2021-02-03 08:24:01 -05:00
Shivaram Lingamneni
4860c5cad0
Merge pull request #1521 from slingamn/pointfix
security fix necessitating 2.5.1
2021-02-02 17:09:46 -05:00
Shivaram Lingamneni
6f1380f77f bump version and changelog 2021-02-02 16:54:29 -05:00
Shivaram Lingamneni
de392aea5a fix incorrect permissions check in NS CLIENTS LOGOUT 2021-02-02 16:50:47 -05:00
Shivaram Lingamneni
e54d8cfcd9 fix duplicated word in CS AMODE help 2021-02-02 15:27:24 -05:00
Shivaram Lingamneni
ec48d6b97d set up new development version 2021-01-30 23:01:40 -05:00
Shivaram Lingamneni
7953804e72 bump version to 2.5.0 2021-01-30 22:19:08 -05:00
Shivaram Lingamneni
351f3bbc21 final documentation updates for 2.5.0 2021-01-30 22:07:51 -05:00
Shivaram Lingamneni
2ce74ff9c1 bump version for 2.5.0-rc1 2021-01-23 20:42:30 -05:00
Shivaram Lingamneni
7ba594613b
Merge pull request #1498 from slingamn/changelog.1
changelog updates for v2.5.0-rc1
2021-01-23 20:39:35 -05:00
Shivaram Lingamneni
6d3dd66031
Merge pull request #1505 from slingamn/uban_sasl_followup
require-sasl uban should not kill authenticated clients
2021-01-22 11:00:12 -05:00
Shivaram Lingamneni
81ae166dfb require-sasl uban should not kill authenticated clients 2021-01-22 10:49:54 -05:00
Shivaram Lingamneni
a988434bf3
Merge pull request #1504 from slingamn/soft_dline
allow UBAN <ip> REQUIRE-SASL
2021-01-22 10:11:01 -05:00
Shivaram Lingamneni
07fa2ecb3e allow UBAN <ip> REQUIRE-SASL 2021-01-22 09:38:40 -05:00
Shivaram Lingamneni
7728844ac4 documentation updates 2021-01-22 08:50:12 -05:00
Shivaram Lingamneni
7b45e81178
Merge pull request #1503 from slingamn/uban_tweak.1
tweaks to UBAN
2021-01-22 07:49:26 -05:00
Shivaram Lingamneni
8dd39a6e71 tweaks to UBAN 2021-01-22 07:27:10 -05:00
Shivaram Lingamneni
c14154c062
Merge pull request #1501 from slingamn/uban_fixes
fix UBAN INFO considering the wrong IP
2021-01-21 17:01:21 -05:00
Shivaram Lingamneni
a237ce428f fix permissions check in CS HOWTOBAN 2021-01-21 16:48:57 -05:00
Shivaram Lingamneni
6bd396f5a2 fix UBAN INFO considering the wrong IP 2021-01-21 16:40:01 -05:00
Shivaram Lingamneni
b2551a35e0
Merge pull request #1500 from oragono/l10n_master
New Crowdin updates
2021-01-21 12:02:10 -05:00
Daniel Oaks
9416b9f76d New translations irc.lang.json (German) 2021-01-22 02:59:46 +10:00
Daniel Oaks
b4b71f5b73 New translations chanserv.lang.json (German) 2021-01-22 02:59:44 +10:00
Daniel Oaks
7245862bac New translations irc.lang.json (Greek) 2021-01-22 02:59:41 +10:00
Daniel Oaks
d98d1573fb New translations irc.lang.json (Italian) 2021-01-22 02:59:24 +10:00
Daniel Oaks
f24be717aa New translations help.lang.json (Italian) 2021-01-22 02:59:21 +10:00
Daniel Oaks
826aa2504a New translations chanserv.lang.json (Italian) 2021-01-22 02:59:20 +10:00
Daniel Oaks
aaf5abfa0b New translations help.lang.json (Romanian) 2021-01-22 02:59:08 +10:00
Daniel Oaks
e20fb84853 New translations chanserv.lang.json (Romanian) 2021-01-22 02:59:06 +10:00
Daniel Oaks
09007e30c2 New translations irc.lang.json (French) 2021-01-22 02:59:02 +10:00
Daniel Oaks
024645493a New translations help.lang.json (French) 2021-01-22 02:59:00 +10:00
Daniel Oaks
2b088fae58 New translations chanserv.lang.json (French) 2021-01-22 02:58:58 +10:00
Daniel Oaks
2997375c12 New translations irc.lang.json (Spanish) 2021-01-22 02:58:55 +10:00
Daniel Oaks
ac07660a14 New translations help.lang.json (Spanish) 2021-01-22 02:58:53 +10:00
Daniel Oaks
55360ab48e New translations irc.lang.json (Romanian) 2021-01-22 02:58:31 +10:00
Daniel Oaks
712804f246 New translations irc.lang.json (Chinese Simplified) 2021-01-22 02:58:22 +10:00
Daniel Oaks
ddd05421cc New translations irc.lang.json (Portuguese, Brazilian) 2021-01-22 02:58:09 +10:00
Daniel Oaks
585e02e1ce New translations chanserv.lang.json (Portuguese, Brazilian) 2021-01-22 02:58:06 +10:00
Daniel Oaks
5dcf18c702 New translations irc.lang.json (English, Australia) 2021-01-22 02:58:04 +10:00
Daniel Oaks
9892d55e9b New translations irc.lang.json (Bosnian) 2021-01-22 02:57:59 +10:00
Daniel Oaks
48b498347c New translations help.lang.json (Bosnian) 2021-01-22 02:57:57 +10:00
Daniel Oaks
1e8befd6c0 New translations help.lang.json (Turkish) 2021-01-22 02:57:51 +10:00
Daniel Oaks
35263b29e0 New translations irc.lang.json (Norwegian) 2021-01-22 02:57:44 +10:00
Daniel Oaks
d71fa5711b New translations irc.lang.json (Turkish) 2021-01-22 02:57:33 +10:00
Shivaram Lingamneni
ba78489b87
Merge pull request #1499 from slingamn/updatestrings
update strings
2021-01-21 09:48:25 -05:00
Shivaram Lingamneni
7eb21df50a update strings 2021-01-21 09:40:32 -05:00
Shivaram Lingamneni
8198690ffd changelog updates for v2.5.0-rc1 2021-01-21 09:27:46 -05:00
Shivaram Lingamneni
0e311e27ee
Merge pull request #1497 from slingamn/bcrypt_cost
reduce recommended bcrypt cost to the lowest allowed value
2021-01-21 08:25:21 -05:00
Shivaram Lingamneni
e191e67632 reduce recommended bcrypt cost to the lowest allowed value
Two objectives:

1. Reduce thundering-herd effects on server restart (a cost of 4 should be
approximately 1 millisecond of CPU time per reconnecting client)
2. Speed up mobile reattach as much as possible (see also #1420)
2021-01-21 01:42:28 -05:00
Shivaram Lingamneni
2e7cf3cc1e
Merge pull request #1496 from slingamn/jointime.1
fix #1490
2021-01-21 01:20:45 -05:00
Shivaram Lingamneni
62d1f884eb
Merge pull request #1491 from slingamn/uban.3
UBAN and some other operator changes (fixes #1447)
2021-01-20 23:48:30 -05:00
Shivaram Lingamneni
4a48e52518 fix #1490
Track channel join times, use them to optionally enforce history access
restrictions
2021-01-20 21:13:18 -05:00
Shivaram Lingamneni
0d0fb87857
Merge pull request #1493 from oragono/l10n_master
New Crowdin updates
2021-01-19 19:19:28 -05:00
Daniel Oaks
5a0fa6a4b5 New translations hostserv.lang.json (Portuguese, Brazilian) 2021-01-20 07:58:13 +10:00
Daniel Oaks
2c609e4710 New translations nickserv.lang.json (Portuguese, Brazilian) 2021-01-20 07:58:11 +10:00
Shivaram Lingamneni
44bfca80a7 add IP addresses to UBAN ADD <account> output 2021-01-19 12:19:48 -05:00
Shivaram Lingamneni
bb5276553d initial UBAN implementation 2021-01-19 08:49:45 -05:00
Shivaram Lingamneni
64bc363cf1 fix #1443
Improve auditability of sensitive operator actions
2021-01-19 06:45:30 -05:00
Shivaram Lingamneni
e195854851 fix #1442
strip local_ from oper capab names, also consolidate unban into ban
2021-01-19 06:45:30 -05:00
Shivaram Lingamneni
8769e2d92a
Merge pull request #1489 from slingamn/documentation_stopgap
stopgap documentation update for SASL
2021-01-18 06:21:10 -05:00
Shivaram Lingamneni
4e036e7f6c stopgap documentation update for SASL
See #1488
2021-01-17 21:27:45 -05:00
Shivaram Lingamneni
096b2df41c
Merge pull request #1486 from slingamn/alwayson_expiration_followup
fix always-on expiration checks
2021-01-15 06:57:33 -05:00
Shivaram Lingamneni
6b7f0e15ac fix always-on expiration checks
checkAlwaysOnExpirationNoMutex was respecting registered status, but
always-on clients were not considered registered at the time of the
initial check, so they were being created regardless of expiration.
2021-01-15 06:50:35 -05:00
Shivaram Lingamneni
7b300a802f
Merge pull request #1484 from slingamn/utf8only
initial work on #1483
2021-01-15 06:21:53 -05:00
Shivaram Lingamneni
db81b15acb initial work on #1483
Add the new utf8-only cap, disallow non-utf8 when websockets are enabled
2021-01-15 06:19:13 -05:00
Shivaram Lingamneni
3e230e2a17
Merge pull request #1480 from slingamn/issue1479_tor_cloak
fix #1479
2021-01-15 06:18:35 -05:00
Shivaram Lingamneni
2fd537fc52
Merge pull request #1481 from slingamn/issue1476_grouped_sasl
fix #1476
2021-01-15 06:17:45 -05:00
Shivaram Lingamneni
5095a4d814 add commented-out PrivateNetwork to unit file 2021-01-14 01:17:46 -05:00
Shivaram Lingamneni
b7e9d6840b
Merge pull request #1485 from slingamn/manual_update
clarify productionizing guide
2021-01-13 18:09:10 -05:00
Shivaram Lingamneni
a14eecbb44 clarify productionizing guide 2021-01-13 17:56:30 -05:00
Shivaram Lingamneni
641981856b
Merge pull request #1482 from slingamn/tor_manual
update tor section of the manual
2021-01-13 03:25:22 -05:00
Shivaram Lingamneni
042d1320cd update tor section of the manual 2021-01-13 03:16:24 -05:00
Shivaram Lingamneni
bafadf3aac fix #1476
enable the use of grouped nicks as account names for SASL,
if force-nick-equals-account is disabled
2021-01-12 09:33:57 -05:00
Shivaram Lingamneni
d1f8317180 fix #1479
Give Tor clients who authenticate via SASL a unique cloak, so chanops
can ban *!*@tor-network.onion and still allow authenticated Tor users
2021-01-12 08:40:13 -05:00
Shivaram Lingamneni
f2a40b9e5d
Merge pull request #1475 from slingamn/roleplay_action_bug
fix incorrect CTCP ACTION messages sent by roleplay
2021-01-10 21:30:57 -05:00
Shivaram Lingamneni
ec1b8f9c3d
Merge pull request #1478 from slingamn/ircfmt_fix
bump ircfmt to fix snomask bug
2021-01-08 14:44:54 -05:00
Shivaram Lingamneni
3e86f68278 bump ircfmt to fix snomask bug 2021-01-08 14:33:22 -05:00
Shivaram Lingamneni
1db9cdd989 fix incorrect CTCP ACTION messages sent by roleplay 2020-12-31 14:06:19 -05:00
Shivaram Lingamneni
0db4b42ffe
Merge pull request #1474 from slingamn/issue1472_help_nick
fix #1472
2020-12-30 02:31:06 -05:00
Shivaram Lingamneni
ec375f5bdc consolidate ArgsToStrings 2020-12-30 00:41:34 -05:00
Shivaram Lingamneni
0c9ecbade7 ERR_HELPNOTFOUND should take the nick as a parameter 2020-12-29 13:19:46 -05:00
Shivaram Lingamneni
6965031aa9 fix #1472
HELP responses weren't taking the client nickname as a parameter,
as is standard.
2020-12-29 05:20:18 -05:00
Shivaram Lingamneni
a7c5696517
Merge pull request #1471 from slingamn/issue1467_ircfmt
fix #1467
2020-12-29 02:40:54 -05:00
Shivaram Lingamneni
4f3b005d18 bump ircfmt 2020-12-27 20:18:29 -05:00
Shivaram Lingamneni
7c4d016fcb fix incorrect sprintf-before-unescape 2020-12-27 20:17:24 -05:00
Shivaram Lingamneni
5342ab1bb1
Merge pull request #1470 from slingamn/issue1468_relaymsg_tag
fix #1468
2020-12-22 02:16:17 -05:00
Shivaram Lingamneni
a566c85b12
Merge pull request #1438 from slingamn/issue1436_badchars
fix #1436
2020-12-22 02:16:01 -05:00
Shivaram Lingamneni
8abbc1072b additionally disallow ; in nicknames 2020-12-21 23:09:34 -05:00
Shivaram Lingamneni
b3f2058d47 bump irctest 2020-12-21 22:08:00 -05:00
Shivaram Lingamneni
514a2e613f fix #1468 2020-12-21 22:07:48 -05:00
Shivaram Lingamneni
5c64612455
Merge pull request #1469 from slingamn/alwayson_expiration.1
expiration for always-on clients
2020-12-21 22:03:06 -05:00
Shivaram Lingamneni
9727ff5594 bump irctest 2020-12-21 05:12:20 -05:00
Shivaram Lingamneni
48166b5b4b Implement expiration for always-on clients
Fixes #810
2020-12-21 05:11:50 -05:00
Shivaram Lingamneni
be31d33dc4 shorten the cached batch ID for multilines 2020-12-18 03:13:01 -05:00
Shivaram Lingamneni
94df158c90
Merge pull request #1466 from oragono/l10n_master
New Crowdin updates
2020-12-16 13:30:54 -05:00
Daniel Oaks
a50925e348 New translations nickserv.lang.json (Portuguese, Brazilian) 2020-12-16 23:06:30 +10:00
Shivaram Lingamneni
91cc2156f0
Merge pull request #1463 from slingamn/issue1294_purge.1
Enhancements to CS PURGE
2020-12-16 02:24:45 -05:00
Shivaram Lingamneni
2af65a44ed
Merge pull request #1465 from oragono/l10n_master
New Crowdin updates
2020-12-16 02:23:06 -05:00
Daniel Oaks
20de0ad133 New translations nickserv.lang.json (Portuguese, Brazilian) 2020-12-16 11:02:27 +10:00
Shivaram Lingamneni
fd71b79bb8 Enhancements to CS PURGE
1. Consolidate PURGE and UNPURGE into subcommands
2. Add PURGE LIST
3. PURGE ADD now requires a confirmation code

Fixes #1294
2020-12-15 04:00:44 -05:00
Shivaram Lingamneni
4d5815ab2e
Merge pull request #1456 from slingamn/rename_skeleton_bug.2
fix critical bugs in RENAME
2020-12-15 02:02:07 -05:00
Shivaram Lingamneni
5b79e427b5
Merge pull request #1460 from slingamn/issue1449_invite_playback
fix #1449
2020-12-14 23:43:27 -05:00
Shivaram Lingamneni
f717fceead
Merge pull request #1461 from slingamn/issue1452_enable_mysql
fix #1452
2020-12-14 23:42:47 -05:00
Shivaram Lingamneni
cee8f0fcc8 bump irctest 2020-12-14 23:35:46 -05:00
Shivaram Lingamneni
cc2b6d27a0 fix critical bugs in RENAME
Channel rename (both of registered and unregistered channels) would leave
the old name unreclaimable.
2020-12-14 23:35:46 -05:00
Shivaram Lingamneni
0d1521d4c4
Merge pull request #1458 from slingamn/issue1260_channel_forward.1
fix #1260
2020-12-14 22:53:24 -05:00
Shivaram Lingamneni
c217dbb8e4 add an irctest for forwarding 2020-12-14 22:38:23 -05:00
Shivaram Lingamneni
ba72d3acfc implement a channel forwarding mode
Fixes #1260
2020-12-14 22:38:23 -05:00
Shivaram Lingamneni
b7b45e03d8
Merge pull request #1462 from oragono/l10n_master
New Crowdin updates
2020-12-14 22:36:02 -05:00
Daniel Oaks
6953b483ff New translations nickserv.lang.json (Portuguese, Brazilian) 2020-12-15 10:22:43 +10:00
Shivaram Lingamneni
dd4fd1cbb6 fix #1452 2020-12-14 15:31:55 -05:00
Shivaram Lingamneni
15a0cda78b pointless refactor of stripMaskFromNick 2020-12-14 15:23:01 -05:00
Shivaram Lingamneni
a934392987
Merge pull request #1459 from oragono/l10n_master
New Crowdin updates
2020-12-14 08:27:03 -05:00
Shivaram Lingamneni
853bb12c29 fix #1449
INVITE playback (#1409) was buggy, due to the double use of (Item).Params[0]
for the channel name and the recipient nick. Stuff the channel name in
(Item).Message.Message instead.
2020-12-14 08:24:38 -05:00
Daniel Oaks
ff3f62658e New translations chanserv.lang.json (Portuguese, Brazilian) 2020-12-14 22:23:35 +10:00
Daniel Oaks
de0d4d3860 New translations hostserv.lang.json (Portuguese, Brazilian) 2020-12-14 22:23:33 +10:00
Shivaram Lingamneni
9033d97c6f
Merge pull request #1450 from slingamn/tor_defcon
DEFCON 4 and lower should require SASL from Tor users
2020-12-13 20:06:30 -05:00
Shivaram Lingamneni
5e03c560d3
Merge pull request #1454 from slingamn/maxlinelen_caps
make CAP LS/LIST respect the MaxLineLen constant
2020-12-13 20:05:40 -05:00
Shivaram Lingamneni
856a76eaf7
Merge pull request #1457 from oragono/l10n_master
New Crowdin updates
2020-12-13 20:05:17 -05:00
Daniel Oaks
b9d3f57149 New translations hostserv.lang.json (Portuguese, Brazilian) 2020-12-14 10:22:22 +10:00
Shivaram Lingamneni
47f7b9a76e make CAP LS/LIST respect the MaxLineLen constant 2020-12-13 15:44:10 -05:00
Shivaram Lingamneni
aa43822c68
Merge pull request #1451 from slingamn/mysql_quickstart
add a mysql quickstart guide
2020-12-11 02:37:45 -08:00
Shivaram Lingamneni
7465db0149 add a mysql quickstart guide 2020-12-11 05:34:01 -05:00
Shivaram Lingamneni
534939c342 DEFCON 4 and lower should require SASL from Tor users 2020-12-11 05:04:56 -05:00
Shivaram Lingamneni
9cf854405d
Merge pull request #1448 from slingamn/config_update
clean up some config comments
2020-12-08 23:35:16 -08:00
Shivaram Lingamneni
96380adf27
Merge pull request #1446 from slingamn/reservation_docs
manual updates for nick reservation and email verification
2020-12-08 23:10:01 -08:00
Shivaram Lingamneni
b3daf51f0a clean up some config comments 2020-12-09 02:09:35 -05:00
Shivaram Lingamneni
58edabf5c3
Merge pull request #1445 from slingamn/flatiptypes.5
introduce "flat ip" representations
2020-12-08 20:50:31 -08:00
Shivaram Lingamneni
84e3b5d77b stop autocreating d-lines for throttle violations
This didn't work correctly for IPv6 or custom nets.
/UNDLINE IP can temporarily be used to reset the throttle.
2020-12-08 22:01:23 -05:00
Shivaram Lingamneni
9a28cd38c3 update email verification manual entry 2020-12-08 02:11:53 -05:00
Shivaram Lingamneni
45471138d2 update nick reservation docs 2020-12-08 02:11:53 -05:00
Shivaram Lingamneni
44cc4c2092 introduce "flat ip" representations 2020-12-07 21:21:10 -05:00
Shivaram Lingamneni
85c39f3ea0
Merge pull request #1444 from slingamn/issue1439_confusable_import
fix #1439, give all atheme group founders +q
2020-12-07 16:06:46 -08:00
Shivaram Lingamneni
579924c832 give all groupserv founders +q in atheme2json 2020-12-07 17:26:31 -05:00
Shivaram Lingamneni
c8c1ddfb41 fix #1439
Validate imported databases for confusable nicks
2020-12-07 13:35:58 -05:00
Shivaram Lingamneni
e61735aa2c
Merge pull request #1440 from Mikaela/exampleconfig-consistency-ip-cidr
{default,traditional}.yaml: refer to IPs/CIDR instead of addrs
2020-12-07 08:43:35 -08:00
a68d4da5df
{default,traditional}.yaml: refer to IPs/CIDR instead of addrs
Whenever CIDR is mentioned in the config, it's in combination with IP so
talking about addressese in these points gives wrong impression that a
domain name would be valid as those are often thought as addresses.
2020-12-07 12:40:58 +02:00
Shivaram Lingamneni
48d5bd9144 fix #1436 2020-12-07 03:51:52 -05:00
Shivaram Lingamneni
31003bd02d fix bugs in atheme2json.py 2020-12-07 02:53:45 -05:00
Shivaram Lingamneni
d4dd161c45
Merge pull request #1435 from slingamn/morebugs
fix some bugs
2020-12-06 23:31:42 -08:00
Shivaram Lingamneni
e994e0451a fix incorrect vhost serialization 2020-12-07 02:29:18 -05:00
Shivaram Lingamneni
da2d4ca130 make overridden services hostname appear in chanserv 2020-12-07 02:29:18 -05:00
Shivaram Lingamneni
8c2d0762e4
Merge pull request #1434 from slingamn/need_privs
change FAIL codes from NOT_PRIVED to PRIVS_NEEDED
2020-12-06 23:28:04 -08:00
Shivaram Lingamneni
30b514cf95 bump irctest 2020-12-07 02:25:39 -05:00
Shivaram Lingamneni
66d90bef5e change FAIL codes from NOT_PRIVED to PRIVS_NEEDED 2020-12-06 21:01:44 -05:00
Shivaram Lingamneni
937e519595
Merge pull request #1433 from slingamn/import_enhancements
fix #1403
2020-12-06 17:55:02 -08:00
Shivaram Lingamneni
468b5a4a39 fix #1403
Handle the case where atheme had a successor, but didn't correctly
elect them as founder (?)
2020-12-06 20:50:06 -05:00
Shivaram Lingamneni
b95afa1464 preemptively filter out masks from amodes in atheme import 2020-12-06 20:07:45 -05:00
Shivaram Lingamneni
f9768e2259
Merge pull request #1429 from slingamn/issue1428_tor_sts.1
fix #1428
2020-12-06 13:56:33 -08:00
Shivaram Lingamneni
82332b3f37
Merge pull request #1432 from slingamn/issue1431_topic
fix #1431
2020-12-06 09:59:10 -08:00
Shivaram Lingamneni
d6a2c0db4a fix #1431 2020-12-06 12:38:18 -05:00
Shivaram Lingamneni
96fd1c04d6
Merge pull request #1430 from oragono/devel+operblockchanges
fix #1426
2020-12-06 00:11:26 -08:00
Daniel Oaks
cd6d9826b2 Tweaked oper blocks.
I think that 'moderator vs admin' is a pretty common set of priv levels,
whereas 'oper vs admin' is a little confusing, esp. to less irc-savvy
people.

/SAJOIN and /SAMODE are really common for joining channels to check out
what's going on and for e.g. opping someone when nobody in the channel
is opered, so it makes sense for mods to have those. I feel similarly
about vhosts, they're usually something that's delegated to less-prived
opers.

Changed the whois line from 'a server admin' to 'the server admin' to
make it a bit more clear that this is one single user, rather than a set
of privs to be shared. And it's a tiny thing, but removed the 'less
privileged' term from alice's oper block because it felt a bit dodgy.
2020-12-06 17:01:32 +10:00
Shivaram Lingamneni
7bdbb01238 fix #1428
Tor listeners should never see an STS cap.

Add an undocumented 'hide-sts' key for listeners that hides the STS cap.
This can be used if the listener is secured at layer 3 or 4 (VPNs,
E2E mixnets). It will be necessary to add the relevant IPs to `secure-nets`.
2020-12-05 23:06:23 -05:00
Shivaram Lingamneni
c8d999c95f clean up and clarify example operator blocks
See #1426
2020-12-05 20:40:44 -05:00
Shivaram Lingamneni
23a7221137
Merge pull request #1425 from slingamn/issue1421_customlimits.2
fix #1421
2020-12-05 16:03:51 -08:00
Shivaram Lingamneni
f9b842c88b fix #1421
Allow custom limit definitions that encompass multiple subnets
2020-12-04 14:24:19 -05:00
Shivaram Lingamneni
7e56f62aed
Merge pull request #1419 from slingamn/alwayson_channelmodes.1
fix #1345
2020-12-04 02:28:38 -08:00
Shivaram Lingamneni
7624936d8c
Merge pull request #1424 from slingamn/import_enhancements
validate amode recipients during data import
2020-12-04 01:55:01 -08:00
Shivaram Lingamneni
281821ed0e validate amode recipients 2020-12-04 04:50:40 -05:00
Shivaram Lingamneni
79e3f4a15c
Merge pull request #1423 from slingamn/import_certfps
enhancements to database import
2020-12-04 01:40:29 -08:00
Shivaram Lingamneni
82d29aa9b2
Merge pull request #1422 from jlu5/master
atheme2json enhancements
2020-12-04 01:39:56 -08:00
Shivaram Lingamneni
32f3c69a08 support certfp import 2020-12-04 04:37:24 -05:00
James Lu
2dcb084e0f atheme2json: translate channel flag +a to the corresponding amode 2020-12-04 01:08:23 -08:00
James Lu
22b0263c5b atheme2json: flatten channels owned by GroupServ groups to the first group founder 2020-12-04 01:08:23 -08:00
Shivaram Lingamneni
c0bc485840 schema change for #1345
Convert the flat list of channels for always-on clients
to a map from channel names to channel-user modes.
2020-12-02 15:32:17 -05:00
Shivaram Lingamneni
51f279289d fix #1345
Store the channel-user modes of always-on clients along with their
channel memberships, restore them on server startup. This will coexist
alongside /CS AMODE, which autoapplies modes to clients on join regardless
of their always-on status.
2020-12-02 15:31:49 -05:00
Shivaram Lingamneni
3aeac42978
Merge pull request #1418 from slingamn/issue1417_joinzero
fix #1417
2020-12-01 14:05:26 -08:00
Shivaram Lingamneni
01291ceadd fix #1417
Allow `JOIN 0` with a confirmation code
2020-12-01 14:23:47 -05:00
Shivaram Lingamneni
a291e5ca74
Merge pull request #1416 from slingamn/tagmsg_bug.3
fix TAGMSG being relayed to clients without message-tags
2020-11-30 14:23:54 -08:00
Shivaram Lingamneni
b9393e5600 bump irctest 2020-11-30 17:08:53 -05:00
Shivaram Lingamneni
1b91360885 fix incorrect TAGMSG relaying 2020-11-30 17:08:53 -05:00
Shivaram Lingamneni
db100f1f91
Merge pull request #1231 from slingamn/buffer.2
more memory-efficient implementation of line reading
2020-11-30 02:34:25 -08:00
Shivaram Lingamneni
a34918e729 add a fuzz test for IRCStreamConn changes 2020-11-30 02:08:47 -05:00
Shivaram Lingamneni
5edfcced0a
Merge pull request #1415 from slingamn/issue1409_invite_history.1
fix #1409
2020-11-29 19:47:22 -08:00
Shivaram Lingamneni
b4cd62bece
Merge pull request #1414 from slingamn/issue1396_account_snomask
fix #1396
2020-11-29 19:46:12 -08:00
Shivaram Lingamneni
b28004bbd9
Merge pull request #1410 from slingamn/welcome
add network name to RPL_WELCOME
2020-11-29 19:45:36 -08:00
Shivaram Lingamneni
32bbde49a8 fix #1409
Record INVITE in DM history for the benefit of offline always-on clients
2020-11-29 22:12:06 -05:00
Shivaram Lingamneni
c62956f708 fix #1396
* Defer account login snomask until after connection registration is complete
* Don't send account-notify for pre-registration clients
2020-11-29 20:20:26 -05:00
Shivaram Lingamneni
0e470763a2
Merge pull request #1413 from slingamn/issue1411_dmtags
fix #1411
2020-11-29 17:03:38 -08:00
Shivaram Lingamneni
2d857b21c6 bump irctest 2020-11-29 19:57:47 -05:00
Shivaram Lingamneni
e18eb1db99 fix #1411
Clients without event-playback should receive client-only tags in
replayed PRIVMSG / NOTICE.
2020-11-29 19:57:47 -05:00
Shivaram Lingamneni
42d5e767dd add network name to RPL_WELCOME 2020-11-29 16:34:52 -05:00
Shivaram Lingamneni
0fcaf778e0
Merge pull request #1400 from slingamn/issue1387_messagecaching.4
fix #1387
2020-11-29 02:32:59 -08:00
Shivaram Lingamneni
34fc8aa3c8
Merge pull request #1408 from slingamn/services_source.2
fix #1407
2020-11-29 02:31:48 -08:00
Shivaram Lingamneni
3ee6fd1f6c allow overriding services hostname
Fixes #1407
2020-11-29 00:02:26 -05:00
Shivaram Lingamneni
9214d978d0 refactor services prefixes and notice handlers 2020-11-29 00:02:26 -05:00
Shivaram Lingamneni
013c138977
Merge pull request #1406 from oragono/l10n_master
New Crowdin updates
2020-11-28 15:01:30 -08:00
Daniel Oaks
5fd04b71a5 New translations nickserv.lang.json (French) 2020-11-28 16:32:35 +10:00
Daniel Oaks
2a26520240 New translations chanserv.lang.json (French) 2020-11-28 16:32:33 +10:00
Daniel Oaks
7a3da37b0d New translations help.lang.json (French) 2020-11-28 16:32:31 +10:00
Daniel Oaks
74bc7a2ef0 New translations irc.lang.json (French) 2020-11-28 16:32:29 +10:00
Shivaram Lingamneni
bec88be799
Merge pull request #1405 from kylef/kylef/mode-order
Make atheme2json sort channel modes
2020-11-27 11:34:22 -08:00
Kyle Fuller
7e5cdc4f90 refactor atheme2json to sort channel modes
This makes invoking the script multiple times with the same input return
the same result, which may not be the case before because sets are
unordered and thus the channel modes can become reordered across
multiple invocations of the script.
2020-11-27 19:20:58 +00:00
Shivaram Lingamneni
c4b7b8af3a
Merge pull request #1402 from kylef/kylef/mlock-i
Allow atheme2json to handle mlock mode removal (outside of `-t` or `-n`)
2020-11-27 10:26:51 -08:00
Kyle Fuller
97bb044640 fix atheme2json to handle mlock mode removal
For example, if the mlock is set to `-i`, `i` is not present in the
`modes` and thus it would error.

I'm inclined to think that the negative mlock feature doesn't behave
correctly, because the mlock of `-i` (or `-n`) would prevent anyone from
ever setting those modes on the channel. Which this does not appear to
be the case.

Fixes #1401
2020-11-27 16:29:08 +00:00
Shivaram Lingamneni
ec15d367ba fix #1387
Instead of building a new serialized message for each recipient,
try to cache them.
2020-11-27 00:13:47 -05:00
Shivaram Lingamneni
f04648e081
Merge pull request #1398 from slingamn/unkdline
mention UN[DK]LINE in [DK]LINE help
2020-11-26 10:13:53 -08:00
Shivaram Lingamneni
a0d7d8d028 mention UN[DK]LINE in [DK]LINE help 2020-11-26 12:54:50 -05:00
Shivaram Lingamneni
6e2119be60
Merge pull request #1397 from slingamn/resume_joinline
fix duplicated JOIN line sent to some resuming clients
2020-11-25 21:30:35 -08:00
Shivaram Lingamneni
b7377d3f67 bump irctest 2020-11-26 00:27:23 -05:00
Shivaram Lingamneni
8d44fa3c3f fix duplicated JOIN line sent to resuming clients
Resuming clients without the resume capability would receive
two JOIN lines per channel.
2020-11-26 00:27:21 -05:00
Shivaram Lingamneni
453257aace
Merge pull request #1395 from Mikaela/patch-1
docs/MANUAL.md: fix atheme2json link
2020-11-24 09:23:00 -08:00
18dc9081d6
docs/MANUAL.md: fix atheme2json link 2020-11-24 14:32:52 +02:00
Shivaram Lingamneni
5326fd0d06
Merge pull request #1394 from slingamn/rehash
add a manual entry for rehash
2020-11-23 19:45:57 -08:00
Shivaram Lingamneni
e9197f1329 remove version number from manual 2020-11-23 20:39:45 -05:00
Shivaram Lingamneni
15406e0844 add a manual entry for rehash 2020-11-23 20:37:42 -05:00
Shivaram Lingamneni
722a1a80ef
Merge pull request #1392 from slingamn/proxydocs
documentation updates for proxy v2
2020-11-19 14:20:59 -08:00
Shivaram Lingamneni
c57828eb62 documentation updates for proxy v2 2020-11-19 17:01:56 -05:00
Shivaram Lingamneni
f30bd2cff0
Merge pull request #1391 from slingamn/proxy.3
fix #1389
2020-11-19 09:43:55 -08:00
Shivaram Lingamneni
3062f97c2b fix #1389
Support PROXY protocol v2, including ahead of plaintext connections
2020-11-19 12:31:58 -05:00
Shivaram Lingamneni
9ce72a4b02
Merge pull request #1388 from slingamn/builder
upgrade ircmsg again
2020-11-17 19:25:27 -08:00
Shivaram Lingamneni
3f20676f46 upgrade ircmsg again 2020-11-17 21:53:14 -05:00
Shivaram Lingamneni
323ef7c642
Merge pull request #1386 from slingamn/issue1385
upgrade ircmsg; fixes #1385
2020-11-15 21:56:54 -08:00
Shivaram Lingamneni
61e15ca877 upgrade ircmsg; fixes #1385
Validate tag names and values in accordance with the ratified message-tags spec
2020-11-15 23:05:08 -05:00
Shivaram Lingamneni
99fca0553b fix auth-script example in the manual 2020-11-13 12:44:25 -05:00
Shivaram Lingamneni
4fc396c3ef
Merge pull request #1383 from slingamn/chanserv
fix output bugs in AMODE handling
2020-11-12 23:41:32 -08:00
Shivaram Lingamneni
a6a8548466 fix SAJOIN not sending a MODE line where applicable 2020-11-12 11:57:30 -05:00
Shivaram Lingamneni
a8ffb11deb use server name as source for chanserv mode changes, for consistency 2020-11-12 11:50:28 -05:00
Shivaram Lingamneni
7cfb298617
Merge pull request #1382 from slingamn/unsuspend_bug
fix casefolding issue in NS SUSPEND DEL
2020-11-11 09:14:28 -08:00
Shivaram Lingamneni
6a6f104899 fix casefolding issue in NS SUSPEND DEL
NS SUSPEND DEL incorrectly required the use of the casefolded account name.
2020-11-11 11:09:09 -05:00
Shivaram Lingamneni
461e18f4f0
Merge pull request #1381 from slingamn/nsrename.3
implement NS RENAME
2020-11-10 23:11:39 -08:00
Shivaram Lingamneni
4f571c2cf3 implement NS RENAME
Fixes #1380
2020-11-10 19:59:12 -05:00
Shivaram Lingamneni
4861ac90b6
Merge pull request #1379 from slingamn/kline_duplicate
fix duplicated nicks in kline message
2020-11-10 08:22:01 -08:00
Shivaram Lingamneni
8ad6a53433 fix duplicated nicks in kline message 2020-11-10 11:17:17 -05:00
Shivaram Lingamneni
68f4032588
Merge pull request #1378 from slingamn/travis_branch_whitelist
explicitly whitelist branches for building
2020-11-09 21:55:43 -08:00
Shivaram Lingamneni
0bb0d382ee explicitly whitelist branches for building 2020-11-09 14:51:39 -05:00
Shivaram Lingamneni
fc5efcea7a
Merge pull request #1377 from oragono/l10n_master
New Crowdin updates
2020-11-09 08:59:55 -08:00
Daniel Oaks
fdaf26d6c5 New translations help.lang.json (Romanian) 2020-11-09 19:53:08 +10:00
Daniel Oaks
e704469de8 New translations irc.lang.json (Romanian) 2020-11-09 19:53:06 +10:00
Shivaram Lingamneni
60ede87ab0 set up new development version 2020-11-08 20:17:22 -05:00
Shivaram Lingamneni
75ba45f655
Merge pull request #1376 from slingamn/deps
dependency upgrades for 2.5
2020-11-08 17:10:20 -08:00
Shivaram Lingamneni
f8bf3818fe upgrade confusables 2020-11-08 18:13:50 -05:00
Shivaram Lingamneni
7535091d92 upgrade x/text 2020-11-08 17:58:56 -05:00
Shivaram Lingamneni
640dfea85a upgrade x/sys 2020-11-08 17:57:58 -05:00
Shivaram Lingamneni
bd959207e4 upgrade x/crypto 2020-11-08 17:57:24 -05:00
Shivaram Lingamneni
4f9d406b93 upgrade go-dkim 2020-11-08 17:56:46 -05:00
Shivaram Lingamneni
008416e4dd upgrade buntdb and dependencies 2020-11-08 17:55:22 -05:00
Shivaram Lingamneni
025f062a43
Merge pull request #1375 from slingamn/typofix
fix channel mode help text
2020-11-08 14:37:04 -08:00
Shivaram Lingamneni
3583e60f5e
Merge pull request #1374 from oragono/l10n_master
New Crowdin updates
2020-11-08 14:34:07 -08:00
Shivaram Lingamneni
58b5d3c72d fix channel mode help text 2020-11-08 17:33:45 -05:00
Daniel Oaks
ac19fac703 New translations irc.lang.json (Romanian) 2020-11-09 07:52:42 +10:00
Shivaram Lingamneni
eeb7c6cb91 bump version to 2.4.0 2020-11-07 21:34:21 -05:00
Shivaram Lingamneni
9e5d158c30 bump changelog for v2.4.0 2020-11-07 21:33:52 -05:00
Shivaram Lingamneni
0d3d910716 update release runbook 2020-11-06 13:55:09 -05:00
Shivaram Lingamneni
42af936c48
Merge pull request #1373 from oragono/l10n_master
New Crowdin updates
2020-11-05 23:26:50 -08:00
Daniel Oaks
499581b651 New translations hostserv.lang.json (French) 2020-11-06 17:22:30 +10:00
Daniel Oaks
0b34c7a783 New translations nickserv.lang.json (French) 2020-11-06 17:22:28 +10:00
Daniel Oaks
ff3c5b4024 New translations chanserv.lang.json (French) 2020-11-06 17:22:26 +10:00
Daniel Oaks
e0f3f93b04 New translations help.lang.json (French) 2020-11-06 17:22:25 +10:00
Daniel Oaks
f7e7bdbda0 New translations irc.lang.json (French) 2020-11-06 17:22:23 +10:00
Shivaram Lingamneni
507a11a693
Merge pull request #1372 from slingamn/sequence
implement the new chathistory fail code INVALID_TARGET
2020-11-04 07:58:22 -08:00
Shivaram Lingamneni
e67995bea7 bump irctest 2020-11-04 01:54:59 -05:00
Shivaram Lingamneni
9374a75c7a implement FAIL CHATHISTORY INVALID_TARGET 2020-11-04 01:54:59 -05:00
Shivaram Lingamneni
8bb867d3dc
Merge pull request #1371 from slingamn/issue1370_mutes
fix #1370
2020-11-01 15:43:18 -08:00
Shivaram Lingamneni
ee849d2e8f include a regression test in irctest 2020-11-01 18:15:36 -05:00
Shivaram Lingamneni
dac43e6e76 fix #1370 2020-11-01 18:09:04 -05:00
Shivaram Lingamneni
40118d1533 bump version to 2.4.0-rc1 2020-10-31 22:17:58 -04:00
Shivaram Lingamneni
59c17dd409
Merge pull request #1368 from slingamn/changelog.1
changelog and documentation updates for 2.4.0-rc1
2020-10-31 19:14:22 -07:00
Shivaram Lingamneni
a1d63f62cc changelog and documentation updates for 2.4.0-rc1 2020-10-31 21:54:24 -04:00
Shivaram Lingamneni
42ae35d266
Merge pull request #1367 from slingamn/registered_flag_whoreply
fix #1366
2020-10-30 08:42:35 -07:00
Shivaram Lingamneni
6513136ea3 fix #1366
Include an 'r' flag in RPL_WHOREPLY for registered nicks
2020-10-29 14:25:28 -04:00
Shivaram Lingamneni
5f09dbab42
Merge pull request #1365 from oragono/l10n_master
New Crowdin updates
2020-10-29 08:41:32 -07:00
Daniel Oaks
6dc85138d0 New translations chanserv.lang.json (Dutch) 2020-10-30 01:24:58 +10:00
Shivaram Lingamneni
f89fe162bf
Merge pull request #1364 from oragono/l10n_master
New Crowdin updates
2020-10-29 07:09:30 -07:00
Daniel Oaks
70f98d4d75 New translations hostserv.lang.json (Bosnian) 2020-10-29 13:26:15 +10:00
Daniel Oaks
516381a6ae New translations help.lang.json (Hebrew) 2020-10-29 13:26:13 +10:00
Daniel Oaks
866ae35196 New translations irc.lang.json (Hebrew) 2020-10-29 13:26:12 +10:00
Daniel Oaks
0362ea7d6e New translations hostserv.lang.json (Finnish) 2020-10-29 13:26:10 +10:00
Daniel Oaks
29cd33c199 New translations nickserv.lang.json (Finnish) 2020-10-29 13:26:09 +10:00
Daniel Oaks
83ac94a915 New translations chanserv.lang.json (Finnish) 2020-10-29 13:26:07 +10:00
Daniel Oaks
d58e7b7b6a New translations help.lang.json (Finnish) 2020-10-29 13:26:05 +10:00
Daniel Oaks
fe0d3557d7 New translations irc.lang.json (Finnish) 2020-10-29 13:26:04 +10:00
Daniel Oaks
9fbd4978af New translations chanserv.lang.json (Hebrew) 2020-10-29 13:26:02 +10:00
Daniel Oaks
ce2e109199 New translations hostserv.lang.json (Greek) 2020-10-29 13:26:00 +10:00
Daniel Oaks
f6b3b2696e New translations chanserv.lang.json (Greek) 2020-10-29 13:25:58 +10:00
Daniel Oaks
53d61e74af New translations help.lang.json (Greek) 2020-10-29 13:25:57 +10:00
Daniel Oaks
590ec460ba New translations irc.lang.json (Greek) 2020-10-29 13:25:55 +10:00
Daniel Oaks
11a648c592 New translations hostserv.lang.json (German) 2020-10-29 13:25:53 +10:00
Daniel Oaks
4a12d3a3f6 New translations nickserv.lang.json (German) 2020-10-29 13:25:51 +10:00
Daniel Oaks
2ed7bc1116 New translations chanserv.lang.json (German) 2020-10-29 13:25:50 +10:00
Daniel Oaks
2eefd0c214 New translations help.lang.json (German) 2020-10-29 13:25:48 +10:00
Daniel Oaks
8bf6fb7bdf New translations nickserv.lang.json (Greek) 2020-10-29 13:25:46 +10:00
Daniel Oaks
1207f4e134 New translations irc.lang.json (German) 2020-10-29 13:25:45 +10:00
Daniel Oaks
a5d2cffefd New translations nickserv.lang.json (Hebrew) 2020-10-29 13:25:43 +10:00
Daniel Oaks
c6b423a204 New translations irc.lang.json (Hungarian) 2020-10-29 13:25:42 +10:00
Daniel Oaks
cb602d83fd New translations irc.lang.json (Korean) 2020-10-29 13:25:40 +10:00
Daniel Oaks
d59ea9c325 New translations hostserv.lang.json (Japanese) 2020-10-29 13:25:38 +10:00
Daniel Oaks
55a0967e9b New translations nickserv.lang.json (Japanese) 2020-10-29 13:25:37 +10:00
Daniel Oaks
c02290103c New translations chanserv.lang.json (Japanese) 2020-10-29 13:25:35 +10:00
Daniel Oaks
6a9b07d242 New translations help.lang.json (Japanese) 2020-10-29 13:25:34 +10:00
Daniel Oaks
8204ece775 New translations irc.lang.json (Japanese) 2020-10-29 13:25:32 +10:00
Daniel Oaks
0edff1ee63 New translations hostserv.lang.json (Italian) 2020-10-29 13:25:31 +10:00
Daniel Oaks
fd0efa3a78 New translations hostserv.lang.json (Hebrew) 2020-10-29 13:25:29 +10:00
Daniel Oaks
8af07c0a39 New translations nickserv.lang.json (Italian) 2020-10-29 13:25:28 +10:00
Daniel Oaks
886f8d67a3 New translations help.lang.json (Italian) 2020-10-29 13:25:26 +10:00
Daniel Oaks
14bd790b72 New translations irc.lang.json (Italian) 2020-10-29 13:25:24 +10:00
Daniel Oaks
7ff3b720e0 New translations hostserv.lang.json (Hungarian) 2020-10-29 13:25:23 +10:00
Daniel Oaks
f7bd2a1f6a New translations nickserv.lang.json (Hungarian) 2020-10-29 13:25:21 +10:00
Daniel Oaks
a05d790cec New translations chanserv.lang.json (Hungarian) 2020-10-29 13:25:20 +10:00
Daniel Oaks
b55a999dd5 New translations help.lang.json (Hungarian) 2020-10-29 13:25:18 +10:00
Daniel Oaks
fbc6e13dcf New translations chanserv.lang.json (Italian) 2020-10-29 13:25:17 +10:00
Daniel Oaks
ea304f8833 New translations help.lang.json (Korean) 2020-10-29 13:25:15 +10:00
Daniel Oaks
ee69bd1a1e New translations hostserv.lang.json (Danish) 2020-10-29 13:25:13 +10:00
Daniel Oaks
6c5622f313 New translations chanserv.lang.json (Danish) 2020-10-29 13:25:12 +10:00
Daniel Oaks
456fafbda0 New translations chanserv.lang.json (Afrikaans) 2020-10-29 13:25:10 +10:00
Daniel Oaks
7607f72922 New translations help.lang.json (Afrikaans) 2020-10-29 13:25:08 +10:00
Daniel Oaks
c789f555cb New translations irc.lang.json (Afrikaans) 2020-10-29 13:25:07 +10:00
Daniel Oaks
baf771a3e0 New translations hostserv.lang.json (Spanish) 2020-10-29 13:25:05 +10:00
Daniel Oaks
6afe8c2849 New translations nickserv.lang.json (Spanish) 2020-10-29 13:25:04 +10:00
Daniel Oaks
542da6bc70 New translations chanserv.lang.json (Spanish) 2020-10-29 13:25:02 +10:00
Daniel Oaks
cc6868294f New translations help.lang.json (Spanish) 2020-10-29 13:25:00 +10:00
Daniel Oaks
c5163d4d09 New translations nickserv.lang.json (Afrikaans) 2020-10-29 13:24:59 +10:00
Daniel Oaks
d5d2c71443 New translations irc.lang.json (Spanish) 2020-10-29 13:24:57 +10:00
Daniel Oaks
cc4e192867 New translations nickserv.lang.json (French) 2020-10-29 13:24:55 +10:00
Daniel Oaks
fa0632b28d New translations chanserv.lang.json (French) 2020-10-29 13:24:54 +10:00
Daniel Oaks
b511d9dfac New translations help.lang.json (French) 2020-10-29 13:24:52 +10:00
Daniel Oaks
809843272e New translations irc.lang.json (French) 2020-10-29 13:24:50 +10:00
Daniel Oaks
70a89ee738 New translations hostserv.lang.json (Romanian) 2020-10-29 13:24:49 +10:00
Daniel Oaks
a9b834705c New translations nickserv.lang.json (Romanian) 2020-10-29 13:24:47 +10:00
Daniel Oaks
2e63138c69 New translations hostserv.lang.json (French) 2020-10-29 13:24:45 +10:00
Daniel Oaks
4a6b8d880f New translations nickserv.lang.json (Danish) 2020-10-29 13:24:43 +10:00
Daniel Oaks
339f6c1a10 New translations hostserv.lang.json (Afrikaans) 2020-10-29 13:24:42 +10:00
Daniel Oaks
db443f12ef New translations help.lang.json (Arabic) 2020-10-29 13:24:40 +10:00
Daniel Oaks
13e97b4ad0 New translations help.lang.json (Danish) 2020-10-29 13:24:39 +10:00
Daniel Oaks
d3e16491ee New translations irc.lang.json (Danish) 2020-10-29 13:24:37 +10:00
Daniel Oaks
6e6a89ec88 New translations hostserv.lang.json (Czech) 2020-10-29 13:24:36 +10:00
Daniel Oaks
930c669ba7 New translations nickserv.lang.json (Czech) 2020-10-29 13:24:34 +10:00
Daniel Oaks
6af0bebda4 New translations chanserv.lang.json (Czech) 2020-10-29 13:24:33 +10:00
Daniel Oaks
f551ff86ad New translations help.lang.json (Czech) 2020-10-29 13:24:31 +10:00
Daniel Oaks
db5b5da22a New translations irc.lang.json (Czech) 2020-10-29 13:24:30 +10:00
Daniel Oaks
3012627e0c New translations irc.lang.json (Arabic) 2020-10-29 13:24:28 +10:00
Daniel Oaks
df7a0d12d4 New translations hostserv.lang.json (Catalan) 2020-10-29 13:24:27 +10:00
Daniel Oaks
ae9ad90298 New translations chanserv.lang.json (Catalan) 2020-10-29 13:24:25 +10:00
Daniel Oaks
fddcf58ffc New translations help.lang.json (Catalan) 2020-10-29 13:24:24 +10:00
Daniel Oaks
ba441c02b0 New translations irc.lang.json (Catalan) 2020-10-29 13:24:22 +10:00
Daniel Oaks
5339871ab5 New translations hostserv.lang.json (Arabic) 2020-10-29 13:24:21 +10:00
Daniel Oaks
2e65f2bb73 New translations nickserv.lang.json (Arabic) 2020-10-29 13:24:19 +10:00
Daniel Oaks
2b1d16334a New translations chanserv.lang.json (Arabic) 2020-10-29 13:24:17 +10:00
Daniel Oaks
aaf898364c New translations nickserv.lang.json (Catalan) 2020-10-29 13:24:16 +10:00
Daniel Oaks
3e7ef56d28 New translations help.lang.json (Romanian) 2020-10-29 13:24:14 +10:00
Daniel Oaks
65175d7187 New translations chanserv.lang.json (Korean) 2020-10-29 13:24:12 +10:00
Daniel Oaks
1081534d3c New translations hostserv.lang.json (Korean) 2020-10-29 13:24:11 +10:00
Daniel Oaks
0d96868d86 New translations hostserv.lang.json (Chinese Traditional) 2020-10-29 13:24:10 +10:00
Daniel Oaks
13cd742ef7 New translations nickserv.lang.json (Chinese Traditional) 2020-10-29 13:24:08 +10:00
Daniel Oaks
2013df3ce7 New translations chanserv.lang.json (Chinese Traditional) 2020-10-29 13:24:06 +10:00
Daniel Oaks
20b20b3e68 New translations help.lang.json (Chinese Traditional) 2020-10-29 13:24:05 +10:00
Daniel Oaks
1c1be3580e New translations irc.lang.json (Chinese Traditional) 2020-10-29 13:24:03 +10:00
Daniel Oaks
3e9851e425 New translations hostserv.lang.json (Chinese Simplified) 2020-10-29 13:24:01 +10:00
Daniel Oaks
d1ec8c3227 New translations nickserv.lang.json (Chinese Simplified) 2020-10-29 13:23:59 +10:00
Daniel Oaks
b976f4d0ab New translations irc.lang.json (Vietnamese) 2020-10-29 13:23:58 +10:00
Daniel Oaks
e5aff63471 New translations chanserv.lang.json (Chinese Simplified) 2020-10-29 13:23:56 +10:00
Daniel Oaks
0f30d3cd11 New translations irc.lang.json (Chinese Simplified) 2020-10-29 13:23:55 +10:00
Daniel Oaks
0586c68222 New translations hostserv.lang.json (Ukrainian) 2020-10-29 13:23:53 +10:00
Daniel Oaks
2d06d49941 New translations nickserv.lang.json (Ukrainian) 2020-10-29 13:23:52 +10:00
Daniel Oaks
f640886255 New translations chanserv.lang.json (Ukrainian) 2020-10-29 13:23:50 +10:00
Daniel Oaks
753ccf7a17 New translations help.lang.json (Ukrainian) 2020-10-29 13:23:49 +10:00
Daniel Oaks
5c6223d152 New translations irc.lang.json (Ukrainian) 2020-10-29 13:23:47 +10:00
Daniel Oaks
272fb6e106 New translations hostserv.lang.json (Turkish) 2020-10-29 13:23:46 +10:00
Daniel Oaks
7d30a4937c New translations help.lang.json (Chinese Simplified) 2020-10-29 13:23:44 +10:00
Daniel Oaks
c8e8adcce2 New translations nickserv.lang.json (Turkish) 2020-10-29 13:23:43 +10:00
Daniel Oaks
8ba1b9233b New translations help.lang.json (Vietnamese) 2020-10-29 13:23:41 +10:00
Daniel Oaks
9913d47a16 New translations nickserv.lang.json (Vietnamese) 2020-10-29 13:23:40 +10:00
Daniel Oaks
9f78a93ce2 New translations nickserv.lang.json (Bosnian) 2020-10-29 13:23:38 +10:00
Daniel Oaks
3c5f442dbf New translations chanserv.lang.json (Bosnian) 2020-10-29 13:23:37 +10:00
Daniel Oaks
5e2b7d109d New translations help.lang.json (Bosnian) 2020-10-29 13:23:35 +10:00
Daniel Oaks
b2a92ac4c8 New translations irc.lang.json (Bosnian) 2020-10-29 13:23:34 +10:00
Daniel Oaks
a4eb686a34 New translations hostserv.lang.json (English, Australia) 2020-10-29 13:23:32 +10:00
Daniel Oaks
636caf2174 New translations nickserv.lang.json (English, Australia) 2020-10-29 13:23:31 +10:00
Daniel Oaks
3ffae10d32 New translations chanserv.lang.json (English, Australia) 2020-10-29 13:23:29 +10:00
Daniel Oaks
b12ea1aad1 New translations chanserv.lang.json (Vietnamese) 2020-10-29 13:23:27 +10:00
Daniel Oaks
fbcece9c54 New translations help.lang.json (English, Australia) 2020-10-29 13:23:26 +10:00
Daniel Oaks
5769e5cfb1 New translations hostserv.lang.json (Portuguese, Brazilian) 2020-10-29 13:23:24 +10:00
Daniel Oaks
0524a84736 New translations nickserv.lang.json (Portuguese, Brazilian) 2020-10-29 13:23:23 +10:00
Daniel Oaks
af239800c7 New translations chanserv.lang.json (Portuguese, Brazilian) 2020-10-29 13:23:21 +10:00
Daniel Oaks
997e21bdc1 New translations help.lang.json (Portuguese, Brazilian) 2020-10-29 13:23:19 +10:00
Daniel Oaks
4a1d738f12 New translations irc.lang.json (Portuguese, Brazilian) 2020-10-29 13:23:18 +10:00
Daniel Oaks
86048d1a33 New translations hostserv.lang.json (Vietnamese) 2020-10-29 13:23:16 +10:00
Daniel Oaks
83a555e772 New translations irc.lang.json (English, Australia) 2020-10-29 13:23:15 +10:00
Daniel Oaks
bc7c5bbe7f New translations nickserv.lang.json (Korean) 2020-10-29 13:23:13 +10:00
Daniel Oaks
6203b454e5 New translations chanserv.lang.json (Turkish) 2020-10-29 13:23:11 +10:00
Daniel Oaks
5906cc919f New translations irc.lang.json (Turkish) 2020-10-29 13:23:10 +10:00
Daniel Oaks
cb86d76af6 New translations irc.lang.json (Portuguese) 2020-10-29 13:23:08 +10:00
Daniel Oaks
e767fc0f6b New translations hostserv.lang.json (Polish) 2020-10-29 13:23:06 +10:00
Daniel Oaks
748747c0ad New translations nickserv.lang.json (Polish) 2020-10-29 13:23:05 +10:00
Daniel Oaks
2fe52dc6ab New translations chanserv.lang.json (Polish) 2020-10-29 13:23:03 +10:00
Daniel Oaks
f2af9521fe New translations help.lang.json (Polish) 2020-10-29 13:23:02 +10:00
Daniel Oaks
8ba7f9eab5 New translations irc.lang.json (Polish) 2020-10-29 13:23:00 +10:00
Daniel Oaks
3506dc3422 New translations hostserv.lang.json (Norwegian) 2020-10-29 13:22:58 +10:00
Daniel Oaks
4eab704dc0 New translations help.lang.json (Portuguese) 2020-10-29 13:22:57 +10:00
Daniel Oaks
206f2a4459 New translations nickserv.lang.json (Norwegian) 2020-10-29 13:22:55 +10:00
Daniel Oaks
1280f63397 New translations help.lang.json (Norwegian) 2020-10-29 13:22:54 +10:00
Daniel Oaks
0c56b58e66 New translations irc.lang.json (Norwegian) 2020-10-29 13:22:52 +10:00
Daniel Oaks
826789d17b New translations hostserv.lang.json (Dutch) 2020-10-29 13:22:50 +10:00
Daniel Oaks
798db706fd New translations nickserv.lang.json (Dutch) 2020-10-29 13:22:49 +10:00
Daniel Oaks
c375f245aa New translations chanserv.lang.json (Dutch) 2020-10-29 13:22:47 +10:00
Daniel Oaks
4e0d146ea4 New translations help.lang.json (Dutch) 2020-10-29 13:22:46 +10:00
Daniel Oaks
18d85982f3 New translations irc.lang.json (Dutch) 2020-10-29 13:22:44 +10:00
Daniel Oaks
28487a79cc New translations chanserv.lang.json (Norwegian) 2020-10-29 13:22:43 +10:00
Daniel Oaks
1581515094 New translations help.lang.json (Turkish) 2020-10-29 13:22:41 +10:00
Daniel Oaks
2a57db6ef8 New translations chanserv.lang.json (Portuguese) 2020-10-29 13:22:39 +10:00
Daniel Oaks
731322f3ec New translations hostserv.lang.json (Portuguese) 2020-10-29 13:22:38 +10:00
Daniel Oaks
ba9ad9bab0 New translations hostserv.lang.json (Swedish) 2020-10-29 13:22:35 +10:00
Daniel Oaks
69f009254b New translations nickserv.lang.json (Swedish) 2020-10-29 13:22:33 +10:00
Daniel Oaks
32711c6bff New translations chanserv.lang.json (Swedish) 2020-10-29 13:22:32 +10:00
Daniel Oaks
3112858d39 New translations help.lang.json (Swedish) 2020-10-29 13:22:30 +10:00
Daniel Oaks
b75e1dc7bb New translations irc.lang.json (Swedish) 2020-10-29 13:22:29 +10:00
Daniel Oaks
86e1c0a90d New translations hostserv.lang.json (Serbian (Cyrillic)) 2020-10-29 13:22:27 +10:00
Daniel Oaks
9c9dab1183 New translations nickserv.lang.json (Serbian (Cyrillic)) 2020-10-29 13:22:25 +10:00
Daniel Oaks
09ee46789f New translations nickserv.lang.json (Portuguese) 2020-10-29 13:22:24 +10:00
Daniel Oaks
8c9dcde0ac New translations chanserv.lang.json (Serbian (Cyrillic)) 2020-10-29 13:22:22 +10:00
Daniel Oaks
5771d90fba New translations irc.lang.json (Serbian (Cyrillic)) 2020-10-29 13:22:20 +10:00
Daniel Oaks
9c6517c1e5 New translations hostserv.lang.json (Russian) 2020-10-29 13:22:19 +10:00
Daniel Oaks
525efae019 New translations nickserv.lang.json (Russian) 2020-10-29 13:22:17 +10:00
Daniel Oaks
0611a260df New translations chanserv.lang.json (Russian) 2020-10-29 13:22:16 +10:00
Daniel Oaks
610a33da77 New translations help.lang.json (Russian) 2020-10-29 13:22:14 +10:00
Daniel Oaks
2b7e1f71d8 New translations irc.lang.json (Russian) 2020-10-29 13:22:12 +10:00
Daniel Oaks
bf4e7f24ea New translations help.lang.json (Serbian (Cyrillic)) 2020-10-29 13:22:11 +10:00
Daniel Oaks
2f5664b52c New translations irc.lang.json (Romanian) 2020-10-29 13:22:09 +10:00
Shivaram Lingamneni
6829773e34
Merge pull request #1363 from slingamn/strings
update strings
2020-10-28 17:37:07 -07:00
Shivaram Lingamneni
2d5cb0918e update translated strings 2020-10-28 20:33:49 -04:00
Shivaram Lingamneni
5094b9da02 fix strings for NS SUSPEND 2020-10-28 20:32:55 -04:00
Shivaram Lingamneni
2bb2cab6c2
Merge pull request #1361 from slingamn/suspend.5
fix #1274
2020-10-28 08:12:46 -07:00
Shivaram Lingamneni
6cd6da600a
Merge pull request #1362 from slingamn/issue769_rplwhoismodes
fix #769
2020-10-28 08:06:39 -07:00
Shivaram Lingamneni
5418e5e794 fix #769
Add 379 RPL_WHOISMODES
2020-10-27 18:54:45 -04:00
Shivaram Lingamneni
4296ff02a4 schema change for #1274 2020-10-27 18:30:03 -04:00
Shivaram Lingamneni
1f6afa31d6 fix #1274
Enhancements to NS SUSPEND, including stored metadata and the ability
to list suspensions
2020-10-27 18:30:03 -04:00
Shivaram Lingamneni
dc456bd6a4 refactor schema versions to be ints, not strings 2020-10-27 12:26:44 -04:00
Shivaram Lingamneni
70b8bf75c5
Merge pull request #1360 from slingamn/issue861_fakelag
fix #861
2020-10-26 20:12:57 -07:00
Shivaram Lingamneni
a6e7e1f321
Merge pull request #1359 from slingamn/deop.1
fix #361
2020-10-26 20:12:18 -07:00
Shivaram Lingamneni
610fc5068d refactor DEOP
DEOP is now pure syntactic sugar for /mode #channel -o nick,
the change is attributed to the originating user and not to ChanServ.
2020-10-26 23:08:05 -04:00
Shivaram Lingamneni
2f4431a5fb fix #861
Allow messages-per-window to be 0
2020-10-26 21:06:03 -04:00
Shivaram Lingamneni
b57820150e no-op fix to SETNAME workaround 2020-10-26 18:06:06 -04:00
Shivaram Lingamneni
9c4b086113
Merge pull request #1355 from slingamn/invite
security enhancements for INVITE
2020-10-26 13:30:41 -07:00
Shivaram Lingamneni
c61b09e314
Merge pull request #1358 from slingamn/setname
enhancements to SETNAME
2020-10-26 13:30:29 -07:00
Shivaram Lingamneni
5dcb2bb60c enhancements to SETNAME
Address SETNAME UX problems reported by @KoraggKnightWolf in #oragono:

1. No feedback by default on success or failure
2. Multi-word realnames are not correctly interpreted by some clients
2020-10-26 15:31:51 -04:00
Shivaram Lingamneni
6a5ba82f29
Merge pull request #1356 from slingamn/kline
validate normalized masks as IRC params
2020-10-26 11:58:45 -07:00
Shivaram Lingamneni
94e7cfc080
Merge pull request #1352 from slingamn/environment_variables.1
fix #1049
2020-10-26 11:58:10 -07:00
Barry
f010914965
Added ChanServ DEOP command 2020-10-26 18:18:54 +02:00
Shivaram Lingamneni
af2b433195 validate normalized masks as IRC params 2020-10-25 23:32:24 -04:00
Shivaram Lingamneni
4b1e6b04c4 add UNINVITE command (#1171) 2020-10-25 22:16:19 -04:00
Shivaram Lingamneni
42d246b557 improve security properties of INVITE
See #1171.
2020-10-25 22:09:17 -04:00
Shivaram Lingamneni
203fc580f4 fix #1049 2020-10-25 13:58:57 -04:00
Shivaram Lingamneni
9670d96282
Merge pull request #1350 from slingamn/traditional
rename conventional.yaml -> traditional.yaml
2020-10-22 22:20:53 -07:00
Shivaram Lingamneni
dcb05ae0c2 update references to conventional.yaml 2020-10-23 00:27:55 -04:00
Shivaram Lingamneni
4edd3198cd rename conventional.yaml -> traditional.yaml 2020-10-23 00:18:10 -04:00
Shivaram Lingamneni
c2c5fe7cf8
Merge pull request #1347 from slingamn/issue1346.1
fix #1346
2020-10-22 21:16:02 -07:00
Shivaram Lingamneni
eb5a16821f review fix: remove config blocks for vhost requests 2020-10-23 00:12:53 -04:00
Shivaram Lingamneni
cf5a426f90 fix #1346 2020-10-22 12:19:19 -04:00
Shivaram Lingamneni
11ddffa7c5 bump irctest 2020-10-22 11:04:46 -04:00
Shivaram Lingamneni
2d76805b2c
Merge pull request #1344 from slingamn/mute.2
add mute extban
2020-10-21 16:11:57 -07:00
Shivaram Lingamneni
173f57d1b2 bump irctest 2020-10-21 11:09:51 -04:00
Shivaram Lingamneni
bd40b46639 fix #307 2020-10-21 11:08:55 -04:00
Shivaram Lingamneni
50dc265e4d
Merge pull request #1343 from slingamn/chanmodes
add +u and +U to CHANMODES token
2020-10-20 18:43:41 -07:00
Shivaram Lingamneni
a30e369225 add +u and +U to CHANMODES token 2020-10-20 21:24:47 -04:00
Shivaram Lingamneni
f019f62167
Merge pull request #1340 from slingamn/coerce_ident
replace suppress-ident with coerce-ident; make coerce-ident a recommended default
2020-10-20 15:31:13 -07:00
Shivaram Lingamneni
033022599b
Merge pull request #1341 from slingamn/opmoderated
fix #1178
2020-10-20 15:30:12 -07:00
Shivaram Lingamneni
76e3d67b66 replace suppress-ident with coerce-ident 2020-10-20 13:48:19 -04:00
Shivaram Lingamneni
b41642f972 bump irctest 2020-10-20 13:43:30 -04:00
Shivaram Lingamneni
5a9e79f06c fix #1178 2020-10-20 13:37:38 -04:00
Shivaram Lingamneni
4737578748
Merge pull request #1339 from slingamn/issue1337
fix #1337
2020-10-19 08:22:00 -07:00
Shivaram Lingamneni
76da6cf4ec
Merge pull request #1333 from slingamn/issue1332_saregister
fix #1332
2020-10-19 08:01:16 -07:00
Shivaram Lingamneni
a37a91694c fix #1337 2020-10-19 10:52:38 -04:00
Shivaram Lingamneni
347cc30ed4 fix a potential conflict with delayed verification of confusable names
0. Enable email verification
1. Register `dog`
2. Register `d0g`
3. Verify `dog`
4. Verify `d0g`: verification succeeds but the nick cannot be used
2020-10-16 17:21:09 -04:00
Shivaram Lingamneni
cf46377863 fix #1332 2020-10-16 17:21:09 -04:00
Shivaram Lingamneni
c639aac241 log the unfolded account name during registration 2020-10-16 17:21:09 -04:00
Shivaram Lingamneni
e993672a0f
Merge pull request #1331 from slingamn/issue1330_realname
fix #1330
2020-10-16 09:41:57 -07:00
Shivaram Lingamneni
af8ed62de8 schema change for #1330 2020-10-16 12:08:23 -04:00
Shivaram Lingamneni
ea68b9de0a fix #1330 2020-10-16 12:03:38 -04:00
Shivaram Lingamneni
3fe27ae0b5
Merge pull request #1329 from slingamn/issue1327
fix #1327
2020-10-16 06:17:22 -07:00
Shivaram Lingamneni
898f8aad07 add a schema change 2020-10-16 09:11:47 -04:00
Shivaram Lingamneni
1e572e8458 bump irctest 2020-10-16 00:58:24 -04:00
Shivaram Lingamneni
4b2a094921 fix #1327 2020-10-16 00:58:12 -04:00
Shivaram Lingamneni
a412870514
Merge pull request #1328 from slingamn/issue1326_lusersagain
fix #1326
2020-10-15 10:41:18 -07:00
Shivaram Lingamneni
328f6013f3 fix #1326 2020-10-15 13:03:44 -04:00
Shivaram Lingamneni
ff86edc9d7 bump irctest 2020-10-13 09:25:40 -04:00
Shivaram Lingamneni
38fe931656
Merge pull request #1324 from slingamn/chathistory_empty
fix #1322
2020-10-13 06:22:51 -07:00
Shivaram Lingamneni
f1be50dd98
Merge pull request #1321 from oragono/anope_xop
fix xop levels for anope
2020-10-13 04:52:16 -07:00
Shivaram Lingamneni
5a17c41e61
Merge pull request #1323 from mogad0n/update_manualmd
update MANUAL.md with toc links, some umodes, and some language
2020-10-13 04:51:28 -07:00
mogad0n
de3faedec4 update manualmd 2020-10-13 14:49:50 +05:30
Shivaram Lingamneni
1d74185b7d fix #1322 2020-10-13 00:38:23 -04:00
Shivaram Lingamneni
2615b15cc4 fix xop levels for anope 2020-10-12 21:06:00 -04:00
Shivaram Lingamneni
02096134e4
Merge pull request #1314 from slingamn/anope.2
support anope passphrase hashes
2020-10-12 12:18:20 -07:00
Shivaram Lingamneni
82be9a8423 support migrating anope databases 2020-10-12 15:06:17 -04:00
Shivaram Lingamneni
4336f56204
Merge pull request #1317 from slingamn/hidden_userhost
USERHOST needs to respect hidden operators as well
2020-10-09 11:34:35 -07:00
Shivaram Lingamneni
2121f17de7
Merge pull request #1316 from slingamn/alwayson_cloak_followup
separate rawHostname and cloakedHostname for always-on clients
2020-10-09 11:08:24 -07:00
Shivaram Lingamneni
4ee97ddb43 USERHOST needs to respect hidden operators as well 2020-10-09 12:29:09 -04:00
Shivaram Lingamneni
8cd7085d0b separate rawHostname and cloakedHostname for always-on clients
This affects RPL_WHOISACTUALLY and possibly others.
2020-10-09 11:11:06 -04:00
Shivaram Lingamneni
f5374c014b
Merge pull request #1315 from slingamn/issue1194_stealthoper
hidden operators, tweaks to default operator config
2020-10-09 06:40:31 -07:00
Shivaram Lingamneni
174b8ed64d bump irctest to latest 2020-10-09 08:44:24 -04:00
Shivaram Lingamneni
e69c6659b1 disable snomasks by default
See #1309
2020-10-09 08:44:24 -04:00
Shivaram Lingamneni
3346af2b36 change example oper vhost to 'staff' 2020-10-09 08:09:30 -04:00
Shivaram Lingamneni
78b2f61707 fix #1194 2020-10-09 08:03:26 -04:00
Shivaram Lingamneni
3cd0e40146
Merge pull request #1313 from slingamn/issue1312_unique_hostnames.1
fix #1312
2020-10-08 15:42:55 -07:00
Shivaram Lingamneni
c470f63daf fix #1312 2020-10-08 16:33:27 -04:00
Shivaram Lingamneni
32f29aca52
Merge pull request #1310 from slingamn/register_reviewfix
review fix for #1308
2020-10-07 06:28:48 -07:00
Shivaram Lingamneni
7fd5bc8d81 review fix 2020-10-07 09:20:26 -04:00
Shivaram Lingamneni
6bbedadfd5
Merge pull request #1308 from slingamn/register_command.2
fix #1075
2020-10-07 06:17:07 -07:00
Shivaram Lingamneni
754fb79cdd review fixes 2020-10-07 08:54:46 -04:00
Shivaram Lingamneni
9ed789f67c fix #1075 2020-10-06 18:04:29 -04:00
Shivaram Lingamneni
509d3f1fdd
Merge pull request #1301 from oragono/atheme_migration
first draft of atheme migration code
2020-10-06 15:03:08 -07:00
Shivaram Lingamneni
1ec029a53b review fixes
1. Avoid undefined behavior of time.Time{}.UnixNano()
2. Times should be compared with Equal()
2020-10-06 17:56:13 -04:00
Shivaram Lingamneni
a19ac34ace check +F instead of +q for founder 2020-10-05 11:44:22 -04:00
Shivaram Lingamneni
a307c306dc
Merge pull request #1305 from slingamn/queue_loglines
fix #1293
2020-10-05 08:15:11 -07:00
Shivaram Lingamneni
a19324b948 fix #1293 2020-10-05 07:35:18 -04:00
Shivaram Lingamneni
2b66dde72e
Merge pull request #1304 from slingamn/kline_lusers
fix #1303
2020-10-05 03:36:12 -07:00
Shivaram Lingamneni
32fc9f226f fix #1303 2020-10-05 06:28:19 -04:00
Shivaram Lingamneni
8500727b71 bump irctest 2020-10-05 06:27:05 -04:00
Shivaram Lingamneni
7a6413ea2c first draft of atheme migration code 2020-10-02 16:48:37 -04:00
Shivaram Lingamneni
c060113c74
Merge pull request #1300 from slingamn/auditorium.release
auditorium mode
2020-10-02 05:33:02 -07:00
Shivaram Lingamneni
8c99dcb2c7 fix #484 2020-10-02 08:13:52 -04:00
Shivaram Lingamneni
4a7ca14bdc
Merge pull request #1299 from slingamn/fix_noctcp
actually enable the +T no-ctcp umode
2020-10-01 17:52:02 -07:00
Shivaram Lingamneni
c279b2d14c DRY mode apply code
ParseUserModeChanges and ParseChannelModeChanges already validate
that the modes are modifiable, so there's no need to repeat it here.
2020-10-01 19:52:50 -04:00
Shivaram Lingamneni
b426ba628a actually enable the +T no-ctcp umode 2020-10-01 19:21:42 -04:00
Shivaram Lingamneni
a17628eae1
Merge pull request #1297 from slingamn/issue1295_relaymsg
fix #1295
2020-10-01 06:44:58 -07:00
Shivaram Lingamneni
127a03ccf3 fix #1295 2020-10-01 09:42:08 -04:00
Shivaram Lingamneni
a36461415f
Merge pull request #1292 from slingamn/fixbuild
fix non-linux builds
2020-09-29 14:01:03 -07:00
Shivaram Lingamneni
475d7ba418 fix non-linux builds 2020-09-29 15:22:12 -04:00
Shivaram Lingamneni
b876c296eb
Merge pull request #1289 from slingamn/ucred
output unix socket credentials where applicable
2020-09-24 10:09:48 -07:00
Shivaram Lingamneni
f12384c5a6 Output unix socket credentials where applicable
thanks @ajaspers!
2020-09-24 10:59:30 -04:00
Shivaram Lingamneni
e990bc9baa
Merge pull request #1288 from slingamn/tweak
pointless optimization
2020-09-24 07:59:14 -07:00
Shivaram Lingamneni
a6d793a2d5 pointless optimization 2020-09-24 08:35:03 -04:00
Shivaram Lingamneni
1bbf6ab936
Merge pull request #1286 from slingamn/issue1284.1
fix #1284
2020-09-24 05:00:14 -07:00
Shivaram Lingamneni
d9f1c8e1c4 require local_ban capab to see uncloaked IPs 2020-09-24 07:25:04 -04:00
Shivaram Lingamneni
8b01d19336
Merge pull request #1280 from slingamn/issue1277_sanick
fix #1277
2020-09-24 04:10:44 -07:00
Shivaram Lingamneni
bcdf61bd7a fix #1284 2020-09-24 02:44:12 -04:00
Shivaram Lingamneni
0ca27cfeda
Merge pull request #1283 from slingamn/issue1282
attempt to fix #1282
2020-09-23 02:14:05 -07:00
Shivaram Lingamneni
abfbb5b15b attempt to fix #1282 2020-09-23 05:10:03 -04:00
Shivaram Lingamneni
815852191c
Merge pull request #1281 from slingamn/issue414_cacert.2
fix #414
2020-09-22 23:51:26 -07:00
Shivaram Lingamneni
54d165e840
Merge pull request #1279 from oragono/devel+irctest
run irctest in travis
2020-09-22 23:50:04 -07:00
Shivaram Lingamneni
7d5a071a34 fix #1277 2020-09-23 02:30:34 -04:00
Shivaram Lingamneni
1a9f501383 fix #414 2020-09-23 02:25:29 -04:00
Shivaram Lingamneni
eb4dec8d89 run irctest in travis 2020-09-22 10:15:18 -04:00
Shivaram Lingamneni
e7eea14b9d
Merge pull request #1278 from oragono/sanick
fix NICK responses for SANICK
2020-09-21 17:33:51 -07:00
Shivaram Lingamneni
b478a13671 fix NICK responses for SANICK 2020-09-21 20:30:42 -04:00
Shivaram Lingamneni
4a949877a0
Merge pull request #1273 from ajaspers/mute_unregistered
Add +M (only registered/voice can speak) chanmode.
2020-09-21 17:27:52 -07:00
Shivaram Lingamneni
358ae0a2a5
Merge pull request #1276 from oragono/docufix
Update MANUAL.md
2020-09-21 17:26:29 -07:00
dotflac
6c087d19d0 Update MANUAL.md 2020-09-21 20:24:31 -04:00
Alex Jaspersen
504659abb5 Add +M (only registered/voice can speak) chanmode.
Add chanmode preventing speech to error message.

Fixes #1182.
2020-09-21 16:05:00 -07:00
Shivaram Lingamneni
f9ca93118f
Merge pull request #1272 from ajaspers/session_kill
Add NickServ "CLIENTS LIST" and "CLIENTS LOGOUT".
2020-09-21 03:24:53 -07:00
Alex Jaspersen
ca2132ff09 Add NickServ "CLIENTS LIST" and "CLIENTS LOGOUT".
CLIENTS LIST shows information about clients attached to a nick.
CLIENTS LOGOUT allows individual (or all) sessions to be logged out.

SESSIONS is now an alias for CLIENTS LIST.

Fixes #1072.
2020-09-19 10:19:41 -07:00
Shivaram Lingamneni
536c21a874
Merge pull request #1271 from slingamn/issue1240
fix #1240
2020-09-16 18:44:44 -07:00
Shivaram Lingamneni
498d76b131 fix #1240 2020-09-16 12:03:06 -04:00
Shivaram Lingamneni
6a0d11d449 make roleplay.enabled default to false when unset
See #1240.
2020-09-16 11:32:52 -04:00
Shivaram Lingamneni
3ed047ccb8
Merge pull request #1269 from slingamn/websocket_proxy
fix websocket listeners with proxy-before-TLS closing on bad PROXY lines
2020-09-16 03:16:17 -07:00
Shivaram Lingamneni
0073b98505 fix (*http.Server).Serve() exiting on ErrBadProxyLine
anything other than a (net.Error) with Temporary() == true
is treated as a fatal error that causes the http server to exit
2020-09-16 06:12:27 -04:00
Shivaram Lingamneni
36ea93cc9d
Merge pull request #1268 from slingamn/saslmessage
pass the require-sasl message through from the script
2020-09-14 05:45:58 -07:00
Shivaram Lingamneni
f3cdf8442a pass the require-sasl message through from the script 2020-09-14 08:16:03 -04:00
Shivaram Lingamneni
7f13ec14cc
Merge pull request #1267 from slingamn/ipbanscripts.release
scripting API for IP bans
2020-09-14 01:51:08 -07:00
Shivaram Lingamneni
1a98a37a75 scripting API for IP bans
See discussion on #68.
2020-09-14 04:28:12 -04:00
Shivaram Lingamneni
a742ef9639
Merge pull request #1266 from oragono/add_untracked
add untracked x/sys/unix files
2020-09-12 23:16:46 -07:00
Shivaram Lingamneni
676045422b add untracked x/sys/unix files
These should have been added in 66995cdfdfda82b1f32314f7d690db4fea87d321.
Forgetting this seems to be an ongoing problem.
2020-09-13 02:02:17 -04:00
Shivaram Lingamneni
f03602905b
Merge pull request #1262 from slingamn/founderkick
make channel founder unkickable
2020-09-10 02:41:05 -07:00
Shivaram Lingamneni
32bb10f6c6 make channel founder unkickable 2020-09-09 23:15:00 -04:00
Shivaram Lingamneni
f5e9fd3e77
Merge pull request #1261 from slingamn/issue1259_rename
fix #1259
2020-09-09 10:08:53 -07:00
Shivaram Lingamneni
20aaa1ab06 fix #1259 2020-09-09 11:46:05 -04:00
Shivaram Lingamneni
2d277566b5
Merge pull request #1120 from oragono/master+relaymsg
Initial RELAYMSG implementation
2020-09-09 08:40:08 -07:00
Shivaram Lingamneni
af056f26a9 fixes and refactoring 2020-09-09 05:35:04 -04:00
Shivaram Lingamneni
3962ff8643 deprecate roleplay commands
See #1240
2020-09-09 03:57:51 -04:00
Shivaram Lingamneni
8102d1ddb6 Merge remote-tracking branch 'origin/master' into master+relaymsg 2020-09-09 03:55:41 -04:00
Shivaram Lingamneni
adeaa5440b
Merge pull request #1258 from slingamn/issue1213_nouser
fix #1213
2020-09-09 00:02:04 -07:00
Shivaram Lingamneni
307adba8bd fix #1213 2020-09-07 06:00:53 -04:00
Shivaram Lingamneni
60db9536f4
Merge pull request #1241 from slingamn/restricted_stringset
use utils.StringSet in more places
2020-09-05 22:31:17 -07:00
Shivaram Lingamneni
bfb3fd702a
Merge pull request #1249 from jesopo/pong-params
PONG param 0 should be server name
2020-09-05 22:30:50 -07:00
Shivaram Lingamneni
16ca5c2590
Merge pull request #1257 from slingamn/next
set up new development window
2020-09-05 22:30:22 -07:00
Shivaram Lingamneni
66995cdfdf bump x/sys dependency 2020-09-06 01:23:02 -04:00
Shivaram Lingamneni
4d940a5dc0 bump x/crypto dependency 2020-09-06 01:22:12 -04:00
Shivaram Lingamneni
f589a673a7 set up new development version 2020-09-06 01:21:10 -04:00
Shivaram Lingamneni
e43db479ca bump version to 2.3.0 2020-09-06 01:02:05 -04:00
Shivaram Lingamneni
8d1f0067df
Merge pull request #1250 from slingamn/changelog
changelog for v2.3.0
2020-09-05 22:00:17 -07:00
Shivaram Lingamneni
1c110fa501
Merge pull request #1256 from slingamn/deadcode
remove dead code
2020-09-03 21:19:34 -07:00
Shivaram Lingamneni
ed8de2a77a remove dead code 2020-09-03 18:37:18 -04:00
Shivaram Lingamneni
860d61e664 update changelog for 2.3.0 2020-09-01 17:08:49 -04:00
Shivaram Lingamneni
812414189b
Merge pull request #1255 from slingamn/issue1254
fix #1254
2020-09-01 00:24:12 -07:00
Shivaram Lingamneni
71cdc43d9a fix #1254 2020-09-01 02:41:15 -04:00
Shivaram Lingamneni
f58e66152d bump version to 2.3.0-rc2 2020-08-30 02:29:21 -04:00
Shivaram Lingamneni
192f3fb1c9 add changelog for 2.3.0-rc2 2020-08-30 02:29:06 -04:00
Shivaram Lingamneni
e05e624070
Merge pull request #1253 from slingamn/registration_bugs
fix critical bugs in 2.3.0-rc1
2020-08-29 21:21:39 -07:00
Shivaram Lingamneni
01726f8935 fix #1252 2020-08-29 23:40:49 -04:00
Shivaram Lingamneni
3bcf67b956 fix #1251 2020-08-29 21:42:27 -04:00
jesopo
574b07513c PONG param 0 should be server name
fix #1248
2020-08-26 09:18:53 +00:00
Shivaram Lingamneni
fda23264ad
Merge pull request #1247 from slingamn/config_cleanup
remove stray references to timeout enforcement
2020-08-25 17:34:24 -07:00
Shivaram Lingamneni
20fcbe5147 remove stray references to timeout enforcement
These should have been removed in #1027.
2020-08-25 14:11:13 -04:00
Shivaram Lingamneni
75a0e18580
Merge pull request #1245 from slingamn/issue1244
fix #1244
2020-08-23 20:25:37 -07:00
Shivaram Lingamneni
ddb8400124 include go version even without the git hash 2020-08-23 21:59:19 -04:00
Shivaram Lingamneni
6628a3d1c6 fix #1244 2020-08-23 18:11:10 -04:00
Shivaram Lingamneni
4c0144c708 bump version to 2.3.0-rc1 2020-08-23 00:20:20 -04:00
Shivaram Lingamneni
b31c817bcb
Merge pull request #1243 from slingamn/changelog
changelog for 2.3.0-rc1
2020-08-22 21:19:32 -07:00
Shivaram Lingamneni
48adf33411 changelog for 2.3.0-rc1 2020-08-23 00:16:02 -04:00
Shivaram Lingamneni
e44a8550df
Merge pull request #1242 from slingamn/noop_nick_changes
clean up handling of no-op nick changes
2020-08-22 19:48:33 -07:00
Shivaram Lingamneni
1dd0c432fd use utils.StringSet in more places 2020-08-22 22:43:21 -04:00
Shivaram Lingamneni
b1c3a1467a clean up handling of no-op nick changes 2020-08-22 22:26:50 -04:00
Shivaram Lingamneni
c8e2dcb1e9
Merge pull request #1239 from slingamn/issue1228_disable_lookup_hostnames
fix #1228
2020-08-19 12:34:34 -07:00
Shivaram Lingamneni
9d17ed41b5 clarify which option is the default 2020-08-19 15:32:32 -04:00
Shivaram Lingamneni
4411fa7b38
Merge pull request #1237 from slingamn/trailing_space
correct trailing space on +R usermode documentation
2020-08-19 12:30:41 -07:00
Shivaram Lingamneni
2cf4deb67d
Merge pull request #1235 from oragono/l10n_master
New Crowdin updates
2020-08-18 19:42:06 -07:00
Shivaram Lingamneni
a4d119907e fix #1228 2020-08-18 22:35:44 -04:00
Shivaram Lingamneni
e706124852 correct trailing space on +R usermode documentation 2020-08-13 13:17:31 -04:00
Daniel Oaks
0530cd7769 New translations help.lang.json (Dutch) 2020-08-14 03:15:29 +10:00
Shivaram Lingamneni
385993fb2d
Merge pull request #1236 from slingamn/issue1195_go_upgrade
fix #1195
2020-08-11 18:23:30 -07:00
Shivaram Lingamneni
b594ec05e6 fix #1195 2020-08-11 20:38:25 -04:00
Daniel Oaks
24035b4283 New translations help.lang.json (Dutch) 2020-08-12 02:53:01 +10:00
Daniel Oaks
181531699f New translations translation.lang.yaml (Dutch) 2020-08-12 02:52:59 +10:00
Shivaram Lingamneni
c55b25d6a1
Merge pull request #1234 from slingamn/stack_print
tweaks
2020-08-10 21:50:57 -07:00
Shivaram Lingamneni
682f8f66c5 add compiler version to INFO output 2020-08-10 18:14:22 -04:00
Shivaram Lingamneni
c50c267d3c better debug logline for failed message building 2020-08-10 17:33:24 -04:00
Shivaram Lingamneni
5e11f3b346
Merge pull request #1232 from slingamn/timeout_refactor.2
fix #1229
2020-08-09 17:33:53 -07:00
Shivaram Lingamneni
b54d0f8f34 add timer coalescing for the common case 2020-08-08 23:07:53 -04:00
Shivaram Lingamneni
a3e5c9e98c fix #1229 2020-08-07 18:11:39 -04:00
Shivaram Lingamneni
c78253fd93 more memory-efficient implementation of line reading 2020-08-07 01:10:46 -04:00
Shivaram Lingamneni
12bcba01cd
Merge pull request #1230 from slingamn/hasnick
remove some dead code
2020-08-06 21:17:56 -07:00
Shivaram Lingamneni
1c4f9daae7 remove some dead code 2020-08-07 00:16:04 -04:00
Shivaram Lingamneni
55b21fa86c
Merge pull request #1227 from slingamn/issue1225.2
fix #1225
2020-08-06 01:19:39 -07:00
Shivaram Lingamneni
88b09e5919
Merge pull request #1226 from slingamn/websocket_dos
mitigate a potential DoS against websocket listeners
2020-08-06 01:08:01 -07:00
Shivaram Lingamneni
06882a9b89 fix #1225 2020-08-06 03:28:10 -04:00
Shivaram Lingamneni
7b28fc73e6
Merge pull request #1223 from hhirtz/rename
Update draft/rename impl
2020-08-05 14:02:15 -07:00
Hubert Hirtz
f6d5fe812f Update draft/rename implementation
Link to the new draft PR:
<https://github.com/ircv3/ircv3-specifications/pull/420>

Changes in the spec:

- Use standard replies instead of numerics:
  <https://github.com/ircv3/ircv3-specifications/pull/420/files#diff-70e90beef48dc9cf5d784d1e179ea822R44>
- Allow RENAME to a different case:
  <https://github.com/ircv3/ircv3-specifications/pull/420/files#diff-70e90beef48dc9cf5d784d1e179ea822R42>

This commit makes oragono send the PART-JOIN fallback even on case-only
changes. This is so that clients don't have to worry about oragono's
UTF8 casefolding. See the following comments for further info:
<https://github.com/ircv3/ircv3-specifications/pull/420#issuecomment-668770837>

Misc fixes:

- Remove unused variable,
- Add missing calls to utils.SafeErrorParam,
- Don't fill replies with the user-provided "oldName", for the same
  reason as sending the PART-JOIN fallback.
2020-08-05 22:46:30 +02:00
Shivaram Lingamneni
aad39024b9 mitigate a potential DoS against websocket listeners
Websocket listeners would process an arbitrary number of invalid
(non-text or blank) messages without throttling. This imposes fakelag
on such messages by treating them as blank lines.
2020-08-05 15:00:39 -04:00
Shivaram Lingamneni
8f490ae298
Merge pull request #1224 from slingamn/errors_again
minor refactoring
2020-08-04 18:59:08 -07:00
Shivaram Lingamneni
df8be72c6f move StringSet to utils package 2020-08-04 21:54:03 -04:00
Shivaram Lingamneni
ddac7d94a8 use ChannelSet 2020-08-04 21:46:07 -04:00
Shivaram Lingamneni
15c54e80de clean up some error handling 2020-08-03 23:57:42 -04:00
Shivaram Lingamneni
daefa40b75
Merge pull request #1222 from slingamn/linelen
make it easier to patch out the maximum line length
2020-08-03 10:02:13 -07:00
Shivaram Lingamneni
9000383f88 Move config errors to call sites
Since allocating them is rare.
2020-08-03 12:55:52 -04:00
Shivaram Lingamneni
6a2fba9812 make it easier to patch out the maximum line length 2020-08-03 12:51:04 -04:00
Shivaram Lingamneni
101e49bc03
Merge pull request #1220 from oragono/l10n_master
New Crowdin updates
2020-07-28 13:47:24 -07:00
Daniel Oaks
5663ad8824 New translations nickserv.lang.json (Romanian) 2020-07-29 05:22:48 +10:00
Daniel Oaks
fc86c02935 New translations help.lang.json (Romanian) 2020-07-29 05:22:46 +10:00
Daniel Oaks
43f3bede2c New translations irc.lang.json (Romanian) 2020-07-29 05:22:44 +10:00
Shivaram Lingamneni
5dd13596c4
Merge pull request #1219 from slingamn/alwayson_again
fix an edge case with `/NS SASET user always-on true`
2020-07-28 00:14:48 -07:00
Shivaram Lingamneni
470756cd3e fix an edge case with /NS SASET user always-on true
If force-nick-equals-account is disabled, then this could cause
a client with a non-reserved (or grouped) nick to become always-on.
(This can't happen with `/NS SET always-on true` because we check in
advance.)
2020-07-27 06:08:06 -04:00
Shivaram Lingamneni
d9cab88780
Merge pull request #1218 from slingamn/saset_alwayson.1
clean up always-on state machine
2020-07-26 21:26:40 -07:00
Shivaram Lingamneni
027886046c clean up always-on state machine 2020-07-27 00:21:16 -04:00
Shivaram Lingamneni
dc90b3c910
Merge pull request #1211 from slingamn/issue1204_echomessage.3
fix #1204
2020-07-26 03:11:27 -07:00
Shivaram Lingamneni
4bb4d02729
Merge pull request #1200 from slingamn/issue1190_remove_offerlist.1
fix #1190
2020-07-26 03:11:12 -07:00
Shivaram Lingamneni
400158f3c7
Merge pull request #1217 from slingamn/devel
bump to new development version, upgrade dependencies
2020-07-26 03:09:49 -07:00
Shivaram Lingamneni
9acfea5516 upgrade golang.org/x/text 2020-07-26 06:07:46 -04:00
Shivaram Lingamneni
8e90e18b72 upgrade golang.org/x/sys 2020-07-26 06:02:12 -04:00
Shivaram Lingamneni
08834ca511 upgrade golang.org/x/crypto 2020-07-26 06:01:12 -04:00
Shivaram Lingamneni
6fbbcbc44f set up v2.3.0-unreleased 2020-07-26 06:00:24 -04:00
Shivaram Lingamneni
58be8463c9 bump version to 2.2.0 2020-07-26 05:47:18 -04:00
Shivaram Lingamneni
c6f4299447
Merge pull request #1203 from slingamn/release
documentation updates for release
2020-07-26 02:46:47 -07:00
Shivaram Lingamneni
66793cb480 add changelog entry for #1216 2020-07-26 05:45:11 -04:00
Shivaram Lingamneni
effad1453c
Merge pull request #1215 from slingamn/issue1214_saregister
fix #1214
2020-07-26 01:31:00 -07:00
Shivaram Lingamneni
d679d21ac0 fix #1216 2020-07-26 04:11:39 -04:00
Shivaram Lingamneni
bcf581f63d fix #1214 2020-07-26 04:03:07 -04:00
Shivaram Lingamneni
8cd67375a2 bump changelog version 2020-07-24 04:00:32 -04:00
Shivaram Lingamneni
fffe31a7b7 changelog and documentation updates 2020-07-24 04:00:32 -04:00
Shivaram Lingamneni
6d18a1a78c tweak addEchoMessage signature 2020-07-24 02:55:46 -04:00
Shivaram Lingamneni
28d4971f36 fix #1204 2020-07-24 02:46:02 -04:00
Shivaram Lingamneni
b3fd7e39f0
Merge pull request #1210 from oragono/l10n_master
New Crowdin updates
2020-07-23 01:39:49 -07:00
Daniel Oaks
160d189732 New translations nickserv.lang.json (Bosnian) 2020-07-23 17:55:30 +10:00
Daniel Oaks
a732000d93 New translations help.lang.json (German) 2020-07-23 17:55:29 +10:00
Daniel Oaks
64602b84e7 New translations nickserv.lang.json (German) 2020-07-23 17:55:27 +10:00
Daniel Oaks
7ebff15398 New translations irc.lang.json (Greek) 2020-07-23 17:55:26 +10:00
Daniel Oaks
cc05257db1 New translations help.lang.json (Greek) 2020-07-23 17:55:24 +10:00
Daniel Oaks
3da5c9b87f New translations nickserv.lang.json (Greek) 2020-07-23 17:55:23 +10:00
Daniel Oaks
39d97313cc New translations irc.lang.json (Finnish) 2020-07-23 17:55:21 +10:00
Daniel Oaks
dbf29aef6d New translations help.lang.json (Finnish) 2020-07-23 17:55:20 +10:00
Daniel Oaks
50661a8f6c New translations nickserv.lang.json (Finnish) 2020-07-23 17:55:18 +10:00
Daniel Oaks
bead734c60 New translations irc.lang.json (Hebrew) 2020-07-23 17:55:17 +10:00
Daniel Oaks
b123f83f4e New translations irc.lang.json (German) 2020-07-23 17:55:15 +10:00
Daniel Oaks
b66458dd6d New translations help.lang.json (Hebrew) 2020-07-23 17:55:14 +10:00
Daniel Oaks
538c0add53 New translations irc.lang.json (Hungarian) 2020-07-23 17:55:12 +10:00
Daniel Oaks
e2ea0e5b23 New translations help.lang.json (Hungarian) 2020-07-23 17:55:11 +10:00
Daniel Oaks
c460d83cc3 New translations nickserv.lang.json (Hungarian) 2020-07-23 17:55:09 +10:00
Daniel Oaks
9de762f9e5 New translations irc.lang.json (Italian) 2020-07-23 17:55:08 +10:00
Daniel Oaks
efdc09ab97 New translations help.lang.json (Italian) 2020-07-23 17:55:06 +10:00
Daniel Oaks
961f36da5a New translations nickserv.lang.json (Italian) 2020-07-23 17:55:05 +10:00
Daniel Oaks
7cc1babe66 New translations irc.lang.json (Japanese) 2020-07-23 17:55:03 +10:00
Daniel Oaks
50384a1aa1 New translations help.lang.json (Japanese) 2020-07-23 17:55:01 +10:00
Daniel Oaks
3596158fb7 New translations nickserv.lang.json (Japanese) 2020-07-23 17:55:00 +10:00
Daniel Oaks
d7441295cb New translations nickserv.lang.json (Hebrew) 2020-07-23 17:54:58 +10:00
Daniel Oaks
2aea5cd1b7 New translations irc.lang.json (Korean) 2020-07-23 17:54:57 +10:00
Daniel Oaks
41f56e4c8e New translations nickserv.lang.json (Danish) 2020-07-23 17:54:55 +10:00
Daniel Oaks
a434c306a0 New translations irc.lang.json (Danish) 2020-07-23 17:54:54 +10:00
Daniel Oaks
6bf1650207 New translations nickserv.lang.json (Romanian) 2020-07-23 17:54:52 +10:00
Daniel Oaks
244899f430 New translations irc.lang.json (French) 2020-07-23 17:54:51 +10:00
Daniel Oaks
9e5bce2b88 New translations help.lang.json (French) 2020-07-23 17:54:49 +10:00
Daniel Oaks
8aacc70020 New translations nickserv.lang.json (French) 2020-07-23 17:54:48 +10:00
Daniel Oaks
aee381a730 New translations irc.lang.json (Spanish) 2020-07-23 17:54:46 +10:00
Daniel Oaks
376dfb8a5d New translations help.lang.json (Spanish) 2020-07-23 17:54:44 +10:00
Daniel Oaks
52549f1c56 New translations nickserv.lang.json (Spanish) 2020-07-23 17:54:43 +10:00
Daniel Oaks
6955d5fa2e New translations irc.lang.json (Afrikaans) 2020-07-23 17:54:41 +10:00
Daniel Oaks
3c6beb2f1f New translations help.lang.json (Afrikaans) 2020-07-23 17:54:40 +10:00
Daniel Oaks
1999c419a7 New translations help.lang.json (Danish) 2020-07-23 17:54:38 +10:00
Daniel Oaks
a4edb5f978 New translations nickserv.lang.json (Afrikaans) 2020-07-23 17:54:37 +10:00
Daniel Oaks
7bab7d6bf0 New translations help.lang.json (Arabic) 2020-07-23 17:54:36 +10:00
Daniel Oaks
1d69e3f96a New translations nickserv.lang.json (Arabic) 2020-07-23 17:54:34 +10:00
Daniel Oaks
9420dfb30f New translations irc.lang.json (Catalan) 2020-07-23 17:54:32 +10:00
Daniel Oaks
ccbe1fcb5d New translations help.lang.json (Catalan) 2020-07-23 17:54:31 +10:00
Daniel Oaks
79c8ea04cd New translations nickserv.lang.json (Catalan) 2020-07-23 17:54:29 +10:00
Daniel Oaks
247d5e5657 New translations irc.lang.json (Czech) 2020-07-23 17:54:28 +10:00
Daniel Oaks
db108374aa New translations help.lang.json (Czech) 2020-07-23 17:54:26 +10:00
Daniel Oaks
569505fe60 New translations nickserv.lang.json (Czech) 2020-07-23 17:54:25 +10:00
Daniel Oaks
4fd4972c88 New translations irc.lang.json (Arabic) 2020-07-23 17:54:23 +10:00
Daniel Oaks
9ef19866c0 New translations help.lang.json (Romanian) 2020-07-23 17:54:22 +10:00
Daniel Oaks
4ddfad2797 New translations help.lang.json (Korean) 2020-07-23 17:54:20 +10:00
Daniel Oaks
e021b9a516 New translations irc.lang.json (Dutch) 2020-07-23 17:54:19 +10:00
Daniel Oaks
5dc2ca7f6f New translations irc.lang.json (Ukrainian) 2020-07-23 17:54:17 +10:00
Daniel Oaks
028a8d2e5e New translations help.lang.json (Ukrainian) 2020-07-23 17:54:16 +10:00
Daniel Oaks
46268724ce New translations nickserv.lang.json (Ukrainian) 2020-07-23 17:54:15 +10:00
Daniel Oaks
39cbd6d122 New translations irc.lang.json (Chinese Simplified) 2020-07-23 17:54:13 +10:00
Daniel Oaks
e9776488c3 New translations help.lang.json (Chinese Simplified) 2020-07-23 17:54:12 +10:00
Daniel Oaks
163e629671 New translations nickserv.lang.json (Chinese Simplified) 2020-07-23 17:54:10 +10:00
Daniel Oaks
b7502014db New translations irc.lang.json (Chinese Traditional) 2020-07-23 17:54:08 +10:00
Daniel Oaks
de6167db62 New translations help.lang.json (Chinese Traditional) 2020-07-23 17:54:07 +10:00
Daniel Oaks
2838c27a50 New translations nickserv.lang.json (Chinese Traditional) 2020-07-23 17:54:06 +10:00
Daniel Oaks
63f4b66b49 New translations nickserv.lang.json (Turkish) 2020-07-23 17:54:04 +10:00
Daniel Oaks
cd419ba3b3 New translations irc.lang.json (Vietnamese) 2020-07-23 17:54:03 +10:00
Daniel Oaks
0c7ebba5d1 New translations nickserv.lang.json (Vietnamese) 2020-07-23 17:54:01 +10:00
Daniel Oaks
4bab22a512 New translations irc.lang.json (Portuguese, Brazilian) 2020-07-23 17:53:59 +10:00
Daniel Oaks
67788db938 New translations help.lang.json (Portuguese, Brazilian) 2020-07-23 17:53:58 +10:00
Daniel Oaks
660861d3c6 New translations nickserv.lang.json (Portuguese, Brazilian) 2020-07-23 17:53:56 +10:00
Daniel Oaks
72a8be7237 New translations irc.lang.json (English, Australia) 2020-07-23 17:53:55 +10:00
Daniel Oaks
4d58f7de3a New translations help.lang.json (English, Australia) 2020-07-23 17:53:53 +10:00
Daniel Oaks
6ed2837a85 New translations nickserv.lang.json (English, Australia) 2020-07-23 17:53:52 +10:00
Daniel Oaks
c5f3d98947 New translations irc.lang.json (Bosnian) 2020-07-23 17:53:50 +10:00
Daniel Oaks
cbcc181d66 New translations help.lang.json (Bosnian) 2020-07-23 17:53:49 +10:00
Daniel Oaks
5e04ea1270 New translations help.lang.json (Vietnamese) 2020-07-23 17:53:47 +10:00
Daniel Oaks
f7058e0389 New translations nickserv.lang.json (Korean) 2020-07-23 17:53:46 +10:00
Daniel Oaks
e596b9202c New translations help.lang.json (Turkish) 2020-07-23 17:53:44 +10:00
Daniel Oaks
e9d85fb433 New translations nickserv.lang.json (Swedish) 2020-07-23 17:53:43 +10:00
Daniel Oaks
e83bb78fa5 New translations help.lang.json (Dutch) 2020-07-23 17:53:41 +10:00
Daniel Oaks
7aa6614268 New translations nickserv.lang.json (Dutch) 2020-07-23 17:53:40 +10:00
Daniel Oaks
e665cb278a New translations irc.lang.json (Norwegian) 2020-07-23 17:53:38 +10:00
Daniel Oaks
5cd0656c97 New translations help.lang.json (Norwegian) 2020-07-23 17:53:37 +10:00
Daniel Oaks
a868372144 New translations nickserv.lang.json (Norwegian) 2020-07-23 17:53:35 +10:00
Daniel Oaks
33590ea52b New translations irc.lang.json (Polish) 2020-07-23 17:53:34 +10:00
Daniel Oaks
75438f807e New translations help.lang.json (Polish) 2020-07-23 17:53:32 +10:00
Daniel Oaks
09b6655905 New translations nickserv.lang.json (Polish) 2020-07-23 17:53:31 +10:00
Daniel Oaks
7ee109fbff New translations irc.lang.json (Portuguese) 2020-07-23 17:53:29 +10:00
Daniel Oaks
27463737c2 New translations irc.lang.json (Turkish) 2020-07-23 17:53:28 +10:00
Daniel Oaks
d2355a1b00 New translations help.lang.json (Portuguese) 2020-07-23 17:53:26 +10:00
Daniel Oaks
6df3d8ff19 New translations irc.lang.json (Russian) 2020-07-23 17:53:25 +10:00
Daniel Oaks
4ea8f386fe New translations help.lang.json (Russian) 2020-07-23 17:53:23 +10:00
Daniel Oaks
f149b163f8 New translations nickserv.lang.json (Russian) 2020-07-23 17:53:22 +10:00
Daniel Oaks
cd53836a65 New translations irc.lang.json (Serbian (Cyrillic)) 2020-07-23 17:53:20 +10:00
Daniel Oaks
edd5e021d4 New translations help.lang.json (Serbian (Cyrillic)) 2020-07-23 17:53:19 +10:00
Daniel Oaks
86c679463e New translations nickserv.lang.json (Serbian (Cyrillic)) 2020-07-23 17:53:17 +10:00
Daniel Oaks
68c52781c2 New translations irc.lang.json (Swedish) 2020-07-23 17:53:16 +10:00
Daniel Oaks
15e6988ddc New translations help.lang.json (Swedish) 2020-07-23 17:53:14 +10:00
Daniel Oaks
3b607f4643 New translations nickserv.lang.json (Portuguese) 2020-07-23 17:53:13 +10:00
Daniel Oaks
7ff5b0859d New translations irc.lang.json (Romanian) 2020-07-23 17:53:11 +10:00
Shivaram Lingamneni
cfd5949848
Merge pull request #1209 from slingamn/strings
update translations
2020-07-23 00:42:22 -07:00
Shivaram Lingamneni
45351c8d07 update translations 2020-07-23 03:37:43 -04:00
Shivaram Lingamneni
7a16f166c5
Merge pull request #1207 from slingamn/awaystring
tweaks to auto-away
2020-07-21 23:08:50 -07:00
Shivaram Lingamneni
b5f0f9a3ce
Merge pull request #1208 from slingamn/setpassword
alias for NICKSERV SET PASSWORD
2020-07-21 23:08:41 -07:00
Shivaram Lingamneni
e551002944
Merge pull request #1206 from slingamn/issue1205_znc.1
fix #1205
2020-07-21 23:08:23 -07:00
Shivaram Lingamneni
af009a5bc1 fix 2-parameter case for *playback 2020-07-21 16:33:17 -04:00
Shivaram Lingamneni
e6e55bbf29 remove 'history' batch type
This was from ircv3-specifications #362, which is now obsolete.
2020-07-21 15:26:03 -04:00
Shivaram Lingamneni
f193298dcd alias for NICKSERV SET PASSWORD 2020-07-21 01:05:13 -04:00
Shivaram Lingamneni
eaae3165f2 don't trigger auto-away if the client is already away 2020-07-20 17:05:29 -04:00
Shivaram Lingamneni
6916dbeae0 use consistent phrase for auto-away message 2020-07-20 16:58:41 -04:00
Shivaram Lingamneni
562b85c1c0 simplify some logic 2020-07-20 14:10:43 -04:00
Shivaram Lingamneni
e827bc0f9c fix #1205 2020-07-20 04:28:17 -04:00
Shivaram Lingamneni
a4343bf77d bump version to 2.2.0-rc1 2020-07-19 02:25:25 -04:00
Shivaram Lingamneni
04844e0a00
Merge pull request #1196 from slingamn/changelog.1
add changelog and documentation updates
2020-07-18 22:59:45 -07:00
Shivaram Lingamneni
025c7c70a2 add changelog entry for #1198 2020-07-19 01:40:44 -04:00
Shivaram Lingamneni
b5855e6194
Merge pull request #1199 from slingamn/issue1198_awaynotify.1
fix #1198
2020-07-17 02:36:56 -07:00
Shivaram Lingamneni
ffd00e1aff minor optimization to Client.Friends 2020-07-17 04:53:30 -04:00
Shivaram Lingamneni
32c58c1e1f fix #1190 2020-07-17 04:19:33 -04:00
Shivaram Lingamneni
93530ae397 fix #1198 2020-07-17 02:54:43 -04:00
Shivaram Lingamneni
9e3ad5aff1 fix #1060 2020-07-15 21:57:59 -04:00
Shivaram Lingamneni
5741f3e15c add changelog and documentation updates 2020-07-13 23:49:27 -04:00
Shivaram Lingamneni
a99c893f9b Merge branch 'realname_again' 2020-07-12 16:49:30 -04:00
Shivaram Lingamneni
b3becbf08e clean up no-op 2020-07-12 16:47:17 -04:00
Shivaram Lingamneni
77184c1625 restore transition mechanism 2020-07-12 16:47:11 -04:00
Shivaram Lingamneni
ad32a01c12
Merge pull request #1193 from slingamn/whox.2
refactor WhoFields to use value receivers
2020-07-12 13:41:49 -07:00
Shivaram Lingamneni
a6d41109d0 restore multiprefix support in RPL_WHOREPLY 2020-07-12 16:40:11 -04:00
Conrad Lukawski
6f8711da3b Persist realname for always-on clients 2020-07-12 14:46:36 -04:00
Shivaram Lingamneni
358c85e697
Merge pull request #1191 from slingamn/moderation.3
enhancements to moderation (#1134, #1135)
2020-07-12 11:03:34 -07:00
Shivaram Lingamneni
0a6c1f7cc6
Merge pull request #1189 from slingamn/tagmsg_storage.1
make TAGMSG storage configurable
2020-07-12 10:57:00 -07:00
Shivaram Lingamneni
97417f4c32 refactor WhoFields to use value receivers 2020-07-12 13:45:29 -04:00
Shivaram Lingamneni
bdfee9cb39
Merge pull request #1184 from jesopo/whox
implement WHOX
2020-07-11 19:36:04 -07:00
jesopo
518b21e5aa implement WHOX 2020-07-11 16:45:02 +01:00
Shivaram Lingamneni
a7ca6601c7 enhancements to moderation (#1134, #1135) 2020-07-10 17:09:02 -04:00
Shivaram Lingamneni
57f2857e83
Merge pull request #1185 from slingamn/wrongsource
fix incorrect source of some nickserv messages
2020-07-09 19:44:30 -07:00
Shivaram Lingamneni
205e8c1b76
Merge pull request #1187 from slingamn/defcon.2
fix #328 (implement DEFCON)
2020-07-09 19:44:15 -07:00
Shivaram Lingamneni
640ff77ccd
Merge pull request #1186 from slingamn/loginviapass
enable login-via-pass-command by default
2020-07-09 19:42:30 -07:00
Shivaram Lingamneni
bca3dd0b41 make TAGMSG storage configurable 2020-07-09 20:17:50 -04:00
Shivaram Lingamneni
8dd25f66bc review fix 2020-07-09 04:37:30 -04:00
Shivaram Lingamneni
6ea2eb367d fix #328 (implement DEFCON) 2020-07-09 02:16:51 -04:00
Shivaram Lingamneni
09c4fd3b47 enable login-via-pass-command by default 2020-07-08 21:48:08 -04:00
Shivaram Lingamneni
7dd25c6ac7 fix incorrect source of some nickserv messages 2020-07-08 21:45:13 -04:00
Shivaram Lingamneni
f2d0842453
Merge pull request #1181 from slingamn/registerwarning
fix #1179
2020-07-07 10:28:43 -07:00
Shivaram Lingamneni
39269a903b fix #1179 2020-07-06 04:29:21 -04:00
Shivaram Lingamneni
7d596add87
Merge pull request #1175 from slingamn/stsregburst.1
fix #802
2020-07-02 10:39:08 -07:00
Shivaram Lingamneni
ed0d31e28e review feedback: fix incorrect sts-only RPL_ISUPPORT 2020-07-02 05:13:28 -04:00
Shivaram Lingamneni
dca3965fd3 ensure STS-only 005 is a trailing 2020-07-02 04:00:51 -04:00
Shivaram Lingamneni
f73b389ceb fix #802 2020-07-02 03:38:20 -04:00
Shivaram Lingamneni
09b74aaa37
Merge pull request #1169 from slingamn/banrace.2
fix #1166 and #1168
2020-07-01 02:41:46 -07:00
Shivaram Lingamneni
e44fbc3845
Merge pull request #1170 from slingamn/motd
fix #1167
2020-07-01 02:40:08 -07:00
Shivaram Lingamneni
0b0b1499b0 fix #1167 2020-07-01 04:20:27 -04:00
Shivaram Lingamneni
067e62ad5e fix #1166 and #1168 2020-07-01 03:52:55 -04:00
Shivaram Lingamneni
79764cd549
Merge pull request #1163 from slingamn/list_issue1161
fix #1161
2020-06-30 17:43:48 -07:00
Shivaram Lingamneni
a8476f4e46
Merge pull request #1164 from slingamn/updateidle
fix #1155
2020-06-30 17:43:03 -07:00
Shivaram Lingamneni
70f533ee07 fix #1155 2020-06-29 21:29:28 -04:00
Shivaram Lingamneni
a7107bfb67
Merge pull request #1156 from slingamn/lastseen
tweaks to lastSeen persistence
2020-06-29 18:04:55 -07:00
Shivaram Lingamneni
696980367d fix #1161 2020-06-29 15:41:29 -04:00
Shivaram Lingamneni
1aad7bed51
Merge pull request #1160 from oragono/l10n_master
New Crowdin updates
2020-06-29 12:34:13 -07:00
Daniel Oaks
7ef459aa10 New translations nickserv.lang.json (Romanian) 2020-06-30 04:22:52 +10:00
Shivaram Lingamneni
56dc2db09d
Merge pull request #1158 from slingamn/straystring
remove a stray documentation line
2020-06-29 00:07:53 -07:00
Shivaram Lingamneni
9d6d8b0910
Merge pull request #1159 from oragono/l10n_master
New Crowdin updates
2020-06-29 00:06:39 -07:00
Daniel Oaks
e04789f55d New translations nickserv.lang.json (Romanian) 2020-06-29 16:21:57 +10:00
Shivaram Lingamneni
fe2332f0cd remove a stray documentation line 2020-06-29 02:12:24 -04:00
Shivaram Lingamneni
0f04acaa40 persist last seen on shutdown 2020-06-29 00:38:05 -04:00
Shivaram Lingamneni
a38d375bda delete always-on modes on unregistration 2020-06-29 00:38:05 -04:00
Shivaram Lingamneni
e22adf47ca increase write interval for lastSeen 2020-06-29 00:38:05 -04:00
Shivaram Lingamneni
9aa53aa3aa update lastSeen on reattach 2020-06-29 00:38:05 -04:00
Shivaram Lingamneni
d7a62223a0
Merge pull request #1123 from clukawski/no-ctcp-user-mode
Add +T no-CTCP usermode
2020-06-27 21:13:24 -07:00
Conrad Lukawski
fca2900918 Add +T no-CTCP usermode 2020-06-28 00:04:42 -04:00
Shivaram Lingamneni
fb7a460ee9
Merge pull request #1154 from slingamn/fields
delete some unused fields
2020-06-24 14:22:43 -07:00
Shivaram Lingamneni
089a267070 delete some unused fields 2020-06-24 16:50:07 -04:00
Shivaram Lingamneni
ba68358c21
Merge pull request #1152 from slingamn/utf8.1
fix #1151
2020-06-23 01:02:59 -07:00
Shivaram Lingamneni
8cadc7340a don't trim line endings in IRCStreamConn
Doesn't help if the line ends with regular \n only,
and the parser has to account for \r and \n anyway
2020-06-23 03:25:20 -04:00
Shivaram Lingamneni
28a0ec86b5 simplify Socket.Read 2020-06-23 03:25:20 -04:00
Shivaram Lingamneni
7ee7b1aab5
Merge pull request #1150 from slingamn/monitor.1
fix #1053, #1083
2020-06-22 20:25:27 -07:00
Shivaram Lingamneni
0e7557c12d
Merge pull request #1149 from slingamn/issue1059_certfp
fix #1059
2020-06-22 20:23:15 -07:00
Shivaram Lingamneni
1c3e40b358
Merge pull request #1148 from slingamn/issue1050_fingerprint
fix #1050
2020-06-22 20:23:05 -07:00
Shivaram Lingamneni
be138e4d71 make comment consistent with review fix 2020-06-22 22:34:09 -04:00
Shivaram Lingamneni
58d3d1276f review fix 2020-06-22 18:53:54 -04:00
Shivaram Lingamneni
21e604860f add an explanatory comment 2020-06-22 15:56:47 -04:00
Shivaram Lingamneni
a4f9e08a85 fix #1151 2020-06-22 15:50:28 -04:00
Shivaram Lingamneni
cb530050f1 fix #1053, #1083 2020-06-21 23:51:31 -04:00
Shivaram Lingamneni
97789cde7e fix #1059 2020-06-21 18:42:45 -04:00
Shivaram Lingamneni
01bd04a8ff fix #1050 2020-06-21 18:32:57 -04:00
Shivaram Lingamneni
4cadb7ad58
Merge pull request #1147 from slingamn/run
tweak some manual language
2020-06-18 22:55:07 -07:00
Shivaram Lingamneni
640e7a42b2
Merge pull request #1146 from slingamn/followup
fix disabling of autoreplay-missed
2020-06-18 22:54:51 -07:00
Shivaram Lingamneni
76b534476a tweak some manual language 2020-06-18 13:57:19 -04:00
Shivaram Lingamneni
ca79da87b1 fix disabling of autoreplay-missed 2020-06-18 04:32:54 -04:00
Shivaram Lingamneni
3662698f87
Merge pull request #1145 from slingamn/autoreplay_again
fix #1144
2020-06-18 01:22:15 -07:00
Shivaram Lingamneni
17cd831319 fix #1144 2020-06-18 03:38:00 -04:00
Shivaram Lingamneni
7af1f20223
Merge pull request #1142 from slingamn/removeldap
remove LDAP support from core
2020-06-17 09:36:35 -07:00
Shivaram Lingamneni
9be9e7bfcd
Merge pull request #1143 from oragono/l10n_master
New Crowdin updates
2020-06-17 09:26:57 -07:00
Daniel Oaks
e4072956c1 New translations nickserv.lang.json (Romanian) 2020-06-17 20:52:55 +10:00
Shivaram Lingamneni
91fa3b30b0 fix the corresponding bug for certfp authentication 2020-06-17 03:09:20 -04:00
Shivaram Lingamneni
9c26c45607 fix a bug in authscript fallback handling 2020-06-17 02:19:25 -04:00
Shivaram Lingamneni
70a6ea375c add make gofmt 2020-06-17 02:15:05 -04:00
Shivaram Lingamneni
114e359347 remove ldap 2020-06-17 02:15:05 -04:00
Shivaram Lingamneni
a60b56570a
Merge pull request #1141 from oragono/l10n_master
New Crowdin updates
2020-06-16 23:08:27 -07:00
Daniel Oaks
ac213b9a16 New translations nickserv.lang.json (Bosnian) 2020-06-17 08:54:37 +10:00
Daniel Oaks
476aad0b31 New translations help.lang.json (German) 2020-06-17 08:54:35 +10:00
Daniel Oaks
3ad332d8f2 New translations nickserv.lang.json (German) 2020-06-17 08:54:33 +10:00
Daniel Oaks
fd36c5cb2f New translations irc.lang.json (Greek) 2020-06-17 08:54:32 +10:00
Daniel Oaks
a853b4b4e5 New translations help.lang.json (Greek) 2020-06-17 08:54:30 +10:00
Daniel Oaks
4a5df0e1a2 New translations nickserv.lang.json (Greek) 2020-06-17 08:54:29 +10:00
Daniel Oaks
080531f7c7 New translations irc.lang.json (Finnish) 2020-06-17 08:54:27 +10:00
Daniel Oaks
e1a6dbb829 New translations help.lang.json (Finnish) 2020-06-17 08:54:26 +10:00
Daniel Oaks
e8ed204bf5 New translations nickserv.lang.json (Finnish) 2020-06-17 08:54:25 +10:00
Daniel Oaks
49f6c7c907 New translations irc.lang.json (Hebrew) 2020-06-17 08:54:23 +10:00
Daniel Oaks
8282d0695c New translations irc.lang.json (German) 2020-06-17 08:54:22 +10:00
Daniel Oaks
4d6865155c New translations help.lang.json (Hebrew) 2020-06-17 08:54:20 +10:00
Daniel Oaks
2addfd201d New translations irc.lang.json (Hungarian) 2020-06-17 08:54:18 +10:00
Daniel Oaks
5b4f56d703 New translations help.lang.json (Hungarian) 2020-06-17 08:54:17 +10:00
Daniel Oaks
4590a2631e New translations nickserv.lang.json (Hungarian) 2020-06-17 08:54:16 +10:00
Daniel Oaks
4c8b007b22 New translations irc.lang.json (Italian) 2020-06-17 08:54:14 +10:00
Daniel Oaks
c4731d8583 New translations help.lang.json (Italian) 2020-06-17 08:54:12 +10:00
Daniel Oaks
73a398a9a2 New translations nickserv.lang.json (Italian) 2020-06-17 08:54:11 +10:00
Daniel Oaks
919637831b New translations irc.lang.json (Japanese) 2020-06-17 08:54:10 +10:00
Daniel Oaks
49def07a15 New translations help.lang.json (Japanese) 2020-06-17 08:54:08 +10:00
Daniel Oaks
0849b42f0f New translations nickserv.lang.json (Japanese) 2020-06-17 08:54:07 +10:00
Daniel Oaks
4c7fba3f1f New translations nickserv.lang.json (Hebrew) 2020-06-17 08:54:05 +10:00
Daniel Oaks
00f99571d2 New translations irc.lang.json (Korean) 2020-06-17 08:54:04 +10:00
Daniel Oaks
c43f3afd01 New translations nickserv.lang.json (Danish) 2020-06-17 08:53:57 +10:00
Daniel Oaks
e3ad134632 New translations irc.lang.json (Danish) 2020-06-17 08:53:56 +10:00
Daniel Oaks
c17625ce84 New translations help.lang.json (Romanian) 2020-06-17 08:53:54 +10:00
Daniel Oaks
a04184696b New translations nickserv.lang.json (Romanian) 2020-06-17 08:53:53 +10:00
Daniel Oaks
500861d1da New translations irc.lang.json (French) 2020-06-17 08:53:51 +10:00
Daniel Oaks
65cd99ff37 New translations help.lang.json (French) 2020-06-17 08:53:49 +10:00
Daniel Oaks
f0f6535ec5 New translations nickserv.lang.json (French) 2020-06-17 08:53:48 +10:00
Daniel Oaks
a2f8d05012 New translations irc.lang.json (Spanish) 2020-06-17 08:53:46 +10:00
Daniel Oaks
c919460a3a New translations help.lang.json (Spanish) 2020-06-17 08:53:44 +10:00
Daniel Oaks
777b8a3241 New translations nickserv.lang.json (Spanish) 2020-06-17 08:53:43 +10:00
Daniel Oaks
8bab25a724 New translations irc.lang.json (Afrikaans) 2020-06-17 08:53:42 +10:00
Daniel Oaks
7f02fd4fed New translations help.lang.json (Danish) 2020-06-17 08:53:40 +10:00
Daniel Oaks
fb58c5adcc New translations help.lang.json (Afrikaans) 2020-06-17 08:53:38 +10:00
Daniel Oaks
1e24a83881 New translations irc.lang.json (Arabic) 2020-06-17 08:53:37 +10:00
Daniel Oaks
098e3df31e New translations help.lang.json (Arabic) 2020-06-17 08:53:35 +10:00
Daniel Oaks
463f461504 New translations nickserv.lang.json (Arabic) 2020-06-17 08:53:34 +10:00
Daniel Oaks
61474d133c New translations irc.lang.json (Catalan) 2020-06-17 08:53:33 +10:00
Daniel Oaks
1d1f66d22a New translations help.lang.json (Catalan) 2020-06-17 08:53:31 +10:00
Daniel Oaks
61a04dd5ae New translations nickserv.lang.json (Catalan) 2020-06-17 08:53:29 +10:00
Daniel Oaks
4fedd183c4 New translations irc.lang.json (Czech) 2020-06-17 08:53:28 +10:00
Daniel Oaks
023ad31de0 New translations help.lang.json (Czech) 2020-06-17 08:53:26 +10:00
Daniel Oaks
948b1cdb93 New translations nickserv.lang.json (Czech) 2020-06-17 08:53:25 +10:00
Daniel Oaks
eaf0d679fc New translations nickserv.lang.json (Afrikaans) 2020-06-17 08:53:23 +10:00
Daniel Oaks
60c13c9533 New translations chanserv.lang.json (Romanian) 2020-06-17 08:53:22 +10:00
Daniel Oaks
5a2deb9e05 New translations help.lang.json (Korean) 2020-06-17 08:53:21 +10:00
Daniel Oaks
6fc5770e5e New translations irc.lang.json (Dutch) 2020-06-17 08:53:19 +10:00
Daniel Oaks
189560375d New translations irc.lang.json (Ukrainian) 2020-06-17 08:53:18 +10:00
Daniel Oaks
58ab8278bf New translations help.lang.json (Ukrainian) 2020-06-17 08:53:16 +10:00
Daniel Oaks
6d65af77fd New translations nickserv.lang.json (Ukrainian) 2020-06-17 08:53:15 +10:00
Daniel Oaks
64de6cfa3d New translations irc.lang.json (Chinese Simplified) 2020-06-17 08:53:13 +10:00
Daniel Oaks
54459cb8ff New translations help.lang.json (Chinese Simplified) 2020-06-17 08:53:12 +10:00
Daniel Oaks
3b5ddf900e New translations nickserv.lang.json (Chinese Simplified) 2020-06-17 08:53:10 +10:00
Daniel Oaks
84444d447e New translations irc.lang.json (Chinese Traditional) 2020-06-17 08:53:09 +10:00
Daniel Oaks
237194c399 New translations help.lang.json (Chinese Traditional) 2020-06-17 08:53:07 +10:00
Daniel Oaks
3552a84310 New translations nickserv.lang.json (Chinese Traditional) 2020-06-17 08:53:05 +10:00
Daniel Oaks
9b12c52821 New translations nickserv.lang.json (Turkish) 2020-06-17 08:53:04 +10:00
Daniel Oaks
7f07c7531c New translations irc.lang.json (Vietnamese) 2020-06-17 08:53:02 +10:00
Daniel Oaks
37b85e4ca6 New translations nickserv.lang.json (Vietnamese) 2020-06-17 08:53:00 +10:00
Daniel Oaks
78d0c0f52a New translations irc.lang.json (Portuguese, Brazilian) 2020-06-17 08:52:58 +10:00
Daniel Oaks
95981e9cfe New translations help.lang.json (Portuguese, Brazilian) 2020-06-17 08:52:56 +10:00
Daniel Oaks
7122e80a69 New translations nickserv.lang.json (Portuguese, Brazilian) 2020-06-17 08:52:55 +10:00
Daniel Oaks
fe49c60e3d New translations irc.lang.json (English, Australia) 2020-06-17 08:52:54 +10:00
Daniel Oaks
8f4fc19443 New translations help.lang.json (English, Australia) 2020-06-17 08:52:52 +10:00
Daniel Oaks
0bb0d46acb New translations nickserv.lang.json (English, Australia) 2020-06-17 08:52:51 +10:00
Daniel Oaks
4fdd6feb73 New translations irc.lang.json (Bosnian) 2020-06-17 08:52:49 +10:00
Daniel Oaks
5caa379273 New translations help.lang.json (Bosnian) 2020-06-17 08:52:48 +10:00
Daniel Oaks
1b669069fd New translations help.lang.json (Vietnamese) 2020-06-17 08:52:46 +10:00
Daniel Oaks
57aff4e9e1 New translations nickserv.lang.json (Korean) 2020-06-17 08:52:44 +10:00
Daniel Oaks
1166aacc66 New translations help.lang.json (Turkish) 2020-06-17 08:52:43 +10:00
Daniel Oaks
04f58d75ea New translations nickserv.lang.json (Swedish) 2020-06-17 08:52:42 +10:00
Daniel Oaks
3294ee8a3d New translations help.lang.json (Dutch) 2020-06-17 08:52:40 +10:00
Daniel Oaks
e2626d1313 New translations nickserv.lang.json (Dutch) 2020-06-17 08:52:39 +10:00
Daniel Oaks
23f1e7af72 New translations irc.lang.json (Norwegian) 2020-06-17 08:52:37 +10:00
Daniel Oaks
3d6d91937c New translations help.lang.json (Norwegian) 2020-06-17 08:52:35 +10:00
Daniel Oaks
7699d91ff9 New translations nickserv.lang.json (Norwegian) 2020-06-17 08:52:34 +10:00
Daniel Oaks
4f73a94ce2 New translations irc.lang.json (Polish) 2020-06-17 08:52:32 +10:00
Daniel Oaks
8a3c785744 New translations help.lang.json (Polish) 2020-06-17 08:52:31 +10:00
Daniel Oaks
fd81e89ee0 New translations nickserv.lang.json (Polish) 2020-06-17 08:52:29 +10:00
Daniel Oaks
97b272d9ae New translations irc.lang.json (Portuguese) 2020-06-17 08:52:28 +10:00
Daniel Oaks
9bd7189ed4 New translations irc.lang.json (Turkish) 2020-06-17 08:52:26 +10:00
Daniel Oaks
44982c7d96 New translations help.lang.json (Portuguese) 2020-06-17 08:52:25 +10:00
Daniel Oaks
c5ab1a44de New translations irc.lang.json (Russian) 2020-06-17 08:52:23 +10:00
Daniel Oaks
3e1325e07b New translations help.lang.json (Russian) 2020-06-17 08:52:22 +10:00
Daniel Oaks
6585e8f512 New translations nickserv.lang.json (Russian) 2020-06-17 08:52:20 +10:00
Daniel Oaks
f3c00627e7 New translations irc.lang.json (Serbian (Cyrillic)) 2020-06-17 08:52:19 +10:00
Daniel Oaks
8b41707221 New translations help.lang.json (Serbian (Cyrillic)) 2020-06-17 08:52:17 +10:00
Daniel Oaks
9125de2d8c New translations nickserv.lang.json (Serbian (Cyrillic)) 2020-06-17 08:52:16 +10:00
Daniel Oaks
73a8db7c53 New translations irc.lang.json (Swedish) 2020-06-17 08:52:14 +10:00
Daniel Oaks
e9ffabf25e New translations help.lang.json (Swedish) 2020-06-17 08:52:13 +10:00
Daniel Oaks
475382d47c New translations nickserv.lang.json (Portuguese) 2020-06-17 08:52:11 +10:00
Daniel Oaks
51988a24d9 New translations irc.lang.json (Romanian) 2020-06-17 08:52:10 +10:00
Shivaram Lingamneni
9994be28ff
Merge pull request #1137 from oragono/l10n_master
New Crowdin updates
2020-06-16 07:29:43 -07:00
Shivaram Lingamneni
c3e448cbcd
Merge pull request #1140 from oragono/dev+fixed-strings
Fix some translation stuff
2020-06-16 07:29:36 -07:00
Daniel Oaks
5c8c9dba2c New translations chanserv.lang.json (Romanian) 2020-06-16 20:53:00 +10:00
Daniel Oaks
1b7b24936c New translations irc.lang.json (Romanian) 2020-06-16 20:52:59 +10:00
Daniel Oaks
fb55cc3390 Ignore some dodgy TL strings, fix another dodgy string 2020-06-16 20:33:10 +10:00
Shivaram Lingamneni
250076a132
Merge pull request #1139 from slingamn/tilt
fix bug introduced in #1138
2020-06-16 02:11:19 -07:00
Shivaram Lingamneni
784078d693 fix bug introduced in #1138 2020-06-16 05:10:09 -04:00
Shivaram Lingamneni
4edf7516eb
Merge pull request #1138 from slingamn/deviceid
read device ID from SASL as well
2020-06-16 02:02:59 -07:00
Shivaram Lingamneni
90e697f454 read device ID from SASL as well 2020-06-16 04:58:29 -04:00
Shivaram Lingamneni
48d654d60c
Merge pull request #1136 from slingamn/extjwt.3
EXTJWT, take 2
2020-06-15 20:17:22 -07:00
Shivaram Lingamneni
68faf7926e review fix 2020-06-15 22:32:06 -04:00
Daniel Oaks
57586a9548 New translations help.lang.json (Romanian) 2020-06-16 08:51:47 +10:00
Daniel Oaks
a3d288d167 New translations irc.lang.json (Romanian) 2020-06-16 08:51:46 +10:00
Shivaram Lingamneni
e61e0143bd refactor/enhance jwt signing 2020-06-15 14:34:58 -04:00
Shivaram Lingamneni
bfeba1f2f3 remove client join time tracking 2020-06-15 14:34:58 -04:00
Shivaram Lingamneni
18fd86ce98 run go mod tidy 2020-06-15 14:34:58 -04:00
Shivaram Lingamneni
31b6bfa84e readd vendored module changes 2020-06-15 14:34:58 -04:00
Daniel Oaks
6bee1f6d6a Review fixes 2020-06-15 14:34:58 -04:00
Daniel Oaks
4164c643e6 Remember when client joins channels, expose in EXTJWT 2020-06-15 14:34:58 -04:00
Daniel Oaks
9b998a7582 Allow custom JWT service expiry times 2020-06-15 14:34:58 -04:00
Daniel Oaks
0bbb5d121d Basic EXTJWT support 2020-06-15 14:34:58 -04:00
Shivaram Lingamneni
6ff6225c1e
Merge pull request #1127 from slingamn/clientid.2
fix #843
2020-06-15 11:34:20 -07:00
Shivaram Lingamneni
f923d2cb8b
Merge pull request #1131 from slingamn/issue1130_rename
fix #1130
2020-06-15 11:31:58 -07:00
Shivaram Lingamneni
a6e2b5a3ae update references to oragono.yaml to reflect new name of default.yaml 2020-06-14 18:54:36 -04:00
Shivaram Lingamneni
c0f020d87d rename oragono.yaml to default.yaml 2020-06-14 18:54:16 -04:00
Shivaram Lingamneni
df1be01f54 simplify lastSeen handling 2020-06-14 13:52:29 -04:00
Shivaram Lingamneni
218bea5a3e fix #843 2020-06-12 16:26:27 -04:00
Shivaram Lingamneni
c4c4ec027e
Merge pull request #1126 from slingamn/chghost
fix #1125
2020-06-11 09:37:35 -07:00
Shivaram Lingamneni
d33a084bb6 fix #1125 2020-06-09 18:17:48 -04:00
Shivaram Lingamneni
929e87a489
Merge pull request #1124 from slingamn/stringbuilder
use strings.Builder instead of bytes.Buffer where applicable
2020-06-09 07:39:57 -07:00
Shivaram Lingamneni
00e2c2816b use strings.Builder instead of bytes.Buffer where applicable 2020-06-08 23:38:10 -04:00
Daniel Oaks
48509ea852 Review fixes 2020-06-09 02:05:29 +10:00
Shivaram Lingamneni
425cdffe39
Merge pull request #1121 from oragono/l10n_master
New Crowdin translations
2020-06-08 08:01:42 -07:00
Daniel Oaks
8de23ab624 New translations chanserv.lang.json (Romanian) 2020-06-08 20:33:03 +10:00
Daniel Oaks
2cad923a33 New translations translation.lang.yaml (Romanian) 2020-06-08 20:33:02 +10:00
Daniel Oaks
4535c82fd3 Review fix 2020-06-08 15:25:59 +10:00
Daniel Oaks
efd3152bfb Add relayed messages to channel history 2020-06-08 15:22:41 +10:00
Daniel Oaks
4ecd7fdf43 Allow configuring relay 2020-06-08 15:17:45 +10:00
Daniel Oaks
4ee49f8450 Initial RELAYMSG implementation 2020-06-08 10:19:28 +10:00
Shivaram Lingamneni
2801018150 update readme->manual link 2020-06-07 12:24:28 -04:00
Shivaram Lingamneni
c2a7cd5ffc add missing changelog item 2020-06-07 12:04:47 -04:00
Shivaram Lingamneni
e508237fc6
Merge pull request #1117 from oragono/master+bot
Copy Insp's new BOT ISUPPORT token and WHO behaviour
2020-06-07 00:24:35 -07:00
Daniel Oaks
6426b3d6ed Copy Insp's new BOT ISUPPORT token and WHO behaviour 2020-06-07 16:11:30 +10:00
Shivaram Lingamneni
4ac4f81beb
Merge pull request #1116 from oragono/l10n_master
New Crowdin translations
2020-06-06 19:21:45 -07:00
Daniel Oaks
e78863a20b New translations irc.lang.json (Romanian) 2020-06-07 01:41:28 +10:00
Shivaram Lingamneni
65b8f9a167
Merge pull request #1113 from slingamn/issue1112
shorten recommended message length limits, fixes #1112
2020-06-05 06:43:35 -07:00
Shivaram Lingamneni
33bdd8d604
Merge pull request #1114 from slingamn/scratch100
test more string cases
2020-06-05 06:42:22 -07:00
Shivaram Lingamneni
8f778c57a3 test more string cases 2020-06-04 18:40:14 -04:00
Shivaram Lingamneni
cfec0721fe
Merge pull request #1111 from slingamn/shellauth.1
fix #1107
2020-06-04 07:46:23 -07:00
Shivaram Lingamneni
95aafbc951 shorten recommended message length limits, fixes #1112 2020-06-04 10:25:24 -04:00
Shivaram Lingamneni
11a2cec003 review fix 2020-06-04 10:11:10 -04:00
Shivaram Lingamneni
75e9476026 review fix 2020-06-04 02:07:39 -04:00
Shivaram Lingamneni
61738782c0 fix #1107 2020-06-04 01:21:56 -04:00
Shivaram Lingamneni
4044a02dce
Merge pull request #1110 from slingamn/chghost.1
fix #1108
2020-06-03 06:44:01 -07:00
Shivaram Lingamneni
e70acf4c17 fix #1108 2020-06-02 19:05:51 -04:00
Shivaram Lingamneni
a45e15b520
Merge pull request #1106 from slingamn/easteregg
fix #1078
2020-06-02 07:33:55 -07:00
Shivaram Lingamneni
0e570ba8ad fix #1078 2020-06-02 10:00:43 -04:00
Shivaram Lingamneni
e7f8e8a9cf
Merge pull request #1105 from slingamn/info
print full git hash in RPL_INFO
2020-06-01 19:46:26 -07:00
Shivaram Lingamneni
c14a9448cc print full git hash in RPL_INFO 2020-06-01 13:18:12 -04:00
Shivaram Lingamneni
f63481572e
Merge pull request #1099 from slingamn/deps
bump dependencies for 2.2.0
2020-06-01 09:54:06 -07:00
Shivaram Lingamneni
f11dfa4042
Merge pull request #1102 from slingamn/issue1027_remove_timeout.2
fix #1027
2020-06-01 09:53:46 -07:00
Shivaram Lingamneni
69b4d93079 add forgotten x/sys vendor files 2020-06-01 12:02:25 -04:00
Shivaram Lingamneni
32ee9440c8 fix #1027 2020-06-01 11:55:53 -04:00
Shivaram Lingamneni
b5afa91e3e
Merge pull request #1100 from oragono/l10n_master
New Crowdin translations
2020-06-01 06:22:57 -07:00
Daniel Oaks
64193fe10c New translations hostserv.lang.json (Romanian) 2020-06-01 17:53:57 +10:00
Daniel Oaks
5902846e6e New translations irc.lang.json (Romanian) 2020-06-01 17:53:55 +10:00
Shivaram Lingamneni
7202f56322 bump golang.org/x/sys 2020-06-01 00:45:05 -04:00
Shivaram Lingamneni
5fba0cf8ce bump go-yaml 2020-06-01 00:41:15 -04:00
Shivaram Lingamneni
3de81013c0 bump go-dkim 2020-06-01 00:40:30 -04:00
Shivaram Lingamneni
c2671b0d57 bump go-ldap 2020-06-01 00:38:04 -04:00
Shivaram Lingamneni
44aebf44b7
Merge pull request #1070 from jesopo/isupport-equals
don't add trailing = to ISUPPORT tokens when value is empty string
2020-05-31 21:30:17 -07:00
Shivaram Lingamneni
d4e24bbb26 bump to next development version 2020-06-01 00:27:16 -04:00
Shivaram Lingamneni
8430fec333
Merge pull request #1056 from jesopo/services-ctcp
handle CTCP VERSION, PING and TIME for services pseudo-users
2020-05-31 21:26:32 -07:00
Shivaram Lingamneni
34b2c3dc99 bump version to 2.1.0 2020-05-31 23:56:25 -04:00
Shivaram Lingamneni
4e4c4e4ae5
Merge pull request #1098 from slingamn/changelog
add changelog entries
2020-05-31 20:55:51 -07:00
Shivaram Lingamneni
44daefb0d1 add changelog entries 2020-05-31 19:35:50 -04:00
Shivaram Lingamneni
eedf4eb7f8
Merge pull request #1097 from oragono/l10n_master
New Crowdin translations
2020-05-31 14:48:30 -07:00
Daniel Oaks
b1d2808f67 New translations hostserv.lang.json (Bosnian) 2020-06-01 05:54:37 +10:00
Daniel Oaks
71e541630e New translations help.lang.json (German) 2020-06-01 05:54:35 +10:00
Daniel Oaks
6755408413 New translations chanserv.lang.json (German) 2020-06-01 05:54:34 +10:00
Daniel Oaks
c9c2c09ca4 New translations hostserv.lang.json (German) 2020-06-01 05:54:33 +10:00
Daniel Oaks
767f86570e New translations irc.lang.json (Greek) 2020-06-01 05:54:31 +10:00
Daniel Oaks
6e35db57b3 New translations help.lang.json (Greek) 2020-06-01 05:54:30 +10:00
Daniel Oaks
1812bd08a6 New translations chanserv.lang.json (Greek) 2020-06-01 05:54:28 +10:00
Daniel Oaks
b9e361761d New translations hostserv.lang.json (Greek) 2020-06-01 05:54:27 +10:00
Daniel Oaks
35333342b4 New translations irc.lang.json (Finnish) 2020-06-01 05:54:26 +10:00
Daniel Oaks
ddacd88ed8 New translations help.lang.json (Finnish) 2020-06-01 05:54:24 +10:00
Daniel Oaks
4f00cfff0f New translations chanserv.lang.json (Finnish) 2020-06-01 05:54:23 +10:00
Daniel Oaks
2477662ed4 New translations hostserv.lang.json (Finnish) 2020-06-01 05:54:22 +10:00
Daniel Oaks
035ebc2ac1 New translations irc.lang.json (Hebrew) 2020-06-01 05:54:20 +10:00
Daniel Oaks
444ec7ce71 New translations help.lang.json (Hebrew) 2020-06-01 05:54:19 +10:00
Daniel Oaks
01dd5096d7 New translations irc.lang.json (German) 2020-06-01 05:54:17 +10:00
Daniel Oaks
1bfe647e01 New translations chanserv.lang.json (Hebrew) 2020-06-01 05:54:16 +10:00
Daniel Oaks
38c7825498 New translations irc.lang.json (Hungarian) 2020-06-01 05:54:15 +10:00
Daniel Oaks
ce180e320d New translations help.lang.json (Hungarian) 2020-06-01 05:54:09 +10:00
Daniel Oaks
e122432006 New translations chanserv.lang.json (Hungarian) 2020-06-01 05:54:08 +10:00
Daniel Oaks
d4b71cd538 New translations hostserv.lang.json (Hungarian) 2020-06-01 05:54:06 +10:00
Daniel Oaks
ce4a087e70 New translations irc.lang.json (Italian) 2020-06-01 05:54:05 +10:00
Daniel Oaks
528df21591 New translations help.lang.json (Italian) 2020-06-01 05:54:04 +10:00
Daniel Oaks
e4f868df4a New translations chanserv.lang.json (Italian) 2020-06-01 05:54:02 +10:00
Daniel Oaks
6d198da45b New translations hostserv.lang.json (Italian) 2020-06-01 05:54:01 +10:00
Daniel Oaks
d38b414ca1 New translations irc.lang.json (Japanese) 2020-06-01 05:53:59 +10:00
Daniel Oaks
ccf5f6d488 New translations help.lang.json (Japanese) 2020-06-01 05:53:58 +10:00
Daniel Oaks
8c5efece7b New translations chanserv.lang.json (Japanese) 2020-06-01 05:53:56 +10:00
Daniel Oaks
ae89a09696 New translations hostserv.lang.json (Japanese) 2020-06-01 05:53:55 +10:00
Daniel Oaks
978e839986 New translations irc.lang.json (Korean) 2020-06-01 05:53:54 +10:00
Daniel Oaks
33b5b4489a New translations hostserv.lang.json (Hebrew) 2020-06-01 05:53:52 +10:00
Daniel Oaks
ff04621b18 New translations help.lang.json (Korean) 2020-06-01 05:53:51 +10:00
Daniel Oaks
cdd54d37f3 New translations hostserv.lang.json (Danish) 2020-06-01 05:53:49 +10:00
Daniel Oaks
65d5506164 New translations help.lang.json (Danish) 2020-06-01 05:53:48 +10:00
Daniel Oaks
6b233dc470 New translations chanserv.lang.json (Romanian) 2020-06-01 05:53:46 +10:00
Daniel Oaks
d209079ed7 New translations hostserv.lang.json (Romanian) 2020-06-01 05:53:45 +10:00
Daniel Oaks
3b7eb508a9 New translations irc.lang.json (French) 2020-06-01 05:53:43 +10:00
Daniel Oaks
6c4bdb81dd New translations help.lang.json (French) 2020-06-01 05:53:42 +10:00
Daniel Oaks
ee047dda9c New translations chanserv.lang.json (French) 2020-06-01 05:53:40 +10:00
Daniel Oaks
4ede5d3fcc New translations hostserv.lang.json (French) 2020-06-01 05:53:39 +10:00
Daniel Oaks
3782b4f6d5 New translations irc.lang.json (Spanish) 2020-06-01 05:53:37 +10:00
Daniel Oaks
df2a378adb New translations help.lang.json (Spanish) 2020-06-01 05:53:36 +10:00
Daniel Oaks
84442200fa New translations chanserv.lang.json (Spanish) 2020-06-01 05:53:34 +10:00
Daniel Oaks
71e8fc9096 New translations hostserv.lang.json (Spanish) 2020-06-01 05:53:33 +10:00
Daniel Oaks
d911aa1e21 New translations irc.lang.json (Afrikaans) 2020-06-01 05:53:31 +10:00
Daniel Oaks
c1f56333e8 New translations help.lang.json (Afrikaans) 2020-06-01 05:53:29 +10:00
Daniel Oaks
39a9e0645b New translations chanserv.lang.json (Afrikaans) 2020-06-01 05:53:28 +10:00
Daniel Oaks
e5bf1d09d1 New translations chanserv.lang.json (Danish) 2020-06-01 05:53:26 +10:00
Daniel Oaks
2ded2bf596 New translations hostserv.lang.json (Afrikaans) 2020-06-01 05:53:25 +10:00
Daniel Oaks
12b2b5322c New translations help.lang.json (Arabic) 2020-06-01 05:53:24 +10:00
Daniel Oaks
78b5ab72aa New translations chanserv.lang.json (Arabic) 2020-06-01 05:53:22 +10:00
Daniel Oaks
60bde2f0ae New translations hostserv.lang.json (Arabic) 2020-06-01 05:53:21 +10:00
Daniel Oaks
213238bb5a New translations irc.lang.json (Catalan) 2020-06-01 05:53:19 +10:00
Daniel Oaks
01119d5d55 New translations help.lang.json (Catalan) 2020-06-01 05:53:18 +10:00
Daniel Oaks
e310ef92d6 New translations chanserv.lang.json (Catalan) 2020-06-01 05:53:16 +10:00
Daniel Oaks
fcde20b285 New translations hostserv.lang.json (Catalan) 2020-06-01 05:53:15 +10:00
Daniel Oaks
8819a27a2b New translations irc.lang.json (Czech) 2020-06-01 05:53:14 +10:00
Daniel Oaks
62ebea41e0 New translations help.lang.json (Czech) 2020-06-01 05:53:12 +10:00
Daniel Oaks
d1b39b568f New translations chanserv.lang.json (Czech) 2020-06-01 05:53:11 +10:00
Daniel Oaks
3bc9a0d338 New translations hostserv.lang.json (Czech) 2020-06-01 05:53:10 +10:00
Daniel Oaks
20830bec99 New translations irc.lang.json (Danish) 2020-06-01 05:53:08 +10:00
Daniel Oaks
0a3a461328 New translations irc.lang.json (Arabic) 2020-06-01 05:53:07 +10:00
Daniel Oaks
97c61e6561 New translations help.lang.json (Romanian) 2020-06-01 05:53:05 +10:00
Daniel Oaks
e23fc3edd8 New translations chanserv.lang.json (Korean) 2020-06-01 05:53:04 +10:00
Daniel Oaks
4af0f099d1 New translations irc.lang.json (Dutch) 2020-06-01 05:53:02 +10:00
Daniel Oaks
d59acbb32b New translations irc.lang.json (Ukrainian) 2020-06-01 05:53:01 +10:00
Daniel Oaks
012af26833 New translations help.lang.json (Ukrainian) 2020-06-01 05:52:59 +10:00
Daniel Oaks
327b6a321b New translations chanserv.lang.json (Ukrainian) 2020-06-01 05:52:58 +10:00
Daniel Oaks
2daeb6add4 New translations hostserv.lang.json (Ukrainian) 2020-06-01 05:52:57 +10:00
Daniel Oaks
a40ef562f4 New translations irc.lang.json (Chinese Simplified) 2020-06-01 05:52:55 +10:00
Daniel Oaks
2f8936f0d9 New translations help.lang.json (Chinese Simplified) 2020-06-01 05:52:54 +10:00
Daniel Oaks
6e9079e7f8 New translations chanserv.lang.json (Chinese Simplified) 2020-06-01 05:52:53 +10:00
Daniel Oaks
f9e0896960 New translations hostserv.lang.json (Chinese Simplified) 2020-06-01 05:52:51 +10:00
Daniel Oaks
b67e02023f New translations irc.lang.json (Chinese Traditional) 2020-06-01 05:52:50 +10:00
Daniel Oaks
f1cda24e98 New translations help.lang.json (Chinese Traditional) 2020-06-01 05:52:48 +10:00
Daniel Oaks
fa26b34032 New translations chanserv.lang.json (Chinese Traditional) 2020-06-01 05:52:47 +10:00
Daniel Oaks
5dcbcd0cfa New translations hostserv.lang.json (Chinese Traditional) 2020-06-01 05:52:46 +10:00
Daniel Oaks
bda26f72ea New translations irc.lang.json (Vietnamese) 2020-06-01 05:52:44 +10:00
Daniel Oaks
8449c5cb46 New translations hostserv.lang.json (Turkish) 2020-06-01 05:52:43 +10:00
Daniel Oaks
9ceb27ea17 New translations help.lang.json (Vietnamese) 2020-06-01 05:52:42 +10:00
Daniel Oaks
fead2031f5 New translations hostserv.lang.json (Vietnamese) 2020-06-01 05:52:40 +10:00
Daniel Oaks
dceb1fed71 New translations irc.lang.json (Portuguese, Brazilian) 2020-06-01 05:52:39 +10:00
Daniel Oaks
daa1f978dd New translations help.lang.json (Portuguese, Brazilian) 2020-06-01 05:52:37 +10:00
Daniel Oaks
1716884068 New translations chanserv.lang.json (Portuguese, Brazilian) 2020-06-01 05:52:36 +10:00
Daniel Oaks
32908ae73a New translations hostserv.lang.json (Portuguese, Brazilian) 2020-06-01 05:52:35 +10:00
Daniel Oaks
9d490fd05b New translations irc.lang.json (English, Australia) 2020-06-01 05:52:33 +10:00
Daniel Oaks
49cb542093 New translations help.lang.json (English, Australia) 2020-06-01 05:52:32 +10:00
Daniel Oaks
cdbe1eac6b New translations chanserv.lang.json (English, Australia) 2020-06-01 05:52:30 +10:00
Daniel Oaks
d0cf8a081d New translations hostserv.lang.json (English, Australia) 2020-06-01 05:52:29 +10:00
Daniel Oaks
88b981dae9 New translations irc.lang.json (Bosnian) 2020-06-01 05:52:28 +10:00
Daniel Oaks
b472bc400b New translations help.lang.json (Bosnian) 2020-06-01 05:52:26 +10:00
Daniel Oaks
ffc2b1ca4b New translations chanserv.lang.json (Bosnian) 2020-06-01 05:52:25 +10:00
Daniel Oaks
2b5660756c New translations chanserv.lang.json (Vietnamese) 2020-06-01 05:52:23 +10:00
Daniel Oaks
c8f42ba2bb New translations hostserv.lang.json (Korean) 2020-06-01 05:52:22 +10:00
Daniel Oaks
6504bf6f36 New translations chanserv.lang.json (Turkish) 2020-06-01 05:52:21 +10:00
Daniel Oaks
8dec8f16cc New translations irc.lang.json (Turkish) 2020-06-01 05:52:19 +10:00
Daniel Oaks
01e070e03d New translations help.lang.json (Dutch) 2020-06-01 05:52:18 +10:00
Daniel Oaks
ed234d5010 New translations chanserv.lang.json (Dutch) 2020-06-01 05:52:16 +10:00
Daniel Oaks
304f9bc933 New translations hostserv.lang.json (Dutch) 2020-06-01 05:52:15 +10:00
Daniel Oaks
5c6f00b6dd New translations irc.lang.json (Norwegian) 2020-06-01 05:52:13 +10:00
Daniel Oaks
eb31ebdff6 New translations help.lang.json (Norwegian) 2020-06-01 05:52:12 +10:00
Daniel Oaks
6294b31cef New translations chanserv.lang.json (Norwegian) 2020-06-01 05:52:10 +10:00
Daniel Oaks
05ce785ee7 New translations hostserv.lang.json (Norwegian) 2020-06-01 05:52:09 +10:00
Daniel Oaks
4a6f4c6a79 New translations irc.lang.json (Polish) 2020-06-01 05:52:08 +10:00
Daniel Oaks
d7525671e6 New translations help.lang.json (Polish) 2020-06-01 05:52:06 +10:00
Daniel Oaks
3be7240de0 New translations chanserv.lang.json (Polish) 2020-06-01 05:52:05 +10:00
Daniel Oaks
b906ab33f4 New translations hostserv.lang.json (Polish) 2020-06-01 05:52:03 +10:00
Daniel Oaks
a4188a728b New translations irc.lang.json (Portuguese) 2020-06-01 05:52:02 +10:00
Daniel Oaks
6dd1155f47 New translations help.lang.json (Portuguese) 2020-06-01 05:52:00 +10:00
Daniel Oaks
7dab935ae9 New translations help.lang.json (Turkish) 2020-06-01 05:51:59 +10:00
Daniel Oaks
7bf8cbb967 New translations chanserv.lang.json (Portuguese) 2020-06-01 05:51:57 +10:00
Daniel Oaks
a232ae88bc New translations irc.lang.json (Russian) 2020-06-01 05:51:56 +10:00
Daniel Oaks
12fd1222a3 New translations help.lang.json (Russian) 2020-06-01 05:51:54 +10:00
Daniel Oaks
91a7063307 New translations chanserv.lang.json (Russian) 2020-06-01 05:51:53 +10:00
Daniel Oaks
db0af8f0b2 New translations hostserv.lang.json (Russian) 2020-06-01 05:51:51 +10:00
Daniel Oaks
365dc5233f New translations irc.lang.json (Serbian (Cyrillic)) 2020-06-01 05:51:50 +10:00
Daniel Oaks
39d4481bea New translations help.lang.json (Serbian (Cyrillic)) 2020-06-01 05:51:48 +10:00
Daniel Oaks
b0dffd4e33 New translations chanserv.lang.json (Serbian (Cyrillic)) 2020-06-01 05:51:47 +10:00
Daniel Oaks
1f3d5342b4 New translations hostserv.lang.json (Serbian (Cyrillic)) 2020-06-01 05:51:46 +10:00
Daniel Oaks
6b71cb4624 New translations irc.lang.json (Swedish) 2020-06-01 05:51:44 +10:00
Daniel Oaks
0823612b86 New translations help.lang.json (Swedish) 2020-06-01 05:51:43 +10:00
Daniel Oaks
0a6c33cf1f New translations chanserv.lang.json (Swedish) 2020-06-01 05:51:42 +10:00
Daniel Oaks
e2643d47d8 New translations hostserv.lang.json (Swedish) 2020-06-01 05:51:40 +10:00
Daniel Oaks
6eeb387846 New translations hostserv.lang.json (Portuguese) 2020-06-01 05:51:39 +10:00
Daniel Oaks
c6e74484aa New translations irc.lang.json (Romanian) 2020-06-01 05:51:37 +10:00
Shivaram Lingamneni
404eb68b28
Merge pull request #1096 from slingamn/strings
fix a string, run updatetranslations.py
2020-05-31 12:42:05 -07:00
Shivaram Lingamneni
0f8c672227 update strings 2020-05-31 14:04:13 -04:00
Shivaram Lingamneni
d7c8b96345 make a message less confusing 2020-05-31 14:01:46 -04:00
Shivaram Lingamneni
8c1bae3ea1
Merge pull request #1048 from slingamn/documentation_fixes
documentation fixes
2020-05-31 01:00:38 -07:00
Shivaram Lingamneni
805da6780d
Merge pull request #1094 from slingamn/targmax
fix #1090
2020-05-30 20:59:44 -07:00
Shivaram Lingamneni
404e3c2ed8
Merge pull request #1084 from slingamn/monoffline
fix #1076
2020-05-30 20:59:31 -07:00
Shivaram Lingamneni
aafc89feaa Merge remote-tracking branch 'origin/master' into monoffline 2020-05-30 23:25:25 -04:00
Shivaram Lingamneni
6caa8c1df8
Merge pull request #1082 from slingamn/rplmyinfo.1
fix #1058
2020-05-30 20:17:37 -07:00
Shivaram Lingamneni
9775b7d318
Merge pull request #1081 from slingamn/restricted_nicknames
fix #1080
2020-05-30 20:16:39 -07:00
Shivaram Lingamneni
2d5faaafaa
Merge pull request #1079 from ajaspers/counts
Apply default user modes just before registration.
2020-05-30 20:15:46 -07:00
Shivaram Lingamneni
3025b5f46d fix #1090 2020-05-30 22:40:21 -04:00
Shivaram Lingamneni
d9ce54b390
Merge pull request #1087 from ajaspers/utils
Fix issue with one-character args in ArgsToStrings.
2020-05-30 19:17:51 -07:00
Shivaram Lingamneni
a58e319ffc
Merge pull request #1085 from oragono/l10n_master
New Crowdin translations
2020-05-30 18:48:13 -07:00
Alex Jaspersen
2cb91bab04 Fix issue with one-character args in ArgsToStrings. 2020-05-30 15:45:43 +00:00
Daniel Oaks
3491d43a27 New translations irc.lang.json (Romanian) 2020-05-29 19:14:20 +10:00
Shivaram Lingamneni
2def06b98f fix #1076 2020-05-28 18:34:43 -04:00
Shivaram Lingamneni
beea32adfe fix #1058 2020-05-28 14:42:24 -04:00
Shivaram Lingamneni
1477dab604 fix #1080 2020-05-28 13:16:17 -04:00
Alex Jaspersen
0241e0c31d Apply default user modes just before registration.
Previously, we were applying defaults before the user had completed
registration. This meant that the number of invisible users was
incremented when the user connected, and then the total was incremented
when registration was completed.

Now both counters are updated at the same time. If a user disconnects
prior to registration, +i has not yet been applied so it would not be
decremented.
2020-05-28 15:53:14 +00:00
Shivaram Lingamneni
9177e785c5 add a config sanity check 2020-05-28 01:18:19 -04:00
Shivaram Lingamneni
d48ca682bd make manual language more consistent 2020-05-28 01:11:28 -04:00
Shivaram Lingamneni
2389a21de3 add snomask documentation 2020-05-27 09:57:27 -04:00
jesopo
5fbf9c650e isupport List.Tokens map[string]*string -> map[string]string 2020-05-27 00:16:33 +01:00
jesopo
8eee127e4d don't add trailing = to ISUPPORT tokens when value is empty string 2020-05-26 23:51:28 +01:00
Shivaram Lingamneni
c7199798c8 add email verification docs 2020-05-26 17:29:08 -04:00
Shivaram Lingamneni
0461eb48f4 add more bug credits 2020-05-26 16:27:55 -04:00
Shivaram Lingamneni
c1d4c5596d
Merge pull request #1063 from slingamn/history_registeredonly
fix #1061
2020-05-26 13:22:12 -07:00
Shivaram Lingamneni
98151ec7a5
Merge pull request #1062 from slingamn/issue1057_ident
fix #1057
2020-05-26 13:21:58 -07:00
Shivaram Lingamneni
82fbfd0c00 fix #1061 2020-05-26 12:57:24 -04:00
Shivaram Lingamneni
6aa9a56242 fix #1057 2020-05-26 10:56:24 -04:00
jesopo
e7584233ae handle CTCP VERSION, PING and TIME for services pseudo-users 2020-05-26 13:42:28 +01:00
Shivaram Lingamneni
e5ee5c4343 add translators 2020-05-25 18:16:03 -04:00
Shivaram Lingamneni
a10474ae42 changelog entry for #1051 2020-05-25 11:12:14 -04:00
Shivaram Lingamneni
29165ded62
Merge pull request #1051 from ajaspers/services
Ignore non-privmsg commands to services.
2020-05-25 08:07:00 -07:00
Alex Jaspersen
b7c9fb56c2 Ignore non-privmsg commands to services.
This avoids "No such nick" responses to +draft/typing TAGMSG, etc.
2020-05-25 14:47:09 +00:00
Shivaram Lingamneni
4ca163590c fix discussion of nick reservation modes 2020-05-25 09:08:26 -04:00
Shivaram Lingamneni
1f501eab9a update manual references to TLS certificate filenames 2020-05-25 08:21:33 -04:00
Shivaram Lingamneni
9a555f6f30 bump to 2.1.0-rc1 2020-05-24 20:40:59 -04:00
Shivaram Lingamneni
e0986c8608
Merge pull request #1046 from slingamn/changelog.4
add changelog for v2.1.0-rc1
2020-05-24 17:40:18 -07:00
Shivaram Lingamneni
14493ed47b add missing top-level credit 2020-05-24 20:30:06 -04:00
Shivaram Lingamneni
851125130d more manual updates 2020-05-24 20:19:19 -04:00
Shivaram Lingamneni
5c4425ec54 switch to nothing-up-my-sleeve example password hashes 2020-05-24 20:19:10 -04:00
Shivaram Lingamneni
de99fdb0ed fix systemd unit 2020-05-24 17:45:09 -04:00
Shivaram Lingamneni
0f19883d9c operator guide 2020-05-24 13:23:06 -04:00
Shivaram Lingamneni
4387e10376 manual updates 2020-05-24 13:08:32 -04:00
Shivaram Lingamneni
266b725cf1 add changelog for v2.1.0-rc1 2020-05-24 11:37:56 -04:00
Shivaram Lingamneni
10a7d3ff72
Merge pull request #1045 from slingamn/fullchain
change the default self-signed certificate filenames
2020-05-24 05:35:44 -07:00
Shivaram Lingamneni
15c5bec557 add pemfiles to gitignore 2020-05-24 06:47:19 -04:00
Shivaram Lingamneni
b09258b698 change the default self-signed certificate filenames 2020-05-24 00:19:58 -04:00
Shivaram Lingamneni
b80f92b2aa
Merge pull request #1044 from slingamn/tagmsg_fix
fix TAGMSG playback
2020-05-22 14:41:01 -07:00
Shivaram Lingamneni
2f20034bb7 fix TAGMSG playback
1. TAGMSG were incorrectly being considered multilines, because
   Is512() was checking the wrong thing
2. Playback of TAGMSG should depend on event-playback, not on message-tags
2020-05-22 12:07:53 -04:00
Shivaram Lingamneni
ba65297677
Merge pull request #1043 from ajaspers/info
/ns erase should confirm with /ns erase rather than unregister.
2020-05-22 07:56:21 -07:00
Alex Jaspersen
e0f91f5649 /ns erase should confirm with /ns erase rather than unregister. 2020-05-22 14:44:35 +00:00
Shivaram Lingamneni
4595ed68a9
Merge pull request #1040 from slingamn/build_again.2
tweak version strings again
2020-05-21 10:49:53 -07:00
Shivaram Lingamneni
aab9d19696
Merge pull request #1039 from slingamn/account_notify_again
clean up account-notify logout notification
2020-05-21 10:49:48 -07:00
Shivaram Lingamneni
464d0be949 tweak version strings again 2020-05-21 11:42:17 -04:00
Shivaram Lingamneni
c45e76460a clean up account-notify logout notification
don't need to send account-notify * (logout notification)
because either we never sent the initial account-notify
(if we are being logged out as part of fixupNickEqualsAccount)
or else we are immediately going to kill the client
(if we are being logged out as part of unregister/erase)
2020-05-21 11:14:12 -04:00
Shivaram Lingamneni
9d8b71b920
Merge pull request #1038 from slingamn/conventional
include conventional.yaml in releases
2020-05-20 08:47:22 -07:00
Shivaram Lingamneni
3f9765a65c include conventional.yaml in releases 2020-05-20 11:45:41 -04:00
Shivaram Lingamneni
5f4479e10b
Merge pull request #1037 from slingamn/githash.2
fix #1031
2020-05-20 08:00:59 -07:00
Shivaram Lingamneni
4291c5f4e3 fix #1031 2020-05-20 10:33:49 -04:00
Shivaram Lingamneni
06b2cb2efc
Merge pull request #1036 from slingamn/account_persistence.3
last round of feature changes
2020-05-20 04:58:57 -07:00
Shivaram Lingamneni
ca7da62138 recommend that auto-away be opt-in 2020-05-20 07:56:22 -04:00
Shivaram Lingamneni
5345fc35dd
Merge pull request #1032 from slingamn/history_enable
fix #1030
2020-05-20 04:33:35 -07:00
Shivaram Lingamneni
ef0aa20cff fix #1035 2020-05-19 22:46:23 -04:00
Shivaram Lingamneni
4d50607c79 add persistence for user modes 2020-05-19 22:46:23 -04:00
Shivaram Lingamneni
a0f4e90b7e add auto-away 2020-05-19 22:46:23 -04:00
Shivaram Lingamneni
b94e7ea985
Merge pull request #1034 from slingamn/rename
correct old proxiedConn name
2020-05-19 06:40:24 -07:00
Shivaram Lingamneni
d7cdaf1a90 correct old proxiedConn name 2020-05-19 09:37:06 -04:00
Shivaram Lingamneni
b2483f5cf2 fix #1030 2020-05-19 08:01:10 -04:00
Shivaram Lingamneni
2ab4b545da
Merge pull request #1029 from slingamn/rehash_logline.1
make it clearer when rehash has completed
2020-05-18 09:35:31 -07:00
Shivaram Lingamneni
a95c44696f review fix 2020-05-18 12:33:26 -04:00
Shivaram Lingamneni
b494c1ec35 make it clearer when rehash has completed 2020-05-18 11:37:56 -04:00
Shivaram Lingamneni
c7aa337ed7
Merge pull request #1028 from slingamn/cleanups
two cleanups
2020-05-18 04:58:05 -07:00
Shivaram Lingamneni
bced409e78 unconditionally destroy the client on unregister
This avoids conditions where two sessions can be attached to the same client
while not logged into an account.
2020-05-18 05:39:02 -04:00
Shivaram Lingamneni
df2dfb7270 HistServ is a real service now, remove special casing 2020-05-18 05:11:44 -04:00
Shivaram Lingamneni
8bebba97c3
Merge pull request #1018 from slingamn/account_notify
include account-notify in the response batch
2020-05-18 01:00:27 -07:00
Shivaram Lingamneni
922d5c58e2
Merge pull request #1025 from slingamn/plan9
fix plan9 support
2020-05-18 00:59:02 -07:00
Shivaram Lingamneni
6028953ed4
Merge pull request #1024 from slingamn/issue1020_password.3
fix #1020
2020-05-18 00:58:51 -07:00
Shivaram Lingamneni
aa79706165
Merge pull request #1023 from slingamn/issue1021_modeparam
fix #1021
2020-05-18 00:58:35 -07:00
Shivaram Lingamneni
b9a2cbb08f
Merge pull request #1022 from slingamn/issue1019_snomask
fix #1019
2020-05-18 00:57:25 -07:00
Shivaram Lingamneni
4d21d78f49 explanatory comments 2020-05-18 03:35:58 -04:00
Shivaram Lingamneni
ccfc059755 fix plan9 support 2020-05-17 20:53:08 -04:00
Shivaram Lingamneni
67150bc8f7 fix #1020 2020-05-17 18:12:24 -04:00
Shivaram Lingamneni
2f9234318c fix #1021 2020-05-17 14:07:38 -04:00
Shivaram Lingamneni
a397756882 fix #1019 2020-05-17 13:39:37 -04:00
Shivaram Lingamneni
855eb786af include account-notify in the response batch 2020-05-17 11:52:32 -04:00
Shivaram Lingamneni
1ab06949bf
Merge pull request #1016 from ajaspers/mysql
Add support for Unix domain sockets.
2020-05-16 22:19:43 -07:00
Alex Jaspersen
fc1d6ee724 Uncomment MySQL port in default configs.
This ensures that host:port is used rather than an empty address,
which defaults to 127.0.0.1:3306 (ignoring the host in the config).
2020-05-17 05:13:10 +00:00
Alex Jaspersen
3468a8cb8a Add support for Unix domain sockets.
This adds a new configuration option, socket-path, instead of using
host.
2020-05-17 05:04:03 +00:00
Shivaram Lingamneni
c0b74f298a
Merge pull request #1015 from oragono/revert-1013-mysql
Revert "Add support for Unix domain sockets"
2020-05-16 21:33:40 -07:00
Shivaram Lingamneni
66561771e6
Revert "Add support for Unix domain sockets" 2020-05-17 00:30:02 -04:00
Shivaram Lingamneni
de39384875
Merge pull request #1014 from slingamn/issue1011_webirc
#1011: recommend allowing webirc from localhost
2020-05-16 20:50:07 -07:00
Shivaram Lingamneni
9402c0acf7 #1011: recommend allowing webirc from localhost 2020-05-16 23:13:24 -04:00
Shivaram Lingamneni
045dd89c41
Merge pull request #1013 from ajaspers/mysql
Add support for Unix domain sockets
2020-05-16 19:58:34 -07:00
Alex Jaspersen
475ec9fb24 Add support for Unix domain sockets. 2020-05-16 20:12:20 +00:00
Shivaram Lingamneni
8e30cbb36b
Merge pull request #1010 from slingamn/eieio
make histserv replies come from histserv, not hostserv
2020-05-15 08:58:19 -07:00
Shivaram Lingamneni
9517adae9d make histserv replies come from histserv, not hostserv 2020-05-15 11:54:28 -04:00
Shivaram Lingamneni
ade87463c2
Merge pull request #1009 from slingamn/issue1005_multiline_blanks
fix #1005
2020-05-15 05:07:29 -07:00
Shivaram Lingamneni
8efbc4bc32 maintain lenBytes as a running count 2020-05-14 22:16:34 -04:00
Shivaram Lingamneni
2779fe7c10 fix #1005 2020-05-14 12:58:49 -04:00
Shivaram Lingamneni
a46c0eed9f
Merge pull request #1004 from slingamn/vanish.4
fix #858 and #383
2020-05-14 06:54:24 -07:00
Shivaram Lingamneni
7af5ffd3c2
Merge pull request #1006 from slingamn/issue1003.1
fix #1003
2020-05-14 01:26:10 -07:00
Shivaram Lingamneni
178cc0a939 review fix 2020-05-13 19:41:31 -04:00
Shivaram Lingamneni
b3d7c9af62 neutral language 2020-05-13 12:12:31 -04:00
Shivaram Lingamneni
de3e2e3950 review fixes 2020-05-13 11:56:17 -04:00
Shivaram Lingamneni
d092f6b330 explanatory comment for CompileMasks 2020-05-13 10:07:54 -04:00
Shivaram Lingamneni
be0dedf260 fix #1003 2020-05-13 06:51:15 -04:00
Shivaram Lingamneni
67f35e5c8a fix #858 and #383 2020-05-12 12:05:40 -04:00
Shivaram Lingamneni
21958768d8
Merge pull request #1002 from oragono/ident
upgrade go-ident to fix parsing issue
2020-05-11 15:31:44 -07:00
Shivaram Lingamneni
d94a0aea9a upgrade go-ident to fix parsing issue 2020-05-11 18:25:25 -04:00
Shivaram Lingamneni
b951546b77
Merge pull request #1001 from slingamn/ratify_setname
ratify SETNAME
2020-05-11 15:13:43 -07:00
Shivaram Lingamneni
2257f33efa ratify SETNAME 2020-05-11 18:11:09 -04:00
Shivaram Lingamneni
0f03b323d7
Merge pull request #997 from slingamn/issue996_proto.1
fix #996
2020-05-10 23:05:55 -07:00
Shivaram Lingamneni
548a2f814a Merge remote-tracking branch 'origin/master' into issue996_proto.1 2020-05-11 02:04:20 -04:00
Shivaram Lingamneni
51c65f999d
Merge pull request #998 from slingamn/operator_topic
treat channel founder as such even if they don't have +q
2020-05-10 22:51:07 -07:00
Shivaram Lingamneni
678960d29e
Merge pull request #999 from ajaspers/invisible_count
Call ApplyUserModeChanges for default user modes.
2020-05-10 22:51:00 -07:00
Alex Jaspersen
d5cec62df3 Call ApplyUserModeChanges for default user modes.
This ensures that counts like the number of invisible users are updated
correctly.
2020-05-11 05:41:40 +00:00
Shivaram Lingamneni
c738a754a2 treat channel founder as such even if they don't have +q
This affects /TOPIC, /INVITE, and a few others.
2020-05-10 23:17:09 -04:00
Shivaram Lingamneni
89984f9c36 fix untrusted PROXY lines being accepted
As of 3dc5c8de787309, the PROXY-before-TLS proxy line
and any proxy information carried in X-Forwarded-For
do not count as the "first line", so an additional
client-supplied PROXY line would have been accepted.
2020-05-10 19:12:18 -04:00
Shivaram Lingamneni
d562c6d25a more informative IP connection logline 2020-05-10 19:04:54 -04:00
Shivaram Lingamneni
0f7d58b1c5 fix #996 2020-05-10 06:17:11 -04:00
Shivaram Lingamneni
93f1e5b5b8
Merge pull request #995 from slingamn/issue994_unknowncommand.1
fix #994
2020-05-08 13:12:16 -07:00
Shivaram Lingamneni
f2e6142136
Merge pull request #993 from slingamn/issue952_cloak_db.1
fix #952
2020-05-08 13:11:48 -07:00
Shivaram Lingamneni
6f688a4644 fix #994 2020-05-08 05:50:10 -04:00
Shivaram Lingamneni
36dab4e57d review fix 2020-05-08 02:47:08 -04:00
Shivaram Lingamneni
215d36cff1 enable cloaking by default 2020-05-08 01:26:50 -04:00
Shivaram Lingamneni
8c74b0660b fix #952 2020-05-08 01:18:00 -04:00
Shivaram Lingamneni
d187cc5512
Merge pull request #991 from ajaspers/who_invisible
Hide +i users from WHO * queries.
2020-05-07 19:09:38 -07:00
Alex Jaspersen
a6e4a26cbb Performance optimization for determining friends in WHO <mask>.
Construct a hash set of the user's channels and check that rather than
querying channel membership, to reduce the number of locks that need to be
acquired.
2020-05-08 01:55:47 +00:00
Shivaram Lingamneni
d1c183777a
Merge pull request #992 from slingamn/simplify
simplify listener rehash logic
2020-05-07 11:11:58 -07:00
Shivaram Lingamneni
17909a5db0 simplify listener rehash logic 2020-05-07 06:42:50 -04:00
Shivaram Lingamneni
c426cc8bab
Merge pull request #989 from slingamn/proxy_allowed_localhost
new recommended default: proxy allowed from localhost
2020-05-06 20:22:28 -07:00
Alex Jaspersen
b3cfcc1289 Show users in WHO queries if they are friends, i.e. they share a channel. 2020-05-07 03:00:28 +00:00
Shivaram Lingamneni
98b91e7bdd review fix 2020-05-06 22:52:01 -04:00
Shivaram Lingamneni
079719c57c
Merge pull request #988 from slingamn/recommended_port
use 8097 as the example websocket port
2020-05-06 19:28:41 -07:00
Alex Jaspersen
1ef41d6020 Hide +i users from WHO * queries.
Fixes #990.
2020-05-07 00:16:22 +00:00
Shivaram Lingamneni
3f54390d97 provide a link to the testnet 2020-05-06 17:10:23 -04:00
Shivaram Lingamneni
07fe28af95 new recommended default: proxy allowed from localhost 2020-05-06 17:00:03 -04:00
Shivaram Lingamneni
ddf52f85b7 use 8097 as the example websocket port 2020-05-06 14:01:36 -04:00
Shivaram Lingamneni
147e652e99
Merge pull request #987 from slingamn/issue982_certerror
fix #982
2020-05-06 03:22:47 -07:00
Shivaram Lingamneni
14bcd46588 fix #982 2020-05-06 05:56:00 -04:00
Shivaram Lingamneni
b0f692e1ca
Merge pull request #984 from slingamn/issue983_bancomp
fix #983
2020-05-05 22:27:00 -07:00
Shivaram Lingamneni
2c231853b5
Merge pull request #986 from slingamn/issue985_mailto
fix #985
2020-05-05 22:26:46 -07:00
Shivaram Lingamneni
ab8f542c11 fix #985 2020-05-06 01:15:04 -04:00
Shivaram Lingamneni
984794eb1e fix #983 2020-05-06 01:07:06 -04:00
Shivaram Lingamneni
d37af694af
Merge pull request #979 from slingamn/websockets_draft.7
websockets implementation
2020-05-05 17:54:52 -07:00
Shivaram Lingamneni
c92192ef48 review fixes; add submatch support to glob 2020-05-05 17:20:55 -04:00
Shivaram Lingamneni
872fd3e77c
Merge pull request #975 from slingamn/shorten_batch_id
use shorter batch IDs
2020-05-05 03:27:43 -07:00
Shivaram Lingamneni
5ae6f6b927 fix incorrect propagation of listener errors 2020-05-05 06:25:28 -04:00
Shivaram Lingamneni
4ef6c58317 work around a chrome bug 2020-05-05 04:13:55 -04:00
Shivaram Lingamneni
620e30293d use consistent spelling of WebSocket 2020-05-05 04:07:19 -04:00
Shivaram Lingamneni
3d3aec6979 fix missing err check, thanks @eklitzke 2020-05-04 23:42:34 -04:00
Shivaram Lingamneni
3dc5c8de78 more work on websocket support 2020-05-04 23:26:51 -04:00
Shivaram Lingamneni
2ef87598c4
Merge pull request #977 from ajaspers/list-regd-users+chans
Add ChanServ and NickServ LIST commands.
2020-05-03 19:30:06 -07:00
Alex Jaspersen
b363a01a6f Read accounts and grouped nicks in same transaction. 2020-05-04 02:20:28 +00:00
Alex Jaspersen
73bea0168d Read account names and additional nicknames from the db to avoid casefolding issues. 2020-05-04 02:14:55 +00:00
Alex Jaspersen
6019ed1e29 Add ChanServ and NickServ LIST commands.
These commands search the registered nicknames/channels for ones
matching the provided regex, or return the entire list.

Only operators with chanreg (for ChanServ) or accreg (for NickServ)
capabilities can use LIST.
2020-05-04 00:51:39 +00:00
Shivaram Lingamneni
3a571f28ac use shorter batch IDs 2020-05-03 03:27:13 -04:00
Shivaram Lingamneni
25813f6d3a Merge remote-tracking branch 'origin/master' into websockets_draft.2 2020-04-30 22:16:07 -04:00
Hubert Hirtz
b71e23d814 WebSockets: add configuration doc 2020-04-30 23:21:19 +02:00
Hubert Hirtz
f5930444f7 WebSocket support 2020-04-30 23:17:33 +02:00
Shivaram Lingamneni
11e1939c9b
Merge pull request #970 from slingamn/default_invisible
make +i the recommended default usermode
2020-04-29 22:57:43 -07:00
Shivaram Lingamneni
4548eee6f1 make +i the recommended default usermode 2020-04-30 01:47:58 -04:00
Shivaram Lingamneni
8898d34948
Merge pull request #969 from ajaspers/master
Add support for default user modes. #942
2020-04-29 22:45:27 -07:00
Alex Jaspersen
b3a7e5c996 Set default user modes when always-on clients reconnect.
Add default-user-modes configuration to conventional.yaml.
Fix comment on DefaultUserModes.
2020-04-30 04:38:19 +00:00
Alex Jaspersen
52910a185c Add test for ParseDefaultUserModes. 2020-04-30 03:54:18 +00:00
Alex Jaspersen
df9bf15f00 Add support for setting user modes by default. 2020-04-30 03:54:09 +00:00
Shivaram Lingamneni
a06b4d5e88
Merge pull request #965 from slingamn/delayedlist.1
fix #964
2020-04-26 22:05:46 -07:00
Shivaram Lingamneni
3626958f1e also exempt operators from LIST restrictions 2020-04-27 00:58:48 -04:00
Shivaram Lingamneni
c4d32e8af3 make readme links https 2020-04-26 07:11:52 -04:00
Shivaram Lingamneni
f84a8207e7
Merge pull request #966 from oragono/l10n_master
New Crowdin translations
2020-04-26 04:06:57 -07:00
Daniel Oaks
47f23b9571 New translations irc.lang.json (Romanian) 2020-04-26 20:41:51 +10:00
Shivaram Lingamneni
feb6a63e57
Merge pull request #963 from slingamn/issue962_erasebug
fix #962
2020-04-26 03:40:13 -07:00
Shivaram Lingamneni
5cdb81e1ea use Nick() 2020-04-26 03:08:44 -04:00
Shivaram Lingamneni
3e2138db4f clarify that list-delay only applies to anonymous users 2020-04-26 03:00:40 -04:00
Shivaram Lingamneni
57e2187742 fix #964 2020-04-26 02:52:09 -04:00
Daniel Oaks
1c946e1904
Fix incorrect /NS example (thanks KindOne!) 2020-04-25 16:04:57 +10:00
Shivaram Lingamneni
a7f020320e make erase confirmation code nondeterministic 2020-04-24 15:41:58 -04:00
Shivaram Lingamneni
f87b71b93f fix #962 2020-04-24 15:39:39 -04:00
Shivaram Lingamneni
cae739fd2e
Merge pull request #960 from slingamn/issue959
fix #959
2020-04-24 00:49:31 -07:00
Shivaram Lingamneni
4722f8a96c fix #959 2020-04-24 01:33:21 -04:00
Shivaram Lingamneni
9a6e3025c2
Merge pull request #958 from slingamn/issue950.2
four small fixes
2020-04-23 12:43:13 -07:00
Shivaram Lingamneni
b065a9aefe clarify manual correction 2020-04-23 12:49:45 -04:00
Shivaram Lingamneni
12455e4bde
Merge pull request #957 from slingamn/quickstart
fix #954
2020-04-23 09:46:00 -07:00
Shivaram Lingamneni
f667c035a9 mention pkill and killall 2020-04-23 12:45:42 -04:00
Shivaram Lingamneni
f2fec0dc59 remove caveat 2020-04-23 02:46:27 -04:00
Shivaram Lingamneni
6e0309fa28 add a missing detail 2020-04-23 02:33:31 -04:00
Shivaram Lingamneni
98ac900ac3 fixes 2020-04-23 02:30:31 -04:00
Shivaram Lingamneni
40d3c59139 fix #955 2020-04-23 02:02:07 -04:00
Shivaram Lingamneni
eebe681538 fix #532 2020-04-23 01:29:08 -04:00
Shivaram Lingamneni
bd088ea197 fix #951 2020-04-22 22:19:59 -04:00
Shivaram Lingamneni
360a5af90d fix #950 2020-04-22 21:52:24 -04:00
Shivaram Lingamneni
52d6fa70a8 fix #954 2020-04-22 21:45:06 -04:00
Daniel Oaks
a83dc6e10d
Merge pull request #949 from hhirtz/umodeis
use servername instead of nickmask for RPL_UMODEIS prefix
2020-04-16 17:47:31 +10:00
Hubert Hirtz
f2e3287f8d use servername instead of nickmask for RPL_UMODEIS prefix 2020-04-16 09:31:54 +02:00
Shivaram Lingamneni
139eefc811 mention testnet ports explicitly 2020-04-14 03:22:58 -04:00
Shivaram Lingamneni
b9e103bb28
Merge pull request #946 from slingamn/memoryhole
remove darwin.network from the readme
2020-04-14 00:20:23 -07:00
Shivaram Lingamneni
055b3d3e7f remove darwin.network from the readme 2020-04-13 21:32:43 -04:00
Shivaram Lingamneni
f07a456688
Merge pull request #944 from slingamn/issue827_rename
fix #827
2020-04-13 10:13:47 -07:00
Shivaram Lingamneni
b77715eafd
Merge pull request #945 from slingamn/issue943_smtpdate
fix #943
2020-04-13 10:13:27 -07:00
Shivaram Lingamneni
9a6cb84b58 fix #943 2020-04-13 11:54:39 -04:00
Shivaram Lingamneni
04549e7919 fix #827 2020-04-12 22:41:23 -04:00
Shivaram Lingamneni
ae173fa43d
Merge pull request #940 from slingamn/color.2
remove log colorization support, make some tweaks
2020-04-12 19:37:59 -07:00
Shivaram Lingamneni
b77f234346
Merge pull request #941 from kula/devel.fix-documentation-to-match-acc-removal
Devel.fix documentation to match acc removal
2020-04-12 12:04:41 -07:00
Thomas L. Kula
05466030c7 Remove leftover line from previous change. 2020-04-12 15:00:39 -04:00
Thomas L. Kula
503fcc20b5 Update MANUAL.md to reflect removal of ACC command
Commit f920d3b "fix #530, #721" removed the ACC command, update
the manual to reflect this.
2020-04-12 14:57:10 -04:00
Shivaram Lingamneni
f4f7a8afaa shorten type names to 10 chars 2020-04-12 14:01:07 -04:00
Shivaram Lingamneni
11d1d96d71 align up to 10 2020-04-12 13:45:24 -04:00
Shivaram Lingamneni
dbbcd800c9 align log messages with space padding 2020-04-12 13:33:36 -04:00
Shivaram Lingamneni
6e4b0b3125 remove log type sanitization 2020-04-12 13:33:36 -04:00
Shivaram Lingamneni
867b233585 remove color-related dependencies 2020-04-12 13:33:36 -04:00
Shivaram Lingamneni
ded03ee618 fix timestamp formatting 2020-04-12 13:30:43 -04:00
Shivaram Lingamneni
6a900ca0cb strip out log coloring 2020-04-12 12:54:02 -04:00
Shivaram Lingamneni
33fd75ae54
Merge pull request #937 from slingamn/issue936_reggednick
fix #936
2020-04-12 01:30:51 -07:00
Shivaram Lingamneni
80424a6f00 fix #936 2020-04-07 12:24:44 -04:00
Shivaram Lingamneni
c291a5a340
Merge pull request #934 from slingamn/issue933_extjoin
fix #933
2020-04-06 11:33:30 -07:00
Shivaram Lingamneni
3f717436f8 fix #933 2020-04-06 13:10:38 -04:00
Shivaram Lingamneni
377a40c4e9
Merge pull request #932 from oragono/l10n_master
New Crowdin translations
2020-04-06 08:03:18 -07:00
Daniel Oaks
726eb3398c New translations help.lang.json (French) 2020-04-07 00:56:28 +10:00
Daniel Oaks
e6f0f7ab17 New translations hostserv.lang.json (French) 2020-04-07 00:56:27 +10:00
Shivaram Lingamneni
ecb4aa03aa
Merge pull request #931 from slingamn/issue930
fix #930
2020-04-06 07:52:04 -07:00
Shivaram Lingamneni
ae2a92ca9a
Merge pull request #929 from slingamn/verify_rename.1
enforce nick protection immediately after verification
2020-04-06 07:51:53 -07:00
Shivaram Lingamneni
9f48fcedab
Merge pull request #928 from slingamn/dkim.4
add DKIM and email blacklist support
2020-04-06 07:50:53 -07:00
Shivaram Lingamneni
8fb5eee171 fix #930 2020-04-06 10:47:55 -04:00
Shivaram Lingamneni
d6e3f188cf enforce nick protection immediately after verification 2020-04-06 02:38:29 -04:00
Shivaram Lingamneni
ee05a4324d fix #920, #921 2020-04-05 03:48:59 -04:00
Shivaram Lingamneni
6e630a0b5c add the smtp code from the go 1.14.1 release 2020-04-03 11:32:13 -04:00
Shivaram Lingamneni
7929d82e09
Merge pull request #927 from oragono/l10n_master
New Crowdin translations
2020-04-02 17:15:37 -07:00
Daniel Oaks
0399cd312f New translations chanserv.lang.json (French) 2020-04-03 06:23:57 +10:00
Daniel Oaks
bb691d98b8 New translations irc.lang.json (French) 2020-04-03 06:23:45 +10:00
Daniel Oaks
d760799703 New translations translation.lang.yaml (French) 2020-04-03 06:22:12 +10:00
Shivaram Lingamneni
27c6d2beac
Merge pull request #925 from oragono/l10n_master
New Crowdin translations
2020-04-02 11:15:00 -07:00
Daniel Oaks
952d8f56fd New translations irc.lang.json (French) 2020-04-02 16:29:10 +10:00
Shivaram Lingamneni
b9a656d3e4 update travis badge 2020-03-31 21:44:08 -04:00
Shivaram Lingamneni
6374a31753
Merge pull request #919 from slingamn/issue918_standard_config
fix #918
2020-03-31 18:23:47 -07:00
Shivaram Lingamneni
88b1104528
Merge pull request #923 from slingamn/issue922
fix #922
2020-03-31 18:23:36 -07:00
Shivaram Lingamneni
27c734b71e make always-on opt-in by default 2020-03-31 14:30:05 -04:00
Shivaram Lingamneni
46f68d4cf2 fix #922 2020-03-31 14:28:26 -04:00
Shivaram Lingamneni
5df1b8b2bc rename default operator to admin 2020-03-31 13:57:38 -04:00
Shivaram Lingamneni
9e918efedc guidelines for config customization 2020-03-31 13:57:38 -04:00
Shivaram Lingamneni
1653d4cf08 update manual 2020-03-30 17:57:54 -04:00
Shivaram Lingamneni
97d0ffd098 recommend against custom enforcement 2020-03-30 17:31:47 -04:00
Shivaram Lingamneni
fb4b407772 add conventional.yaml 2020-03-30 17:22:23 -04:00
Shivaram Lingamneni
bf562d8a5e recommend force-nick-equals-account: true 2020-03-30 17:11:59 -04:00
Shivaram Lingamneni
62f81a4988 describe oragono.yaml 2020-03-30 17:11:42 -04:00
Shivaram Lingamneni
9c8e8d6435
Merge pull request #917 from slingamn/issue901_trimpath
fix #901
2020-03-29 19:23:08 -07:00
Shivaram Lingamneni
58df5b4e8c fix #901 2020-03-29 21:02:52 -04:00
Shivaram Lingamneni
bbd8807d65
Merge pull request #915 from slingamn/issue817_fakelag.1
fix #817
2020-03-29 18:00:34 -07:00
Shivaram Lingamneni
7bdf4441cf
Merge pull request #916 from slingamn/issue913_accountthrottle.1
fix #913
2020-03-29 18:00:23 -07:00
Shivaram Lingamneni
895a0e6d68 fix #913 2020-03-27 17:52:37 -04:00
Shivaram Lingamneni
73d795e6b4 fix #817 2020-03-27 10:40:19 -04:00
Shivaram Lingamneni
057143f8b2
Merge pull request #914 from slingamn/issue908_forreal
fix #908
2020-03-26 13:29:28 -07:00
Shivaram Lingamneni
8acd58e263 fix #908 2020-03-26 16:25:37 -04:00
Shivaram Lingamneni
0cce086367
Merge pull request #910 from slingamn/amode.2
partial implementation of #729
2020-03-26 09:30:30 -07:00
Shivaram Lingamneni
1fed04f54d
Merge pull request #911 from slingamn/issue908_unverified.2
more updates to permanent account identifiers
2020-03-26 09:21:53 -07:00
Shivaram Lingamneni
b61d258d0c retain nickname protections after unregistration 2020-03-25 16:24:08 -04:00
Shivaram Lingamneni
c238f07543 fix #908 2020-03-25 14:07:43 -04:00
Shivaram Lingamneni
f5fe580d22 partial implementation of #729
This propagates CS AMODE changes to the actual modes, but not the other
way around.

Also fixes #909.
2020-03-25 12:13:31 -04:00
Shivaram Lingamneni
f4e9c79e36
Merge pull request #905 from slingamn/smoke
add smoke test
2020-03-24 07:20:28 -07:00
Shivaram Lingamneni
a56ca3240f
Merge pull request #904 from hhirtz/fix-key-tests
irc/modes: remove duplicate test case
2020-03-24 07:17:24 -07:00
Shivaram Lingamneni
2bb513fba5 attempt to enable ipv6 on travis 2020-03-24 10:14:16 -04:00
Shivaram Lingamneni
1195295877 fix smoke test spurious failure on missing certs 2020-03-24 10:01:35 -04:00
Shivaram Lingamneni
df4de09de6
Merge pull request #903 from oragono/l10n_master
New Crowdin translations
2020-03-24 06:59:36 -07:00
Hubert Hirtz
1095aca5e7 irc/modes: remove duplicate test case 2020-03-24 14:56:50 +01:00
Daniel Oaks
2d0a7306b5 New translations help.lang.json (Spanish) 2020-03-24 23:56:44 +10:00
Shivaram Lingamneni
bfab8adb70 add smoke target 2020-03-24 09:56:12 -04:00
Daniel Oaks
e1e2e43534 New translations translation.lang.yaml (French) 2020-03-24 23:54:28 +10:00
Daniel Oaks
bad2bd4cac New translations translation.lang.yaml (Finnish) 2020-03-24 23:54:16 +10:00
Daniel Oaks
da95606bd2 New translations irc.lang.json (Spanish) 2020-03-24 23:53:36 +10:00
Daniel Oaks
537eab214b New translations nickserv.lang.json (Spanish) 2020-03-24 23:53:32 +10:00
Shivaram Lingamneni
cae4e108fc add --smoke option 2020-03-24 09:53:19 -04:00
Shivaram Lingamneni
3c34230a43
Merge pull request #902 from oragono/l10n_master
New Crowdin translations
2020-03-23 08:14:26 -07:00
Daniel Oaks
d6b5ead374 New translations irc.lang.json (Finnish) 2020-03-24 00:32:59 +10:00
Shivaram Lingamneni
8f284d6ef7
Merge pull request #899 from slingamn/rsacert
fix #898
2020-03-23 05:37:34 -07:00
Shivaram Lingamneni
5dcc2a32d6 fix confusing config comment 2020-03-23 08:29:05 -04:00
Shivaram Lingamneni
5ea3a216a0
Merge pull request #900 from oragono/l10n_master
New Crowdin translations
2020-03-22 20:43:00 -07:00
Daniel Oaks
a377ad739e New translations irc.lang.json (French) 2020-03-23 12:36:12 +10:00
Daniel Oaks
7c010fd133 New translations help.lang.json (Italian) 2020-03-23 12:36:05 +10:00
Daniel Oaks
12d2be8ddc New translations irc.lang.json (Italian) 2020-03-23 12:36:03 +10:00
Shivaram Lingamneni
f2da69d49f fix #898 2020-03-22 18:18:48 -04:00
Shivaram Lingamneni
8153fb244e
Merge pull request #895 from slingamn/issue894_tlstimeout
fix #894
2020-03-22 08:25:59 -07:00
Shivaram Lingamneni
4c3cb44a25
Merge pull request #896 from oragono/l10n_master
New Crowdin translations
2020-03-22 08:25:45 -07:00
Daniel Oaks
1d734a6daf New translations help.lang.json (Italian) 2020-03-23 00:23:06 +10:00
Shivaram Lingamneni
761d215ecd remove unnecessary comment 2020-03-22 10:09:20 -04:00
Shivaram Lingamneni
f3d64d2859 move idletimer and fakelag initialization before certfp read 2020-03-22 10:09:20 -04:00
Shivaram Lingamneni
101dc6b0d9 increase TLS handshake timeout 2020-03-22 10:09:20 -04:00
Shivaram Lingamneni
080fef218f
Merge pull request #893 from oragono/l10n_master
New Crowdin translations
2020-03-21 21:20:33 -07:00
Shivaram Lingamneni
48f6bb79c8
Merge pull request #890 from slingamn/permanent_accounts.2
make account names permanent identifiers
2020-03-21 21:20:18 -07:00
Daniel Oaks
1fc99437fa New translations help.lang.json (Italian) 2020-03-22 11:58:02 +10:00
Daniel Oaks
19ccd9581c New translations irc.lang.json (Romanian) 2020-03-22 11:56:53 +10:00
Shivaram Lingamneni
27948b7bc9
Merge pull request #891 from oragono/issue850_whoisaway
fix #850
2020-03-21 18:41:59 -07:00
Shivaram Lingamneni
e2db4b611b
Merge pull request #892 from oragono/l10n_master
New Crowdin translations
2020-03-21 18:40:20 -07:00
Daniel Oaks
2350445eab New translations help.lang.json (Italian) 2020-03-21 23:59:52 +10:00
Daniel Oaks
a6b138576b New translations help.lang.json (Italian) 2020-03-21 11:37:32 +10:00
Daniel Oaks
a396bdbab9 New translations irc.lang.json (Italian) 2020-03-21 11:37:31 +10:00
Shivaram Lingamneni
5e5003f5b6 fix #850 2020-03-20 15:14:27 -04:00
Shivaram Lingamneni
811da03ab5 fix #889 2020-03-20 14:47:40 -04:00
Shivaram Lingamneni
3363076689 fix #793 2020-03-20 14:29:49 -04:00
Shivaram Lingamneni
cc25637fef
Merge pull request #887 from oragono/l10n_master
New Crowdin translations
2020-03-20 07:10:12 -07:00
Shivaram Lingamneni
a2d826aa99
Merge pull request #886 from slingamn/issue874.2
fix #874
2020-03-20 07:09:09 -07:00
Daniel Oaks
9f2b61d7e8 New translations irc.lang.json (Italian) 2020-03-20 23:29:04 +10:00
Daniel Oaks
09464e6c04 New translations help.lang.json (Italian) 2020-03-20 23:29:02 +10:00
Shivaram Lingamneni
2d908eac8b fix #874 2020-03-20 09:16:22 -04:00
Shivaram Lingamneni
4eaef9f772
Merge pull request #885 from slingamn/nickline.1
fix #883
2020-03-20 04:33:01 -07:00
Shivaram Lingamneni
28b7639c26 fix #883 2020-03-20 07:17:58 -04:00
Shivaram Lingamneni
37cd2e77c5
Merge pull request #881 from slingamn/issue865_roleplay.2
fix #865
2020-03-20 02:51:20 -07:00
Shivaram Lingamneni
919f9a0445
Merge pull request #882 from oragono/l10n_master
New Crowdin translations
2020-03-20 02:45:06 -07:00
Daniel Oaks
7e87904bd8 New translations irc.lang.json (Italian) 2020-03-20 11:33:42 +10:00
Shivaram Lingamneni
2428acab95 enhancements to roleplay 2020-03-19 17:10:28 -04:00
Shivaram Lingamneni
2bb36e6cb8 fix roleplay messages not being relayed
See #865.
2020-03-19 15:12:28 -04:00
Shivaram Lingamneni
10ad05ecb0
Merge pull request #880 from oragono/l10n_master
New Crowdin translations
2020-03-19 09:46:36 -07:00
Shivaram Lingamneni
35229c32d8
Merge pull request #879 from slingamn/issue704_channelhistory
fix #704
2020-03-19 09:46:19 -07:00
Daniel Oaks
2298e076bf New translations irc.lang.json (Italian) 2020-03-19 23:32:53 +10:00
Shivaram Lingamneni
621df31577 fix #704 2020-03-19 07:26:17 -04:00
Shivaram Lingamneni
1d228eaa92
Merge pull request #878 from slingamn/issue749_guest_again
fix double-application of guest prefix
2020-03-19 02:34:24 -07:00
Shivaram Lingamneni
b32dd5ce33 rename a variable 2020-03-19 05:09:25 -04:00
Shivaram Lingamneni
ca3be51028 fix double application of guest prefix 2020-03-19 05:08:53 -04:00
Shivaram Lingamneni
5d9a03f031
Merge pull request #876 from oragono/l10n_master
New Crowdin translations
2020-03-18 17:36:31 -07:00
Daniel Oaks
d25c7eb5ee New translations help.lang.json (Italian) 2020-03-19 09:29:17 +10:00
Daniel Oaks
fa3cc0f853 New translations irc.lang.json (Italian) 2020-03-19 09:29:16 +10:00
Daniel Oaks
1d93ec3ebc New translations hostserv.lang.json (Italian) 2020-03-19 09:29:14 +10:00
Shivaram Lingamneni
63b10599b6 update @notbandali's handle 2020-03-18 17:53:11 -04:00
Shivaram Lingamneni
b12f2c8132
Merge pull request #872 from slingamn/cleanups.1
fix seven papercuts
2020-03-18 07:22:43 -07:00
Shivaram Lingamneni
e57532a94d
Merge pull request #873 from oragono/l10n_master
New Crowdin translations
2020-03-18 04:37:33 -07:00
Daniel Oaks
bdf0d603b2 New translations translation.lang.yaml (Vietnamese) 2020-03-18 21:33:21 +10:00
Daniel Oaks
4e398857a5 New translations hostserv.lang.json (Italian) 2020-03-18 21:32:59 +10:00
Daniel Oaks
760edbd9f2 New translations nickserv.lang.json (Italian) 2020-03-18 21:32:58 +10:00
Daniel Oaks
dd73b9be22 New translations chanserv.lang.json (Italian) 2020-03-18 21:32:57 +10:00
Daniel Oaks
2a66103228 New translations translation.lang.yaml (Danish) 2020-03-18 21:32:26 +10:00
Daniel Oaks
fd976813c1 New translations translation.lang.yaml (Czech) 2020-03-18 21:32:25 +10:00
Daniel Oaks
1d9f486cae New translations translation.lang.yaml (Chinese Traditional) 2020-03-18 21:32:24 +10:00
Daniel Oaks
409cc5261c New translations translation.lang.yaml (Chinese Simplified) 2020-03-18 21:32:22 +10:00
Daniel Oaks
642d9ab91f New translations translation.lang.yaml (Catalan) 2020-03-18 21:32:21 +10:00
Daniel Oaks
12cd4d8f02 New translations translation.lang.yaml (Bosnian) 2020-03-18 21:32:20 +10:00
Daniel Oaks
7a730e2864 New translations translation.lang.yaml (Arabic) 2020-03-18 21:32:18 +10:00
Daniel Oaks
87e0076696 New translations translation.lang.yaml (Afrikaans) 2020-03-18 21:32:17 +10:00
Daniel Oaks
85f307a8ed New translations translation.lang.yaml (Dutch) 2020-03-18 21:32:15 +10:00
Daniel Oaks
43f4f29729 New translations translation.lang.yaml (English, Australia) 2020-03-18 21:32:08 +10:00
Daniel Oaks
0fa067e806 New translations translation.lang.yaml (Ukrainian) 2020-03-18 21:32:07 +10:00
Daniel Oaks
c7014208f8 New translations translation.lang.yaml (Turkish) 2020-03-18 21:32:05 +10:00
Daniel Oaks
287a25cbd7 New translations translation.lang.yaml (Swedish) 2020-03-18 21:32:04 +10:00
Daniel Oaks
c85242aee4 New translations translation.lang.yaml (Serbian (Cyrillic)) 2020-03-18 21:32:03 +10:00
Daniel Oaks
6ce64ebcbc New translations translation.lang.yaml (Russian) 2020-03-18 21:32:01 +10:00
Daniel Oaks
c52c055ffe New translations translation.lang.yaml (Romanian) 2020-03-18 21:32:00 +10:00
Daniel Oaks
0fec07665c New translations translation.lang.yaml (Portuguese, Brazilian) 2020-03-18 21:31:59 +10:00
Daniel Oaks
0574cd564e New translations translation.lang.yaml (Finnish) 2020-03-18 21:31:57 +10:00
Daniel Oaks
6dd12d9e2f New translations translation.lang.yaml (Portuguese) 2020-03-18 21:31:56 +10:00
Daniel Oaks
08fa226c58 New translations translation.lang.yaml (Norwegian) 2020-03-18 21:31:55 +10:00
Daniel Oaks
ded12c7f1b New translations translation.lang.yaml (Korean) 2020-03-18 21:31:54 +10:00
Daniel Oaks
d2e2bb4b98 New translations translation.lang.yaml (Japanese) 2020-03-18 21:31:52 +10:00
Daniel Oaks
c551c09b76 New translations translation.lang.yaml (Italian) 2020-03-18 21:31:51 +10:00
Daniel Oaks
96ec074b17 New translations translation.lang.yaml (Hungarian) 2020-03-18 21:31:50 +10:00
Daniel Oaks
bf094b4d8a New translations translation.lang.yaml (Hebrew) 2020-03-18 21:31:48 +10:00
Daniel Oaks
3006cab031 New translations translation.lang.yaml (Greek) 2020-03-18 21:31:47 +10:00
Daniel Oaks
049f93b7db New translations translation.lang.yaml (German) 2020-03-18 21:31:46 +10:00
Daniel Oaks
2462739eb9 New translations translation.lang.yaml (Polish) 2020-03-18 21:31:45 +10:00
Shivaram Lingamneni
bd45c346dc fix #685 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
9559ea6764 fix #408 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
442055ff30 fix #842 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
ece444d04b fix #805 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
65ebe7f64a fix #868 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
39d3194104 fix #869 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
988d97d68a fix #846 2020-03-18 07:07:20 -04:00
Shivaram Lingamneni
9708e82f7a
Merge pull request #871 from oragono/l10n_master
New Crowdin translations
2020-03-18 03:56:04 -07:00
Daniel Oaks
82b6b07520 New translations chanserv.lang.json (Italian) 2020-03-18 20:55:16 +10:00
Shivaram Lingamneni
80bee85c45
Merge pull request #867 from slingamn/issue866_samode
fix #866
2020-03-17 10:27:58 -07:00
Shivaram Lingamneni
d98e3581b3 disallow /SAMODE nick +o 2020-03-17 13:19:27 -04:00
Shivaram Lingamneni
76d3ecca71 fix #866 2020-03-17 13:00:53 -04:00
Shivaram Lingamneni
0d311cd939
Merge pull request #864 from slingamn/issue749_guestprefix.6
fix #749
2020-03-17 09:57:23 -07:00
Shivaram Lingamneni
6d65335071 fix various bugs 2020-03-17 09:07:32 -04:00
Shivaram Lingamneni
edd161ddfd rename config keys from review feedback 2020-03-17 09:04:14 -04:00
Shivaram Lingamneni
851c9ef198 add a caveat 2020-03-16 14:03:17 -04:00
Shivaram Lingamneni
26fd3e69a8 fix #749 2020-03-16 13:48:14 -04:00
Shivaram Lingamneni
ee63cd135b
Merge pull request #863 from oragono/l10n_master
New Crowdin translations
2020-03-12 21:47:04 -07:00
Daniel Oaks
20fd2ad359 New translations irc.lang.json (Romanian) 2020-03-13 04:30:18 +10:00
Shivaram Lingamneni
3c1344c3ce
Merge pull request #862 from slingamn/forcedtrailings
upgrade irc-go, force 353 RPL_NAMREPLY to use a trailing
2020-03-11 23:22:43 -07:00
Shivaram Lingamneni
458d813ee1 work around mirc bug 2020-03-11 18:57:42 -04:00
Shivaram Lingamneni
bbe9e09d46 clean up trailing hack 2020-03-11 18:57:25 -04:00
Shivaram Lingamneni
3d13c1bc5f upgrade irc-go to latest master 2020-03-11 18:52:50 -04:00
Shivaram Lingamneni
b2207ef373
Merge pull request #859 from slingamn/changelogfix
remove erroneous changelog entry
2020-03-11 03:24:27 -07:00
Shivaram Lingamneni
bc4f2205f1 remove erroneous changelog entry
Issue #745 affected channels, not accounts. Since confusable protection
for channels was not implemented at all in 1.2.0, this bug was never present
in a release and shouldn't be in the changelog.
2020-03-11 06:01:24 -04:00
Shivaram Lingamneni
c99754ecd9
Merge pull request #857 from oragono/l10n_master
New Crowdin translations
2020-03-10 22:09:23 -07:00
Daniel Oaks
dae1574bdf New translations help.lang.json (Romanian) 2020-03-11 04:38:41 +10:00
Daniel Oaks
40e64b6ec9 New translations irc.lang.json (Romanian) 2020-03-11 04:38:39 +10:00
Daniel Oaks
14e7b12374 New translations hostserv.lang.json (Romanian) 2020-03-11 04:38:26 +10:00
Shivaram Lingamneni
1411492c0b
Merge pull request #856 from oragono/l10n_master
New Crowdin translations
2020-03-09 23:57:52 -07:00
Daniel Oaks
0ba1792084 New translations help.lang.json (Vietnamese) 2020-03-10 16:38:36 +10:00
Daniel Oaks
3bcbf372d8 New translations irc.lang.json (Russian) 2020-03-10 16:38:35 +10:00
Daniel Oaks
06500bd030 New translations hostserv.lang.json (Russian) 2020-03-10 16:38:33 +10:00
Daniel Oaks
97c4cccb78 New translations chanserv.lang.json (Russian) 2020-03-10 16:38:31 +10:00
Daniel Oaks
4bf49b1808 New translations help.lang.json (Romanian) 2020-03-10 16:38:30 +10:00
Daniel Oaks
c564bcf08d New translations irc.lang.json (Romanian) 2020-03-10 16:38:28 +10:00
Daniel Oaks
eb66e14d2e New translations hostserv.lang.json (Romanian) 2020-03-10 16:38:27 +10:00
Daniel Oaks
5a432b122d New translations chanserv.lang.json (Romanian) 2020-03-10 16:38:25 +10:00
Daniel Oaks
3ef214a62a New translations help.lang.json (Portuguese, Brazilian) 2020-03-10 16:38:23 +10:00
Daniel Oaks
793f8ca3c5 New translations irc.lang.json (Portuguese, Brazilian) 2020-03-10 16:38:22 +10:00
Daniel Oaks
d8a69dd1df New translations hostserv.lang.json (Portuguese, Brazilian) 2020-03-10 16:38:20 +10:00
Daniel Oaks
372ef48f39 New translations help.lang.json (Russian) 2020-03-10 16:38:18 +10:00
Daniel Oaks
0d773b8b7a New translations chanserv.lang.json (Portuguese, Brazilian) 2020-03-10 16:38:17 +10:00
Daniel Oaks
409249cbed New translations irc.lang.json (Portuguese) 2020-03-10 16:38:15 +10:00
Daniel Oaks
aa8e9ca810 New translations hostserv.lang.json (Portuguese) 2020-03-10 16:38:13 +10:00
Daniel Oaks
873f3bb518 New translations chanserv.lang.json (Portuguese) 2020-03-10 16:38:12 +10:00
Daniel Oaks
cde25ee147 New translations help.lang.json (Polish) 2020-03-10 16:38:10 +10:00
Daniel Oaks
356f94cbd9 New translations irc.lang.json (Polish) 2020-03-10 16:38:08 +10:00
Daniel Oaks
a2a1f3586e New translations chanserv.lang.json (Polish) 2020-03-10 16:38:06 +10:00
Daniel Oaks
a61b72418f New translations help.lang.json (Norwegian) 2020-03-10 16:38:05 +10:00
Daniel Oaks
85f55e3186 New translations irc.lang.json (Norwegian) 2020-03-10 16:38:03 +10:00
Daniel Oaks
cb1583ca78 New translations hostserv.lang.json (Norwegian) 2020-03-10 16:38:01 +10:00
Daniel Oaks
e8423da8f8 New translations help.lang.json (Portuguese) 2020-03-10 16:37:59 +10:00
Daniel Oaks
4d3403f48d New translations chanserv.lang.json (Serbian (Cyrillic)) 2020-03-10 16:37:58 +10:00
Daniel Oaks
5ade017672 New translations hostserv.lang.json (Polish) 2020-03-10 16:37:56 +10:00
Daniel Oaks
b59c968498 New translations hostserv.lang.json (Serbian (Cyrillic)) 2020-03-10 16:37:55 +10:00
Daniel Oaks
a10b1274ea New translations irc.lang.json (Vietnamese) 2020-03-10 16:37:53 +10:00
Daniel Oaks
0a85073a3c New translations hostserv.lang.json (Vietnamese) 2020-03-10 16:37:51 +10:00
Daniel Oaks
cde05ff6c5 New translations chanserv.lang.json (Vietnamese) 2020-03-10 16:37:49 +10:00
Daniel Oaks
e026df09d0 New translations help.lang.json (Ukrainian) 2020-03-10 16:37:48 +10:00
Daniel Oaks
a088043631 New translations irc.lang.json (Ukrainian) 2020-03-10 16:37:47 +10:00
Daniel Oaks
a1186fdfd6 New translations hostserv.lang.json (Ukrainian) 2020-03-10 16:37:45 +10:00
Daniel Oaks
36b0e338bf New translations chanserv.lang.json (Ukrainian) 2020-03-10 16:37:43 +10:00
Daniel Oaks
3cd224619d New translations help.lang.json (Turkish) 2020-03-10 16:37:42 +10:00
Daniel Oaks
377c88c6d2 New translations irc.lang.json (Turkish) 2020-03-10 16:37:40 +10:00
Daniel Oaks
8b69cc4158 New translations hostserv.lang.json (Turkish) 2020-03-10 16:37:38 +10:00
Daniel Oaks
fd8af6ba9a New translations help.lang.json (Swedish) 2020-03-10 16:37:35 +10:00
Daniel Oaks
9827642201 New translations chanserv.lang.json (Turkish) 2020-03-10 16:37:34 +10:00
Daniel Oaks
32e9beb644 New translations help.lang.json (Serbian (Cyrillic)) 2020-03-10 16:37:32 +10:00
Daniel Oaks
7c7966dcd7 New translations irc.lang.json (Serbian (Cyrillic)) 2020-03-10 16:37:31 +10:00
Daniel Oaks
b44db93d0a New translations hostserv.lang.json (Spanish) 2020-03-10 16:37:29 +10:00
Daniel Oaks
f103bf622d New translations irc.lang.json (Spanish) 2020-03-10 16:37:28 +10:00
Daniel Oaks
b19d309875 New translations chanserv.lang.json (Spanish) 2020-03-10 16:37:26 +10:00
Daniel Oaks
d4ce30f546 New translations help.lang.json (Spanish) 2020-03-10 16:37:24 +10:00
Daniel Oaks
7d8a5efab9 New translations chanserv.lang.json (Swedish) 2020-03-10 16:37:23 +10:00
Daniel Oaks
2193ba964b New translations hostserv.lang.json (Swedish) 2020-03-10 16:37:21 +10:00
Daniel Oaks
cb81bff710 New translations irc.lang.json (Swedish) 2020-03-10 16:37:19 +10:00
Daniel Oaks
1190930d21 New translations hostserv.lang.json (Chinese Traditional) 2020-03-10 16:37:17 +10:00
Daniel Oaks
9c158e14ec New translations irc.lang.json (Chinese Traditional) 2020-03-10 16:37:16 +10:00
Daniel Oaks
1f0162c2b5 New translations help.lang.json (Chinese Traditional) 2020-03-10 16:37:14 +10:00
Daniel Oaks
dd9e5abfea New translations chanserv.lang.json (Czech) 2020-03-10 16:37:13 +10:00
Daniel Oaks
d7525aab79 New translations hostserv.lang.json (Czech) 2020-03-10 16:37:10 +10:00
Daniel Oaks
cdd28fb4cc New translations irc.lang.json (Czech) 2020-03-10 16:37:09 +10:00
Daniel Oaks
46078a029e New translations help.lang.json (Czech) 2020-03-10 16:37:08 +10:00
Daniel Oaks
99069dcfe5 New translations chanserv.lang.json (Danish) 2020-03-10 16:37:06 +10:00
Daniel Oaks
ce00807e54 New translations irc.lang.json (Danish) 2020-03-10 16:37:03 +10:00
Daniel Oaks
14e7f3759c New translations help.lang.json (Danish) 2020-03-10 16:37:01 +10:00
Daniel Oaks
86b482402d New translations chanserv.lang.json (Dutch) 2020-03-10 16:36:59 +10:00
Daniel Oaks
3e4971cd61 New translations hostserv.lang.json (Dutch) 2020-03-10 16:36:58 +10:00
Daniel Oaks
9b755d34a6 New translations irc.lang.json (Dutch) 2020-03-10 16:36:56 +10:00
Daniel Oaks
2141202132 New translations help.lang.json (Dutch) 2020-03-10 16:36:54 +10:00
Daniel Oaks
ac71c44e09 New translations chanserv.lang.json (English, Australia) 2020-03-10 16:36:53 +10:00
Daniel Oaks
e18e3ac75d New translations chanserv.lang.json (Chinese Traditional) 2020-03-10 16:36:51 +10:00
Daniel Oaks
010b137055 New translations hostserv.lang.json (Danish) 2020-03-10 16:36:49 +10:00
Daniel Oaks
9758a820be New translations help.lang.json (Chinese Simplified) 2020-03-10 16:36:47 +10:00
Daniel Oaks
2acf892ec5 New translations hostserv.lang.json (Chinese Simplified) 2020-03-10 16:36:46 +10:00
Daniel Oaks
ef64d1b8ad New translations hostserv.lang.json (English, Australia) 2020-03-10 16:36:44 +10:00
Daniel Oaks
d985bfc519 New translations hostserv.lang.json (Afrikaans) 2020-03-10 16:36:43 +10:00
Daniel Oaks
a0ba840ff5 New translations irc.lang.json (Afrikaans) 2020-03-10 16:36:41 +10:00
Daniel Oaks
a02c7567ca New translations help.lang.json (Afrikaans) 2020-03-10 16:36:40 +10:00
Daniel Oaks
25f9a9e750 New translations chanserv.lang.json (Arabic) 2020-03-10 16:36:39 +10:00
Daniel Oaks
89d0c1d499 New translations hostserv.lang.json (Arabic) 2020-03-10 16:36:37 +10:00
Daniel Oaks
321fcc127c New translations irc.lang.json (Arabic) 2020-03-10 16:36:36 +10:00
Daniel Oaks
589fc100d0 New translations help.lang.json (Arabic) 2020-03-10 16:36:34 +10:00
Daniel Oaks
295939e713 New translations irc.lang.json (Chinese Simplified) 2020-03-10 16:36:32 +10:00
Daniel Oaks
63cd76ea91 New translations chanserv.lang.json (Bosnian) 2020-03-10 16:36:30 +10:00
Daniel Oaks
b531edeffb New translations irc.lang.json (Bosnian) 2020-03-10 16:36:29 +10:00
Daniel Oaks
42cb7d6a11 New translations help.lang.json (Bosnian) 2020-03-10 16:36:26 +10:00
Daniel Oaks
4ae52038be New translations chanserv.lang.json (Catalan) 2020-03-10 16:36:25 +10:00
Daniel Oaks
69f0c9913e New translations hostserv.lang.json (Catalan) 2020-03-10 16:36:23 +10:00
Daniel Oaks
5208f0f394 New translations irc.lang.json (Catalan) 2020-03-10 16:36:22 +10:00
Daniel Oaks
df6c248703 New translations help.lang.json (Catalan) 2020-03-10 16:36:20 +10:00
Daniel Oaks
5f5928225c New translations chanserv.lang.json (Chinese Simplified) 2020-03-10 16:36:18 +10:00
Daniel Oaks
ab9f5441da New translations hostserv.lang.json (Bosnian) 2020-03-10 16:36:16 +10:00
Daniel Oaks
153263064a New translations irc.lang.json (English, Australia) 2020-03-10 16:36:15 +10:00
Daniel Oaks
0129dfc798 New translations hostserv.lang.json (Hungarian) 2020-03-10 16:36:13 +10:00
Daniel Oaks
842808683a New translations chanserv.lang.json (Finnish) 2020-03-10 16:36:12 +10:00
Daniel Oaks
92bb1f8962 New translations chanserv.lang.json (Hungarian) 2020-03-10 16:36:10 +10:00
Daniel Oaks
2c815ba9d7 New translations irc.lang.json (Hungarian) 2020-03-10 16:36:08 +10:00
Daniel Oaks
31fd532580 New translations help.lang.json (Hungarian) 2020-03-10 16:36:06 +10:00
Daniel Oaks
1fdceffe05 New translations chanserv.lang.json (Italian) 2020-03-10 16:36:05 +10:00
Daniel Oaks
cda1f0862a New translations hostserv.lang.json (Italian) 2020-03-10 16:36:03 +10:00
Daniel Oaks
b96f06e08d New translations irc.lang.json (Italian) 2020-03-10 16:36:01 +10:00
Daniel Oaks
a271fd5d5d New translations help.lang.json (Italian) 2020-03-10 16:35:59 +10:00
Daniel Oaks
95bc853013 New translations help.lang.json (Hebrew) 2020-03-10 16:35:58 +10:00
Daniel Oaks
3ccda9b38d New translations chanserv.lang.json (Japanese) 2020-03-10 16:35:57 +10:00
Daniel Oaks
b6e85b9d60 New translations hostserv.lang.json (Japanese) 2020-03-10 16:35:55 +10:00
Daniel Oaks
6ad7dcb335 New translations irc.lang.json (Japanese) 2020-03-10 16:35:54 +10:00
Daniel Oaks
b3b2979924 New translations help.lang.json (Japanese) 2020-03-10 16:35:52 +10:00
Daniel Oaks
a188f8a0cc New translations chanserv.lang.json (Korean) 2020-03-10 16:35:50 +10:00
Daniel Oaks
b3e93e334a New translations hostserv.lang.json (Korean) 2020-03-10 16:35:48 +10:00
Daniel Oaks
b742c7a615 New translations irc.lang.json (Korean) 2020-03-10 16:35:47 +10:00
Daniel Oaks
94c596ae96 New translations help.lang.json (Korean) 2020-03-10 16:35:45 +10:00
Daniel Oaks
b2cc38df9a New translations chanserv.lang.json (Norwegian) 2020-03-10 16:35:44 +10:00
Daniel Oaks
864b67565a New translations help.lang.json (English, Australia) 2020-03-10 16:35:42 +10:00
Daniel Oaks
a09cddebd9 New translations irc.lang.json (Hebrew) 2020-03-10 16:35:40 +10:00
Daniel Oaks
2ae27674e9 New translations hostserv.lang.json (Finnish) 2020-03-10 16:35:38 +10:00
Daniel Oaks
dd7b3cd6b3 New translations irc.lang.json (Finnish) 2020-03-10 16:35:37 +10:00
Daniel Oaks
ada0921806 New translations help.lang.json (Finnish) 2020-03-10 16:35:34 +10:00
Daniel Oaks
85c456805d New translations chanserv.lang.json (French) 2020-03-10 16:35:33 +10:00
Daniel Oaks
e8d5cfadd6 New translations hostserv.lang.json (French) 2020-03-10 16:35:31 +10:00
Daniel Oaks
02853d9d2f New translations irc.lang.json (French) 2020-03-10 16:35:30 +10:00
Daniel Oaks
8af2333fe7 New translations help.lang.json (French) 2020-03-10 16:35:28 +10:00
Daniel Oaks
f5dd36b4df New translations hostserv.lang.json (Hebrew) 2020-03-10 16:35:27 +10:00
Daniel Oaks
1af3e2b490 New translations chanserv.lang.json (German) 2020-03-10 16:35:25 +10:00
Daniel Oaks
7a3779b808 New translations hostserv.lang.json (German) 2020-03-10 16:35:24 +10:00
Daniel Oaks
43bb324aed New translations irc.lang.json (German) 2020-03-10 16:35:22 +10:00
Daniel Oaks
e7fd9de6b9 New translations help.lang.json (German) 2020-03-10 16:35:20 +10:00
Daniel Oaks
a9e945b29b New translations chanserv.lang.json (Greek) 2020-03-10 16:35:19 +10:00
Daniel Oaks
9a9cba023d New translations hostserv.lang.json (Greek) 2020-03-10 16:35:17 +10:00
Daniel Oaks
55c1be92f8 New translations irc.lang.json (Greek) 2020-03-10 16:35:15 +10:00
Daniel Oaks
f85760619d New translations help.lang.json (Greek) 2020-03-10 16:35:13 +10:00
Daniel Oaks
5455fd74b7 New translations chanserv.lang.json (Hebrew) 2020-03-10 16:35:12 +10:00
Daniel Oaks
c914a348e8 New translations chanserv.lang.json (Afrikaans) 2020-03-10 16:35:10 +10:00
Shivaram Lingamneni
dbe92680b2
Merge pull request #855 from slingamn/strings_update
update strings for CrowdIn
2020-03-09 13:32:15 -07:00
Shivaram Lingamneni
c01fef5778 update strings 2020-03-09 16:11:14 -04:00
Shivaram Lingamneni
8692ede1f3
Merge pull request #853 from slingamn/deps.1
upgrade some dependencies
2020-03-09 00:04:03 -07:00
Shivaram Lingamneni
772f5f5e5d upgrade bytefmt 2020-03-08 23:32:58 -04:00
Shivaram Lingamneni
f168ec3411 upgrade go-ldap 2020-03-08 23:32:15 -04:00
Shivaram Lingamneni
b1bab67e83 upgrade golang.org/x/crypto 2020-03-08 23:31:40 -04:00
Shivaram Lingamneni
30ed310701 upgrade yaml package 2020-03-08 23:30:47 -04:00
Shivaram Lingamneni
2f243ab65b bump to next development version 2020-03-08 23:01:52 -04:00
Shivaram Lingamneni
8fd326fd33 bump version to 2.0.0 2020-03-08 05:36:11 -04:00
Shivaram Lingamneni
21fa03b37e
Merge pull request #852 from slingamn/changelog_again
final changelog and documentation updates
2020-03-08 01:32:39 -08:00
Shivaram Lingamneni
36e3cc5496 better example mysql password 2020-03-08 05:27:33 -04:00
Shivaram Lingamneni
5a3528547a new due date 2020-03-08 05:27:33 -04:00
Shivaram Lingamneni
601b1c5da7 fix markdown typo 2020-03-08 05:27:33 -04:00
Shivaram Lingamneni
43217458ce
Merge pull request #851 from oragono/fix-docker
Fix Docker
2020-03-07 21:07:44 -08:00
Shivaram Lingamneni
c58e12fb58 use \s instead of . for matching listener definition lines 2020-03-07 23:55:45 -05:00
Shivaram Lingamneni
c38922005b use sed instead of yq, in build step instead of run step 2020-03-07 23:49:59 -05:00
Daniel Oaks
5e5c857821 Fix Docker 2020-03-07 19:02:33 +10:00
Shivaram Lingamneni
b68b28e189
Merge pull request #849 from slingamn/issue848_lusers_again.1
fix #848
2020-03-06 02:08:19 -08:00
Shivaram Lingamneni
d50c4c2bd6 fix #848 2020-03-06 04:47:47 -05:00
Shivaram Lingamneni
4e733cc2b7 add a note about ircstress as a pre-release check 2020-03-02 06:08:52 -05:00
Shivaram Lingamneni
fecd8203d1
Merge pull request #840 from slingamn/issue812_again
fix 3 separate bugs contributing to #812
2020-03-02 01:04:01 -08:00
Shivaram Lingamneni
5447fc79ff fix confusion between lastSeen and lastActive 2020-03-02 03:06:57 -05:00
Shivaram Lingamneni
d72037725b simplify read of lastSeen 2020-03-02 02:52:51 -05:00
Shivaram Lingamneni
e7c1800893 fix a spurious error logline
unregistering an always-on client would produce
"attempting to persist logged-out client : x"
because the client was always-on, but also being ejected
2020-03-02 01:54:40 -05:00
Shivaram Lingamneni
d5f68215e1 mark dirty when a client first becomes always-on 2020-03-02 01:53:02 -05:00
Shivaram Lingamneni
3005e95c1f rename IncludeAllChannelAttrs 2020-03-02 01:46:22 -05:00
Shivaram Lingamneni
c0192e0e52 add missing initialization for writerSemaphore
It was only initialized for always-on clients, not for regular clients.
This explains a lot in terms of #812 failing to reproduce.
2020-03-02 01:32:08 -05:00
Shivaram Lingamneni
a74450d6ca remove redundant database write on always-on recreation 2020-03-02 01:24:08 -05:00
Shivaram Lingamneni
b4f720ae04 bump version to 2.0.0-rc1 2020-03-02 00:03:03 -05:00
Shivaram Lingamneni
8ed6634b3f
Merge pull request #823 from slingamn/changelog.2
branding, manual, and changelog updates for 2.0
2020-03-01 20:59:16 -08:00
Shivaram Lingamneni
5d5e728c38 add translator credits 2020-03-01 23:55:03 -05:00
Shivaram Lingamneni
ee4e2db25f update development instructions 2020-03-01 23:54:55 -05:00
Shivaram Lingamneni
a51dc1f0eb fix history section 2020-03-01 23:54:47 -05:00
Shivaram Lingamneni
bcaaeca63b
Merge pull request #839 from slingamn/issue838
fix #838
2020-03-01 20:19:50 -08:00
Shivaram Lingamneni
579ef668ac fix #838 2020-03-01 23:13:21 -05:00
Shivaram Lingamneni
dad46221ee add changelog entry for labeled-response ratification 2020-03-01 04:53:25 -05:00
Shivaram Lingamneni
75b78cedaa add changelog entry for draft/acc removal 2020-03-01 04:50:47 -05:00
Shivaram Lingamneni
b0cd079790
Merge pull request #837 from slingamn/issue836_dm_cutoff.1
fix #836
2020-03-01 01:44:41 -08:00
Shivaram Lingamneni
3e01e9995b fix #836 2020-03-01 03:39:25 -05:00
Shivaram Lingamneni
98efaf25e9
Merge pull request #834 from slingamn/issue833_dm_privacy.1
fix #833
2020-02-28 02:51:47 -08:00
Shivaram Lingamneni
d967129446 fix #833 2020-02-28 05:41:08 -05:00
Shivaram Lingamneni
957fa8dd99 fix incorrect comment in oragono.yaml 2020-02-28 00:42:43 -05:00
Shivaram Lingamneni
6663ad44a3 fix markdown typo 2020-02-28 00:28:13 -05:00
Shivaram Lingamneni
a0645f7eac add new changelog entries 2020-02-28 00:16:12 -05:00
Shivaram Lingamneni
c414ac383c
Merge pull request #832 from slingamn/issue831_playback_direction.1
fix #831
2020-02-27 20:11:30 -08:00
Shivaram Lingamneni
85dfebce43 fix #831 2020-02-27 19:29:14 -05:00
Shivaram Lingamneni
faf6e513d2
Merge pull request #830 from slingamn/issue829_zncexpire
fix #829
2020-02-27 12:56:01 -08:00
Shivaram Lingamneni
1dc93bbb9f fix #829
also, handle nickname targets in znc.in/playback
2020-02-27 14:43:59 -05:00
Shivaram Lingamneni
e0f2475b80
Merge pull request #828 from slingamn/sessionrace.1
change "last signoff" tracking to "last seen"
2020-02-27 11:14:27 -08:00
Shivaram Lingamneni
db39608bcb change "last signoff" tracking to "last seen"
Explicit quit and ping timeout behave the same way,
but reattach after abandoning/losing the previous session
(without the break being detected server-side) is more aggressive
about replaying missed messages, at the cost of potential duplication.
2020-02-27 02:17:58 -05:00
Shivaram Lingamneni
21fd49c6fb rewrite history paragraph 2020-02-26 13:45:09 -05:00
Shivaram Lingamneni
168ec80509 add a note about go upgrades 2020-02-26 13:25:49 -05:00
Shivaram Lingamneni
e575b6a29f
Merge pull request #826 from csmith/docker-1.14
Make docker build with go 1.14
2020-02-26 09:46:54 -08:00
Chris Smith
bd32e2d56b
Make docker build with go 1.14 2020-02-26 10:55:12 +00:00
Shivaram Lingamneni
013a290147
Merge pull request #825 from slingamn/issue812.1
partial fix for #812
2020-02-26 00:30:04 -08:00
Shivaram Lingamneni
3a78029809 partial fix for #812 2020-02-26 03:19:14 -05:00
Shivaram Lingamneni
e9a6864499
Merge pull request #822 from slingamn/issue821_alwayson_mismatch.2
fix #821, maybe
2020-02-25 23:57:11 -08:00
Shivaram Lingamneni
030caef019 fix a manual typo 2020-02-26 02:54:57 -05:00
Shivaram Lingamneni
ebed7ad4ea update documentation and branding 2020-02-26 02:39:58 -05:00
Shivaram Lingamneni
8a0c417206 update changelog 2020-02-26 02:39:47 -05:00
Shivaram Lingamneni
e78cb70d33 streamline credits 2020-02-26 02:39:37 -05:00
Shivaram Lingamneni
42ccd81205 make an exception for saset 2020-02-26 02:00:38 -05:00
Shivaram Lingamneni
521617559f fix #821
Or try to, anyway
2020-02-26 01:44:05 -05:00
Shivaram Lingamneni
507f5b7ec3
Merge pull request #816 from slingamn/issue781_go14
fix #781
2020-02-25 11:54:09 -08:00
Shivaram Lingamneni
c2f03a3c5c fix #781 2020-02-25 14:50:03 -05:00
Shivaram Lingamneni
5a300a9070
Merge pull request #815 from slingamn/issue814_lusers_registration
fix #814
2020-02-25 11:24:56 -08:00
Shivaram Lingamneni
1975b0968a fix double decrement of stats on ping timeout 2020-02-25 14:04:50 -05:00
Shivaram Lingamneni
ce208cb3e1 fix #814 2020-02-25 13:26:49 -05:00
Shivaram Lingamneni
ec1a718275
Merge pull request #811 from slingamn/history_nits.4
tweaks to persistent history
2020-02-24 21:34:22 -08:00
Shivaram Lingamneni
3e787de994 handle kiwi's BEFORE * 2020-02-25 00:19:24 -05:00
Shivaram Lingamneni
b45f8436a4 refactoring / bug fixing in history preferences 2020-02-25 00:19:24 -05:00
Shivaram Lingamneni
7f4c50b81d
Merge pull request #809 from slingamn/graceperiod
fix handling of history grace periods
2020-02-24 02:51:12 -08:00
Shivaram Lingamneni
891da73e56 fix handling of history grace periods 2020-02-24 05:44:55 -05:00
Shivaram Lingamneni
7b10902181
Merge pull request #807 from slingamn/reduce_cloak_bits
reduce recommended cloak bits from 80 to 64
2020-02-24 00:47:15 -08:00
Shivaram Lingamneni
ea4bbd6899 reduce recommended cloak bits from 80 to 64
From testing on darwin; shaves 3 characters off the cloaked hostname,
and 64 bits of entropy is fine (a collision is expected after 2**32
~= 4 billion distinct CIDRs).
2020-02-24 03:44:09 -05:00
Shivaram Lingamneni
cb356ecaf0
Merge pull request #804 from slingamn/issue775_again
raise passphrase length limit to 300 bytes
2020-02-22 21:15:13 -08:00
Shivaram Lingamneni
44b79a052c raise passphrase length limit to 300 bytes
For irctest compatibility.

Fixes #775
2020-02-23 00:12:21 -05:00
Shivaram Lingamneni
fb8b73e29a Merge branch 'persistent.14' 2020-02-22 23:10:52 -05:00
Shivaram Lingamneni
c445b45f31
Merge pull request #800 from slingamn/issue791_crashserver
fix #791
2020-02-22 20:08:42 -08:00
Shivaram Lingamneni
01144a8c39
Merge pull request #801 from slingamn/plaintext_listeners
new default: no public plaintext listener
2020-02-22 20:08:23 -08:00
Shivaram Lingamneni
fec27cc7c2
Merge pull request #799 from slingamn/issue725_deoper.1
fix #725
2020-02-22 20:07:29 -08:00
Shivaram Lingamneni
e1e3062dad
Merge pull request #797 from slingamn/issue775_passlength
fix #775
2020-02-22 20:07:14 -08:00
Shivaram Lingamneni
010bb3e926
Merge pull request #796 from slingamn/issue715_upgradedb
fix #715
2020-02-22 20:07:03 -08:00
Shivaram Lingamneni
d77e6c1a28
Merge pull request #795 from slingamn/issue794_nolisten
fix #794
2020-02-22 20:06:46 -08:00
Shivaram Lingamneni
85a536977c factor out confirmation codes into utils, change their format 2020-02-22 22:34:39 -05:00
Shivaram Lingamneni
998ac6928b new default: no public plaintext listener 2020-02-21 15:18:00 -05:00
Shivaram Lingamneni
93708c23eb update draft/chathistory spec link in /help 2020-02-21 13:10:08 -05:00
Shivaram Lingamneni
490b3722bd add a logline and a help description for CRASHSERVER 2020-02-21 13:07:22 -05:00
Shivaram Lingamneni
41813cc15a fix #791 2020-02-21 12:41:04 -05:00
Shivaram Lingamneni
904fa9653c clear reg date and settings during logout 2020-02-21 06:36:32 -05:00
Shivaram Lingamneni
438fffab99 fix #725 2020-02-21 06:10:35 -05:00
Shivaram Lingamneni
91bb7f5877 fix #775 2020-02-21 04:26:17 -05:00
Shivaram Lingamneni
829481ab40 fix #715 2020-02-21 04:24:18 -05:00
Shivaram Lingamneni
5fe4d0b133 fix #794
Remove support for `listen` config block
2020-02-21 04:12:00 -05:00
Shivaram Lingamneni
fd90893fa6 handle old bouncer name for multiclient config 2020-02-21 00:33:55 -05:00
Shivaram Lingamneni
f5ca35ed72 rename 'bouncer' to 'multiclient' 2020-02-21 00:33:55 -05:00
Shivaram Lingamneni
03378da81b CHATHISTORY with no results SHOULD send an empty batch 2020-02-21 00:33:48 -05:00
Shivaram Lingamneni
98a7b45d96 add mysql timeouts 2020-02-21 00:33:48 -05:00
Shivaram Lingamneni
8123e3c08f improve nick and channel length validation 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
108ef3f424 don't double-store messages users send to themselves 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
fab0630180 time.Unix still requires normalization to UTC 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
8031085c26 clean up nil checks relevant to always-on join 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
282e7a4d57 don't write to mysql while holding joinPartMutex 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
4472683d58 persist lastSignoff in the database 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
17a89838b8 fix Client.historyStatus 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
8f4c14c783 miscellaneous review fixes 2020-02-21 00:33:37 -05:00
Shivaram Lingamneni
82732d5b5d fix behavior of echo-message without message-tags 2020-02-20 01:51:19 -05:00
Shivaram Lingamneni
5892680f60 consolidate sending DMs to targets with sending copies to non-originating sessions 2020-02-20 01:51:19 -05:00
Shivaram Lingamneni
ef161c47ed use custime.Duration for more config fields 2020-02-20 00:09:39 -05:00
Shivaram Lingamneni
7b3caed20f fix/enhancement to custime 2020-02-19 02:45:50 -05:00
Shivaram Lingamneni
b40ca85172 add go.sum 2020-02-19 01:04:48 -05:00
Shivaram Lingamneni
e59aa43225 fix StringToBool (thanks @wrmsr) 2020-02-19 00:54:42 -05:00
Shivaram Lingamneni
c34477c937 vendor changes, including mysql driver 2020-02-19 00:24:21 -05:00
Shivaram Lingamneni
ad32356e34 move authentication data from Client to Session 2020-02-19 00:24:21 -05:00
Shivaram Lingamneni
33dac4c0ba initial persistent history implementation 2020-02-19 00:24:12 -05:00
Shivaram Lingamneni
0d5a4fd584
Merge pull request #786 from slingamn/new_defaults
change some recommended defaults in the config
2020-02-13 22:31:10 -08:00
Shivaram Lingamneni
9e35427fa6 change some recommended defaults in the config 2020-02-13 23:38:56 -05:00
Shivaram Lingamneni
b3d260a9a8
Merge pull request #785 from slingamn/issue782
fix #782
2020-02-12 11:31:51 -08:00
Shivaram Lingamneni
d0aa7cc860 fix #782 (bring vendor into the main tree) 2020-02-12 13:19:23 -05:00
Shivaram Lingamneni
702c7b1e7c add .gitattributes 2020-02-12 13:14:11 -05:00
Shivaram Lingamneni
8d233f94bf
Merge pull request #778 from oragono/l10n_master
New Crowdin translations
2020-02-12 02:29:40 -08:00
Shivaram Lingamneni
ed3a43861f
Merge pull request #783 from oragono/ldap
LDAP support
2020-02-11 23:03:56 -08:00
Shivaram Lingamneni
306ca986a8 minor fixes 2020-02-11 22:08:41 -05:00
Shivaram Lingamneni
0c2d8adeac improve maintainability and license compliance
0. Maximum parity with upstream code
1. Added Apache-required modification notices
2. Added Apache license
2020-02-11 16:13:12 -05:00
Shivaram Lingamneni
c13597f807 additional LDAP support 2020-02-11 06:35:17 -05:00
Matt Ouille
5ba2527eb0 Fix compilation errors 2020-02-09 22:13:12 -05:00
Matt Ouille
d4afb027e5 Add LDAP support 2020-02-09 22:13:02 -05:00
Shivaram Lingamneni
634470ba30
Merge pull request #780 from slingamn/issue699
fix #699
2020-02-09 19:03:35 -08:00
Shivaram Lingamneni
dd25ed391b explicitly specify 1.14rc1 for now 2020-02-09 21:47:12 -05:00
Shivaram Lingamneni
add4249fd2 update build instructions 2020-02-09 21:33:22 -05:00
Shivaram Lingamneni
7531d02334 clean up Makefile 2020-02-09 21:33:22 -05:00
Shivaram Lingamneni
87960c1454 upgrade to go 1.14 2020-02-09 20:50:05 -05:00
Shivaram Lingamneni
bc01538c7c add go.mod 2020-02-09 20:49:38 -05:00
Daniel Oaks
469d7b5e2e New translations help.lang.json (French) 2020-02-09 05:13:11 +10:00
Daniel Oaks
d61ba86809 New translations irc.lang.json (French) 2020-02-09 05:13:09 +10:00
Daniel Oaks
df7037cb05 New translations hostserv.lang.json (French) 2020-02-09 05:13:07 +10:00
Daniel Oaks
9c0b13ea6a New translations chanserv.lang.json (French) 2020-02-09 05:13:06 +10:00
Shivaram Lingamneni
2b48b15a4b
Merge pull request #777 from slingamn/issue776
fix #776
2020-02-07 10:37:04 -08:00
Shivaram Lingamneni
b964a201c1 fix #776 2020-02-07 13:28:49 -05:00
Shivaram Lingamneni
e11f0a3428
Merge pull request #773 from slingamn/issue772_mitigation.1
mitigate #772
2020-02-06 22:32:13 -08:00
Shivaram Lingamneni
a3f008e348 mitigate #772 2020-02-06 17:56:10 -05:00
Shivaram Lingamneni
e71a3a57f0
Merge pull request #770 from oragono/l10n_master
New Crowdin translations
2020-02-06 00:20:51 -08:00
Daniel Oaks
fb9a451b38 New translations help.lang.json (French) 2020-02-03 16:11:49 +10:00
Daniel Oaks
300f769af7 New translations irc.lang.json (French) 2020-02-03 16:11:48 +10:00
Daniel Oaks
0898ed0b3b New translations translation.lang.yaml (French) 2020-02-03 16:11:46 +10:00
Daniel Oaks
aebe18171d New translations hostserv.lang.json (French) 2020-02-03 16:11:45 +10:00
Daniel Oaks
d698ea5b8a New translations nickserv.lang.json (French) 2020-02-03 16:11:44 +10:00
Shivaram Lingamneni
806c4b0d68
Merge pull request #767 from slingamn/issue764_hstake_again
fix #764
2020-02-02 10:09:24 -08:00
Shivaram Lingamneni
88d7e98011 add vhost snomasks 2020-02-02 02:03:08 -05:00
Shivaram Lingamneni
5426c9fdc0 disallow TAKE and REQUEST while under a FORBID 2020-02-01 23:51:29 -05:00
Shivaram Lingamneni
e1f56aaee3 fix #764 2020-02-01 22:19:33 -05:00
Shivaram Lingamneni
b1e5570f85
Merge pull request #762 from slingamn/fix_760_again
actually fix #760
2020-01-29 13:31:07 -08:00
Shivaram Lingamneni
52d85517cd actually fix #760 2020-01-29 16:27:59 -05:00
Shivaram Lingamneni
bc692a70a0
Merge pull request #761 from slingamn/issue760.1
fix #760
2020-01-29 13:09:22 -08:00
Shivaram Lingamneni
fd46874ad3 fix #760 2020-01-29 15:45:50 -05:00
Shivaram Lingamneni
b329cf430e
Merge pull request #744 from slingamn/hostserv_offer.1
add support for offering vhosts
2020-01-28 19:36:17 -08:00
Shivaram Lingamneni
955cdbdfef impose throttle checks on HS TAKE 2020-01-28 22:27:56 -05:00
Shivaram Lingamneni
dedf78d0e9 review fixes 2020-01-28 21:23:31 -05:00
Shivaram Lingamneni
f5b3adefba
Merge pull request #759 from slingamn/bump_sendq
increase default sendq and multiline max-lines
2020-01-28 09:35:00 -08:00
Shivaram Lingamneni
faf08322a2 increase default sendq and multiline max-lines 2020-01-28 12:19:28 -05:00
Shivaram Lingamneni
537eb33dce
Merge pull request #758 from slingamn/ratify_labeled_response
ratify labeled-response
2020-01-28 08:29:14 -08:00
Shivaram Lingamneni
7d3c0f7884 fix #757 2020-01-27 21:10:24 -05:00
Shivaram Lingamneni
1ac3381623
Merge pull request #756 from slingamn/issue753_channel_ctcp
fix #753
2020-01-27 18:09:44 -08:00
Shivaram Lingamneni
8a10924801 review fix 2020-01-27 21:07:50 -05:00
Shivaram Lingamneni
166dc60729 fix #753
Also add +C no-ctcp mode, since it's not conflicted
2020-01-26 21:07:20 -05:00
Shivaram Lingamneni
66e2710ba2
Merge pull request #755 from slingamn/issue754_dm_tags
fix #754
2020-01-25 18:31:27 -08:00
Shivaram Lingamneni
1fc9a04503 fix #754 2020-01-25 21:06:55 -05:00
Shivaram Lingamneni
fbfa32bf4c
Merge pull request #752 from slingamn/multiline.1
remove oragono.io/maxline-2 and fmsgid
2020-01-25 17:12:02 -08:00
Shivaram Lingamneni
6e2b2a44b8 set the time of a multiline message at BATCH - 2020-01-20 00:37:13 -05:00
Shivaram Lingamneni
5d662742b9 remove oragono.io/maxline-2 and fmsgid 2020-01-18 23:47:05 -05:00
Shivaram Lingamneni
5ef83c1673
Merge pull request #751 from slingamn/proxy_docs
fix #651
2020-01-14 23:53:44 -05:00
Shivaram Lingamneni
f0891ce6f5 fix #651 2020-01-14 22:57:37 -05:00
Shivaram Lingamneni
0cebdba82c
Merge pull request #750 from slingamn/isupport_fix
fix incorrect values of UTF8MAPPING for non-PRECIS casefoldings
2020-01-14 13:11:53 -05:00
Shivaram Lingamneni
e70b9e28e9
Merge pull request #746 from slingamn/issue745
fix #745
2020-01-14 01:29:18 -05:00
Shivaram Lingamneni
d807f1252f move generateISupport to config.go 2020-01-14 01:21:47 -05:00
Shivaram Lingamneni
3ff586e821 don't read globalCasemappingSetting in generateISupport
The isupport is always a pure function of the Config object,
not of Server or any globals.
2020-01-14 01:19:48 -05:00
Shivaram Lingamneni
90b428b416 fix #745 2020-01-12 11:24:11 -05:00
Shivaram Lingamneni
2db14c91b9 review fixes 2020-01-11 22:52:30 -05:00
Shivaram Lingamneni
05cb80507f fix #741 2020-01-11 22:43:40 -05:00
Shivaram Lingamneni
e10a5f07de
Merge pull request #742 from slingamn/issue741_env
fix #741
2020-01-09 16:46:39 -05:00
Shivaram Lingamneni
11ca86028c fix #741 2020-01-09 13:49:36 -05:00
Shivaram Lingamneni
68968d6868
Merge pull request #740 from slingamn/proxy_dline
don't check the real IP for bans on proxy-before-TLS
2020-01-09 04:42:46 -05:00
Shivaram Lingamneni
6838d19acc don't check the real IP for bans on proxy-before-TLS
In the k8s PROXY-before-TLS setting, we don't know all the IPs
of the load balancers, so we can't whitelist them, so they're at
risk of being d-lined.
2020-01-09 04:38:59 -05:00
Shivaram Lingamneni
5687fbb185
Merge pull request #738 from slingamn/issue705_userlimit
fix #705
2020-01-08 11:33:58 -05:00
Shivaram Lingamneni
2110f3dad7 fix #705 2020-01-08 02:20:37 -05:00
Shivaram Lingamneni
99c5838949
Merge pull request #736 from slingamn/issue733_followup
Revert "never set the certfp lookup key before verification"
2020-01-06 15:44:10 -05:00
Shivaram Lingamneni
eb630b7657 Revert "never set the certfp lookup key before verification"
This reverts commit a120cc24436a69402f95644eb5e1ef92c04148b2.
2020-01-06 15:00:26 -05:00
Shivaram Lingamneni
01e1a01fa2
Merge pull request #735 from slingamn/issue733
fix #733
2020-01-06 13:29:34 -05:00
Shivaram Lingamneni
a120cc2443 never set the certfp lookup key before verification 2020-01-06 12:53:21 -05:00
Shivaram Lingamneni
1b35c6887f fix #733 2020-01-06 12:21:52 -05:00
Shivaram Lingamneni
1ae38091a3
Merge pull request #728 from slingamn/issue727_group_ghost.1
fix #727
2020-01-05 03:26:26 -05:00
Shivaram Lingamneni
37f4836d99 review fix 2020-01-05 03:22:51 -05:00
Shivaram Lingamneni
46fedfced0
Merge pull request #730 from slingamn/copyright
update copyright notice
2020-01-03 12:39:27 -05:00
Shivaram Lingamneni
aec8421afa
Merge pull request #732 from slingamn/issue731_multiline_batch_arg
fix #731
2020-01-03 09:52:48 -05:00
Shivaram Lingamneni
d67d77bee7 fix #731 2020-01-03 09:46:55 -05:00
Shivaram Lingamneni
85c79be18b update copyright notice 2020-01-03 02:44:03 -05:00
Shivaram Lingamneni
ea4d4a2f64 change nick reservation defaults 2019-12-31 21:30:51 -05:00
Shivaram Lingamneni
bc0712b19b fix #727 2019-12-31 21:19:28 -05:00
Shivaram Lingamneni
ae6e7ab756
Merge pull request #726 from oragono/l10n_master
New Crowdin translations
2019-12-31 01:05:08 -05:00
Daniel Oaks
58638530c4 New translations help.lang.json (Vietnamese) 2019-12-31 15:46:01 +10:00
Daniel Oaks
e2b3c780ec New translations chanserv.lang.json (Finnish) 2019-12-31 15:46:00 +10:00
Daniel Oaks
96aca6b28a New translations help.lang.json (English, Australia) 2019-12-31 15:45:59 +10:00
Daniel Oaks
856c77db1f New translations irc.lang.json (English, Australia) 2019-12-31 15:45:57 +10:00
Daniel Oaks
5b3a28d256 New translations hostserv.lang.json (English, Australia) 2019-12-31 15:45:55 +10:00
Daniel Oaks
0c228b91a5 New translations chanserv.lang.json (English, Australia) 2019-12-31 15:45:54 +10:00
Daniel Oaks
844049a15a New translations help.lang.json (Dutch) 2019-12-31 15:45:52 +10:00
Daniel Oaks
e8d5efd3a6 New translations irc.lang.json (Dutch) 2019-12-31 15:45:51 +10:00
Daniel Oaks
8b9a532843 New translations chanserv.lang.json (Dutch) 2019-12-31 15:45:49 +10:00
Daniel Oaks
0ac660a9dc New translations help.lang.json (Danish) 2019-12-31 15:45:48 +10:00
Daniel Oaks
d738cf3152 New translations irc.lang.json (Danish) 2019-12-31 15:45:47 +10:00
Daniel Oaks
06d8f80340 New translations hostserv.lang.json (Danish) 2019-12-31 15:45:45 +10:00
Daniel Oaks
f0c31fd95c New translations chanserv.lang.json (Danish) 2019-12-31 15:45:43 +10:00
Daniel Oaks
7bf8e61bd0 New translations hostserv.lang.json (Dutch) 2019-12-31 15:45:42 +10:00
Daniel Oaks
45ed791d20 New translations help.lang.json (Czech) 2019-12-31 15:45:41 +10:00
Daniel Oaks
2270533286 New translations hostserv.lang.json (Finnish) 2019-12-31 15:45:40 +10:00
Daniel Oaks
cfc5654a1f New translations help.lang.json (Finnish) 2019-12-31 15:45:39 +10:00
Daniel Oaks
b67f310f6a New translations help.lang.json (Hebrew) 2019-12-31 15:45:38 +10:00
Daniel Oaks
681d04aca2 New translations irc.lang.json (Hebrew) 2019-12-31 15:45:36 +10:00
Daniel Oaks
fcedc7372e New translations hostserv.lang.json (Hebrew) 2019-12-31 15:45:34 +10:00
Daniel Oaks
343dc2ec82 New translations chanserv.lang.json (Hebrew) 2019-12-31 15:45:32 +10:00
Daniel Oaks
a88665fb91 New translations help.lang.json (Greek) 2019-12-31 15:45:31 +10:00
Daniel Oaks
c015c96595 New translations irc.lang.json (Greek) 2019-12-31 15:45:30 +10:00
Daniel Oaks
822f312212 New translations irc.lang.json (Finnish) 2019-12-31 15:45:29 +10:00
Daniel Oaks
e6ba166078 New translations hostserv.lang.json (Greek) 2019-12-31 15:45:27 +10:00
Daniel Oaks
b7538b2f50 New translations chanserv.lang.json (Greek) 2019-12-31 15:45:26 +10:00
Daniel Oaks
64ad28f953 New translations help.lang.json (German) 2019-12-31 15:45:25 +10:00
Daniel Oaks
01a73bc5c2 New translations irc.lang.json (German) 2019-12-31 15:45:23 +10:00
Daniel Oaks
3f5aef10e4 New translations hostserv.lang.json (German) 2019-12-31 15:45:21 +10:00
Daniel Oaks
c380facc82 New translations chanserv.lang.json (German) 2019-12-31 15:45:20 +10:00
Daniel Oaks
344d435864 New translations chanserv.lang.json (Hungarian) 2019-12-31 15:45:18 +10:00
Daniel Oaks
7f2c31c36f New translations irc.lang.json (Czech) 2019-12-31 15:45:17 +10:00
Daniel Oaks
e53edda04a New translations chanserv.lang.json (Bosnian) 2019-12-31 15:45:14 +10:00
Daniel Oaks
6fa65b2069 New translations help.lang.json (Arabic) 2019-12-31 15:45:13 +10:00
Daniel Oaks
5a7cc75f9a New translations irc.lang.json (Arabic) 2019-12-31 15:45:12 +10:00
Daniel Oaks
782b8bf762 New translations hostserv.lang.json (Arabic) 2019-12-31 15:45:10 +10:00
Daniel Oaks
0dbcc4cf8e New translations chanserv.lang.json (Arabic) 2019-12-31 15:45:08 +10:00
Daniel Oaks
e6fb9e035e New translations hostserv.lang.json (Bosnian) 2019-12-31 15:45:07 +10:00
Daniel Oaks
e1791cba5e New translations help.lang.json (Afrikaans) 2019-12-31 15:45:06 +10:00
Daniel Oaks
a5423743c1 New translations hostserv.lang.json (Afrikaans) 2019-12-31 15:45:05 +10:00
Daniel Oaks
4887d2b712 New translations chanserv.lang.json (Afrikaans) 2019-12-31 15:45:03 +10:00
Daniel Oaks
294e58176b New translations help.lang.json (French) 2019-12-31 15:45:02 +10:00
Daniel Oaks
aa4397835b New translations irc.lang.json (French) 2019-12-31 15:45:01 +10:00
Daniel Oaks
3c0ddac8c0 New translations hostserv.lang.json (French) 2019-12-31 15:44:59 +10:00
Daniel Oaks
798cd0f052 New translations irc.lang.json (Afrikaans) 2019-12-31 15:44:57 +10:00
Daniel Oaks
903694996b New translations hostserv.lang.json (Czech) 2019-12-31 15:44:56 +10:00
Daniel Oaks
dbc36d86c2 New translations irc.lang.json (Bosnian) 2019-12-31 15:44:55 +10:00
Daniel Oaks
4dbdad33d6 New translations chanserv.lang.json (Catalan) 2019-12-31 15:44:53 +10:00
Daniel Oaks
5a61658e2a New translations chanserv.lang.json (Czech) 2019-12-31 15:44:51 +10:00
Daniel Oaks
79478024b1 New translations help.lang.json (Chinese Traditional) 2019-12-31 15:44:50 +10:00
Daniel Oaks
7341d3ed9b New translations irc.lang.json (Chinese Traditional) 2019-12-31 15:44:49 +10:00
Daniel Oaks
69e99b9838 New translations hostserv.lang.json (Chinese Traditional) 2019-12-31 15:44:47 +10:00
Daniel Oaks
2e3d20f3cd New translations chanserv.lang.json (Chinese Traditional) 2019-12-31 15:44:46 +10:00
Daniel Oaks
c342df5191 New translations help.lang.json (Chinese Simplified) 2019-12-31 15:44:45 +10:00
Daniel Oaks
db5ed40cc5 New translations help.lang.json (Bosnian) 2019-12-31 15:44:44 +10:00
Daniel Oaks
dd00826bb0 New translations irc.lang.json (Chinese Simplified) 2019-12-31 15:44:42 +10:00
Daniel Oaks
e14b8548e8 New translations chanserv.lang.json (Chinese Simplified) 2019-12-31 15:44:40 +10:00
Daniel Oaks
f85fb35f81 New translations help.lang.json (Catalan) 2019-12-31 15:44:38 +10:00
Daniel Oaks
42dc474bca New translations irc.lang.json (Catalan) 2019-12-31 15:44:37 +10:00
Daniel Oaks
ecf0ab76ae New translations hostserv.lang.json (Catalan) 2019-12-31 15:44:35 +10:00
Daniel Oaks
65c52a3238 New translations hostserv.lang.json (Chinese Simplified) 2019-12-31 15:44:34 +10:00
Daniel Oaks
4530012525 New translations chanserv.lang.json (French) 2019-12-31 15:44:33 +10:00
Daniel Oaks
600c0bf83f New translations irc.lang.json (Hungarian) 2019-12-31 15:44:31 +10:00
Daniel Oaks
9d9bc915a4 New translations help.lang.json (Spanish) 2019-12-31 15:44:29 +10:00
Daniel Oaks
bb5f3a6da8 New translations irc.lang.json (Spanish) 2019-12-31 15:44:28 +10:00
Daniel Oaks
fbd656cb38 New translations hostserv.lang.json (Spanish) 2019-12-31 15:44:26 +10:00
Daniel Oaks
4084bc0cf3 New translations chanserv.lang.json (Spanish) 2019-12-31 15:44:24 +10:00
Daniel Oaks
9c686e5b5b New translations help.lang.json (Serbian (Cyrillic)) 2019-12-31 15:44:23 +10:00
Daniel Oaks
0326597f8a New translations irc.lang.json (Serbian (Cyrillic)) 2019-12-31 15:44:22 +10:00
Daniel Oaks
d19070ef71 New translations chanserv.lang.json (Swedish) 2019-12-31 15:44:21 +10:00
Daniel Oaks
c36df575e2 New translations hostserv.lang.json (Serbian (Cyrillic)) 2019-12-31 15:44:20 +10:00
Daniel Oaks
fc8304cd4b New translations chanserv.lang.json (Serbian (Cyrillic)) 2019-12-31 15:44:18 +10:00
Daniel Oaks
41308841c9 New translations help.lang.json (Russian) 2019-12-31 15:44:17 +10:00
Daniel Oaks
cb88e27ed7 New translations irc.lang.json (Russian) 2019-12-31 15:44:16 +10:00
Daniel Oaks
63dea2c326 New translations hostserv.lang.json (Russian) 2019-12-31 15:44:14 +10:00
Daniel Oaks
3c5c62f2d4 New translations chanserv.lang.json (Russian) 2019-12-31 15:44:13 +10:00
Daniel Oaks
5b9829a997 New translations help.lang.json (Romanian) 2019-12-31 15:44:12 +10:00
Daniel Oaks
9dd378c36d New translations hostserv.lang.json (Romanian) 2019-12-31 15:44:10 +10:00
Daniel Oaks
14b08affc8 New translations irc.lang.json (Swedish) 2019-12-31 15:44:09 +10:00
Daniel Oaks
a02f210bde New translations irc.lang.json (Vietnamese) 2019-12-31 15:44:07 +10:00
Daniel Oaks
2277f13a24 New translations hostserv.lang.json (Vietnamese) 2019-12-31 15:44:05 +10:00
Daniel Oaks
43472cf97c New translations chanserv.lang.json (Vietnamese) 2019-12-31 15:44:04 +10:00
Daniel Oaks
b1ddcfb97f New translations help.lang.json (Ukrainian) 2019-12-31 15:44:02 +10:00
Daniel Oaks
6c44188b89 New translations irc.lang.json (Ukrainian) 2019-12-31 15:44:01 +10:00
Daniel Oaks
907f02547f New translations hostserv.lang.json (Ukrainian) 2019-12-31 15:43:59 +10:00
Daniel Oaks
a343479459 New translations hostserv.lang.json (Swedish) 2019-12-31 15:43:58 +10:00
Daniel Oaks
4e90b76c01 New translations help.lang.json (Turkish) 2019-12-31 15:43:56 +10:00
Daniel Oaks
c2810c955d New translations irc.lang.json (Turkish) 2019-12-31 15:43:55 +10:00
Daniel Oaks
6afa6040ea New translations hostserv.lang.json (Turkish) 2019-12-31 15:43:54 +10:00
Daniel Oaks
cdd8125adf New translations chanserv.lang.json (Turkish) 2019-12-31 15:43:52 +10:00
Daniel Oaks
487f4d7992 New translations help.lang.json (Swedish) 2019-12-31 15:43:51 +10:00
Daniel Oaks
d2fc592cec New translations chanserv.lang.json (Ukrainian) 2019-12-31 15:43:50 +10:00
Daniel Oaks
86aaabee71 New translations hostserv.lang.json (Hungarian) 2019-12-31 15:43:49 +10:00
Daniel Oaks
d90aecc454 New translations help.lang.json (Portuguese, Brazilian) 2019-12-31 15:43:47 +10:00
Daniel Oaks
546a47d1c9 New translations help.lang.json (Korean) 2019-12-31 15:43:45 +10:00
Daniel Oaks
a75cfa4559 New translations irc.lang.json (Korean) 2019-12-31 15:43:44 +10:00
Daniel Oaks
001ab82bc3 New translations hostserv.lang.json (Korean) 2019-12-31 15:43:42 +10:00
Daniel Oaks
13c0b8a68d New translations chanserv.lang.json (Korean) 2019-12-31 15:43:41 +10:00
Daniel Oaks
4eaf18190d New translations help.lang.json (Japanese) 2019-12-31 15:43:40 +10:00
Daniel Oaks
d4a229a2a3 New translations irc.lang.json (Japanese) 2019-12-31 15:43:39 +10:00
Daniel Oaks
f35d7b1261 New translations chanserv.lang.json (Norwegian) 2019-12-31 15:43:37 +10:00
Daniel Oaks
6c96ff33c7 New translations hostserv.lang.json (Japanese) 2019-12-31 15:43:36 +10:00
Daniel Oaks
965550d3e8 New translations chanserv.lang.json (Japanese) 2019-12-31 15:43:35 +10:00
Daniel Oaks
4fa84a7039 New translations help.lang.json (Italian) 2019-12-31 15:43:34 +10:00
Daniel Oaks
45a43706bc New translations irc.lang.json (Italian) 2019-12-31 15:43:33 +10:00
Daniel Oaks
98ba0f290d New translations hostserv.lang.json (Italian) 2019-12-31 15:43:31 +10:00
Daniel Oaks
bde7c18b22 New translations chanserv.lang.json (Italian) 2019-12-31 15:43:30 +10:00
Daniel Oaks
8020f47d25 New translations help.lang.json (Hungarian) 2019-12-31 15:43:28 +10:00
Daniel Oaks
849409d50a New translations chanserv.lang.json (Romanian) 2019-12-31 15:43:27 +10:00
Daniel Oaks
e3bcde4b18 New translations irc.lang.json (Norwegian) 2019-12-31 15:43:25 +10:00
Daniel Oaks
c5b79e0276 New translations irc.lang.json (Portuguese, Brazilian) 2019-12-31 15:43:23 +10:00
Daniel Oaks
9bb4fba69d New translations hostserv.lang.json (Portuguese, Brazilian) 2019-12-31 15:43:21 +10:00
Daniel Oaks
06646968cd New translations chanserv.lang.json (Portuguese, Brazilian) 2019-12-31 15:43:19 +10:00
Daniel Oaks
5eb0426e20 New translations help.lang.json (Portuguese) 2019-12-31 15:43:18 +10:00
Daniel Oaks
1eedf82059 New translations irc.lang.json (Portuguese) 2019-12-31 15:43:17 +10:00
Daniel Oaks
d7227b17df New translations hostserv.lang.json (Portuguese) 2019-12-31 15:43:15 +10:00
Daniel Oaks
eb243529fa New translations hostserv.lang.json (Norwegian) 2019-12-31 15:43:14 +10:00
Daniel Oaks
e727fc11ec New translations help.lang.json (Polish) 2019-12-31 15:43:12 +10:00
Daniel Oaks
fe04244fc9 New translations irc.lang.json (Polish) 2019-12-31 15:43:11 +10:00
Daniel Oaks
6ed7dcd0a1 New translations hostserv.lang.json (Polish) 2019-12-31 15:43:10 +10:00
Daniel Oaks
e254a1f0d6 New translations chanserv.lang.json (Polish) 2019-12-31 15:43:08 +10:00
Daniel Oaks
3c11cca45a New translations help.lang.json (Norwegian) 2019-12-31 15:43:07 +10:00
Daniel Oaks
04c5a160e7 New translations chanserv.lang.json (Portuguese) 2019-12-31 15:43:06 +10:00
Daniel Oaks
f7cc9fac74 New translations irc.lang.json (Romanian) 2019-12-31 15:43:04 +10:00
Shivaram Lingamneni
0e2cdf4d3c
Merge pull request #724 from slingamn/language_update
language update, take 2
2019-12-30 15:04:48 -05:00
Shivaram Lingamneni
60edd70520
Merge pull request #722 from oragono/l10n_master
New Crowdin translations
2019-12-30 14:48:58 -05:00
Shivaram Lingamneni
14310f0685 commit the results of ./updatetranslations.py run irc languages 2019-12-30 14:47:22 -05:00
Shivaram Lingamneni
bd822853bc fix some translation warnings 2019-12-30 14:47:22 -05:00
Shivaram Lingamneni
d826d5ae3b
Merge pull request #723 from slingamn/issue530_certfp.3
fix #530, #721
2019-12-30 12:37:09 -05:00
Shivaram Lingamneni
f920d3b79f fix #530, #721 2019-12-29 12:05:01 -05:00
Shivaram Lingamneni
9de9fcf069
Merge pull request #695 from slingamn/issue693_casemappings.4
#693: configurable casemappings
2019-12-29 09:20:06 -05:00
Daniel Oaks
650ebbd18f New translations help.lang.json (French) 2019-12-29 05:12:19 +10:00
Shivaram Lingamneni
f6757f814e
Merge pull request #707 from slingamn/multiline.4
implement draft/multiline
2019-12-26 23:18:54 -05:00
Shivaram Lingamneni
47ac8e984f remove unnecessary helper 2019-12-26 22:54:00 -05:00
Shivaram Lingamneni
ca1831d1e1
Merge pull request #719 from oragono/l10n_master
New Crowdin translations
2019-12-26 20:42:57 -05:00
Daniel Oaks
3425215f10 New translations help.lang.json (French) 2019-12-27 07:32:01 +10:00
Daniel Oaks
ddd6b04a8a New translations translation.lang.yaml (French) 2019-12-27 07:31:58 +10:00
Shivaram Lingamneni
68e3b74b79
Merge pull request #717 from slingamn/issue716
fix #716
2019-12-25 21:11:53 -05:00
Shivaram Lingamneni
5cb4a8fc42
Merge pull request #718 from slingamn/cstransfer_improvements
better UX for cancelling channel transfers
2019-12-25 21:11:31 -05:00
Shivaram Lingamneni
8c1db7a2f5 better UX for cancelling channel transfers 2019-12-25 15:59:38 -05:00
Shivaram Lingamneni
33c8b2177e fix a bug
In the previous commit, the client would receive a failure message but would
actually remain logged in after an authzid/authcid mismatch. This was a
correctness rather than a security issue, but now it's fixed so that the client
never logs in in the first place.
2019-12-25 15:06:26 -05:00
Shivaram Lingamneni
c8ccf94936 fix #716 2019-12-25 12:44:55 -05:00
Shivaram Lingamneni
f05c6ae6e0
Merge pull request #714 from slingamn/issue713
fix #713
2019-12-24 16:23:01 -05:00
Shivaram Lingamneni
9b5d6bf746 fix #713 2019-12-24 16:20:18 -05:00
Shivaram Lingamneni
f7569a92ab
Merge pull request #711 from slingamn/issue710
Fix #710
2019-12-24 15:34:47 -05:00
Shivaram Lingamneni
1487980fe0 Fix #710 2019-12-24 15:03:37 -05:00
Shivaram Lingamneni
4f8439ac4f
Merge pull request #709 from slingamn/authzid
add more authzid/authcid clarifications
2019-12-24 13:13:31 -05:00
Shivaram Lingamneni
cd3ff3922e fill in more authzid/authcid details 2019-12-24 12:46:31 -05:00
Shivaram Lingamneni
8b45922596
Merge pull request #708 from xPaw/patch-1
Fix `authcid` variable name
2019-12-24 12:37:28 -05:00
Pavel Djundik
6831b0ffdc
Fix authcid variable name 2019-12-24 19:33:33 +02:00
Shivaram Lingamneni
358c4b7d81 implement draft/multiline 2019-12-24 09:29:54 -05:00
Shivaram Lingamneni
de6d1ad555
Merge pull request #706 from oragono/l10n_master
New Crowdin translations
2019-12-24 07:49:40 -05:00
Daniel Oaks
cf5bd597cc New translations irc.lang.json (Romanian) 2019-12-24 14:41:41 +10:00
Shivaram Lingamneni
ec8b25e236
Merge pull request #703 from slingamn/issue702
fix #702
2019-12-23 11:36:06 -05:00
Shivaram Lingamneni
7a6925fa3f Merge remote-tracking branch 'origin/master' into issue702 2019-12-23 11:32:15 -05:00
Shivaram Lingamneni
bf5a02f077
Merge pull request #692 from slingamn/issue683_channelpurge.1
chanserv enhancements and miscellaneous fixes
2019-12-22 10:41:24 -05:00
Shivaram Lingamneni
4391b1ba5a restrict ASCII mode to printable characters only 2019-12-22 09:57:49 -05:00
Shivaram Lingamneni
781bb6b051 more systematic bad-character check in permissive mode 2019-12-22 09:31:51 -05:00
Shivaram Lingamneni
2d4dbeba1c disallow some bad characters in foldPermissive 2019-12-22 09:19:28 -05:00
Shivaram Lingamneni
76a8768d05 make rehash-enable logic a little more uniform 2019-12-22 08:42:56 -05:00
Shivaram Lingamneni
bd6c2117e8 fix analogous issue for history
History couldn't be enabled by rehash if autoresize-window was nonzero.
2019-12-22 08:11:24 -05:00
Shivaram Lingamneni
26ca016c66 fix the analogous issue for vhosts 2019-12-21 20:26:40 -05:00
Shivaram Lingamneni
25c4eb2996 fix #702 2019-12-21 20:19:19 -05:00
Shivaram Lingamneni
0df25e0e30 remove redundant error check 2019-12-19 18:41:46 -05:00
Shivaram Lingamneni
c4e66d8b83
Merge pull request #698 from slingamn/issue616_prefs.2
fix #616
2019-12-19 18:38:18 -05:00
Shivaram Lingamneni
9bc5fb78cf
Merge pull request #700 from slingamn/issue347_snomasks
fix #347
2019-12-19 18:35:19 -05:00
Shivaram Lingamneni
8720287f3a
Merge pull request #697 from slingamn/issue696_opercertfp.1
fix #696
2019-12-19 18:34:52 -05:00
Shivaram Lingamneni
01488bfe2e slightly more defensive implementation of /OPER check 2019-12-19 18:30:19 -05:00
Shivaram Lingamneni
78da024b24 improve an error message 2019-12-19 09:30:49 -05:00
Shivaram Lingamneni
0c33c3399f fix #347 2019-12-19 09:27:54 -05:00
Shivaram Lingamneni
b717402b5e implement review feedback
1. If both fingerprint and hash are specified, require both instead of either
2. Implement auto-oper on connect
2019-12-19 06:33:43 -05:00
Shivaram Lingamneni
6033d9f569 tweaks for consistency 2019-12-18 20:33:58 -05:00
Shivaram Lingamneni
98e83b0a82 add clarifying comments 2019-12-18 17:53:12 -05:00
Shivaram Lingamneni
6740222ecb fix #616 2019-12-18 17:38:14 -05:00
Shivaram Lingamneni
e143aaa83f fix #696 2019-12-18 16:04:43 -05:00
Shivaram Lingamneni
82e965db39 avoid yaml barewords 2019-12-18 12:29:57 -05:00
Shivaram Lingamneni
f9b5224ae0 have realSkeleton use cases.Fold as well 2019-12-18 12:26:09 -05:00
Shivaram Lingamneni
91d6888b7e fix #693 2019-12-18 12:26:09 -05:00
Shivaram Lingamneni
ab444a3980 remove unnecessary uses of Casefold 2019-12-18 12:21:03 -05:00
Shivaram Lingamneni
9d56677691
Merge pull request #694 from slingamn/issue688_forward_confirmed_dns.4
#688: forward-confirmed reverse dns
2019-12-18 10:22:50 -05:00
Shivaram Lingamneni
f1e2bbc0e4 more permissive hostname validation
In particular, allow hostnames without periods (like on a LAN).
This shouldn't be a client compability concern since we allow
vhosts without periods.
2019-12-18 09:21:45 -05:00
Shivaram Lingamneni
4b37b5dd3e tweak to avoid a potential data race 2019-12-17 19:57:23 -05:00
Shivaram Lingamneni
b468baa959 allow NS SESSIONS targeting yourself 2019-12-17 19:37:33 -05:00
Shivaram Lingamneni
3480f124cd fix #688 2019-12-17 19:37:33 -05:00
Shivaram Lingamneni
c5a81d59ff fix #581 2019-12-17 13:21:26 -05:00
Shivaram Lingamneni
07865b8f63 chanserv enhancements and miscellaneous fixes
* Fix #684
* Fix #683
* Add `CHANSERV CLEAR`
* Allow mode changes from channel founders even when they aren't joined
* Operators with the chanreg capability are exempt from max-channels-per-account
* Small fixes and cleanup
2019-12-16 20:06:52 -05:00
Shivaram Lingamneni
62473468f0
Merge pull request #686 from slingamn/saregister_documentation
document relationship between registration.enabled and saregister
2019-12-13 15:54:53 -05:00
Shivaram Lingamneni
96a1434ab4 document relationship between registration.enabled and saregister 2019-12-08 20:58:53 -05:00
Shivaram Lingamneni
0da2d0036a
Merge pull request #681 from slingamn/issue679_stacktrace.4
Assorted fixes
2019-12-08 02:56:36 -05:00
Shivaram Lingamneni
438d1f0488 fix bad ERR_WASNOSUCHNICK responses 2019-12-05 08:31:17 -05:00
Shivaram Lingamneni
bcc58be8af remove some redundant casefolds 2019-12-05 07:44:28 -05:00
Shivaram Lingamneni
08f351060e fix #682 2019-12-05 07:29:27 -05:00
Shivaram Lingamneni
0880f20f4b fix analogous invalid parameters for ERR_NOSUCHNICK 2019-12-05 06:52:07 -05:00
Shivaram Lingamneni
aa8579b6e8 Assorted fixes
* Fix #679 (borked reply to `JOIN #chan,\r\n`)
* Replace invalid error parameters with *'s in various places
* Fix PART with no message sending an empty trailing parameter to the channel
* Fix some error responses not getting labeled
2019-12-02 21:13:09 -05:00
Shivaram Lingamneni
fec1139dc8
Merge pull request #673 from slingamn/proxytls.18
fix #561, take two
2019-11-23 22:09:45 -05:00
Shivaram Lingamneni
c6bd0aea8d
Merge pull request #672 from slingamn/issue671
fix #671
2019-11-23 22:09:37 -05:00
Shivaram Lingamneni
7f80f1b5ad
Merge pull request #669 from slingamn/connectionlimits.4
fix #646
2019-11-23 22:09:30 -05:00
Shivaram Lingamneni
6ee083b6c5 review fix 2019-11-23 22:06:51 -05:00
Shivaram Lingamneni
2d456c2106 review feedback: rename a key 2019-11-23 22:01:24 -05:00
Shivaram Lingamneni
41497c1b51 review fixes 2019-11-23 21:10:34 -05:00
Shivaram Lingamneni
667e6cb6ef
Merge pull request #676 from slingamn/typofixen
fix typos
2019-11-23 17:48:21 -05:00
Shivaram Lingamneni
389f936e82 fix typos 2019-11-23 17:47:52 -05:00
Shivaram Lingamneni
d1615da7f1
Merge pull request #674 from csmith/merge-docker
Merge docker files from oragono-docker repository
2019-11-22 13:39:20 -05:00
Chris Smith
69e1dea224
Fix ports in the docker instructions
-P/--publish-all publishes the container ports on a random
host port, which you have to look up using `docker port`.

In the common case they should be published on the same ports.
2019-11-22 18:06:51 +00:00
Chris Smith
8228cb4b0d
Add docker section to the manual 2019-11-22 18:05:44 +00:00
Chris Smith
68a8f4b698
Merge in files from docker repository.
This will allow easier building on docker hub and let us automatically
publish tags for each release.

Fixes oragono/oragono-docker#20
2019-11-22 17:48:53 +00:00
Shivaram Lingamneni
7432ef07a7 rename some variables for clarity 2019-11-20 17:43:45 -05:00
Shivaram Lingamneni
50783d5276 fix #561, take 2 2019-11-20 17:35:35 -05:00
Shivaram Lingamneni
42db1778ac unexport rawLimiterConfig 2019-11-18 17:30:54 -05:00
Shivaram Lingamneni
babd8b1da9 fix #671 2019-11-18 17:21:28 -05:00
Shivaram Lingamneni
4050b6571a fix #646
Includes a partially backwards-incompatible config change
2019-11-18 01:47:18 -05:00
Shivaram Lingamneni
5cce365092
Merge pull request #668 from slingamn/deps
Deps
2019-11-16 19:00:33 -05:00
Shivaram Lingamneni
6be11b9e83 update developing.md 2019-11-16 18:52:15 -05:00
Shivaram Lingamneni
149c9b45e8 bump version 2019-11-16 18:49:30 -05:00
Shivaram Lingamneni
0ee8206c21 bump to merged hash 2019-11-16 18:48:52 -05:00
Shivaram Lingamneni
8467654f7d update dependencies 2019-11-16 18:46:10 -05:00
Shivaram Lingamneni
0d77315a8d
Merge pull request #667 from slingamn/release
bump version and changelog
2019-11-16 18:22:59 -05:00
Shivaram Lingamneni
d1ed5e4cbf bump version and changelog 2019-11-16 18:14:20 -05:00
Shivaram Lingamneni
ff4fd3a786 add a note about announcements 2019-11-13 23:05:19 -05:00
Shivaram Lingamneni
cbb3fe51b9
Merge pull request #664 from slingamn/sort_defs.2
tweaks to cap listing
2019-11-13 16:50:12 -05:00
Shivaram Lingamneni
cb801e0c26
Merge pull request #660 from slingamn/manual_update
add manual entry for private channels
2019-11-10 13:41:35 -05:00
Shivaram Lingamneni
bd86e51f42
Merge pull request #663 from oragono/l10n_master
New Crowdin translations
2019-11-10 00:26:41 -05:00
Shivaram Lingamneni
ae9aecbbb0 increase max cap line length
Workaround for #661: this makes the `CAP LS 302` line from the default config
fit on a single line, as long as the server name is at most 35 characters.
2019-11-09 22:43:07 -05:00
Shivaram Lingamneni
a75d26a46b refactor cap line splitting 2019-11-09 20:31:39 -05:00
Daniel Oaks
c2084f8660 New translations translation.lang.yaml (Spanish) 2019-11-10 04:51:42 +10:00
Daniel Oaks
b45bcebd99 New translations help.lang.json (Spanish) 2019-11-09 16:41:41 +10:00
Daniel Oaks
904131cda6 New translations irc.lang.json (Spanish) 2019-11-09 16:41:40 +10:00
Daniel Oaks
f875f001d6 New translations nickserv.lang.json (Spanish) 2019-11-09 16:41:38 +10:00
Daniel Oaks
793f3415dc New translations irc.lang.json (Spanish) 2019-11-09 04:45:36 +10:00
Shivaram Lingamneni
b7076f4c9e
Merge pull request #662 from oragono/l10n_master
New Crowdin translations
2019-11-07 21:20:13 -08:00
Daniel Oaks
7ed5f5f319 New translations irc.lang.json (Spanish) 2019-11-08 13:01:36 +10:00
Shivaram Lingamneni
74ab52d6e4 update tor guidelines 2019-11-07 14:05:35 -05:00
Shivaram Lingamneni
81d495cf95
Merge pull request #659 from oragono/l10n_master
New Crowdin translations
2019-11-07 10:39:12 -08:00
Shivaram Lingamneni
33d7e019d7 add manual entry for private channels 2019-11-07 13:38:13 -05:00
Daniel Oaks
8a9915e1f1 New translations help.lang.json (Spanish) 2019-11-08 00:58:26 +10:00
Daniel Oaks
efbb491995 New translations irc.lang.json (Spanish) 2019-11-08 00:58:25 +10:00
Shivaram Lingamneni
2300cf89e8
Merge pull request #658 from oragono/l10n_master
New Crowdin translations
2019-11-07 00:12:38 -08:00
Daniel Oaks
0d927e5281 New translations irc.lang.json (Spanish) 2019-11-07 12:51:43 +10:00
Shivaram Lingamneni
cd7ff5ce2b
Merge pull request #656 from slingamn/release
changelog entries for 1.2.0-rc1
2019-11-03 17:57:40 -08:00
Shivaram Lingamneni
2df63b74b0 fix translator credit 2019-11-03 19:46:51 -05:00
Shivaram Lingamneni
507740464a bump version 2019-11-03 12:39:13 -05:00
Shivaram Lingamneni
c2ea974fc6 changelog improvements 2019-11-03 12:38:46 -05:00
Shivaram Lingamneni
e624756339 update changelog for 1.2.0-rc1 2019-11-03 05:29:34 -05:00
Shivaram Lingamneni
0d635ce5c3 import v1.1.1 changelog 2019-11-03 03:13:50 -05:00
Shivaram Lingamneni
d6b55c17d8
Merge pull request #655 from oragono/l10n_master
New Crowdin translations
2019-10-27 20:54:55 -07:00
Daniel Oaks
95942e2f7b New translations nickserv.lang.json (Spanish) 2019-10-27 21:41:37 +10:00
Shivaram Lingamneni
9495362785
Merge pull request #654 from slingamn/issue652
fix #652
2019-10-23 20:56:16 -07:00
Shivaram Lingamneni
b6cdb51f00 fix #652 2019-10-23 11:32:32 -04:00
Shivaram Lingamneni
97be7cccd3
Merge pull request #653 from slingamn/simplifications
remove unnecessary special-casing for ASCII
2019-10-22 23:36:02 -07:00
Shivaram Lingamneni
baa71ba2be remove unnecessary special-casing for ASCII 2019-10-23 02:18:45 -04:00
Shivaram Lingamneni
607da61bf9
Merge pull request #650 from slingamn/issue644_bans.5
two mode-related fixes
2019-10-22 23:14:13 -07:00
Shivaram Lingamneni
82c5041225 fix #649 2019-10-16 18:10:32 -04:00
Shivaram Lingamneni
332f0d8d91 fix #644 2019-10-16 12:51:40 -04:00
Shivaram Lingamneni
89974020ea
Merge pull request #648 from oragono/l10n_master
New Crowdin translations
2019-10-13 12:25:00 -07:00
Daniel Oaks
6ef0b2c141 New translations help.lang.json (Spanish) 2019-10-13 17:41:41 +10:00
Daniel Oaks
34956d765a New translations irc.lang.json (Spanish) 2019-10-13 17:41:39 +10:00
Shivaram Lingamneni
cddc51d6cf
Merge pull request #640 from slingamn/issue639_emptystruct.1
make semaphores O(1) in storage
2019-10-12 18:13:07 -07:00
Daniel Oaks
6f9939dfc6
Merge pull request #647 from oragono/l10n_master
New Crowdin translations
2019-10-13 09:42:04 +10:00
Daniel Oaks
025882ba7e New translations irc.lang.json (Spanish) 2019-10-13 05:42:02 +10:00
Daniel Oaks
1483879a1c Fix smol typo 2019-10-12 07:44:42 +10:00
Shivaram Lingamneni
49ba162c76
Merge pull request #643 from slingamn/issue642
fix #642
2019-10-05 21:07:37 -07:00
Shivaram Lingamneni
24c103da5a fix #642 2019-10-05 23:50:11 -04:00
Shivaram Lingamneni
575fcd4aeb
Merge pull request #641 from slingamn/getters
remove unused getters
2019-10-03 23:17:48 -07:00
Shivaram Lingamneni
40df122c73 remove unused getters 2019-10-04 02:08:49 -04:00
Shivaram Lingamneni
45476079a1 make semaphores O(1) in storage 2019-10-03 00:03:00 -04:00
Shivaram Lingamneni
7ef55c654a
Merge pull request #633 from slingamn/issue632
fix #632
2019-09-24 23:21:16 -07:00
Shivaram Lingamneni
06b1e7b603 fix #632 2019-09-24 21:47:37 -04:00
Shivaram Lingamneni
1b0e9a0c08
Merge pull request #630 from slingamn/issue625
fix #625
2019-09-22 20:19:11 -07:00
Shivaram Lingamneni
c1acf3ea43 move ISUPPORT regeneration to the end of config loading 2019-09-22 17:26:50 -04:00
Shivaram Lingamneni
1ce716582a make CHANTYPES a constant 2019-09-22 15:48:17 -04:00
Shivaram Lingamneni
584f2261a8 fix #625 2019-09-22 15:45:06 -04:00
Shivaram Lingamneni
439af6d3cb
Merge pull request #627 from slingamn/issue626
upgrade golang to 1.13
2019-09-14 17:41:38 -07:00
Shivaram Lingamneni
2a4291ef9b upgrade golang to 1.13
Fixes #626
2019-09-14 20:31:17 -04:00
Shivaram Lingamneni
f615809d03
Merge pull request #623 from slingamn/issue622.1
fix #622
2019-09-12 02:43:41 -07:00
Shivaram Lingamneni
04b25eb6bf fix #622 2019-09-11 20:18:47 -04:00
Shivaram Lingamneni
542177213e
Merge pull request #619 from slingamn/issue448.3
Fix #448, #594
2019-09-08 03:36:24 -07:00
Shivaram Lingamneni
3cb9234bb5 review fixes 2019-09-08 06:28:48 -04:00
Shivaram Lingamneni
f6eb8fa5a1 fix #197 2019-09-01 02:36:56 -04:00
Shivaram Lingamneni
8a33d68cf1 add cap-notify for bouncer 2019-08-31 22:42:51 -04:00
Shivaram Lingamneni
ca17e58b3a fix #595 2019-08-31 21:29:23 -04:00
Shivaram Lingamneni
7ed27d4a42 Fix #448, #594 2019-08-27 03:58:04 -04:00
Daniel Oaks
014a5fe63c
Merge pull request #615 from slingamn/sessions_optimization
optimize Sessions() at the expense of AddSession()
2019-08-25 09:57:51 +10:00
Shivaram Lingamneni
65834c0729 optimize Sessions() at the expense of AddSession() 2019-08-02 00:20:31 -04:00
Daniel Oaks
8bca8a1752
Merge pull request #606 from slingamn/issue331.1
fix #331
2019-07-31 06:37:23 +10:00
Daniel Oaks
7a56c4e0ad
Merge pull request #591 from slingamn/history_autoresize.4
autoresizing of history buffers (#349)
2019-07-31 06:36:35 +10:00
Shivaram Lingamneni
df6fa21fbb
Merge pull request #614 from oragono/l10n_master
New Crowdin translations
2019-07-30 16:30:45 -04:00
Daniel Oaks
4e0c2c0c2c New translations irc.lang.json (German) 2019-07-30 04:32:28 +10:00
Shivaram Lingamneni
f092c1ca90
Merge pull request #612 from oragono/l10n_master
New Crowdin translations
2019-07-24 15:49:57 -04:00
Daniel Oaks
54f23f5449 New translations chanserv.lang.json (Chinese Simplified) 2019-07-24 15:11:39 +10:00
Daniel Oaks
638e6e56d9 New translations chanserv.lang.json (Chinese Simplified) 2019-07-24 03:12:13 +10:00
Shivaram Lingamneni
b2725104b7
Merge pull request #611 from oragono/l10n_master
New Crowdin translations
2019-07-22 23:41:04 -04:00
Daniel Oaks
d449cf9a74 New translations hostserv.lang.json (French) 2019-07-23 13:31:30 +10:00
Daniel Oaks
7ee03e04bd New translations hostserv.lang.json (French) 2019-07-23 01:30:14 +10:00
Daniel Oaks
7968a7c1c7 New translations chanserv.lang.json (French) 2019-07-23 01:30:12 +10:00
Shivaram Lingamneni
2dc1e63c46
Merge pull request #608 from oragono/l10n_master
New Crowdin translations
2019-07-17 18:10:47 -04:00
Daniel Oaks
5cb14cec57 New translations chanserv.lang.json (French) 2019-07-17 04:43:44 +10:00
Daniel Oaks
4219c45d61 New translations irc.lang.json (French) 2019-07-17 04:43:42 +10:00
Shivaram Lingamneni
938ce7e435 fix #331 2019-07-14 16:17:37 -04:00
Daniel Oaks
07bb38ecdf
Merge pull request #601 from slingamn/spurious_message
fix spurious error message
2019-07-14 12:57:09 +10:00
Daniel Oaks
15247bbeb3
Merge pull request #605 from slingamn/issue602
bump irc-go; fixes #602
2019-07-14 12:56:53 +10:00
Shivaram Lingamneni
d5329a6c58 bump irc-go; fixes #602 2019-07-13 22:49:21 -04:00
Daniel Oaks
54b22d556c
Merge pull request #603 from slingamn/issue565_followup
remove obsolete consistency check
2019-07-13 10:12:44 +10:00
Shivaram Lingamneni
ce651b4a90 remove obsolete consistency check
tor-listeners.listeners was checked against listen,
but listen is obsolete now, so config load would fail
on a config that used the new style `listeners` instead of
`listen` --- unless tor-listeners.listeners was empty, which
it should be under the new style, but there's no need to enforce
that
2019-07-12 15:19:43 -04:00
Shivaram Lingamneni
80aa77372b fix spurious error message 2019-07-12 11:49:01 -04:00
Shivaram Lingamneni
ecf945038f
Merge pull request #565 from slingamn/listener_refactor.3
refactor listener config loading
2019-07-12 11:08:04 -04:00
Shivaram Lingamneni
86ad402203 review feedback 2019-07-12 09:58:14 -04:00
Shivaram Lingamneni
3fa1c526a6 restore default plaintext listener 2019-07-12 09:53:58 -04:00
Daniel Oaks
dc87ae7ef1
Merge pull request #583 from slingamn/stats.4
fix #526
2019-07-12 23:39:50 +10:00
Daniel Oaks
b396d41375
Merge pull request #585 from slingamn/samode_bug
fix bugs affecting SAMODE on other users
2019-07-12 23:31:38 +10:00
Daniel Oaks
23974af345
Merge pull request #588 from slingamn/servicehelp.5
refactor /HELP for services
2019-07-12 23:30:50 +10:00
Daniel Oaks
5cff9bb636
Merge pull request #593 from slingamn/issue592
fix #592
2019-07-12 23:27:34 +10:00
Daniel Oaks
8974cffe2d
Merge pull request #598 from slingamn/issue572.2
fix #572
2019-07-12 23:26:32 +10:00
Shivaram Lingamneni
dbde0e0b3e
Merge pull request #597 from oragono/l10n_master
New Crowdin translations
2019-07-08 22:54:20 -04:00
Shivaram Lingamneni
bbf6c4a269 fix #572 2019-07-08 22:04:53 -04:00
Daniel Oaks
b3959cb891 New translations irc.lang.json (French) 2019-07-09 10:22:02 +10:00
Shivaram Lingamneni
fda630ec8b
Merge pull request #596 from oragono/l10n_master
New Crowdin translations
2019-07-08 19:18:31 -04:00
Daniel Oaks
5e3a63d803 New translations irc.lang.json (French) 2019-07-08 22:24:14 +10:00
Shivaram Lingamneni
cbabccc2f8 fix #592 2019-07-04 07:05:38 -04:00
Shivaram Lingamneni
ab7f8de66d
Merge pull request #589 from oragono/l10n_master
New Crowdin translations
2019-07-03 22:05:27 -04:00
Shivaram Lingamneni
6e9a728354 autoresizing of history buffers (#349) 2019-07-03 21:08:37 -04:00
Daniel Oaks
76c876de10 New translations irc.lang.json (French) 2019-07-03 16:23:10 +10:00
Daniel Oaks
90b8f1b792 New translations irc.lang.json (French) 2019-07-03 04:22:00 +10:00
Shivaram Lingamneni
1c583d775c refactor /HELP for services
1. DRY "banner" descriptions of each services
2. `/HELP NICKSERV` now refers the user to `/NICKSERV HELP`, etc.
3. Fix double translation of `textGenerator` output
2019-07-02 12:48:33 -04:00
Shivaram Lingamneni
6a3d2733d6 fix bugs affecting SAMODE on other users
1. Your own snomasks would be reported as belonging to the other user
2. Prefixes were incorrect
2019-07-02 08:45:14 -04:00
Shivaram Lingamneni
7761323f01
Merge pull request #584 from oragono/l10n_master
New Crowdin translations
2019-07-02 00:48:55 -04:00
Daniel Oaks
aa8a174678 New translations help.lang.json (German) 2019-07-02 09:41:33 +10:00
Daniel Oaks
a54285788f New translations hostserv.lang.json (German) 2019-07-02 09:41:31 +10:00
Daniel Oaks
bebac21a9a New translations nickserv.lang.json (German) 2019-07-02 09:41:30 +10:00
Daniel Oaks
6aee3c4ab3 New translations chanserv.lang.json (German) 2019-07-02 09:41:29 +10:00
Daniel Oaks
a5687c2df7 New translations irc.lang.json (German) 2019-07-02 09:41:28 +10:00
Shivaram Lingamneni
5a554ab4b0 fix #526 2019-07-01 09:21:38 -04:00
Daniel Oaks
c96cec9388
Merge pull request #580 from oragono/l10n_master
New Crowdin translations
2019-07-01 21:44:35 +10:00
Daniel Oaks
1155d2ee6c New translations nickserv.lang.json (German) 2019-07-01 21:42:33 +10:00
Daniel Oaks
14537fada7
Merge pull request #578 from slingamn/issue567
fix #567
2019-07-01 09:33:44 +10:00
Daniel Oaks
93a3cc3231
Merge pull request #577 from slingamn/vendor_update
update dependencies
2019-07-01 09:33:28 +10:00
Shivaram Lingamneni
5bb189c6aa
Merge pull request #579 from oragono/l10n_master
New Crowdin translations
2019-06-29 23:47:40 -04:00
Daniel Oaks
6c85d20504 New translations irc.lang.json (French) 2019-06-29 16:21:40 +10:00
Shivaram Lingamneni
22c298d337 fix #567 2019-06-28 16:40:51 -04:00
Shivaram Lingamneni
d6668008f3
Merge pull request #576 from oragono/l10n_master
New Crowdin translations
2019-06-28 15:00:37 -04:00
Shivaram Lingamneni
45a91ee992 bump go-colorable up a version 2019-06-28 14:59:21 -04:00
Shivaram Lingamneni
b02fb9b935 update dependencies 2019-06-28 14:53:00 -04:00
Shivaram Lingamneni
68e9a48860 more uniform language 2019-06-28 14:48:54 -04:00
Shivaram Lingamneni
eee0747e5e new format for listener section 2019-06-28 14:43:53 -04:00
Daniel Oaks
a586ba1dde New translations irc.lang.json (French) 2019-06-29 04:22:53 +10:00
Shivaram Lingamneni
cfe991a335 Merge remote-tracking branch 'origin/master' into listener_refactor.4 2019-06-28 09:05:07 -04:00
Daniel Oaks
a5d09c932c
Merge pull request #557 from slingamn/issue555.2
upgrade to draft/labeled-response-0.2
2019-06-28 22:18:42 +10:00
Daniel Oaks
9ce3bed4a2 Setup v1.2.0-unreleased devel ver 2019-06-28 22:17:43 +10:00
Shivaram Lingamneni
2deaad6de1
Merge pull request #575 from oragono/release
final changes for release
2019-06-27 23:01:00 -04:00
Shivaram Lingamneni
1d7e3c5f32 another tweak 2019-06-27 22:59:01 -04:00
Shivaram Lingamneni
7b6e5e4348 tweak translator credits 2019-06-27 22:52:20 -04:00
Shivaram Lingamneni
5789c9b433
Merge pull request #574 from oragono/l10n_master
New Crowdin translations
2019-06-27 22:52:06 -04:00
Daniel Oaks
dccb46022d New translations translation.lang.yaml (French) 2019-06-28 12:51:32 +10:00
Daniel Oaks
5c01d5bc71 Add translator credits 2019-06-28 12:45:12 +10:00
Shivaram Lingamneni
b45dfbc09f add missing bugreport credits 2019-06-25 23:09:37 -04:00
Shivaram Lingamneni
cf045f7d2c changelog updates 2019-06-25 23:07:39 -04:00
Shivaram Lingamneni
57821c865a bump version to 1.1.0 2019-06-25 19:59:04 -04:00
Shivaram Lingamneni
0dc29f4480
Merge pull request #573 from oragono/l10n_master
New Crowdin translations
2019-06-24 19:49:16 -04:00
Daniel Oaks
c015616ba9 New translations irc.lang.json (French) 2019-06-25 08:22:17 +10:00
Daniel Oaks
609e1aeb94
Merge pull request #570 from slingamn/confusables_lastlook
remove m -> rn mapping
2019-06-25 02:15:55 +10:00
Daniel Oaks
16fa21d758
Merge pull request #571 from slingamn/issue563
fix #563
2019-06-24 20:45:13 +10:00
Shivaram Lingamneni
08d346ce50 make release should depend on deps 2019-06-24 06:32:57 -04:00
Shivaram Lingamneni
804efaa914 set wrap_in_directory, fixes #563 2019-06-24 06:30:54 -04:00
Shivaram Lingamneni
64be1e0bd3
Merge pull request #569 from oragono/l10n_master
New Crowdin translations
2019-06-24 06:25:05 -04:00
Daniel Oaks
9d2ecd4856 New translations irc.lang.json (French) 2019-06-24 20:23:21 +10:00
Shivaram Lingamneni
24c46235a3 remove m -> rn skeleton mapping again 2019-06-24 06:23:10 -04:00
Shivaram Lingamneni
ee08419f4a bump vendor 2019-06-24 06:23:10 -04:00
Daniel Oaks
c65c7de736
Merge pull request #564 from slingamn/confusables_again.1
more systematic fix for #562
2019-06-24 14:33:17 +10:00
Shivaram Lingamneni
4e9c0fbc00 revert vendor changes 2019-06-24 00:29:44 -04:00
Shivaram Lingamneni
b075ea6eb9 use regular Skeleton instead of SkeletonTweaked
dan: "I probably wouldn't expect those mappings to cause much
trouble at all for legitimate users at the end of the day"

shivaram: [concurs]
2019-06-24 00:16:42 -04:00
Shivaram Lingamneni
990d76923c bump vendor again 2019-06-23 15:54:33 -04:00
Daniel Oaks
ad55cf998c
Merge pull request #566 from slingamn/changelog_again
manual and changelog updates for #563
2019-06-24 05:06:20 +10:00
Shivaram Lingamneni
a21e91bda7 refer manual db upgraders to the manual 2019-06-20 00:33:19 -04:00
Shivaram Lingamneni
29b1dd37a8 manual and changelog updates for #563 2019-06-20 00:24:42 -04:00
Shivaram Lingamneni
5d0b8390e9 refactor listener config loading 2019-06-19 22:33:15 -04:00
Shivaram Lingamneni
6e9a31a574 use confusables.SkeletonTweaked to fix the test 2019-06-19 05:24:09 -04:00
Shivaram Lingamneni
f17777995b add a new test 2019-06-19 04:53:15 -04:00
Daniel Oaks
0a67963f43
Merge pull request #562 from slingamn/impersonation
fix an edge case in skeletonization
2019-06-18 17:28:35 +10:00
Shivaram Lingamneni
be4d098945 fix an edge case in skeletonization
'm' skeletonizes to 'rn' (but is exempted by the isBoring check),
but the fullwidth 'm' does not skeletonize to anything. The root cause
of this is the (still unexplained) patchiness of the skeleton mapping
for fullwidth -> standard-width Latin characters; the fix is to perform
width mapping first, before either skeletonization or isBoring.
2019-06-18 02:34:16 -04:00
Shivaram Lingamneni
8991846fcf
Merge pull request #559 from oragono/l10n_master
New Crowdin translations
2019-06-17 03:59:32 -04:00
Daniel Oaks
f7520fbf21 New translations irc.lang.json (German) 2019-06-17 08:22:11 +10:00
Daniel Oaks
f64fd1be12 New translations irc.lang.json (German) 2019-06-16 20:22:11 +10:00
Shivaram Lingamneni
f00a9b2d8c
Merge pull request #558 from oragono/l10n_master
New Crowdin translations
2019-06-15 22:43:31 -04:00
Daniel Oaks
d0abc33803 New translations help.lang.json (Romanian) 2019-06-16 01:32:29 +10:00
Daniel Oaks
f7c53b8a56 New translations irc.lang.json (Romanian) 2019-06-16 01:32:28 +10:00
Daniel Oaks
960fa94963 New translations irc.lang.json (Romanian) 2019-06-15 13:31:42 +10:00
Shivaram Lingamneni
8dca545264 consolidate some time-setting code 2019-06-13 07:24:38 -04:00
Shivaram Lingamneni
34f11ddb97 implement draft/labeled-response-0.2 2019-06-13 07:24:38 -04:00
Daniel Oaks
3e76d2cc47
Merge pull request #556 from oragono/l10n_master
New Crowdin translations
2019-06-13 09:19:16 +10:00
Daniel Oaks
66dd06d191 New translations irc.lang.json (French) 2019-06-13 07:22:16 +10:00
Shivaram Lingamneni
60d5586099 bump to 1.1.0-rc1 2019-06-12 05:25:10 -04:00
Shivaram Lingamneni
546d52d4eb
Merge pull request #553 from oragono/changelog
manual and changelog updates
2019-06-12 05:23:19 -04:00
Daniel Oaks
02d9934ebd Editing, make changelog and manual easier to read 2019-06-12 19:11:39 +10:00
Shivaram Lingamneni
3f5d59838e recommend fakelag=true 2019-06-12 03:40:14 -04:00
Shivaram Lingamneni
5e077209f5
Merge pull request #554 from oragono/l10n_master
New Crowdin translations
2019-06-11 20:50:51 -04:00
Daniel Oaks
c185a9e955 New translations nickserv.lang.json (German) 2019-06-12 06:30:24 +10:00
Daniel Oaks
ae632830b9 New translations chanserv.lang.json (German) 2019-06-12 06:30:22 +10:00
Shivaram Lingamneni
e879e89e91 fix references to release candidate 2019-06-11 04:24:00 -04:00
Shivaram Lingamneni
9fc38cc2a7 add changelog update for #537 2019-06-11 01:00:12 -04:00
Daniel Oaks
20f0bfc9be
Merge pull request #551 from oragono/l10n_master
New Crowdin translations
2019-06-11 01:57:26 +10:00
Daniel Oaks
aea0ddfe8d New translations translation.lang.yaml (German) 2019-06-11 01:57:02 +10:00
Daniel Oaks
3e4e467bba New translations irc.lang.json (English, Australia) 2019-06-10 23:45:55 +10:00
Daniel Oaks
279d7e3fb1 New translations irc.lang.json (German) 2019-06-10 23:45:42 +10:00
Daniel Oaks
ef3c3aa84f
Merge pull request #550 from oragono/l10n_master
New Crowdin translations
2019-06-10 18:00:30 +10:00
Daniel Oaks
8f8b57951e New translations irc.lang.json (German) 2019-06-10 17:23:27 +10:00
Daniel Oaks
7bbfc23351 New translations irc.lang.json (German) 2019-06-10 05:22:45 +10:00
Daniel Oaks
4b5c612e56 New translations help.lang.json (Romanian) 2019-06-10 05:22:43 +10:00
Daniel Oaks
655f1f6f54
Merge pull request #538 from slingamn/issue537.1
fix #537
2019-06-10 01:14:32 +10:00
Daniel Oaks
dc322f8fd4
Merge pull request #546 from slingamn/issue536.3
fix #536
2019-06-10 01:13:02 +10:00
Daniel Oaks
4a4bf8612b
Merge pull request #525 from slingamn/autobrb.8
hopefully the last round of resume/brb fixes before the release
2019-06-10 01:12:40 +10:00
Daniel Oaks
cb785252e0
Merge pull request #548 from oragono/l10n_master
New Crowdin translations
2019-06-09 21:45:48 +10:00
Daniel Oaks
9e79468a15 New translations help.lang.json (Romanian) 2019-06-09 17:22:28 +10:00
Daniel Oaks
3ec367007b New translations irc.lang.json (French) 2019-06-09 04:23:07 +10:00
Daniel Oaks
594790243b New translations irc.lang.json (French) 2019-06-08 16:23:05 +10:00
Shivaram Lingamneni
96f4c5ca30 try to clarify that localhost includes all loopback 2019-06-07 05:40:10 -04:00
Shivaram Lingamneni
b9aebfc05e
Merge pull request #547 from oragono/l10n_master
New Crowdin translations
2019-06-07 05:34:03 -04:00
Daniel Oaks
4a1868d8aa New translations irc.lang.json (French) 2019-06-07 16:03:39 +10:00
Shivaram Lingamneni
687b6f0599
Merge pull request #545 from oragono/l10n_master
New Crowdin translations
2019-06-06 14:56:47 -04:00
Daniel Oaks
0a780ed523 New translations irc.lang.json (French) 2019-06-07 04:05:27 +10:00
Daniel Oaks
dc6283f1b0 New translations irc.lang.json (French) 2019-06-03 16:33:20 +10:00
Shivaram Lingamneni
59906ec1a5 more manual and changelog updates 2019-06-02 22:00:24 -04:00
Shivaram Lingamneni
1f5ba86b28
Merge pull request #544 from oragono/l10n_master
New Crowdin translations
2019-06-02 18:03:33 -04:00
Daniel Oaks
6475bfe899 New translations irc.lang.json (French) 2019-06-03 04:32:00 +10:00
Daniel Oaks
ffdf996a2b New translations help.lang.json (Romanian) 2019-06-03 04:31:58 +10:00
Daniel Oaks
e45026a511 New translations irc.lang.json (Romanian) 2019-06-03 04:31:57 +10:00
Shivaram Lingamneni
b55c6858fc
Merge pull request #542 from oragono/l10n_master
New Crowdin translations
2019-06-02 03:45:03 -04:00
Daniel Oaks
0bce1f8ed4 New translations chanserv.lang.json (Romanian) 2019-06-02 16:21:43 +10:00
Shivaram Lingamneni
321c437499 fix #536 2019-05-31 14:39:21 -04:00
Shivaram Lingamneni
b36830de47 stop claiming semver
Feel free to revert this one, but IMO we're not actually doing semver
2019-05-31 05:50:49 -04:00
Shivaram Lingamneni
367c14ddfe schema changes 2019-05-31 05:45:34 -04:00
Shivaram Lingamneni
e1686cf2bc message-tags and msgids should be a highlight 2019-05-31 01:43:23 -04:00
Shivaram Lingamneni
e15d00a1f6 correct obsolete reference to help-enforce 2019-05-30 21:14:33 -04:00
Shivaram Lingamneni
7a8876e796 change nick reservation recommendation 2019-05-30 21:13:39 -04:00
Shivaram Lingamneni
67f841e009 changelog and documentation updates for 1.1.0rc1 2019-05-30 21:10:16 -04:00
Shivaram Lingamneni
4350b92bef fix KILL etc. for BRB'ed clients 2019-05-30 18:49:03 -04:00
Shivaram Lingamneni
3b71be3bf0 fix #537 2019-05-30 05:40:18 -04:00
Daniel Oaks
a521be8119
Merge pull request #534 from slingamn/issue380.1
fix #380
2019-05-30 14:55:42 +10:00
Shivaram Lingamneni
9c235c8dee
Merge pull request #535 from oragono/l10n_master
New Crowdin translations
2019-05-29 17:18:17 -04:00
Daniel Oaks
c0ec953d3a New translations help.lang.json (Vietnamese) 2019-05-30 07:15:11 +10:00
Daniel Oaks
bf866aabed New translations chanserv.lang.json (German) 2019-05-30 07:15:09 +10:00
Daniel Oaks
299a9f4f91 New translations help.lang.json (French) 2019-05-30 07:15:08 +10:00
Daniel Oaks
e3449a713b New translations irc.lang.json (French) 2019-05-30 07:15:07 +10:00
Daniel Oaks
d971bcc6e7 New translations irc.lang.json (German) 2019-05-30 07:15:03 +10:00
Daniel Oaks
b83622c8b7 New translations help.lang.json (Finnish) 2019-05-30 07:15:00 +10:00
Daniel Oaks
086a7eaccc New translations irc.lang.json (Finnish) 2019-05-30 07:14:59 +10:00
Daniel Oaks
8f929ceedd New translations chanserv.lang.json (Finnish) 2019-05-30 07:14:56 +10:00
Daniel Oaks
37c1311af2 New translations help.lang.json (English, Australia) 2019-05-30 07:14:55 +10:00
Daniel Oaks
e104079cf7 New translations chanserv.lang.json (French) 2019-05-30 07:14:54 +10:00
Daniel Oaks
53bb2fc54b New translations irc.lang.json (English, Australia) 2019-05-30 07:14:53 +10:00
Daniel Oaks
e847d4369c New translations help.lang.json (German) 2019-05-30 07:14:51 +10:00
Daniel Oaks
1d71cea24c New translations chanserv.lang.json (Italian) 2019-05-30 07:14:49 +10:00
Daniel Oaks
a4db0ad408 New translations help.lang.json (Hungarian) 2019-05-30 07:14:48 +10:00
Daniel Oaks
57c065a749 New translations irc.lang.json (Hungarian) 2019-05-30 07:14:47 +10:00
Daniel Oaks
d2fbd1d30a New translations chanserv.lang.json (Hungarian) 2019-05-30 07:14:44 +10:00
Daniel Oaks
7dfdda7c7e New translations chanserv.lang.json (Greek) 2019-05-30 07:14:43 +10:00
Daniel Oaks
24692ebc18 New translations irc.lang.json (Hebrew) 2019-05-30 07:14:42 +10:00
Daniel Oaks
d9a5fe2df5 New translations chanserv.lang.json (Hebrew) 2019-05-30 07:14:40 +10:00
Daniel Oaks
21fb1da303 New translations help.lang.json (Greek) 2019-05-30 07:14:39 +10:00
Daniel Oaks
9116c85004 New translations irc.lang.json (Greek) 2019-05-30 07:14:37 +10:00
Daniel Oaks
e76a134840 New translations irc.lang.json (Chinese Traditional) 2019-05-30 07:14:34 +10:00
Daniel Oaks
4d7a5c01cf New translations chanserv.lang.json (Chinese Traditional) 2019-05-30 07:14:32 +10:00
Daniel Oaks
c1850ab55e New translations help.lang.json (Chinese Simplified) 2019-05-30 07:14:31 +10:00
Daniel Oaks
c670c1ab5e New translations irc.lang.json (Chinese Simplified) 2019-05-30 07:14:29 +10:00
Daniel Oaks
019d60057f New translations help.lang.json (Chinese Traditional) 2019-05-30 07:14:27 +10:00
Daniel Oaks
174d140c95 New translations chanserv.lang.json (Chinese Simplified) 2019-05-30 07:14:25 +10:00
Daniel Oaks
3d03902960 New translations help.lang.json (Catalan) 2019-05-30 07:14:24 +10:00
Daniel Oaks
0e9834df5b New translations irc.lang.json (Catalan) 2019-05-30 07:14:23 +10:00
Daniel Oaks
4f3dd62733 New translations help.lang.json (Romanian) 2019-05-30 07:14:21 +10:00
Daniel Oaks
1dd2ae1548 New translations irc.lang.json (Romanian) 2019-05-30 07:14:19 +10:00
Daniel Oaks
d76f9b29f8 New translations chanserv.lang.json (Czech) 2019-05-30 07:14:17 +10:00
Daniel Oaks
ab4544d6d6 New translations chanserv.lang.json (English, Australia) 2019-05-30 07:14:14 +10:00
Daniel Oaks
9e0987e393 New translations help.lang.json (Dutch) 2019-05-30 07:14:13 +10:00
Daniel Oaks
6b96e9dd09 New translations irc.lang.json (Dutch) 2019-05-30 07:14:12 +10:00
Daniel Oaks
7866fc09d5 New translations chanserv.lang.json (Dutch) 2019-05-30 07:14:09 +10:00
Daniel Oaks
c1edb9ffa4 New translations help.lang.json (Danish) 2019-05-30 07:14:07 +10:00
Daniel Oaks
950eecf227 New translations chanserv.lang.json (Danish) 2019-05-30 07:14:05 +10:00
Daniel Oaks
c5e5f62dae New translations help.lang.json (Czech) 2019-05-30 07:14:04 +10:00
Daniel Oaks
0fb689d035 New translations irc.lang.json (Czech) 2019-05-30 07:14:02 +10:00
Daniel Oaks
9778059e3d New translations irc.lang.json (Danish) 2019-05-30 07:13:59 +10:00
Daniel Oaks
ad92dbea50 New translations help.lang.json (Hebrew) 2019-05-30 07:13:57 +10:00
Daniel Oaks
0b5a97b1d2 New translations help.lang.json (Italian) 2019-05-30 07:13:56 +10:00
Daniel Oaks
4147fd5281 New translations chanserv.lang.json (Swedish) 2019-05-30 07:13:55 +10:00
Daniel Oaks
9164a85870 New translations help.lang.json (Spanish) 2019-05-30 07:13:53 +10:00
Daniel Oaks
19351682f9 New translations irc.lang.json (Spanish) 2019-05-30 07:13:52 +10:00
Daniel Oaks
92abe59bce New translations chanserv.lang.json (Spanish) 2019-05-30 07:13:50 +10:00
Daniel Oaks
e4e8e22126 New translations help.lang.json (Serbian (Cyrillic)) 2019-05-30 07:13:48 +10:00
Daniel Oaks
3710cff0f0 New translations irc.lang.json (Italian) 2019-05-30 07:13:47 +10:00
Daniel Oaks
590d1926bf New translations chanserv.lang.json (Serbian (Cyrillic)) 2019-05-30 07:13:45 +10:00
Daniel Oaks
c11004de2b New translations help.lang.json (Russian) 2019-05-30 07:13:44 +10:00
Daniel Oaks
bc46e880d9 New translations irc.lang.json (Russian) 2019-05-30 07:13:42 +10:00
Daniel Oaks
b196a4b732 New translations irc.lang.json (Swedish) 2019-05-30 07:13:39 +10:00
Daniel Oaks
dbb095558d New translations irc.lang.json (Vietnamese) 2019-05-30 07:13:37 +10:00
Daniel Oaks
30d4dab402 New translations chanserv.lang.json (Vietnamese) 2019-05-30 07:13:35 +10:00
Daniel Oaks
99a8520507 New translations help.lang.json (Ukrainian) 2019-05-30 07:13:34 +10:00
Daniel Oaks
7057478617 New translations irc.lang.json (Ukrainian) 2019-05-30 07:13:32 +10:00
Daniel Oaks
892b626c1a New translations help.lang.json (Turkish) 2019-05-30 07:13:29 +10:00
Daniel Oaks
7fe64f6272 New translations irc.lang.json (Turkish) 2019-05-30 07:13:28 +10:00
Daniel Oaks
797b6dde89 New translations chanserv.lang.json (Turkish) 2019-05-30 07:13:25 +10:00
Daniel Oaks
31ac3f088c New translations help.lang.json (Swedish) 2019-05-30 07:13:24 +10:00
Daniel Oaks
af8a207a0b New translations chanserv.lang.json (Ukrainian) 2019-05-30 07:13:22 +10:00
Daniel Oaks
f5d859a69d New translations chanserv.lang.json (Russian) 2019-05-30 07:13:21 +10:00
Daniel Oaks
c0c75c30a8 New translations irc.lang.json (Serbian (Cyrillic)) 2019-05-30 07:13:20 +10:00
Daniel Oaks
f01650fcbf New translations irc.lang.json (Norwegian) 2019-05-30 07:13:18 +10:00
Daniel Oaks
2add1757f1 New translations chanserv.lang.json (Norwegian) 2019-05-30 07:13:15 +10:00
Daniel Oaks
4a6ced85d0 New translations help.lang.json (Korean) 2019-05-30 07:13:14 +10:00
Daniel Oaks
60840fdf27 New translations irc.lang.json (Korean) 2019-05-30 07:13:13 +10:00
Daniel Oaks
a1e6747452 New translations help.lang.json (Norwegian) 2019-05-30 07:13:11 +10:00
Daniel Oaks
f88846001f New translations chanserv.lang.json (Korean) 2019-05-30 07:13:07 +10:00
Daniel Oaks
c8880772b1 New translations help.lang.json (Japanese) 2019-05-30 07:13:06 +10:00
Daniel Oaks
f91d827519 New translations irc.lang.json (Japanese) 2019-05-30 07:13:04 +10:00
Daniel Oaks
eb234587f4 New translations chanserv.lang.json (Japanese) 2019-05-30 07:13:02 +10:00
Daniel Oaks
c289e33521 New translations chanserv.lang.json (Polish) 2019-05-30 07:12:59 +10:00
Daniel Oaks
abc3e4a5ec New translations chanserv.lang.json (Romanian) 2019-05-30 07:12:57 +10:00
Daniel Oaks
112a7884d2 New translations help.lang.json (Portuguese, Brazilian) 2019-05-30 07:12:56 +10:00
Daniel Oaks
62d065c960 New translations irc.lang.json (Portuguese, Brazilian) 2019-05-30 07:12:55 +10:00
Daniel Oaks
a6a2404230 New translations chanserv.lang.json (Portuguese, Brazilian) 2019-05-30 07:12:52 +10:00
Daniel Oaks
eaaa2e4b49 New translations help.lang.json (Portuguese) 2019-05-30 07:12:51 +10:00
Daniel Oaks
e51e6c96ac New translations irc.lang.json (Portuguese) 2019-05-30 07:12:49 +10:00
Daniel Oaks
31ef8c916e New translations chanserv.lang.json (Portuguese) 2019-05-30 07:12:47 +10:00
Daniel Oaks
d0a12a5764 New translations help.lang.json (Polish) 2019-05-30 07:12:46 +10:00
Daniel Oaks
629f80a452 New translations irc.lang.json (Polish) 2019-05-30 07:12:44 +10:00
Daniel Oaks
65c884f5fb New translations help.lang.json (Bosnian) 2019-05-30 07:12:42 +10:00
Daniel Oaks
1e69a11ea2 New translations help.lang.json (Afrikaans) 2019-05-30 07:12:41 +10:00
Daniel Oaks
dbe8be1bf3 New translations chanserv.lang.json (Afrikaans) 2019-05-30 07:12:40 +10:00
Daniel Oaks
ebb22e1af4 New translations irc.lang.json (Afrikaans) 2019-05-30 07:12:38 +10:00
Daniel Oaks
4a36c63dc5 New translations chanserv.lang.json (Arabic) 2019-05-30 07:12:36 +10:00
Daniel Oaks
0b1c7faea5 New translations irc.lang.json (Bosnian) 2019-05-30 07:12:35 +10:00
Daniel Oaks
e749d62df4 New translations irc.lang.json (Arabic) 2019-05-30 07:12:33 +10:00
Daniel Oaks
7035c6f712 New translations help.lang.json (Arabic) 2019-05-30 07:12:30 +10:00
Daniel Oaks
2248f03d75 New translations chanserv.lang.json (Bosnian) 2019-05-30 07:12:29 +10:00
Daniel Oaks
4970c854fd New translations chanserv.lang.json (Catalan) 2019-05-30 07:12:28 +10:00
Shivaram Lingamneni
364d31e10c implement the strict modern behavior 2019-05-29 14:51:09 -04:00
Shivaram Lingamneni
521d5bf50f fix #380
Partially fixed earlier in #467
2019-05-29 14:40:56 -04:00
Shivaram Lingamneni
c0b554e98c changes from discussion 2019-05-29 07:37:57 -04:00
Shivaram Lingamneni
acc9d8c13d update to proposed draft/resume-0.5 behavior 2019-05-29 05:58:47 -04:00
Daniel Oaks
6b51bd6f15
Merge pull request #533 from slingamn/issue407
fix #407
2019-05-29 19:55:13 +10:00
Shivaram Lingamneni
71cc9a1adf review fix 2019-05-29 05:50:33 -04:00
Shivaram Lingamneni
7c5fa551ac manually strip some false positives for now 2019-05-29 05:41:45 -04:00
Shivaram Lingamneni
df2251756f commit the results of ./updatetranslations.py run irc languages 2019-05-29 05:17:17 -04:00
Shivaram Lingamneni
3c267d1000 fix #407 2019-05-29 05:11:29 -04:00
Daniel Oaks
236f8fa9fd
Merge pull request #531 from slingamn/issue410.1
fix #410
2019-05-29 19:07:29 +10:00
Shivaram Lingamneni
ef796f1b11 review fix 2019-05-29 05:06:40 -04:00
Shivaram Lingamneni
634d3c9629 update the manual to match 2019-05-29 04:51:51 -04:00
Shivaram Lingamneni
1a1d3ff89f fix #410 2019-05-29 04:43:13 -04:00
Shivaram Lingamneni
b134a63dc2 simplify "client dead" logic in AddSession
now that we have client.destroyed again, we don't need to test the
"0 sessions && brb disabled" condition in both AddSession() and
destroy()
2019-05-28 04:56:56 -04:00
Daniel Oaks
ed85dd519f
Merge pull request #528 from slingamn/bitset_again
fix #527
2019-05-28 11:41:45 +10:00
Shivaram Lingamneni
dee9740e68 add some testing 2019-05-27 16:10:10 -04:00
Shivaram Lingamneni
9fe65223db fix #527
Use []uint32 in bitset instead of []uint64, because it's harder to guarantee
64-bit alignment of []uint64 than I had realized:

https://go101.org/article/memory-layout.html
2019-05-27 15:51:28 -04:00
Shivaram Lingamneni
5ac7ea5b1c fix data race on exitedSnomaskSent 2019-05-27 14:33:59 -04:00
Shivaram Lingamneni
1a7169d75d fix double-destroy bug 2019-05-27 06:10:39 -04:00
Shivaram Lingamneni
74732c4aeb new proposed format for RESUMED messages 2019-05-27 06:10:39 -04:00
Shivaram Lingamneni
57684fc1e5 fix #518 2019-05-27 06:10:39 -04:00
Shivaram Lingamneni
bc2e546de9
Merge pull request #522 from slingamn/confusable_service_names.1
check restricted nicknames against skeletons, more pedantically
2019-05-24 15:16:54 -04:00
Shivaram Lingamneni
6b468bcd0f
Merge pull request #523 from slingamn/issue521
fix #521
2019-05-24 15:16:40 -04:00
Shivaram Lingamneni
ada710b807 fix #521 2019-05-24 13:33:49 -04:00
Shivaram Lingamneni
8794740f89 be more pedantic about distinguishing skeletons and casefolds 2019-05-24 13:09:56 -04:00
Chris Smith
a6164cd9c4
Check restricted nicknames against skeletons
Fixes #519
2019-05-24 17:01:56 +01:00
Daniel Oaks
02d635d3eb
Merge pull request #517 from slingamn/issue455
two more fixes
2019-05-24 11:25:22 +10:00
Shivaram Lingamneni
34925ce4a7 fix #516 2019-05-23 21:21:36 -04:00
Shivaram Lingamneni
99de53264e fix a bug in SetQuitMessage
Quit messages aren't supposed to clobber each other under any
circumstances, but actually only the default "Connection closed"
message was non-clobbering, all others would clobber.
2019-05-23 21:20:14 -04:00
Shivaram Lingamneni
174115deb6 fix #455 2019-05-23 21:20:14 -04:00
Daniel Oaks
a27c46f983
Merge pull request #509 from slingamn/brb.5
implement draft/resume-0.4
2019-05-24 11:06:11 +10:00
Daniel Oaks
30914c564a
Merge pull request #513 from slingamn/issue511.1
fix #511
2019-05-24 10:59:53 +10:00
Daniel Oaks
caa6de941c
Merge pull request #515 from slingamn/issue514
fix #514
2019-05-24 10:58:14 +10:00
Shivaram Lingamneni
0835ad6af5 fix #514
Also ensure that people can remove their own persistent modes via CS AMODE
2019-05-23 18:33:41 -04:00
Shivaram Lingamneni
dcb3487566 fix #511 2019-05-23 01:32:43 -04:00
Shivaram Lingamneni
4b88a60ba6 clean up some old getters 2019-05-22 19:07:12 -04:00
Shivaram Lingamneni
05459012ef move fakelag processing back to read loop as well 2019-05-22 18:35:24 -04:00
Shivaram Lingamneni
4e13f72ca9 put an upper limit on registration messages
Fixes #505
2019-05-22 16:42:25 -04:00
Shivaram Lingamneni
0af0a0b445 fix a race condition
Setting `closed` on the socket (which can mean either "the socket is broken"
or "we should close the socket at the next opportunity") was racing against
the final write. Even if socket.closed is true, we should attempt to send
buffered message data to the socket, before we send the `finalData` and
actually call `Close`.
2019-05-22 16:42:25 -04:00
Shivaram Lingamneni
1de166bccb eliminate client.Realname() getter 2019-05-22 16:10:56 -04:00
Shivaram Lingamneni
cf153c2b09 restore RESUME SUCCESS message 2019-05-22 15:08:02 -04:00
Shivaram Lingamneni
851617a4a5 Merge remote-tracking branch 'origin/master' into brb.5 2019-05-22 03:29:18 -04:00
Daniel Oaks
678c8606b6
Merge pull request #504 from slingamn/playback.4
support znc.in/playback
2019-05-22 15:38:39 +10:00
Daniel Oaks
c34c257b7f
Merge pull request #510 from slingamn/issue404.4
fix #404
2019-05-22 15:37:55 +10:00
Shivaram Lingamneni
4d7cebec99
Merge pull request #508 from oragono/l10n_master
New Crowdin translations
2019-05-22 01:24:27 -04:00
Shivaram Lingamneni
1121e3d320 fix #404 2019-05-22 01:18:22 -04:00
Shivaram Lingamneni
3d445573cf implement draft/resume-0.4 2019-05-21 22:36:37 -04:00
Daniel Oaks
eaf0328608
Merge pull request #507 from slingamn/strict
make strict enforcement the default
2019-05-22 09:08:34 +10:00
Daniel Oaks
cc53caae9b New translations help.lang.json (Romanian) 2019-05-22 00:33:53 +10:00
Shivaram Lingamneni
a59212f8dc send nickserv timeout warnings from a full pseudo-nickmask 2019-05-21 02:48:18 -04:00
Shivaram Lingamneni
8f9380d0f2 make strict enforcement the default 2019-05-21 02:43:11 -04:00
Shivaram Lingamneni
9a27806b4f
Merge pull request #506 from oragono/l10n_master
New Crowdin translations
2019-05-21 00:32:56 -04:00
Daniel Oaks
8629e98ada New translations translation.lang.yaml (Ukrainian) 2019-05-21 11:42:19 +10:00
Daniel Oaks
8fcec48616 New translations help.lang.json (Romanian) 2019-05-21 11:42:18 +10:00
Daniel Oaks
d436370024 New translations irc.lang.json (Romanian) 2019-05-21 11:42:16 +10:00
Shivaram Lingamneni
f996e6bb87 review fix 2019-05-20 20:08:06 -04:00
Daniel Oaks
a1b30290e3
Merge pull request #503 from slingamn/acquire_timeout.1
add AcquireWithTimeout for semaphores
2019-05-21 09:46:57 +10:00
Shivaram Lingamneni
b96fdb2293 support znc.in/playback 2019-05-20 19:08:57 -04:00
Daniel Oaks
6291a44350
Merge pull request #499 from slingamn/prefs.11
user preference system plus two small fixes
2019-05-21 08:57:57 +10:00
Shivaram Lingamneni
dbf03d5c5e add AcquireWithTimeout for semaphores 2019-05-20 16:48:13 -04:00
Shivaram Lingamneni
d5ebebaa5b add uncommitted test file 2019-05-20 12:34:30 -04:00
Shivaram Lingamneni
b9b51625e1
Merge pull request #501 from oragono/l10n_master
New Crowdin translations
2019-05-20 12:21:29 -04:00
Daniel Oaks
d9835b1236 New translations irc.lang.json (Romanian) 2019-05-20 23:44:50 +10:00
Daniel Oaks
910d581639 New translations nickserv.lang.json (Romanian) 2019-05-20 23:44:48 +10:00
Shivaram Lingamneni
38b228af6a review fixes 2019-05-20 02:56:49 -04:00
Shivaram Lingamneni
f10ed05f86 fix a lock access in ResumeManager 2019-05-19 06:17:30 -04:00
Shivaram Lingamneni
8fc588375b implement user preferences system 2019-05-19 06:17:30 -04:00
Shivaram Lingamneni
25974b6881 fix #487 2019-05-19 05:12:12 -04:00
Shivaram Lingamneni
9930d9bfa2
Merge pull request #497 from oragono/l10n_master
New Crowdin translations
2019-05-17 17:27:49 -04:00
Daniel Oaks
c33273234f New translations help.lang.json (Bosnian) 2019-05-18 07:12:14 +10:00
Daniel Oaks
bebd9a0c07 New translations irc.lang.json (Bosnian) 2019-05-18 07:12:13 +10:00
Daniel Oaks
5861f3d45c New translations translation.lang.yaml (Bosnian) 2019-05-18 07:12:11 +10:00
Daniel Oaks
4926611910
Merge pull request #495 from oragono/l10n_master
New Crowdin translations
2019-05-17 19:16:14 +10:00
Daniel Oaks
212604c93e New translations translation.lang.yaml (Bosnian) 2019-05-17 19:15:31 +10:00
Daniel Oaks
745d9916a1 New translations nickserv.lang.json (Bosnian) 2019-05-17 13:53:04 +10:00
Daniel Oaks
f3b43d3185 New translations irc.lang.json (Polish) 2019-05-17 13:50:44 +10:00
Daniel Oaks
6644050db7 New translations irc.lang.json (Portuguese) 2019-05-17 13:50:43 +10:00
Daniel Oaks
f218c46c96 New translations irc.lang.json (Portuguese, Brazilian) 2019-05-17 13:50:41 +10:00
Daniel Oaks
bf0d3b0689 New translations irc.lang.json (Russian) 2019-05-17 13:50:39 +10:00
Daniel Oaks
9aa7969201 New translations irc.lang.json (Serbian (Cyrillic)) 2019-05-17 13:50:33 +10:00
Daniel Oaks
672b943b18 New translations irc.lang.json (Romanian) 2019-05-17 13:50:31 +10:00
Daniel Oaks
cf7ce44035 New translations irc.lang.json (Swedish) 2019-05-17 13:50:29 +10:00
Daniel Oaks
ce566d789c New translations irc.lang.json (Spanish) 2019-05-17 13:50:25 +10:00
Daniel Oaks
2f8dfbe91f New translations irc.lang.json (Vietnamese) 2019-05-17 13:50:19 +10:00
Daniel Oaks
455f1049a5 New translations irc.lang.json (Ukrainian) 2019-05-17 13:50:17 +10:00
Daniel Oaks
17db1a260a New translations irc.lang.json (Turkish) 2019-05-17 13:50:15 +10:00
Daniel Oaks
d6bbb5b248 New translations hostserv.lang.json (Bosnian) 2019-05-17 13:50:08 +10:00
Daniel Oaks
33785ae940 New translations chanserv.lang.json (Bosnian) 2019-05-17 13:50:02 +10:00
Daniel Oaks
125c105870 New translations irc.lang.json (Norwegian) 2019-05-17 13:49:54 +10:00
Daniel Oaks
d966d0c3b3 New translations irc.lang.json (Korean) 2019-05-17 13:49:52 +10:00
Daniel Oaks
ab18c56d79 New translations irc.lang.json (Japanese) 2019-05-17 13:49:50 +10:00
Daniel Oaks
8244abf777 New translations irc.lang.json (Italian) 2019-05-17 13:49:49 +10:00
Daniel Oaks
662540f2a5 New translations irc.lang.json (Hungarian) 2019-05-17 13:49:47 +10:00
Daniel Oaks
f6ec8bb59a New translations irc.lang.json (Greek) 2019-05-17 13:49:45 +10:00
Daniel Oaks
1ebd29a484 New translations irc.lang.json (German) 2019-05-17 13:49:43 +10:00
Daniel Oaks
ee6e410e94 New translations irc.lang.json (French) 2019-05-17 13:49:41 +10:00
Daniel Oaks
023ee5a23d New translations irc.lang.json (Finnish) 2019-05-17 13:49:39 +10:00
Daniel Oaks
8564f46bf4 New translations irc.lang.json (English, Australia) 2019-05-17 13:49:37 +10:00
Daniel Oaks
e78575f9ad New translations irc.lang.json (Dutch) 2019-05-17 13:49:35 +10:00
Daniel Oaks
4489d43952 New translations irc.lang.json (Hebrew) 2019-05-17 13:49:34 +10:00
Daniel Oaks
fffc48be61 New translations irc.lang.json (Danish) 2019-05-17 13:49:32 +10:00
Daniel Oaks
4ed3e370ac New translations irc.lang.json (Czech) 2019-05-17 13:49:23 +10:00
Daniel Oaks
02efc03dd2 New translations irc.lang.json (Chinese Simplified) 2019-05-17 13:49:21 +10:00
Daniel Oaks
d21d434049 New translations irc.lang.json (Chinese Traditional) 2019-05-17 13:49:15 +10:00
Daniel Oaks
9a8ae28553 New translations irc.lang.json (Catalan) 2019-05-17 13:49:13 +10:00
Daniel Oaks
b7a9743c20 New translations irc.lang.json (Bosnian) 2019-05-17 13:49:11 +10:00
Daniel Oaks
5fa443356b New translations irc.lang.json (Arabic) 2019-05-17 13:49:09 +10:00
Daniel Oaks
dbb65d0220 New translations irc.lang.json (Afrikaans) 2019-05-17 13:49:08 +10:00
Daniel Oaks
b8c9de5379 Make strings easier to understand 2019-05-17 13:41:32 +10:00
Daniel Oaks
467e63fd10 New translations hostserv.lang.json (Bosnian) 2019-05-17 13:39:48 +10:00
Daniel Oaks
13c773dcd0 New translations chanserv.lang.json (Bosnian) 2019-05-17 13:39:32 +10:00
Daniel Oaks
03cfc33eb9 New translations nickserv.lang.json (Bosnian) 2019-05-17 13:39:27 +10:00
Daniel Oaks
18972dc35a New translations translation.lang.yaml (Bosnian) 2019-05-17 13:39:23 +10:00
Daniel Oaks
1ecced7d63 New translations help.lang.json (Bosnian) 2019-05-17 13:39:21 +10:00
Daniel Oaks
35b06a996e New translations irc.lang.json (Bosnian) 2019-05-17 13:38:36 +10:00
Shivaram Lingamneni
1ed7541485
Merge pull request #494 from oragono/l10n_master
New Crowdin translations
2019-05-16 22:18:42 -04:00
Daniel Oaks
6651518917
Merge pull request #493 from slingamn/unknown_command
send command processing errors to the originating session only
2019-05-17 11:54:16 +10:00
Daniel Oaks
24b56bdc7c New translations irc.lang.json (Bosnian) 2019-05-17 03:12:37 +10:00
Daniel Oaks
a01bc96104 New translations irc.lang.json (Bosnian) 2019-05-17 02:48:20 +10:00
Daniel Oaks
a662a835a2 New translations irc.lang.json (Bosnian) 2019-05-17 02:40:51 +10:00
Daniel Oaks
9578d2f4cf New translations help.lang.json (Bosnian) 2019-05-17 02:28:57 +10:00
Daniel Oaks
af821c34b0 New translations irc.lang.json (Bosnian) 2019-05-17 02:28:56 +10:00
Daniel Oaks
471e7cce65 New translations help.lang.json (Bosnian) 2019-05-17 02:09:23 +10:00
Daniel Oaks
117f50744b New translations nickserv.lang.json (Bosnian) 2019-05-17 01:53:41 +10:00
Daniel Oaks
ec1192ef8c New translations nickserv.lang.json (Bosnian) 2019-05-17 01:31:38 +10:00
Shivaram Lingamneni
58d089020e send command processing errors to the originating session only 2019-05-15 22:30:35 -04:00
Daniel Oaks
45fb9cade0
Merge pull request #491 from slingamn/munge
formalize token munging code
2019-05-16 12:20:14 +10:00
Shivaram Lingamneni
83e8b9281a
Merge pull request #492 from oragono/l10n_master
New Crowdin translations
2019-05-15 19:13:32 -04:00
Daniel Oaks
b9bbb52a9f New translations help.lang.json (Vietnamese) 2019-05-16 08:14:24 +10:00
Daniel Oaks
0944e3690f New translations hostserv.lang.json (Bosnian) 2019-05-16 08:14:21 +10:00
Daniel Oaks
98dbabfc86 New translations nickserv.lang.json (Vietnamese) 2019-05-16 08:14:18 +10:00
Daniel Oaks
f05f73d260 New translations nickserv.lang.json (Ukrainian) 2019-05-16 08:14:17 +10:00
Daniel Oaks
a564c45f5f New translations nickserv.lang.json (Turkish) 2019-05-16 08:14:16 +10:00
Daniel Oaks
cd40e90389 New translations nickserv.lang.json (Spanish) 2019-05-16 08:14:15 +10:00
Daniel Oaks
41ada14681 New translations nickserv.lang.json (Serbian (Cyrillic)) 2019-05-16 08:14:13 +10:00
Daniel Oaks
4ea6bb7588 New translations nickserv.lang.json (Russian) 2019-05-16 08:14:12 +10:00
Daniel Oaks
8224aff29b New translations nickserv.lang.json (Romanian) 2019-05-16 08:14:11 +10:00
Daniel Oaks
29eac51ce6 New translations nickserv.lang.json (Portuguese, Brazilian) 2019-05-16 08:14:09 +10:00
Daniel Oaks
ce6d775aa8 New translations nickserv.lang.json (Portuguese) 2019-05-16 08:14:08 +10:00
Daniel Oaks
0a02b45f90 New translations nickserv.lang.json (Polish) 2019-05-16 08:14:07 +10:00
Daniel Oaks
e68c29cba7 New translations nickserv.lang.json (Norwegian) 2019-05-16 08:14:06 +10:00
Daniel Oaks
16a5f3ff1d New translations nickserv.lang.json (Korean) 2019-05-16 08:14:05 +10:00
Daniel Oaks
6bdc407e88 New translations nickserv.lang.json (Swedish) 2019-05-16 08:14:04 +10:00
Daniel Oaks
300367c91a New translations nickserv.lang.json (Japanese) 2019-05-16 08:14:03 +10:00
Daniel Oaks
4b5a3efb85 New translations nickserv.lang.json (Italian) 2019-05-16 08:13:55 +10:00
Daniel Oaks
6e1862595d New translations nickserv.lang.json (Hebrew) 2019-05-16 08:13:53 +10:00
Daniel Oaks
f54603a628 New translations chanserv.lang.json (Bosnian) 2019-05-16 08:13:47 +10:00
Daniel Oaks
31cb4095a1 New translations nickserv.lang.json (Hungarian) 2019-05-16 08:13:46 +10:00
Daniel Oaks
57fadc910b New translations nickserv.lang.json (Greek) 2019-05-16 08:13:44 +10:00
Daniel Oaks
4fe44d9205 New translations nickserv.lang.json (German) 2019-05-16 08:13:43 +10:00
Daniel Oaks
48e01407e6 New translations nickserv.lang.json (French) 2019-05-16 08:13:42 +10:00
Daniel Oaks
e45cf06dbe New translations nickserv.lang.json (Finnish) 2019-05-16 08:13:41 +10:00
Daniel Oaks
195944cf7a New translations nickserv.lang.json (English, Australia) 2019-05-16 08:13:40 +10:00
Daniel Oaks
be6f74a006 New translations nickserv.lang.json (Dutch) 2019-05-16 08:13:39 +10:00
Daniel Oaks
5b4c0700a7 New translations nickserv.lang.json (Danish) 2019-05-16 08:13:37 +10:00
Daniel Oaks
a090871b66 New translations nickserv.lang.json (Czech) 2019-05-16 08:13:36 +10:00
Daniel Oaks
3793761c0f New translations nickserv.lang.json (Chinese Traditional) 2019-05-16 08:13:35 +10:00
Daniel Oaks
28a3a5ef4f New translations nickserv.lang.json (Chinese Simplified) 2019-05-16 08:13:34 +10:00
Daniel Oaks
7bbcd415dc New translations nickserv.lang.json (Bosnian) 2019-05-16 08:13:32 +10:00
Daniel Oaks
995e5b18be New translations nickserv.lang.json (Arabic) 2019-05-16 08:13:31 +10:00
Daniel Oaks
911fcec2e8 New translations nickserv.lang.json (Afrikaans) 2019-05-16 08:13:30 +10:00
Daniel Oaks
ab4022a571 New translations nickserv.lang.json (Catalan) 2019-05-16 08:13:28 +10:00
Daniel Oaks
c3ab8e8d22 New translations translation.lang.yaml (Bosnian) 2019-05-16 08:13:26 +10:00
Daniel Oaks
4ebb69b920 New translations help.lang.json (Czech) 2019-05-16 08:13:25 +10:00
Daniel Oaks
0e2dc86d94 New translations help.lang.json (Chinese Traditional) 2019-05-16 08:13:24 +10:00
Daniel Oaks
936070b9d3 New translations help.lang.json (Chinese Simplified) 2019-05-16 08:13:22 +10:00
Daniel Oaks
477578de19 New translations help.lang.json (Catalan) 2019-05-16 08:13:21 +10:00
Daniel Oaks
b7679268ea New translations help.lang.json (Bosnian) 2019-05-16 08:13:20 +10:00
Daniel Oaks
a3ee734d74 New translations help.lang.json (Arabic) 2019-05-16 08:13:18 +10:00
Daniel Oaks
9746fc87b2 New translations help.lang.json (Afrikaans) 2019-05-16 08:13:17 +10:00
Daniel Oaks
5531cc0bcd New translations irc.lang.json (Vietnamese) 2019-05-16 08:13:16 +10:00
Daniel Oaks
0a8b9c556b New translations irc.lang.json (Ukrainian) 2019-05-16 08:13:14 +10:00
Daniel Oaks
8092215011 New translations help.lang.json (Danish) 2019-05-16 08:13:11 +10:00
Daniel Oaks
5c4bfe6b0a New translations irc.lang.json (Turkish) 2019-05-16 08:13:10 +10:00
Daniel Oaks
fd545378b6 New translations irc.lang.json (Spanish) 2019-05-16 08:13:08 +10:00
Daniel Oaks
590c0e346b New translations irc.lang.json (Serbian (Cyrillic)) 2019-05-16 08:13:05 +10:00
Daniel Oaks
c4741eaac5 New translations irc.lang.json (Russian) 2019-05-16 08:13:03 +10:00
Daniel Oaks
59fd8eb8a3 New translations irc.lang.json (Romanian) 2019-05-16 08:13:01 +10:00
Daniel Oaks
8ac5fb8037 New translations irc.lang.json (Portuguese, Brazilian) 2019-05-16 08:12:58 +10:00
Daniel Oaks
2de67f69b6 New translations irc.lang.json (Portuguese) 2019-05-16 08:12:56 +10:00
Daniel Oaks
55078ce58f New translations irc.lang.json (Polish) 2019-05-16 08:12:54 +10:00
Daniel Oaks
52753f9915 New translations irc.lang.json (Norwegian) 2019-05-16 08:12:52 +10:00
Daniel Oaks
e460543e63 New translations irc.lang.json (Korean) 2019-05-16 08:12:49 +10:00
Daniel Oaks
fe72ed7c15 New translations irc.lang.json (Swedish) 2019-05-16 08:12:47 +10:00
Daniel Oaks
05554e251b New translations irc.lang.json (Japanese) 2019-05-16 08:12:44 +10:00
Daniel Oaks
a167ffb1b5 New translations help.lang.json (Dutch) 2019-05-16 08:12:43 +10:00
Daniel Oaks
832499ff03 New translations help.lang.json (Finnish) 2019-05-16 08:12:41 +10:00
Daniel Oaks
7148c7a229 New translations help.lang.json (Ukrainian) 2019-05-16 08:12:40 +10:00
Daniel Oaks
38bc7d0ad4 New translations help.lang.json (Turkish) 2019-05-16 08:12:38 +10:00
Daniel Oaks
bf7e8744c4 New translations help.lang.json (Swedish) 2019-05-16 08:12:37 +10:00
Daniel Oaks
3d34727452 New translations help.lang.json (Spanish) 2019-05-16 08:12:35 +10:00
Daniel Oaks
98c586600c New translations help.lang.json (Serbian (Cyrillic)) 2019-05-16 08:12:34 +10:00
Daniel Oaks
b815256e74 New translations help.lang.json (Russian) 2019-05-16 08:12:32 +10:00
Daniel Oaks
3d38aea788 New translations help.lang.json (Romanian) 2019-05-16 08:12:31 +10:00
Daniel Oaks
8d02568155 New translations help.lang.json (Portuguese, Brazilian) 2019-05-16 08:12:29 +10:00
Daniel Oaks
ee6885dafe New translations help.lang.json (Portuguese) 2019-05-16 08:12:28 +10:00
Daniel Oaks
4a749d12eb New translations help.lang.json (English, Australia) 2019-05-16 08:12:27 +10:00
Daniel Oaks
3acf9de20d New translations help.lang.json (Polish) 2019-05-16 08:12:25 +10:00
Daniel Oaks
13e372c661 New translations help.lang.json (Korean) 2019-05-16 08:12:24 +10:00
Daniel Oaks
ab8e290584 New translations help.lang.json (Japanese) 2019-05-16 08:12:23 +10:00
Daniel Oaks
dd18b8ae16 New translations help.lang.json (Italian) 2019-05-16 08:12:21 +10:00
Daniel Oaks
8a10b5c20a New translations help.lang.json (Hungarian) 2019-05-16 08:12:20 +10:00
Daniel Oaks
29caeefde2 New translations help.lang.json (Hebrew) 2019-05-16 08:12:18 +10:00
Daniel Oaks
99bb6d8aba New translations help.lang.json (Greek) 2019-05-16 08:12:17 +10:00
Daniel Oaks
465c0764a6 New translations help.lang.json (German) 2019-05-16 08:12:16 +10:00
Daniel Oaks
8c46a16996 New translations help.lang.json (French) 2019-05-16 08:12:14 +10:00
Daniel Oaks
61bd7a1686 New translations help.lang.json (Norwegian) 2019-05-16 08:12:13 +10:00
Daniel Oaks
2893c37b66 New translations irc.lang.json (Italian) 2019-05-16 08:12:11 +10:00
Daniel Oaks
7076e13b3d New translations irc.lang.json (Hebrew) 2019-05-16 08:12:09 +10:00
Daniel Oaks
8acda8ac75 New translations irc.lang.json (Hungarian) 2019-05-16 08:11:58 +10:00
Daniel Oaks
c6f354c86e New translations irc.lang.json (Greek) 2019-05-16 08:11:56 +10:00
Daniel Oaks
28047c38f8 New translations irc.lang.json (German) 2019-05-16 08:11:54 +10:00
Daniel Oaks
2812815a8f New translations irc.lang.json (French) 2019-05-16 08:11:52 +10:00
Daniel Oaks
1aaec93200 New translations irc.lang.json (Finnish) 2019-05-16 08:11:50 +10:00
Daniel Oaks
2e2f507ae4 New translations irc.lang.json (English, Australia) 2019-05-16 08:11:48 +10:00
Daniel Oaks
1407b0e599 New translations irc.lang.json (Dutch) 2019-05-16 08:11:46 +10:00
Daniel Oaks
a96466401b New translations irc.lang.json (Danish) 2019-05-16 08:11:43 +10:00
Daniel Oaks
566bb78ac6 New translations irc.lang.json (Czech) 2019-05-16 08:11:41 +10:00
Daniel Oaks
d887b7bc02 New translations irc.lang.json (Chinese Traditional) 2019-05-16 08:11:38 +10:00
Daniel Oaks
6ac20c6c51 New translations irc.lang.json (Chinese Simplified) 2019-05-16 08:11:36 +10:00
Daniel Oaks
53fe0cbcec New translations irc.lang.json (Bosnian) 2019-05-16 08:11:34 +10:00
Daniel Oaks
7cfb80943d New translations irc.lang.json (Arabic) 2019-05-16 08:11:31 +10:00
Daniel Oaks
4f41a143ff New translations irc.lang.json (Afrikaans) 2019-05-16 08:11:29 +10:00
Daniel Oaks
20092eee90 New translations irc.lang.json (Catalan) 2019-05-16 08:11:25 +10:00
Daniel Oaks
9fbfee62d5 Update translations 2019-05-16 08:10:48 +10:00
Shivaram Lingamneni
7d53dd5d81 formalize token munging code 2019-05-15 16:17:13 -04:00
Daniel Oaks
84fe2c60dd
Merge pull request #490 from slingamn/issue387
fix #387
2019-05-15 18:56:45 +10:00
Shivaram Lingamneni
0346c23ae0 fix #387 2019-05-15 01:30:21 -04:00
Daniel Oaks
c2300e3e66
Merge pull request #489 from slingamn/issue488.1
fix #488
2019-05-15 11:41:50 +10:00
Shivaram Lingamneni
ea70580adc fix #488 2019-05-14 21:21:57 -04:00
Daniel Oaks
12b2a0751b
Merge pull request #485 from slingamn/utc.2
another handful of fixes
2019-05-13 16:40:54 +10:00
Shivaram Lingamneni
8f0977f59e human-readable times for NS SESSIONS 2019-05-13 02:24:58 -04:00
Shivaram Lingamneni
316d45917d pass the correct quit message when a proxied client is banned
If you were banned and the ban was only detected when you proxied
(because you were proxying from a DLINE'd IP), you'd get an incorrect
quit message: `QUIT: Bad or unauthorized PROXY command`. This propagates
the correct ban message as the quit line.
2019-05-13 02:19:00 -04:00
Shivaram Lingamneni
89a50d772c WHO should leave the client idle
Some clients seem to automatically poll for channel state
2019-05-13 00:43:29 -04:00
Shivaram Lingamneni
6ded2ea466 fix #483 2019-05-13 00:43:29 -04:00
Shivaram Lingamneni
0b55fed7c5 consolidate acceptClient into RunNewClient 2019-05-12 20:57:53 -04:00
Shivaram Lingamneni
80a594802f remove more indirections 2019-05-12 20:57:53 -04:00
Shivaram Lingamneni
353aeb0389 normalize most times in the app to UTC
Fixes #480
2019-05-12 20:57:53 -04:00
Shivaram Lingamneni
13dda00989
Merge pull request #481 from slingamn/cloaks.5
implement ip cloaking
2019-05-12 20:23:45 -04:00
Shivaram Lingamneni
fd8fd3e252 don't require a config file for mksecret 2019-05-12 19:23:45 -04:00
Shivaram Lingamneni
18cf816396 add a manual entry for cloaks 2019-05-12 19:19:36 -04:00
Shivaram Lingamneni
11076be0ee review fixes 2019-05-12 16:26:23 -04:00
Daniel Oaks
c13bb116c0
Merge pull request #482 from slingamn/issue362
three QoL fixes
2019-05-12 19:31:23 +10:00
Shivaram Lingamneni
b8ca8ec852 fix #463 2019-05-12 04:50:43 -04:00
Shivaram Lingamneni
2451737f87 give cloaks their own package 2019-05-12 04:03:50 -04:00
Shivaram Lingamneni
02d5da7cfa remove manual entry for ZNC
as of #479, we provide backwards compatibility with ZNC's SASL
2019-05-12 03:33:41 -04:00
Shivaram Lingamneni
79c730dd44 fix #429 2019-05-12 03:27:02 -04:00
Shivaram Lingamneni
f2eb2b05f2 fix #360 2019-05-12 03:25:02 -04:00
Shivaram Lingamneni
18aecfeed0 fix #362 2019-05-12 03:20:31 -04:00
Shivaram Lingamneni
c28e6d13f9 implement ip cloaking 2019-05-12 02:52:12 -04:00
Daniel Oaks
585a6557a4
Merge pull request #479 from slingamn/compat.4
add client compatibility switches
2019-05-12 15:38:35 +10:00
Shivaram Lingamneni
5331afbdd4 Merge remote-tracking branch 'origin/master' into compat.4 2019-05-11 21:56:41 -04:00
Shivaram Lingamneni
555e1dad85
Merge pull request #477 from slingamn/issue457_firstpass.4
improvements to message replay code
2019-05-11 21:53:25 -04:00
Shivaram Lingamneni
15289bd7db review fixes 2019-05-11 21:48:36 -04:00
Shivaram Lingamneni
c193def606 fix some issues found with staticcheck.io 2019-05-10 01:44:14 -04:00
Shivaram Lingamneni
ce6a3e42df load isupport directly into the config object
eliminates Server.configurableStateMutex
2019-05-10 00:32:10 -04:00
Shivaram Lingamneni
61d666a25b load motd directly into the config object 2019-05-10 00:13:48 -04:00
Shivaram Lingamneni
fbc6c84a01 add client compatibility switches 2019-05-09 15:41:08 -04:00
Shivaram Lingamneni
278e4acf57 fix handling of nil session in reattach code 2019-05-09 05:03:21 -04:00
Shivaram Lingamneni
08ebfb1676 fix redundant JOIN line 2019-05-09 03:57:02 -04:00
Shivaram Lingamneni
60c8f286e8 fix several session destruction bugs 2019-05-08 20:55:34 -04:00
Shivaram Lingamneni
da656c07c8 add NICKSERV SESSIONS command to list sessions 2019-05-08 18:18:05 -04:00
Shivaram Lingamneni
b11bf503e7 improvements to message replay code 2019-05-08 03:02:48 -04:00
Daniel Oaks
939729a7c0
Merge pull request #476 from slingamn/doubleauth
disallow AUTHENTICATE when already auth'ed
2019-05-08 13:50:34 +10:00
Shivaram Lingamneni
2a7d734098 disallow AUTHENTICATE when already auth'ed 2019-05-07 23:32:51 -04:00
Daniel Oaks
121e16ac52
Merge pull request #472 from slingamn/operator_who.1
tweaks to NAMES / WHO privacy
2019-04-29 11:35:37 +10:00
Shivaram Lingamneni
74afeaed55 tweaks to NAMES / WHO privacy 2019-04-28 21:20:18 -04:00
Shivaram Lingamneni
29fad23e5a
Merge pull request #470 from slingamn/issue468_followup
strip out the +a away mode
2019-04-28 20:50:44 -04:00
Shivaram Lingamneni
51465b4a3a strip out the +a away mode 2019-04-28 15:12:48 -04:00
Daniel Oaks
e387b7b328
Merge pull request #469 from slingamn/issue468
fix #468
2019-04-29 05:01:43 +10:00
Shivaram Lingamneni
b9501722a9 remove all MODE +a / -a lines
as per discussion in #oragono, these are not sent by other servers
2019-04-28 14:52:15 -04:00
Shivaram Lingamneni
d6b22b925a fix #468 2019-04-28 14:38:27 -04:00
Daniel Oaks
8d50500b7d
Merge pull request #467 from slingamn/issue400.3
three fixes
2019-04-28 17:00:36 +10:00
Shivaram Lingamneni
d6c970f521 names should respect invisibility 2019-04-28 02:48:19 -04:00
Shivaram Lingamneni
30f6e11698 fix #400
Also fix some issues with STATUSMSG
2019-04-28 02:48:19 -04:00
Shivaram Lingamneni
8c68b9f8d7
Merge pull request #464 from oragono/fix-cap-notify
Fix cap-notify
2019-04-28 02:01:21 -04:00
Daniel Oaks
267c51bbbf Review fix 2019-04-28 15:57:42 +10:00
Daniel Oaks
22ed6bb1f1 Detect cap-notify clients better (as recommended by cap spec) 2019-04-28 01:50:43 +10:00
Daniel Oaks
c84ef97b90 Make CAP version upgrading work as recommended by cap spec 2019-04-28 01:50:16 +10:00
Daniel Oaks
cb1de17ffc Omit SASL cap when auth is disabled 2019-04-28 01:39:02 +10:00
Daniel Oaks
ab4f186673
Merge pull request #458 from slingamn/multisocket.11
minimum viable product for bouncer
2019-04-28 01:22:36 +10:00
Daniel Oaks
d78775a80e
Merge pull request #459 from slingamn/semutil.1
extract Semaphore to utils package
2019-04-16 02:37:17 +00:00
Shivaram Lingamneni
97e71dfef7 extract Semaphore to utils package 2019-04-15 11:15:31 -04:00
Shivaram Lingamneni
fe6a520fa4 temporarily assign the client a nick during reattach
(So that the registration burst displays correctly)
2019-04-14 22:05:53 -04:00
Shivaram Lingamneni
4af783ed9e fix #449 2019-04-14 20:48:50 -04:00
Shivaram Lingamneni
c2faeed4b5 initial implementation of bouncer functionality 2019-04-14 20:48:50 -04:00
Daniel Oaks
a8f04ecc4d developing: Mention how translated strings are marked in source 2019-04-08 22:16:58 +10:00
Daniel Oaks
b11b34b793
Merge pull request #453 from oragono/master+acc-updates
Update ACC to latest spec
2019-04-08 14:11:07 +10:00
Daniel Oaks
0b644065b7 Review and spec updates 2019-04-08 11:36:48 +10:00
Daniel Oaks
7bcba602ec Don't check for * again, we handle that properly now 2019-04-08 10:54:52 +10:00
Daniel Oaks
8f47b3a6cf Actually advertise the draft/acc capability lol 2019-04-08 10:42:17 +10:00
Daniel Oaks
4df71df454 Initial ACC update to match the new spec 2019-04-08 10:40:19 +10:00
Daniel Oaks
c5dd87a64d
Merge pull request #452 from slingamn/deadlock
fix a deadlock in CS AMODE
2019-04-07 17:10:42 +10:00
Shivaram Lingamneni
a729772f0c fix a deadlock in CS AMODE 2019-04-07 02:12:14 -04:00
Daniel Oaks
8c7027c604
Merge pull request #446 from slingamn/chanregrefactor.6
refactor channel registration
2019-04-04 21:59:25 +10:00
Daniel Oaks
63ac37748d
Merge pull request #450 from slingamn/errors.2
fix #425 and #395
2019-04-04 21:59:00 +10:00
Shivaram Lingamneni
42dca34c1f ensure each target sees distinct msgids 2019-03-19 05:51:33 -04:00
Shivaram Lingamneni
18a8b075ea fix #425 and #395 2019-03-19 04:40:48 -04:00
Shivaram Lingamneni
63149e754a update registeredChannels cache on rename as well 2019-03-14 03:21:45 -04:00
Shivaram Lingamneni
8a11768c6a disallow squatting a registered channel name via RENAME 2019-03-12 05:02:31 -04:00
Shivaram Lingamneni
63029e2ff5 refactor channel registration 2019-03-12 04:16:16 -04:00
Daniel Oaks
29db70fa7b
Merge pull request #445 from slingamn/issue300_regression
fix a regression introduced by #444
2019-03-12 09:04:00 +10:00
Shivaram Lingamneni
26cddf2f59 fix a regression introduced by #444 2019-03-11 18:58:28 -04:00
Daniel Oaks
baa7e5af0b
Merge pull request #442 from slingamn/message_tags.5
upgrade message-tags to non-draft version
2019-03-12 08:47:08 +10:00
Daniel Oaks
64bf4a10c6
Merge pull request #444 from slingamn/issue300.1
fix #300
2019-03-12 08:41:10 +10:00
Daniel Oaks
51f55ae44e
Merge pull request #443 from slingamn/remove_indirections.4
remove indirections in Fakelag and NickTimer
2019-03-12 08:39:16 +10:00
Shivaram Lingamneni
713df3a34d fix #300
Also upgrade RENAME to latest draft specification
2019-03-11 07:03:51 -04:00
Shivaram Lingamneni
2e88f82e41 remove indirections in Fakelag and NickTimer 2019-03-08 05:36:54 -05:00
Shivaram Lingamneni
85493ef031 upgrade message-tags to non-draft version 2019-03-07 04:31:08 -05:00
Daniel Oaks
acd9eeeb15
Merge pull request #441 from slingamn/tor_timeout
work around a Tor bug
2019-03-06 06:08:09 +00:00
Shivaram Lingamneni
12e3ca9b4d work around a Tor bug
https://bugs.torproject.org/29665 describes how single-onion circuits
will close unless the client sends data every 60 seconds. To cause the
client to send these messages, have Oragono send the client a PING every
30 seconds.
2019-03-05 22:10:30 -05:00
Daniel Oaks
e18bb864e2
Merge pull request #430 from slingamn/tor.2
add Tor support (plus a few random changes)
2019-03-05 08:49:14 +00:00
Shivaram Lingamneni
ec620af880
Merge pull request #436 from slingamn/bashisms
fix bashisms in install.sh
2019-02-28 20:07:56 -05:00
Shivaram Lingamneni
8fa70e2c45 fix bashisms in install.sh 2019-02-28 20:02:50 -05:00
Shivaram Lingamneni
7b8c1382ae
Merge pull request #435 from csmith/install-sh
Use /bin/sh rather than /bin/bash
2019-02-28 19:55:05 -05:00
Chris Smith
2598569f3a Use /bin/sh rather than /bin/bash
This makes it much easier to run on alpine which ships with
only a /bin/sh by default.
2019-03-01 00:47:27 +00:00
Shivaram Lingamneni
63502b8da4 add a note about tor vs. tls 2019-02-26 21:00:35 -05:00
Shivaram Lingamneni
18169cbedf disallow resume from tor to non-tor 2019-02-26 16:39:10 -05:00
Daniel Oaks
8bcb4041a0
Merge pull request #431 from slingamn/issue406
upgrade golang to 1.12, fixes #406
2019-02-27 07:32:25 +10:00
Daniel Oaks
33b2052dbc
Merge pull request #432 from slingamn/no_plaintext
deprecate plaintext on 6667
2019-02-27 07:32:11 +10:00
Shivaram Lingamneni
f032313f6f disable ident by default 2019-02-26 16:27:14 -05:00
Shivaram Lingamneni
100cefb00b deprecate plaintext on 6667 2019-02-26 15:49:17 -05:00
Shivaram Lingamneni
c16ff3cafd upgrade golang to 1.12, fixes #406 2019-02-26 14:53:33 -05:00
Shivaram Lingamneni
5f26023d88 Merge remote-tracking branch 'origin/master' into tor.2 2019-02-26 14:46:15 -05:00
Shivaram Lingamneni
7ceaae426c manual tweaks 2019-02-26 14:44:30 -05:00
Daniel Oaks
e65845090f
Merge pull request #412 from slingamn/make.3
fix #409
2019-02-26 21:17:11 +10:00
Daniel Oaks
9ec4f76c60
Merge pull request #405 from slingamn/language_loading.2
fix #384
2019-02-26 21:14:43 +10:00
Shivaram Lingamneni
1ecd974419 punctuation fix in manual 2019-02-25 22:59:38 -05:00
Shivaram Lingamneni
d13f58acf0 review fixes 2019-02-25 22:56:08 -05:00
Shivaram Lingamneni
fdb43892b6
Merge pull request #428 from oragono/l10n_master
New Crowdin translations
2019-02-25 22:29:00 -05:00
Shivaram Lingamneni
b0f89062fa add support for tor (#369) 2019-02-25 22:09:09 -05:00
Shivaram Lingamneni
d43ce07b66 consume resume token during VerifyToken
Independently of this, ClientLookupSet.Resume ensures that at most one
resume can succeed, so this doesn't actually change the behavior.
But ResumeManager should be a standalone example of how to implement
resume without race conditions.
2019-02-24 21:07:12 -05:00
Shivaram Lingamneni
7018e3693b optimization: check IsLoggingRawIO before attempting to log input 2019-02-24 21:07:12 -05:00
Shivaram Lingamneni
f790a910cd change the b32 alphabet for absolutely no reason 2019-02-24 21:07:12 -05:00
Shivaram Lingamneni
0d2cf21cec clean something up in ApplyProxiedIP 2019-02-24 21:07:12 -05:00
Daniel Oaks
37533daf98 New translations help.lang.json (Romanian) 2019-02-24 20:11:37 +10:00
Daniel Oaks
5085389e69 New translations irc.lang.json (Romanian) 2019-02-24 20:11:36 +10:00
Daniel Oaks
bb32113fcd New translations help.lang.json (Romanian) 2019-02-24 19:57:54 +10:00
Daniel Oaks
dbaf58889e New translations nickserv.lang.json (Romanian) 2019-02-24 19:57:52 +10:00
Daniel Oaks
a2147f0ea4 New translations help.lang.json (Vietnamese) 2019-02-24 18:04:09 +10:00
Daniel Oaks
ba191c05cc New translations nickserv.lang.json (Vietnamese) 2019-02-24 18:04:06 +10:00
Daniel Oaks
73bf60a461 New translations nickserv.lang.json (Ukrainian) 2019-02-24 18:04:05 +10:00
Daniel Oaks
4f229bd7d7 New translations nickserv.lang.json (Turkish) 2019-02-24 18:04:04 +10:00
Daniel Oaks
09978be3f3 New translations nickserv.lang.json (Swedish) 2019-02-24 18:04:03 +10:00
Daniel Oaks
dc465e857f New translations nickserv.lang.json (Serbian (Cyrillic)) 2019-02-24 18:04:02 +10:00
Daniel Oaks
cb43298d88 New translations nickserv.lang.json (Russian) 2019-02-24 18:04:01 +10:00
Daniel Oaks
5a0bd749e8 New translations nickserv.lang.json (Romanian) 2019-02-24 18:04:00 +10:00
Daniel Oaks
b7d1b1b12b New translations nickserv.lang.json (Portuguese, Brazilian) 2019-02-24 18:03:59 +10:00
Daniel Oaks
081ef9354b New translations nickserv.lang.json (Portuguese) 2019-02-24 18:03:59 +10:00
Daniel Oaks
ca38d3d8a4 New translations nickserv.lang.json (Polish) 2019-02-24 18:03:58 +10:00
Daniel Oaks
64de601f83 New translations nickserv.lang.json (Norwegian) 2019-02-24 18:03:57 +10:00
Daniel Oaks
69e941b920 New translations nickserv.lang.json (Korean) 2019-02-24 18:03:56 +10:00
Daniel Oaks
7dce4d7e42 New translations nickserv.lang.json (Spanish) 2019-02-24 18:03:55 +10:00
Daniel Oaks
d80ff26c37 New translations nickserv.lang.json (Japanese) 2019-02-24 18:03:54 +10:00
Daniel Oaks
857bd2b5bd New translations nickserv.lang.json (Italian) 2019-02-24 18:03:47 +10:00
Daniel Oaks
738b72f4c5 New translations nickserv.lang.json (Hebrew) 2019-02-24 18:03:46 +10:00
Daniel Oaks
f9bdc0a5d7 New translations nickserv.lang.json (Hungarian) 2019-02-24 18:03:40 +10:00
Daniel Oaks
662d9afe99 New translations nickserv.lang.json (Greek) 2019-02-24 18:03:39 +10:00
Daniel Oaks
7db212869a New translations nickserv.lang.json (German) 2019-02-24 18:03:38 +10:00
Daniel Oaks
4ff072f83f New translations nickserv.lang.json (French) 2019-02-24 18:03:37 +10:00
Daniel Oaks
108b95ac9c New translations nickserv.lang.json (Finnish) 2019-02-24 18:03:36 +10:00
Daniel Oaks
d6ac31749a New translations nickserv.lang.json (English, Australia) 2019-02-24 18:03:35 +10:00
Daniel Oaks
80a474b739 New translations nickserv.lang.json (Dutch) 2019-02-24 18:03:34 +10:00
Daniel Oaks
1c95579d25 New translations nickserv.lang.json (Danish) 2019-02-24 18:03:33 +10:00
Daniel Oaks
9eb4462e49 New translations nickserv.lang.json (Czech) 2019-02-24 18:03:32 +10:00
Daniel Oaks
4bfa5a577e New translations nickserv.lang.json (Chinese Traditional) 2019-02-24 18:03:31 +10:00
Daniel Oaks
0900233aaa New translations nickserv.lang.json (Catalan) 2019-02-24 18:03:30 +10:00
Daniel Oaks
b1925de64c New translations nickserv.lang.json (Arabic) 2019-02-24 18:03:29 +10:00
Daniel Oaks
70da4054ba New translations nickserv.lang.json (Afrikaans) 2019-02-24 18:03:28 +10:00
Daniel Oaks
280d6ea3cd New translations nickserv.lang.json (Chinese Simplified) 2019-02-24 18:03:26 +10:00
Daniel Oaks
21bdc127d5 New translations help.lang.json (Danish) 2019-02-24 18:03:24 +10:00
Daniel Oaks
a0f1f92124 New translations help.lang.json (Czech) 2019-02-24 18:03:23 +10:00
Daniel Oaks
85ce0b4f2c New translations help.lang.json (Chinese Traditional) 2019-02-24 18:03:22 +10:00
Daniel Oaks
a7ad30c6e4 New translations help.lang.json (Chinese Simplified) 2019-02-24 18:03:21 +10:00
Daniel Oaks
d46157c9bb New translations help.lang.json (Catalan) 2019-02-24 18:03:20 +10:00
Daniel Oaks
4e3c15c8c2 New translations help.lang.json (Arabic) 2019-02-24 18:03:18 +10:00
Daniel Oaks
5ad7e9b13e New translations help.lang.json (Afrikaans) 2019-02-24 18:03:17 +10:00
Daniel Oaks
3b9a716461 New translations irc.lang.json (Vietnamese) 2019-02-24 18:03:16 +10:00
Daniel Oaks
b34a60adf4 New translations irc.lang.json (Ukrainian) 2019-02-24 18:03:14 +10:00
Daniel Oaks
a553487651 New translations help.lang.json (Dutch) 2019-02-24 18:03:13 +10:00
Daniel Oaks
5eee064221 New translations irc.lang.json (Turkish) 2019-02-24 18:03:11 +10:00
Daniel Oaks
dac8ea800c New translations irc.lang.json (Spanish) 2019-02-24 18:03:09 +10:00
Daniel Oaks
0de0211ee7 New translations irc.lang.json (Serbian (Cyrillic)) 2019-02-24 18:03:08 +10:00
Daniel Oaks
db16cbef7d New translations irc.lang.json (Russian) 2019-02-24 18:03:06 +10:00
Daniel Oaks
8bc028a1a0 New translations irc.lang.json (Romanian) 2019-02-24 18:03:04 +10:00
Daniel Oaks
d63384c1c7 New translations irc.lang.json (Portuguese, Brazilian) 2019-02-24 18:03:02 +10:00
Daniel Oaks
24c95a89f0 New translations irc.lang.json (Portuguese) 2019-02-24 18:03:00 +10:00
Daniel Oaks
cf08dc8465 New translations irc.lang.json (Polish) 2019-02-24 18:02:58 +10:00
Daniel Oaks
849cdda08a New translations irc.lang.json (Norwegian) 2019-02-24 18:02:56 +10:00
Daniel Oaks
f52b35bf01 New translations irc.lang.json (Swedish) 2019-02-24 18:02:54 +10:00
Daniel Oaks
841fbefb14 New translations irc.lang.json (Korean) 2019-02-24 18:02:52 +10:00
Daniel Oaks
c28696dedc New translations help.lang.json (English, Australia) 2019-02-24 18:02:50 +10:00
Daniel Oaks
86ea357fff New translations help.lang.json (French) 2019-02-24 18:02:49 +10:00
Daniel Oaks
ec59bfb8a0 New translations help.lang.json (Ukrainian) 2019-02-24 18:02:48 +10:00
Daniel Oaks
93b866d0fe New translations help.lang.json (Turkish) 2019-02-24 18:02:46 +10:00
Daniel Oaks
ed4a5d8b29 New translations help.lang.json (Swedish) 2019-02-24 18:02:45 +10:00
Daniel Oaks
26ae451b15 New translations help.lang.json (Spanish) 2019-02-24 18:02:44 +10:00
Daniel Oaks
6cc6fe3010 New translations help.lang.json (Serbian (Cyrillic)) 2019-02-24 18:02:43 +10:00
Daniel Oaks
eb8b5fc2de New translations help.lang.json (Russian) 2019-02-24 18:02:42 +10:00
Daniel Oaks
ff95e1ba6a New translations help.lang.json (Romanian) 2019-02-24 18:02:40 +10:00
Daniel Oaks
ff7c110b59 New translations help.lang.json (Portuguese, Brazilian) 2019-02-24 18:02:39 +10:00
Daniel Oaks
16588c637f New translations help.lang.json (Finnish) 2019-02-24 18:02:38 +10:00
Daniel Oaks
66800a7df0 New translations help.lang.json (Portuguese) 2019-02-24 18:02:37 +10:00
Daniel Oaks
3b1fd2a3f9 New translations help.lang.json (Norwegian) 2019-02-24 18:02:35 +10:00
Daniel Oaks
4534e55682 New translations help.lang.json (Korean) 2019-02-24 18:02:34 +10:00
Daniel Oaks
7edd3cc36a New translations help.lang.json (Japanese) 2019-02-24 18:02:33 +10:00
Daniel Oaks
64c4e1fc25 New translations help.lang.json (Italian) 2019-02-24 18:02:32 +10:00
Daniel Oaks
571f6fd9a6 New translations help.lang.json (Hungarian) 2019-02-24 18:02:31 +10:00
Daniel Oaks
0da2bf8018 New translations help.lang.json (Hebrew) 2019-02-24 18:02:29 +10:00
Daniel Oaks
6264e625b6 New translations help.lang.json (Greek) 2019-02-24 18:02:28 +10:00
Daniel Oaks
083f2f9b7c New translations help.lang.json (German) 2019-02-24 18:02:27 +10:00
Daniel Oaks
3dc24d2b21 New translations help.lang.json (Polish) 2019-02-24 18:02:25 +10:00
Daniel Oaks
a90274e277 New translations irc.lang.json (Japanese) 2019-02-24 18:02:24 +10:00
Daniel Oaks
fd28d93803 New translations irc.lang.json (Hungarian) 2019-02-24 18:02:22 +10:00
Daniel Oaks
be91fa1b74 New translations irc.lang.json (Italian) 2019-02-24 18:02:16 +10:00
Daniel Oaks
7147a1826f New translations irc.lang.json (Hebrew) 2019-02-24 18:02:14 +10:00
Daniel Oaks
5fbd4052a4 New translations irc.lang.json (Greek) 2019-02-24 18:02:11 +10:00
Daniel Oaks
b10c6ab9e7 New translations irc.lang.json (German) 2019-02-24 18:02:09 +10:00
Daniel Oaks
c2fdb42ee5 New translations irc.lang.json (French) 2019-02-24 18:02:07 +10:00
Daniel Oaks
b336662197 New translations irc.lang.json (Finnish) 2019-02-24 18:02:05 +10:00
Daniel Oaks
927c329755 New translations irc.lang.json (English, Australia) 2019-02-24 18:02:03 +10:00
Daniel Oaks
59308f07bc New translations irc.lang.json (Dutch) 2019-02-24 18:02:01 +10:00
Daniel Oaks
d2bbe2cced New translations irc.lang.json (Danish) 2019-02-24 18:01:59 +10:00
Daniel Oaks
4d4846c90f New translations irc.lang.json (Czech) 2019-02-24 18:01:57 +10:00
Daniel Oaks
d39c471faf New translations irc.lang.json (Chinese Simplified) 2019-02-24 18:01:55 +10:00
Daniel Oaks
ab8b401c86 New translations irc.lang.json (Catalan) 2019-02-24 18:01:53 +10:00
Daniel Oaks
a71671e2cd New translations irc.lang.json (Arabic) 2019-02-24 18:01:52 +10:00
Daniel Oaks
4abb4642a5 New translations irc.lang.json (Afrikaans) 2019-02-24 18:01:50 +10:00
Daniel Oaks
3839dfc5e2 New translations irc.lang.json (Chinese Traditional) 2019-02-24 18:01:47 +10:00
Daniel Oaks
1dbe01b09a
Merge pull request #416 from oragono/master+tlchanges
Improve translations
2019-02-24 17:57:26 +10:00
Daniel Oaks
f38e144bbb
Merge pull request #426 from slingamn/unreleased
new unreleased version
2019-02-24 17:57:09 +10:00
Shivaram Lingamneni
a4a143ef56 new unreleased version 2019-02-24 02:19:50 -05:00
Daniel Oaks
f396003ec9 Release v1.0.0 2019-02-24 17:02:04 +10:00
Shivaram Lingamneni
48c7458809
Merge pull request #424 from oragono/issue419
Changelog updates
2019-02-23 23:58:38 -05:00
Shivaram Lingamneni
9d72b16633
Merge pull request #423 from oragono/ns-register-notice
Band-aid NS REGISTER fix
2019-02-23 23:56:11 -05:00
Daniel Oaks
63f65eab5a Sort changelog and fix some items 2019-02-23 22:06:09 +10:00
Daniel Oaks
9f3691794b Update docs 2019-02-23 21:58:42 +10:00
Daniel Oaks
7e6e7742f9 Band-aid NS REGISTER fix 2019-02-23 21:27:19 +10:00
Shivaram Lingamneni
182625c536 corrections 2019-02-22 00:28:08 -05:00
Shivaram Lingamneni
ab5e589d24 linkify credits, make some corrections 2019-02-22 00:06:30 -05:00
Shivaram Lingamneni
1467c26fab add some github links to the credits 2019-02-21 22:27:05 -05:00
Shivaram Lingamneni
266782a7d1
Merge pull request #418 from oragono/l10n_master
New Crowdin translations
2019-02-21 22:15:20 -05:00
Daniel Oaks
e7fb2fad00 New translations translation.lang.yaml (Japanese) 2019-02-22 13:10:26 +10:00
Daniel Oaks
405be4e13d New translations help.lang.json (Romanian) 2019-02-22 13:10:00 +10:00
Daniel Oaks
1bde95991c New translations chanserv.lang.json (Romanian) 2019-02-22 13:09:15 +10:00
Daniel Oaks
cc333e9e7c New translations nickserv.lang.json (Romanian) 2019-02-22 13:09:04 +10:00
Daniel Oaks
bc5bcf218a New translations irc.lang.json (Romanian) 2019-02-22 13:06:16 +10:00
Daniel Oaks
0b25a91556 New translations hostserv.lang.json (Romanian) 2019-02-22 13:05:56 +10:00
Daniel Oaks
d738688b2a Simplify NS GROUP help text 2019-02-22 12:53:01 +10:00
Daniel Oaks
6d109e92a5 Fix dodgy TL strings to make them easier to translate 2019-02-22 12:37:11 +10:00
Daniel Oaks
92a3ed9eca Make TL script dump dodgy strings for confirmation 2019-02-22 12:36:55 +10:00
Shivaram Lingamneni
98ab3d14ee improved error messages from walking someone through the steps 2019-02-21 16:24:07 -05:00
Daniel Oaks
56e673559b
Merge pull request #411 from slingamn/responsebuffer
address #391
2019-02-22 07:21:32 +10:00
Shivaram Lingamneni
4af56f2dae add missing set -e
ensuring that install.sh exits 1 if `go install` fails,
which ensures that make sees the failure
2019-02-21 05:43:15 -05:00
Shivaram Lingamneni
00c62ddabe documentation update 2019-02-21 04:34:58 -05:00
Shivaram Lingamneni
b6feca05a3 first pass at #409 2019-02-21 03:38:06 -05:00
Shivaram Lingamneni
baa2c3b581 send the response line to NICK via the response buffer 2019-02-20 22:20:23 -05:00
Shivaram Lingamneni
bbd99b655a A labeled command that has 0 response lines should receive an empty batch
See discussion on #391.
2019-02-20 21:40:25 -05:00
Shivaram Lingamneni
c6b9fe0218 fix #384 2019-02-19 03:12:47 -05:00
Shivaram Lingamneni
234d011c29
Merge pull request #401 from oragono/rc1
documentation and other changes for rc1
2019-02-18 03:59:22 -05:00
Shivaram Lingamneni
a0eed62b4c correct my earlier overexcitement re. punctuation 2019-02-18 03:56:43 -05:00
Shivaram Lingamneni
3fa5e88e05 blurb from dan, consistent punctuation 2019-02-18 03:52:33 -05:00
Shivaram Lingamneni
fcef121aac bump oragono version to 1.0.0-rc1 2019-02-18 03:35:14 -05:00
Shivaram Lingamneni
057404d8f8 Merge branch 'rc1_changelog' into dependency_upgrade 2019-02-18 03:30:57 -05:00
Shivaram Lingamneni
8450a513de bump the vendor submodule 2019-02-18 03:30:50 -05:00
Shivaram Lingamneni
0b974c126d commit the results of dep ensure -update 2019-02-18 02:52:44 -05:00
Shivaram Lingamneni
806582713a upgrade docopt
PR #311 started using docopt.ParseArgs. This is not available in the pinned version
0.6.2. (Not totally sure how we got on a higher version than the pinned one?)
2019-02-18 02:48:41 -05:00
Shivaram Lingamneni
5a47d6076b changelog updates for 1.0.0-rc1 2019-02-18 01:23:46 -05:00
Daniel Oaks
329183d083
Merge pull request #397 from slingamn/znc
work around znc's broken nickserv support
2019-02-18 14:01:55 +10:00
Shivaram Lingamneni
29c6db593a fix missing Unescape call 2019-02-17 22:59:13 -05:00
Shivaram Lingamneni
729d4b377c revised string from discussion on ticket 2019-02-17 22:47:41 -05:00
Shivaram Lingamneni
a211ddfcdb work around znc's broken nickserv support 2019-02-17 21:29:04 -05:00
Daniel Oaks
09909e3b3d
Merge pull request #396 from slingamn/issue394
fix #394
2019-02-18 10:24:35 +10:00
Daniel Oaks
7cf8aaccf6
Merge pull request #352 from slingamn/chanreglimit.1
track channel registrations per account
2019-02-18 07:08:57 +10:00
Daniel Oaks
c604638b7c
Merge pull request #386 from slingamn/regenabled
allow SAREGISTER even when normal registration is fully disabled
2019-02-18 07:08:04 +10:00
Daniel Oaks
bfbc07f35a
Merge pull request #393 from slingamn/csop
fix #392
2019-02-18 07:07:31 +10:00
Shivaram Lingamneni
a5b9634783 fix #394 2019-02-17 14:29:04 -05:00
Shivaram Lingamneni
344a1d7e48 fix #392 2019-02-17 06:51:48 -05:00
Shivaram Lingamneni
3d89c70c49
Merge pull request #390 from slingamn/issue389
fix #389
2019-02-15 13:54:32 -05:00
Shivaram Lingamneni
a5f04495a1 fix #389 2019-02-15 13:34:09 -05:00
Shivaram Lingamneni
9b75f4ba59 tweak the bootstrapping advice again 2019-02-15 02:28:03 -05:00
Shivaram Lingamneni
543fd0aa14 document bootstrapping technique 2019-02-14 21:27:42 -05:00
Shivaram Lingamneni
d147708158 allow SAREGISTER even when normal registration is fully disabled 2019-02-14 20:42:02 -05:00
Daniel Oaks
355491d4e1
Merge pull request #385 from slingamn/fixes.2
2 small fixes
2019-02-15 08:24:48 +10:00
Shivaram Lingamneni
754934b429 unregister should boot clients if sasl is required 2019-02-14 15:42:07 -05:00
Shivaram Lingamneni
9ce1d31b90 fix HS STATUS for logged-out users 2019-02-14 15:08:45 -05:00
Daniel Oaks
93c17e6b98
Merge pull request #378 from slingamn/issue364.1
fix #364
2019-02-14 07:59:23 +10:00
Shivaram Lingamneni
519d19c364 fix #364 2019-02-13 16:48:26 -05:00
Daniel Oaks
a273ef624c
Merge pull request #377 from slingamn/kickfail
fix another three bugs that were reported today
2019-02-14 07:23:56 +10:00
Daniel Oaks
3c126a2ba9
Merge pull request #373 from slingamn/issue371
fix #371
2019-02-14 07:20:04 +10:00
Shivaram Lingamneni
c019fa3ab2 fix #375 2019-02-13 15:48:15 -05:00
Shivaram Lingamneni
e2e07c0eee fix #374 2019-02-13 15:09:23 -05:00
Shivaram Lingamneni
b7ec121c19 fix some KICK issues
reported by bogdomania

1. KICK without privileges incorrectly returned ERR_CANNOTSENDTOCHAN
2. Halfops should be able to kick voice and unprivileged, but not other halfops
2019-02-13 14:38:10 -05:00
Shivaram Lingamneni
4c7a5585db fix #371 2019-02-13 13:22:00 -05:00
Shivaram Lingamneni
7438c89d6b
Merge pull request #372 from oragono/master+setname
Draft implementation of draft/setname
2019-02-13 12:58:05 -05:00
Daniel Oaks
78a0b322f7 Make it act as intended 2019-02-13 23:42:03 +10:00
Daniel Oaks
53ed368701 Draft implementation of draft/setname 2019-02-13 23:22:16 +10:00
Daniel Oaks
d804dddda5
Merge pull request #370 from slingamn/identify
four small changes
2019-02-13 20:37:01 +10:00
Shivaram Lingamneni
7786043275 make the land-grab check case-insensitive 2019-02-13 03:19:47 -05:00
Shivaram Lingamneni
44a0770215 document logging methods 2019-02-13 02:54:27 -05:00
Shivaram Lingamneni
6d690b0e36 add loglines for account registration, login, and unregistration 2019-02-13 02:54:27 -05:00
Shivaram Lingamneni
f40c363170 compatibility mode for NS IDENTIFY
Standard nickserv clients like znc's expect (by default) to send just:

PRIVMSG NickServ :identify $passphrase

with the account name assumed to be the currently held nick.

Let's support this in the common case where the client doesn't have a certfp
(if it does, the first argument is the account name, not the passphrase).
2019-02-13 02:54:27 -05:00
Shivaram Lingamneni
5bd2133946
Merge pull request #368 from slingamn/resume_three.a
update resume support to draft/resume-0.3
2019-02-12 12:55:49 -05:00
Shivaram Lingamneni
5beb0764f2 review fix 2019-02-12 12:53:58 -05:00
Shivaram Lingamneni
e4c9351254 fix: set the existing channels unregistered 2019-02-12 02:09:31 -05:00
Shivaram Lingamneni
afe94d43c3 update resume support to draft/resume-0.3 2019-02-12 01:03:19 -05:00
Daniel Oaks
cf2445abe7
Merge pull request #366 from oragono/l10n_master
New Crowdin translations
2019-02-11 08:18:01 +10:00
Daniel Oaks
501f7409d7 New translations nickserv.lang.json (Romanian) 2019-02-11 08:15:12 +10:00
Daniel Oaks
49ea872c66 New translations nickserv.lang.json (Spanish) 2019-02-11 08:15:09 +10:00
Daniel Oaks
2382bb14cd New translations nickserv.lang.json (French) 2019-02-11 08:15:07 +10:00
Daniel Oaks
14082a63cc New translations nickserv.lang.json (Czech) 2019-02-11 08:15:06 +10:00
Daniel Oaks
f9c0c89ee0 New translations nickserv.lang.json (Catalan) 2019-02-11 08:15:05 +10:00
Daniel Oaks
f5ce726b16 New translations hostserv.lang.json (Czech) 2019-02-11 08:15:00 +10:00
Daniel Oaks
84e8f35d8b New translations hostserv.lang.json (Catalan) 2019-02-11 08:14:58 +10:00
Daniel Oaks
aee91f2d69 New translations hostserv.lang.json (Arabic) 2019-02-11 08:14:58 +10:00
Daniel Oaks
d747a779a0 New translations hostserv.lang.json (Afrikaans) 2019-02-11 08:14:57 +10:00
Daniel Oaks
09a3797ba3 New translations hostserv.lang.json (French) 2019-02-11 08:14:56 +10:00
Daniel Oaks
e5a3aec263 New translations nickserv.lang.json (Arabic) 2019-02-11 08:14:55 +10:00
Daniel Oaks
2b555e0622 New translations chanserv.lang.json (Catalan) 2019-02-11 08:14:53 +10:00
Daniel Oaks
bae286aa2f New translations chanserv.lang.json (Arabic) 2019-02-11 08:14:52 +10:00
Daniel Oaks
86d75c3ea3 New translations chanserv.lang.json (Afrikaans) 2019-02-11 08:14:51 +10:00
Daniel Oaks
ae70c82f2c New translations nickserv.lang.json (Afrikaans) 2019-02-11 08:14:43 +10:00
Daniel Oaks
40740bf856 New translations chanserv.lang.json (Czech) 2019-02-11 08:14:42 +10:00
Daniel Oaks
a8094f4557 New translations chanserv.lang.json (French) 2019-02-11 08:14:41 +10:00
Daniel Oaks
1c47ee2bbf New translations chanserv.lang.json (Spanish) 2019-02-11 08:14:39 +10:00
Daniel Oaks
134c71ede3 New translations chanserv.lang.json (Romanian) 2019-02-11 08:14:38 +10:00
Daniel Oaks
efd06adec6 New translations hostserv.lang.json (Romanian) 2019-02-11 08:14:34 +10:00
Daniel Oaks
08196484fb New translations help.lang.json (Catalan) 2019-02-11 08:14:33 +10:00
Daniel Oaks
0dc9e2730f New translations help.lang.json (Arabic) 2019-02-11 08:14:31 +10:00
Daniel Oaks
fe1d8eaaef New translations help.lang.json (Afrikaans) 2019-02-11 08:14:30 +10:00
Daniel Oaks
c4614a60a3 New translations irc.lang.json (Spanish) 2019-02-11 08:14:23 +10:00
Daniel Oaks
6f26fc3fb2 New translations irc.lang.json (Romanian) 2019-02-11 08:14:06 +10:00
Daniel Oaks
eda28b4a6e New translations help.lang.json (Spanish) 2019-02-11 08:14:00 +10:00
Daniel Oaks
db67979fc9 New translations help.lang.json (Romanian) 2019-02-11 08:13:58 +10:00
Daniel Oaks
e6f077d370 New translations help.lang.json (French) 2019-02-11 08:13:50 +10:00
Daniel Oaks
b23650257a New translations irc.lang.json (Greek) 2019-02-11 08:13:48 +10:00
Daniel Oaks
0f0e0cb7c1 New translations irc.lang.json (French) 2019-02-11 08:13:47 +10:00
Daniel Oaks
06e98c8a75 New translations hostserv.lang.json (Spanish) 2019-02-11 08:13:41 +10:00
Daniel Oaks
179d104c49 New translations irc.lang.json (Czech) 2019-02-11 08:13:35 +10:00
Daniel Oaks
fdf52a7e3a New translations irc.lang.json (Catalan) 2019-02-11 08:13:30 +10:00
Daniel Oaks
944afcac60 New translations irc.lang.json (Arabic) 2019-02-11 08:13:28 +10:00
Daniel Oaks
3822eb2ad2 New translations irc.lang.json (Afrikaans) 2019-02-11 08:13:26 +10:00
Daniel Oaks
ba2b4fb3e6
Merge pull request #365 from slingamn/hopm
document hopm integration, fixes #272
2019-02-11 06:43:44 +10:00
Shivaram Lingamneni
c17d3fa9a1 document hopm integration, fixes #272 2019-02-10 13:10:59 -05:00
Daniel Oaks
6dfd4317df
Merge pull request #363 from slingamn/gdpr
disable history by default
2019-02-10 21:07:47 +10:00
Shivaram Lingamneni
ecfac82a22 disable history by default 2019-02-10 06:06:11 -05:00
Daniel Oaks
3220242fae
Merge pull request #358 from slingamn/resumefix.3
RESUME should end cap negotiation without requiring CAP LS
2019-02-10 20:59:23 +10:00
Daniel Oaks
6ca2cb26d7
Merge pull request #351 from slingamn/changelog.2
changelog and manual updates, plus some last-minute fixes
2019-02-10 20:45:45 +10:00
Shivaram Lingamneni
17379b4678
Merge pull request #359 from slingamn/helpfix
fix typo in CHATHISTORY help url
2019-02-10 02:10:31 -05:00
Shivaram Lingamneni
46083f5739 fix typo in CHATHISTORY help url
reported by bogdomania
2019-02-10 02:09:48 -05:00
Shivaram Lingamneni
35abe7940a RESUME should end cap negotiation without requiring CAP LS 2019-02-09 20:26:32 -05:00
Shivaram Lingamneni
370255bec1 review fixes 2019-02-06 15:47:20 -05:00
Daniel Oaks
fef58bb935
Merge pull request #354 from slingamn/issue353
don't send the client its own on-join MODE line
2019-02-07 06:37:10 +10:00
Shivaram Lingamneni
2910eda737 fix a nit 2019-02-06 14:28:17 -05:00
Shivaram Lingamneni
4083c7cf0d
Merge pull request #356 from csmith/username-hostname-fix
Fix usernames being used in place of hostnames.
2019-02-06 14:19:16 -05:00
Chris Smith
34a9a37b82 Fix usernames being used in place of hostnames.
Closes #355
2019-02-06 19:14:32 +00:00
Shivaram Lingamneni
20b8ba8cae don't send the client its own on-join MODE line
Fixes #353.
2019-02-06 13:50:45 -05:00
Shivaram Lingamneni
eff2571096 limit the number of channels a client can join 2019-02-06 04:55:05 -05:00
Shivaram Lingamneni
ff7bbc4a9c track channel registrations per account
* limit the total number of registrations per account
* when an account is unregistered, unregister all its channels
2019-02-06 04:34:45 -05:00
Shivaram Lingamneni
54ca7915c9 reference NS ENFORCE in the manual 2019-02-05 21:33:45 -05:00
Shivaram Lingamneni
73f36fba08 NS REGISTER needs a login throttle check as well 2019-02-05 20:23:32 -05:00
Shivaram Lingamneni
fba91b908f document chanserv amode, fixes #299 2019-02-05 20:23:32 -05:00
Shivaram Lingamneni
d321bf63ae document nick reservation 2019-02-05 20:23:32 -05:00
Shivaram Lingamneni
775ead700f prevent nick reservation land-grabs 2019-02-05 20:18:40 -05:00
Shivaram Lingamneni
726dbedab6 changelog updates 2019-02-05 20:18:40 -05:00
Shivaram Lingamneni
7608e0c76c fix #121 2019-02-05 20:17:55 -05:00
Shivaram Lingamneni
8eefe869d0
Merge pull request #350 from oragono/unicode-usernames-fix
Set uninteresting username if user's using a special nick
2019-02-05 17:50:13 -05:00
Daniel Oaks
457b7eaf11 Review fixes 2019-02-06 08:45:09 +10:00
Daniel Oaks
8ecf96d447 Set uninteresting username if user's using a special nick 2019-02-06 08:33:15 +10:00
Daniel Oaks
71a33890b8
Merge pull request #344 from slingamn/history.4
add CHATHISTORY and HISTORY implementations
2019-02-05 22:16:45 +10:00
Shivaram Lingamneni
a9f9f725b1 review fixes 2019-02-05 04:29:32 -05:00
Shivaram Lingamneni
928caba922
Merge pull request #345 from slingamn/saslonly.3
add sasl-only config option
2019-02-05 04:10:35 -05:00
Shivaram Lingamneni
daf1e68a7d review fix 2019-02-05 03:42:08 -05:00
Daniel Oaks
35fadd10fa
Merge pull request #346 from slingamn/identfixup.2
simplify username logic
2019-02-05 18:09:06 +10:00
Shivaram Lingamneni
36612f6e2d review fixes 2019-02-05 03:05:05 -05:00
Shivaram Lingamneni
bf1d758de9 simplify username logic 2019-02-05 02:42:13 -05:00
Shivaram Lingamneni
e094c2a9c5 add tests for masking in limiter/throttler 2019-02-05 02:25:16 -05:00
Shivaram Lingamneni
eb8f0e50df fix masking bug
IP.Mask() returns a new IP value, rather than modifying its target in place
2019-02-05 02:25:16 -05:00
Shivaram Lingamneni
1c23af8767 add sasl-only config option 2019-02-05 00:51:58 -05:00
Shivaram Lingamneni
463de94610 allow history queries against PRIVMSG of other clients, if the accounts match 2019-02-04 12:46:04 -05:00
Shivaram Lingamneni
51fcedc5a1 review fix 2019-02-04 12:16:28 -05:00
Shivaram Lingamneni
f6b3008f8f add CHATHISTORY and HISTORY implementations 2019-02-04 05:33:36 -05:00
Daniel Oaks
ea07d99074 Changelog updates 2019-02-04 07:20:03 +10:00
Daniel Oaks
466e4940b0 Update changelog 2019-02-04 07:13:21 +10:00
Daniel Oaks
59cf26f5a4 Update changelog. 2019-02-04 07:11:21 +10:00
Daniel Oaks
264bf8f0e5 Update changelog 2019-02-04 07:10:15 +10:00
Shivaram Lingamneni
057d00b2c8
Merge pull request #341 from oragono/restrict-usernames
Restrict idents as other servers do
2019-02-03 15:24:08 -05:00
Daniel Oaks
2ce203a6d8 Setup v0.13.0-unreleased devel ver (I forgot to do this~) 2019-02-04 06:18:40 +10:00
Daniel Oaks
e8309aee79 Avoiding a crash when getting a short ident is a good thing 2019-02-04 05:02:13 +10:00
Daniel Oaks
151002e232 Up identlen default to 20 2019-02-04 05:01:46 +10:00
Daniel Oaks
cf88986e1e Finish updating TL instructions 2019-02-04 04:55:45 +10:00
Daniel Oaks
d806eefcdf Update TL instructions 2019-02-04 04:53:57 +10:00
Daniel Oaks
59d44e5b1f
Merge pull request #342 from oragono/l10n_master
New Crowdin translations
2019-02-04 04:19:56 +10:00
Daniel Oaks
db85d057df New translations nickserv.lang.json (Danish) 2019-02-04 04:18:40 +10:00
Daniel Oaks
78f686234e New translations hostserv.lang.json (Danish) 2019-02-04 04:18:39 +10:00
Daniel Oaks
81d0aee132 New translations irc.lang.json (Danish) 2019-02-04 04:18:38 +10:00
Daniel Oaks
bb2eb5d884 New translations help.lang.json (Danish) 2019-02-04 04:18:36 +10:00
Daniel Oaks
8f5c350c03 New translations chanserv.lang.json (Danish) 2019-02-04 04:18:35 +10:00
Daniel Oaks
dd01e3a464 New translations help.lang.json (Czech) 2019-02-04 04:18:30 +10:00
Daniel Oaks
37c1902c9e Force CrowdIn to put files in the right place 2019-02-04 04:15:45 +10:00
Daniel Oaks
ce0f80577d Update translations 2019-02-04 03:54:18 +10:00
Daniel Oaks
7eef390756 Handle translations a little better 2019-02-04 03:54:10 +10:00
Daniel Oaks
e1553aa912 Initial CrowdIn translation stuff 2019-02-03 21:11:45 +10:00
Daniel Oaks
84333b82ae Update translations from CrowdIn! 2019-02-03 20:21:22 +10:00
Daniel Oaks
46f8ef9ed3 Be less strict with our language file loading, and handle multiple credits better 2019-02-03 20:21:07 +10:00
Daniel Oaks
bcb8a6fe7e Update example language files and translation grabber 2019-02-03 19:45:11 +10:00
Daniel Oaks
cfbb4361dc Restrict ident length similar to other servers 2019-02-03 19:24:59 +10:00
Daniel Oaks
8cd5db1194 Restrict idents as other servers do 2019-02-03 18:49:42 +10:00
Daniel Oaks
9f25a42c3d
Merge pull request #340 from slingamn/skeletonfolding.2
more lenient casefolding for skeletons
2019-02-03 18:34:12 +10:00
Shivaram Lingamneni
c34d9e0b72 more lenient casefolding for skeletons 2019-02-03 02:45:02 -05:00
Daniel Oaks
e7399ba2b5
Merge pull request #339 from slingamn/startuplog
rename the "startup", "rehash", and "shutdown" log types to "server"
2019-02-03 12:37:24 +10:00
Daniel Oaks
1f33ad290c
Merge pull request #334 from slingamn/confusables.4
implement confusables prevention (#178)
2019-02-03 12:33:44 +10:00
Shivaram Lingamneni
7f9445324d exit 1 if startup fails 2019-02-02 21:15:41 -05:00
Shivaram Lingamneni
cbe0f79f73 unify "startup", "rehash", and "shutdown" log categories as "server" 2019-02-02 21:13:01 -05:00
Daniel Oaks
c55bc1c37d
Merge pull request #338 from slingamn/capnak
correctly support disabling caps with CAP REQ, fixes #337
2019-02-03 12:01:38 +10:00
Shivaram Lingamneni
f48af3ee44 correctly support disabling caps with CAP REQ, fixes #337 2019-02-02 20:22:07 -05:00
Daniel Oaks
6667585605 trimspace on piped passwords 2019-02-03 08:08:12 +10:00
Daniel Oaks
6f2b610736 Allow piping into genpasswd for docker 2019-02-03 07:21:46 +10:00
Daniel Oaks
becbf409da Remove deprecated line from goreleaser config 2019-02-03 05:50:23 +10:00
Shivaram Lingamneni
35948d2e5b refactor some conditions for clarity 2019-01-31 17:34:06 -05:00
Daniel Oaks
ea24eadb05
Merge pull request #335 from csmith/default-config-listen-ports
Comment out 6668 bindings in default config
2019-01-31 21:54:13 +13:00
Chris Smith
5ede1e6d5a Comment out 6668 bindings in default config
These are just used as examples, and prevent Oragono from starting
up if the host doesn't have an IPv6 stack (e.g. inside docker
containers).

See oragono/oragono-docker#5
2019-01-31 08:43:48 +00:00
Daniel Oaks
3f2fc13563
Merge pull request #330 from csmith/readme-docker
Add docker info to README
2019-01-31 20:35:56 +13:00
Shivaram Lingamneni
bea3889a1f bump vendor to include oragono/confusables 2019-01-30 22:02:14 -05:00
Shivaram Lingamneni
18c0c9da45 use our fork of mtibben/confusables for now 2019-01-30 22:02:14 -05:00
Shivaram Lingamneni
b9b2553a2f use the TR39 skeleton algorithm to prevent confusables (#178) 2019-01-30 21:48:53 -05:00
Chris Smith
d2c1705931
Marker docker section as BETA
(Here be dragons)
2019-01-29 23:36:32 +00:00
Shivaram Lingamneni
a11486d699
Merge pull request #332 from slingamn/rtlnickmasks
fix spurious bidi violations when casefolding the nickmask of an RTL nick
2019-01-29 17:46:32 -05:00
Shivaram Lingamneni
8438afcc5c fix: usernames from ident don't get a ~ 2019-01-28 23:35:00 -05:00
Shivaram Lingamneni
4bbba5b478 fix the issue for AllNickmasks as well 2019-01-28 23:12:25 -05:00
Shivaram Lingamneni
a2a9788f39 fix spurious bidi violations when casefolding the nickmask of an RTL nick 2019-01-28 18:15:35 -05:00
Chris Smith
63c2167220
Add docker info to README
Mention that the Dockerfile etc are in a different repository
2019-01-27 23:28:19 +00:00
Shivaram Lingamneni
14ce8d850e
Merge pull request #329 from slingamn/dkline_refactor.4
refactor [dk]lines
2019-01-27 03:10:51 -05:00
Shivaram Lingamneni
96737ea6d7 fix a memory leak
Even after the timer fired, we were retaining a pointer to it;
clean those up too along with the other cleanup tasks.
2019-01-23 02:06:00 -05:00
Shivaram Lingamneni
854d85a474 add schema change for [dk]line refactor 2019-01-22 17:18:38 -05:00
Shivaram Lingamneni
6bdc6af186 refactor [dk]lines, implement #144 2019-01-22 17:18:38 -05:00
Shivaram Lingamneni
f154ea9583 add an error message for schema changes 2019-01-22 01:25:32 -05:00
Daniel Oaks
85276c5e6d Merge branch 'master' of github.com:oragono/oragono 2019-01-12 22:18:08 +10:00
Daniel Oaks
63fde2d62a Re-enable MaxLine 2019-01-12 22:17:51 +10:00
Daniel Oaks
16981f2abb
Merge pull request #327 from slingamn/misc3
two service bug fixes
2019-01-10 12:05:50 +10:00
Shivaram Lingamneni
0475fe882c fix ns register validation bug 2019-01-09 15:03:44 -05:00
Shivaram Lingamneni
d6494957a4 forbid logging in twice via nickserv 2019-01-05 20:59:42 -05:00
Shivaram Lingamneni
3db6c9472b
Merge pull request #325 from slingamn/services.1
services refactor
2019-01-05 18:30:26 -05:00
Shivaram Lingamneni
598d9a025b review fix: add maxParams for service commands 2019-01-04 11:45:59 -05:00
Shivaram Lingamneni
4caa362f18 fix histserv nick reservation 2019-01-04 10:32:08 -05:00
Shivaram Lingamneni
a52d167278 additional defensive check in EnforcementStatus 2019-01-03 23:44:01 -05:00
Shivaram Lingamneni
efc0ce3b81 fix an edge case in configurable nickname reservation 2019-01-03 23:05:47 -05:00
Shivaram Lingamneni
b80df0885f refactor services code 2019-01-03 22:34:11 -05:00
Daniel Oaks
ea970f94a0
Merge pull request #323 from slingamn/initdb.1
fix #322
2019-01-03 09:18:19 +10:00
Daniel Oaks
0e22f8d6a5
Merge pull request #324 from slingamn/misc_again.5
some more changes
2019-01-03 09:16:44 +10:00
Shivaram Lingamneni
501bb1e5c5 replay JOIN/PART/QUIT/KICK as PRIVMSG from HistServ
see https://github.com/ircv3/ircv3-specifications/issues/293
2019-01-02 17:58:04 -05:00
Shivaram Lingamneni
f20abf414f don't log an error logline for an incorrect SASL password 2019-01-02 10:29:42 -05:00
Shivaram Lingamneni
2ee89b15b3 per-user settings for nickname enforcement 2019-01-02 10:15:59 -05:00
Shivaram Lingamneni
d0ded906d4 fix a fairly bad bug where nicks could get out of sync
during nick change, removeInternal(client) was being called even before checking
whether the new nick was in use or reserved. Reproduction steps:

1. Log in a client 'alice'
2. Log in a client 'bob'
3. bob issues /nick alice, which fails (correctly) with:
:oragono.test 433 bob alice :Nickname is already in use
4. alice issues /msg bob hi, which fails (incorrectly) with:
:oragono.test 401 alice bob :No such nick
2019-01-02 10:15:59 -05:00
Shivaram Lingamneni
9a2117f75d preregNick doesn't need synchronization
(since it's only accessed from the client's own goroutine)
2019-01-02 10:15:59 -05:00
Shivaram Lingamneni
f94f737b31 add support for login throttling 2019-01-02 10:15:59 -05:00
Shivaram Lingamneni
3cd3601a30 refactor join/part 2019-01-02 09:55:45 -05:00
Shivaram Lingamneni
960d51159c add ClientDetails struct for getting a snapshot of client state 2019-01-02 09:55:45 -05:00
Shivaram Lingamneni
c2b2559ab4 avoid some uses of Sprintf for loglines 2019-01-02 09:55:45 -05:00
Shivaram Lingamneni
ec4f1c189a pointless optimizations to the logger 2019-01-01 16:43:35 -05:00
Shivaram Lingamneni
6402a69fb9 use the rehash log category consistently 2018-12-31 01:44:31 -05:00
Shivaram Lingamneni
9e87d6dd10 remove explicit initdb instructions from the docs 2018-12-31 01:44:31 -05:00
Shivaram Lingamneni
d6d3a10817 implement #322
Automatically create the datastore on `oragono run` if it doesn't exist.
See also #302.
2018-12-31 01:44:31 -05:00
Daniel Oaks
847922e53d
Merge pull request #321 from slingamn/misc.2
eight small changes
2018-12-31 13:12:34 +10:00
Shivaram Lingamneni
7c36ec3f9d allow auto-ops (halfop and higher) to bypass channel join restrictions 2018-12-30 18:28:56 -05:00
Shivaram Lingamneni
a4b3fb0e83 changes to client idle time counting
1. Remove leaveClientIdle (unused)
2. s/leaveClientActive/leaveClientIdle/
3. make ISON a leaveClientIdle command (some clients send it periodically
   if a /msg window is left open)
2018-12-30 18:17:24 -05:00
Shivaram Lingamneni
ba2aacaf5b fix #297
add validation for isupport tokens
2018-12-30 18:17:24 -05:00
Shivaram Lingamneni
b34bab16a7 ensure that identical PRIVMSG share a time tag 2018-12-30 18:17:24 -05:00
Shivaram Lingamneni
d5eade5494 force trailing zeroes in timestamp wire format
According to jwheare, ISO 8601 doesn't specify the behavior one way
or the other, and the server-time spec is also ambiguous, but this
is safest.
2018-12-30 18:17:24 -05:00
Shivaram Lingamneni
ac480d782f add millisecond resolution to loglines 2018-12-30 18:17:24 -05:00
Shivaram Lingamneni
f35a1c7212 use GenerateSecretToken for msgids 2018-12-30 18:17:24 -05:00
Shivaram Lingamneni
c95ed46949 add whois support for services 2018-12-30 18:17:24 -05:00
Daniel Oaks
cd339281e4
Merge pull request #320 from slingamn/replay.1
history replay enhancements
2018-12-29 10:15:02 +10:00
Shivaram Lingamneni
2c7c8fbaf9 history replay enhancements 2018-12-28 13:45:55 -05:00
Shivaram Lingamneni
6beeceb52c
Merge pull request #316 from slingamn/hsfix
fix hostserv help string
2018-12-28 11:15:25 -05:00
Shivaram Lingamneni
525b2c52b1 fix hostserv help string 2018-12-28 11:07:08 -05:00
Daniel Oaks
f3d138d909
Merge pull request #314 from slingamn/invite.1
fix #313 and a related issue
2018-12-24 08:52:03 +10:00
Shivaram Lingamneni
f58c873f84 fix RPL_INVITING response to match modern ircdocs 2018-12-23 13:49:03 -05:00
Shivaram Lingamneni
b6b4d365bc fix #313 2018-12-23 13:30:25 -05:00
Daniel Oaks
f912f64f21
Merge pull request #304 from slingamn/history.1
draft/resume-0.2 implementation, message history support
2018-12-15 04:37:16 +10:00
Daniel Oaks
6cedb80374
Merge pull request #311 from iNecas/fix-docopt-deprecation
Replace docopt.Parse with docopt.ParseArgs
2018-12-08 08:55:00 +10:00
Ivan Nečas
9a1ede86d3 Replace docopt.Parse with docopt.ParseArgs
docopt.Parse has been deprecated in
943c2addfe
2018-12-07 22:48:54 +01:00
Daniel Oaks
e1aa3e0f4a
Merge pull request #305 from slingamn/passwd.1
implement NS PASSWD for password changes
2018-12-07 10:43:10 +10:00
Daniel Oaks
a0c1fa1843
Merge pull request #308 from slingamn/bidirule
fix #306
2018-12-07 10:40:00 +10:00
Shivaram Lingamneni
92eca4d795 add more test cases 2018-12-06 06:46:11 -05:00
Shivaram Lingamneni
40e63dbbe8 fix #306
Fix spurious bidi rule violations in casefolding channel names
by stripping the # before starting the casefolding.
2018-12-05 22:39:01 -05:00
Shivaram Lingamneni
48f9b5e4fa implement NS PASSWD for password changes 2018-11-28 18:25:15 -05:00
Shivaram Lingamneni
c8cf0befc6 fixes to irc/socket.go
* fix a race condition: a call to `Write` does not spawn a writer goroutine
  if the trylock is held, so `BlockingWrite` must check for fresh data after
  releasing the trylock
* streamline some close/finalize logic
2018-11-28 00:24:44 -05:00
Shivaram Lingamneni
a0bf548fc5 draft/resume-0.2 implementation, message history support 2018-11-26 05:23:27 -05:00
Shivaram Lingamneni
70364f5f67
Merge pull request #303 from enckse/master
prevents default create/open of buntdb, requires user to call initdb
2018-11-19 14:23:03 -05:00
Sean Enck
c20afab7c2
prevents default create/open of buntdb, requires user to call initdb 2018-11-19 14:10:12 -05:00
Daniel Oaks
55503961cb Release v0.12.0 2018-10-15 12:18:23 +10:00
Daniel Oaks
e365103fb5 Add missing key to changelog 2018-10-15 12:05:22 +10:00
Daniel Oaks
2b10b73bbc Update changelog 2018-10-15 12:03:38 +10:00
Daniel Oaks
8e027fb58f vendor: Updated submodules 2018-10-15 11:51:55 +10:00
Daniel Oaks
a7e88f51fe
Merge pull request #294 from slingamn/proxy_ipv6.1
fix PROXY protocol support for IPv6
2018-10-15 11:43:16 +10:00
Shivaram Lingamneni
8de6da14c0
Merge pull request #295 from vilmibm/patch-1
Correct NS REGISTER example
2018-09-05 23:46:10 -04:00
Nate Smith
aab44155a2
Correct NS REGISTER example 2018-09-05 11:01:47 -07:00
Shivaram Lingamneni
10d4f77638 fix PROXY protocol support for IPv6
1. Handle PROXY lines with IPv6 addresses starting with ::
(similar to WEBIRC in issue #211)

2. Strip v6 mapping from v4 addresses when handling proxied IPs.
2018-09-03 00:38:32 -04:00
Shivaram Lingamneni
f0491c2254
Merge pull request #293 from slingamn/perms
configurable file mode for unix socket listeners
2018-08-29 14:51:25 -04:00
Shivaram Lingamneni
72599ba01f review fix 2018-08-28 21:11:58 -04:00
Shivaram Lingamneni
0362269215 upgrade travis to golang 1.11 2018-08-28 19:28:49 -04:00
Shivaram Lingamneni
0e5842b33a fix #211 2018-08-28 19:28:49 -04:00
Shivaram Lingamneni
c3d197f4ff make unix domain socket permissions configurable 2018-08-28 19:28:49 -04:00
Shivaram Lingamneni
831969f1f0
Merge pull request #292 from slingamn/nilreceivers
re-add nil receiver for ModeSet.HasMode
2018-08-27 23:56:28 -04:00
Shivaram Lingamneni
c72a84e49f
Merge pull request #284 from slingamn/passhashing.1
new password hashing technique
2018-08-27 23:55:54 -04:00
Shivaram Lingamneni
86836905b3 re-add nil receiver for ModeSet.HasMode 2018-08-23 10:30:28 -04:00
Daniel Oaks
1fd63672f3
Merge pull request #290 from slingamn/rpl330.1
Fix a bug in 330 RPL_WHOISACCOUNT
2018-08-20 16:48:38 +10:00
Daniel Oaks
508c3269a0
Merge pull request #291 from slingamn/samode_crash
fix a crash when SAMODE'ing in a channel you're not joined to
2018-08-20 16:48:05 +10:00
Shivaram Lingamneni
ac08ce0f20 move ChannelOperator check into hasPrivs helper 2018-08-17 16:22:32 -04:00
Shivaram Lingamneni
a18283e2de fix a crash when SAMODE'ing in a channel you're not joined to 2018-08-17 12:44:49 -04:00
Shivaram Lingamneni
1fb9bd7208 Fix a bug in 330 RPL_WHOISACCOUNT
According to https://defs.ircdocs.horse/defs/numerics.html, 330 RPL_WHOISACCOUNT
takes 4 parameters: `<client> <nick> <authname> :<info>`. We were omitting
the second parameter (the target nick).

Also refactor locking.
2018-08-17 11:45:32 -04:00
Shivaram Lingamneni
7ebd35f5a0 update Gopkg.lock to include sha3 2018-08-15 13:07:28 -04:00
Shivaram Lingamneni
cbc2b07d35 Merge remote-tracking branch 'origin/master' into passhashing.2 2018-08-15 13:02:05 -04:00
Daniel Oaks
4ecdea0647
Merge pull request #289 from slingamn/allow_multiple
Miscellaneous cleanup
2018-08-15 22:21:34 +10:00
Shivaram Lingamneni
ea30e58244 bump vendor to remove stackimpact 2018-08-15 08:12:24 -04:00
Shivaram Lingamneni
a2c2419084 remove stackimpact 2018-08-14 23:26:43 -04:00
Shivaram Lingamneni
6eda236eab remove allow-multiple-per-connection 2018-08-14 22:50:20 -04:00
Shivaram Lingamneni
b45b863fc4 unregister capab was renamed to accreg, but i missed this occurrence 2018-08-14 22:48:06 -04:00
Daniel Oaks
5cb7c9ae7b
Merge pull request #287 from slingamn/lusers
fix miscounting in LUSERS
2018-08-09 10:35:38 +10:00
Shivaram Lingamneni
a4546c418b fix miscounting in LUSERS 2018-08-08 17:56:12 -04:00
Daniel Oaks
2a7af89694
Merge pull request #285 from slingamn/fatal.1
assorted fixes
2018-08-07 01:50:57 +10:00
Shivaram Lingamneni
7cd5b8473c fix a bug in CS UNREGISTER 2018-08-06 10:08:58 -04:00
Shivaram Lingamneni
578ca2fdf6 add support for service command aliases 2018-08-06 10:08:58 -04:00
Shivaram Lingamneni
3c12fb6254 fix #283 (remove unnecessary log.Fatal)
The server should never crash during rehash, even if the config is invalid.
2018-08-06 10:08:58 -04:00
Shivaram Lingamneni
eb5f2c1db9 fix webirc password handling 2018-08-06 04:55:39 -04:00
Shivaram Lingamneni
dfb0a57040 refactor the password hashing / password autoupgrade system 2018-08-06 02:26:21 -04:00
Daniel Oaks
6260869068 Upgrade password hashing.
Previously, we generated and prepended a long salt before generating
password hashes. This resulted in the hash verification cutting off long
before it should do. This form of salting is also not necessary with
bcrypt as it's provided by the password hashing and verification
functions themselves, so totally rip it out.

This commit also adds the functionality for the server to automagically
upgrade users to use the new hashing system, which means better
security and more assurance that people can't bruteforce passwords.

No need to apply a database upgrade to do this, whoo! \o/
2018-08-05 22:51:15 -04:00
Daniel Oaks
a72de2f4d2 Update changelog 2018-08-05 03:25:42 +10:00
Daniel Oaks
d52dfb8df5
Merge pull request #279 from slingamn/cleanup.1
refactor rehash to rely more on server.config
2018-07-24 14:50:24 +10:00
Shivaram Lingamneni
7154f14781 move handling of RecoverFromErrors into LoadConfig 2018-07-16 04:08:24 -04:00
Shivaram Lingamneni
1383190249 refactor rehash to rely more on server.config 2018-07-16 03:46:40 -04:00
Daniel Oaks
1a5db02236
Merge pull request #278 from slingamn/bitset_again
simplify CAS logic a bit
2018-07-12 20:05:26 +10:00
Shivaram Lingamneni
318da22448 simplify CAS logic a bit 2018-07-02 16:33:39 -04:00
Daniel Oaks
6ba741814d
Merge pull request #275 from slingamn/confirmations.1
some tweaks to account/channel unregistration
2018-07-02 16:00:49 +10:00
Daniel Oaks
477a9023ff
Merge pull request #277 from slingamn/bitset.3
implement #263
2018-07-02 16:00:04 +10:00
Shivaram Lingamneni
1e513a717c expand bitset tests 2018-06-27 17:42:39 -04:00
Shivaram Lingamneni
a1bbe0c7f2 review fix 2018-06-25 22:55:50 -04:00
Shivaram Lingamneni
2a33c1483b atomic bitset implementations of caps.Set and modes.ModeSet 2018-06-25 18:17:47 -04:00
Shivaram Lingamneni
cdbb369a9c add benchmarks for caps.Set 2018-06-25 16:41:13 -04:00
Shivaram Lingamneni
02a4aaf583 some tweaks to account/channel unregistration 2018-06-19 04:03:40 -04:00
Daniel Oaks
f4a284675d
Merge pull request #274 from slingamn/chanunreg.1
add CHANSERV UNREGISTER
2018-06-05 19:34:12 +10:00
Shivaram Lingamneni
c3b66b5236 add a verification code to CS UNREGISTER 2018-06-05 05:23:36 -04:00
Shivaram Lingamneni
31f386f5a9 add CHANSERV UNREGISTER 2018-06-04 05:02:22 -04:00
Daniel Oaks
7bf18443a8
Merge pull request #270 from slingamn/amode.1
frontend for persistent account modes in channels
2018-05-30 21:27:28 +10:00
Daniel Oaks
45b8d9e6fa Update snomask to work with HOPM 2018-05-29 03:21:48 +10:00
Daniel Oaks
4bfa5fc66e
Merge pull request #271 from slingamn/sajoin.3
implement SAJOIN, allow channel founders to join unconditionally
2018-05-25 21:07:42 +10:00
Shivaram Lingamneni
495705f538 implement SAJOIN, allow channel founders to join unconditionally 2018-05-25 02:47:50 -04:00
Shivaram Lingamneni
d3815fbe61 review fixes and updates 2018-05-25 00:38:20 -04:00
Daniel Oaks
13aba9e64c
Merge pull request #269 from slingamn/operfail
fix #268
2018-05-24 16:27:12 +10:00
Shivaram Lingamneni
444bebc40d force travis to use go 1.10.x 2018-05-23 20:22:42 -04:00
Shivaram Lingamneni
7122fb180c add a test 2018-05-23 16:18:53 -04:00
Shivaram Lingamneni
1016f86f70 implement CHANSERV AMODE 2018-05-23 16:00:49 -04:00
Shivaram Lingamneni
f408d0f37b review fix: add nil receivers to other read-only ModeSet methods 2018-05-23 15:50:04 -04:00
Shivaram Lingamneni
0751f52f37 fix #268 2018-05-22 04:23:33 -04:00
Daniel Oaks
f142bf065d services: Explicitly show when commands have been disabled in the HELP output 2018-05-19 09:00:22 +10:00
Daniel Oaks
de7b679fc5
Merge pull request #247 from slingamn/vhosts.3
initial vhosts implementation, #183
2018-05-19 08:51:16 +10:00
Daniel Oaks
8227822d3e
Merge pull request #264 from slingamn/deps.1
reduce copying of output lines
2018-05-04 23:13:56 +10:00
Daniel Oaks
555010b02c
Merge pull request #265 from slingamn/issue262.1
fix #262
2018-05-04 23:11:58 +10:00
Shivaram Lingamneni
510f4320d0 fix formatting issue 2018-05-04 04:28:01 -04:00
Shivaram Lingamneni
c0885f9cba add gofmt check to make test 2018-05-04 04:28:01 -04:00
Shivaram Lingamneni
f6373f7a4d fix #262 2018-05-04 00:29:16 -04:00
Shivaram Lingamneni
3508865a2f review fix 2018-05-02 05:57:59 -04:00
Shivaram Lingamneni
be588076e9 optimize IsLoggingRawIO 2018-05-01 06:00:39 -04:00
Shivaram Lingamneni
3150f4e23b reduce copying of output lines 2018-05-01 05:23:40 -04:00
Shivaram Lingamneni
5b416a0922 update irc-go to latest 2018-05-01 01:47:53 -04:00
Daniel Oaks
00949442e0
Merge pull request #260 from slingamn/perftesting.12
optimizations related to #237
2018-04-26 21:40:55 +10:00
Shivaram Lingamneni
ebfef1e848 add Semaphore and ServerSemaphores 2018-04-26 06:03:10 -04:00
Shivaram Lingamneni
6533893863 optimized implementation of Channel.Names() 2018-04-26 03:22:52 -04:00
Shivaram Lingamneni
ef35c587fc remove redundant friends computation 2018-04-25 00:58:54 -04:00
Shivaram Lingamneni
b97ae00fe3 refactor channel join and part 2018-04-25 00:58:54 -04:00
Shivaram Lingamneni
74fa58dda0 Merge remote-tracking branch 'origin/master' into vhosts.4 2018-04-23 21:46:12 -04:00
Daniel Oaks
22ec6139bf
Merge pull request #256 from slingamn/issue255.2
modes refactor, #255
2018-04-24 11:20:07 +10:00
Shivaram Lingamneni
abbbd2c899 review fix 2018-04-23 20:05:02 -04:00
Shivaram Lingamneni
cc9941cb07 review fixes, bug fixes 2018-04-23 02:38:35 -04:00
Daniel Oaks
78c0825e2a
Merge pull request #257 from slingamn/issue253
have travis enforce gofmt, #253
2018-04-23 12:24:58 +10:00
Shivaram Lingamneni
43b90f2a85 have travis enforce gofmt, #253 2018-04-22 20:41:29 -04:00
Shivaram Lingamneni
fad2475c3f modes refactor, #255 2018-04-22 19:36:15 -04:00
Daniel Oaks
8f22d5ffd8
Merge pull request #236 from slingamn/socket_again.1
eliminate dedicated RunSocketWriter goroutine
2018-04-23 02:07:43 +10:00
Daniel Oaks
4a17eadbce
Merge pull request #246 from slingamn/db_autoupgrade.1
implement database auto-upgrades (#243)
2018-04-22 13:39:41 +10:00
Daniel Oaks
0aab3b44e9
Merge pull request #252 from slingamn/issue249
fix #249
2018-04-22 13:38:26 +10:00
Shivaram Lingamneni
d56da7904a
Merge pull request #254 from moortens/lusers-statistics-2
Stats for LUSERS logic now seperated, fixed params in LUSERS
2018-04-21 23:33:09 -04:00
moocow
744ad2ce0b Stats for LUSERS logic now seperated, fixed params in LUSERS 2018-04-20 22:48:15 +02:00
Shivaram Lingamneni
393070b7d9 fix #249 2018-04-20 14:21:07 -04:00
Shivaram Lingamneni
3db71415c9 review fixes 2018-04-20 03:59:01 -04:00
Daniel Oaks
19bb6d5a46
Merge pull request #250 from moortens/luser-count-fix
Fixed LUSERS count not subtracting invisible users
2018-04-20 17:19:50 +10:00
moortens
0b3abb5bde
Fixed LUSERS count not subtracting invisible users 2018-04-20 09:11:56 +02:00
Shivaram Lingamneni
221d157c06
Merge pull request #248 from slingamn/developing
update developing documentation
2018-04-19 03:25:42 -04:00
Shivaram Lingamneni
1a6c334b3d update developing documentation 2018-04-19 03:22:45 -04:00
Shivaram Lingamneni
5e62cc4ebc initial vhosts implementation, #183 2018-04-19 03:00:56 -04:00
Daniel Oaks
40d6cd02da Fix whois channel handling 2018-04-18 01:11:12 +10:00
Shivaram Lingamneni
69fd3ac324 implement database auto-upgrades (#243) 2018-04-16 16:35:01 -04:00
Daniel Oaks
3a00b64830
Merge pull request #244 from slingamn/fix_fakelag
fix fakelag double-rate issue
2018-04-16 19:49:59 +10:00
Shivaram Lingamneni
f6d2dade4e fix fakelag double-rate issue
Basically, fakelag was counting the time imposed by its own sleeps as though
the user had themselves paused for that amount of time. Therefore, if a user
sent a large number of consecutive commands, every other command would pause
for the expected throttle interval, but the subsequent command would be
processed instantly (you'd get two back-to-back commands). This resulted in
throttled users being able to send at double the expected rate.
2018-04-16 04:32:57 -04:00
Daniel Oaks
c75d2c91c5
Merge pull request #224 from slingamn/channelkeys.1
Updates to channel persistence
2018-04-16 13:35:48 +10:00
Daniel Oaks
68a237800c Correct language code for Norsk 2018-04-16 13:23:33 +10:00
Daniel Oaks
5811226760 Only allow valid snomasks to be set 2018-04-16 13:20:37 +10:00
Shivaram Lingamneni
f54561171e try to reduce redundant goroutines 2018-04-15 19:05:22 -04:00
Daniel Oaks
22f9df388d Fix trailing hack 2018-04-16 02:28:25 +10:00
Daniel Oaks
dd6aacee61 Setup v0.12.0-unreleased devel ver 2018-04-16 02:28:06 +10:00
Daniel Oaks
31e5db9c1e Release v0.11.0 2018-04-15 19:47:20 +10:00
Shivaram Lingamneni
4778e7bcc7 fixes
* Placate `go vet`
* Reorder the `send` loop, clarify things a little
2018-04-15 01:21:32 -04:00
Shivaram Lingamneni
b2f798cf03 eliminate dedicated RunSocketWriter goroutine 2018-04-13 16:13:43 -04:00
Daniel Oaks
73613679af Try building for 32bit systems 2018-04-12 13:13:52 +10:00
Daniel Oaks
27c575e191 Um... name monitor subcommands handler properly 2018-04-12 10:11:45 +10:00
Daniel Oaks
b6ba2c7b7a manual: Update date 2018-04-11 23:16:14 +10:00
Daniel Oaks
e8568b5058 developing: Update docs as suggested by @enckse 2018-04-11 22:58:51 +10:00
Daniel Oaks
01eb2b2e4d
Merge pull request #233 from slingamn/tweaks
more tweaks to letsencrypt documentation
2018-04-11 15:40:57 +10:00
Shivaram Lingamneni
7bb3dbb9eb more tweaks to letsencrypt documentation 2018-04-11 01:27:48 -04:00
Daniel Oaks
026ff5cb12 readme: Update a lil more 2018-04-11 14:46:54 +10:00
Daniel Oaks
391c6a8c31 readme: Update as recommended by @enckse 2018-04-11 14:43:12 +10:00
Daniel Oaks
a733634f9f manual: Edit the LE section a bit to hopefully read more nicely 2018-04-11 14:37:20 +10:00
Daniel Oaks
9649f88d89 manual: Add small note to LE section linking to darwin's bash file 2018-04-11 14:27:02 +10:00
Daniel Oaks
9180e4f42a
Merge pull request #232 from enckse/master
FAQ Section: Let's Encrypt
2018-04-11 14:26:09 +10:00
Sean Enck
625fae6c8e
let's add a section on caveats where we maybe don't have suggestions but
know people have problems/questions
2018-04-10 23:34:33 -04:00
Sean Enck
242dbfd72c
how do you do let's encrypt? let's move this from an issue to the FAQ,
this probably takes care of #118 and #231 well enough to at least
resolve them and start using the md/docs
2018-04-10 21:26:44 -04:00
Daniel Oaks
6e85cbcf9c makefile: Add an explicit buildrelease case 2018-04-11 10:12:28 +10:00
Daniel Oaks
df17b77266 Back to -unreleased 2018-04-11 10:12:11 +10:00
Daniel Oaks
26fcb2ebbc Release v0.11.0-beta 2018-04-11 09:37:09 +10:00
Daniel Oaks
ce6451c4f1 Enable languages and motd formatting by default 2018-04-11 09:26:42 +10:00
Daniel Oaks
efed72115b manual: Add early FAQ-ish section 2018-04-11 08:52:23 +10:00
Daniel Oaks
74af078f7f
Merge pull request #229 from enckse/master
genpasswd confirmation of entered password
2018-04-11 08:28:11 +10:00
Sean Enck
dcf4cb7cde
when entering/generating the password it's helpful to at least be asked to confirm the input so if you get something like an extraneous character, on confirmation, you could catch that 2018-04-10 13:21:51 -04:00
Daniel Oaks
f1af7a2e2a
Merge pull request #228 from slingamn/issue227
fix #227
2018-04-10 07:51:15 +10:00
Shivaram Lingamneni
363b120cc5 fix #227 2018-04-09 12:46:20 -04:00
Daniel Oaks
9fe50731a4 languages: Mark Turkish as incomplete, since we updated strings 2018-04-09 23:45:41 +10:00
Daniel Oaks
1b47a19e5d Update license 2018-04-09 23:26:34 +10:00
Daniel Oaks
9e8920394f Only display modestring on connect if it's set 2018-04-09 16:37:06 +10:00
Daniel Oaks
b1a73142b5 Expose current git commit 2018-04-09 10:08:54 +10:00
Shivaram Lingamneni
8fb5a38851 Updates to channel persistence
1. Implement persistent channel keys (#208)
2. Persist changes to registered channel modes
3. Backend changes for persisting operator status (partial #198)
2018-04-03 21:49:40 -04:00
Daniel Oaks
f41067029e manual: Add Language note 2018-04-02 11:33:16 +10:00
Daniel Oaks
b6a997f68c Unify translations 2018-04-01 23:22:21 +10:00
Daniel Oaks
795c7aad9d Update example translation 2018-04-01 23:21:46 +10:00
Daniel Oaks
a95c77bb86 Remove old command line that's no longer valid 2018-04-01 23:07:49 +10:00
Daniel Oaks
7aea6af8db Update Norwegian translation (thanks again Morten!) 2018-04-01 21:39:45 +10:00
Daniel Oaks
292f479626 changelog: Update 2018-04-01 18:53:50 +10:00
Daniel Oaks
8ffaffba49 Update translations 2018-04-01 18:52:50 +10:00
Daniel Oaks
29fb052344 Update translation 2018-04-01 18:41:09 +10:00
Daniel Oaks
150bb6a946 Add Norwegian translation (thanks to Morten!) 2018-04-01 18:40:19 +10:00
Daniel Oaks
3829182359 Update example translations and add nickserv translation file 2018-04-01 18:32:11 +10:00
Daniel Oaks
379dd73b36 Fix translation script for weird OS encodings 2018-04-01 18:31:45 +10:00
Daniel Oaks
3394700def Fix translation notes 2018-04-01 18:31:30 +10:00
Daniel Oaks
dcb15d619d manual: Update date! 2018-04-01 12:55:40 +10:00
Daniel Oaks
a00cb3f8cd manual: Add basic Commands section that just points to integrated help 2018-04-01 12:09:12 +10:00
Daniel Oaks
ada1d0a091 readme: Update ns reg instructions 2018-04-01 12:04:44 +10:00
Daniel Oaks
ab6cd599b2 Fix name of ISUPPORT token (REGCOMMANDS -> ACCCOMMANDS) 2018-04-01 12:04:25 +10:00
Daniel Oaks
d39cc5f5fe docs: Update manual with new CS/NS commands 2018-04-01 12:00:45 +10:00
Daniel Oaks
5cbd4d1de2 Force help entries for every ChanServ command as well 2018-04-01 11:54:49 +10:00
Daniel Oaks
1c636aaec6 nickserv.go: Fix comment 2018-04-01 11:52:37 +10:00
Daniel Oaks
6fb4284e32 Refactor chanserv.go to match nickserv.go, unify the two 2018-04-01 11:51:34 +10:00
Daniel Oaks
9af74d367a nickserv.go: Move comment to right place 2018-04-01 11:29:13 +10:00
Daniel Oaks
e0b0ccd7dc updatetranslations script now grabs nickserv help entries 2018-04-01 11:23:14 +10:00
Daniel Oaks
7b8c4e7e91 Refactor nickserv.go to better support NS HELP and translations 2018-04-01 11:22:06 +10:00
Daniel Oaks
a39c46d470 Fix registered-only modes in docs (it's +R, not +r) 2018-04-01 09:50:22 +10:00
Daniel Oaks
0e4e074d43 Update changelog 2018-04-01 09:47:10 +10:00
Daniel Oaks
73bb43ef2e Tweak the default fakelag cooldown juuuust a touch 2018-04-01 09:43:55 +10:00
Daniel Oaks
46c98c2cf5 Fix CHANSERV OP 2018-04-01 09:33:58 +10:00
Daniel Oaks
a67dfe37ca Add CHANSERV OP (thanks benharri for making the request!) 2018-04-01 01:26:31 +10:00
Daniel Oaks
470965674c Changelog updated 2018-04-01 01:00:04 +10:00
Daniel Oaks
5ce56bfb4f Add colour charts to the default MOTD, including 16-98 extended colours 2018-04-01 00:35:41 +10:00
Shivaram Lingamneni
f83b31a413
Merge pull request #223 from mordyovits/patch-1
README.md: self-signed, not unsigned
2018-03-29 17:06:15 -04:00
Mordy Ovits
5a367b8c6c
README.md: self-signed, not unsigned 2018-03-29 12:34:02 -04:00
Shivaram Lingamneni
7cfa75a59e
Merge pull request #218 from slingamn/socketwriter.1
refactor irc.Socket
2018-03-28 13:26:03 -04:00
Shivaram Lingamneni
65f2e95d2b
Merge pull request #222 from slingamn/fakelag.3
implement fakelag (#189)
2018-03-28 13:25:49 -04:00
Shivaram Lingamneni
36018174b0 default fakelag to off, add explicit cooldown config 2018-03-28 13:18:08 -04:00
Daniel Oaks
237931cd00
Merge pull request #220 from slingamn/issue217.1
partial fix for #217
2018-03-28 12:21:19 +10:00
Daniel Oaks
abb1825ee8
Merge pull request #219 from slingamn/travis.1
try to fix travis by pinning a goreleaser release
2018-03-28 12:20:33 +10:00
Shivaram Lingamneni
1bf5e2a7c8 implement fakelag (#189) 2018-03-22 11:04:21 -04:00
Shivaram Lingamneni
a8b952da77 store maxSendQBytes in a uint32 to avoid alignment problems
The sync.atomic documentation says:

"On both ARM and x86-32, it is the caller's responsibility to arrange
for 64-bit alignment of 64-bit words accessed atomically."
2018-03-19 00:24:20 -04:00
Shivaram Lingamneni
2885b37768 partial fix for #217
See discussion on issue; this might not be a complete fix but it's
definitely better than the current behavior.
2018-03-18 00:12:50 -04:00
Shivaram Lingamneni
d1f5c59eef fix #190 2018-03-17 23:26:07 -04:00
Shivaram Lingamneni
8fd1446627 tweak: clean up Socket.Close() 2018-03-16 18:16:04 -04:00
Shivaram Lingamneni
d324418df4 try to fix travis by pinning a goreleaser release 2018-03-16 13:16:23 -04:00
Shivaram Lingamneni
0a432c9d99 do an actual nonblocking send instead of the len() trick 2018-03-16 12:39:11 -04:00
Shivaram Lingamneni
fa5d4be718 refactor irc.Socket 2018-03-15 19:11:29 -04:00
Daniel Oaks
e3e714059c
Merge pull request #215 from slingamn/issue214
fix #214
2018-03-14 10:00:40 -07:00
Shivaram Lingamneni
f5f6b95662 fix #214 2018-03-14 12:51:53 -04:00
Shivaram Lingamneni
b0f262bc0c
Merge pull request #206 from slingamn/ghost.2
nickserv: implement GHOST, GROUP, DROP, and INFO
2018-03-14 09:42:20 -04:00
Shivaram Lingamneni
b8f37e4e6c fix bad interaction between nickTimer.Stop() and accounts.Logout()
Sequence of events:

1. client.nickTimer.Stop()
2. client.server.accounts.Logout(client)
3. accounts sees that client is no longer logged in, does client.nickTimer.Touch()
4. 30 seconds later, RandomlyRename resurrects the zombie client
2018-03-14 08:43:50 -04:00
Shivaram Lingamneni
fd34c78d6b add sadrop command 2018-03-14 06:50:26 -04:00
Shivaram Lingamneni
c6124f9d8a
Merge pull request #210 from slingamn/pprof.2
add an option to expose a pprof http endpoint
2018-03-13 18:05:51 -04:00
Shivaram Lingamneni
288203152a comment out the pprof setting in the example config 2018-03-13 18:04:15 -04:00
Shivaram Lingamneni
211ed6af99 add an option to expose a pprof http endpoint 2018-03-13 16:55:30 -04:00
Shivaram Lingamneni
679f25491c can't reserve a nick that's the name of an unverified account 2018-03-11 14:40:36 -04:00
Shivaram Lingamneni
47b9fe50be can't register an account with the same name as a registered nick 2018-03-11 13:59:02 -04:00
Shivaram Lingamneni
a022befffe nickserv: implement GHOST, GROUP, DROP, and INFO 2018-03-02 17:05:47 -05:00
Daniel Oaks
b211fd35da
Merge pull request #205 from slingamn/issue204
fix #204
2018-03-01 10:07:32 -08:00
Shivaram Lingamneni
ef99bc48d1 fix #204
Empty channels were only cleaned up on PART, not QUIT.
2018-03-01 11:10:46 -05:00
Daniel Oaks
898fb41485
Merge pull request #203 from slingamn/rereg
two nickname reservation fixes
2018-02-28 14:40:32 -08:00
Shivaram Lingamneni
757566ca45 turn down default verify timeout 2018-02-28 17:31:56 -05:00
Shivaram Lingamneni
945dec9964 ensure the nick timeout mechanism is cleaned up on client quit 2018-02-28 17:29:18 -05:00
Shivaram Lingamneni
a5897baa2b clean up redundant error handling 2018-02-28 17:29:18 -05:00
Daniel Oaks
1023f7e20e
Merge pull request #200 from slingamn/issue199.2
implement #199
2018-02-27 19:50:09 -08:00
Daniel Oaks
9b21ee36b2
Merge pull request #201 from slingamn/fixes.3
some small fixes
2018-02-27 13:30:30 -08:00
Shivaram Lingamneni
784a3bbf52 Don't send error messages for bad channels in NAMES
"There is no error reply for bad channel names."
<https://tools.ietf.org/html/rfc2812#section-3.2.5>
2018-02-27 15:37:58 -05:00
Shivaram Lingamneni
9d163a4ba2 warn about whitelisting the webirc gateway
See #197 (this is not a complete fix, though).
2018-02-27 15:37:32 -05:00
Shivaram Lingamneni
54123ef9a2 clear failed nick assignments to avoid confusion 2018-02-27 05:22:01 -05:00
Shivaram Lingamneni
62581962a6 fix confusing ips-per-subnet name 2018-02-26 23:52:15 -05:00
Shivaram Lingamneni
be86684e96 implement #199 2018-02-26 22:48:52 -05:00
Daniel Oaks
0ea210c28c
Merge pull request #196 from slingamn/smtp.1
implement mailto callbacks
2018-02-23 07:53:36 -08:00
Daniel Oaks
04d7792ed2
Merge pull request #195 from slingamn/stopevent
clean up stopEvent (requires go v1.10)
2018-02-23 07:49:22 -08:00
Shivaram Lingamneni
878f9ca94c fix: store the uncasefolded account name correctly 2018-02-20 04:50:46 -05:00
Shivaram Lingamneni
df41f9b3b0 don't send ACC numerics in response to NickServ commands 2018-02-20 04:44:44 -05:00
Shivaram Lingamneni
89ae261739 implement mailto callbacks 2018-02-20 04:20:30 -05:00
Daniel Oaks
25f8b15232
Merge pull request #194 from slingamn/issue192.1
fix #192
2018-02-19 14:54:03 +10:00
Daniel Oaks
4f9460cd9a
Merge pull request #193 from slingamn/nickres.1
changes to nick reservation
2018-02-19 14:52:39 +10:00
Shivaram Lingamneni
02161184cf clean up stopEvent (requires go v1.10) 2018-02-18 23:18:32 -05:00
Shivaram Lingamneni
5b636371a9 fix SASL enable-disable logic 2018-02-18 22:15:43 -05:00
Shivaram Lingamneni
ced3a17cd3 fix #192 2018-02-18 21:52:39 -05:00
Shivaram Lingamneni
988cb22692 changes to nick reservation
* Clients are now renamed, not disconnected, on reservation timeout
* Nick reservation config is now its own subsection
2018-02-18 04:46:14 -05:00
Shivaram Lingamneni
73391f11a6 replace ACC UNREGISTER with nickserv unregister 2018-02-12 01:09:30 -05:00
Shivaram Lingamneni
af256fccd3 remove redundant oper check from DEBUG 2018-02-11 23:58:54 -05:00
Shivaram Lingamneni
b139386391 fix account tags 2018-02-11 06:31:23 -05:00
Shivaram Lingamneni
ad73d68807 refactor account registration, add nick enforcement 2018-02-11 05:30:40 -05:00
Daniel Oaks
fcd0a75469 developing: Add ResponseBuffer explanation 2018-02-11 17:21:13 +10:00
Daniel Oaks
50165af81a Updated changelog 2018-02-11 09:24:20 +10:00
Daniel Oaks
b982c6c2ae readme: Link to darwin.network and the testnet 2018-02-11 09:18:30 +10:00
Daniel Oaks
c29be6e914 vendor: Updated submodules 2018-02-11 09:16:04 +10:00
Daniel Oaks
a70cc6713c (hopefully) fix labeled-response behaviour 2018-02-11 08:57:15 +10:00
Daniel Oaks
e0fa97d344 Get labeled-reply working just fine 2018-02-06 00:21:08 +10:00
Daniel Oaks
470109461b responsebuffer: Handle sending early properly 2018-02-04 21:34:44 +10:00
Daniel Oaks
3680a3fe9a Merge 2018-02-04 21:32:48 +10:00
Daniel Oaks
3561046bec Make ERR_CANNOT_RESUME use RPL_NONE numeric 2018-02-04 21:25:08 +10:00
Daniel Oaks
ca6a162696 handlers: Make sure all functions have appropriate comments 2018-02-04 05:48:44 +10:00
Daniel Oaks
52e3dde77a Move mkcerts package under lib/ 2018-02-04 05:34:26 +10:00
Daniel Oaks
2419f69879 Move all errors into errors.go 2018-02-03 22:03:36 +10:00
Daniel Oaks
3ef4c5f799 Split NS/CS commands into separate functions 2018-02-03 21:38:28 +10:00
Daniel Oaks
2ecec25d28 Misc refactoring 2018-02-03 21:15:07 +10:00
Daniel Oaks
d854bac78e Fix broken modes tests 2018-02-03 20:28:02 +10:00
Daniel Oaks
3634d0601e Split modes into a subpackage (this is painful, but will force us to simplify and improve the API for interacting with modes) 2018-02-03 20:21:32 +10:00
Daniel Oaks
9f71d9ce12 Add right copyright to handlers.go 2018-02-03 19:48:30 +10:00
Daniel Oaks
afd6ca610c Split language into a subpackage 2018-02-03 19:46:14 +10:00
Daniel Oaks
1b14230758 ...fix info string, how did that get messed up? 2018-02-03 19:30:23 +10:00
Daniel Oaks
47d2ce351c Centralise all command handlers in handlers.go 2018-02-03 19:28:02 +10:00
Daniel Oaks
29266ce80f nickserv: Fix help display 2018-02-03 19:00:27 +10:00
Daniel Oaks
6784cf82bf nickserv: Add NS REGISTER and NS IDENTIFY 2018-02-02 23:44:52 +10:00
Daniel Oaks
872f88eb94
Merge pull request #187 from slingamn/unixdomain.1
support unix domain sockets (#184)
2018-02-02 21:36:13 +10:00
Daniel Oaks
21a2fba7c4 manual: Update 2018-02-02 21:06:25 +10:00
Daniel Oaks
cb561a1f20 manual: Update s'more 2018-02-02 16:44:40 +10:00
Daniel Oaks
c2b31fc2af manual: Update 2018-02-02 16:43:55 +10:00
Daniel Oaks
0c07b4491c manual: Add ToC 2018-02-02 16:40:07 +10:00
Daniel Oaks
b5f5217721 docs: Initial commit of the Oragono Manual 2018-02-02 16:37:23 +10:00
Daniel Oaks
ed1fa7704c nickserv: Point users to an actual help entry (not a great one, but very slightly better) 2018-02-02 16:37:06 +10:00
Shivaram Lingamneni
2a7f055ef3 support unix domain sockets 2018-02-01 16:19:07 -05:00
Shivaram Lingamneni
bec39ee8cb log new listener creation 2018-02-01 15:53:44 -05:00
Daniel Oaks
10b4ec243b
Merge pull request #185 from slingamn/proxypatch.1
tweaks to webirc functionality
2018-02-01 15:46:59 +10:00
Shivaram Lingamneni
2d6ddf7eb9 kiwi's gateway uses the flag secure instead of tls 2018-01-31 22:01:13 -05:00
Shivaram Lingamneni
b7f66fb1de allow WEBIRC to set the TLS flag over local plaintext connections 2018-01-31 21:08:49 -05:00
Shivaram Lingamneni
09a17b32be disallow WEBIRC after PROXY 2018-01-31 20:04:05 -05:00
Daniel Oaks
7b88d21e58 Possible IdleTimer lock fix 2018-01-30 14:26:29 +10:00
Daniel Oaks
8bc2c0ee67 temp *badbadbad* 2018-01-30 14:20:12 +10:00
Daniel Oaks
cabb3b219d Fix some config loading issues 2018-01-28 10:52:07 +10:00
Daniel Oaks
16a55cbba8 Add labeled-responses for MODE 2018-01-28 10:51:46 +10:00
Daniel Oaks
3fa767e3f3 Fix Linux builds messing up in the final stage 2018-01-28 00:51:12 +10:00
Daniel Oaks
00099eb4ba Make batch IDs smaller 2018-01-28 00:45:16 +10:00
Daniel Oaks
07fc902b21 Labeled-Response 2018-01-28 00:40:34 +10:00
Daniel Oaks
83cd212f5c Merge branch 'master' of https://github.com/oragono/oragono 2018-01-26 20:00:31 +10:00
Daniel Oaks
b1a500f461 Add Brazilian Portugese translation 2018-01-26 20:00:17 +10:00
Daniel Oaks
fc9b501a77 Show translator names in INFO 2018-01-25 19:51:02 +10:00
Daniel Oaks
421ecc9811 readme: Include multiple languages in feature list 2018-01-24 08:09:40 +10:00
Daniel Oaks
65ac8cb8b1 Rename translation files, basically finish off Turkish translation for now! 2018-01-24 00:48:41 +10:00
Daniel Oaks
b3e1e3c258 Add very initial French translation, contributed by @joshk0 2018-01-24 00:01:24 +10:00
Daniel Oaks
ddd7f0dc99 Add 'are supported by this server' to translatable strings 2018-01-23 23:31:29 +10:00
Daniel Oaks
1fae186637 Include languages files in builds 2018-01-23 21:37:13 +10:00
Daniel Oaks
070f19e8fa Add README for the languages directory 2018-01-23 21:34:50 +10:00
Daniel Oaks
c5a6d22192 Hopefully apply new languages better, esp. during rehash 2018-01-23 21:27:15 +10:00
Daniel Oaks
638b0c03fc Better translate HELP entries and indexes 2018-01-23 21:17:14 +10:00
Daniel Oaks
6a28277ba4 Update Turkish translation 2018-01-23 17:25:26 +10:00
Daniel Oaks
099fd7c08f Update translation backend stuff a little more 2018-01-23 17:22:39 +10:00
Daniel Oaks
e29f3b1a02 Add very initial Turkish translation, contributed by Apsimati 2018-01-23 16:51:36 +10:00
Daniel Oaks
1a5ff05493 Update translation framework 2018-01-23 16:50:19 +10:00
Daniel Oaks
ddec79f8d0 Update translation framework a touch more 2018-01-23 15:09:47 +10:00
Daniel Oaks
75dcff7183 Update translation framework, add badge to readme 2018-01-23 15:06:55 +10:00
Daniel Oaks
1d22d65f9f Make config errors display more nicely 2018-01-23 15:06:33 +10:00
Shivaram Lingamneni
4b1aa2b952 remove unused member ChannelRegistry.channels 2018-01-22 13:51:25 -05:00
Shivaram Lingamneni
7edd9032d3 remove newConns channel 2018-01-22 13:51:25 -05:00
Shivaram Lingamneni
728863a17c move Commands initialization to an init() 2018-01-22 13:51:25 -05:00
Shivaram Lingamneni
62fc2c0cc3 remove Server.commands 2018-01-22 13:47:57 -05:00
Daniel Oaks
b2afd55285 Don't load example translation file, make example actually list all translatable strings 2018-01-22 22:16:07 +10:00
Daniel Oaks
090095b2b9 Set default client language when creating them 2018-01-22 21:30:28 +10:00
Daniel Oaks
275227a461 Make like every client-facing string translatable 2018-01-22 21:26:01 +10:00
Daniel Oaks
0569b5cfaa RESUME: Fix a few bugs, play modestrings 'n' all 2018-01-22 20:55:20 +10:00
Daniel Oaks
f8b39cfe61 Send fake channel joins on RESUME 2018-01-22 17:58:10 +10:00
Daniel Oaks
d13b2ee095 Update changelog 2018-01-22 17:58:10 +10:00
Daniel Oaks
7760634efe Actually let the takeover work somewhat more properly 2018-01-22 17:57:38 +10:00
Daniel Oaks
0d5327de8a Fix some issues, add RPL_WHOISACCOUNT 2018-01-22 17:57:38 +10:00
Daniel Oaks
ac99e82192 Fix build issues 2018-01-22 17:57:38 +10:00
Daniel Oaks
d09f085b1a Add very initial RESUME cap and command 2018-01-22 17:57:38 +10:00
Daniel Oaks
eb25d4466b Update changelog again 2018-01-22 17:45:35 +10:00
Daniel Oaks
fbac8c9a0c Updated changelog 2018-01-22 17:44:33 +10:00
Daniel Oaks
cd6bf3e20c Don't load new language support by default, since we don't have any/enough language files to justify it 2018-01-22 17:42:41 +10:00
Daniel Oaks
e99f22488f Make LANGUAGE support work 2018-01-22 17:30:31 +10:00
Daniel Oaks
a7fdade41d Extend to include example translation stuff 2018-01-21 16:49:17 +10:00
Daniel Oaks
ba77a95c81 Very initial beginning of languages implementation 2018-01-21 16:11:16 +10:00
Daniel Oaks
cf53d27615 travis: Install goreleaser 2018-01-07 18:43:33 +10:00
Daniel Oaks
1c4f316ca9 Remove make clean for now, fixes Travis 2018-01-07 18:35:57 +10:00
Daniel Oaks
2b383145e5 Fix makefile / Travis 2018-01-07 13:20:05 +10:00
Daniel Oaks
3b3c1c733a Support bot mode +B 2018-01-07 12:56:51 +10:00
Daniel Oaks
7f06f25c15 Start making builds with goreleaser 2018-01-07 12:40:26 +10:00
Daniel Oaks
e38d42c1ce Update changelog 2018-01-04 00:28:06 +10:00
Daniel Oaks
3ba8af714e Use base 36 when generating message IDs, gives us full 0-9a-z to use while preserving uniqueness nicely 2018-01-04 00:21:35 +10:00
Daniel Oaks
63bd52d471 Make message IDs much shorter (thanks @prawnsalad!) 2018-01-04 00:13:32 +10:00
Daniel Oaks
713fc59691 CAP: Correctly suspend registration for CAP REQ as per the spec 2017-12-28 13:50:42 +10:00
Daniel Oaks
342a84ba3f Makefile should use var defined at top of file 2017-12-28 13:42:09 +10:00
Daniel Oaks
7c624f9a38 Setup v0.10.4-unreleased devel ver 2017-12-28 13:41:36 +10:00
Daniel Oaks
25c59fdb37 vendor: Updated submodules 2017-12-26 12:57:39 +10:00
Daniel Oaks
5e9f0fd411 Release v0.10.3 2017-12-26 12:43:37 +10:00
Daniel Oaks
b9f7850719 Update changelog 2017-12-26 12:38:54 +10:00
Daniel Oaks
197ab520bf Change casemapping name and advertisement to match new spec 2017-12-26 12:30:04 +10:00
Daniel Oaks
36b26f99be
Merge pull request #173 from slingamn/timeouts.3
refactor idle timeouts again
2017-12-11 14:53:05 +10:00
Shivaram Lingamneni
d8d1705035 refactor idle timeouts again 2017-12-06 23:23:25 -05:00
Daniel Oaks
e0519a6387 caps: Rename maxline cap 2017-12-06 13:11:38 +10:00
Daniel Oaks
b2e5738f08
Merge pull request #171 from slingamn/atime
fix a race condition in client timeouts
2017-12-03 12:59:08 +10:00
Shivaram Lingamneni
ad1e00629b fix a race condition in idle timeouts
squigz on freenode reported an issue where bots were responding to PING
on time, but were occasionally being timed out regardless. This was a race
condition: timeout was detected as idleTime >= it.quitTimeout, but if
the client responded promptly to its PING message and sent no further messages,
but the main loop subsequently slept for longer than expected (i.e., significantly
longer than quitTimeout), this condition would be met through no fault of the
client's.

The fix here is to explicitly track the last time the ping was sent, then test
!lastSeen.After(lastPinged) instead (making use of time.Time's monotonicity).
It is sufficient that the measurement of lastPinged happens-before the PING is sent.
2017-12-02 20:30:26 -05:00
Shivaram Lingamneni
f5e7ec525d synchronize accesses to client.atime 2017-12-02 20:05:06 -05:00
Daniel Oaks
ad351268be
Merge pull request #168 from slingamn/clientmanager
refactor ClientManager
2017-11-23 08:35:50 +10:00
Shivaram Lingamneni
b4907dadb9 fix a bug where the uncasefolded nickname wasn't being recorded
Also, rename the nickname vars to hopefully make things clearer
2017-11-22 16:56:14 -05:00
Shivaram Lingamneni
d5a5f939dd review fixes 2017-11-22 16:35:57 -05:00
Shivaram Lingamneni
52b0fb71e7 refactor ClientManager 2017-11-22 05:09:38 -05:00
Daniel Oaks
2cbbec567c Don't override package name 2017-11-19 10:42:40 +10:00
Daniel Oaks
bfcada11dc KLINE: Save name of the banning oper 2017-11-19 10:32:32 +10:00
Daniel Oaks
dedb029272 DLINE: Save name of the banning oper 2017-11-19 10:27:40 +10:00
Daniel Oaks
8036df92fc WHO: Require first param, matching other servers 2017-11-19 10:10:10 +10:00
Daniel Oaks
bec050208d
Merge pull request #166 from slingamn/banlist.3
allow non-operators to list bans
2017-11-17 16:09:21 +10:00
Shivaram Lingamneni
b83d454554 fix ban regexp not being recompiled on removal 2017-11-13 18:25:51 -05:00
Shivaram Lingamneni
b1e12ca1eb allow unprivileged users to list bans 2017-11-13 18:25:51 -05:00
Daniel Oaks
fc8007e6e4 Setup v0.10.3-unreleased devel ver 2017-11-13 22:52:48 +10:00
Daniel Oaks
11ea52b0f0 Release v0.10.2 2017-11-13 22:46:50 +10:00
Daniel Oaks
a33e83de9e
Merge pull request #165 from slingamn/get_fail
fix a wide-ranging assortment of crash bugs
2017-11-13 22:43:24 +10:00
Shivaram Lingamneni
ca8a0b7091 fix a wide-ranging assortment of crash bugs 2017-11-13 02:42:20 -05:00
Daniel Oaks
ff50a25b65
Merge pull request #161 from slingamn/chanreg.3
remove registeredChannelsMutex
2017-11-13 12:46:23 +10:00
Daniel Oaks
075a38d08d developing: Add new release instructions. 2017-11-13 12:45:28 +10:00
Daniel Oaks
efb54163a5 Setup v0.10.2-unreleased devel ver 2017-11-13 12:45:10 +10:00
Daniel Oaks
f2d4698baf Release v0.10.1 2017-11-09 15:07:40 +10:00
Daniel Oaks
44538c3b0b
Merge pull request #162 from slingamn/modeperms
fix channel mode change privilege enforcement
2017-11-09 14:56:53 +10:00
Shivaram Lingamneni
6d619bf411 fix channel mode change privilege enforcement 2017-11-08 23:37:38 -05:00
Shivaram Lingamneni
d4cb15354f remove registeredChannelsMutex
This moves channel registration to an eventual consistency model,
where the in-memory datastructures (Channel and ChannelManager)
are the exclusive source of truth, and updates to them get persisted
asynchronously to the DB.
2017-11-08 22:24:33 -05:00
Shivaram Lingamneni
d5832bf765
Merge pull request #160 from slingamn/cache.4
fix a race in regenerateMembersCache
2017-11-08 22:18:25 -05:00
Shivaram Lingamneni
60b861e07e fix a race in regenerateMembersCache
The rationale for why regenerateMembersCache didn't need to hold the Lock()
throughout was subtly wrong. It is true that at least some attempt to
regenerate the cache would see *all* the updates. However, it was possible for
the value of `result` generated by that attempt to lose the race for the final
assignment `channel.membersCache = result`.

The fix is to serialize the attempts to regenerate the cache, without adding
any additional locking on the underlying `Channel` fields via
`Channel.stateMutex`. This ensures that the final read from `Channel.members`
is paired with the final write to `Channel.membersCache`.
2017-11-07 14:38:18 -05:00
Daniel Oaks
f9d8d1a4f9
Merge pull request #158 from slingamn/renames
rename some getters
2017-11-03 08:02:12 +00:00
Shivaram Lingamneni
9b74c47b74 rename some getters
Rename getters in conformance with the "Effective Go" styleguide recommendation:
https://golang.org/doc/effective_go.html#Getters
2017-11-03 02:36:55 -04:00
Shivaram Lingamneni
94cf438f51 remove channelJoinPartMutex 2017-10-30 05:21:47 -04:00
Daniel Oaks
d715abf0f0 Add the INFO command 2017-10-29 07:59:56 +00:00
Daniel Oaks
33651ea03c vendor: Updated submodules 2017-10-29 05:05:15 +00:00
Daniel Oaks
384e6e1720 client: Fix crash from not having right line lengths computed 2017-10-29 05:04:32 +00:00
Daniel Oaks
c6b6a25906 Merge remote-tracking branch 'slingmann/recovery' 2017-10-29 04:37:57 +00:00
Daniel Oaks
c09ca729c4 Merge remote-tracking branch 'slingmann/membersmutex.2' 2017-10-29 04:36:42 +00:00
Daniel Oaks
03978c6b85 Setup 0.10.1-unreleased devel ver 2017-10-29 04:35:15 +00:00
Shivaram Lingamneni
6130e48a67 always log the panic trace 2017-10-26 05:15:55 -04:00
Shivaram Lingamneni
7b58bf76ef make error recovery configurable 2017-10-26 04:19:01 -04:00
Shivaram Lingamneni
80968d000f log panic traces via the usual logging mechanism 2017-10-25 13:22:02 -04:00
Shivaram Lingamneni
054f57e215 recover from client-caused panics 2017-10-23 19:08:32 -04:00
Shivaram Lingamneni
71e82a9ccf move a check, avoiding a crash 2017-10-23 18:01:28 -04:00
Shivaram Lingamneni
240f121e5e bug fix: SAMODE should list other users' modes 2017-10-22 23:07:21 -04:00
Daniel Oaks
fbaf2d8e3a Release v0.10.0 2017-10-23 12:51:42 +10:00
Shivaram Lingamneni
fa83ccd82b refactor synchronization for Channel 2017-10-22 19:50:16 -04:00
Shivaram Lingamneni
c026cc5ab6 review fixes
* move constant definitions
* always give the client at least quitTimeout to respond to ping,
  even if registerTimeout or quitTimeout are longer than idleTimeout
2017-10-15 22:37:36 -04:00
Daniel Oaks
8910dc59ee Fix KLINE quit/error message and corrects comment on Client.Quit 2017-10-16 10:48:05 +10:00
Shivaram Lingamneni
7ccb485b50 add two getters 2017-10-15 19:46:25 -04:00
Shivaram Lingamneni
e540fde816 refactor idle timeouts 2017-10-15 19:46:25 -04:00
Shivaram Lingamneni
b86fc105cd eliminate destroyMutex 2017-10-15 19:46:25 -04:00
Shivaram Lingamneni
545e8d71db eliminate quitMutex 2017-10-15 19:46:25 -04:00
Daniel Oaks
b0649cb5d3 WEBIRC: Allow protecting with fingerprint and parse tls flag 2017-10-16 08:47:49 +10:00
Daniel Oaks
07a16b2502 changelog: Note WEBIRC command 2017-10-15 18:21:47 +10:00
Daniel Oaks
e1868f8a47 WEBIRC: Export fields so the config loads properly 2017-10-15 18:15:18 +10:00
Daniel Oaks
34987ba53a Allow WEBIRC from specified hosts 2017-10-15 16:18:14 +10:00
Daniel Oaks
0cc5e68e0f Update logo some more 2017-10-15 13:18:29 +10:00
Daniel Oaks
8fbbbb0848 Update logo 2017-10-15 13:16:07 +10:00
Daniel Oaks
a16d343bb1 changelog: Update 2017-10-15 13:03:43 +10:00
Daniel Oaks
16c4b4166a Change debug files from ergonomadic -> oragono 2017-10-15 12:48:10 +10:00
Daniel Oaks
ef25b5b5c7 draft/sts -> sts 2017-10-15 07:58:18 +10:00
Daniel Oaks
1324c5ff83 Allow simple way of listing DLINEs and KLINEs 2017-10-15 07:53:24 +10:00
Daniel Oaks
7217bf5b85 Update config options a little more, add note in readme to modify them 2017-10-11 07:48:31 +10:00
Daniel Oaks
90bb3f79d3 Merge remote-tracking branch 'slingamn/default_tweaks' 2017-10-11 07:44:36 +10:00
Daniel Oaks
2791476f16 INVITE: Fix dumb crash (thanks for pointing this out, @josephbisch!) 2017-10-10 11:17:41 +10:00
Daniel Oaks
79325d333e Merge pull request #151 from slingamn/limits_refactor.3
refactor connection limits and throttling
2017-10-10 09:36:30 +10:00
Shivaram Lingamneni
d66470f1c4 review fix: rename various packages and objects 2017-10-09 17:38:06 -04:00
Shivaram Lingamneni
0e5eec3037 fix a config comment 2017-10-09 13:48:58 -04:00
Shivaram Lingamneni
58faad90dd add loglines for IP limits 2017-10-09 13:24:12 -04:00
Shivaram Lingamneni
ac9ac5ef19 create separate irc/connection_limiting package 2017-10-09 13:24:12 -04:00
Shivaram Lingamneni
a2ac4eeef9 refactor limits and throttling 2017-10-09 13:24:12 -04:00
Daniel Oaks
6b20d60c06 vendor: Updated submodules 2017-10-09 07:35:17 +10:00
Daniel Oaks
bcb0981704 vendor: Updated submodules 2017-10-08 20:49:03 +10:00
Daniel Oaks
ab7c1caa43 changelog: Add new changes 2017-10-08 20:36:39 +10:00
Daniel Oaks
f86362e639 Name MOTDFORMATTING file properly 2017-10-08 20:21:53 +10:00
Daniel Oaks
695faefd93 Allow formatting codes in the MOTD 2017-10-08 20:17:49 +10:00
Daniel Oaks
d4a8984e63 Initial implementation of labeled-responses for WHOIS 2017-10-08 11:05:05 +10:00
Daniel Oaks
095e71b2fe readme: Add some more credits 2017-10-08 09:45:34 +10:00
Daniel Oaks
a90ee16a20 caps: Test Add, Remove and String 2017-10-08 09:26:01 +10:00
Daniel Oaks
378d55af65 Add tests to subpackages 2017-10-07 22:19:37 +10:00
Daniel Oaks
10949a434a kline: Gofmt -s 2017-10-06 12:45:32 +10:00
Daniel Oaks
9f7e395c96 logger: Fix comments 2017-10-06 12:44:11 +10:00
Daniel Oaks
68b1dc9e72 Split passwd into its' own subpackage 2017-10-06 00:03:53 +10:00
Daniel Oaks
207c1074df Split utils out to a separate subpackage 2017-10-05 23:47:43 +10:00
Daniel Oaks
4aa52956e5 Split isupport to its' own subpackage 2017-10-05 23:39:57 +10:00
Daniel Oaks
eac6a69782 Fix some notes and add some comments. 2017-10-05 23:29:34 +10:00
Daniel Oaks
797b9f0996 help: Link to https oragono.io 2017-10-05 23:09:13 +10:00
Daniel Oaks
5852ac4830 readme: Reorder a little 2017-10-05 23:08:57 +10:00
Shivaram Lingamneni
6aa9023813 add go vet to make test 2017-10-05 21:09:04 +10:00
Shivaram Lingamneni
456174ed53 review fixes for raw i/o notification 2017-10-05 21:06:22 +10:00
Shivaram Lingamneni
aff1752d67 refactor logging to implement #142 2017-10-05 21:05:57 +10:00
Daniel Oaks
23af746182 Rip out the rest of the web interface 2017-10-05 20:55:15 +10:00
Daniel Oaks
f7f049973f Rip out REST API and web interface.
It's not really used and I'd rather not have it here unless I'm able to actively maintain it properly and build out the web interface.

I might re-add it later but for now I'd rather not have it unless anyone's actively using it.
2017-10-05 17:14:16 +10:00
Daniel Oaks
04d5d2fcc2 monitor: Fix target output when adding targets 2017-10-04 18:54:02 +10:00
Shivaram Lingamneni
d39ee2fafa fix: RPL_MONONLINE must be server-prefixed
also, remove the self-notification check; clients are probably not
monitoring themselves, and it doesn't much matter if they are
2017-10-04 03:52:45 -04:00
Shivaram Lingamneni
84c1533b53 review fix: report unfolded nicks in /monitor l when possible 2017-10-04 03:16:22 -04:00
Shivaram Lingamneni
3877db2391 review fixes: rename MonitorManager methods 2017-10-04 02:59:59 -04:00
Shivaram Lingamneni
26686d7e86 refactor monitor and /oper implementations 2017-10-04 01:19:27 -04:00
Daniel Oaks
5e9767c46d Merge pull request #146 from slingamn/data_races.1
fix various data races, including 2 introduced by #139
2017-10-04 08:00:33 +10:00
Shivaram Lingamneni
23a66fa502 fix various data races, including 2 introduced by #139 2017-10-02 04:42:50 -04:00
Shivaram Lingamneni
e66735619e tweak some defaults
* Lower ident timeout to 1.5 seconds, as discussed in #oragono
* Enforce connection limits at the granularity of ipv4 /32's and ipv6 /64's
* Raise the limit on number of new connections to 64 every 10 minutes
  (for the benefit of people behind large IPv4 NATs)
2017-10-02 00:01:29 -04:00
Daniel Oaks
58fb997e77 changelog: Update with new items 2017-10-01 15:27:47 +10:00
Daniel Oaks
b8d47c3e4f channel: Server opers shouldn't override nooutside, reggedonly and moderated modes. if they want to do that sort of thing, they have SAMODE and all to be explicit about it 2017-10-01 15:18:52 +10:00
Daniel Oaks
e3a0387cf5 channel: Fix +m (moderated) and +R (registeredonly) channel modes, add note about opers overriding +m/+R 2017-10-01 15:14:32 +10:00
Daniel Oaks
b850a6c1d9 caps: Actually remove MessageIDs (accidentally left it here with the merge) 2017-09-29 17:54:17 +10:00
Daniel Oaks
b4fcb45af0 Add license stuff to the top of caps/ and sno/ files I guess 2017-09-29 17:33:29 +10:00
Daniel Oaks
275449e6cc caps: Move most capability-handling types into the caps package 2017-09-29 17:25:58 +10:00
Daniel Oaks
85bfe3818b Merge pull request #141 from slingamn/dline_safety.2
refactor [dk]linemanagers
2017-09-29 16:26:18 +10:00
Shivaram Lingamneni
ae441d22d3 refactor [dk]linemanagers
* Synchronize map accesses
* Be more aggressive about cleaning up expired lines
* CIDR dlines did not work (nil dereference)
2017-09-29 02:07:09 -04:00
Daniel Oaks
cea6565b80 client: HasCapabs -> HasRoleCapabs to make it more clear exactly what this means 2017-09-29 12:11:06 +10:00
Daniel Oaks
810908db7f Add comments 2017-09-29 12:09:48 +10:00
Daniel Oaks
9bfdc4fdfb Move caps to their own package to prevent conflicts 2017-09-29 12:07:52 +10:00
Daniel Oaks
830484feb6 AWAY: Send correct mode string (thanks for pointing out this silly bug @jwheare!) 2017-09-29 11:56:18 +10:00
Daniel Oaks
c39206ad13 Don't create new caps out of nowhere, dummy 2017-09-29 11:55:54 +10:00
Daniel Oaks
ffe7375a68 Fix proxied DLINE/throttle/etc error messages 2017-09-29 07:18:08 +10:00
Shivaram Lingamneni
a9e4ed237e deduplicate d-line and throttle code 2017-09-29 07:05:59 +10:00
Daniel Oaks
8b1f722655 server: Fix the PROXY command 2017-09-29 07:05:22 +10:00
Daniel Oaks
3f4bf38bee Merge branch 'rehash_refactor.4' of https://github.com/slingamn/oragono 2017-09-29 06:50:54 +10:00
Daniel Oaks
8ea5632269 Setup v0.9.2-unreleased devel ver 2017-09-29 06:50:09 +10:00
Shivaram Lingamneni
b7b24c34b4 rehash cannot modify the server name 2017-09-28 02:58:09 -04:00
Shivaram Lingamneni
3b0f1ff1cc delete websocket support as per discussion on #139 2017-09-28 02:53:08 -04:00
Shivaram Lingamneni
e8b1870067 refactor the rehash implementation 2017-09-28 02:13:24 -04:00
Daniel Oaks
eae04e8c51 Release v0.9.1 2017-09-28 15:49:10 +10:00
Daniel Oaks
cd8b4877b6 accounts: Check for account logins correctly, fixes registration. Also fix a typo, thanks squigz! 2017-09-28 15:49:01 +10:00
Daniel Oaks
90435256fd Merge pull request #138 from slingamn/quit_messages
send the actual quit message to friends
2017-09-26 13:03:13 +10:00
Shivaram Lingamneni
1612c141d5 send the actual quit message to friends 2017-09-25 22:47:03 -04:00
Daniel Oaks
a78a8f1130 client: Only add friends if they actually have the caps we request. Friends() is entirely broken because of this 2017-09-26 08:36:34 +10:00
Daniel Oaks
79de443496 channel: Don't send TOPIC on entirely new channel 2017-09-26 08:01:10 +10:00
Daniel Oaks
2759d8f5d3 modes: Allow 'MODE b' (used by irssi for channel sync) (thanks @dx!) 2017-09-26 07:58:17 +10:00
Daniel Oaks
3b0d9c4db9 Send nick parameter correctly on ERR_NOSUCHNICK numerics 2017-09-26 07:52:43 +10:00
Daniel Oaks
1ccdd67a45 Setup v0.9.1-unreleased devel ver 2017-09-26 00:45:42 +10:00
Daniel Oaks
02cd620bd4 Release v0.9.0 2017-09-25 11:29:43 +10:00
Daniel Oaks
e95c75f87d monitor: Fix a crash around the MONITOR command 2017-09-25 11:29:27 +10:00
Daniel Oaks
7ff33b88dd Update info doc and changelog 2017-09-25 11:09:58 +10:00
Daniel Oaks
ee73d136fc vendor: Updated submodules 2017-09-25 10:54:31 +10:00
Daniel Oaks
acec0e1690 PROXY: Check DLINEs and connection limits/throttle on new proxied connections 2017-09-25 10:52:02 +10:00
Daniel Oaks
38498b752b PROXY: Make sure given IPs are valid and pass them through appropriately 2017-09-25 10:52:01 +10:00
Daniel Oaks
7d140c9e43 PROXY: Update some comments, disallow from registered clients 2017-09-25 10:52:01 +10:00
Shivaram Lingamneni
99f02ede20 restore PROXY protocol support
support for PROXY was removed in 43e28e2fef85f. After discussion,
it's worth keeping around in case of client compatibility issues,
and until /rehash support is more mature.
2017-09-25 10:52:01 +10:00
Daniel Oaks
8cd016e4c0 server: Fix comments 2017-09-25 10:52:01 +10:00
Daniel Oaks
989fea18f9 Merge pull request #135 from slingamn/listeners_refactor_again.7
refactor create/update/destroy of listeners
2017-09-25 10:48:22 +10:00
Shivaram Lingamneni
0f0f2d1314 refactor listener update/destroy code
Don't close and reopen listeners
2017-09-11 18:40:15 -04:00
Shivaram Lingamneni
d5528f6e56 execute rehash() in its own goroutine
This prevents a deadlock:

1. rehash() is executing on the main goroutine
2. it's trying to stop a listener goroutine
3. the listener goroutine needs to hand off a new connection to newConns
4. but the main goroutine is blocked by rehash() so it can't receive it
2017-09-11 14:03:53 -04:00
Shivaram Lingamneni
b1376d5f71 Fix a concurrency error with Server.listeners
See #134; there was a `fatal error: concurrent map read and map write`
due to unsynchronized accesses to `Server.listeners`. Now, `listeners`
is only accessed by `NewServer` and `rehash`, so it doesn't need
synchronization.
2017-09-11 11:29:14 -04:00
Daniel Oaks
c48d869f4d Allow multiple account registrations for testing 2017-09-11 09:16:13 +10:00
Daniel Oaks
8e32098f1f Quiet mkcerts messages 2017-09-11 09:15:39 +10:00
Daniel Oaks
97010461f7 Merge pull request #133 from slingamn/default_modes.2
implement #132 (configurable default channel modes)
2017-09-07 17:23:12 +10:00
Shivaram Lingamneni
6063d30bc5 add a test for default channel mode parsing 2017-09-06 19:51:50 -04:00
Shivaram Lingamneni
333afe1062 make default channel modes configurable 2017-09-06 17:37:29 -04:00
Shivaram Lingamneni
a50e68af4d ignore vim swapfiles 2017-09-06 17:29:09 -04:00
Daniel Oaks
34964a9920 changelog: Document new stuff 2017-09-06 14:41:11 +10:00
Daniel Oaks
d052ca8a8d accounts: Disable reg if client's already registered an account 2017-09-06 14:38:55 +10:00
Daniel Oaks
eb72c38d0c changelog: Note latest changes, reword some dodgy lines 2017-09-06 14:38:55 +10:00
Daniel Oaks
ac91a3e484 strings: Follow latest advice on PRECIS regarding string stabilizing 2017-09-06 14:38:55 +10:00
Daniel Oaks
f9ef97b204 modes: Add experimental, untested +R user mode to block messages from unregistered users 2017-09-06 14:38:54 +10:00
Daniel Oaks
b975c6f182 Merge pull request #131 from slingamn/hostmask_fix
fix hostmask issue
2017-09-06 02:01:47 +10:00
Shivaram Lingamneni
9a9a85cd55 fix hostmask issue
PTR records ending in . (e.g., `google-public-dns-b.google.com.`)
were considered invalid
2017-09-05 11:43:50 -04:00
Daniel Oaks
ffabd26653 Make sure ISUPPORT outputs are sorted and tested 2017-07-30 22:42:37 +10:00
Daniel Oaks
0fe3855582 changelog: Describe new changes 2017-07-27 23:58:37 +10:00
Daniel Oaks
97cfc0b629 Print warnings to heavily encourage exposing port 6697 as a TLS port 2017-07-27 23:29:08 +10:00
Daniel Oaks
0b75351e56 Merge pull request #128 from euank/return-bad-ip-err
server: close connection on parse-ip failure
2017-07-26 17:19:08 +10:00
Daniel Oaks
c7cf79648e Merge pull request #129 from euank/disallow-colon-nick
strings: disallow ':' in nicks
2017-07-26 17:17:41 +10:00
Euan Kemp
3b47f3d470 config: don't casefold tls names
I don't think casefolding things like `:6697` ever made sense.
Since these are configured by the ircd operator, it makes sense to
assume they'll already be in a canonical form regardless.
2017-07-25 23:28:29 -07:00
Euan Kemp
449ef4cea1 strings: disallow ':' in nicks
This matches the behavior of inspircd at the very least.

Previously, the comment above that section claimed ':' should be
disallowed, but the code didn't do so.

I also simplified the code a little bit and added tests.
2017-07-25 23:28:29 -07:00
Euan Kemp
2b155f9b1e server: close connection on parse-ip failure
Close the client's connection if we're unable to parse their IP.

This also simplifies the check to reduce indentation by a level.

Finally, this replaces the two-var construction of the pseudo-const
messages with an inline dereference via a slice to allow constructing
them less noisily.
2017-07-25 22:19:40 -07:00
Daniel Oaks
9bb0062dbc readme: Add build status 2017-07-26 11:39:50 +10:00
Daniel Oaks
470fc2a469 travis: Also run Go tests where they exist, when running through Travis 2017-07-26 08:04:23 +10:00
Daniel Oaks
73703be181 Merge pull request #126 from enckse/master
simple travisci definition
2017-07-26 07:34:15 +10:00
Sean Enck
68c23102d8
dependency retrieval make rule 2017-07-25 17:01:09 -04:00
Sean Enck
89053fdd15
change location of svg 2017-07-25 16:55:22 -04:00
Sean Enck
28562b0f85
travis basic settings 2017-07-25 16:54:34 -04:00
Daniel Oaks
b807f492ed OPER: If client's already opered-up, ignore new OPER attempts 2017-07-23 22:50:50 +10:00
Daniel Oaks
cc15ec9d2d vendor: Updated submodules 2017-07-14 17:43:29 +10:00
Euan Kemp
2e8a98a925 irc: fix timer memleak
This is a gotcha called out in the `time.After` docs. `time.After` will
leak the underlying channel if nothing ever receives on it.
2017-07-14 17:21:53 +10:00
Daniel Oaks
b003cd6287 make: Fix build dirs 2017-07-14 17:21:49 +10:00
Euan Kemp
2f3838d95a make: properly specify targets as phony
None of them are referring to actual files
2017-07-13 23:12:36 -07:00
Euan Kemp
e6b6ab2b11 make: remove extraneous slash
The variables were often referenced with a trailing slash, and having
`//` works, but is sloppy.
2017-07-13 23:10:58 -07:00
Daniel Oaks
ba8c708318 info: Go over rehashing and the REST API 2017-07-02 08:17:34 +10:00
Daniel Oaks
285059a1bf info: Add S2S plans/info/etc 2017-07-02 07:55:02 +10:00
Daniel Oaks
475570d57f docs: Add a very basic INFO document. 2017-07-02 07:38:33 +10:00
Daniel Oaks
184438b99a readme: Explain new stable branch and go over building more completely 2017-07-01 22:43:15 +10:00
Daniel Oaks
3db81be7e3 startup: Add warning about running unreleased versions 2017-07-01 07:07:48 +10:00
Daniel Oaks
c0fbc7908d sasl: Always send a 906 in response to AUTHENTICATE * 2017-06-30 11:06:10 +10:00
Daniel Oaks
7735ddfa03 Setup v0.8.3-unreleased devel ver 2017-06-30 11:04:24 +10:00
Daniel Oaks
376fa70244 Release v0.8.2 2017-06-30 01:14:50 +10:00
Daniel Oaks
b633db3c9d modes: Also allow Voice 2017-06-30 01:14:38 +10:00
Daniel Oaks
a833399d35 vendor: Updated submodules 2017-06-30 01:02:18 +10:00
Daniel Oaks
6ffc96d495 modes: Let users give other users privs in channels. Silly bug. 2017-06-30 00:59:51 +10:00
Daniel Oaks
279ac928ae Setup 0.8.2-unreleased for next release 2017-06-28 14:59:01 +10:00
Daniel Oaks
b78b57bbf9 readme: Simplify and fold new sections into existing ones where possible 2017-06-27 08:35:58 +10:00
Daniel Oaks
aa80045580 Merge branch 'platforms' of https://github.com/enckse/oragono into doc-fixes 2017-06-27 08:27:50 +10:00
Sean Enck
f12cfe97fc
example of running with a config 2017-06-26 10:34:54 -04:00
Sean Enck
4a9a6dc700
Platform specific packaging information 2017-06-26 10:29:36 -04:00
Daniel Oaks
325ed3e112 Release v0.8.1 2017-06-26 15:57:38 +10:00
Daniel Oaks
50ee1034b4 Remove build script now that we have a decent makefile 2017-06-26 09:46:39 +10:00
Sean Enck
534854b42b
Makefile for os-specific builds 2017-06-24 15:41:11 -04:00
Daniel Oaks
88720c4354 changelog: Update 2017-06-25 03:57:57 +10:00
Daniel Oaks
0aae54cf33 readme: Fix channel reg command (thanks @enckse!) 2017-06-25 03:42:26 +10:00
Daniel Oaks
23a26f83fe client: Show real IP and whether the target's using TLS in WHOIS 2017-06-23 05:15:10 +10:00
Daniel Oaks
1c0c4841a1 General comments, fix misspellings and lints 2017-06-19 14:53:16 -06:00
Daniel Oaks
124139c097 changelog: Update 2017-06-18 08:29:32 -06:00
Daniel Oaks
e5980beb7d SANICK: Fix check for new user 2017-06-18 08:23:51 -06:00
Daniel Oaks
194a301d23 vendor: Updated submodules 2017-06-15 10:15:41 -06:00
Daniel Oaks
c9ed749538 Rename deps 2017-06-15 10:14:19 -06:00
Daniel Oaks
8b0435be5b Update readmes to new repo 2017-06-14 12:16:25 -06:00
Daniel Oaks
13176f94c7 vendor: Updated packages 2017-06-14 12:12:17 -06:00
Daniel Oaks
6a83358d69 Switch to new repo 2017-06-14 12:12:02 -06:00
Daniel Oaks
a8fa131244 Move to new repo 2017-06-14 12:00:53 -06:00
Daniel Oaks
521203650c changelog: Update 2017-06-11 10:18:49 -06:00
Daniel Oaks
5b3cea8b98 xline: Add snomasks for setting/removing xlines 2017-06-11 10:17:55 -06:00
Daniel Oaks
5c725bb622 changelog: Document new snomasks and revise ordering 2017-06-11 10:03:32 -06:00
Daniel Oaks
309ec8191e Add 'k' snomask for kills (including those coming from dlines and klines) 2017-06-11 10:01:39 -06:00
Daniel Oaks
3ee26041ff Send snomask on client quits 2017-06-11 09:42:37 -06:00
Daniel Oaks
fb1f6dab2b readme: Explain branches 2017-06-11 07:52:55 -06:00
Daniel Oaks
e490e7bad4 changelog: Update! 2017-06-11 07:46:15 -06:00
Daniel Oaks
8a6ba6f9cc LIST: Start implementing ELIST conditions 2017-06-11 07:45:58 -06:00
Daniel Oaks
f962c35d5f vendor: Updated submodules 2017-06-10 17:10:48 -06:00
Daniel Oaks
55d8eb5dce Make 'nick' snomask look nicer 2017-06-10 17:07:44 -06:00
Daniel Oaks
34863a6320 JOIN: Disable JOIN 0 support, in line with Insp 2017-06-10 17:03:23 -06:00
Daniel Oaks
4128ff6137 server: Check for channel permissions when renaming channels 2017-06-04 20:06:11 -06:00
Daniel Oaks
0f8ab4eaec server: Add proposed RENAME command 2017-06-04 20:01:37 -06:00
Daniel Oaks
53190ef131 Send a whole lot more snomasks 2017-05-28 12:43:09 -06:00
Daniel Oaks
ebb9d629d7 xline: Add ANDKILL param to kill all matching clients 2017-05-24 00:58:36 -06:00
Daniel Oaks
3101f16478 readme: Extend registration instructions 2017-05-23 23:42:29 -06:00
Daniel Oaks
c949ef539e Merge pull request #105 from vegax87/patch-1
Update README.md
2017-05-17 13:47:32 -06:00
Vegax
f6c8b0cd23 Update README.md
An useful reminder
2017-05-17 21:25:34 +02:00
Daniel Oaks
a271481c41 Setup 0.8.1-unreleased for next release 2017-05-16 21:08:15 -06:00
Daniel Oaks
f051b43f27 Release v0.8.0 2017-05-09 22:01:14 +10:00
Daniel Oaks
482ab1ac2a vendor: Updated submodules 2017-05-09 22:00:58 +10:00
Daniel Oaks
01248a6d37 changelog: Add new info 2017-05-09 21:33:15 +10:00
Daniel Oaks
ab2ae70f13 help: Add help text for snomasks 2017-05-09 21:33:03 +10:00
Daniel Oaks
d847d55c06 Fix wordWrap function so it doesn't drop chars, and fix client.Notice() to automagically split very long lines. 2017-05-09 21:09:44 +10:00
Daniel Oaks
9fe7c143c8 server: Remove useless comments, make idle/quit function layouts nicer 2017-05-09 20:37:48 +10:00
Daniel Oaks
fb63691c8b commands: Timeout unregistered clients 2017-05-09 20:36:45 +10:00
Daniel Oaks
ff82872934 reg: Rename commands to match 2017-05-08 09:28:30 +10:00
Daniel Oaks
fd793d6adb Add very initial snomasks 2017-05-08 09:15:16 +10:00
Daniel Oaks
1afd3b8f78 server: Change localconnect msg to include username/realname 2017-05-01 19:03:04 +10:00
Daniel Oaks
f5ecf70ecf logger: Flush file writes to ensure they get written out 2017-05-01 19:02:49 +10:00
Daniel Oaks
7ac96114c3 log: Allow logging to stdout 2017-05-01 18:51:37 +10:00
Daniel Oaks
51425b7764 help: Generate index of help topics 2017-04-30 13:53:49 +10:00
Daniel Oaks
2c9b2db9e3 developing: Link to dep tool, not old vendetta one 2017-04-30 13:25:35 +10:00
Daniel Oaks
fe8fc6f924 readme: Link to latest release 2017-04-30 13:24:16 +10:00
Daniel Oaks
c9b5a73fcd developing: Describe new vendor/ changes 2017-04-30 13:10:23 +10:00
Daniel Oaks
5ecdc427e8 vendor: Updated submodules 2017-04-30 13:09:36 +10:00
Daniel Oaks
e85c3e9243 Add new .vendor submodule 2017-04-30 13:06:20 +10:00
Daniel Oaks
365b380164 Remove old Vendetta-based vendor/ 2017-04-30 13:02:01 +10:00
Daniel Oaks
9e1f3e5c87 changelog: Add new notes 2017-04-30 12:45:22 +10:00
Daniel Oaks
5c518531be Integrate StackImpact profiling 2017-04-30 12:35:07 +10:00
Daniel Oaks
2bd4d03ecc Prevent copying locks because that's silly 2017-04-30 11:12:25 +10:00
Daniel Oaks
4254672133 socket: Fix bad mutex unlock 2017-04-19 08:50:57 +10:00
Daniel Oaks
c911ff2bcd Squash a bunch of possible races 2017-04-18 22:26:01 +10:00
Daniel Oaks
1977d03faf vendor: Updated submodules 2017-04-18 21:36:15 +10:00
Daniel Oaks
f7a4f5d956 socket: Move to a timing-out send method that reduces goroutines and ensures QUIT/ERROR are sent 2017-04-18 20:29:00 +10:00
Daniel Oaks
067f982da4 socket: Remove old comment 2017-04-18 17:19:55 +10:00
Daniel Oaks
f665ebac16 channels: Help prevent issues when join/parting 2017-04-18 17:19:44 +10:00
Daniel Oaks
4a66771c39 socket: Attempt to close sockets better 2017-04-18 16:43:24 +10:00
Daniel Oaks
1c917a19a7 client: Ensure ERROR message is parsed when quitting 2017-04-17 23:05:47 +10:00
Daniel Oaks
9cfa92ede8 modes: Avoid unnecessarily sending unknown mode numerics 2017-04-17 23:05:24 +10:00
Daniel Oaks
86957d4392 socket: Fix quitting 2017-04-17 22:35:25 +10:00
Daniel Oaks
7aaa30d399 Setup 0.7.3-unreleased for next release 2017-04-17 21:59:53 +10:00
Daniel Oaks
9264ffc857 Release v0.7.2 2017-04-17 21:16:22 +10:00
Daniel Oaks
121269661b socket: Make closing work a little better 2017-04-17 21:03:07 +10:00
Daniel Oaks
e0035dfa04 types: Make ChannelNameMap use mutexes to fix crash 2017-04-17 21:03:02 +10:00
Daniel Oaks
ff3a864aa3 accountreg: Fix crash 2017-04-17 21:00:49 +10:00
Daniel Oaks
9a94121281 JOIN: Fix a dumb bug. Really dumb bug. 2017-04-17 20:28:01 +10:00
Daniel Oaks
88b5dd5621 Fix misspelling 2017-04-16 11:36:33 +10:00
Daniel Oaks
166cddecb1 Fix nits 2017-04-16 11:35:44 +10:00
Daniel Oaks
22216d4d60 Fix lots of nits 2017-04-16 11:31:33 +10:00
Daniel Oaks
8ba0bf347d Setup 0.7.2-unreleased for next release 2017-04-16 10:59:31 +10:00
Daniel Oaks
511da5b434 Release v0.7.1 2017-03-28 17:34:52 +10:00
Daniel Oaks
0046025d60 Enable chanmode +r, fix bug with registering channels 2017-03-28 17:32:03 +10:00
Daniel Oaks
317a804644 Fix dates at top of source files 2017-03-27 22:15:02 +10:00
Daniel Oaks
99fd9af432 Setup 0.8.0-unreleased for next release 2017-03-27 22:07:11 +10:00
Daniel Oaks
1741a0fad1 Release v0.7.0 2017-03-27 14:53:50 +10:00
Daniel Oaks
013635a827 channel: Give founder mode if channel already exists and founder joins 2017-03-27 14:52:34 +10:00
Daniel Oaks
127d0ff681 changelog: Document changes 2017-03-27 14:41:50 +10:00
Daniel Oaks
451c40f170 WHO: Fix a small hang 2017-03-27 14:30:00 +10:00
Daniel Oaks
6aebd4aad9 channel: Add comments, fix a small bug with moderated mode 2017-03-27 14:29:51 +10:00
Daniel Oaks
479cd376d2 developing: Add advice for debugging hangs 2017-03-27 14:29:30 +10:00
Daniel Oaks
300d02bd9c channel: Kill a race condition that locked up the server.
Specifically, if you joined a channel while someone else was trying to part. the Join method would grab the lock, the Quit method would queue to grab the lock, the Join method would unlock and then try to regrab the lock, and it would get into a situation where nobody would have the lock and everyone would be waiting for it.

This caused weird oddities with clients.
2017-03-26 22:11:09 +10:00
Daniel Oaks
cec3416eae modes: Kill a crash 2017-03-26 22:09:46 +10:00
Daniel Oaks
a8e13b062b logger: Make safer to avoid file write races 2017-03-26 21:41:52 +10:00
Daniel Oaks
861b65eb39 channels: Automagically save channel bans/excepts/invites 2017-03-26 20:37:13 +10:00
Daniel Oaks
1798572015 Add comments 2017-03-25 09:19:13 +10:00
Daniel Oaks
b4b120a83e nickserv: Point towards /HELP REG since not implemented yet 2017-03-24 21:59:13 +10:00
Daniel Oaks
91fab3ba55 socket: Better deal with chanfloods 2017-03-24 21:54:22 +10:00
Daniel Oaks
aad1070633 client: Unlock channel mutex earlier 2017-03-24 21:54:06 +10:00
Daniel Oaks
e34475d536 Merge branch 'master' into devel+chanserv 2017-03-24 21:25:37 +10:00
Daniel Oaks
f5eeca5339 channel: Fix not being able to Part 2017-03-24 21:24:51 +10:00
Daniel Oaks
194411716d channel: Automagically save topic updates on registered channels 2017-03-24 13:49:29 +10:00
Daniel Oaks
70b7606996 config: Allow enabling/disabling channel reg 2017-03-24 12:52:38 +10:00
Daniel Oaks
ea748a9f7b readme: Add note about updating and password gen 2017-03-24 12:43:55 +10:00
Daniel Oaks
580385392a channel: Alert of given modes (+o/+q) on join 2017-03-24 12:38:07 +10:00
Daniel Oaks
6842d2ead6 Merge master 2017-03-24 12:29:13 +10:00
Daniel Oaks
05074e966d modes: Continue overhauling 2017-03-24 12:23:21 +10:00
Daniel Oaks
03fc6f767e changelog: Note new socket handling 2017-03-23 12:17:31 +10:00
Daniel Oaks
f5536d7945 socket: Add a simple println when SendQ exceeded, config comment update 2017-03-23 12:12:39 +10:00
Daniel Oaks
c3be2d0d46 socket: Fixup sending code so we can support more connections 2017-03-23 12:07:23 +10:00
Daniel Oaks
f29a5f0e70 socket: Very initial SendQ limit 2017-03-14 08:12:39 +10:00
Daniel Oaks
de4db1c6ef socket: Start overhaul of sockets and writing 2017-03-13 23:53:21 +10:00
Daniel Oaks
73d406ccd6 logger: Don't output control chars on log files 2017-03-13 23:52:28 +10:00
Daniel Oaks
657ed644cb modes: Start overhauling modes 2017-03-13 08:08:18 +10:00
Daniel Oaks
b33b217fab Add very initial ChanServ and NickServ virtual clients
As well, add channel registration and re-applying founder privs on the first client joining the channel. I'm going to re-architect our modes system to better acocunt for this sort of change.
2017-03-11 22:01:40 +10:00
Daniel Oaks
439331cfb8 logger: Move to separate package, make *much* nicer 2017-03-10 22:02:08 +10:00
Daniel Oaks
ef9acf53f8 vendor: Update submodules 2017-03-10 21:27:28 +10:00
Daniel Oaks
7bb53af44e logger: Enable Windows support, properly lock writing to stderr 2017-03-10 12:27:05 +10:00
Daniel Oaks
62c3159ce1 changelog: Note new config changes 2017-03-09 19:20:35 +10:00
Daniel Oaks
37171bf1ad config: Betterise words and duration example 2017-03-09 19:15:32 +10:00
Daniel Oaks
fb4e8ab6c0 config: Use sane STS defaults 2017-03-09 19:13:03 +10:00
Daniel Oaks
531cf675c8 rehash: Add note about cap del/new order 2017-03-09 19:09:58 +10:00
Daniel Oaks
5c38800a02 config: Advertise STS draft, fix subsequent REHASHing 2017-03-09 19:07:35 +10:00
Daniel Oaks
0675b09c88 readme: Simplify and cut down a bunch 2017-03-08 22:19:40 +10:00
Daniel Oaks
25a373b7eb logger: Add notice on connection when server is logging all I/O 2017-03-08 21:57:31 +10:00
Daniel Oaks
f1bf73c249 changelog: Add update 2017-03-08 21:51:56 +10:00
Daniel Oaks
3d597a4fb3 accounts: Login to accounts properly
Avoids letting clients login to two accounts at once
2017-03-08 21:50:12 +10:00
Daniel Oaks
27e36e4c6a developing: Add note that Vendetta is broken on Windows 2017-03-08 21:37:53 +10:00
Daniel Oaks
0c86c454c2 dline/kline: Allow year/month/day durations 2017-03-07 19:56:21 +10:00
Daniel Oaks
8834de5b32 rest: Expose DLINEs and KLINEs as xlines 2017-03-07 19:55:14 +10:00
Daniel Oaks
1b92f9e93f developing: Add instructions for updating vendor/ 2017-03-06 22:21:27 +10:00
Daniel Oaks
d2b7e53f2e vendor: Update submodules 2017-03-06 22:18:28 +10:00
Daniel Oaks
5de03f2169 logging: Reverse arrows for in and out, in ~= left, out ~= right 2017-03-06 22:12:27 +10:00
Daniel Oaks
b328a4fcd3 logging: Add userinput and output, fix up lots 2017-03-06 22:11:10 +10:00
Daniel Oaks
415a8117ee logger: Better colours and output 2017-03-06 20:15:28 +10:00
Daniel Oaks
3d443339e5 logger: Initial colours 2017-03-06 16:28:38 +10:00
Daniel Oaks
29e89b16a0 logger: Very initial working new logs 2017-03-06 15:50:23 +10:00
Daniel Oaks
45dd882ec4 logger: Make new logger 2017-03-06 15:16:00 +10:00
Daniel Oaks
1ddeec9225 config: Parse logger config 2017-03-06 13:31:10 +10:00
Daniel Oaks
a982d965f1 logger: New logging config 2017-03-06 13:08:46 +10:00
Daniel Oaks
ba0f291e20 logger: Initial new logger 2017-03-06 13:05:33 +10:00
Daniel Oaks
3058161f62 config: Fix accounts registration/authentication 2017-03-06 09:43:52 +10:00
Daniel Oaks
d1cb4b9b37 server: Bunch of nits 2017-03-06 09:27:08 +10:00
Daniel Oaks
542503f63e ws: Up the read/write buffer size 2017-03-06 09:26:54 +10:00
Daniel Oaks
9f6c4363b7 USERHOST: Clean up a bit, support multiple nicks 2017-03-06 09:14:15 +10:00
vegax87
b3a54cbb2c Merge branch 'master' of https://github.com/DanielOaks/oragono 2017-02-09 12:23:10 +01:00
Daniel Oaks
0d8a445c7b Merge pull request #95 from martinlindhe/master
server-time: convert local time to UTC before using it
2017-02-08 07:06:02 +10:00
Martin Lindhe
730d283201 server-time: convert local time to UTC before using it, fixes #94 2017-02-07 01:37:32 +01:00
vegax87
ef7c94e109 removed blank lines 2017-01-23 23:49:41 +01:00
vegax87
a623d8ef1e Solved! RPL_USERHOST must use trailing 2017-01-23 21:20:42 +01:00
vegax87
2ff48a7088 I forgot a little typo 2017-01-23 18:51:09 +01:00
vegax87
1bb9502206 I don't understand why USERHOST is working with spaces... 2017-01-23 18:49:42 +01:00
vegax87
f3c9c2b4b5 USERHOST command 2017-01-23 17:44:35 +01:00
Daniel Oaks
9e65d9b87e Add SAMODE command, restricted by oper capab 2017-01-23 09:36:13 +10:00
Daniel Oaks
c8b5fb65e0 WHOIS: Use inbuilt functionality to force trailing, as suggested by @vegax87 2017-01-23 09:03:49 +10:00
Daniel Oaks
ccae0cf7cd LIST: Fix list to display right member counts 2017-01-22 13:01:44 +10:00
Daniel Oaks
ea0121aeff strings: Prevent crash 2017-01-22 12:44:05 +10:00
Daniel Oaks
c2fedfb177 client: Forego the ForceTrailing func, just automagically work it out based on the command name 2017-01-22 10:43:02 +10:00
Daniel Oaks
b257c5955e client: Add SendForceTrailing function, to force the last param to be a trailing 2017-01-20 23:51:36 +10:00
Daniel Oaks
63ee5f6fde readme: Link to #oragono channel on Freenode 2017-01-20 15:23:22 +10:00
Daniel Oaks
827709dd99 Start vendoring deps 2017-01-20 14:48:26 +10:00
Daniel Oaks
db919722cb cull some old, unnecessary files 2017-01-19 16:12:10 +10:00
Daniel Oaks
4ca23f3554 Setup 0.7.0-unreleased for next release 2017-01-19 15:39:19 +10:00
Daniel Oaks
a9dfff4f30 Release v0.6.0 2017-01-19 08:12:59 +10:00
Daniel Oaks
67d65b0e3d client: Ignore empty lines, send ERROR with no prefix 2017-01-19 07:56:33 +10:00
Daniel Oaks
52127edde3 config: Better explain linelen 2017-01-18 09:46:30 +10:00
Daniel Oaks
cbe49ff3d8 Use a better line-splitting algorithm 2017-01-18 08:05:31 +10:00
Daniel Oaks
aad7aaba07 developing: Extra note on branch names 2017-01-18 07:30:48 +10:00
Daniel Oaks
522001d4f6 Cleanup message sending 2017-01-18 07:27:06 +10:00
Daniel Oaks
a81ccd68c5 changelog: Note msgid spec 2017-01-18 07:27:06 +10:00
Daniel Oaks
e741c1476b Implement message-ids draft 2017-01-18 07:26:41 +10:00
Daniel Oaks
79d8636c6d changelog: Add new draft/proposed specs 2017-01-18 07:26:41 +10:00
Daniel Oaks
62dc3c8f66 server: Implement TAGMSG draft command 2017-01-18 07:26:05 +10:00
Daniel Oaks
f6185fa336 Get it working, using not-great and very initial splitting code 2017-01-18 07:26:05 +10:00
Daniel Oaks
92626a178d server: Start roughly hacking in new message-tags support 2017-01-18 07:26:05 +10:00
Daniel Oaks
d2e18962e3 Very initial maxline work 2017-01-18 07:26:05 +10:00
Daniel Oaks
a0c97542ee LUSERS: minor chan cleanup to avoid counting 2017-01-17 22:52:19 +10:00
Daniel Oaks
298f4907ac LUSERS: Minor cleanups, we don't need to worry about changelog lines for now 2017-01-17 22:49:14 +10:00
vegax87
750f0ffcb6 removed Unknown connections 2017-01-17 12:09:51 +01:00
vegax87
b4427fa782 some comments 2017-01-15 15:29:16 +01:00
vegax87
0b24ca3c0e Added 2 empty lines to prevent conflict with draft/proposed specs in the changelog 2017-01-15 15:01:04 +01:00
vegax87
4797331962 Basic implementation of LUSERS command 2017-01-15 01:48:47 +01:00
Daniel Oaks
2de273462b WHOIS: Hack to make silly clients work 2017-01-14 13:54:57 +10:00
Daniel Oaks
5e6ac67010 casemapping: Update name 2017-01-14 08:02:24 +10:00
Daniel Oaks
2b240faa90 strings: Fix nick bugs, use UsernameCaseMapped 2017-01-14 02:32:15 +10:00
Daniel Oaks
c6e8e4bef3 changelog: Improve language 2017-01-13 23:34:26 +10:00
Daniel Oaks
d40427910e changelog: Mention WHOIS fix 2017-01-13 13:14:14 +10:00
Daniel Oaks
0a3de9a912 whois: Send channels without prefix (handled by Send()) 2017-01-13 13:12:36 +10:00
vegax87
a54dcb9057 Fixed WHOIS Command 2017-01-13 02:05:58 +01:00
Daniel Oaks
36525bdcd3 developing: Link to more projects 2017-01-12 21:23:46 +10:00
Daniel Oaks
700c0797b9 changelog: Fix typo 2017-01-12 21:20:06 +10:00
Daniel Oaks
91d59575ce Add initial automated connection throttling 2017-01-12 21:17:50 +10:00
Daniel Oaks
ddba5af265 Update changelog and readme 2017-01-11 22:52:15 +10:00
Daniel Oaks
4168eaafbb Basic implementation of KLINEs 2017-01-11 22:38:16 +10:00
Daniel Oaks
1bc08f18b7 dline: Display correct message on bad dline 2017-01-11 22:37:58 +10:00
Daniel Oaks
4b5f4b6755 dline: Fix a bug where UNDLINE didn't remove them from datastore 2017-01-11 22:22:26 +10:00
Daniel Oaks
e9324c3250 modes: Fix some more mutexes 2017-01-11 12:26:58 +10:00
Daniel Oaks
c39bebc696 Fix various locks around joining, kicking and quitting 2017-01-11 12:16:51 +10:00
Daniel Oaks
6f7c683247 channel: RWMutex for members access 2017-01-11 02:09:08 +10:00
Daniel Oaks
efb3000717 client_lookup_set: Use RWMutex 2017-01-11 01:06:02 +10:00
Daniel Oaks
658d1656fa accounts: Only allow verified accounts to SASL auth 2017-01-11 01:02:26 +10:00
Daniel Oaks
7bce531914 build: Add Linux ARM (raspi) and fix ARCH 2017-01-10 22:40:14 +10:00
Daniel Oaks
8f8a9ba31e build: Use bash instead of sh, so it works on Linux 2017-01-10 20:23:34 +10:00
Daniel Oaks
34089bd383 Move oragono-web to its own directory so go get works, as requested by @jamesog 2017-01-10 19:15:08 +10:00
Daniel Oaks
b612b1be60 Setup 0.6.0-unreleased for next release 2016-12-11 19:46:39 +10:00
Daniel Oaks
20fe4c7704 Release v0.5.0 2016-12-10 22:24:49 +10:00
Daniel Oaks
1cc217a9ae sasl: Follow PLAIN spec more closely 2016-12-01 18:48:11 +10:00
Daniel Oaks
cc910d0e6e CHANGELOG: Update with new stuff 2016-12-01 18:16:25 +10:00
Daniel Oaks
8eb8193b18 JOIN: Only give chanop, not chan founder (will save that for regged chans) 2016-12-01 18:12:51 +10:00
Daniel Oaks
f57a43f3da KICK: Allow multiple kicks to the same channel 2016-12-01 18:10:38 +10:00
Daniel Oaks
a8eabe8e9c client: Fix a lot of bugs around setting NICK 2016-11-29 22:33:10 +10:00
Daniel Oaks
5eafd2656e channel: Send channel NOTICEs properly 2016-11-29 21:41:26 +10:00
Daniel Oaks
7068072292 monitor: Send with account-tag where appropriate 2016-11-29 21:40:56 +10:00
Daniel Oaks
dc605ebb01 client: Send quit messages more correctly 2016-11-29 21:06:01 +10:00
Daniel Oaks
2e2e91689a client: Send quit message to friends correctly 2016-11-29 19:28:22 +10:00
Daniel Oaks
9314edd405 modes: Convey cmode changes to other channel members... 2016-11-29 19:16:01 +10:00
Daniel Oaks
94c2a661c3 README: Mention REST API and web interface better 2016-11-16 12:09:32 +10:00
Daniel Oaks
9a9820fa88 NICK: Prevent races, remove a DoS 2016-11-16 12:02:22 +10:00
Daniel Oaks
95e36b99a2 Nick locking (entirely broken, needs to be completely redesigned) 2016-11-16 03:05:33 +10:00
Daniel Oaks
527841c673 rest-api: Disable by default, betterise CHANGELOG 2016-11-15 08:04:34 +10:00
Daniel Oaks
4a22311156 Merge branch 'develop' of https://github.com/DanielOaks/oragono into develop 2016-11-14 04:05:22 +00:00
Daniel Oaks
7f4bbbc587 rp: Mention mode in help text, fix comment 2016-11-14 14:03:48 +10:00
Daniel Oaks
b6f807dfdc commands: Use ERR_NOTREGISTERED when appropriate 2016-11-08 07:07:31 +10:00
Daniel Oaks
8dfa888552 Start web interface framework 2016-11-06 23:04:30 +10:00
Daniel Oaks
239a79fde2 README: correct typo 2016-11-06 15:50:12 +10:00
Daniel Oaks
6d6c1936cc Handle db better, fix bug, update db schema, rest 2016-11-06 13:47:13 +10:00
Daniel Oaks
65cb932e46 restapi: Add version and rehashing 2016-11-06 12:49:39 +10:00
Daniel Oaks
539e5431b9 restapi: Add accts, restructure a little 2016-11-06 12:49:39 +10:00
Daniel Oaks
ee3853f845 restapi: Initial commit 2016-11-06 12:49:39 +10:00
Daniel Oaks
4402e3e3aa dline: Fix language 2016-11-06 12:46:11 +10:00
Daniel Oaks
f1e2c54fca dline: Prevent opers from banning themselves 2016-11-05 21:44:49 +10:00
Daniel Oaks
e973862944 CHANGELOG: Cleanup a little 2016-11-05 00:36:12 +10:00
Daniel Oaks
46307dedf2 dline: Load DLINEs properly and return proper info 2016-11-04 22:15:14 +10:00
Daniel Oaks
c3174bb648 Various crash fixes, and little cleanups for safety 2016-11-04 21:38:47 +10:00
Daniel Oaks
011419e755 dline: Should be working now 2016-11-04 21:15:23 +10:00
Daniel Oaks
8c797d0f76 Initial DLINE changes 2016-11-04 12:42:58 +10:00
Daniel Oaks
6beaeff9c7 Cleanup running version string 2016-11-03 20:26:10 +10:00
Daniel Oaks
9a3a5fff90 Setup 0.5.0-unreleased for next release 2016-11-03 20:25:40 +10:00
Daniel Oaks
b1db65009e Release v0.4.0 2016-11-03 17:25:10 +10:00
Daniel Oaks
9fea9cf658 modes: Restrict changing modes correctly 2016-11-03 16:59:57 +10:00
Daniel Oaks
d32ccdc572 roleplay: More fixes and checks 2016-11-02 00:42:25 +10:00
Daniel Oaks
07e4728c15 roleplay: Initial commit 2016-11-01 23:56:25 +10:00
Daniel Oaks
62a0cbc1f6 server: Move maxTargets to constant, fix bug on privmsg/notice 2016-10-27 00:51:55 +10:00
Daniel Oaks
c7fdb4656e strings: Use inbuilt precis.Nickname encoding now 2016-10-27 00:44:36 +10:00
Daniel Oaks
dab207d32b README: Improve features list some more 2016-10-24 01:36:55 +10:00
Daniel Oaks
91e3ab5735 README: Extend features 2016-10-24 01:07:04 +10:00
Daniel Oaks
f62ffe006f server: Support more RPL_ISUPPORT stuff 2016-10-24 01:01:27 +10:00
Daniel Oaks
78028135eb modes: Limit length of beI mode lists 2016-10-24 00:50:18 +10:00
Daniel Oaks
20cb3407cb config: Reorganise to improve readibility 2016-10-23 23:14:13 +10:00
Daniel Oaks
a404bf83d1 Add automated client connection limiting 2016-10-23 23:05:00 +10:00
Daniel Oaks
1092caa190 MONITOR: Fix display of long lists 2016-10-23 20:24:02 +10:00
Daniel Oaks
194fa9af9f HELP: Check topics exist at startup, fix a bug 2016-10-23 18:59:13 +10:00
Daniel Oaks
a7949b6cb4 irc: Assorted golint cleanups 2016-10-23 11:48:57 +10:00
Daniel Oaks
29e811a531 oper: Support custom vhosts, and chghost 2016-10-23 11:28:31 +10:00
Daniel Oaks
8e2a8cb1b3 opers: Enforce oper class permissions 2016-10-23 11:13:08 +10:00
Daniel Oaks
f3459830e7 opers: Allow setting custom whois lines 2016-10-23 11:01:05 +10:00
Daniel Oaks
64bdedaee2 Add oper classes, for more finely-grained control 2016-10-23 10:47:11 +10:00
Daniel Oaks
a5395b5fe2 Setup 0.4.0-unreleased for next release 2016-10-23 09:42:57 +10:00
1143 changed files with 454576 additions and 5636 deletions

14
.check-gofmt.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
# exclude vendor/
SOURCES="./ergo.go ./irc"
if [ "$1" = "--fix" ]; then
exec gofmt -s -w $SOURCES
fi
if [ -n "$(gofmt -s -l $SOURCES)" ]; then
echo "Go code is not formatted correctly with \`gofmt -s\`:"
gofmt -s -d $SOURCES
exit 1
fi

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
vendor/* linguist-vendored
languages/* linguist-vendored

32
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,32 @@
name: "build"
on:
pull_request:
branches:
- "master"
- "stable"
push:
branches:
- "master"
- "stable"
jobs:
build:
runs-on: "ubuntu-24.04"
steps:
- name: "checkout repository"
uses: "actions/checkout@v3"
- name: "setup go"
uses: "actions/setup-go@v3"
with:
go-version: "1.24"
- name: "install python3-pytest"
run: "sudo apt install -y python3-pytest"
- name: "make install"
run: "make install"
- name: "make test"
run: "make test"
- name: "make smoke"
run: "make smoke"
- name: "make irctest"
run: "make irctest"

48
.github/workflows/docker-image.yml vendored Normal file
View File

@ -0,0 +1,48 @@
name: 'ghcr'
on:
push:
branches:
- "master"
- "stable"
tags:
- 'v*'
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout Git repository
uses: actions/checkout@v3
- name: Authenticate to container registry
uses: docker/login-action@v2
if: github.event_name != 'pull_request'
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Setup Docker buildx driver
id: buildx
uses: docker/setup-buildx-action@v2
- name: Build and publish image
uses: docker/build-push-action@v3
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

13
.gitignore vendored
View File

@ -62,6 +62,8 @@ Temporary Items
# Linux trash folder which might appear on any partition or disk
.Trash-*
# vim swapfiles
*.swp
### Go ###
# Compiled Object files, Static and Dynamic libs (Shared Objects)
@ -93,12 +95,19 @@ _testmain.go
*.out
### Oragono ###
### custom ###
/_site/
/.vscode/*
/ircd*
/web-*
/web.*
/ssl.*
/tls.*
/oragono
/ergo
/build/*
_test
ergo.prof
ergo.mprof
/dist
*.pem
.dccache

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "irctest"]
path = irctest
url = https://github.com/ergochat/irctest

82
.goreleaser.yml Normal file
View File

@ -0,0 +1,82 @@
# .goreleaser.yml
# Build customization
version: 2
project_name: ergo
builds:
- main: ergo.go
env:
- CGO_ENABLED=0
binary: ergo
goos:
- linux
- windows
- darwin
- freebsd
- openbsd
- plan9
goarch:
- amd64
- arm
- arm64
- riscv64
goarm:
- 6
ignore:
- goos: windows
goarch: arm
- goos: windows
goarch: arm64
- goos: windows
goarch: riscv64
- goos: darwin
goarch: arm
- goos: darwin
goarch: riscv64
- goos: freebsd
goarch: arm
- goos: freebsd
goarch: arm64
- goos: freebsd
goarch: riscv64
- goos: openbsd
goarch: arm
- goos: openbsd
goarch: arm64
- goos: openbsd
goarch: riscv64
- goos: plan9
goarch: arm
- goos: plan9
goarch: arm64
- goos: plan9
goarch: riscv64
flags:
- -trimpath
archives:
-
name_template: >-
{{ .ProjectName }}-{{ .Version }}-
{{- if eq .Os "darwin" }}macos{{- else }}{{ .Os }}{{ end -}}-
{{- if eq .Arch "amd64" }}x86_64{{- else }}{{ .Arch }}{{ end -}}
{{ if .Arm }}v{{ .Arm }}{{ end -}}
format: tar.gz
format_overrides:
- goos: windows
format: zip
files:
- README
- CHANGELOG.md
- LICENSE
- ergo.motd
- default.yaml
- traditional.yaml
- docs/API.md
- docs/MANUAL.md
- docs/USERGUIDE.md
- languages/*.yaml
- languages/*.json
- languages/*.md
wrap_in_directory: true
checksum:
name_template: "{{ .ProjectName }}-{{ .Version }}-checksums.txt"

File diff suppressed because it is too large Load Diff

213
DEVELOPING.md Normal file
View File

@ -0,0 +1,213 @@
# Developing Ergo
This is a guide to modifying Ergo's code. If you're just trying to run your own Ergo, or use one, you shouldn't need to worry about these issues.
## Golang issues
You should use the [latest distribution of the Go language for your OS and architecture](https://golang.org/dl/). (If `uname -m` on your Raspberry Pi reports `armv7l`, use the `armv6l` distribution of Go; if it reports v8, you may be able to use the `arm64` distribution.)
Ergo vendors all its dependencies. Because of this, Ergo is self-contained and you should not need to fetch any dependencies with `go get`. Doing so is not recommended, since it may fetch incompatible versions of the dependencies.
If you're upgrading the Go version used by Ergo, there are several places where it's hard-coded and must be changed:
1. `.github/workflows/build.yml`, which controls the version that our CI test suite uses to build and test the code (e.g., for a PR)
2. `Dockerfile`, which controls the version that the Ergo binaries in our Docker images are built with
3. `go.mod`: this should be updated automatically by Go when you do module-related operations
## Branches
The recommended workflow for development is to create a new branch starting from the current `master`. Even though `master` is not recommended for production use, we strive to keep it in a usable state. Starting from `master` increases the likelihood that your patches will be accepted.
Long-running feature branches that aren't ready for merge into `master` may be maintained under a `devel+` prefix, e.g. `devel+metadata` for a feature branch implementing the IRCv3 METADATA extension.
## Workflow
We have two test suites:
1. `make test`, which runs some relatively shallow unit tests, checks `go vet`, and does some other internal consistency checks
1. `make irctest`, which runs the [irctest](https://github.com/ProgVal/irctest) integration test suite
Barring special circumstances, both must pass for a PR to be accepted. irctest will test the `ergo` binary visible on `$PATH`; make sure your development version is the one being tested. (If you have `~/go/bin` on your `$PATH`, a successful `make install` will accomplish this.)
The project style is [gofmt](https://go.dev/blog/gofmt); it is enforced by `make test`. You can fix any style issues automatically by running `make gofmt`.
## Updating dependencies
Ergo vendors all dependencies using `go mod vendor`. To update a dependency, or add a new one:
1. `go get -v bazbat.com/path/to/dependency` ; this downloads the new dependency
2. `go mod vendor` ; this writes the dependency's source files to the `vendor/` directory
3. `git add go.mod go.sum vendor/` ; this stages all relevant changes to the vendor directory, including file deletions. Take care that spurious changes (such as editor swapfiles) aren't added.
4. `git commit`
## Releasing a new version
1. Ensure the tests pass, locally on travis (`make test`, `make smoke`, and `make irctest`)
1. Test backwards compatibility guarantees. Get an example config file and an example database from the previous stable release. Make sure the current build still works with them (modulo anything explicitly called out in the changelog as a breaking change).
1. Run the `ircstress` chanflood benchmark to look for data races (enable race detection) and performance regressions (disable it).
1. Update the changelog with new changes and write release notes.
1. Update the version number `irc/version.go` (either change `-unreleased` to `-rc1`, or remove `-rc1`, as appropriate).
1. Commit the new changelog and constants change.
1. Tag the release with `git tag --sign v0.0.0 -m "Release v0.0.0"` (`0.0.0` replaced with the real ver number).
1. Build binaries using `make release`
1. Sign the checksums file with `gpg --sign --detach-sig --local-user <fingerprint>`
1. Smoke-test a built binary locally
1. Point of no return: `git push origin master --tags` (this publishes the tag; any fixes after this will require a new point release)
1. Publish the release on GitHub (Releases -> "Draft a new release"); use the new tag, post the changelog entries, upload the binaries, the checksums file, and the signature of the checksums file
1. Update the `irctest_stable` branch with the new changes (this may be a force push).
1. If it's a production release (as opposed to a release candidate), update the `stable` branch with the new changes. (This may be a force push in the event that stable contained a backport. This is fine because all stable releases and release candidates are tagged.)
1. Similarly, for a production release, update the `irctest_stable` branch (this is the branch used by upstream irctest to integration-test against Ergo).
1. Make the appropriate announcements:
* For a release candidate:
1. the channel topic
1. any operators who may be interested
1. update the testnet
* For a production release:
1. everything applicable to a release candidate
1. Twitter
1. ergo.chat/news
1. ircv3.net support tables, if applicable
1. other social media?
Once it's built and released, you need to setup the new development version. To do so:
1. Ensure dependencies are up-to-date.
1. Bump the version number in `irc/version.go`, typically by incrementing the second number in the 3-tuple, and add '-unreleased' (for instance, `2.2.0` -> `2.3.0-unreleased`).
1. Commit the new version number and changelog with the message `"Setup v0.0.1-unreleased devel ver"`.
**Unreleased changelog content**
```md
## Unreleased
New release of Ergo!
### Config Changes
### Security
### Added
### Changed
### Removed
### Fixed
```
## Debugging
It's helpful to enable all loglines while developing. Here's how to configure this:
```yaml
logging:
-
method: stderr
type: "*"
level: debug
```
To debug a hang, the best thing to do is to get a stack trace. The easiest way to get stack traces is with the [pprof listener](https://golang.org/pkg/net/http/pprof/), which can be enabled in the `debug` section of the config. Once it's enabled, you can navigate to `http://localhost:6060/debug/pprof/` in your browser and go from there. If that doesn't work, try:
$ kill -ABRT <procid>
This will kill Ergo and print out a stack trace for you to take a look at.
## Concurrency design
Ergo involves a fair amount of shared state. Here are some of the main points:
1. Each client has a separate goroutine that listens for incoming messages and synchronously processes them.
1. All sends to clients are asynchronous; `client.Send` appends the message to a queue, which is then processed on a separate goroutine. It is always safe to call `client.Send`.
1. The server has a few of its own goroutines, for listening on sockets and handing off new client connections to their dedicated goroutines.
1. A few tasks are done asynchronously in ad-hoc goroutines.
In consequence, there is a lot of state (in particular, server and channel state) that can be read and written from multiple goroutines. This state is protected with mutexes. To avoid deadlocks, mutexes are arranged in "tiers"; while holding a mutex of one tier, you're only allowed to acquire mutexes of a strictly *higher* tier. The tiers are:
1. Tier 1 mutexes: these are the "innermost" mutexes. They typically protect getters and setters on objects, or invariants that are local to the state of a single object. Example: `Channel.stateMutex`.
1. Tier 2 mutexes: these protect some invariants of their own, but also need to access fields on other objects that themselves require synchronization. Example: `ChannelManager.RWMutex`.
1. Tier 3 mutexes: these protect macroscopic operations, where it doesn't make sense for more than one to occur concurrently. Example; `Server.rehashMutex`, which prevents rehashes from overlapping.
There are some mutexes that are "tier 0": anything in a subpackage of `irc` (e.g., `irc/logger` or `irc/connection_limits`) shouldn't acquire mutexes defined in `irc`.
We are using `buntdb` for persistence; a `buntdb.DB` has an `RWMutex` inside it, with read-write transactions getting the `Lock()` and read-only transactions getting the `RLock()`. This mutex is considered tier 1. However, it's shared globally across all consumers, so if possible you should avoid acquiring it while holding ordinary application-level mutexes.
## Command handlers and ResponseBuffer
We support a lot of IRCv3 specs. Pretty much all of them, in fact. And a lot of proposed/draft ones. One of the draft specifications that we support is called ["labeled responses"](https://ircv3.net/specs/extensions/labeled-response.html).
With labeled responses, when a client sends a label along with their command, they are assured that they will receive the response messages with that same label.
For example, if the client sends this to the server:
@label=pQraCjj82e PRIVMSG #channel :hi!
They will expect to receive this (with echo-message also enabled):
@label=pQraCjj82e :nick!user@host PRIVMSG #channel :hi!
They receive the response with the same label, so they can match the sent command to the received response. They can also do the same with any other command.
In order to allow this, in command handlers we don't send responses directly back to the user. Instead, we buffer the responses in an object called a ResponseBuffer. When the command handler returns, the contents of the ResponseBuffer is sent to the user with the appropriate label (and batches, if they're required).
Basically, if you're in a command handler and you're sending a response back to the requesting client, use `rb.Add*` instead of `client.Send*`. Doing this makes sure the labeled responses feature above works as expected. The handling around `PRIVMSG`/`NOTICE`/`TAGMSG` is strange, so simply defer to [irctest](https://github.com/DanielOaks/irctest)'s judgement about whether that's correct for the most part.
## Translated strings
The function `client.t()` is used fairly widely throughout the codebase. This function translates the given string using the client's negotiated language. If the parameter of the function is a string, the translation update script below will grab that string and mark it for translation.
In addition, throughout most of the codebase, if a string is created using the backtick characters ``(`)``, that string will also be marked for translation. This is really useful in the cases of general errors and other strings that are created far away from the final `client.t` function they are sent through.
## Updating Translations
We support translating server strings using [CrowdIn](https://crowdin.com/project/ergochat)! To send updated source strings to CrowdIn, you should:
1. `cd` to the base directory (the one this `DEVELOPING` file is in).
2. Install the `pyyaml` and `docopt` deps using `pip3 install pyyamp docopt`.
3. Run the `updatetranslations.py` script with: `./updatetranslations.py run irc languages`
4. Commit the changes
CrowdIn's integration should grab the new translation files automagically.
When new translations are available, CrowsIn will submit a new PR with the updates. The `INFO` command should be used to see whether the credits strings has been updated/translated properly, since that can be a bit of a sticking point for our wonderful translators :)
### Updating Translations Manually
You shouldn't need to do this, but to update 'em manually:
1. `cd` to the base directory (the one this `DEVELOPING` file is in).
2. Install the `pyyaml` and `docopt` deps using `pip3 install pyyamp docopt`.
3. Run the `updatetranslations.py` script with: `./updatetranslations.py run irc languages`
4. Install the [CrowdIn CLI tool](https://support.crowdin.com/cli-tool/).
5. Make sure the CrowdIn API key is correct in `~/.crowdin.yaml`
6. Run `crowdin upload sources`
We also support grabbing translations directly from CrowdIn. To do this:
1. `cd` to the base directory (the one this `DEVELOPING` file is in).
2. Install the [CrowdIn CLI tool](https://support.crowdin.com/cli-tool/).
3. Make sure the CrowdIn API key is correct in `~/.crowdin.yaml`
4. Run `crowdin download`
This will download a bunch of updated files and put them in the right place
## Adding a mode
When adding a mode, keep in mind the following places it may need to be referenced:
1. The mode needs to be defined in the `irc/modes` subpackage
1. It may need to be special-cased in `modes.RplMyInfo()`
1. It may need to be added to the `CHANMODES` ISUPPORT token
1. It may need special handling in `ApplyUserModeChanges` or `ApplyChannelModeChanges`
1. It may need special persistence handling code

48
Dockerfile Normal file
View File

@ -0,0 +1,48 @@
## build ergo binary
FROM docker.io/golang:1.24-alpine AS build-env
RUN apk upgrade -U --force-refresh --no-cache && apk add --no-cache --purge --clean-protected -l -u make git
# copy ergo source
WORKDIR /go/src/github.com/ergochat/ergo
COPY . .
# modify default config file so that it doesn't die on IPv6
# and so it can be exposed via 6667 by default
RUN sed -i 's/^\(\s*\)\"127.0.0.1:6667\":.*$/\1":6667":/' /go/src/github.com/ergochat/ergo/default.yaml && \
sed -i 's/^\s*\"\[::1\]:6667\":.*$//' /go/src/github.com/ergochat/ergo/default.yaml
# compile
RUN make install
## build ergo container
FROM docker.io/alpine:3.19
# metadata
LABEL maintainer="Daniel Oaks <daniel@danieloaks.net>,Daniel Thamdrup <dallemon@protonmail.com>" \
description="Ergo is a modern, experimental IRC server written in Go"
# standard ports listened on
EXPOSE 6667/tcp 6697/tcp
# ergo itself
COPY --from=build-env /go/bin/ergo \
/go/src/github.com/ergochat/ergo/default.yaml \
/go/src/github.com/ergochat/ergo/distrib/docker/run.sh \
/ircd-bin/
COPY --from=build-env /go/src/github.com/ergochat/ergo/languages /ircd-bin/languages/
# running volume holding config file, db, certs
VOLUME /ircd
WORKDIR /ircd
# default motd
COPY --from=build-env /go/src/github.com/ergochat/ergo/ergo.motd /ircd/ergo.motd
# launch
ENTRYPOINT ["/ircd-bin/run.sh"]
# # uncomment to debug
# RUN apk add --no-cache bash
# RUN apk add --no-cache vim
# CMD /bin/bash

View File

@ -1,6 +1,9 @@
The MIT License (MIT)
Copyright (c) 2014 Jeremy Latt
Copyright (c) 2012-2014 Jeremy Latt
Copyright (c) 2014-2015 Edmund Huber
Copyright (c) 2016-2020 Daniel Oaks
Copyright (c) 2017-2020 Shivaram Lingamneni
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

48
Makefile Normal file
View File

@ -0,0 +1,48 @@
GIT_COMMIT := $(shell git rev-parse HEAD 2> /dev/null)
GIT_TAG := $(shell git tag --points-at HEAD 2> /dev/null | head -n 1)
# disable linking against native libc / libpthread by default;
# this can be overridden by passing CGO_ENABLED=1 to make
export CGO_ENABLED ?= 0
capdef_file = ./irc/caps/defs.go
.PHONY: all
all: build
.PHONY: install
install:
go install -v -ldflags "-X main.commit=$(GIT_COMMIT) -X main.version=$(GIT_TAG)"
.PHONY: build
build:
go build -v -ldflags "-X main.commit=$(GIT_COMMIT) -X main.version=$(GIT_TAG)"
.PHONY: release
release:
goreleaser --skip=publish --clean
.PHONY: capdefs
capdefs:
python3 ./gencapdefs.py > ${capdef_file}
.PHONY: test
test:
python3 ./gencapdefs.py | diff - ${capdef_file}
go test ./...
go vet ./...
./.check-gofmt.sh
.PHONY: smoke
smoke: install
ergo mkcerts --conf ./default.yaml || true
ergo run --conf ./default.yaml --smoke
.PHONY: gofmt
gofmt:
./.check-gofmt.sh --fix
.PHONY: irctest
irctest: install
git submodule update --init
cd irctest && make ergo

62
README Normal file
View File

@ -0,0 +1,62 @@
___ _ __ __ _ ___
/ _ \ '__/ _` |/ _ \
| __/ | | (_| | (_) |
\___|_| \__, |\___/
__/ |
|___/
-----------------------------------------------------------------------------------------------
Ergo is a modern IRC server written in Go. Its core design principles are:
* Being simple to set up and use
* Combining the features of an ircd, a services framework, and a bouncer:
* Integrated account management
* History storage
* Bouncer functionality
* Bleeding-edge IRCv3 support
* High customizability via a rehashable (i.e., reloadable at runtime) YAML config
https://ergo.chat/
https://github.com/ergochat/ergo
#ergo on irc.ergo.chat or irc.libera.chat
-----------------------------------------------------------------------------------------------
=== Installing ===
Copy the example config file to ircd.yaml with a command like:
$ cp default.yaml ircd.yaml
Modify the config file as needed (the recommendations at the top may be helpful).
To generate passwords for opers and connect passwords, you can use this command:
$ ./ergo genpasswd
If you need to generate self-signed TLS certificates, use this command:
$ ./ergo mkcerts
You are now ready to start Ergo!
$ ./ergo run
For further instructions, consult the manual. A copy of the manual should be
included in your release under `docs/MANUAL.md`. Or you can view it on the
Web: https://ergo.chat/manual.html
=== Updating ===
If you're updating from a previous version of Ergo, check out the CHANGELOG for a list
of important changes you'll want to take a look at. The change log details config changes,
fixes, new features and anything else you'll want to be aware of!
=== Credits ===
* Jeremy Latt (2012-2014)
* Edmund Huber (2014-2015)
* Daniel Oaks (2016-present)
* Shivaram Lingamneni (2017-present)
* Many other contributors and friends of the project <3

135
README.md
View File

@ -1,68 +1,127 @@
![Oragono logo](docs/logo.png)
![Ergo logo](docs/logo.png)
Oragono is a modern, experimental IRC server written in Go. It's designed to be simple to setup and use, and to provide the majority of features that IRC users expect today.
Ergo (formerly known as Oragono) is a modern IRC server written in Go. Its core design principles are:
It includes features such as UTF-8 nicks and channel names, client accounts and SASL, and other assorted IRCv3 support.
* Being simple to set up and use
* Combining the features of an ircd, a services framework, and a bouncer (integrated account management, history storage, and bouncer functionality)
* Bleeding-edge [IRCv3 support](https://ircv3.net/software/servers.html), suitable for use as an IRCv3 reference implementation
* High customizability via a rehashable (i.e., reloadable at runtime) YAML config
Oragono is a fork of the [Ergonomadic](https://github.com/edmund-huber/ergonomadic) IRC daemon <3
Also see the [mammon](https://github.com/mammon-ircd/mammon) IRC daemon for a similar project written in Python instead.
Ergo is a fork of the [Ergonomadic](https://github.com/jlatt/ergonomadic) IRC daemon <3
---
[![Go Report Card](https://goreportcard.com/badge/github.com/DanielOaks/oragono)](https://goreportcard.com/report/github.com/DanielOaks/oragono)
[![Go Report Card](https://goreportcard.com/badge/github.com/ergochat/ergo)](https://goreportcard.com/report/github.com/ergochat/ergo)
[![build](https://github.com/ergochat/ergo/actions/workflows/build.yml/badge.svg)](https://github.com/ergochat/ergo/actions/workflows/build.yml)
[![Download Latest Release](https://img.shields.io/badge/downloads-latest%20release-green.svg)](https://github.com/ergochat/ergo/releases/latest)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/ergochat/localized.svg)](https://crowdin.com/project/ergochat)
If you want to take a look at a running Ergo instance or test some client code, feel free to play with [testnet.ergo.chat](https://testnet.ergo.chat/) (TLS on port 6697 or plaintext on port 6667).
---
This project adheres to [Semantic Versioning](http://semver.org/). For the purposes of versioning, we consider the "public API" to refer to the configuration files, CLI interface and database format.
## Features
* UTF-8 nick and channel names with rfc7700
* [yaml](http://yaml.org/) configuration
* native TLS/SSL support
* server password (`PASS` command)
* channels with most standard modes
* IRC operators
* integrated services: NickServ for user accounts, ChanServ for channel registration, and HostServ for vanity hosts
* bouncer-like features: storing and replaying history, allowing multiple clients to use the same nickname
* native TLS/SSL support, including support for client certificates
* [IRCv3 support](https://ircv3.net/software/servers.html)
* [yaml](https://yaml.org/) configuration
* updating server config and TLS certificates on-the-fly (rehashing)
* SASL authentication
* [LDAP support](https://github.com/ergochat/ergo-ldap)
* supports [multiple languages](https://crowdin.com/project/ergochat) (you can also set a default language for your network)
* optional support for UTF-8 nick and channel names with RFC 8265 (PRECIS)
* advanced security and privacy features (support for requiring SASL for all logins, cloaking IPs, and running as a Tor hidden service)
* an extensible privilege system for IRC operators
* ident lookups for usernames
* passwords stored in [bcrypt][go-crypto] format
* client accounts and SASL
* IRCv3 support
* automated client connection limits
* passwords stored with [bcrypt](https://godoc.org/golang.org/x/crypto)
* `UBAN`, a unified ban system that can target IPs, networks, masks, and registered accounts (`KLINE` and `DLINE` are also supported)
* a focus on developing with [specifications](https://ergo.chat/specs.html)
## Installation
For more detailed information on Ergo's functionality, see:
* [MANUAL.md, the operator manual](https://github.com/ergochat/ergo/blob/stable/docs/MANUAL.md)
* [USERGUIDE.md, the guide for end users](https://github.com/ergochat/ergo/blob/stable/docs/USERGUIDE.md)
## Quick start guide
Download the latest release from this page: https://github.com/ergochat/ergo/releases/latest
Extract it into a folder, then run the following commands:
```sh
go get
go install
cp oragono.yaml ircd.yaml
cp default.yaml ircd.yaml
vim ircd.yaml # modify the config file to your liking
oragono initdb
oragono mkcerts
./ergo mkcerts
./ergo run # server should be ready to go!
```
**Note:** This installation will give you unsigned certificates only suitable for teting purposes.
For real crets, look into [Let's Encrypt](https://letsencrypt.org/).
**Note:** See the [productionizing guide in our manual](https://github.com/ergochat/ergo/blob/stable/docs/MANUAL.md#productionizing-with-systemd) for recommendations on how to run a production network, including obtaining valid TLS certificates.
### Platform Packages
Some platforms/distros also have Ergo packages maintained for them:
* Arch Linux [AUR](https://aur.archlinux.org/packages/ergochat/) - Maintained by [Jason Papakostas (@vith)](https://github.com/vith).
* [Gentoo Linux](https://packages.gentoo.org/packages/net-irc/ergo) - Maintained by [Sam James (@thesamesam)](https://github.com/thesamesam).
### Using Docker
A Dockerfile and example docker-compose recipe are available in the `distrib/docker` directory. Ergo is automatically published
to the GitHub Container Registry at [ghcr.io/ergochat/ergo](https://ghcr.io/ergochat/ergo). For more information, see the distrib/docker
[README file](https://github.com/ergochat/ergo/blob/master/distrib/docker/README.md).
### From Source
You can also clone this repository and build from source. Typical deployments should use the `stable` branch, which points to the latest stable release. In general, `stable` should coincide with the latest published tag that is not designated as a beta or release candidate (for example, `v2.7.0-rc1` was an unstable release candidate and `v2.7.0` was the corresponding stable release), so you can also identify the latest stable release tag on the [releases page](https://github.com/ergochat/ergo/releases) and build that.
The `master` branch is not recommended for production use since it may contain bugs, and because the forwards compatibility guarantees for the config file and the database that apply to releases do not apply to master. That is to say, running master may result in changes to your database that end up being incompatible with future versions of Ergo.
For information on contributing to Ergo, see [DEVELOPING.md](https://github.com/ergochat/ergo/blob/master/DEVELOPING.md).
#### Building
You'll need an [up-to-date distribution of the Go language for your OS and architecture](https://golang.org/dl/). Once that's installed (check the output of `go version`), just check out your desired branch or tag and run `make`. This will produce an executable binary named `ergo` in the base directory of the project. (Ergo vendors all its dependencies, so you will not need to fetch any dependencies remotely.)
## Configuration
See the example [`oragono.yaml`](oragono.yaml). Passwords are stored using bcrypt. You can generate encrypted password strings for use in the config with the `genpasswd` subcommand.
The default config file [`default.yaml`](default.yaml) helps walk you through what each option means and changes.
You can use the `--conf` parameter when launching Ergo to control where it looks for the config file. For instance: `ergo run --conf /path/to/ircd.yaml`. The configuration file also stores where the log, database, certificate, and other files are opened. Normally, all these files use relative paths, but you can change them to be absolute (such as `/var/log/ircd.log`) when running Ergo as a service.
### Logs
By default, logs go to stderr only. They can be configured to go to a file, or you can use systemd to direct the stderr to the system journal (see the manual for details). The configuration format of logs is designed to be easily pluggable, and is inspired by the logging config provided by InspIRCd.
### Passwords
Passwords (for both `PASS` and oper logins) are stored using bcrypt. To generate encrypted strings for use in the config, use the `genpasswd` subcommand as such:
```sh
oragono genpasswd
ergo genpasswd
```
## Running the server
With this, you receive a blob of text which you can plug into your configuration file.
```sh
oragono run
```
### Nickname and channel registration
## Credits
Ergo relies heavily on user accounts to enable its distinctive features (such as allowing multiple clients per nickname). As a user, you can register your current nickname as an account using `/msg NickServ register <password>`. Once you have done so, you should [enable SASL in your clients](https://libera.chat/guides/sasl), ensuring that you will be automatically logged into your account on each connection. This will prevent [problems claiming your registered nickname](https://github.com/ergochat/ergo/blob/master/docs/MANUAL.md#nick-equals-account).
* Jeremy Latt, creator of Ergonomadic, <https://github.com/jlatt>
* Edmund Huber, maintainer of Ergonomadic, <https://github.com/edmund-huber>
* Niels Freier, added WebSocket support to Ergonomadic, <https://github.com/stumpyfr>
* Daniel Oakley, maintainer of Oragono, <https://github.com/DanielOaks>
* apologies to anyone I forgot.
Once you have registered your nickname, you can use it to register channels:
[go-crypto]: https://godoc.org/golang.org/x/crypto
1. Join the channel with `/join #channel`
2. Register the channel with `/CS REGISTER #channel`
After this, your channel will remember the fact that you're the owner, the topic, and any modes set on it!
# Credits
* Jeremy Latt (2012-2014)
* Edmund Huber (2014-2015)
* Daniel Oaks (2016-present)
* Shivaram Lingamneni (2017-present)
* [Many other contributors and friends of the project <3](https://github.com/ergochat/ergo/blob/master/CHANGELOG.md)

View File

@ -1,54 +0,0 @@
#!/usr/bin/env sh
# release build script
# to be run inside the Oragono dir
## windows ##
rm -rf ./build/win/
mkdir -p ./build/win/docs/
GOOS=windows GOATCH=amd64 go build oragono.go
mv oragono.exe ./build/win/
cp LICENSE ./build/win/
cp oragono.yaml oragono.motd ./build/win
cp ./docs/README ./build/win/
cp ./CHANGELOG.md ./build/win/docs
cp ./docs/logo* ./build/win/docs
pushd ./build/win
zip -r ../oragono-XXX-windows.zip *
popd
## osx ##
rm -rf ./build/osx/
mkdir -p ./build/osx/docs/
GOOS=darwin GOATCH=amd64 go build oragono.go
mv oragono ./build/osx/
cp LICENSE ./build/osx/
cp oragono.yaml oragono.motd ./build/osx
cp ./docs/README ./build/osx/
cp ./CHANGELOG.md ./build/osx/docs
cp ./docs/logo* ./build/osx/docs
pushd ./build/osx
tar -czvf ../oragono-XXX-osx.tgz *
popd
## linux ##
rm -rf ./build/linux
mkdir -p ./build/linux/docs/
GOOS=linux GOATCH=amd64 go build oragono.go
mv oragono ./build/linux/
cp LICENSE ./build/linux/
cp oragono.yaml oragono.motd ./build/linux
cp ./docs/README ./build/linux/
cp ./CHANGELOG.md ./build/linux/docs
cp ./docs/logo* ./build/linux/docs
pushd ./build/linux
tar -czvf ../oragono-XXX-linux.tgz *
popd

53
crowdin.yml Normal file
View File

@ -0,0 +1,53 @@
#
# Your crowdin's credentials
#
"project_identifier" : "oragono"
# "api_key" : ""
# "base_path" : ""
#"base_url" : ""
#
# Choose file structure in crowdin
# e.g. true or false
#
"preserve_hierarchy": true
#
# Files configuration
#
files: [
{
"source" : "/languages/example/translation.lang.yaml",
"translation" : "/languages/%locale%.lang.yaml",
"dest" : "translation.lang.yaml"
},
{
"source" : "/languages/example/irc.lang.json",
"translation" : "/languages/%locale%-irc.lang.json",
"dest" : "irc.lang.json"
},
{
"source" : "/languages/example/help.lang.json",
"translation" : "/languages/%locale%-help.lang.json",
"dest" : "help.lang.json",
"update_option" : "update_as_unapproved",
},
{
"source" : "/languages/example/chanserv.lang.json",
"translation" : "/languages/%locale%-chanserv.lang.json",
"dest" : "services/chanserv.lang.json",
"update_option" : "update_as_unapproved",
},
{
"source" : "/languages/example/nickserv.lang.json",
"translation" : "/languages/%locale%-nickserv.lang.json",
"dest" : "services/nickserv.lang.json",
"update_option" : "update_as_unapproved",
},
{
"source" : "/languages/example/hostserv.lang.json",
"translation" : "/languages/%locale%-hostserv.lang.json",
"dest" : "services/hostserv.lang.json",
"update_option" : "update_as_unapproved",
},
]

1137
default.yaml Normal file

File diff suppressed because it is too large Load Diff

26
distrib/SMF/README Normal file
View File

@ -0,0 +1,26 @@
Created 22/11/2021 by georg@lysergic.dev.
This directory contains Service Management Facility service files for ergo.
These files should be compatible with current OpenSolaris / Illumos based operating systems. Tested on OpenIndiana.
Prerequesites:
- ergo binary located at /opt/ergo/ergo
- ergo configuration located at /opt/ergo/ircd.yaml (hardcoded)
- ergo languages located at /opt/ergo/languages (to be compatible with default.yaml - you may adjust this path or disable languages in your custom ircd.yaml)
- ergo certificate and key located at /opt/ergo/fullchain.pem /opt/ergo/privkey.pem (to be compatible with default.yaml - you may adjust these paths in your custom ircd.yaml)
- `ergo` role user and `ergo` role group owning all of the above
Installation:
- cp ergo.xml /lib/svc/manifest/network/
- cp ergo /lib/svc/method/
- svcadm restart manifest-import
Usage:
- svcadm enable ergo (Start)
- tail /var/svc/log/network-ergo:default.log (Check ergo log and SMF output)
- svcs ergo (Check status)
- svcadm refresh ergo (Reload manifest and ergo configuration)
- svcadm disable ergo (Stop)
Notes:
- Does not support multiple instances - spawns instance :default

26
distrib/SMF/ergo Executable file
View File

@ -0,0 +1,26 @@
#!/sbin/sh
#
# SMF method script for ergo - used by manifest file ergo.xml
# Created 22/11/2021 by georg@lysergic.dev
. /lib/svc/share/smf_include.sh
case $1 in
'start')
exec /opt/ergo/ergo run --conf /opt/ergo/ircd.yaml
;;
'refresh' )
exec pkill -1 -U ergo -x ergo
;;
'stop' )
exec pkill -U ergo -x ergo
;;
*)
echo "Usage: $0 { start | refresh | stop }"
exit 1
;;
esac
exit $?

48
distrib/SMF/ergo.xml Normal file
View File

@ -0,0 +1,48 @@
<?xml version='1.0'?>
<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='ergo'>
<service name='network/ergo' type='service' version='0'>
<create_default_instance enabled="true"/>
<single_instance/>
<dependency name='fs-local' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/system/filesystem/local'/>
</dependency>
<dependency name='fs-autofs' grouping='optional_all' restart_on='none' type='service'>
<service_fmri value='svc:/system/filesystem/autofs'/>
</dependency>
<dependency name='net-loopback' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/network/loopback'/>
</dependency>
<dependency name='net-physical' grouping='require_all' restart_on='none' type='service'>
<service_fmri value='svc:/network/physical'/>
</dependency>
<dependency name='config_data' grouping='require_all' restart_on='restart' type='path'>
<service_fmri value='file://localhost/opt/ergo/ircd.yaml'/>
</dependency>
<method_context working_directory="/opt/ergo">
<method_credential user='ergo' group='ergo' />
</method_context>
<exec_method name='start' type='method' exec='/lib/svc/method/ergo start' timeout_seconds='20'>
<method_context security_flags='aslr'/>
</exec_method>
<exec_method name='stop' type='method' exec='/lib/svc/method/ergo stop' timeout_seconds='20'/>
<exec_method name='refresh' type='method' exec='/lib/svc/method/ergo refresh' timeout_seconds='20'/>
<property_group name='general' type='framework'>
<propval name='action_authorization' type='astring' value='solaris.smf.manage.ergo'/>
</property_group>
<property_group name='startd' type='framework'>
<propval name='ignore_error' type='astring' value='core,signal'/>
<propval name='duration' type='astring' value='child'/>
</property_group>
<stability value='Unstable'/>
<template>
<common_name>
<loctext xml:lang='C'>IRC server</loctext>
</common_name>
<documentation>
<doc_link name='ergo-manual' uri='https://github.com/ergochat/ergo/blob/master/docs/MANUAL.md'/>
<doc_link name='ergo-userguide' uri='https://github.com/ergochat/ergo/blob/master/docs/USERGUIDE.md'/>
</documentation>
</template>
</service>
</service_bundle>

206
distrib/anope/anope2json.py Executable file
View File

@ -0,0 +1,206 @@
#!/usr/bin/python3
import binascii
import json
import logging
import re
import sys
from collections import defaultdict, namedtuple
AnopeObject = namedtuple('AnopeObject', ('type', 'kv'))
MASK_MAGIC_REGEX = re.compile(r'[*?!@]')
def access_level_to_amode(level):
# https://wiki.anope.org/index.php/2.0/Modules/cs_xop
if level == 'QOP':
return 'q'
elif level == 'SOP':
return 'a'
elif level == 'AOP':
return 'o'
elif level == 'HOP':
return 'h'
elif level == 'VOP':
return 'v'
try:
level = int(level)
except:
return None
if level >= 10000:
return 'q'
elif level >= 9999:
return 'a'
elif level >= 5:
return 'o'
elif level >= 4:
return 'h'
elif level >= 3:
return 'v'
else:
return None
def to_unixnano(timestamp):
return int(timestamp) * (10**9)
def file_to_objects(infile):
result = []
obj = None
while True:
line = infile.readline()
if not line:
break
line = line.rstrip(b'\r\n')
try:
line = line.decode('utf-8')
except UnicodeDecodeError:
line = line.decode('utf-8', 'replace')
logging.warning("line contained invalid utf8 data " + line)
pieces = line.split(' ', maxsplit=2)
if len(pieces) == 0:
logging.warning("skipping blank line in db")
continue
if pieces[0] == 'END':
result.append(obj)
obj = None
elif pieces[0] == 'OBJECT':
obj = AnopeObject(pieces[1], {})
elif pieces[0] == 'DATA':
obj.kv[pieces[1]] = pieces[2]
elif pieces[0] == 'ID':
# not sure what these do?
continue
else:
raise ValueError("unknown command found in anope db", pieces[0])
return result
ANOPE_MODENAME_TO_MODE = {
'NOEXTERNAL': 'n',
'TOPIC': 't',
'INVITE': 'i',
'NOCTCP': 'C',
'AUDITORIUM': 'u',
'SECRET': 's',
}
# verify that a certfp appears to be a hex-encoded SHA-256 fingerprint;
# if it's anything else, silently ignore it
def validate_certfps(certobj):
certfps = []
for fingerprint in certobj.split():
try:
dec = binascii.unhexlify(fingerprint)
except:
continue
if len(dec) == 32:
certfps.append(fingerprint)
return certfps
def convert(infile):
out = {
'version': 1,
'source': 'anope',
'users': defaultdict(dict),
'channels': defaultdict(dict),
}
objects = file_to_objects(infile)
lastmode_channels = set()
for obj in objects:
if obj.type == 'NickCore':
username = obj.kv['display']
userdata = {'name': username, 'hash': obj.kv['pass'], 'email': obj.kv['email']}
certobj = obj.kv.get('cert')
if certobj:
userdata['certfps'] = validate_certfps(certobj)
out['users'][username] = userdata
elif obj.type == 'NickAlias':
username = obj.kv['nc']
nick = obj.kv['nick']
userdata = out['users'][username]
if username.lower() == nick.lower():
userdata['registeredAt'] = to_unixnano(obj.kv['time_registered'])
else:
if 'additionalNicks' not in userdata:
userdata['additionalNicks'] = []
userdata['additionalNicks'].append(nick)
elif obj.type == 'ChannelInfo':
chname = obj.kv['name']
founder = obj.kv['founder']
chdata = {
'name': chname,
'founder': founder,
'registeredAt': to_unixnano(obj.kv['time_registered']),
'topic': obj.kv['last_topic'],
'topicSetBy': obj.kv['last_topic_setter'],
'topicSetAt': to_unixnano(obj.kv['last_topic_time']),
'amode': {founder: 'q',}
}
# DATA last_modes INVITE KEY,hunter2 NOEXTERNAL REGISTERED TOPIC
last_modes = obj.kv.get('last_modes')
if last_modes:
modes = []
for mode_desc in last_modes.split():
if ',' in mode_desc:
mode_name, mode_value = mode_desc.split(',', maxsplit=1)
else:
mode_name, mode_value = mode_desc, None
if mode_name == 'KEY':
chdata['key'] = mode_value
else:
modes.append(ANOPE_MODENAME_TO_MODE.get(mode_name, ''))
chdata['modes'] = ''.join(modes)
# prevent subsequent ModeLock objects from modifying the mode list further:
lastmode_channels.add(chname)
out['channels'][chname] = chdata
elif obj.type == 'ModeLock':
if obj.kv.get('set') != '1':
continue
chname = obj.kv['ci']
if chname in lastmode_channels:
continue
chdata = out['channels'][chname]
modename = obj.kv['name']
if modename == 'KEY':
chdata['key'] = obj.kv['param']
else:
oragono_mode = ANOPE_MODENAME_TO_MODE.get(modename)
if oragono_mode is not None:
stored_modes = chdata.get('modes', '')
stored_modes += oragono_mode
chdata['modes'] = stored_modes
elif obj.type == 'ChanAccess':
chname = obj.kv['ci']
target = obj.kv['mask']
mode = access_level_to_amode(obj.kv['data'])
if mode is None:
continue
if MASK_MAGIC_REGEX.search(target):
continue
chdata = out['channels'][chname]
amode = chdata.setdefault('amode', {})
amode[target] = mode
chdata['amode'] = amode
# do some basic integrity checks
for chname, chdata in out['channels'].items():
founder = chdata.get('founder')
if founder not in out['users']:
raise ValueError("no user corresponding to channel founder", chname, chdata.get('founder'))
return out
def main():
if len(sys.argv) != 3:
raise Exception("Usage: anope2json.py anope.db output.json")
with open(sys.argv[1], 'rb') as infile:
output = convert(infile)
with open(sys.argv[2], 'w') as outfile:
json.dump(output, outfile)
if __name__ == '__main__':
logging.basicConfig()
sys.exit(main())

34
distrib/apparmor/ergo Normal file
View File

@ -0,0 +1,34 @@
include <tunables/global>
# Georg Pfuetzenreuter <georg+ergo@lysergic.dev>
# AppArmor confinement for ergo and ergo-ldap
profile ergo /usr/bin/ergo {
include <abstractions/base>
include <abstractions/consoles>
include <abstractions/nameservice>
/etc/ergo/ircd.{motd,yaml} r,
/etc/ssl/irc/{crt,key} r,
/etc/ssl/ergo/{crt,key} r,
/usr/bin/ergo mr,
/proc/sys/net/core/somaxconn r,
/sys/kernel/mm/transparent_hugepage/hpage_pmd_size r,
/usr/share/ergo/languages/{,*.lang.json,*.yaml} r,
owner /run/ergo/ircd.lock rwk,
owner /var/lib/ergo/ircd.db rw,
include if exists <local/ergo>
}
profile ergo-ldap /usr/bin/ergo-ldap {
include <abstractions/openssl>
include <abstractions/ssl_certs>
/usr/bin/ergo-ldap rm,
/etc/ergo/ldap.yaml r,
include if exists <local/ergo-ldap>
}

209
distrib/atheme/atheme2json.py Executable file
View File

@ -0,0 +1,209 @@
#!/usr/bin/python3
import binascii
import json
import logging
import re
import sys
from collections import defaultdict
MASK_MAGIC_REGEX = re.compile(r'[*?!@$]')
def to_unixnano(timestamp):
return int(timestamp) * (10**9)
# include/atheme/channels.h
CMODE_FLAG_TO_MODE = {
0x001: 'i', # CMODE_INVITE
0x010: 'n', # CMODE_NOEXT
0x080: 's', # CMODE_SEC
0x100: 't', # CMODE_TOPIC
}
# attempt to interpret certfp as a hex-encoded SHA-256 fingerprint
def validate_certfp(certfp):
try:
dec = binascii.unhexlify(certfp)
except:
return False
return len(dec) == 32
def convert(infile):
out = {
'version': 1,
'source': 'atheme',
'users': defaultdict(dict),
'channels': defaultdict(dict),
}
group_to_founders = defaultdict(list)
channel_to_founder = defaultdict(lambda: (None, None))
while True:
line = infile.readline()
if not line:
break
line = line.rstrip(b'\r\n')
try:
line = line.decode('utf-8')
except UnicodeDecodeError:
line = line.decode('utf-8', 'replace')
logging.warning("line contained invalid utf8 data " + line)
parts = line.split(' ')
category = parts[0]
if category == 'GACL':
# Note: all group definitions precede channel access entries (token CA) by design, so it
# should be safe to read this in using one pass.
groupname = parts[1]
user = parts[2]
flags = parts[3]
if 'F' in flags:
group_to_founders[groupname].append(user)
elif category == 'MU':
# user account
# MU AAAAAAAAB shivaram $1$hcspif$nCm4r3S14Me9ifsOPGuJT. user@example.com 1600134392 1600467343 +sC default
name = parts[2]
user = {'name': name, 'hash': parts[3], 'email': parts[4], 'registeredAt': to_unixnano(parts[5])}
out['users'][name].update(user)
pass
elif category == 'MN':
# grouped nick
# MN shivaram slingamn 1600218831 1600467343
username, groupednick = parts[1], parts[2]
if username != groupednick:
user = out['users'][username]
user.setdefault('additionalnicks', []).append(groupednick)
elif category == 'MDU':
if parts[2] == 'private:usercloak':
username = parts[1]
out['users'][username]['vhost'] = parts[3]
elif category == 'MCFP':
username, certfp = parts[1], parts[2]
if validate_certfp(certfp):
user = out['users'][username]
user.setdefault('certfps', []).append(certfp.lower())
elif category == 'MC':
# channel registration
# MC #mychannel 1600134478 1600467343 +v 272 0 0
# MC #NEWCHANNELTEST 1602270889 1602270974 +vg 1 0 0 jaeger4
chname = parts[1]
chdata = out['channels'][chname]
# XXX just give everyone +nt, regardless of lock status; they can fix it later
chdata.update({'name': chname, 'registeredAt': to_unixnano(parts[2])})
if parts[8] != '':
chdata['key'] = parts[8]
modes = {'n', 't'}
mlock_on, mlock_off = int(parts[5]), int(parts[6])
for flag, mode in CMODE_FLAG_TO_MODE.items():
if flag & mlock_on != 0:
modes.add(mode)
elif flag & mlock_off != 0 and mode in modes:
modes.remove(mode)
chdata['modes'] = ''.join(sorted(modes))
chdata['limit'] = int(parts[7])
elif category == 'MDC':
# auxiliary data for a channel registration
# MDC #mychannel private:topic:setter s
# MDC #mychannel private:topic:text hi again
# MDC #mychannel private:topic:ts 1600135864
chname = parts[1]
category = parts[2]
if category == 'private:topic:text':
out['channels'][chname]['topic'] = line.split(maxsplit=3)[3]
elif category == 'private:topic:setter':
out['channels'][chname]['topicSetBy'] = parts[3]
elif category == 'private:topic:ts':
out['channels'][chname]['topicSetAt'] = to_unixnano(parts[3])
elif category == 'private:mlockext':
# the channel forward mode is +L on insp/unreal, +f on charybdis
# charybdis has a +L ("large banlist") taking no argument
# and unreal has a +f ("flood limit") taking two colon-delimited numbers,
# so check for an argument that starts with a #
if parts[3].startswith('L#') or parts[3].startswith('f#'):
out['channels'][chname]['forward'] = parts[3][1:]
elif category == 'CA':
# channel access lists
# CA #mychannel shivaram +AFORafhioqrstv 1600134478 shivaram
chname, username, flags, set_at = parts[1], parts[2], parts[3], int(parts[4])
chname = parts[1]
chdata = out['channels'][chname]
flags = parts[3]
set_at = int(parts[4])
if 'amode' not in chdata:
chdata['amode'] = {}
# see libathemecore/flags.c: +o is op, +O is autoop, etc.
if 'F' in flags:
# If the username starts with "!", it's actually a GroupServ group.
if username.startswith('!'):
group_founders = group_to_founders.get(username)
if not group_founders:
# skip this and warn about it later
continue
# attempt to promote the first group founder to channel founder
username = group_founders[0]
# but everyone gets the +q flag
for founder in group_founders:
chdata['amode'][founder] = 'q'
# there can only be one founder
preexisting_founder, preexisting_set_at = channel_to_founder[chname]
if preexisting_founder is None or set_at < preexisting_set_at:
chdata['founder'] = username
channel_to_founder[chname] = (username, set_at)
# but multiple people can receive the 'q' amode
chdata['amode'][username] = 'q'
continue
if MASK_MAGIC_REGEX.search(username):
# ignore groups, masks, etc. for any field other than founder
continue
# record the first appearing successor, if necessary
if 'S' in flags:
if not chdata.get('successor'):
chdata['successor'] = username
# finally, handle amodes
if 'q' in flags:
chdata['amode'][username] = 'q'
elif 'a' in flags:
chdata['amode'][username] = 'a'
elif 'o' in flags or 'O' in flags:
chdata['amode'][username] = 'o'
elif 'h' in flags or 'H' in flags:
chdata['amode'][username] = 'h'
elif 'v' in flags or 'V' in flags:
chdata['amode'][username] = 'v'
else:
pass
# do some basic integrity checks
def validate_user(name):
if not name:
return False
return bool(out['users'].get(name))
invalid_channels = []
for chname, chdata in out['channels'].items():
if not validate_user(chdata.get('founder')):
if validate_user(chdata.get('successor')):
chdata['founder'] = chdata['successor']
else:
invalid_channels.append(chname)
for chname in invalid_channels:
logging.warning("Unable to find a valid founder for channel %s, discarding it", chname)
del out['channels'][chname]
return out
def main():
if len(sys.argv) != 3:
raise Exception("Usage: atheme2json.py atheme_db output.json")
with open(sys.argv[1], 'rb') as infile:
output = convert(infile)
with open(sys.argv[2], 'w') as outfile:
json.dump(output, outfile)
if __name__ == '__main__':
logging.basicConfig()
sys.exit(main())

29
distrib/bsd-rc/README.md Normal file
View File

@ -0,0 +1,29 @@
Ergo init script for bsd-rc
===
Written for and tested using FreeBSD.
## Installation
Copy the `ergo` file from this folder to `/etc/rc.d/ergo`,
permissions should be `555`.
You should create a system user for Ergo.
This script defaults to running Ergo as a user named `ergo`,
but that can be changed using `/etc/rc.conf`.
Here are all `rc.conf` variables and their defaults:
- `ergo_enable`, defaults to `NO`. Whether to run `ergo` at system start.
- `ergo_user`, defaults to `ergo`. Run using this user.
- `ergo_group`, defaults to `ergo`. Run using this group.
- `ergo_chdir`, defaults to `/var/db/ergo`. Path to the working directory for the server. Should be writable for `ergo_user`.
- `ergo_conf`, defaults to `/usr/local/etc/ergo/ircd.yaml`. Config file path. Make sure `ergo_user` can read it.
This script assumes ergo to be installed at `/usr/local/bin/ergo`.
## Usage
```shell
/etc/rc.d/ergo <command>
```
In addition to the obvious `start` and `stop` commands, this
script also has a `reload` command that sends `SIGHUP` to the Ergo process.

45
distrib/bsd-rc/ergo Normal file
View File

@ -0,0 +1,45 @@
#!/bin/sh
# PROVIDE: ergo
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable Ergo
#
# ergo_enable (bool): Set to YES to enable ergo.
# Default is "NO".
# ergo_user (user): Set user to run ergo.
# Default is "ergo".
# ergo_group (group): Set group to run ergo.
# Default is "ergo".
# ergo_config (file): Set ergo config file path.
# Default is "/usr/local/etc/ergo/config.yaml".
# ergo_chdir (dir): Set ergo working directory
# Default is "/var/db/ergo".
. /etc/rc.subr
name=ergo
rcvar=ergo_enable
desc="Ergo IRCv3 server"
load_rc_config "$name"
: ${ergo_enable:=NO}
: ${ergo_user:=ergo}
: ${ergo_group:=ergo}
: ${ergo_chdir:=/var/db/ergo}
: ${ergo_conf:=/usr/local/etc/ergo/ircd.yaml}
# If you don't define a custom reload function,
# rc automagically sends SIGHUP to the process on reload.
# But you have to list reload as an extra_command for that.
extra_commands="reload"
procname="/usr/local/bin/${name}"
command=/usr/sbin/daemon
command_args="-S -T ${name} ${procname} run --conf ${ergo_conf}"
run_rc_command "$1"

113
distrib/docker/README.md Normal file
View File

@ -0,0 +1,113 @@
# Ergo Docker
This folder holds Ergo's Docker compose file. The Dockerfile is in the root
directory. Ergo is published automatically to the GitHub Container Registry at
[ghcr.io/ergochat/ergo](https://ghcr.io/ergochat/ergo).
Most users should use either the `stable` tag (corresponding to the
`stable` branch in git, which tracks the latest stable release), or
a tag corresponding to a tagged version (e.g. `v2.8.0`). The `master`
tag corresponds to the `master` branch, which is not recommended for
production use. The `latest` tag is not recommended.
## Quick start
The Ergo docker image is designed to work out of the box - it comes with a
usable default config and will automatically generate self-signed TLS
certificates. To get a working ircd, all you need to do is run the image and
expose the ports:
```shell
docker run --init --name ergo -d -p 6667:6667 -p 6697:6697 ghcr.io/ergochat/ergo:stable
```
This will start Ergo and listen on ports 6667 (plain text) and 6697 (TLS).
The first time Ergo runs it will create a config file with a randomised
oper password. This is output to stdout, and you can view it with the docker
logs command:
```shell
# Assuming your container is named `ergo`; use `docker container ls` to
# find the name if you're not sure.
docker logs ergo
```
You should see a line similar to:
```
Oper username:password is admin:cnn2tm9TP3GeI4vLaEMS
```
We recommend the use of `--init` (`init: true` in docker-compose) to solve an
edge case involving unreaped zombie processes when Ergo's script API is used
for authentication or IP validation. For more details, see
[krallin/tini#8](https://github.com/krallin/tini/issues/8).
## Persisting data
Ergo has a persistent data store, used to keep account details, channel
registrations, and so on. To persist this data across restarts, you can mount
a volume at /ircd.
For example, to create a new docker volume and then mount it:
```shell
docker volume create ergo-data
docker run --init --name ergo -d -v ergo-data:/ircd -p 6667:6667 -p 6697:6697 ghcr.io/ergochat/ergo:stable
```
Or to mount a folder from your host machine:
```shell
mkdir ergo-data
docker run --init --name ergo -d -v $(pwd)/ergo-data:/ircd -p 6667:6667 -p 6697:6697 ghcr.io/ergochat/ergo:stable
```
## Customising the config
Ergo's config file is stored at /ircd/ircd.yaml. If the file does not
exist, the default config will be written out. You can copy the config from
the container, edit it, and then copy it back:
```shell
# Assuming that your container is named `ergo`, as above.
docker cp ergo:/ircd/ircd.yaml .
vim ircd.yaml # edit the config to your liking
docker cp ircd.yaml ergo:/ircd/ircd.yaml
```
You can use the `/rehash` command to make Ergo reload its config, or
send it the HUP signal:
```shell
docker kill -s SIGHUP ergo
```
## Using custom TLS certificates
TLS certs will by default be read from /ircd/fullchain.pem, with a private key
in /ircd/privkey.pem. You can customise this path in the ircd.yaml file if
you wish to mount the certificates from another volume. For information
on using Let's Encrypt certificates, see
[this manual entry](https://github.com/ergochat/ergo/blob/master/docs/MANUAL.md#using-valid-tls-certificates).
## Using docker-compose
This folder contains a sample docker-compose file which can be used
to start an Ergo instance with ports exposed and data persisted in
a docker volume. Simply download the file and then bring it up:
```shell
curl -O https://raw.githubusercontent.com/ergochat/ergo/master/distrib/docker/docker-compose.yml
docker-compose up -d
```
## Building
If you wish to manually build the docker image, you need to do so from
the root of the Ergo repository (not the `distrib/docker` directory):
```shell
docker build .
```

View File

@ -0,0 +1,21 @@
version: "3.8"
services:
ergo:
init: true
image: ghcr.io/ergochat/ergo:stable
ports:
- "6667:6667/tcp"
- "6697:6697/tcp"
volumes:
- data:/ircd
deploy:
placement:
constraints:
- "node.role == manager"
restart_policy:
condition: on-failure
replicas: 1
volumes:
data:

26
distrib/docker/run.sh Executable file
View File

@ -0,0 +1,26 @@
#!/bin/sh
# make config file
if [ ! -f "/ircd/ircd.yaml" ]; then
awk '{gsub(/path: languages/,"path: /ircd-bin/languages")}1' /ircd-bin/default.yaml > /tmp/ircd.yaml
# change default oper passwd
OPERPASS=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c20)
echo "Oper username:password is admin:$OPERPASS"
ENCRYPTEDPASS=$(echo "$OPERPASS" | /ircd-bin/ergo genpasswd)
ORIGINALPASS='\$2a\$04\$0123456789abcdef0123456789abcdef0123456789abcdef01234'
awk "{gsub(/password: \\\"$ORIGINALPASS\\\"/,\"password: \\\"$ENCRYPTEDPASS\\\"\")}1" /tmp/ircd.yaml > /tmp/ircd2.yaml
unset OPERPASS
unset ENCRYPTEDPASS
unset ORIGINALPASS
mv /tmp/ircd2.yaml /ircd/ircd.yaml
fi
# make self-signed certs if they don't already exist
/ircd-bin/ergo mkcerts
# run!
exec /ircd-bin/ergo run

57
distrib/init/rc.ergo Normal file
View File

@ -0,0 +1,57 @@
#!/bin/sh
# Init script for the ergo IRCd
# Created 14/06/2021 by georg@lysergic.dev
# Desgigned for and tested on Slackware -current
# Depends on `daemon` (installable using slackpkg)
# In its stock configuration ergo will be jailed to /opt/ergo - all paths are relative from there. Consider this in your ergo configuration file (i.e. certificate, database and log locations)
NAME=ergo
DIR=/opt/ergo
ERGO=/ergo
DAEMONIZER=/usr/bin/daemon
CONFIG=ircd.yaml
USER=ergo
GROUP=ergo
daemon_start() {
$DAEMONIZER -n $NAME -v -- chroot --userspec=$USER --groups=$USER -- $DIR $ERGO run --conf $CONFIG
}
daemon_stop() {
$DAEMONIZER --stop -n $NAME -v
}
daemon_restart() {
$DAEMONIZER --restart -n $NAME -v
}
daemon_reload() {
$DAEMONIZER --signal=SIGHUP -n $NAME -v
}
daemon_status() {
$DAEMONIZER --running -n $NAME -v
}
case "$1" in
start)
daemon_start
;;
stop)
daemon_stop
;;
restart)
daemon_restart
;;
reload)
daemon_reload
;;
status)
daemon_status
;;
*)
echo "Source: https://github.com/ergochat/ergo"
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac

View File

@ -0,0 +1,3 @@
# /etc/conf.d/ergo: config file for /etc/init.d/ergo
ERGO_CONFIGFILE="/etc/ergo/ircd.yaml"
ERGO_USERNAME="ergo"

32
distrib/openrc/ergo.initd Normal file
View File

@ -0,0 +1,32 @@
#!/sbin/openrc-run
name=${RC_SVCNAME}
description="ergo IRC daemon"
command=/usr/bin/ergo
command_args="run --conf ${ERGO_CONFIGFILE:-'/etc/ergo/ircd.yaml'}"
command_user=${ERGO_USERNAME:-ergo}
command_background=true
pidfile=/var/run/${RC_SVCNAME}.pid
output_log="/var/log/${RC_SVCNAME}.out"
error_log="/var/log/${RC_SVCNAME}.err"
# --wait: to wait 1 second after launching to see if it survived startup
start_stop_daemon_args="--wait 1000"
extra_started_commands="reload"
depend() {
use dns
provide ircd
}
start_pre() {
checkpath --owner ${command_user}:${command_user} --mode 0640 --file /var/log/${RC_SVCNAME}.out /var/log/${RC_SVCNAME}.err
}
reload() {
ebegin "Reloading ${RC_SVCNAME}"
start-stop-daemon --signal HUP --pidfile "${pidfile}"
eend $?
}

8
distrib/s6/README Normal file
View File

@ -0,0 +1,8 @@
This directory contains s6 srv and log services for ergo.
These services expect that ergo is installed to /opt/ergo,
and an ergo system user that owns /opt/ergo.
To install:
cp -r ergo-srv ergo-log /etc/s6/sv/
cp ergo.conf /etc/s6/config/

View File

@ -0,0 +1 @@
ergo-srv

View File

@ -0,0 +1 @@
3

View File

@ -0,0 +1 @@
ergo

9
distrib/s6/ergo-log/run Normal file
View File

@ -0,0 +1,9 @@
#!/usr/bin/execlineb -P
envfile /etc/s6/config/ergo.conf
importas -sCiu DIRECTIVES DIRECTIVES
ifelse { test -w /var/log } {
foreground { install -d -o s6log -g s6log /var/log/ergo }
s6-setuidgid s6log exec -c s6-log -d3 -b -- ${DIRECTIVES} /var/log/ergo
}
foreground { install -d -o s6log -g s6log /run/log/ergo }
s6-setuidgid s6log exec -c s6-log -d3 -b -- ${DIRECTIVES} /run/log/ergo

1
distrib/s6/ergo-log/type Normal file
View File

@ -0,0 +1 @@
longrun

View File

@ -0,0 +1 @@
ergo-log

4
distrib/s6/ergo-srv/run Normal file
View File

@ -0,0 +1,4 @@
#!/usr/bin/execlineb -P
fdmove -c 2 1
execline-cd /opt/ergo
s6-setuidgid ergo ./ergo run

1
distrib/s6/ergo-srv/type Normal file
View File

@ -0,0 +1 @@
longrun

2
distrib/s6/ergo.conf Normal file
View File

@ -0,0 +1,2 @@
# This configures the directives used for s6-log in the log service.
DIRECTIVES="n3 s2000000"

View File

@ -0,0 +1,23 @@
[Unit]
Description=ergo
After=network.target
# If you are using MySQL for history storage, comment out the above line
# and uncomment these two instead (you must independently install and configure
# MySQL for your system):
# Wants=mysql.service
# After=network.target mysql.service
[Service]
Type=notify
User=ergo
WorkingDirectory=/home/ergo
ExecStart=/home/ergo/ergo run --conf /home/ergo/ircd.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=1048576
NotifyAccess=main
# Uncomment this for a hidden service:
# PrivateNetwork=true
[Install]
WantedBy=multi-user.target

124
docs/API.md Normal file
View File

@ -0,0 +1,124 @@
__ __ ______ ___ ______ ___
__/ // /_/ ____/ __ \/ ____/ __ \
/_ // __/ __/ / /_/ / / __/ / / /
/_ // __/ /___/ _, _/ /_/ / /_/ /
/_//_/ /_____/_/ |_|\____/\____/
Ergo IRCd API Documentation
https://ergo.chat/
_Copyright © Daniel Oaks <daniel@danieloaks.net>, Shivaram Lingamneni <slingamn@cs.stanford.edu>_
--------------------------------------------------------------------------------------------
Ergo has an experimental HTTP API. Some general information about the API:
1. All requests to the API are via POST.
1. All requests to the API are authenticated via bearer authentication. This is a header named `Authorization` with the value `Bearer <token>`. A list of valid tokens is hardcoded in the Ergo config. Future versions of Ergo may allow additional validation schemes for tokens.
1. The request parameters are sent as JSON in the POST body.
1. Any status code other than 200 is an error response; the response body is undefined in this case (likely human-readable text for debugging).
1. A 200 status code indicates successful execution of the request. The response body will be JSON and may indicate application-level success or failure (typically via the `success` field, which takes a boolean value).
API endpoints are versioned (currently all endpoints have a `/v1/` path prefix). Backwards-incompatible updates will most likely take the form of endpoints with new names, or an increased version prefix. Any exceptions to this will be specifically documented in the changelog.
All API endpoints should be considered highly privileged. Bearer tokens should be kept secret. Access to the API should be either over a trusted link (like loopback) or secured via verified TLS. See the `api` section of `default.yaml` for examples of how to configure this.
Here's an example of how to test an API configured to run over loopback TCP in plaintext:
```bash
curl -d '{"accountName": "invalidaccountname", "passphrase": "invalidpassphrase"}' -H 'Authorization: Bearer EYBbXVilnumTtfn4A9HE8_TiKLGWEGylre7FG6gEww0' -v http://127.0.0.1:8089/v1/check_auth
```
This returns:
```json
{"success":false}
```
Endpoints
=========
`/v1/account_details`
----------------
This endpoint fetches account details and returns them as JSON. The request is a JSON object with fields:
* `accountName`: string, name of the account
The response is a JSON object with fields:
* `success`: whether the account exists or not
* `accountName`: canonical, case-unfolded version of the account name
* `email`: email address of the account provided
* `registeredAt`: string, registration date/time of the account (in ISO8601 format)
* `channels`: array of strings, list of channels the account is registered on or associated with
`/v1/check_auth`
----------------
This endpoint verifies the credentials of a NickServ account; this allows Ergo to be used as the source of truth for authentication by another system. The request is a JSON object with fields:
* `accountName`: string, name of the account
* `passphrase`: string, alleged passphrase of the account
The response is a JSON object with fields:
* `success`: whether the credentials provided were valid
* `accountName`: canonical, case-unfolded version of the account name
`/v1/rehash`
------------
This endpoint rehashes the server (i.e. reloads the configuration file, TLS certificates, and other associated data). The body is ignored. The response is a JSON object with fields:
* `success`: boolean, indicates whether the rehash was successful
* `error`: string, optional, human-readable description of the failure
`/v1/saregister`
----------------
This endpoint registers an account in NickServ, with the same semantics as `NS SAREGISTER`. The request is a JSON object with fields:
* `accountName`: string, name of the account
* `passphrase`: string, passphrase of the account
The response is a JSON object with fields:
* `success`: whether the account creation succeeded
* `errorCode`: string, optional, machine-readable description of the error. Possible values include: `ACCOUNT_EXISTS`, `INVALID_PASSPHRASE`, `UNKNOWN_ERROR`.
* `error`: string, optional, human-readable description of the failure.
`/v1/account_list`
-------------------
This endpoint fetches a list of all accounts. The request body is ignored and can be empty.
The response is a JSON object with fields:
* `success`: whether the request succeeded
* `accounts`: array of objects, each with fields:
* `success`: boolean, whether this individual account query succeeded
* `accountName`: string, canonical, case-unfolded version of the account name
* `totalCount`: integer, total number of accounts returned
`/v1/status`
-------------
This endpoint returns status information about the running Ergo server. The request body is ignored and can be empty.
The response is a JSON object with fields:
* `success`: whether the request succeeded
* `version`: string, Ergo server version string
* `go_version`: string, version of Go runtime used
* `start_time`: string, server start time in ISO8601 format
* `users`: object with fields:
* `total`: total number of users connected
* `invisible`: number of invisible users
* `operators`: number of operators connected
* `unknown`: number of users with unknown status
* `max`: maximum number of users seen connected at once
* `channels`: integer, number of channels currently active
* `servers`: integer, number of servers connected in the network

1242
docs/MANUAL.md Normal file

File diff suppressed because it is too large Load Diff

60
docs/MOTDFORMATTING.md Normal file
View File

@ -0,0 +1,60 @@
# MOTD Formatting Codes
If `motd-formatting` is enabled in the config file, you can use special escape codes to
easily get bold, coloured, italic, and other types of specially-formatted text.
Our formatting character is '$', and this followed by specific letters means that the text
after it is formatted in the given way. Here are the character pairs and what they output:
--------------------------
Escape | Output
--------------------------
$$ | Dollar sign ($)
$b | Bold
$c | Color code
$i | Italics
$u | Underscore
$r | Reset
--------------------------
## Color codes
After the color code (`$c`), you can use square brackets to specify which foreground and
background colors to output. For example:
This line outputs red text:
`This is $c[red]really cool text!`
This line outputs red text with a light blue background:
`This is $c[red,light blue]22% cooler!`
If you're familiar with IRC colors you can also use the raw numbers you're used to:
`This is $c13pink text`
Here are the color names we support, and which IRC colors they map to:
--------------------
Code | Name
--------------------
00 | white
01 | black
02 | blue
03 | green
04 | red
05 | brown
06 | magenta
07 | orange
08 | yellow
09 | light green
10 | cyan
11 | light cyan
12 | light blue
13 | pink
14 | grey
15 | light grey
--------------------
In addition, some newer clients can make use of the colour codes 16-98, though they don't
have any names assigned. Take a look at this table to see which colours these numbers are:
https://modern.ircdocs.horse/formatting.html#colors-16-98

View File

@ -1,36 +0,0 @@
▄▄▄ ▄▄▄· ▄▄ • ▐ ▄
▪ ▀▄ █·▐█ ▀█ ▐█ ▀ ▪▪ •█▌▐█▪
▄█▀▄ ▐▀▀▄ ▄█▀▀█ ▄█ ▀█▄ ▄█▀▄▪▐█▐▐▌ ▄█▀▄
▐█▌.▐▌▐█•█▌▐█ ▪▐▌▐█▄▪▐█▐█▌ ▐▌██▐█▌▐█▌.▐▌
▀█▄▀▪.▀ ▀ ▀ ▀ ·▀▀▀▀ ▀█▄▀ ▀▀ █▪ ▀█▄▀▪
-----------------------------------------------------------------------------------------------
Oragono is a modern, experimental IRC server written in Go. It's designed to be simple to setup
and use, and to provide the majority of features that IRC users expect today.
It includes features such as UTF-8 nicks and channel names, client accounts and SASL, and other
assorted IRCv3 support.
http://oragono.io/
https://github.com/DanielOaks/oragono
-----------------------------------------------------------------------------------------------
=== Installing ===
Copy the example config file to ircd.yaml with a command like:
$ cp oragono.yaml ircd.yaml
Modify the config file as you like.
Run these commands in order -- these will setup each section of the server:
$ oragono initdb
$ oragono mkcerts
$ oragono run
And you should now be running Oragono!

128
docs/USERGUIDE.md Normal file
View File

@ -0,0 +1,128 @@
__ __ ______ ___ ______ ___
__/ // /_/ ____/ __ \/ ____/ __ \
/_ // __/ __/ / /_/ / / __/ / / /
/_ // __/ /___/ _, _/ /_/ / /_/ /
/_//_/ /_____/_/ |_|\____/\____/
Ergo IRCd User Guide
https://ergo.chat/
_Copyright © Daniel Oaks <daniel@danieloaks.net>, Shivaram Lingamneni <slingamn@cs.stanford.edu>_
--------------------------------------------------------------------------------------------
Table of Contents
- [Introduction](#introduction)
- [About IRC](#about-irc)
- [How Ergo is different](#how-ergo-is-different)
- [Account registration](#account-registration)
- [Channel registration](#channel-registration)
- [Always-on](#always-on)
- [Multiclient](#multiclient)
- [History](#history)
- [Push notifications](#push-notifications)
--------------------------------------------------------------------------------------------
# Introduction
Welcome to Ergo, a modern IRC server!
This guide is for end users of Ergo (people using Ergo to chat). If you're installing your own Ergo instance, you should consult the official manual instead (a copy should be bundled with your release, in the `docs/` directory).
This guide assumes that Ergo is in its default or recommended configuration; Ergo server administrators can change settings to make the server behave differently. If something isn't working as expected, ask your server administrator for help.
# About IRC
Before continuing, you should be familiar with basic features of the IRC platform. If you're comfortable with IRC, you can skip this section.
[IRC](https://en.wikipedia.org/wiki/Internet_Relay_Chat) is a chat platform invented in 1988, which makes it older than the World Wide Web! At its most basic level, IRC is a chat system composed of chat rooms; these are called "channels" and their names begin with a `#` character (this is actually the origin of the [hashtag](https://www.cmu.edu/homepage/computing/2014/summer/originstory.shtml)!). As a user, you "join" the channels you're interested in, enabling you to participate in those discussions.
Here are some guides covering the basics of IRC:
* [Fedora Magazine: Beginner's Guide to IRC](https://fedoramagazine.org/beginners-guide-irc/)
* [IRCHelp's IRC Tutorial](https://www.irchelp.org/faq/irctutorial.html) (in particular, section 3, "Beyond the Basics")
# How Ergo is different
Ergo differs in many ways from conventional IRC servers. If you're *not* familiar with other IRC servers, you may want to skip this section. Here are some of the most salient differences:
* Ergo integrates a "bouncer" into the server. In particular:
* Ergo stores message history for later retrieval.
* You can be "present" on the server (joined to channels, able to receive DMs) without having an active client connection to the server.
* Conversely, you can use multiple clients to view / control the same presence (nickname) on the server, as long as you authenticate with SASL when connecting.
* Ergo integrates "services" into the server. In particular:
* Nicknames are strictly reserved: once you've registered your nickname, you must log in in order to use it. Consequently, SASL is more important when using Ergo than in other systems.
* All properties of registered channels are protected without the need for `ChanServ` to be joined to the channel.
* Ergo "cloaks", i.e., cryptographically scrambles, end user IPs so that they are not displayed publicly.
* By default, the user/ident field is inoperative in Ergo: it is always set to `~u`, regardless of the `USER` command or the client's support for identd. This is because it is not in general a reliable or trustworthy way to distinguish users coming from the same IP. Ergo's integrated bouncer features should reduce the need for shared shell hosts and hosted bouncers (one of the main remaining use cases for identd).
* By default, Ergo is only accessible via TLS.
# Account registration
Although (as in other IRC systems) basic chat functionality is available without creating an account, most of Ergo's features require an account. You can create an account by sending a direct message to `NickServ`. (In IRC jargon, `NickServ` is a "network service", but if you're not familiar with the concept you can just think of it as a bot or a text user interface.) In a typical client, this will be:
```
/msg NickServ register mySecretPassword validEmailAddress@example.com
```
This registers your current nickname as your account name, with the password `mySecretPassword` (replace this with your own secret password!)
Once you have registered your account, you must configure SASL in your client, so that you will be logged in automatically on each connection. [libera.chat's SASL guide](https://libera.chat/guides/sasl) covers most popular clients.
If your client doesn't support SASL, you can typically use the "server password" (`PASS`) field in your client to log into your account automatically when connecting. Set the server password to `accountname:accountpassword`, where `accountname` is your account name and `accountpassword` is your account password.
For information on how to use a client certificate for authentication, see the [operator manual](https://github.com/ergochat/ergo/blob/stable/docs/MANUAL.md#client-certificates).
# Channel registration
Once you've registered your nickname, you can use it to register channels. By default, channels are ephemeral; they go away when there are no longer any users in the channel, or when the server is restarted. Registering a channel gives you permanent control over it, and ensures that its settings will persist. To register a channel, send a message to `ChanServ`:
```
/msg ChanServ register #myChannel
```
The channel must exist (if it doesn't, you can create it with `/join #myChannel`) and you must already be an operator (have the `+o` channel mode --- your client may display this as an `@` next to your nickname). If you're not a channel operator in the channel you want to register, ask your server administrator for help.
# Always-on
By default, if you lose your connection to the IRC server, you are no longer present on the server; other users will see that you have "quit", you will no longer appear in channel lists, and you will not be able to receive direct messages. Ergo supports "always-on clients", where you remain on the server even when you are disconnected. To enable this, you can send a message to `NickServ`:
```
/msg NickServ set always-on true
```
# Multiclient
Ergo natively supports attaching multiple clients to the same nickname (this normally requires the use of an external bouncer, like ZNC or WeeChat's "relay" functionality). To use this feature, simply authenticate with SASL (or the PASS workaround, if necessary) when connecting. In the recommended configuration of Ergo, you will receive the nickname associated with your account, even if you have other clients already using it.
# History
Ergo stores message history on the server side (typically not an unlimited amount --- consult your server's FAQ, or your server administrator, to find out how much is being stored and how long it's being retained).
1. The [IRCv3 chathistory specification](https://ircv3.net/specs/extensions/chathistory) offers the most fine-grained control over history replay. It is supported by [Gamja](https://git.sr.ht/~emersion/gamja), [Goguma](https://sr.ht/~emersion/goguma/), and [Kiwi IRC](https://github.com/kiwiirc/kiwiirc), and hopefully other clients soon.
1. We emulate the [ZNC playback module](https://wiki.znc.in/Playback) for clients that support it. You may need to enable support for it explicitly in your client. For example, in [Textual](https://www.codeux.com/textual/), go to "Server properties", select "Vendor specific", uncheck "Do not automatically join channels on connect", and check "Only play back messages you missed". ZNC's wiki page covers other common clients (although if the feature is only supported via a script or third-party extension, the following option may be easier).
1. If you set your client to always-on (see the previous section for details), you can set a "device ID" for each device you use. Ergo will then remember the last time your device was present on the server, and each time you sign on, it will attempt to replay exactly those messages you missed. There are a few ways to set your device ID when connecting:
- You can add it to your SASL username with an `@`, e.g., if your SASL username is `alice` you can send `alice@phone`
- You can add it in a similar way to your IRC protocol username ("ident"), e.g., `alice@phone`
- If login to user accounts via the `PASS` command is enabled on the server, you can provide it there, e.g., by sending `alice@phone:hunter2` as the server password
1. If you only have one device, you can set your client to be always-on and furthermore `/msg NickServ set autoreplay-missed true`. This will replay missed messages, with the caveat that you must be connecting with at most one client at a time.
1. You can manually request history using `/history #channel 1h` (the parameter is either a message count or a time duration). (Depending on your client, you may need to use `/QUOTE history` instead.)
1. You can autoreplay a fixed number of lines (e.g., 25) each time you join a channel using `/msg NickServ set autoreplay-lines 25`.
# Private channels
If you have registered a channel, you can make it private. The best way to do this is with the `+i` ("invite-only") mode:
1. Set your channel to be invite-only (`/mode #example +i`)
1. Identify the users you want to be able to access the channel. Ensure that they have registered their accounts (you should be able to see their registration status if you `/WHOIS` their nicknames).
1. Add the desired nick/account names to the invite exception list (`/mode #example +I alice`) or give them persistent voice (`/msg ChanServ AMODE #example +v alice`)
1. If you want to grant a persistent channel privilege to a user, you can do it with `CS AMODE` (`/msg ChanServ AMODE #example +o bob`)
# Push notifications
Ergo has experimental support for mobile push notifications. The server operator must enable this functionality; to check whether this is the case, you can send `/msg NickServ push list`. You must additionally be using a client (e.g. Goguma) that supports the functionality, and your account must be set to always-on (`/msg NickServ set always-on true`, as described above).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -1,38 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="800" height="200" viewBox="0, 0, 800, 200">
<g id="Layer_1">
<g>
<path d="M86.334,81.496 L86.334,100.351 L66.729,100.351 L66.729,118.504 L56.935,118.504 L56.935,152.773 L66.729,152.773 L66.729,171.627 L86.334,171.627 L86.334,189.78 L47.125,189.78 L47.125,171.627 L27.521,171.627 L27.521,154.142 L17.727,154.142 L17.727,117.135 L27.521,117.135 L27.521,100.351 L47.125,100.351 L47.125,81.496 L86.334,81.496 z" fill="#000000"/>
<path d="M537.229,81.496 L537.229,100.351 L517.625,100.351 L517.625,118.504 L507.831,118.504 L507.831,152.773 L517.625,152.773 L517.625,171.627 L537.229,171.627 L537.229,189.78 L498.021,189.78 L498.021,171.627 L478.417,171.627 L478.417,154.142 L468.623,154.142 L468.623,117.135 L478.417,117.135 L478.417,100.351 L498.021,100.351 L498.021,81.496 L537.229,81.496 z" fill="#000000"/>
<path d="M615.646,10.22 L615.646,45.858 L625.456,45.858 L625.456,81.496 L635.25,81.496 L635.25,117.135 L645.06,117.135 L645.06,47.227 L635.25,47.227 L635.25,29.075 L654.854,29.075 L654.854,45.858 L674.458,45.858 L674.458,82.865 L664.664,82.865 L664.664,154.142 L654.854,154.142 L654.854,189.78 L635.25,189.78 L635.25,154.142 L625.456,154.142 L625.456,82.865 L615.646,82.865 L615.646,171.627 L576.437,171.627 L576.437,117.135 L586.247,117.135 L586.247,81.496 L596.041,81.496 L596.041,45.858 L605.852,45.858 L605.852,10.22 L615.646,10.22 z" fill="#000000"/>
<path d="M752.875,81.496 L752.875,100.351 L733.271,100.351 L733.271,118.504 L723.477,118.504 L723.477,152.773 L733.271,152.773 L733.271,171.627 L752.875,171.627 L752.875,189.78 L713.667,189.78 L713.667,171.627 L694.063,171.627 L694.063,154.142 L684.268,154.142 L684.268,117.135 L694.063,117.135 L694.063,100.351 L713.667,100.351 L713.667,81.496 L752.875,81.496 z" fill="#000000"/>
<path d="M135.639,176.125 Q136.532,176.126 137.17,176.756 Q137.808,177.386 137.808,178.279 Q137.808,179.204 137.162,179.826 Q136.516,180.448 135.639,180.448 L135.065,180.448 Q134.172,180.448 133.534,179.818 Q132.895,179.188 132.895,178.295 Q132.895,177.37 133.541,176.748 Q134.188,176.126 135.065,176.126 L135.639,176.125 z" fill="#000000"/>
<path d="M668.7,165.773 L668.7,173.86 L660.613,173.86 L660.613,165.773 L668.7,165.773 z" fill="#000000"/>
<path d="M119.783,165.773 L119.783,173.86 L111.696,173.86 L111.696,165.773 L119.783,165.773 z" fill="#000000"/>
<path d="M786.325,165.773 L786.325,173.86 L778.237,173.86 L778.237,165.773 L786.325,165.773 z" fill="#000000"/>
<path d="M772.479,100.351 L772.479,117.135 L782.289,117.135 L782.289,154.142 L772.479,154.142 L772.479,171.627 L752.875,171.627 L752.875,152.773 L762.685,152.773 L762.685,118.504 L752.875,118.504 L752.875,100.351 L772.479,100.351 z" fill="#000000"/>
<path d="M556.833,100.351 L556.833,117.135 L566.643,117.135 L566.643,154.142 L556.833,154.142 L556.833,171.627 L537.229,171.627 L537.229,152.773 L547.039,152.773 L547.039,118.504 L537.229,118.504 L537.229,100.351 L556.833,100.351 z" fill="#000000"/>
<path d="M400,29.075 L400,45.858 L419.604,45.858 L419.604,64.713 L400,64.713 L400,47.227 L380.396,47.227 L380.396,135.989 L400,135.989 L400,152.773 L429.414,152.773 L429.414,118.504 L419.604,118.504 L419.604,100.351 L400,100.351 L400,81.496 L439.208,81.496 L439.208,100.351 L458.813,100.351 L458.813,154.142 L439.208,154.142 L439.208,171.627 L360.792,171.627 L360.792,154.142 L350.998,154.142 L350.998,118.504 L341.187,118.504 L341.187,100.351 L360.792,100.351 L360.792,82.865 L350.998,82.865 L350.998,45.858 L360.792,45.858 L360.792,29.075 L400,29.075 z" fill="#000000"/>
<path d="M184.354,29.075 L184.354,45.858 L203.958,45.858 L203.958,82.865 L184.354,82.865 L184.354,100.351 L145.146,100.351 L145.146,117.135 L164.75,117.135 L164.75,171.627 L145.146,171.627 L145.146,154.142 L135.352,154.142 L135.352,81.496 L145.146,81.496 L145.146,64.713 L164.75,64.713 L164.75,81.496 L184.354,81.496 L184.354,47.227 L145.146,47.227 L145.146,64.713 L125.542,64.713 L125.542,29.075 L184.354,29.075 z" fill="#000000"/>
<path d="M105.938,100.351 L105.938,117.135 L115.748,117.135 L115.748,154.142 L105.938,154.142 L105.938,171.627 L86.334,171.627 L86.334,152.773 L96.144,152.773 L96.144,118.504 L86.334,118.504 L86.334,100.351 L105.938,100.351 z" fill="#000000"/>
<path d="M203.958,100.351 L203.958,117.135 L213.768,117.135 L213.768,152.773 L223.563,152.773 L223.563,171.627 L203.958,171.627 L203.958,154.142 L184.354,154.142 L184.354,100.351 L203.958,100.351 z" fill="#000000"/>
<path d="M301.979,29.075 L301.979,45.858 L321.583,45.858 L321.583,117.135 L331.393,117.135 L331.393,154.142 L321.583,154.142 L321.583,171.627 L301.979,171.627 L301.979,152.773 L311.789,152.773 L311.789,118.504 L301.979,118.504 L301.979,100.351 L262.771,100.351 L262.771,171.627 L243.167,171.627 L243.167,154.142 L233.373,154.142 L233.373,118.504 L223.563,118.504 L223.563,100.351 L243.167,100.351 L243.167,82.865 L233.373,82.865 L233.373,45.858 L243.167,45.858 L243.167,29.075 L301.979,29.075 z M282.375,47.227 L262.771,47.227 L262.771,81.496 L301.979,81.496 L301.979,64.713 L282.375,64.713 L282.375,47.227 z" fill="#000000"/>
<path d="M354.124,167.432 Q354.794,167.432 355.273,167.911 Q355.751,168.389 355.751,169.075 Q355.751,169.745 355.273,170.224 Q354.794,170.702 354.124,170.702 Q353.438,170.702 352.96,170.224 Q352.481,169.745 352.481,169.075 Q352.481,168.389 352.96,167.911 Q353.438,167.432 354.124,167.432 z" fill="#000000"/>
<path d="M76.826,140.487 Q77.72,140.487 78.358,141.118 Q78.996,141.748 78.996,142.641 Q78.996,143.566 78.35,144.188 Q77.704,144.81 76.827,144.81 L76.252,144.81 Q75.359,144.81 74.721,144.18 Q74.083,143.55 74.083,142.657 Q74.083,141.732 74.729,141.11 Q75.375,140.487 76.252,140.487 L76.826,140.487 z" fill="#000000"/>
<path d="M743.368,140.487 Q744.261,140.487 744.899,141.118 Q745.537,141.748 745.537,142.641 Q745.537,143.566 744.891,144.188 Q744.245,144.81 743.368,144.81 L742.793,144.81 Q741.901,144.81 741.262,144.18 Q740.624,143.55 740.624,142.657 Q740.624,141.732 741.27,141.11 Q741.916,140.487 742.794,140.487 L743.368,140.487 z" fill="#000000"/>
<path d="M296.221,130.135 L296.221,138.222 L288.134,138.222 L288.134,130.135 L296.221,130.135 z" fill="#000000"/>
<path d="M413.846,130.135 L413.846,138.222 L405.758,138.222 L405.758,130.135 L413.846,130.135 z" fill="#000000"/>
<path d="M174.544,130.231 Q176.187,130.231 177.344,131.387 Q178.5,132.544 178.5,134.171 Q178.5,135.814 177.336,136.97 Q176.171,138.127 174.544,138.127 Q172.917,138.127 171.761,136.97 Q170.604,135.814 170.604,134.171 Q170.604,132.544 171.761,131.387 Q172.917,130.231 174.544,130.231 z" fill="#000000"/>
<path d="M570.679,94.497 L570.679,102.584 L562.592,102.584 L562.592,94.497 L570.679,94.497 z" fill="#000000"/>
<path d="M453.054,58.859 L453.054,66.946 L444.967,66.946 L444.967,58.859 L453.054,58.859 z" fill="#000000"/>
<path d="M21.763,58.859 L21.763,66.946 L13.675,66.946 L13.675,58.859 L21.763,58.859 z" fill="#000000"/>
<path d="M472.658,58.859 L472.658,66.946 L464.571,66.946 L464.571,58.859 L472.658,58.859 z" fill="#000000"/>
<path d="M688.304,58.859 L688.304,66.946 L680.217,66.946 L680.217,58.859 L688.304,58.859 z" fill="#000000"/>
<path d="M586.232,58.954 Q587.875,58.955 589.031,60.111 Q590.188,61.267 590.188,62.895 Q590.188,64.537 589.023,65.694 Q587.859,66.85 586.232,66.85 Q584.605,66.85 583.448,65.694 Q582.292,64.537 582.292,62.895 Q582.292,61.267 583.448,60.111 Q584.605,58.955 586.232,58.955 z" fill="#000000"/>
<path d="M216.895,60.518 L217.517,60.637 L218.043,60.996 Q218.522,61.475 218.522,62.161 Q218.522,62.831 218.044,63.309 Q217.565,63.788 216.895,63.788 Q216.209,63.788 215.731,63.309 Q215.252,62.831 215.252,62.161 Q215.252,61.475 215.731,60.996 C216.439,60.517 216.051,60.677 216.895,60.518 z" fill="#000000"/>
<path d="M429.398,23.316 Q431.041,23.316 432.198,24.473 Q433.354,25.629 433.354,27.256 Q433.354,28.899 432.19,30.056 Q431.025,31.212 429.398,31.212 Q427.771,31.212 426.615,30.056 Q425.458,28.899 425.458,27.256 Q425.458,25.629 426.615,24.473 Q427.771,23.316 429.398,23.316 z" fill="#000000"/>
<path d="M314.916,24.88 Q315.586,24.88 316.064,25.358 Q316.543,25.837 316.543,26.523 Q316.543,27.193 316.064,27.671 Q315.586,28.15 314.916,28.15 Q314.23,28.15 313.751,27.671 Q313.273,27.193 313.273,26.523 Q313.273,25.837 313.751,25.358 Q314.23,24.88 314.916,24.88 z" fill="#000000"/>
</g>
</g>
</svg>
<svg width="552.48" height="226.39" version="1.1" viewBox="0 0 146.18 59.901" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(3.0169 0 0 3.0169 -99.412 -462.64)"><g stroke-width=".40656" aria-label="#ERGO"><path d="m34.33 165.07h1.9027l2.0003-11.351h-1.9027l-0.55292 3.1549h-2.0328v1.7888h1.7075l-0.24394 1.4636h-2.0816v1.7888h1.7563zm3.1549 0h1.9027l0.55292-3.1549h2.0328v-1.7888h-1.7075l0.24393-1.4636h2.0816v-1.7888h-1.7563l0.55292-3.1549h-1.9027z" fill="#5f901d"/><g fill="#161616"><path d="m51.898 165.07v-2.0003h-4.8136v-2.7483h4.651v-2.0003h-4.651v-2.602h4.8136v-2.0003h-7.253v11.351z"/><path d="m56.001 160.86h1.1221l1.9027 4.2119h2.667l-2.2279-4.5372c1.2685-0.35777 2.0003-1.61 2.0003-3.2037 0-2.1954-1.2522-3.6102-3.4801-3.6102h-4.3908v11.351h2.4068zm0-1.8864v-3.285h1.3986c1.1384 0 1.5287 0.40656 1.5287 1.3986v0.48787c0 0.992-0.3903 1.3986-1.5287 1.3986z"/><path d="m68.823 165.07h2.1791v-6.0658h-4.1144v1.7238h1.9352v0.82938c0 1.0083-0.55292 1.7401-1.6425 1.7401-1.4148 0-1.8864-1.2034-1.8864-3.041v-1.8539c0-1.8214 0.45534-2.911 1.6913-2.911 1.1221 0 1.4961 0.89443 1.7401 1.8539l2.2767-0.55291c-0.45534-1.9515-1.6262-3.2687-3.968-3.2687-2.9435 0-4.3258 2.1141-4.3258 5.9683 0 3.6102 1.2034 5.7731 3.4313 5.7731 1.3986 0 2.1629-0.8619 2.5369-1.8051h0.14636z"/><path d="m76.791 165.27c3.0411 0 4.4396-2.1629 4.4396-5.8707 0-3.7078-1.3986-5.8707-4.4396-5.8707-3.041 0-4.4396 2.1629-4.4396 5.8707 0 3.7078 1.3986 5.8707 4.4396 5.8707zm0-1.9677c-1.3823 0-1.8376-1.0896-1.8376-2.911v-1.984c0-1.8214 0.45534-2.911 1.8376-2.911 1.3823 0 1.8376 1.0896 1.8376 2.911v1.9677c0 1.8376-0.45534 2.9272-1.8376 2.9272z"/></g></g><g fill="#4a7411" stroke-width=".17823" aria-label="irc server"><path d="m42.203 168.4c0.24239 0 0.34932-0.12833 0.34932-0.32081v-0.0927c0-0.19249-0.10694-0.32081-0.34932-0.32081s-0.34933 0.12832-0.34933 0.32081v0.0927c0 0.19248 0.10694 0.32081 0.34933 0.32081zm-0.28516 4.5412h0.57033v-3.6786h-0.57033z"/><path d="m44.271 172.94v-2.4952c0-0.34933 0.37071-0.61311 0.98382-0.61311h0.33507v-0.57032h-0.221c-0.59884 0-0.93391 0.32793-1.0622 0.67726h-0.03565v-0.67726h-0.57033v3.6786z"/><path d="m47.65 173.03c0.69865 0 1.1763-0.3422 1.4116-0.86975l-0.41349-0.27804c-0.19961 0.42062-0.53468 0.64162-0.99807 0.64162-0.67726 0-1.0266-0.46339-1.0266-1.105v-0.62736c0-0.64162 0.34932-1.105 1.0266-1.105 0.44913 0 0.76281 0.221 0.89826 0.59885l0.47765-0.24239c-0.21387-0.50617-0.64875-0.86262-1.3759-0.86262-1.0337 0-1.6397 0.74855-1.6397 1.9248s0.60597 1.9249 1.6397 1.9249z"/><path d="m52.655 173.03c0.84123 0 1.3617-0.43488 1.3617-1.1478 0-0.55607-0.31368-0.91252-1.1264-1.0337l-0.28516-0.0428c-0.45626-0.0713-0.70578-0.21387-0.70578-0.57033 0-0.34932 0.24952-0.57032 0.72004-0.57032 0.47052 0 0.7842 0.221 0.94817 0.44913l0.37784-0.3422c-0.29942-0.37071-0.69152-0.59171-1.2832-0.59171-0.74855 0-1.3118 0.35645-1.3118 1.0836 0 0.68439 0.50616 0.96243 1.1834 1.0622l0.29229 0.0428c0.48478 0.0713 0.64162 0.29229 0.64162 0.57745 0 0.37785-0.28516 0.59885-0.76994 0.59885-0.46339 0-0.80559-0.20675-1.0908-0.5632l-0.40636 0.32794c0.32794 0.43487 0.77707 0.72004 1.4543 0.72004z"/><path d="m56.405 173.03c0.69152 0 1.2191-0.3422 1.4543-0.84124l-0.40636-0.29229c-0.19248 0.40636-0.54894 0.63449-1.0123 0.63449-0.68439 0-1.0908-0.47765-1.0908-1.1121v-0.1711h2.6449v-0.2709c0-1.0408-0.60597-1.7965-1.5898-1.7965-0.99807 0-1.6539 0.75568-1.6539 1.9248s0.65588 1.9249 1.6539 1.9249zm0-3.3721c0.58459 0 0.97669 0.43487 0.97669 1.0836v0.0784h-2.0318v-0.0499c0-0.64161 0.43487-1.1121 1.0551-1.1121z"/><path d="m59.506 172.94v-2.4952c0-0.34933 0.37071-0.61311 0.98381-0.61311h0.33507v-0.57032h-0.221c-0.59884 0-0.93391 0.32793-1.0622 0.67726h-0.03565v-0.67726h-0.57033v3.6786z"/><path d="m63.099 172.94 1.2975-3.6786h-0.54894l-0.65588 1.825-0.39923 1.2547h-0.03564l-0.39923-1.2547-0.64162-1.825h-0.57033l1.2904 3.6786z"/><path d="m66.457 173.03c0.69152 0 1.2191-0.3422 1.4543-0.84124l-0.40636-0.29229c-0.19249 0.40636-0.54894 0.63449-1.0123 0.63449-0.68439 0-1.0908-0.47765-1.0908-1.1121v-0.1711h2.6449v-0.2709c0-1.0408-0.60597-1.7965-1.5898-1.7965-0.99807 0-1.6539 0.75568-1.6539 1.9248s0.65588 1.9249 1.6539 1.9249zm0-3.3721c0.58458 0 0.97668 0.43487 0.97668 1.0836v0.0784h-2.0318v-0.0499c0-0.64161 0.43488-1.1121 1.0551-1.1121z"/><path d="m69.558 172.94v-2.4952c0-0.34933 0.37071-0.61311 0.98382-0.61311h0.33507v-0.57032h-0.221c-0.59884 0-0.93391 0.32793-1.0622 0.67726h-0.03565v-0.67726h-0.57033v3.6786z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

208
ergo.go Normal file
View File

@ -0,0 +1,208 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2014-2015 Edmund Huber
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package main
import (
"bufio"
_ "embed"
"fmt"
"log"
"os"
"strings"
"syscall"
"golang.org/x/crypto/bcrypt"
"golang.org/x/term"
"github.com/docopt/docopt-go"
"github.com/ergochat/ergo/irc"
"github.com/ergochat/ergo/irc/logger"
"github.com/ergochat/ergo/irc/mkcerts"
"github.com/ergochat/ergo/irc/utils"
)
// set via linker flags, either by make or by goreleaser:
var commit = "" // git hash
var version = "" // tagged version
//go:embed default.yaml
var defaultConfig string
// get a password from stdin from the user
func getPasswordFromTerminal() string {
bytePassword, err := term.ReadPassword(int(syscall.Stdin))
if err != nil {
log.Fatal("Error reading password:", err.Error())
}
return string(bytePassword)
}
func fileDoesNotExist(file string) bool {
if _, err := os.Stat(file); os.IsNotExist(err) {
return true
}
return false
}
// implements the `ergo mkcerts` command
func doMkcerts(configFile string, quiet bool) {
config, err := irc.LoadRawConfig(configFile)
if err != nil {
log.Fatal(err)
}
if !quiet {
log.Println("making self-signed certificates")
}
certToKey := make(map[string]string)
for name, conf := range config.Server.Listeners {
if conf.TLS.Cert == "" {
continue
}
existingKey, ok := certToKey[conf.TLS.Cert]
if ok {
if existingKey == conf.TLS.Key {
continue
} else {
log.Fatal("Conflicting TLS key files for ", conf.TLS.Cert)
}
}
if !quiet {
log.Printf(" making cert for %s listener\n", name)
}
host := config.Server.Name
cert, key := conf.TLS.Cert, conf.TLS.Key
if !(fileDoesNotExist(cert) && fileDoesNotExist(key)) {
log.Fatalf("Preexisting TLS cert and/or key files: %s %s", cert, key)
}
err := mkcerts.CreateCert("Ergo", host, cert, key)
if err == nil {
if !quiet {
log.Printf(" Certificate created at %s : %s\n", cert, key)
}
certToKey[cert] = key
} else {
log.Fatal(" Could not create certificate:", err.Error())
}
}
}
func main() {
irc.SetVersionString(version, commit)
usage := `ergo.
Usage:
ergo initdb [--conf <filename>] [--quiet]
ergo upgradedb [--conf <filename>] [--quiet]
ergo importdb <database.json> [--conf <filename>] [--quiet]
ergo genpasswd [--conf <filename>] [--quiet]
ergo mkcerts [--conf <filename>] [--quiet]
ergo defaultconfig
ergo gentoken
ergo run [--conf <filename>] [--quiet] [--smoke]
ergo -h | --help
ergo --version
Options:
--conf <filename> Configuration file to use [default: ircd.yaml].
--quiet Don't show startup/shutdown lines.
-h --help Show this screen.
--version Show version.`
arguments, _ := docopt.ParseArgs(usage, nil, irc.Ver)
// don't require a config file for genpasswd
if arguments["genpasswd"].(bool) {
var password string
if term.IsTerminal(int(syscall.Stdin)) {
fmt.Print("Enter Password: ")
password = getPasswordFromTerminal()
fmt.Print("\n")
fmt.Print("Reenter Password: ")
confirm := getPasswordFromTerminal()
fmt.Print("\n")
if confirm != password {
log.Fatal("passwords do not match")
}
} else {
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
password = strings.TrimSpace(text)
}
if err := irc.ValidatePassphrase(password); err != nil {
log.Printf("WARNING: this password contains characters that may cause problems with your IRC client software.\n")
log.Printf("We strongly recommend choosing a different password.\n")
}
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
if err != nil {
log.Fatal("encoding error:", err.Error())
}
fmt.Println(string(hash))
return
} else if arguments["defaultconfig"].(bool) {
fmt.Print(defaultConfig)
return
} else if arguments["gentoken"].(bool) {
fmt.Println(utils.GenerateSecretKey())
return
} else if arguments["mkcerts"].(bool) {
doMkcerts(arguments["--conf"].(string), arguments["--quiet"].(bool))
return
}
configfile := arguments["--conf"].(string)
config, err := irc.LoadConfig(configfile)
if err != nil {
_, isCertError := err.(*irc.CertKeyError)
if !(isCertError && arguments["mkcerts"].(bool)) {
log.Fatal("Config file did not load successfully: ", err.Error())
}
}
logman, err := logger.NewManager(config.Logging)
if err != nil {
log.Fatal("Logger did not load successfully:", err.Error())
}
if arguments["initdb"].(bool) {
err = irc.InitDB(config.Datastore.Path)
if err != nil {
log.Fatal("Error while initializing db:", err.Error())
}
if !arguments["--quiet"].(bool) {
log.Println("database initialized: ", config.Datastore.Path)
}
} else if arguments["upgradedb"].(bool) {
err = irc.UpgradeDB(config)
if err != nil {
log.Fatal("Error while upgrading db:", err.Error())
}
if !arguments["--quiet"].(bool) {
log.Println("database upgraded: ", config.Datastore.Path)
}
} else if arguments["importdb"].(bool) {
err = irc.ImportDB(config, arguments["<database.json>"].(string))
if err != nil {
log.Fatal("Error while importing db:", err.Error())
}
} else if arguments["run"].(bool) {
if !arguments["--quiet"].(bool) {
logman.Info("server", fmt.Sprintf("%s starting", irc.Ver))
}
// warning if running a non-final version
if strings.Contains(irc.Ver, "unreleased") {
logman.Warning("server", "You are currently running an unreleased beta version of Ergo that may be unstable and could corrupt your database.\nIf you are running a production network, please download the latest build from https://ergo.chat/about and run that instead.")
}
server, err := irc.NewServer(config, logman)
if err != nil {
logman.Error("server", fmt.Sprintf("Could not load server: %s", err.Error()))
os.Exit(1)
}
if !arguments["--smoke"].(bool) {
server.Run()
}
}
}

35
ergo.motd Normal file
View File

@ -0,0 +1,35 @@
__ __ ______ ___ ______ ___
__/ // /_/ ____/ __ \/ ____/ __ \
/_ // __/ __/ / /_/ / / __/ / / /
/_ // __/ /___/ _, _/ /_/ / /_/ /
/_//_/ /_____/_/ |_|\____/\____/
This is the default Ergo MOTD.
If motd-formatting is enabled in the config file, you can use the dollarsign character to
create special formatting such as bold, italics and color codes.
For example, here are a few formatted lines (enable motd-formatting to see these in action):
- this is $bbold text$r.
- this is $iitalics text$r.
- this is $c[red]red$c and $c[blue]blue$c text.
- this is $c[red,light blue]red text with a light blue background$c.
- this is a normal escaped dollarsign: $$
And now a few fun colour charts!
$c1,0 00 $c0,1 01 $c0,2 02 $c0,3 03 $c1,4 04 $c0,5 05 $c0,6 06 $c1,7 07
$c1,8 08 $c1,9 09 $c0,10 10 $c1,11 11 $c0,12 12 $c1,13 13 $c1,14 14 $c1,15 15
$c0,16 16 $c0,17 17 $c0,18 18 $c0,19 19 $c0,20 20 $c0,21 21 $c0,22 22 $c0,23 23 $c0,24 24 $c0,25 25 $c0,26 26 $c0,27 27
$c0,28 28 $c0,29 29 $c0,30 30 $c0,31 31 $c0,32 32 $c0,33 33 $c0,34 34 $c0,35 35 $c0,36 36 $c0,37 37 $c0,38 38 $c0,39 39
$c0,40 40 $c0,41 41 $c0,42 42 $c0,43 43 $c0,44 44 $c0,45 45 $c0,46 46 $c0,47 47 $c0,48 48 $c0,49 49 $c0,50 50 $c0,51 51
$c0,52 52 $c0,53 53 $c1,54 54 $c1,55 55 $c1,56 56 $c1,57 57 $c1,58 58 $c0,59 59 $c0,60 60 $c0,61 61 $c0,62 62 $c0,63 63
$c0,64 64 $c1,65 65 $c1,66 66 $c1,67 67 $c1,68 68 $c1,69 69 $c1,70 70 $c1,71 71 $c0,72 72 $c0,73 73 $c0,74 74 $c0,75 75
$c1,76 76 $c1,77 77 $c1,78 78 $c1,79 79 $c1,80 80 $c1,81 81 $c1,82 82 $c1,83 83 $c1,84 84 $c1,85 85 $c1,86 86 $c1,87 87
$c0,88 88 $c0,89 89 $c0,90 90 $c0,91 91 $c0,92 92 $c0,93 93 $c0,94 94 $c0,95 95 $c1,96 96 $c1,97 97 $c1,98 98 $c99,99 99
For more information on using these, see MOTDFORMATTING.md

310
gencapdefs.py Normal file
View File

@ -0,0 +1,310 @@
#!/usr/bin/env python3
"""
Updates the capability definitions at irc/caps/defs.go
To add a capability, add it to the CAPDEFS list below,
then run `make capdefs` from the project root.
"""
import io
import subprocess
import sys
from collections import namedtuple
CapDef = namedtuple("CapDef", ['identifier', 'name', 'url', 'standard'])
CAPDEFS = [
CapDef(
identifier="AccountNotify",
name="account-notify",
url="https://ircv3.net/specs/extensions/account-notify-3.1.html",
standard="IRCv3",
),
CapDef(
identifier="AccountTag",
name="account-tag",
url="https://ircv3.net/specs/extensions/account-tag-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="AwayNotify",
name="away-notify",
url="https://ircv3.net/specs/extensions/away-notify-3.1.html",
standard="IRCv3",
),
CapDef(
identifier="Batch",
name="batch",
url="https://ircv3.net/specs/extensions/batch-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="CapNotify",
name="cap-notify",
url="https://ircv3.net/specs/extensions/cap-notify-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="ChgHost",
name="chghost",
url="https://ircv3.net/specs/extensions/chghost-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="EchoMessage",
name="echo-message",
url="https://ircv3.net/specs/extensions/echo-message-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="ExtendedJoin",
name="extended-join",
url="https://ircv3.net/specs/extensions/extended-join-3.1.html",
standard="IRCv3",
),
CapDef(
identifier="ExtendedMonitor",
name="extended-monitor",
url="https://ircv3.net/specs/extensions/extended-monitor.html",
standard="IRCv3",
),
CapDef(
identifier="InviteNotify",
name="invite-notify",
url="https://ircv3.net/specs/extensions/invite-notify-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="LabeledResponse",
name="labeled-response",
url="https://ircv3.net/specs/extensions/labeled-response.html",
standard="IRCv3",
),
CapDef(
identifier="Languages",
name="draft/languages",
url="https://gist.github.com/DanielOaks/8126122f74b26012a3de37db80e4e0c6",
standard="proposed IRCv3",
),
CapDef(
identifier="MessageRedaction",
name="draft/message-redaction",
url="https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md",
standard="proposed IRCv3",
),
CapDef(
identifier="MessageTags",
name="message-tags",
url="https://ircv3.net/specs/extensions/message-tags.html",
standard="IRCv3",
),
CapDef(
identifier="MultiPrefix",
name="multi-prefix",
url="https://ircv3.net/specs/extensions/multi-prefix-3.1.html",
standard="IRCv3",
),
CapDef(
identifier="Relaymsg",
name="draft/relaymsg",
url="https://github.com/ircv3/ircv3-specifications/pull/417",
standard="proposed IRCv3",
),
CapDef(
identifier="ChannelRename",
name="draft/channel-rename",
url="https://ircv3.net/specs/extensions/channel-rename",
standard="draft IRCv3",
),
CapDef(
identifier="SASL",
name="sasl",
url="https://ircv3.net/specs/extensions/sasl-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="ServerTime",
name="server-time",
url="https://ircv3.net/specs/extensions/server-time-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="SetName",
name="setname",
url="https://ircv3.net/specs/extensions/setname.html",
standard="IRCv3",
),
CapDef(
identifier="STS",
name="sts",
url="https://ircv3.net/specs/extensions/sts.html",
standard="IRCv3",
),
CapDef(
identifier="UserhostInNames",
name="userhost-in-names",
url="https://ircv3.net/specs/extensions/userhost-in-names-3.2.html",
standard="IRCv3",
),
CapDef(
identifier="ZNCSelfMessage",
name="znc.in/self-message",
url="https://wiki.znc.in/Query_buffers",
standard="ZNC vendor",
),
CapDef(
identifier="EventPlayback",
name="draft/event-playback",
url="https://github.com/ircv3/ircv3-specifications/pull/362",
standard="proposed IRCv3",
),
CapDef(
identifier="ZNCPlayback",
name="znc.in/playback",
url="https://wiki.znc.in/Playback",
standard="ZNC vendor",
),
CapDef(
identifier="Nope",
name="ergo.chat/nope",
url="https://ergo.chat/nope",
standard="Ergo vendor",
),
CapDef(
identifier="Multiline",
name="draft/multiline",
url="https://github.com/ircv3/ircv3-specifications/pull/398",
standard="proposed IRCv3",
),
CapDef(
identifier="Chathistory",
name="draft/chathistory",
url="https://github.com/ircv3/ircv3-specifications/pull/393",
standard="proposed IRCv3",
),
CapDef(
identifier="AccountRegistration",
name="draft/account-registration",
url="https://github.com/ircv3/ircv3-specifications/pull/435",
standard="draft IRCv3",
),
CapDef(
identifier="ReadMarker",
name="draft/read-marker",
url="https://github.com/ircv3/ircv3-specifications/pull/489",
standard="draft IRCv3",
),
CapDef(
identifier="Persistence",
name="draft/persistence",
url="https://github.com/ircv3/ircv3-specifications/pull/503",
standard="proposed IRCv3",
),
CapDef(
identifier="Preaway",
name="draft/pre-away",
url="https://github.com/ircv3/ircv3-specifications/pull/514",
standard="proposed IRCv3",
),
CapDef(
identifier="StandardReplies",
name="standard-replies",
url="https://github.com/ircv3/ircv3-specifications/pull/506",
standard="IRCv3",
),
CapDef(
identifier="NoImplicitNames",
name="draft/no-implicit-names",
url="https://github.com/ircv3/ircv3-specifications/pull/527",
standard="proposed IRCv3",
),
CapDef(
identifier="ExtendedISupport",
name="draft/extended-isupport",
url="https://github.com/ircv3/ircv3-specifications/pull/543",
standard="proposed IRCv3",
),
CapDef(
identifier="WebPush",
name="draft/webpush",
url="https://github.com/ircv3/ircv3-specifications/pull/471",
standard="proposed IRCv3",
),
CapDef(
identifier="SojuWebPush",
name="soju.im/webpush",
url="https://github.com/ircv3/ircv3-specifications/pull/471",
standard="Soju/Goguma vendor",
),
CapDef(
identifier="Metadata",
name="draft/metadata-2",
url="https://ircv3.net/specs/extensions/metadata",
standard="draft IRCv3",
),
]
def validate_defs():
CAPDEFS.sort(key=lambda d: d.name)
numCaps = len(CAPDEFS)
numNames = len(set(capdef.name for capdef in CAPDEFS))
if numCaps != numNames:
raise Exception("defs must have unique names, but found duplicates")
numIdentifiers = len(set(capdef.identifier for capdef in CAPDEFS))
if numCaps != numIdentifiers:
raise Exception("defs must have unique identifiers, but found duplicates")
def main():
validate_defs()
output = io.StringIO()
print("""
package caps
/*
WARNING: this file is autogenerated by `make capdefs`
DO NOT EDIT MANUALLY.
*/
""", file=output)
numCapabs = len(CAPDEFS)
bitsetLen = numCapabs // 32
if numCapabs % 32 > 0:
bitsetLen += 1
print ("""
const (
// number of recognized capabilities:
numCapabs = %d
// length of the uint32 array that represents the bitset:
bitsetLen = %d
)
""" % (numCapabs, bitsetLen), file=output)
print("const (", file=output)
for capdef in CAPDEFS:
print("// %s is the %s capability named \"%s\":" % (capdef.identifier, capdef.standard, capdef.name), file=output)
print("// %s" % (capdef.url,), file=output)
print("%s Capability = iota" % (capdef.identifier,), file=output)
print(file=output)
print(")", file=output)
print("// `capabilityNames[capab]` is the string name of the capability `capab`", file=output)
print("""var ( capabilityNames = [numCapabs]string{""", file=output)
for capdef in CAPDEFS:
print("\"%s\"," % (capdef.name,), file=output)
print("})", file=output)
# run the generated code through `gofmt -s`, which will print it to stdout
gofmt = subprocess.Popen(['gofmt', '-s'], stdin=subprocess.PIPE)
gofmt.communicate(input=output.getvalue().encode('utf-8'))
if gofmt.poll() != 0:
print(output.getvalue())
raise Exception("gofmt failed")
return 0
if __name__ == '__main__':
sys.exit(main())

47
go.mod Normal file
View File

@ -0,0 +1,47 @@
module github.com/ergochat/ergo
go 1.24
require (
code.cloudfoundry.org/bytefmt v0.0.0-20200131002437-cf55d5288a48
github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
github.com/ergochat/confusables v0.0.0-20201108231250-4ab98ab61fb1
github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881
github.com/ergochat/irc-go v0.5.0-rc2
github.com/go-sql-driver/mysql v1.7.0
github.com/gofrs/flock v0.8.1
github.com/gorilla/websocket v1.4.2
github.com/okzk/sdnotify v0.0.0-20180710141335-d9becc38acbd
github.com/onsi/ginkgo v1.12.0 // indirect
github.com/onsi/gomega v1.9.0 // indirect
github.com/stretchr/testify v1.4.0 // indirect
github.com/tidwall/buntdb v1.3.2
github.com/xdg-go/scram v1.0.2
golang.org/x/crypto v0.38.0
golang.org/x/term v0.32.0
golang.org/x/text v0.25.0
gopkg.in/yaml.v2 v2.4.0
)
require (
github.com/emersion/go-msgauth v0.7.0
github.com/ergochat/webpush-go/v2 v2.0.0
github.com/golang-jwt/jwt/v5 v5.2.2
)
require (
github.com/tidwall/btree v1.4.2 // indirect
github.com/tidwall/gjson v1.14.3 // indirect
github.com/tidwall/grect v0.1.4 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tidwall/rtred v0.1.2 // indirect
github.com/tidwall/tinyqueue v0.1.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
golang.org/x/sys v0.33.0 // indirect
)
replace github.com/gorilla/websocket => github.com/ergochat/websocket v1.4.2-oragono1
replace github.com/xdg-go/scram => github.com/ergochat/scram v1.0.2-ergo1

109
go.sum Normal file
View File

@ -0,0 +1,109 @@
code.cloudfoundry.org/bytefmt v0.0.0-20200131002437-cf55d5288a48 h1:/EMHruHCFXR9xClkGV/t0rmHrdhX4+trQUcBqjwc9xE=
code.cloudfoundry.org/bytefmt v0.0.0-20200131002437-cf55d5288a48/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc=
github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962 h1:KeNholpO2xKjgaaSyd+DyQRrsQjhbSeS7qe4nEw8aQw=
github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/emersion/go-msgauth v0.6.8 h1:kW/0E9E8Zx5CdKsERC/WnAvnXvX7q9wTHia1OA4944A=
github.com/emersion/go-msgauth v0.6.8/go.mod h1:YDwuyTCUHu9xxmAeVj0eW4INnwB6NNZoPdLerpSxRrc=
github.com/emersion/go-msgauth v0.7.0 h1:vj2hMn6KhFtW41kshIBTXvp6KgYSqpA/ZN9Pv4g1INc=
github.com/emersion/go-msgauth v0.7.0/go.mod h1:mmS9I6HkSovrNgq0HNXTeu8l3sRAAuQ9RMvbM4KU7Ck=
github.com/ergochat/confusables v0.0.0-20201108231250-4ab98ab61fb1 h1:WLHTOodthVyv5NvYLIvWl112kSFv5IInKKrRN2qpons=
github.com/ergochat/confusables v0.0.0-20201108231250-4ab98ab61fb1/go.mod h1:mov+uh1DPWsltdQnOdzn08UO9GsJ3MEvhtu0Ci37fdk=
github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881 h1:+J5m88nvybxB5AnBVGzTXM/yHVytt48rXBGcJGzSbms=
github.com/ergochat/go-ident v0.0.0-20230911071154-8c30606d6881/go.mod h1:ASYJtQujNitna6cVHsNQTGrfWvMPJ5Sa2lZlmsH65uM=
github.com/ergochat/irc-go v0.5.0-rc2 h1:VuSQJF5K4hWvYSzGa4b8vgL6kzw8HF6LSOejE+RWpAo=
github.com/ergochat/irc-go v0.5.0-rc2/go.mod h1:2vi7KNpIPWnReB5hmLpl92eMywQvuIeIIGdt/FQCph0=
github.com/ergochat/scram v1.0.2-ergo1 h1:2bYXiRFQH636pT0msOG39fmEYl4Eq+OuutcyDsCix/g=
github.com/ergochat/scram v1.0.2-ergo1/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/ergochat/webpush-go/v2 v2.0.0 h1:n6eoJk8RpzJFeBJ6gxvqo/dngnVEmJbzJwzKtCZbByo=
github.com/ergochat/webpush-go/v2 v2.0.0/go.mod h1:OQlhnq8JeHDzRzAy6bdDObr19uqbHliOV+z7mHbYr4c=
github.com/ergochat/websocket v1.4.2-oragono1 h1:plMUunFBM6UoSCIYCKKclTdy/TkkHfUslhOfJQzfueM=
github.com/ergochat/websocket v1.4.2-oragono1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/okzk/sdnotify v0.0.0-20180710141335-d9becc38acbd h1:+iAPaTbi1gZpcpDwe/BW1fx7Xoesv69hLNGPheoyhBs=
github.com/okzk/sdnotify v0.0.0-20180710141335-d9becc38acbd/go.mod h1:4soZNh0zW0LtYGdQ416i0jO0EIqMGcbtaspRS4BDvRQ=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI=
github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8=
github.com/tidwall/btree v1.4.2 h1:PpkaieETJMUxYNADsjgtNRcERX7mGc/GP2zp/r5FM3g=
github.com/tidwall/btree v1.4.2/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE=
github.com/tidwall/buntdb v1.3.2 h1:qd+IpdEGs0pZci37G4jF51+fSKlkuUTMXuHhXL1AkKg=
github.com/tidwall/buntdb v1.3.2/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU=
github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw=
github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/grect v0.1.4 h1:dA3oIgNgWdSspFzn1kS4S/RDpZFLrIxAZOdJKjYapOg=
github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q=
github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8=
github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/rtred v0.1.2 h1:exmoQtOLvDoO8ud++6LwVsAMTu0KPzLTUrMln8u1yu8=
github.com/tidwall/rtred v0.1.2/go.mod h1:hd69WNXQ5RP9vHd7dqekAz+RIdtfBogmglkZSRxCHFQ=
github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaymYE=
github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q096fQP5zMYw=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc=
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

76
irc/accept.go Normal file
View File

@ -0,0 +1,76 @@
package irc
import (
"sync"
"github.com/ergochat/ergo/irc/utils"
)
// tracks ACCEPT relationships, i.e., `accepter` is willing to receive DMs from
// `accepted` despite some restriction (currently the only relevant restriction
// is that `accepter` is +R and `accepted` is not logged in)
type AcceptManager struct {
sync.RWMutex
// maps recipient -> whitelist of permitted senders:
// this is what we actually check
clientToAccepted map[*Client]utils.HashSet[*Client]
// this is the reverse mapping, it's needed so we can
// clean up the forward mapping during (*Client).destroy():
clientToAccepters map[*Client]utils.HashSet[*Client]
}
func (am *AcceptManager) Initialize() {
am.clientToAccepted = make(map[*Client]utils.HashSet[*Client])
am.clientToAccepters = make(map[*Client]utils.HashSet[*Client])
}
func (am *AcceptManager) MaySendTo(sender, recipient *Client) (result bool) {
am.RLock()
defer am.RUnlock()
return am.clientToAccepted[recipient].Has(sender)
}
func (am *AcceptManager) Accept(accepter, accepted *Client) {
am.Lock()
defer am.Unlock()
var m utils.HashSet[*Client]
m = am.clientToAccepted[accepter]
if m == nil {
m = make(utils.HashSet[*Client])
am.clientToAccepted[accepter] = m
}
m.Add(accepted)
m = am.clientToAccepters[accepted]
if m == nil {
m = make(utils.HashSet[*Client])
am.clientToAccepters[accepted] = m
}
m.Add(accepter)
}
func (am *AcceptManager) Unaccept(accepter, accepted *Client) {
am.Lock()
defer am.Unlock()
delete(am.clientToAccepted[accepter], accepted)
delete(am.clientToAccepters[accepted], accepter)
}
func (am *AcceptManager) Remove(client *Client) {
am.Lock()
defer am.Unlock()
for accepter := range am.clientToAccepters[client] {
delete(am.clientToAccepted[accepter], client)
}
for accepted := range am.clientToAccepted[client] {
delete(am.clientToAccepters[accepted], client)
}
delete(am.clientToAccepters, client)
delete(am.clientToAccepted, client)
}

108
irc/accept_test.go Normal file
View File

@ -0,0 +1,108 @@
package irc
import (
"testing"
)
func TestAccept(t *testing.T) {
var am AcceptManager
am.Initialize()
alice := new(Client)
bob := new(Client)
eve := new(Client)
// must not panic:
am.Unaccept(eve, bob)
assertEqual(am.MaySendTo(alice, bob), false)
assertEqual(am.MaySendTo(bob, alice), false)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), false)
am.Accept(alice, bob)
assertEqual(am.MaySendTo(alice, bob), false)
assertEqual(am.MaySendTo(bob, alice), true)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), false)
am.Accept(bob, alice)
assertEqual(am.MaySendTo(alice, bob), true)
assertEqual(am.MaySendTo(bob, alice), true)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), false)
am.Accept(bob, eve)
assertEqual(am.MaySendTo(alice, bob), true)
assertEqual(am.MaySendTo(bob, alice), true)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), true)
am.Accept(eve, bob)
assertEqual(am.MaySendTo(alice, bob), true)
assertEqual(am.MaySendTo(bob, alice), true)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), true)
assertEqual(am.MaySendTo(eve, bob), true)
am.Unaccept(eve, bob)
assertEqual(am.MaySendTo(alice, bob), true)
assertEqual(am.MaySendTo(bob, alice), true)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), true)
am.Remove(alice)
assertEqual(am.MaySendTo(alice, bob), false)
assertEqual(am.MaySendTo(bob, alice), false)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), true)
am.Remove(bob)
assertEqual(am.MaySendTo(alice, bob), false)
assertEqual(am.MaySendTo(bob, alice), false)
assertEqual(am.MaySendTo(alice, eve), false)
assertEqual(am.MaySendTo(eve, alice), false)
assertEqual(am.MaySendTo(bob, eve), false)
assertEqual(am.MaySendTo(eve, bob), false)
}
func TestAcceptInternal(t *testing.T) {
var am AcceptManager
am.Initialize()
alice := new(Client)
bob := new(Client)
eve := new(Client)
am.Accept(alice, bob)
am.Accept(bob, alice)
am.Accept(bob, eve)
am.Remove(alice)
am.Remove(bob)
// assert that there is no memory leak
for _, client := range []*Client{alice, bob, eve} {
assertEqual(len(am.clientToAccepted[client]), 0)
assertEqual(len(am.clientToAccepters[client]), 0)
}
}

File diff suppressed because it is too large Load Diff

311
irc/api.go Normal file
View File

@ -0,0 +1,311 @@
package irc
import (
"crypto/subtle"
"encoding/json"
"fmt"
"net/http"
"runtime"
"strings"
"github.com/ergochat/ergo/irc/utils"
)
func newAPIHandler(server *Server) http.Handler {
api := &ergoAPI{
server: server,
mux: http.NewServeMux(),
}
api.mux.HandleFunc("POST /v1/rehash", api.handleRehash)
api.mux.HandleFunc("POST /v1/check_auth", api.handleCheckAuth)
api.mux.HandleFunc("POST /v1/saregister", api.handleSaregister)
api.mux.HandleFunc("POST /v1/account_details", api.handleAccountDetails)
api.mux.HandleFunc("POST /v1/account_list", api.handleAccountList)
api.mux.HandleFunc("POST /v1/status", api.handleStatus)
return api
}
type ergoAPI struct {
server *Server
mux *http.ServeMux
}
func (a *ergoAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer a.server.HandlePanic(nil)
defer a.server.logger.Debug("api", r.URL.Path)
if a.checkBearerAuth(r.Header.Get("Authorization")) {
a.mux.ServeHTTP(w, r)
} else {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
}
}
func (a *ergoAPI) checkBearerAuth(authHeader string) (authorized bool) {
if authHeader == "" {
return false
}
c := a.server.Config()
if !c.API.Enabled {
return false
}
spaceIdx := strings.IndexByte(authHeader, ' ')
if spaceIdx < 0 {
return false
}
if !strings.EqualFold("Bearer", authHeader[:spaceIdx]) {
return false
}
providedTokenBytes := []byte(authHeader[spaceIdx+1:])
for _, tokenBytes := range c.API.bearerTokenBytes {
if subtle.ConstantTimeCompare(tokenBytes, providedTokenBytes) == 1 {
return true
}
}
return false
}
func (a *ergoAPI) decodeJSONRequest(request any, w http.ResponseWriter, r *http.Request) (err error) {
err = json.NewDecoder(r.Body).Decode(request)
if err != nil {
http.Error(w, fmt.Sprintf("failed to deserialize json request: %v", err), http.StatusBadRequest)
}
return err
}
func (a *ergoAPI) writeJSONResponse(response any, w http.ResponseWriter, r *http.Request) {
j, err := json.Marshal(response)
if err == nil {
j = append(j, '\n') // less annoying in curl output
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(j)
} else {
a.server.logger.Error("internal", "failed to serialize API response", r.URL.Path, err.Error())
http.Error(w, fmt.Sprintf("failed to serialize json response: %v", err), http.StatusInternalServerError)
}
}
type apiGenericResponse struct {
Success bool `json:"success"`
Error string `json:"error,omitempty"`
ErrorCode string `json:"errorCode,omitempty"`
}
func (a *ergoAPI) handleRehash(w http.ResponseWriter, r *http.Request) {
var response apiGenericResponse
err := a.server.rehash()
if err == nil {
response.Success = true
} else {
response.Success = false
response.Error = err.Error()
}
a.writeJSONResponse(response, w, r)
}
type apiCheckAuthResponse struct {
apiGenericResponse
AccountName string `json:"accountName,omitempty"`
}
func (a *ergoAPI) handleCheckAuth(w http.ResponseWriter, r *http.Request) {
var request AuthScriptInput
if err := a.decodeJSONRequest(&request, w, r); err != nil {
return
}
var response apiCheckAuthResponse
// try passphrase if present
if request.AccountName != "" && request.Passphrase != "" {
account, err := a.server.accounts.checkPassphrase(request.AccountName, request.Passphrase)
switch err {
case nil:
// success, no error
response.Success = true
response.AccountName = account.Name
case errAccountDoesNotExist, errAccountInvalidCredentials, errAccountUnverified, errAccountSuspended:
// fail, no error
response.Success = false
default:
response.Success = false
response.Error = err.Error()
}
}
// try certfp if present
if !response.Success && request.Certfp != "" {
// TODO support cerftp
}
a.writeJSONResponse(response, w, r)
}
type apiSaregisterRequest struct {
AccountName string `json:"accountName"`
Passphrase string `json:"passphrase"`
}
func (a *ergoAPI) handleSaregister(w http.ResponseWriter, r *http.Request) {
var request apiSaregisterRequest
if err := a.decodeJSONRequest(&request, w, r); err != nil {
return
}
var response apiGenericResponse
err := a.server.accounts.SARegister(request.AccountName, request.Passphrase)
if err == nil {
response.Success = true
} else {
response.Success = false
response.Error = err.Error()
switch err {
case errAccountAlreadyRegistered, errAccountAlreadyVerified, errNameReserved:
response.ErrorCode = "ACCOUNT_EXISTS"
case errAccountBadPassphrase:
response.ErrorCode = "INVALID_PASSPHRASE"
default:
response.ErrorCode = "UNKNOWN_ERROR"
}
}
a.writeJSONResponse(response, w, r)
}
type apiAccountDetailsResponse struct {
apiGenericResponse
AccountName string `json:"accountName,omitempty"`
Email string `json:"email,omitempty"`
RegisteredAt string `json:"registeredAt,omitempty"`
Channels []string `json:"channels,omitempty"`
}
type apiAccountDetailsRequest struct {
AccountName string `json:"accountName"`
}
func (a *ergoAPI) handleAccountDetails(w http.ResponseWriter, r *http.Request) {
var request apiAccountDetailsRequest
if err := a.decodeJSONRequest(&request, w, r); err != nil {
return
}
var response apiAccountDetailsResponse
if request.AccountName != "" {
accountData, err := a.server.accounts.LoadAccount(request.AccountName)
if err == nil {
if !accountData.Verified {
err = errAccountUnverified
} else if accountData.Suspended != nil {
err = errAccountSuspended
}
}
switch err {
case nil:
response.AccountName = accountData.Name
response.Email = accountData.Settings.Email
if !accountData.RegisteredAt.IsZero() {
response.RegisteredAt = accountData.RegisteredAt.Format(utils.IRCv3TimestampFormat)
}
// Get channels the account is in
response.Channels = a.server.channels.ChannelsForAccount(accountData.NameCasefolded)
response.Success = true
case errAccountDoesNotExist, errAccountUnverified, errAccountSuspended:
response.Success = false
default:
response.Success = false
response.ErrorCode = "UNKNOWN_ERROR"
response.Error = err.Error()
}
} else {
response.Success = false
response.ErrorCode = "INVALID_REQUEST"
}
a.writeJSONResponse(response, w, r)
}
type apiAccountListResponse struct {
apiGenericResponse
Accounts []apiAccountDetailsResponse `json:"accounts"`
TotalCount int `json:"totalCount"`
}
func (a *ergoAPI) handleAccountList(w http.ResponseWriter, r *http.Request) {
var response apiAccountListResponse
// Get all account names
accounts := a.server.accounts.AllNicks()
response.TotalCount = len(accounts)
// Load account details
response.Accounts = make([]apiAccountDetailsResponse, len(accounts))
for i, account := range accounts {
accountData, err := a.server.accounts.LoadAccount(account)
if err != nil {
response.Accounts[i] = apiAccountDetailsResponse{
apiGenericResponse: apiGenericResponse{
Success: false,
Error: err.Error(),
},
}
continue
}
response.Accounts[i] = apiAccountDetailsResponse{
apiGenericResponse: apiGenericResponse{
Success: true,
},
AccountName: accountData.Name,
Email: accountData.Settings.Email,
}
}
response.Success = true
a.writeJSONResponse(response, w, r)
}
type apiStatusResponse struct {
apiGenericResponse
Version string `json:"version"`
GoVersion string `json:"go_version"`
Commit string `json:"commit,omitempty"`
StartTime string `json:"start_time"`
Users struct {
Total int `json:"total"`
Invisible int `json:"invisible"`
Operators int `json:"operators"`
Unknown int `json:"unknown"`
Max int `json:"max"`
} `json:"users"`
Channels int `json:"channels"`
Servers int `json:"servers"`
}
func (a *ergoAPI) handleStatus(w http.ResponseWriter, r *http.Request) {
server := a.server
stats := server.stats.GetValues()
response := apiStatusResponse{
apiGenericResponse: apiGenericResponse{Success: true},
Version: SemVer,
GoVersion: runtime.Version(),
Commit: Commit,
StartTime: server.ctime.Format(utils.IRCv3TimestampFormat),
}
response.Users.Total = stats.Total
response.Users.Invisible = stats.Invisible
response.Users.Operators = stats.Operators
response.Users.Unknown = stats.Unknown
response.Users.Max = stats.Max
response.Channels = server.channels.Len()
response.Servers = 1
a.writeJSONResponse(response, w, r)
}

115
irc/authscript.go Normal file
View File

@ -0,0 +1,115 @@
// Copyright (c) 2020 Shivaram Lingamneni
// released under the MIT license
package irc
import (
"crypto/x509"
"encoding/json"
"encoding/pem"
"fmt"
"net"
"github.com/ergochat/ergo/irc/oauth2"
"github.com/ergochat/ergo/irc/utils"
)
// JSON-serializable input and output types for the script
type AuthScriptInput struct {
AccountName string `json:"accountName,omitempty"`
Passphrase string `json:"passphrase,omitempty"`
Certfp string `json:"certfp,omitempty"`
PeerCerts []string `json:"peerCerts,omitempty"`
peerCerts []*x509.Certificate
IP string `json:"ip,omitempty"`
OAuthBearer *oauth2.OAuthBearerOptions `json:"oauth2,omitempty"`
}
type AuthScriptOutput struct {
AccountName string `json:"accountName"`
Success bool `json:"success"`
Error string `json:"error"`
}
func CheckAuthScript(sem utils.Semaphore, config ScriptConfig, input AuthScriptInput) (output AuthScriptOutput, err error) {
if sem != nil {
sem.Acquire()
defer sem.Release()
}
// PEM-encode the peer certificates before applying JSON
if len(input.peerCerts) != 0 {
input.PeerCerts = make([]string, len(input.peerCerts))
for i, cert := range input.peerCerts {
input.PeerCerts[i] = string(pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}))
}
}
inputBytes, err := json.Marshal(input)
if err != nil {
return
}
outBytes, err := RunScript(config.Command, config.Args, inputBytes, config.Timeout, config.KillTimeout)
if err != nil {
return
}
err = json.Unmarshal(outBytes, &output)
if err != nil {
return
}
if output.Error != "" {
err = fmt.Errorf("Authentication process reported error: %s", output.Error)
}
return
}
type IPScriptResult uint
const (
IPNotChecked IPScriptResult = 0
IPAccepted IPScriptResult = 1
IPBanned IPScriptResult = 2
IPRequireSASL IPScriptResult = 3
)
type IPScriptInput struct {
IP string `json:"ip"`
}
type IPScriptOutput struct {
Result IPScriptResult `json:"result"`
BanMessage string `json:"banMessage"`
// for caching: the network to which this result is applicable, and a TTL in seconds:
CacheNet string `json:"cacheNet"`
CacheSeconds int `json:"cacheSeconds"`
Error string `json:"error"`
}
func CheckIPBan(sem utils.Semaphore, config IPCheckScriptConfig, addr net.IP) (output IPScriptOutput, err error) {
if sem != nil {
sem.Acquire()
defer sem.Release()
}
inputBytes, err := json.Marshal(IPScriptInput{IP: addr.String()})
if err != nil {
return
}
outBytes, err := RunScript(config.Command, config.Args, inputBytes, config.Timeout, config.KillTimeout)
if err != nil {
return
}
err = json.Unmarshal(outBytes, &output)
if err != nil {
return
}
if output.Error != "" {
err = fmt.Errorf("IP ban process reported error: %s", output.Error)
} else if !(IPAccepted <= output.Result && output.Result <= IPRequireSASL) {
err = fmt.Errorf("Invalid result from IP checking script: %d", output.Result)
}
return
}

107
irc/bunt/bunt_datastore.go Normal file
View File

@ -0,0 +1,107 @@
// Copyright (c) 2022 Shivaram Lingamneni
// released under the MIT license
package bunt
import (
"fmt"
"strings"
"time"
"github.com/tidwall/buntdb"
"github.com/ergochat/ergo/irc/datastore"
"github.com/ergochat/ergo/irc/logger"
"github.com/ergochat/ergo/irc/utils"
)
// BuntKey yields a string key corresponding to a (table, UUID) pair.
// Ideally this would not be public, but some of the migration code
// needs it.
func BuntKey(table datastore.Table, uuid utils.UUID) string {
return fmt.Sprintf("%x %s", table, uuid.String())
}
// buntdbDatastore implements datastore.Datastore using a buntdb.
type buntdbDatastore struct {
db *buntdb.DB
logger *logger.Manager
}
// NewBuntdbDatastore returns a datastore.Datastore backed by buntdb.
func NewBuntdbDatastore(db *buntdb.DB, logger *logger.Manager) datastore.Datastore {
return &buntdbDatastore{
db: db,
logger: logger,
}
}
func (b *buntdbDatastore) Backoff() time.Duration {
return 0
}
func (b *buntdbDatastore) GetAll(table datastore.Table) (result []datastore.KV, err error) {
tablePrefix := fmt.Sprintf("%x ", table)
err = b.db.View(func(tx *buntdb.Tx) error {
err := tx.AscendGreaterOrEqual("", tablePrefix, func(key, value string) bool {
encUUID, ok := strings.CutPrefix(key, tablePrefix)
if !ok {
return false
}
uuid, err := utils.DecodeUUID(encUUID)
if err == nil {
result = append(result, datastore.KV{UUID: uuid, Value: []byte(value)})
} else {
b.logger.Error("datastore", "invalid uuid", key)
}
return true
})
return err
})
return
}
func (b *buntdbDatastore) Get(table datastore.Table, uuid utils.UUID) (value []byte, err error) {
buntKey := BuntKey(table, uuid)
var result string
err = b.db.View(func(tx *buntdb.Tx) error {
result, err = tx.Get(buntKey)
return err
})
return []byte(result), err
}
func (b *buntdbDatastore) Set(table datastore.Table, uuid utils.UUID, value []byte, expiration time.Time) (err error) {
buntKey := BuntKey(table, uuid)
var setOptions *buntdb.SetOptions
if !expiration.IsZero() {
ttl := time.Until(expiration)
if ttl > 0 {
setOptions = &buntdb.SetOptions{Expires: true, TTL: ttl}
} else {
return nil // it already expired, i guess?
}
}
strVal := string(value)
err = b.db.Update(func(tx *buntdb.Tx) error {
_, _, err := tx.Set(buntKey, strVal, setOptions)
return err
})
return
}
func (b *buntdbDatastore) Delete(table datastore.Table, key utils.UUID) (err error) {
buntKey := BuntKey(table, key)
err = b.db.Update(func(tx *buntdb.Tx) error {
_, err := tx.Delete(buntKey)
return err
})
// deleting a nonexistent key is not considered an error
switch err {
case buntdb.ErrNotFound:
return nil
default:
return err
}
}

View File

@ -1,173 +0,0 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2016- Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"strings"
"github.com/DanielOaks/girc-go/ircmsg"
)
// Capabilities are optional features a client may request from a server.
type Capability string
const (
AccountTag Capability = "account-tag"
AccountNotify Capability = "account-notify"
AwayNotify Capability = "away-notify"
CapNotify Capability = "cap-notify"
EchoMessage Capability = "echo-message"
ExtendedJoin Capability = "extended-join"
InviteNotify Capability = "invite-notify"
MessageTags Capability = "draft/message-tags"
MultiPrefix Capability = "multi-prefix"
SASL Capability = "sasl"
ServerTime Capability = "server-time"
UserhostInNames Capability = "userhost-in-names"
)
var (
SupportedCapabilities = CapabilitySet{
AccountTag: true,
AccountNotify: true,
AwayNotify: true,
CapNotify: true,
EchoMessage: true,
ExtendedJoin: true,
InviteNotify: true,
MessageTags: true,
MultiPrefix: true,
// SASL is set during server startup
ServerTime: true,
UserhostInNames: true,
}
CapValues = map[Capability]string{
SASL: "PLAIN,EXTERNAL",
}
)
func (capability Capability) String() string {
return string(capability)
}
// CapModifiers are indicators showing the state of a capability after a REQ or
// ACK.
type CapModifier rune
const (
Ack CapModifier = '~'
Disable CapModifier = '-'
Sticky CapModifier = '='
)
func (mod CapModifier) String() string {
return string(mod)
}
type CapState uint
const (
CapNone CapState = iota
CapNegotiating CapState = iota
CapNegotiated CapState = iota
)
// CapVersion is used to select which max version of CAP the client supports.
type CapVersion uint
const (
// Cap301 refers to the base CAP spec.
Cap301 CapVersion = 301
// Cap302 refers to the IRCv3.2 CAP spec.
Cap302 CapVersion = 302
)
// CapabilitySet is used to track supported, enabled, and existing caps.
type CapabilitySet map[Capability]bool
func (set CapabilitySet) String(version CapVersion) string {
strs := make([]string, len(set))
index := 0
for capability := range set {
capString := string(capability)
if version == Cap302 {
val, exists := CapValues[capability]
if exists {
capString += "=" + val
}
}
strs[index] = capString
index++
}
return strings.Join(strs, " ")
}
func (set CapabilitySet) DisableString() string {
parts := make([]string, len(set))
index := 0
for capability := range set {
parts[index] = Disable.String() + capability.String()
index += 1
}
return strings.Join(parts, " ")
}
// CAP <subcmd> [<caps>]
func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
subCommand := strings.ToUpper(msg.Params[0])
capabilities := make(CapabilitySet)
var capString string
if len(msg.Params) > 1 {
capString = msg.Params[1]
strs := strings.Split(capString, " ")
for _, str := range strs {
if len(str) > 0 {
capabilities[Capability(str)] = true
}
}
}
switch subCommand {
case "LS":
if !client.registered {
client.capState = CapNegotiating
}
if len(msg.Params) > 1 && msg.Params[1] == "302" {
client.capVersion = 302
}
// weechat 1.4 has a bug here where it won't accept the CAP reply unless it contains
// the server.name source... otherwise it doesn't respond to the CAP message with
// anything and just hangs on connection.
//TODO(dan): limit number of caps and send it multiline in 3.2 style as appropriate.
client.Send(nil, server.name, "CAP", client.nick, subCommand, SupportedCapabilities.String(client.capVersion))
case "LIST":
client.Send(nil, server.name, "CAP", client.nick, subCommand, client.capabilities.String(Cap301)) // values not sent on LIST so force 3.1
case "REQ":
// make sure all capabilities actually exist
for capability := range capabilities {
if !SupportedCapabilities[capability] {
client.Send(nil, server.name, "CAP", client.nick, "NAK", capString)
return false
}
}
for capability := range capabilities {
client.capabilities[capability] = true
}
client.Send(nil, server.name, "CAP", client.nick, "ACK", capString)
case "END":
if !client.registered {
client.capState = CapNegotiated
server.tryRegister(client)
}
default:
client.Send(nil, server.name, ERR_INVALIDCAPCMD, client.nick, subCommand, "Invalid CAP subcommand")
}
return false
}

75
irc/caps/constants.go Normal file
View File

@ -0,0 +1,75 @@
// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package caps
import "errors"
// Capability represents an optional feature that a client may request from the server.
type Capability uint
// actual capability definitions appear in defs.go
var (
nameToCapability map[string]Capability
NoSuchCap = errors.New("Unsupported capability name")
)
// Name returns the name of the given capability.
func (capability Capability) Name() string {
return capabilityNames[capability]
}
func NameToCapability(name string) (result Capability, err error) {
result, found := nameToCapability[name]
if !found {
err = NoSuchCap
}
return
}
// Version is used to select which max version of CAP the client supports.
type Version uint
const (
// Cap301 refers to the base CAP spec.
Cap301 Version = 301
// Cap302 refers to the IRCv3.2 CAP spec.
Cap302 Version = 302
)
// State shows whether we're negotiating caps, finished, etc for connection registration.
type State uint
const (
// NoneState means CAP hasn't been negotiated at all.
NoneState State = iota
// NegotiatingState means CAP is being negotiated and registration should be paused.
NegotiatingState State = iota
// NegotiatedState means CAP negotiation has been successfully ended and reg should complete.
NegotiatedState State = iota
)
const (
// LabelTagName is the tag name used for the labeled-response spec.
// https://ircv3.net/specs/extensions/labeled-response.html
LabelTagName = "label"
// More draft names associated with draft/multiline:
MultilineBatchType = "draft/multiline"
MultilineConcatTag = "draft/multiline-concat"
// draft/relaymsg:
RelaymsgTagName = "draft/relaymsg"
// BOT mode: https://ircv3.net/specs/extensions/bot-mode
BotTagName = "bot"
// https://ircv3.net/specs/extensions/chathistory
ChathistoryTargetsBatchType = "draft/chathistory-targets"
ExtendedISupportBatchType = "draft/isupport"
)
func init() {
nameToCapability = make(map[string]Capability, numCapabs)
for capab, name := range capabilityNames {
nameToCapability[name] = Capability(capab)
}
}

211
irc/caps/defs.go Normal file
View File

@ -0,0 +1,211 @@
package caps
/*
WARNING: this file is autogenerated by `make capdefs`
DO NOT EDIT MANUALLY.
*/
const (
// number of recognized capabilities:
numCapabs = 38
// length of the uint32 array that represents the bitset:
bitsetLen = 2
)
const (
// AccountNotify is the IRCv3 capability named "account-notify":
// https://ircv3.net/specs/extensions/account-notify-3.1.html
AccountNotify Capability = iota
// AccountTag is the IRCv3 capability named "account-tag":
// https://ircv3.net/specs/extensions/account-tag-3.2.html
AccountTag Capability = iota
// AwayNotify is the IRCv3 capability named "away-notify":
// https://ircv3.net/specs/extensions/away-notify-3.1.html
AwayNotify Capability = iota
// Batch is the IRCv3 capability named "batch":
// https://ircv3.net/specs/extensions/batch-3.2.html
Batch Capability = iota
// CapNotify is the IRCv3 capability named "cap-notify":
// https://ircv3.net/specs/extensions/cap-notify-3.2.html
CapNotify Capability = iota
// ChgHost is the IRCv3 capability named "chghost":
// https://ircv3.net/specs/extensions/chghost-3.2.html
ChgHost Capability = iota
// AccountRegistration is the draft IRCv3 capability named "draft/account-registration":
// https://github.com/ircv3/ircv3-specifications/pull/435
AccountRegistration Capability = iota
// ChannelRename is the draft IRCv3 capability named "draft/channel-rename":
// https://ircv3.net/specs/extensions/channel-rename
ChannelRename Capability = iota
// Chathistory is the proposed IRCv3 capability named "draft/chathistory":
// https://github.com/ircv3/ircv3-specifications/pull/393
Chathistory Capability = iota
// EventPlayback is the proposed IRCv3 capability named "draft/event-playback":
// https://github.com/ircv3/ircv3-specifications/pull/362
EventPlayback Capability = iota
// ExtendedISupport is the proposed IRCv3 capability named "draft/extended-isupport":
// https://github.com/ircv3/ircv3-specifications/pull/543
ExtendedISupport Capability = iota
// Languages is the proposed IRCv3 capability named "draft/languages":
// https://gist.github.com/DanielOaks/8126122f74b26012a3de37db80e4e0c6
Languages Capability = iota
// MessageRedaction is the proposed IRCv3 capability named "draft/message-redaction":
// https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md
MessageRedaction Capability = iota
// Metadata is the draft IRCv3 capability named "draft/metadata-2":
// https://ircv3.net/specs/extensions/metadata
Metadata Capability = iota
// Multiline is the proposed IRCv3 capability named "draft/multiline":
// https://github.com/ircv3/ircv3-specifications/pull/398
Multiline Capability = iota
// NoImplicitNames is the proposed IRCv3 capability named "draft/no-implicit-names":
// https://github.com/ircv3/ircv3-specifications/pull/527
NoImplicitNames Capability = iota
// Persistence is the proposed IRCv3 capability named "draft/persistence":
// https://github.com/ircv3/ircv3-specifications/pull/503
Persistence Capability = iota
// Preaway is the proposed IRCv3 capability named "draft/pre-away":
// https://github.com/ircv3/ircv3-specifications/pull/514
Preaway Capability = iota
// ReadMarker is the draft IRCv3 capability named "draft/read-marker":
// https://github.com/ircv3/ircv3-specifications/pull/489
ReadMarker Capability = iota
// Relaymsg is the proposed IRCv3 capability named "draft/relaymsg":
// https://github.com/ircv3/ircv3-specifications/pull/417
Relaymsg Capability = iota
// WebPush is the proposed IRCv3 capability named "draft/webpush":
// https://github.com/ircv3/ircv3-specifications/pull/471
WebPush Capability = iota
// EchoMessage is the IRCv3 capability named "echo-message":
// https://ircv3.net/specs/extensions/echo-message-3.2.html
EchoMessage Capability = iota
// Nope is the Ergo vendor capability named "ergo.chat/nope":
// https://ergo.chat/nope
Nope Capability = iota
// ExtendedJoin is the IRCv3 capability named "extended-join":
// https://ircv3.net/specs/extensions/extended-join-3.1.html
ExtendedJoin Capability = iota
// ExtendedMonitor is the IRCv3 capability named "extended-monitor":
// https://ircv3.net/specs/extensions/extended-monitor.html
ExtendedMonitor Capability = iota
// InviteNotify is the IRCv3 capability named "invite-notify":
// https://ircv3.net/specs/extensions/invite-notify-3.2.html
InviteNotify Capability = iota
// LabeledResponse is the IRCv3 capability named "labeled-response":
// https://ircv3.net/specs/extensions/labeled-response.html
LabeledResponse Capability = iota
// MessageTags is the IRCv3 capability named "message-tags":
// https://ircv3.net/specs/extensions/message-tags.html
MessageTags Capability = iota
// MultiPrefix is the IRCv3 capability named "multi-prefix":
// https://ircv3.net/specs/extensions/multi-prefix-3.1.html
MultiPrefix Capability = iota
// SASL is the IRCv3 capability named "sasl":
// https://ircv3.net/specs/extensions/sasl-3.2.html
SASL Capability = iota
// ServerTime is the IRCv3 capability named "server-time":
// https://ircv3.net/specs/extensions/server-time-3.2.html
ServerTime Capability = iota
// SetName is the IRCv3 capability named "setname":
// https://ircv3.net/specs/extensions/setname.html
SetName Capability = iota
// SojuWebPush is the Soju/Goguma vendor capability named "soju.im/webpush":
// https://github.com/ircv3/ircv3-specifications/pull/471
SojuWebPush Capability = iota
// StandardReplies is the IRCv3 capability named "standard-replies":
// https://github.com/ircv3/ircv3-specifications/pull/506
StandardReplies Capability = iota
// STS is the IRCv3 capability named "sts":
// https://ircv3.net/specs/extensions/sts.html
STS Capability = iota
// UserhostInNames is the IRCv3 capability named "userhost-in-names":
// https://ircv3.net/specs/extensions/userhost-in-names-3.2.html
UserhostInNames Capability = iota
// ZNCPlayback is the ZNC vendor capability named "znc.in/playback":
// https://wiki.znc.in/Playback
ZNCPlayback Capability = iota
// ZNCSelfMessage is the ZNC vendor capability named "znc.in/self-message":
// https://wiki.znc.in/Query_buffers
ZNCSelfMessage Capability = iota
)
// `capabilityNames[capab]` is the string name of the capability `capab`
var (
capabilityNames = [numCapabs]string{
"account-notify",
"account-tag",
"away-notify",
"batch",
"cap-notify",
"chghost",
"draft/account-registration",
"draft/channel-rename",
"draft/chathistory",
"draft/event-playback",
"draft/extended-isupport",
"draft/languages",
"draft/message-redaction",
"draft/metadata-2",
"draft/multiline",
"draft/no-implicit-names",
"draft/persistence",
"draft/pre-away",
"draft/read-marker",
"draft/relaymsg",
"draft/webpush",
"echo-message",
"ergo.chat/nope",
"extended-join",
"extended-monitor",
"invite-notify",
"labeled-response",
"message-tags",
"multi-prefix",
"sasl",
"server-time",
"setname",
"soju.im/webpush",
"standard-replies",
"sts",
"userhost-in-names",
"znc.in/playback",
"znc.in/self-message",
}
)

143
irc/caps/set.go Normal file
View File

@ -0,0 +1,143 @@
// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package caps
import (
"fmt"
"github.com/ergochat/ergo/irc/utils"
)
// Set holds a set of enabled capabilities.
type Set [bitsetLen]uint32
// Values holds capability values.
type Values map[Capability]string
// NewSet returns a new Set, with the given capabilities enabled.
func NewSet(capabs ...Capability) *Set {
var newSet Set
newSet.Enable(capabs...)
return &newSet
}
// NewCompleteSet returns a new Set, with all defined capabilities enabled.
func NewCompleteSet() *Set {
var newSet Set
asSlice := newSet[:]
for i := 0; i < numCapabs; i += 1 {
utils.BitsetSet(asSlice, uint(i), true)
}
return &newSet
}
// Enable enables the given capabilities.
func (s *Set) Enable(capabs ...Capability) {
asSlice := s[:]
for _, capab := range capabs {
utils.BitsetSet(asSlice, uint(capab), true)
}
}
// Disable disables the given capabilities.
func (s *Set) Disable(capabs ...Capability) {
asSlice := s[:]
for _, capab := range capabs {
utils.BitsetSet(asSlice, uint(capab), false)
}
}
// Add adds the given capabilities to this set.
// this is just a wrapper to allow more clear use.
func (s *Set) Add(capabs ...Capability) {
s.Enable(capabs...)
}
// Remove removes the given capabilities from this set.
// this is just a wrapper to allow more clear use.
func (s *Set) Remove(capabs ...Capability) {
s.Disable(capabs...)
}
// Has returns true if this set has the given capability.
func (s *Set) Has(capab Capability) bool {
return utils.BitsetGet(s[:], uint(capab))
}
// HasAll returns true if the set has all the given capabilities.
func (s *Set) HasAll(capabs ...Capability) bool {
for _, capab := range capabs {
if !s.Has(capab) {
return false
}
}
return true
}
// Union adds all the capabilities of another set to this set.
func (s *Set) Union(other *Set) {
utils.BitsetUnion(s[:], other[:])
}
// Subtract removes all the capabilities of another set from this set.
func (s *Set) Subtract(other *Set) {
utils.BitsetSubtract(s[:], other[:])
}
// Empty returns whether the set is empty.
func (s *Set) Empty() bool {
return utils.BitsetEmpty(s[:])
}
const defaultMaxPayloadLength = 450
// Strings returns all of our enabled capabilities as a slice of strings.
func (s *Set) Strings(version Version, values Values, maxLen int) (result []string) {
if maxLen == 0 {
maxLen = defaultMaxPayloadLength
}
var t utils.TokenLineBuilder
t.Initialize(maxLen, " ")
var capab Capability
asSlice := s[:]
for capab = 0; capab < numCapabs; capab++ {
// XXX clients that only support CAP LS 301 cannot handle multiline
// responses. omit some CAPs in this case, forcing the response to fit on
// a single line. this is technically buggy for CAP LIST (as opposed to LS)
// but it shouldn't matter
if version < Cap302 && !isAllowed301(capab) {
continue
}
// skip any capabilities that are not enabled
if !utils.BitsetGet(asSlice, uint(capab)) {
continue
}
capString := capab.Name()
if version >= Cap302 {
val, exists := values[capab]
if exists {
capString = fmt.Sprintf("%s=%s", capString, val)
}
}
t.Add(capString)
}
result = t.Lines()
if result == nil {
result = []string{""}
}
return
}
// this is a fixed whitelist of caps that are eligible for display in CAP LS 301
func isAllowed301(capab Capability) bool {
switch capab {
case AccountNotify, AccountTag, AwayNotify, Batch, ChgHost, Chathistory, EventPlayback,
Relaymsg, EchoMessage, Nope, ExtendedJoin, InviteNotify, LabeledResponse, MessageTags,
MultiPrefix, SASL, ServerTime, SetName, STS, UserhostInNames, ZNCSelfMessage, ZNCPlayback:
return true
default:
return false
}
}

109
irc/caps/set_test.go Normal file
View File

@ -0,0 +1,109 @@
// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package caps
import (
"fmt"
"reflect"
"testing"
)
func TestSets(t *testing.T) {
s1 := NewSet()
s1.Enable(AccountTag, EchoMessage, UserhostInNames)
if !(s1.Has(AccountTag) && s1.Has(EchoMessage) && s1.Has(UserhostInNames)) {
t.Error("Did not have the tags we expected")
}
if s1.Has(STS) {
t.Error("Has() returned true when we don't have the given capability")
}
s1.Disable(AccountTag)
if s1.Has(AccountTag) {
t.Error("Disable() did not correctly disable the given capability")
}
enabledCaps := NewSet()
enabledCaps.Union(s1)
expectedCaps := NewSet(EchoMessage, UserhostInNames)
if !reflect.DeepEqual(enabledCaps, expectedCaps) {
t.Errorf("Enabled and expected capability lists do not match: %v, %v", enabledCaps, expectedCaps)
}
// make sure re-enabling doesn't add to the count or something weird like that
s1.Enable(EchoMessage)
// make sure add and remove work fine
s1.Add(InviteNotify)
s1.Remove(EchoMessage)
if !s1.Has(InviteNotify) || s1.Has(EchoMessage) {
t.Error("Add/Remove don't work")
}
// test Strings()
values := make(Values)
values[InviteNotify] = "invitemepls"
actualCap301ValuesString := s1.Strings(Cap301, values, 0)
expectedCap301ValuesString := []string{"invite-notify userhost-in-names"}
if !reflect.DeepEqual(actualCap301ValuesString, expectedCap301ValuesString) {
t.Errorf("Generated Cap301 values string [%v] did not match expected values string [%v]", actualCap301ValuesString, expectedCap301ValuesString)
}
actualCap302ValuesString := s1.Strings(Cap302, values, 0)
expectedCap302ValuesString := []string{"invite-notify=invitemepls userhost-in-names"}
if !reflect.DeepEqual(actualCap302ValuesString, expectedCap302ValuesString) {
t.Errorf("Generated Cap302 values string [%s] did not match expected values string [%s]", actualCap302ValuesString, expectedCap302ValuesString)
}
}
func assertEqual(found, expected interface{}) {
if !reflect.DeepEqual(found, expected) {
panic(fmt.Sprintf("found %#v, expected %#v", found, expected))
}
}
func Test301WhitelistNotRespectedFor302(t *testing.T) {
s1 := NewSet()
s1.Enable(AccountTag, EchoMessage, StandardReplies)
assertEqual(s1.Strings(Cap301, nil, 0), []string{"account-tag echo-message"})
assertEqual(s1.Strings(Cap302, nil, 0), []string{"account-tag echo-message standard-replies"})
}
func TestSubtract(t *testing.T) {
s1 := NewSet(AccountTag, EchoMessage, UserhostInNames, ServerTime)
toRemove := NewSet(UserhostInNames, EchoMessage)
s1.Subtract(toRemove)
if !reflect.DeepEqual(s1, NewSet(AccountTag, ServerTime)) {
t.Errorf("subtract doesn't work")
}
}
func BenchmarkSetReads(b *testing.B) {
set := NewSet(UserhostInNames, EchoMessage)
b.ResetTimer()
for i := 0; i < b.N; i++ {
set.Has(UserhostInNames)
set.Has(LabeledResponse)
set.Has(EchoMessage)
set.Has(Nope)
}
}
func BenchmarkSetWrites(b *testing.B) {
for i := 0; i < b.N; i++ {
set := NewSet(UserhostInNames, EchoMessage)
set.Add(Nope)
set.Add(ExtendedJoin)
set.Remove(UserhostInNames)
set.Remove(LabeledResponse)
}
}

File diff suppressed because it is too large Load Diff

515
irc/channelmanager.go Normal file
View File

@ -0,0 +1,515 @@
// Copyright (c) 2017 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// released under the MIT license
package irc
import (
"sort"
"sync"
"time"
"github.com/ergochat/ergo/irc/datastore"
"github.com/ergochat/ergo/irc/utils"
)
type channelManagerEntry struct {
channel *Channel
// this is a refcount for joins, so we can avoid a race where we incorrectly
// think the channel is empty (without holding a lock across the entire Channel.Join()
// call)
pendingJoins int
skeleton string
}
// ChannelManager keeps track of all the channels on the server,
// providing synchronization for creation of new channels on first join,
// cleanup of empty channels on last part, and renames.
type ChannelManager struct {
sync.RWMutex // tier 2
// chans is the main data structure, mapping casefolded name -> *Channel
chans map[string]*channelManagerEntry
chansSkeletons utils.HashSet[string]
purgedChannels map[string]ChannelPurgeRecord // casefolded name to purge record
server *Server
}
// NewChannelManager returns a new ChannelManager.
func (cm *ChannelManager) Initialize(server *Server, config *Config) (err error) {
cm.chans = make(map[string]*channelManagerEntry)
cm.chansSkeletons = make(utils.HashSet[string])
cm.server = server
return cm.loadRegisteredChannels(config)
}
func (cm *ChannelManager) loadRegisteredChannels(config *Config) (err error) {
allChannels, err := FetchAndDeserializeAll[RegisteredChannel](datastore.TableChannels, cm.server.dstore, cm.server.logger)
if err != nil {
return
}
allPurgeRecords, err := FetchAndDeserializeAll[ChannelPurgeRecord](datastore.TableChannelPurges, cm.server.dstore, cm.server.logger)
if err != nil {
return
}
cm.Lock()
defer cm.Unlock()
cm.purgedChannels = make(map[string]ChannelPurgeRecord, len(allPurgeRecords))
for _, purge := range allPurgeRecords {
cm.purgedChannels[purge.NameCasefolded] = purge
}
for _, regInfo := range allChannels {
cfname, err := CasefoldChannel(regInfo.Name)
if err != nil {
cm.server.logger.Error("channels", "couldn't casefold registered channel, skipping", regInfo.Name, err.Error())
continue
} else {
cm.server.logger.Debug("channels", "initializing registered channel", regInfo.Name)
}
skeleton, err := Skeleton(regInfo.Name)
if err == nil {
cm.chansSkeletons.Add(skeleton)
}
if _, ok := cm.purgedChannels[cfname]; !ok {
ch := NewChannel(cm.server, regInfo.Name, cfname, true, regInfo)
cm.chans[cfname] = &channelManagerEntry{
channel: ch,
pendingJoins: 0,
skeleton: skeleton,
}
}
}
return nil
}
// Get returns an existing channel with name equivalent to `name`, or nil
func (cm *ChannelManager) Get(name string) (channel *Channel) {
name, err := CasefoldChannel(name)
if err != nil {
return nil
}
cm.RLock()
defer cm.RUnlock()
entry := cm.chans[name]
if entry != nil {
return entry.channel
}
return nil
}
// Join causes `client` to join the channel named `name`, creating it if necessary.
func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin bool, rb *ResponseBuffer) (err error, forward string) {
server := client.server
casefoldedName, err := CasefoldChannel(name)
skeleton, skerr := Skeleton(name)
if err != nil || skerr != nil || len(casefoldedName) > server.Config().Limits.ChannelLen {
return errNoSuchChannel, ""
}
channel, err, newChannel := func() (*Channel, error, bool) {
var newChannel bool
cm.Lock()
defer cm.Unlock()
// check purges first; a registered purged channel will still be present in `chans`
if _, ok := cm.purgedChannels[casefoldedName]; ok {
return nil, errChannelPurged, false
}
entry := cm.chans[casefoldedName]
if entry == nil {
if server.Config().Channels.OpOnlyCreation &&
!(isSajoin || client.HasRoleCapabs("chanreg")) {
return nil, errInsufficientPrivs, false
}
// enforce confusables
if cm.chansSkeletons.Has(skeleton) {
return nil, errConfusableIdentifier, false
}
entry = &channelManagerEntry{
channel: NewChannel(server, name, casefoldedName, false, RegisteredChannel{}),
pendingJoins: 0,
}
cm.chansSkeletons.Add(skeleton)
entry.skeleton = skeleton
cm.chans[casefoldedName] = entry
newChannel = true
}
entry.pendingJoins += 1
return entry.channel, nil, newChannel
}()
if err != nil {
return err, ""
}
err, forward = channel.Join(client, key, isSajoin || newChannel, rb)
cm.maybeCleanup(channel, true)
return
}
func (cm *ChannelManager) maybeCleanup(channel *Channel, afterJoin bool) {
cm.Lock()
defer cm.Unlock()
cfname := channel.NameCasefolded()
entry := cm.chans[cfname]
if entry == nil || entry.channel != channel {
return
}
cm.maybeCleanupInternal(cfname, entry, afterJoin)
}
func (cm *ChannelManager) maybeCleanupInternal(cfname string, entry *channelManagerEntry, afterJoin bool) {
if afterJoin {
entry.pendingJoins -= 1
}
if entry.pendingJoins == 0 && entry.channel.IsClean() {
delete(cm.chans, cfname)
if entry.skeleton != "" {
delete(cm.chansSkeletons, entry.skeleton)
}
}
}
// Part parts `client` from the channel named `name`, deleting it if it's empty.
func (cm *ChannelManager) Part(client *Client, name string, message string, rb *ResponseBuffer) error {
var channel *Channel
casefoldedName, err := CasefoldChannel(name)
if err != nil {
return errNoSuchChannel
}
cm.RLock()
entry := cm.chans[casefoldedName]
if entry != nil {
channel = entry.channel
}
cm.RUnlock()
if channel == nil {
return errNoSuchChannel
}
channel.Part(client, message, rb)
return nil
}
func (cm *ChannelManager) Cleanup(channel *Channel) {
cm.maybeCleanup(channel, false)
}
func (cm *ChannelManager) SetRegistered(channelName string, account string) (err error) {
if account == "" {
return errAuthRequired // this is already enforced by ChanServ, but do a final check
}
if cm.server.Defcon() <= 4 {
return errFeatureDisabled
}
var channel *Channel
cfname, err := CasefoldChannel(channelName)
if err != nil {
return err
}
var entry *channelManagerEntry
defer func() {
if err == nil && channel != nil {
// registration was successful: make the database reflect it
err = channel.Store(IncludeAllAttrs)
}
}()
cm.Lock()
defer cm.Unlock()
entry = cm.chans[cfname]
if entry == nil {
return errNoSuchChannel
}
channel = entry.channel
err = channel.SetRegistered(account)
if err != nil {
return err
}
return nil
}
func (cm *ChannelManager) SetUnregistered(channelName string, account string) (err error) {
cfname, err := CasefoldChannel(channelName)
if err != nil {
return err
}
var uuid utils.UUID
defer func() {
if err == nil {
if delErr := cm.server.dstore.Delete(datastore.TableChannels, uuid); delErr != nil {
cm.server.logger.Error("datastore", "couldn't delete channel registration", cfname, delErr.Error())
}
}
}()
cm.Lock()
defer cm.Unlock()
entry := cm.chans[cfname]
if entry != nil {
if entry.channel.Founder() != account {
return errChannelNotOwnedByAccount
}
uuid = entry.channel.UUID()
entry.channel.SetUnregistered(account) // changes the UUID
// #1619: if the channel has 0 members and was only being retained
// because it was registered, clean it up:
cm.maybeCleanupInternal(cfname, entry, false)
}
return nil
}
// Rename renames a channel (but does not notify the members)
func (cm *ChannelManager) Rename(name string, newName string) (err error) {
oldCfname, err := CasefoldChannel(name)
if err != nil {
return errNoSuchChannel
}
newCfname, err := CasefoldChannel(newName)
if err != nil {
return errInvalidChannelName
}
newSkeleton, err := Skeleton(newName)
if err != nil {
return errInvalidChannelName
}
var channel *Channel
var info RegisteredChannel
defer func() {
if channel != nil && info.Founder != "" {
channel.MarkDirty(IncludeAllAttrs)
}
// always-on clients need to update their saved channel memberships
for _, member := range channel.Members() {
member.markDirty(IncludeChannels)
}
}()
cm.Lock()
defer cm.Unlock()
entry := cm.chans[oldCfname]
if entry == nil {
return errNoSuchChannel
}
channel = entry.channel
info = channel.ExportRegistration()
registered := info.Founder != ""
oldSkeleton, err := Skeleton(info.Name)
if err != nil {
return errNoSuchChannel // ugh
}
if newCfname != oldCfname {
if cm.chans[newCfname] != nil {
return errChannelNameInUse
}
}
if oldSkeleton != newSkeleton {
if cm.chansSkeletons.Has(newSkeleton) {
return errConfusableIdentifier
}
}
delete(cm.chans, oldCfname)
if !registered {
entry.skeleton = newSkeleton
}
cm.chans[newCfname] = entry
delete(cm.chansSkeletons, oldSkeleton)
cm.chansSkeletons.Add(newSkeleton)
entry.channel.Rename(newName, newCfname)
return nil
}
// Len returns the number of channels
func (cm *ChannelManager) Len() int {
cm.RLock()
defer cm.RUnlock()
return len(cm.chans)
}
// Channels returns a slice containing all current channels
func (cm *ChannelManager) Channels() (result []*Channel) {
cm.RLock()
defer cm.RUnlock()
result = make([]*Channel, 0, len(cm.chans))
for _, entry := range cm.chans {
result = append(result, entry.channel)
}
return
}
// ListableChannels returns a slice of all non-purged channels.
func (cm *ChannelManager) ListableChannels() (result []*Channel) {
cm.RLock()
defer cm.RUnlock()
result = make([]*Channel, 0, len(cm.chans))
for cfname, entry := range cm.chans {
if _, ok := cm.purgedChannels[cfname]; !ok {
result = append(result, entry.channel)
}
}
return
}
// Purge marks a channel as purged.
func (cm *ChannelManager) Purge(chname string, record ChannelPurgeRecord) (err error) {
chname, err = CasefoldChannel(chname)
if err != nil {
return errInvalidChannelName
}
record.NameCasefolded = chname
record.UUID = utils.GenerateUUIDv4()
channel, err := func() (channel *Channel, err error) {
cm.Lock()
defer cm.Unlock()
if _, ok := cm.purgedChannels[chname]; ok {
return nil, errChannelPurgedAlready
}
entry := cm.chans[chname]
// atomically prevent anyone from rejoining
cm.purgedChannels[chname] = record
if entry != nil {
channel = entry.channel
}
return
}()
if err != nil {
return err
}
if channel != nil {
// actually kick everyone off the channel
channel.Purge("")
}
var purgeBytes []byte
if purgeBytes, err = record.Serialize(); err != nil {
cm.server.logger.Error("internal", "couldn't serialize purge record", channel.Name(), err.Error())
}
// TODO we need a better story about error handling for later
if err = cm.server.dstore.Set(datastore.TableChannelPurges, record.UUID, purgeBytes, time.Time{}); err != nil {
cm.server.logger.Error("datastore", "couldn't store purge record", chname, err.Error())
}
return
}
// IsPurged queries whether a channel is purged.
func (cm *ChannelManager) IsPurged(chname string) (result bool) {
chname, err := CasefoldChannel(chname)
if err != nil {
return false
}
cm.RLock()
_, result = cm.purgedChannels[chname]
cm.RUnlock()
return
}
// Unpurge deletes a channel's purged status.
func (cm *ChannelManager) Unpurge(chname string) (err error) {
chname, err = CasefoldChannel(chname)
if err != nil {
return errNoSuchChannel
}
cm.Lock()
record, found := cm.purgedChannels[chname]
delete(cm.purgedChannels, chname)
cm.Unlock()
if !found {
return errNoSuchChannel
}
if err := cm.server.dstore.Delete(datastore.TableChannelPurges, record.UUID); err != nil {
cm.server.logger.Error("datastore", "couldn't delete purge record", chname, err.Error())
}
return nil
}
func (cm *ChannelManager) ListPurged() (result []string) {
cm.RLock()
result = make([]string, 0, len(cm.purgedChannels))
for c := range cm.purgedChannels {
result = append(result, c)
}
cm.RUnlock()
sort.Strings(result)
return
}
func (cm *ChannelManager) UnfoldName(cfname string) (result string) {
cm.RLock()
entry := cm.chans[cfname]
cm.RUnlock()
if entry != nil {
return entry.channel.Name()
}
return cfname
}
func (cm *ChannelManager) LoadPurgeRecord(cfchname string) (record ChannelPurgeRecord, err error) {
cm.RLock()
defer cm.RUnlock()
if record, ok := cm.purgedChannels[cfchname]; ok {
return record, nil
} else {
return record, errNoSuchChannel
}
}
func (cm *ChannelManager) ChannelsForAccount(account string) (channels []string) {
cm.RLock()
defer cm.RUnlock()
for cfname, entry := range cm.chans {
if entry.channel.Founder() == account {
channels = append(channels, cfname)
}
}
return
}
// AllChannels returns the uncasefolded names of all registered channels.
func (cm *ChannelManager) AllRegisteredChannels() (result []string) {
cm.RLock()
defer cm.RUnlock()
for cfname, entry := range cm.chans {
if entry.channel.Founder() != "" {
result = append(result, cfname)
}
}
return
}

92
irc/channelreg.go Normal file
View File

@ -0,0 +1,92 @@
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"encoding/json"
"time"
"github.com/ergochat/ergo/irc/modes"
"github.com/ergochat/ergo/irc/utils"
)
// this is exclusively the *persistence* layer for channel registration;
// channel creation/tracking/destruction is in channelmanager.go
// these are bit flags indicating what part of the channel status is "dirty"
// and needs to be read from memory and written to the db
const (
IncludeInitial uint = 1 << iota
IncludeTopic
IncludeModes
IncludeLists
IncludeSettings
)
// this is an OR of all possible flags
const (
IncludeAllAttrs = ^uint(0)
)
// RegisteredChannel holds details about a given registered channel.
type RegisteredChannel struct {
// Name of the channel.
Name string
// UUID for the datastore.
UUID utils.UUID
// RegisteredAt represents the time that the channel was registered.
RegisteredAt time.Time
// Founder indicates the founder of the channel.
Founder string
// Topic represents the channel topic.
Topic string
// TopicSetBy represents the host that set the topic.
TopicSetBy string
// TopicSetTime represents the time the topic was set.
TopicSetTime time.Time
// Modes represents the channel modes
Modes []modes.Mode
// Key represents the channel key / password
Key string
// Forward is the forwarding/overflow (+f) channel
Forward string
// UserLimit is the user limit (0 for no limit)
UserLimit int
// AccountToUMode maps user accounts to their persistent channel modes (e.g., +q, +h)
AccountToUMode map[string]modes.Mode
// Bans represents the bans set on the channel.
Bans map[string]MaskInfo
// Excepts represents the exceptions set on the channel.
Excepts map[string]MaskInfo
// Invites represents the invite exceptions set on the channel.
Invites map[string]MaskInfo
// Settings are the chanserv-modifiable settings
Settings ChannelSettings
// Metadata set using the METADATA command
Metadata map[string]string
}
func (r *RegisteredChannel) Serialize() ([]byte, error) {
return json.Marshal(r)
}
func (r *RegisteredChannel) Deserialize(b []byte) (err error) {
return json.Unmarshal(b, r)
}
type ChannelPurgeRecord struct {
NameCasefolded string `json:"Name"`
UUID utils.UUID
Oper string
PurgedAt time.Time
Reason string
}
func (c *ChannelPurgeRecord) Serialize() ([]byte, error) {
return json.Marshal(c)
}
func (c *ChannelPurgeRecord) Deserialize(b []byte) error {
return json.Unmarshal(b, c)
}

958
irc/chanserv.go Normal file
View File

@ -0,0 +1,958 @@
// Copyright (c) 2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"fmt"
"regexp"
"slices"
"sort"
"strings"
"time"
"github.com/ergochat/ergo/irc/modes"
"github.com/ergochat/ergo/irc/sno"
"github.com/ergochat/ergo/irc/utils"
"github.com/ergochat/irc-go/ircfmt"
)
const chanservHelp = `ChanServ lets you register and manage channels.`
func chanregEnabled(config *Config) bool {
return config.Channels.Registration.Enabled
}
var (
chanservCommands = map[string]*serviceCommand{
"op": {
handler: csOpHandler,
help: `Syntax: $bOP #channel [nickname]$b
OP makes the given nickname, or yourself, a channel admin. You can only use
this command if you're a founder or in the AMODEs of the channel.`,
helpShort: `$bOP$b makes the given user (or yourself) a channel admin.`,
authRequired: true,
enabled: chanregEnabled,
minParams: 1,
},
"deop": {
handler: csDeopHandler,
help: `Syntax: $bDEOP #channel [nickname]$b
DEOP removes the given nickname, or yourself, the channel admin. You can only use
this command if you're the founder of the channel.`,
helpShort: `$bDEOP$b removes the given user (or yourself) from a channel admin.`,
enabled: chanregEnabled,
minParams: 1,
},
"register": {
handler: csRegisterHandler,
help: `Syntax: $bREGISTER #channel$b
REGISTER lets you own the given channel. If you rejoin this channel, you'll be
given admin privs on it. Modes set on the channel and the topic will also be
remembered.`,
helpShort: `$bREGISTER$b lets you own a given channel.`,
authRequired: true,
enabled: chanregEnabled,
minParams: 1,
},
"unregister": {
handler: csUnregisterHandler,
help: `Syntax: $bUNREGISTER #channel [code]$b
UNREGISTER deletes a channel registration, allowing someone else to claim it.
To prevent accidental unregistrations, a verification code is required;
invoking the command without a code will display the necessary code.`,
helpShort: `$bUNREGISTER$b deletes a channel registration.`,
enabled: chanregEnabled,
minParams: 1,
},
"drop": {
aliasOf: "unregister",
},
"amode": {
handler: csAmodeHandler,
help: `Syntax: $bAMODE #channel [mode change] [account]$b
AMODE lists or modifies persistent mode settings that affect channel members.
For example, $bAMODE #channel +o dan$b grants the holder of the "dan"
account the +o operator mode every time they join #channel. To list current
accounts and modes, use $bAMODE #channel$b. Note that users are always
referenced by their registered account names, not their nicknames.
The permissions hierarchy for adding and removing modes is the same as in
the ordinary /MODE command.`,
helpShort: `$bAMODE$b modifies persistent mode settings for channel members.`,
enabled: chanregEnabled,
minParams: 1,
},
"clear": {
handler: csClearHandler,
help: `Syntax: $bCLEAR #channel target$b
CLEAR removes users or settings from a channel. Specifically:
$bCLEAR #channel users$b kicks all users except for you.
$bCLEAR #channel access$b resets all stored bans, invites, ban exceptions,
and persistent user-mode grants made with CS AMODE.`,
helpShort: `$bCLEAR$b removes users or settings from a channel.`,
enabled: chanregEnabled,
minParams: 2,
},
"transfer": {
handler: csTransferHandler,
help: `Syntax: $bTRANSFER [accept] #channel user [code]$b
TRANSFER transfers ownership of a channel from one user to another.
To prevent accidental transfers, a verification code is required. For
example, $bTRANSFER #channel alice$b displays the required confirmation
code, then $bTRANSFER #channel alice 2930242125$b initiates the transfer.
Unless you are an IRC operator with the correct permissions, alice must
then accept the transfer, which she can do with $bTRANSFER accept #channel$b.
To cancel a pending transfer, transfer the channel to yourself.`,
helpShort: `$bTRANSFER$b transfers ownership of a channel to another user.`,
enabled: chanregEnabled,
minParams: 2,
},
"purge": {
handler: csPurgeHandler,
help: `Syntax: $bPURGE <ADD | DEL | LIST> #channel [code] [reason]$b
PURGE ADD blacklists a channel from the server, making it impossible to join
or otherwise interact with the channel. If the channel currently has members,
they will be kicked from it. PURGE may also be applied preemptively to
channels that do not currently have members. A purge can be undone with
PURGE DEL. To list purged channels, use PURGE LIST.`,
helpShort: `$bPURGE$b blacklists a channel from the server.`,
capabs: []string{"chanreg"},
minParams: 1,
maxParams: 3,
unsplitFinalParam: true,
},
"list": {
handler: csListHandler,
help: `Syntax: $bLIST [regex]$b
LIST returns the list of registered channels, which match the given regex.
If no regex is provided, all registered channels are returned.`,
helpShort: `$bLIST$b searches the list of registered channels.`,
capabs: []string{"chanreg"},
minParams: 0,
},
"info": {
handler: csInfoHandler,
help: `Syntax: $INFO #channel$b
INFO displays info about a registered channel.`,
helpShort: `$bINFO$b displays info about a registered channel.`,
enabled: chanregEnabled,
},
"get": {
handler: csGetHandler,
help: `Syntax: $bGET #channel <setting>$b
GET queries the current values of the channel settings. For more information
on the settings and their possible values, see HELP SET.`,
helpShort: `$bGET$b queries the current values of a channel's settings`,
enabled: chanregEnabled,
minParams: 2,
},
"set": {
handler: csSetHandler,
helpShort: `$bSET$b modifies a channel's settings`,
// these are broken out as separate strings so they can be translated separately
helpStrings: []string{
`Syntax $bSET #channel <setting> <value>$b
SET modifies a channel's settings. The following settings are available:`,
`$bHISTORY$b
'history' lets you control how channel history is stored. Your options are:
1. 'off' [no history]
2. 'ephemeral' [a limited amount of temporary history, not stored on disk]
3. 'on' [history stored in a permanent database, if available]
4. 'default' [use the server default]`,
`$bQUERY-CUTOFF$b
'query-cutoff' lets you restrict how much channel history can be retrieved
by unprivileged users. Your options are:
1. 'none' [no restrictions]
2. 'registration-time' [users can view history from after their account was
registered, plus a grace period]
3. 'join-time' [users can view history from after they joined the
channel; note that history will be effectively
unavailable to clients that are not always-on]
4. 'default' [use the server default]`,
},
enabled: chanregEnabled,
minParams: 3,
},
"howtoban": {
handler: csHowToBanHandler,
helpShort: `$bHOWTOBAN$b suggests the best available way of banning a user`,
help: `Syntax: $bHOWTOBAN #channel <nick>
The best way to ban a user from a channel will depend on how they are
connected to the server. $bHOWTOBAN$b suggests a ban command that will
(ideally) prevent the user from returning to the channel.`,
enabled: chanregEnabled,
minParams: 2,
},
}
)
func csAmodeHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
channelName := params[0]
channel := server.channels.Get(channelName)
if channel == nil {
service.Notice(rb, client.t("Channel does not exist"))
return
} else if channel.Founder() == "" {
service.Notice(rb, client.t("Channel is not registered"))
return
}
modeChanges, unknown := modes.ParseChannelModeChanges(params[1:]...)
invalid := len(unknown) != 0
// #2002: +f takes an argument but is not a channel-user mode,
// check for anything valid as a channel mode change that is not valid
// as an AMODE change
for _, modeChange := range modeChanges {
if !slices.Contains(modes.ChannelUserModes, modeChange.Mode) {
invalid = true
}
}
var change modes.ModeChange
if len(modeChanges) > 1 || invalid {
service.Notice(rb, client.t("Invalid mode change"))
return
} else if len(modeChanges) == 1 {
change = modeChanges[0]
} else {
change = modes.ModeChange{Op: modes.List}
}
// normalize and validate the account argument
accountIsValid := false
change.Arg, _ = CasefoldName(change.Arg)
switch change.Op {
case modes.List:
accountIsValid = true
case modes.Add:
// if we're adding a mode, the account must exist
if change.Arg != "" {
_, err := server.accounts.LoadAccount(change.Arg)
accountIsValid = (err == nil)
}
case modes.Remove:
// allow removal of accounts that may have been deleted
accountIsValid = (change.Arg != "")
}
if !accountIsValid {
service.Notice(rb, client.t("Account does not exist"))
return
}
affectedModes, err := channel.ProcessAccountToUmodeChange(client, change)
if err == errInsufficientPrivs {
service.Notice(rb, client.t("Insufficient privileges"))
return
} else if err != nil {
service.Notice(rb, client.t("Internal error"))
return
}
switch change.Op {
case modes.List:
// sort the persistent modes in descending order of priority
sort.Slice(affectedModes, func(i, j int) bool {
return umodeGreaterThan(affectedModes[i].Mode, affectedModes[j].Mode)
})
service.Notice(rb, fmt.Sprintf(client.t("Channel %[1]s has %[2]d persistent modes set"), channelName, len(affectedModes)))
for _, modeChange := range affectedModes {
service.Notice(rb, fmt.Sprintf(client.t("Account %[1]s receives mode +%[2]s"), modeChange.Arg, string(modeChange.Mode)))
}
case modes.Add, modes.Remove:
if len(affectedModes) > 0 {
service.Notice(rb, fmt.Sprintf(client.t("Successfully set persistent mode %[1]s on %[2]s"), strings.Join([]string{string(change.Op), string(change.Mode)}, ""), change.Arg))
// #729: apply change to current membership
for _, member := range channel.Members() {
if member.Account() == change.Arg {
// applyModeToMember takes the nickname, not the account name,
// so translate:
modeChange := change
modeChange.Arg = member.Nick()
applied, modeChange := channel.applyModeToMember(client, modeChange, rb)
if applied {
announceCmodeChanges(channel, modes.ModeChanges{modeChange}, server.name, "*", "", false, rb)
}
}
}
} else {
service.Notice(rb, client.t("No changes were made"))
}
}
}
func csOpHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
channelInfo := server.channels.Get(params[0])
if channelInfo == nil {
service.Notice(rb, client.t("Channel does not exist"))
return
}
channelName := channelInfo.Name()
founder := channelInfo.Founder()
clientAccount := client.Account()
if clientAccount == "" {
service.Notice(rb, client.t("You're not logged into an account"))
return
}
var target *Client
if len(params) > 1 {
target = server.clients.Get(params[1])
if target == nil {
service.Notice(rb, client.t("Could not find given client"))
return
}
} else {
target = client
}
var givenMode modes.Mode
if target == client {
if clientAccount == founder {
givenMode = modes.ChannelFounder
} else {
givenMode = channelInfo.getAmode(clientAccount)
if givenMode == modes.Mode(0) {
service.Notice(rb, client.t("You don't have any stored privileges on that channel"))
return
}
}
} else {
if clientAccount == founder {
givenMode = modes.ChannelOperator
} else {
service.Notice(rb, client.t("Only the channel founder can do this"))
return
}
}
applied, change := channelInfo.applyModeToMember(client,
modes.ModeChange{Mode: givenMode,
Op: modes.Add,
Arg: target.NickCasefolded(),
},
rb)
if applied {
announceCmodeChanges(channelInfo, modes.ModeChanges{change}, server.name, "*", "", false, rb)
}
service.Notice(rb, client.t("Successfully granted operator privileges"))
tnick := target.Nick()
server.logger.Info("services", fmt.Sprintf("Client %s op'd [%s] in channel %s", client.Nick(), tnick, channelName))
server.snomasks.Send(sno.LocalChannels, fmt.Sprintf(ircfmt.Unescape("Client $c[grey][$r%s$c[grey]] CS OP'd $c[grey][$r%s$c[grey]] in channel $c[grey][$r%s$c[grey]]"), client.NickMaskString(), tnick, channelName))
}
func csDeopHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
channel := server.channels.Get(params[0])
if channel == nil {
service.Notice(rb, client.t("Channel does not exist"))
return
}
if !channel.hasClient(client) {
service.Notice(rb, client.t("You're not on that channel"))
return
}
var target *Client
if len(params) > 1 {
target = server.clients.Get(params[1])
if target == nil {
service.Notice(rb, client.t("Could not find given client"))
return
}
} else {
target = client
}
present, _, cumodes := channel.ClientStatus(target)
if !present || len(cumodes) == 0 {
service.Notice(rb, client.t("Target has no privileges to remove"))
return
}
tnick := target.Nick()
modeChanges := make(modes.ModeChanges, len(cumodes))
for i, mode := range cumodes {
modeChanges[i] = modes.ModeChange{
Mode: mode,
Op: modes.Remove,
Arg: tnick,
}
}
// use the user's own permissions for the check, then announce
// the changes as coming from chanserv
applied := channel.ApplyChannelModeChanges(client, false, modeChanges, rb)
details := client.Details()
isBot := client.HasMode(modes.Bot)
announceCmodeChanges(channel, applied, details.nickMask, details.accountName, details.account, isBot, rb)
if len(applied) == 0 {
return
}
service.Notice(rb, client.t("Successfully removed operator privileges"))
}
func csRegisterHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
if server.Config().Channels.Registration.OperatorOnly && !client.HasRoleCapabs("chanreg") {
service.Notice(rb, client.t("Channel registration is restricted to server operators"))
return
}
channelName := params[0]
channelInfo := server.channels.Get(channelName)
if channelInfo == nil {
service.Notice(rb, client.t("No such channel"))
return
}
if !channelInfo.ClientIsAtLeast(client, modes.ChannelOperator) {
service.Notice(rb, client.t("You must be an oper on the channel to register it"))
return
}
account := client.Account()
if !checkChanLimit(service, client, rb) {
return
}
// this provides the synchronization that allows exactly one registration of the channel:
err := server.channels.SetRegistered(channelName, account)
if err != nil {
service.Notice(rb, err.Error())
return
}
service.Notice(rb, fmt.Sprintf(client.t("Channel %s successfully registered"), channelName))
server.logger.Info("services", fmt.Sprintf("Client %s registered channel %s", client.Nick(), channelName))
server.snomasks.Send(sno.LocalChannels, fmt.Sprintf(ircfmt.Unescape("Channel registered $c[grey][$r%s$c[grey]] by $c[grey][$r%s$c[grey]]"), channelName, client.nickMaskString))
// give them founder privs
applied, change := channelInfo.applyModeToMember(client,
modes.ModeChange{
Mode: modes.ChannelFounder,
Op: modes.Add,
Arg: client.NickCasefolded(),
},
rb)
if applied {
announceCmodeChanges(channelInfo, modes.ModeChanges{change}, service.prefix, "*", "", false, rb)
}
}
// check whether a client has already registered too many channels
func checkChanLimit(service *ircService, client *Client, rb *ResponseBuffer) (ok bool) {
account := client.Account()
channelsAlreadyRegistered := client.server.channels.ChannelsForAccount(account)
ok = len(channelsAlreadyRegistered) < client.server.Config().Channels.Registration.MaxChannelsPerAccount || client.HasRoleCapabs("chanreg")
if !ok {
service.Notice(rb, client.t("You have already registered the maximum number of channels; try dropping some with /CS UNREGISTER"))
}
return
}
func csPrivsCheck(service *ircService, channel RegisteredChannel, client *Client, rb *ResponseBuffer) (success bool) {
founder := channel.Founder
if founder == "" {
service.Notice(rb, client.t("That channel is not registered"))
return false
}
if client.HasRoleCapabs("chanreg") {
return true
}
if founder != client.Account() {
service.Notice(rb, client.t("Insufficient privileges"))
return false
}
return true
}
func csUnregisterHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
channelName := params[0]
var verificationCode string
if len(params) > 1 {
verificationCode = params[1]
}
channel := server.channels.Get(channelName)
if channel == nil {
service.Notice(rb, client.t("No such channel"))
return
}
info := channel.exportSummary()
channelKey := channel.NameCasefolded()
if !csPrivsCheck(service, info, client, rb) {
return
}
expectedCode := utils.ConfirmationCode(info.Name, info.RegisteredAt)
if expectedCode != verificationCode {
service.Notice(rb, ircfmt.Unescape(client.t("$bWarning: unregistering this channel will remove all stored channel attributes.$b")))
service.Notice(rb, fmt.Sprintf(client.t("To confirm, run this command: %s"), fmt.Sprintf("/CS UNREGISTER %s %s", channelKey, expectedCode)))
return
}
server.channels.SetUnregistered(channelKey, info.Founder)
service.Notice(rb, fmt.Sprintf(client.t("Channel %s is now unregistered"), channelKey))
}
func csClearHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
channel := server.channels.Get(params[0])
if channel == nil {
service.Notice(rb, client.t("Channel does not exist"))
return
}
if !csPrivsCheck(service, channel.exportSummary(), client, rb) {
return
}
switch strings.ToLower(params[1]) {
case "access":
channel.resetAccess()
service.Notice(rb, client.t("Successfully reset channel access"))
case "users":
for _, target := range channel.Members() {
if target != client {
channel.Kick(client, target, "Cleared by ChanServ", rb, true)
}
}
default:
service.Notice(rb, client.t("Invalid parameters"))
}
}
func csTransferHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
if strings.ToLower(params[0]) == "accept" {
processTransferAccept(service, client, params[1], rb)
return
}
chname := params[0]
channel := server.channels.Get(chname)
if channel == nil {
service.Notice(rb, client.t("Channel does not exist"))
return
}
regInfo := channel.exportSummary()
chname = regInfo.Name
account := client.Account()
isFounder := account != "" && account == regInfo.Founder
oper := client.Oper()
hasPrivs := oper.HasRoleCapab("chanreg")
if !isFounder && !hasPrivs {
service.Notice(rb, client.t("Insufficient privileges"))
return
}
target := params[1]
targetAccount, err := server.accounts.LoadAccount(params[1])
if err != nil {
service.Notice(rb, client.t("Account does not exist"))
return
}
if targetAccount.NameCasefolded != account {
expectedCode := utils.ConfirmationCode(regInfo.Name, regInfo.RegisteredAt)
codeValidated := 2 < len(params) && params[2] == expectedCode
if !codeValidated {
service.Notice(rb, ircfmt.Unescape(client.t("$bWarning: you are about to transfer control of your channel to another user.$b")))
service.Notice(rb, fmt.Sprintf(client.t("To confirm your channel transfer, type: /CS TRANSFER %[1]s %[2]s %[3]s"), chname, target, expectedCode))
return
}
}
if !isFounder {
message := fmt.Sprintf("Operator %s ran CS TRANSFER on %s to account %s", oper.Name, chname, target)
server.snomasks.Send(sno.LocalOpers, message)
server.logger.Info("opers", message)
}
status, err := channel.Transfer(client, target, hasPrivs)
if err == nil {
switch status {
case channelTransferComplete:
service.Notice(rb, fmt.Sprintf(client.t("Successfully transferred channel %[1]s to account %[2]s"), chname, target))
case channelTransferPending:
sendTransferPendingNotice(service, server, target, chname)
service.Notice(rb, fmt.Sprintf(client.t("Transfer of channel %[1]s to account %[2]s succeeded, pending acceptance"), chname, target))
case channelTransferCancelled:
service.Notice(rb, fmt.Sprintf(client.t("Cancelled pending transfer of channel %s"), chname))
}
} else {
switch err {
case errChannelNotOwnedByAccount:
service.Notice(rb, client.t("You don't own that channel"))
default:
service.Notice(rb, client.t("Could not transfer channel"))
}
}
}
func sendTransferPendingNotice(service *ircService, server *Server, account, chname string) {
clients := server.accounts.AccountToClients(account)
if len(clients) == 0 {
return
}
var client *Client
for _, candidate := range clients {
client = candidate
if candidate.NickCasefolded() == candidate.Account() {
break // prefer the login where the nick is the account
}
}
client.Send(nil, service.prefix, "NOTICE", client.Nick(), fmt.Sprintf(client.t("You have been offered ownership of channel %[1]s. To accept, /CS TRANSFER ACCEPT %[1]s"), chname))
}
func processTransferAccept(service *ircService, client *Client, chname string, rb *ResponseBuffer) {
channel := client.server.channels.Get(chname)
if channel == nil {
service.Notice(rb, client.t("Channel does not exist"))
return
}
if !checkChanLimit(service, client, rb) {
return
}
switch channel.AcceptTransfer(client) {
case nil:
service.Notice(rb, fmt.Sprintf(client.t("Successfully accepted ownership of channel %s"), channel.Name()))
case errChannelTransferNotOffered:
service.Notice(rb, fmt.Sprintf(client.t("You weren't offered ownership of channel %s"), channel.Name()))
default:
service.Notice(rb, fmt.Sprintf(client.t("Could not accept ownership of channel %s"), channel.Name()))
}
}
func csPurgeHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
oper := client.Oper()
if oper == nil {
return // should be impossible because you need oper capabs for this
}
switch strings.ToLower(params[0]) {
case "add":
csPurgeAddHandler(service, client, params[1:], oper.Name, rb)
case "del", "remove":
csPurgeDelHandler(service, client, params[1:], oper.Name, rb)
case "list":
csPurgeListHandler(service, client, rb)
default:
service.Notice(rb, client.t("Invalid parameters"))
}
}
func csPurgeAddHandler(service *ircService, client *Client, params []string, operName string, rb *ResponseBuffer) {
if len(params) == 0 {
service.Notice(rb, client.t("Invalid parameters"))
return
}
chname := params[0]
params = params[1:]
channel := client.server.channels.Get(chname) // possibly nil
var ctime time.Time
if channel != nil {
chname = channel.Name()
ctime = channel.Ctime()
}
code := utils.ConfirmationCode(chname, ctime)
if len(params) == 0 || params[0] != code {
service.Notice(rb, ircfmt.Unescape(client.t("$bWarning: you are about to empty this channel and remove it from the server.$b")))
service.Notice(rb, fmt.Sprintf(client.t("To confirm, run this command: %s"), fmt.Sprintf("/CS PURGE ADD %s %s", chname, code)))
return
}
params = params[1:]
var reason string
if 1 < len(params) {
reason = params[1]
}
purgeRecord := ChannelPurgeRecord{
Oper: operName,
PurgedAt: time.Now().UTC(),
Reason: reason,
}
switch client.server.channels.Purge(chname, purgeRecord) {
case nil:
if channel != nil { // channel need not exist to be purged
for _, target := range channel.Members() {
channel.Kick(client, target, "Cleared by ChanServ", rb, true)
}
}
service.Notice(rb, fmt.Sprintf(client.t("Successfully purged channel %s from the server"), chname))
client.server.snomasks.Send(sno.LocalChannels, fmt.Sprintf("Operator %s purged channel %s [reason: %s]", operName, chname, reason))
case errInvalidChannelName:
service.Notice(rb, fmt.Sprintf(client.t("Can't purge invalid channel %s"), chname))
default:
service.Notice(rb, client.t("An error occurred"))
}
}
func csPurgeDelHandler(service *ircService, client *Client, params []string, operName string, rb *ResponseBuffer) {
if len(params) == 0 {
service.Notice(rb, client.t("Invalid parameters"))
return
}
chname := params[0]
switch client.server.channels.Unpurge(chname) {
case nil:
service.Notice(rb, fmt.Sprintf(client.t("Successfully unpurged channel %s from the server"), chname))
client.server.snomasks.Send(sno.LocalChannels, fmt.Sprintf("Operator %s removed purge of channel %s", operName, chname))
case errNoSuchChannel:
service.Notice(rb, fmt.Sprintf(client.t("Channel %s wasn't previously purged from the server"), chname))
default:
service.Notice(rb, client.t("An error occurred"))
}
}
func csPurgeListHandler(service *ircService, client *Client, rb *ResponseBuffer) {
l := client.server.channels.ListPurged()
service.Notice(rb, fmt.Sprintf(client.t("There are %d purged channel(s)."), len(l)))
for i, c := range l {
service.Notice(rb, fmt.Sprintf("%d: %s", i+1, c))
}
}
func csListHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
var searchRegex *regexp.Regexp
if len(params) > 0 {
var err error
searchRegex, err = regexp.Compile(params[0])
if err != nil {
service.Notice(rb, client.t("Invalid regex"))
return
}
}
service.Notice(rb, ircfmt.Unescape(client.t("*** $bChanServ LIST$b ***")))
channels := server.channels.AllRegisteredChannels()
for _, channel := range channels {
if searchRegex == nil || searchRegex.MatchString(channel) {
service.Notice(rb, fmt.Sprintf(" %s", channel))
}
}
service.Notice(rb, ircfmt.Unescape(client.t("*** $bEnd of ChanServ LIST$b ***")))
}
func csInfoHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
if len(params) == 0 {
// #765
listRegisteredChannels(service, client.Account(), rb)
return
}
chname, err := CasefoldChannel(params[0])
if err != nil {
service.Notice(rb, client.t("Invalid channel name"))
return
}
// purge status
if client.HasRoleCapabs("chanreg") {
purgeRecord, err := server.channels.LoadPurgeRecord(chname)
if err == nil {
service.Notice(rb, fmt.Sprintf(client.t("Channel %s was purged by the server operators and cannot be used"), chname))
service.Notice(rb, fmt.Sprintf(client.t("Purged by operator: %s"), purgeRecord.Oper))
service.Notice(rb, fmt.Sprintf(client.t("Purged at: %s"), purgeRecord.PurgedAt.Format(time.RFC1123)))
if purgeRecord.Reason != "" {
service.Notice(rb, fmt.Sprintf(client.t("Purge reason: %s"), purgeRecord.Reason))
}
}
} else {
if server.channels.IsPurged(chname) {
service.Notice(rb, fmt.Sprintf(client.t("Channel %s was purged by the server operators and cannot be used"), chname))
}
}
var chinfo RegisteredChannel
channel := server.channels.Get(params[0])
if channel != nil {
chinfo = channel.exportSummary()
}
// channel exists but is unregistered, or doesn't exist:
if chinfo.Founder == "" {
service.Notice(rb, fmt.Sprintf(client.t("Channel %s is not registered"), chname))
return
}
service.Notice(rb, fmt.Sprintf(client.t("Channel %s is registered"), chinfo.Name))
service.Notice(rb, fmt.Sprintf(client.t("Founder: %s"), chinfo.Founder))
service.Notice(rb, fmt.Sprintf(client.t("Registered at: %s"), chinfo.RegisteredAt.Format(time.RFC1123)))
}
func displayChannelSetting(service *ircService, settingName string, settings ChannelSettings, client *Client, rb *ResponseBuffer) {
config := client.server.Config()
switch strings.ToLower(settingName) {
case "history":
effectiveValue := historyEnabled(config.History.Persistent.RegisteredChannels, settings.History)
service.Notice(rb, fmt.Sprintf(client.t("The stored channel history setting is: %s"), historyStatusToString(settings.History)))
service.Notice(rb, fmt.Sprintf(client.t("Given current server settings, the channel history setting is: %s"), historyStatusToString(effectiveValue)))
case "query-cutoff":
effectiveValue := settings.QueryCutoff
if effectiveValue == HistoryCutoffDefault {
effectiveValue = config.History.Restrictions.queryCutoff
}
service.Notice(rb, fmt.Sprintf(client.t("The stored channel history query cutoff setting is: %s"), historyCutoffToString(settings.QueryCutoff)))
service.Notice(rb, fmt.Sprintf(client.t("Given current server settings, the channel history query cutoff setting is: %s"), historyCutoffToString(effectiveValue)))
default:
service.Notice(rb, client.t("Invalid params"))
}
}
func csGetHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
chname, setting := params[0], params[1]
channel := server.channels.Get(chname)
if channel == nil {
service.Notice(rb, client.t("No such channel"))
return
}
info := channel.exportSummary()
if !csPrivsCheck(service, info, client, rb) {
return
}
displayChannelSetting(service, setting, channel.Settings(), client, rb)
}
func csSetHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
chname, setting, value := params[0], params[1], params[2]
channel := server.channels.Get(chname)
if channel == nil {
service.Notice(rb, client.t("No such channel"))
return
}
info := channel.exportSummary()
if !csPrivsCheck(service, info, client, rb) {
return
}
settings := channel.Settings()
var err error
switch strings.ToLower(setting) {
case "history":
settings.History, err = historyStatusFromString(value)
if err != nil {
err = errInvalidParams
break
}
channel.SetSettings(settings)
channel.resizeHistory(server.Config())
case "query-cutoff":
settings.QueryCutoff, err = historyCutoffFromString(value)
if err != nil {
err = errInvalidParams
break
}
channel.SetSettings(settings)
}
switch err {
case nil:
service.Notice(rb, client.t("Successfully changed the channel settings"))
displayChannelSetting(service, setting, settings, client, rb)
case errInvalidParams:
service.Notice(rb, client.t("Invalid parameters"))
default:
server.logger.Error("internal", "CS SET error:", err.Error())
service.Notice(rb, client.t("An error occurred"))
}
}
func csHowToBanHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) {
success := false
defer func() {
if success {
service.Notice(rb, client.t("Note that if the user is currently in the channel, you must /KICK them after you ban them"))
}
}()
chname, nick := params[0], params[1]
channel := server.channels.Get(chname)
if channel == nil {
service.Notice(rb, client.t("No such channel"))
return
}
if !(channel.ClientIsAtLeast(client, modes.ChannelOperator) || client.HasRoleCapabs("samode")) {
service.Notice(rb, client.t("Insufficient privileges"))
return
}
var details WhoWas
target := server.clients.Get(nick)
if target == nil {
whowasList := server.whoWas.Find(nick, 1)
if len(whowasList) == 0 {
service.Notice(rb, client.t("No such nick"))
return
}
service.Notice(rb, fmt.Sprintf(client.t("Warning: %s is not currently connected to the server. Using WHOWAS data, which may be inaccurate:"), nick))
details = whowasList[0]
} else {
details = target.Details().WhoWas
}
if details.account != "" {
if channel.getAmode(details.account) != modes.Mode(0) {
service.Notice(rb, fmt.Sprintf(client.t("Warning: account %s currently has a persistent channel privilege granted with CS AMODE. If this mode is not removed, bans will not be respected"), details.accountName))
return
} else if details.account == channel.Founder() {
service.Notice(rb, fmt.Sprintf(client.t("Warning: account %s is the channel founder and cannot be banned"), details.accountName))
return
}
}
config := server.Config()
if !config.Server.Cloaks.EnabledForAlwaysOn {
service.Notice(rb, client.t("Warning: server.ip-cloaking.enabled-for-always-on is disabled. This reduces the precision of channel bans."))
}
if details.account != "" {
if config.Accounts.NickReservation.ForceNickEqualsAccount || target.AlwaysOn() {
service.Notice(rb, fmt.Sprintf(client.t("User %[1]s is authenticated and can be banned by nickname: /MODE %[2]s +b %[3]s!*@*"), details.nick, channel.Name(), details.nick))
success = true
return
}
}
ban := fmt.Sprintf("*!*@%s", strings.ToLower(details.hostname))
banRe, err := utils.CompileGlob(ban, false)
if err != nil {
server.logger.Error("internal", "couldn't compile ban regex", ban, err.Error())
service.Notice(rb, "An error occurred")
return
}
var collateralDamage []string
for _, mcl := range channel.Members() {
if mcl != target && banRe.MatchString(mcl.NickMaskCasefolded()) {
collateralDamage = append(collateralDamage, mcl.Nick())
}
}
service.Notice(rb, fmt.Sprintf(client.t("User %[1]s can be banned by hostname: /MODE %[2]s +b %[3]s"), details.nick, channel.Name(), ban))
success = true
if len(collateralDamage) != 0 {
service.Notice(rb, fmt.Sprintf(client.t("Warning: this ban will affect %d other users:"), len(collateralDamage)))
for _, line := range utils.BuildTokenLines(maxLastArgLength, collateralDamage, " ") {
service.Notice(rb, line)
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,116 +1,299 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2016- Daniel Oaks <daniel@danieloaks.net>
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"errors"
"fmt"
"log"
"regexp"
"strings"
"sync"
"github.com/DanielOaks/girc-go/ircmatch"
"github.com/ergochat/ergo/irc/caps"
"github.com/ergochat/ergo/irc/modes"
"github.com/ergochat/ergo/irc/utils"
)
var (
ErrNickMissing = errors.New("nick missing")
ErrNicknameInUse = errors.New("nickname in use")
ErrNicknameMismatch = errors.New("nickname mismatch")
)
// ClientManager keeps track of clients by nick, enforcing uniqueness of casefolded nicks
type ClientManager struct {
sync.RWMutex // tier 2
byNick map[string]*Client
bySkeleton map[string]*Client
}
func ExpandUserHost(userhost string) (expanded string) {
expanded = userhost
// fill in missing wildcards for nicks
//TODO(dan): this would fail with dan@lol, do we want to accommodate that?
if !strings.Contains(expanded, "!") {
expanded += "!*"
// Initialize initializes a ClientManager.
func (clients *ClientManager) Initialize() {
clients.byNick = make(map[string]*Client)
clients.bySkeleton = make(map[string]*Client)
}
// Get retrieves a client from the manager, if they exist.
func (clients *ClientManager) Get(nick string) *Client {
casefoldedName, err := CasefoldName(nick)
if err == nil {
clients.RLock()
defer clients.RUnlock()
cli := clients.byNick[casefoldedName]
return cli
}
if !strings.Contains(expanded, "@") {
expanded += "@*"
return nil
}
func (clients *ClientManager) removeInternal(client *Client, oldcfnick, oldskeleton string) (err error) {
// requires holding the writable Lock()
if oldcfnick == "*" || oldcfnick == "" {
return errNickMissing
}
currentEntry, present := clients.byNick[oldcfnick]
if present {
if currentEntry == client {
delete(clients.byNick, oldcfnick)
} else {
// this shouldn't happen, but we can ignore it
client.server.logger.Warning("internal", "clients for nick out of sync", oldcfnick)
err = errNickMissing
}
} else {
err = errNickMissing
}
currentEntry, present = clients.bySkeleton[oldskeleton]
if present {
if currentEntry == client {
delete(clients.bySkeleton, oldskeleton)
} else {
client.server.logger.Warning("internal", "clients for skeleton out of sync", oldskeleton)
err = errNickMissing
}
} else {
err = errNickMissing
}
return
}
// Remove removes a client from the lookup set.
func (clients *ClientManager) Remove(client *Client) error {
clients.Lock()
defer clients.Unlock()
oldcfnick, oldskeleton := client.uniqueIdentifiers()
return clients.removeInternal(client, oldcfnick, oldskeleton)
}
// SetNick sets a client's nickname, validating it against nicknames in use
// XXX: dryRun validates a client's ability to claim a nick, without
// actually claiming it
func (clients *ClientManager) SetNick(client *Client, session *Session, newNick string, dryRun bool) (setNick string, err error, awayChanged bool) {
config := client.server.Config()
var newCfNick, newSkeleton string
client.stateMutex.RLock()
account := client.account
accountName := client.accountName
settings := client.accountSettings
registered := client.registered
client.stateMutex.RUnlock()
// these restrictions have grandfather exceptions for nicknames registered
// on previous versions of Ergo:
if newNick != accountName {
// can't contain "disfavored" characters like <, or start with a $ because
// it collides with the massmessage mask syntax. '0' conflicts with the use of 0
// as a placeholder in WHOX (#1896):
if strings.ContainsAny(newNick, disfavoredNameCharacters) || strings.HasPrefix(newNick, "$") ||
newNick == "0" {
return "", errNicknameInvalid, false
}
}
// recompute always-on status, because client.alwaysOn is not set for unregistered clients
var alwaysOn, useAccountName bool
if account != "" {
alwaysOn = persistenceEnabled(config.Accounts.Multiclient.AlwaysOn, settings.AlwaysOn)
useAccountName = alwaysOn || config.Accounts.NickReservation.ForceNickEqualsAccount
}
nickIsReserved := false
if useAccountName {
if registered && newNick != accountName {
return "", errNickAccountMismatch, false
}
newNick = accountName
newCfNick = account
newSkeleton, err = Skeleton(newNick)
if err != nil {
return "", errNicknameInvalid, false
}
} else {
newNick = strings.TrimSpace(newNick)
if len(newNick) == 0 {
return "", errNickMissing, false
}
if account == "" && config.Accounts.NickReservation.ForceGuestFormat && !dryRun {
newCfNick, err = CasefoldName(newNick)
if err != nil {
return "", errNicknameInvalid, false
}
if !config.Accounts.NickReservation.guestRegexpFolded.MatchString(newCfNick) {
newNick = strings.Replace(config.Accounts.NickReservation.GuestFormat, "*", newNick, 1)
newCfNick = "" // re-fold it below
}
}
if newCfNick == "" {
newCfNick, err = CasefoldName(newNick)
}
if err != nil {
return "", errNicknameInvalid, false
}
if len(newNick) > config.Limits.NickLen || len(newCfNick) > config.Limits.NickLen {
return "", errNicknameInvalid, false
}
newSkeleton, err = Skeleton(newNick)
if err != nil {
return "", errNicknameInvalid, false
}
if config.isRelaymsgIdentifier(newNick) {
return "", errNicknameInvalid, false
}
if restrictedCasefoldedNicks.Has(newCfNick) || restrictedSkeletons.Has(newSkeleton) {
return "", errNicknameInvalid, false
}
reservedAccount, method := client.server.accounts.EnforcementStatus(newCfNick, newSkeleton)
if method == NickEnforcementStrict && reservedAccount != "" && reservedAccount != account {
// see #2135: we want to enter the critical section, see if the nick is actually in use,
// and return errNicknameInUse in that case
nickIsReserved = true
}
}
var bouncerAllowed bool
if config.Accounts.Multiclient.Enabled {
if useAccountName {
bouncerAllowed = true
} else {
if config.Accounts.Multiclient.AllowedByDefault && settings.AllowBouncer != MulticlientDisallowedByUser {
bouncerAllowed = true
} else if settings.AllowBouncer == MulticlientAllowedByUser {
bouncerAllowed = true
}
}
}
clients.Lock()
defer clients.Unlock()
currentClient := clients.byNick[newCfNick]
// the client may just be changing case
if currentClient != nil && currentClient != client {
// these conditions forbid reattaching to an existing session:
if registered || !bouncerAllowed || account == "" || account != currentClient.Account() ||
dryRun || session == nil {
return "", errNicknameInUse, false
}
reattachSuccessful, numSessions, lastSeen, wasAway, nowAway := currentClient.AddSession(session)
if !reattachSuccessful {
return "", errNicknameInUse, false
}
if numSessions == 1 {
invisible := currentClient.HasMode(modes.Invisible)
operator := currentClient.HasMode(modes.Operator)
client.server.stats.AddRegistered(invisible, operator)
}
session.autoreplayMissedSince = lastSeen
// successful reattach!
return newNick, nil, wasAway != nowAway
} else if currentClient == client && currentClient.Nick() == newNick {
return "", errNoop, false
}
// analogous checks for skeletons
skeletonHolder := clients.bySkeleton[newSkeleton]
if skeletonHolder != nil && skeletonHolder != client {
return "", errNicknameInUse, false
}
if nickIsReserved {
return "", errNicknameReserved, false
}
if dryRun {
return "", nil, false
}
formercfnick, formerskeleton := client.uniqueIdentifiers()
if changeSuccess := client.SetNick(newNick, newCfNick, newSkeleton); !changeSuccess {
return "", errClientDestroyed, false
}
clients.removeInternal(client, formercfnick, formerskeleton)
clients.byNick[newCfNick] = client
clients.bySkeleton[newSkeleton] = client
return newNick, nil, false
}
func (clients *ClientManager) AllClients() (result []*Client) {
clients.RLock()
defer clients.RUnlock()
result = make([]*Client, len(clients.byNick))
i := 0
for _, client := range clients.byNick {
result[i] = client
i++
}
return
}
type ClientLookupSet struct {
ByNick map[string]*Client
}
func NewClientLookupSet() *ClientLookupSet {
return &ClientLookupSet{
ByNick: make(map[string]*Client),
}
}
func (clients *ClientLookupSet) Has(nick string) bool {
casefoldedName, err := CasefoldName(nick)
if err == nil {
return false
}
_, exists := clients.ByNick[casefoldedName]
return exists
}
func (clients *ClientLookupSet) Get(nick string) *Client {
casefoldedName, err := CasefoldName(nick)
if err == nil {
return clients.ByNick[casefoldedName]
}
return nil
}
func (clients *ClientLookupSet) Add(client *Client) error {
if !client.HasNick() {
return ErrNickMissing
}
if clients.Get(client.nick) != nil {
return ErrNicknameInUse
}
clients.ByNick[client.nickCasefolded] = client
return nil
}
func (clients *ClientLookupSet) Remove(client *Client) error {
if !client.HasNick() {
return ErrNickMissing
}
if clients.Get(client.nick) != client {
return ErrNicknameMismatch
}
delete(clients.ByNick, client.nickCasefolded)
return nil
}
func (clients *ClientLookupSet) AllWithCaps(caps ...Capability) (set ClientSet) {
set = make(ClientSet)
var client *Client
for _, client = range clients.ByNick {
// make sure they have all the required caps
for _, Cap := range caps {
if !client.capabilities[Cap] {
continue
// AllWithCapsNotify returns all sessions that support cap-notify.
func (clients *ClientManager) AllWithCapsNotify() (sessions []*Session) {
clients.RLock()
defer clients.RUnlock()
for _, client := range clients.byNick {
for _, session := range client.Sessions() {
// cap-notify is implicit in cap version 302 and above
if session.capabilities.Has(caps.CapNotify) || 302 <= session.capVersion {
sessions = append(sessions, session)
}
}
set.Add(client)
}
return set
return
}
func (clients *ClientLookupSet) FindAll(userhost string) (set ClientSet) {
// AllWithPushSubscriptions returns all clients that are always-on with an active push subscription.
func (clients *ClientManager) AllWithPushSubscriptions() (result []*Client) {
clients.RLock()
defer clients.RUnlock()
for _, client := range clients.byNick {
if client.hasPushSubscriptions() && client.AlwaysOn() {
result = append(result, client)
}
}
return result
}
// FindAll returns all clients that match the given userhost mask.
func (clients *ClientManager) FindAll(userhost string) (set ClientSet) {
set = make(ClientSet)
userhost, err := Casefold(ExpandUserHost(userhost))
userhost, err := CanonicalizeMaskWildcard(userhost)
if err != nil {
return set
}
matcher := ircmatch.MakeMatch(userhost)
matcher, err := utils.CompileGlob(userhost, false)
if err != nil {
// not much we can do here
return
}
for _, client := range clients.ByNick {
if matcher.Match(client.nickMaskCasefolded) {
clients.RLock()
defer clients.RUnlock()
for _, client := range clients.byNick {
if matcher.MatchString(client.NickMaskCasefolded()) {
set.Add(client)
}
}
@ -118,117 +301,15 @@ func (clients *ClientLookupSet) FindAll(userhost string) (set ClientSet) {
return set
}
func (clients *ClientLookupSet) Find(userhost string) *Client {
userhost, err := Casefold(ExpandUserHost(userhost))
if err != nil {
return nil
}
matcher := ircmatch.MakeMatch(userhost)
for _, client := range clients.ByNick {
if matcher.Match(client.nickMaskCasefolded) {
return client
}
}
return nil
}
//
// usermask to regexp
//
//TODO(dan): move this over to generally using glob syntax instead?
// kinda more expected in normal ban/etc masks, though regex is useful (probably as an extban?)
type UserMaskSet struct {
masks map[string]bool
regexp *regexp.Regexp
}
func NewUserMaskSet() *UserMaskSet {
return &UserMaskSet{
masks: make(map[string]bool),
// Determine the canonical / unfolded form of a nick, if a client matching it
// is present (or always-on).
func (clients *ClientManager) UnfoldNick(cfnick string) (nick string) {
clients.RLock()
c := clients.byNick[cfnick]
clients.RUnlock()
if c != nil {
return c.Nick()
} else {
return cfnick
}
}
func (set *UserMaskSet) Add(mask string) bool {
casefoldedMask, err := Casefold(mask)
if err != nil {
log.Println(fmt.Sprintf("ERROR: Could not add mask to usermaskset: [%s]", mask))
return false
}
if set.masks[casefoldedMask] {
return false
}
set.masks[casefoldedMask] = true
set.setRegexp()
return true
}
func (set *UserMaskSet) AddAll(masks []string) (added bool) {
for _, mask := range masks {
if !added && !set.masks[mask] {
added = true
}
set.masks[mask] = true
}
set.setRegexp()
return
}
func (set *UserMaskSet) Remove(mask string) bool {
if !set.masks[mask] {
return false
}
delete(set.masks, mask)
set.setRegexp()
return true
}
func (set *UserMaskSet) Match(userhost string) bool {
if set.regexp == nil {
return false
}
return set.regexp.MatchString(userhost)
}
func (set *UserMaskSet) String() string {
masks := make([]string, len(set.masks))
index := 0
for mask := range set.masks {
masks[index] = mask
index += 1
}
return strings.Join(masks, " ")
}
// Generate a regular expression from the set of user mask
// strings. Masks are split at the two types of wildcards, `*` and
// `?`. All the pieces are meta-escaped. `*` is replaced with `.*`,
// the regexp equivalent. Likewise, `?` is replaced with `.`. The
// parts are re-joined and finally all masks are joined into a big
// or-expression.
func (set *UserMaskSet) setRegexp() {
if len(set.masks) == 0 {
set.regexp = nil
return
}
maskExprs := make([]string, len(set.masks))
index := 0
for mask := range set.masks {
manyParts := strings.Split(mask, "*")
manyExprs := make([]string, len(manyParts))
for mindex, manyPart := range manyParts {
oneParts := strings.Split(manyPart, "?")
oneExprs := make([]string, len(oneParts))
for oindex, onePart := range oneParts {
oneExprs[oindex] = regexp.QuoteMeta(onePart)
}
manyExprs[mindex] = strings.Join(oneExprs, ".")
}
maskExprs[index] = strings.Join(manyExprs, ".*")
}
expr := "^" + strings.Join(maskExprs, "|") + "$"
set.regexp, _ = regexp.Compile(expr)
}

133
irc/client_test.go Normal file
View File

@ -0,0 +1,133 @@
// Copyright (c) 2019 Shivaram Lingamneni
// released under the MIT license
package irc
import (
"fmt"
"testing"
"github.com/ergochat/ergo/irc/languages"
"github.com/ergochat/ergo/irc/utils"
)
func TestGenerateBatchID(t *testing.T) {
var session Session
s := make(utils.HashSet[string])
count := 100000
for i := 0; i < count; i++ {
s.Add(session.generateBatchID())
}
if len(s) != count {
t.Error("duplicate batch ID detected")
}
}
func BenchmarkGenerateBatchID(b *testing.B) {
var session Session
for i := 0; i < b.N; i++ {
session.generateBatchID()
}
}
func BenchmarkNames(b *testing.B) {
channelSize := 1024
server := &Server{
name: "ergo.test",
}
lm, err := languages.NewManager(false, "", "")
if err != nil {
b.Fatal(err)
}
server.config.Store(&Config{
languageManager: lm,
})
for i := 0; i < b.N; i++ {
channel := &Channel{
name: "#test",
nameCasefolded: "#test",
server: server,
members: make(MemberSet),
}
for j := 0; j < channelSize; j++ {
nick := fmt.Sprintf("client_%d", j)
client := &Client{
server: server,
nick: nick,
nickCasefolded: nick,
}
channel.members.Add(client)
channel.regenerateMembersCache()
session := &Session{
client: client,
}
rb := NewResponseBuffer(session)
channel.Names(client, rb)
if len(rb.messages) < 2 {
b.Fatalf("not enough messages: %d", len(rb.messages))
}
// to inspect the messages: line, _ := rb.messages[0].Line()
}
}
}
func TestUserMasks(t *testing.T) {
var um UserMaskSet
if um.Match("horse_!user@tor-network.onion") {
t.Error("bad match")
}
um.Add("_!*@*", "x", "x")
if !um.Match("_!user@tor-network.onion") {
t.Error("failure to match")
}
if um.Match("horse_!user@tor-network.onion") {
t.Error("bad match")
}
um.Add("beer*!*@*", "x", "x")
if !um.Match("beergarden!user@tor-network.onion") {
t.Error("failure to match")
}
if um.Match("horse_!user@tor-network.onion") {
t.Error("bad match")
}
um.Add("horse*!user@*", "x", "x")
if !um.Match("horse_!user@tor-network.onion") {
t.Error("failure to match")
}
}
func TestWhoFields(t *testing.T) {
var w whoxFields
if w.Has('a') {
t.Error("zero value of whoxFields must be empty")
}
w = w.Add('a')
if !w.Has('a') {
t.Error("failed to set and get")
}
if w.Has('A') {
t.Error("false positive")
}
if w.Has('o') {
t.Error("false positive")
}
w = w.Add('🐬')
if w.Has('🐬') {
t.Error("should not be able to set invalid who field")
}
w = w.Add('o')
if !w.Has('o') {
t.Error("failed to set and get")
}
w = w.Add('z')
if !w.Has('z') {
t.Error("failed to set and get")
}
}

View File

@ -1,126 +0,0 @@
// Copyright (c) 2016- Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"fmt"
"net"
"strings"
"github.com/DanielOaks/girc-go/ircmsg"
)
// ClientSocket listens to a socket using the IRC protocol, processes events,
// and also sends IRC lines out of that socket.
type ClientSocket struct {
receiveLines chan string
ReceiveEvents chan Message
SendLines chan string
socket Socket
client Client
}
// NewClientSocket returns a new ClientSocket.
func NewClientSocket(conn net.Conn, client Client) ClientSocket {
return ClientSocket{
receiveLines: make(chan string),
ReceiveEvents: make(chan Message),
SendLines: make(chan string),
socket: NewSocket(conn),
client: client,
}
}
// Start creates and starts running the necessary event loops.
func (cs *ClientSocket) Start() {
go cs.RunEvents()
go cs.RunSocketSender()
go cs.RunSocketListener()
}
// RunEvents handles received IRC lines and processes incoming commands.
func (cs *ClientSocket) RunEvents() {
var exiting bool
var line string
for !exiting {
select {
case line = <-cs.receiveLines:
if line != "" {
fmt.Println("<- ", strings.TrimRight(line, "\r\n"))
exiting = cs.processIncomingLine(line)
}
}
}
// empty the receiveLines queue
cs.socket.Close()
select {
case <-cs.receiveLines:
// empty
default:
// empty
}
}
// RunSocketSender sends lines to the IRC socket.
func (cs *ClientSocket) RunSocketSender() {
var err error
var line string
for {
line = <-cs.SendLines
err = cs.socket.Write(line)
fmt.Println(" ->", strings.TrimRight(line, "\r\n"))
if err != nil {
break
}
}
}
// RunSocketListener receives lines from the IRC socket.
func (cs *ClientSocket) RunSocketListener() {
var errConn error
var line string
for {
line, errConn = cs.socket.Read()
cs.receiveLines <- line
if errConn != nil {
break
}
}
if !cs.socket.Closed {
cs.Send(nil, "", "ERROR", "Closing connection")
cs.socket.Close()
}
}
// Send sends an IRC line to the listener.
func (cs *ClientSocket) Send(tags *map[string]ircmsg.TagValue, prefix string, command string, params ...string) error {
ircmsg := ircmsg.MakeMessage(tags, prefix, command, params...)
line, err := ircmsg.Line()
if err != nil {
return err
}
cs.SendLines <- line
return nil
}
// processIncomingLine splits and handles the given command line.
// Returns true if client is exiting (sent a QUIT command, etc).
func (cs *ClientSocket) processIncomingLine(line string) bool {
msg, err := ircmsg.ParseLine(line)
if err != nil {
cs.Send(nil, "", "ERROR", "Your client sent a malformed line")
return true
}
command, canBeParsed := Commands[msg.Command]
if canBeParsed {
return command.Run(cs.client.server, &cs.client, msg)
}
//TODO(dan): This is an error+disconnect purely for reasons of testing.
// Later it may be downgraded to not-that-bad.
cs.Send(nil, "", "ERROR", fmt.Sprintf("Your client sent a command that could not be parsed [%s]", msg.Command))
return true
}

136
irc/cloaks/cloak_test.go Normal file
View File

@ -0,0 +1,136 @@
// Copyright (c) 2019 Shivaram Lingamneni
// released under the MIT license
package cloaks
import (
"net"
"reflect"
"testing"
)
func assertEqual(supplied, expected interface{}, t *testing.T) {
if !reflect.DeepEqual(supplied, expected) {
t.Errorf("expected %v but got %v", expected, supplied)
}
}
func easyParseIP(ipstr string) (result net.IP) {
result = net.ParseIP(ipstr)
if result == nil {
panic(ipstr)
}
return
}
func cloakConfForTesting() CloakConfig {
config := CloakConfig{
Enabled: true,
Netname: "oragono",
secret: "_BdVPWB5sray7McbFmeuJL996yaLgG4l9tEyficGXKg",
CidrLenIPv4: 32,
CidrLenIPv6: 64,
NumBits: 80,
}
config.Initialize()
return config
}
func TestCloakDeterminism(t *testing.T) {
config := cloakConfForTesting()
v4ip := easyParseIP("8.8.8.8").To4()
assertEqual(config.ComputeCloak(v4ip), "d2z5guriqhzwazyr.oragono", t)
// use of the 4-in-6 mapping should not affect the cloak
v6mappedIP := v4ip.To16()
assertEqual(config.ComputeCloak(v6mappedIP), "d2z5guriqhzwazyr.oragono", t)
v6ip := easyParseIP("2001:0db8::1")
assertEqual(config.ComputeCloak(v6ip), "w7ren6nxii6f3i3d.oragono", t)
// same CIDR, so same cloak:
v6ipsamecidr := easyParseIP("2001:0db8::2")
assertEqual(config.ComputeCloak(v6ipsamecidr), "w7ren6nxii6f3i3d.oragono", t)
v6ipdifferentcidr := easyParseIP("2001:0db9::1")
// different CIDR, different cloak:
assertEqual(config.ComputeCloak(v6ipdifferentcidr), "ccmptyrjwsxv4f4d.oragono", t)
// cloak values must be sensitive to changes in the secret key
config.SetSecret("HJcXK4lLawxBE4-9SIdPji_21YiL3N5r5f5-SPNrGVY")
assertEqual(config.ComputeCloak(v4ip), "4khy3usk8mfu42pe.oragono", t)
assertEqual(config.ComputeCloak(v6mappedIP), "4khy3usk8mfu42pe.oragono", t)
assertEqual(config.ComputeCloak(v6ip), "mxpk3c83vdxkek9j.oragono", t)
assertEqual(config.ComputeCloak(v6ipsamecidr), "mxpk3c83vdxkek9j.oragono", t)
}
func TestCloakShortv4Cidr(t *testing.T) {
config := CloakConfig{
Enabled: true,
Netname: "oragono",
secret: "_BdVPWB5sray7McbFmeuJL996yaLgG4l9tEyficGXKg",
CidrLenIPv4: 24,
CidrLenIPv6: 64,
NumBits: 60,
}
config.Initialize()
v4ip := easyParseIP("8.8.8.8")
assertEqual(config.ComputeCloak(v4ip), "3cay3zc72tnui.oragono", t)
v4ipsamecidr := easyParseIP("8.8.8.9")
assertEqual(config.ComputeCloak(v4ipsamecidr), "3cay3zc72tnui.oragono", t)
}
func TestCloakZeroBits(t *testing.T) {
config := cloakConfForTesting()
config.NumBits = 0
config.Netname = "example.com"
config.Initialize()
v4ip := easyParseIP("8.8.8.8").To4()
assertEqual(config.ComputeCloak(v4ip), "example.com", t)
}
func TestCloakDisabled(t *testing.T) {
config := cloakConfForTesting()
config.Enabled = false
v4ip := easyParseIP("8.8.8.8").To4()
assertEqual(config.ComputeCloak(v4ip), "", t)
}
func BenchmarkCloaks(b *testing.B) {
config := cloakConfForTesting()
v6ip := easyParseIP("2001:0db8::1")
b.ResetTimer()
for i := 0; i < b.N; i++ {
config.ComputeCloak(v6ip)
}
}
func TestAccountCloak(t *testing.T) {
config := cloakConfForTesting()
// just assert that we get all distinct values
assertEqual(config.ComputeAccountCloak("shivaram"), "8yu8kunudb45ztxm.oragono", t)
assertEqual(config.ComputeAccountCloak("dolph🐬n"), "hhgeqsvzeagv3wjw.oragono", t)
assertEqual(config.ComputeAccountCloak("SHIVARAM"), "bgx32x4r7qzih4uh.oragono", t)
assertEqual(config.ComputeAccountCloak("ed"), "j5autmgxtdjdyzf4.oragono", t)
}
func TestAccountCloakCollisions(t *testing.T) {
config := cloakConfForTesting()
v4ip := easyParseIP("97.97.97.97")
v4cloak := config.ComputeCloak(v4ip)
// "aaaa" is the same bytestring as 97.97.97.97
aaaacloak := config.ComputeAccountCloak("aaaa")
if v4cloak == aaaacloak {
t.Errorf("cloak collision between 97.97.97.97 and aaaa: %s", v4cloak)
}
}
func BenchmarkAccountCloaks(b *testing.B) {
config := cloakConfForTesting()
b.ResetTimer()
for i := 0; i < b.N; i++ {
config.ComputeAccountCloak("shivaram")
}
}

95
irc/cloaks/cloaks.go Normal file
View File

@ -0,0 +1,95 @@
// Copyright (c) 2019 Shivaram Lingamneni
package cloaks
import (
"fmt"
"net"
"crypto/sha3"
"github.com/ergochat/ergo/irc/utils"
)
type CloakConfig struct {
Enabled bool
EnabledForAlwaysOn bool `yaml:"enabled-for-always-on"`
Netname string
CidrLenIPv4 int `yaml:"cidr-len-ipv4"`
CidrLenIPv6 int `yaml:"cidr-len-ipv6"`
NumBits int `yaml:"num-bits"`
LegacySecretValue string `yaml:"secret"`
secret string
numBytes int
ipv4Mask net.IPMask
ipv6Mask net.IPMask
}
func (cloakConfig *CloakConfig) Initialize() {
// sanity checks:
numBits := cloakConfig.NumBits
if 0 == numBits {
numBits = 64
} else if 256 < numBits {
numBits = 256
}
// derived values:
cloakConfig.numBytes = numBits / 8
// round up to the nearest byte
if numBits%8 != 0 {
cloakConfig.numBytes += 1
}
cloakConfig.ipv4Mask = net.CIDRMask(cloakConfig.CidrLenIPv4, 32)
cloakConfig.ipv6Mask = net.CIDRMask(cloakConfig.CidrLenIPv6, 128)
}
func (cloakConfig *CloakConfig) SetSecret(secret string) {
cloakConfig.secret = secret
}
// simple cloaking algorithm: normalize the IP to its CIDR,
// then hash the resulting bytes with a secret key,
// then truncate to the desired length, b32encode, and append the fake TLD.
func (config *CloakConfig) ComputeCloak(ip net.IP) string {
if !config.Enabled {
return ""
} else if config.NumBits == 0 || config.secret == "" {
return config.Netname
}
var masked net.IP
v4ip := ip.To4()
if v4ip != nil {
masked = v4ip.Mask(config.ipv4Mask)
} else {
masked = ip.Mask(config.ipv6Mask)
}
return config.macAndCompose(masked)
}
func (config *CloakConfig) macAndCompose(b []byte) string {
// SHA3(K || M):
// https://crypto.stackexchange.com/questions/17735/is-hmac-needed-for-a-sha-3-based-mac
input := make([]byte, len(config.secret)+len(b))
copy(input, config.secret[:])
copy(input[len(config.secret):], b)
digest := sha3.Sum512(input)
b32digest := utils.B32Encoder.EncodeToString(digest[:config.numBytes])
return fmt.Sprintf("%s.%s", b32digest, config.Netname)
}
func (config *CloakConfig) ComputeAccountCloak(accountName string) string {
// XXX don't bother checking EnabledForAlwaysOn, since if it's disabled,
// we need to use the server name which we don't have
if config.NumBits == 0 || config.secret == "" {
return config.Netname
}
// pad with 16 initial bytes of zeroes, avoiding any possibility of collision
// with a masked IP that could be an input to ComputeCloak:
paddedAccountName := make([]byte, 16+len(accountName))
copy(paddedAccountName[16:], accountName[:])
return config.macAndCompose(paddedAccountName)
}

View File

@ -1,201 +1,416 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2014-2015 Edmund Huber
// Copyright (c) 2016- Daniel Oaks <daniel@danieloaks.net>
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import "github.com/DanielOaks/girc-go/ircmsg"
import (
"github.com/ergochat/irc-go/ircmsg"
)
// Command represents a command accepted from a client.
type Command struct {
handler func(server *Server, client *Client, msg ircmsg.IrcMessage) bool
oper bool
usablePreReg bool
leaveClientActive bool // if true, leaves the client active time alone. reversed because we can't default a struct element to True
leaveClientIdle bool
minParams int
handler func(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool
usablePreReg bool
allowedInBatch bool // allowed in client-to-server batches
minParams int
capabs []string
}
// resolveCommand returns the command to execute in response to a user input line.
// some invalid commands (unknown command verb, invalid UTF8) get a fake handler
// to ensure that labeled-response still works as expected.
func (server *Server) resolveCommand(command string, invalidUTF8 bool) (canonicalName string, result Command) {
if invalidUTF8 {
return command, invalidUtf8Command
}
if cmd, ok := Commands[command]; ok {
return command, cmd
}
if target, ok := server.Config().Server.CommandAliases[command]; ok {
if cmd, ok := Commands[target]; ok {
return target, cmd
}
}
return command, unknownCommand
}
// Run runs this command with the given client/message.
func (cmd *Command) Run(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
if !client.registered && !cmd.usablePreReg {
// command silently ignored
return false
}
if cmd.oper && !client.flags[Operator] {
client.Send(nil, server.name, ERR_NOPRIVILEGES, client.nick, "Permission Denied - You're not an IRC operator")
return false
}
if len(msg.Params) < cmd.minParams {
client.Send(nil, server.name, ERR_NEEDMOREPARAMS, client.nick, msg.Command, "Not enough parameters")
return false
}
if !cmd.leaveClientActive {
client.Active()
}
if !cmd.leaveClientIdle {
client.Touch()
}
exiting := cmd.handler(server, client, msg)
func (cmd *Command) Run(server *Server, client *Client, session *Session, msg ircmsg.Message) (exiting bool) {
rb := NewResponseBuffer(session)
rb.Label = GetLabel(msg)
exiting = func() bool {
defer rb.Send(true)
if !client.registered && !cmd.usablePreReg {
rb.Add(nil, server.name, ERR_NOTREGISTERED, "*", client.t("You need to register before you can use that command"))
return false
}
if len(cmd.capabs) > 0 && !client.HasRoleCapabs(cmd.capabs...) {
rb.Add(nil, server.name, ERR_NOPRIVILEGES, client.Nick(), client.t("Permission Denied"))
return false
}
if len(msg.Params) < cmd.minParams {
rb.Add(nil, server.name, ERR_NEEDMOREPARAMS, client.Nick(), msg.Command, rb.target.t("Not enough parameters"))
return false
}
if session.batch.label != "" && !cmd.allowedInBatch {
rb.Add(nil, server.name, "FAIL", "BATCH", "MULTILINE_INVALID", client.t("Command not allowed during a multiline batch"))
session.EndMultilineBatch("")
return false
}
return cmd.handler(server, client, msg, rb)
}()
// after each command, see if we can send registration to the client
if !client.registered {
server.tryRegister(client)
if !exiting && !client.registered {
exiting = server.tryRegister(client, session)
}
if client.registered {
client.Touch(session) // even if `exiting`, we bump the lastSeen timestamp
}
return exiting
}
// Commands holds all commands executable by a client connected to us.
var Commands = map[string]Command{
"AUTHENTICATE": {
handler: authenticateHandler,
usablePreReg: true,
minParams: 1,
},
"AWAY": {
handler: awayHandler,
minParams: 0,
},
"CAP": {
handler: capHandler,
usablePreReg: true,
minParams: 1,
},
"DEBUG": {
handler: debugHandler,
minParams: 1,
},
"HELP": {
handler: helpHandler,
minParams: 0,
},
"INVITE": {
handler: inviteHandler,
minParams: 2,
},
"ISON": {
handler: isonHandler,
minParams: 1,
},
"JOIN": {
handler: joinHandler,
minParams: 1,
},
"KICK": {
handler: kickHandler,
minParams: 2,
},
"KILL": {
handler: killHandler,
minParams: 1,
oper: true,
},
"LIST": {
handler: listHandler,
minParams: 0,
},
"MODE": {
handler: modeHandler,
minParams: 1,
},
"MONITOR": {
handler: monitorHandler,
minParams: 1,
},
"MOTD": {
handler: motdHandler,
minParams: 0,
},
"NAMES": {
handler: namesHandler,
minParams: 0,
},
"NICK": {
handler: nickHandler,
usablePreReg: true,
minParams: 1,
},
"NOTICE": {
handler: noticeHandler,
minParams: 2,
},
"OPER": {
handler: operHandler,
minParams: 2,
},
"PART": {
handler: partHandler,
minParams: 1,
},
"PASS": {
handler: passHandler,
usablePreReg: true,
minParams: 1,
},
"PING": {
handler: pingHandler,
usablePreReg: true,
minParams: 1,
leaveClientActive: true,
},
"PONG": {
handler: pongHandler,
usablePreReg: true,
minParams: 1,
leaveClientActive: true,
},
"PRIVMSG": {
handler: privmsgHandler,
minParams: 2,
},
"SANICK": {
handler: sanickHandler,
minParams: 2,
oper: true,
},
"QUIT": {
handler: quitHandler,
usablePreReg: true,
minParams: 0,
},
"REG": {
handler: regHandler,
minParams: 3,
},
"REHASH": {
handler: rehashHandler,
minParams: 0,
oper: true,
},
"TIME": {
handler: timeHandler,
minParams: 0,
},
"TOPIC": {
handler: topicHandler,
minParams: 1,
},
"USER": {
handler: userHandler,
usablePreReg: true,
minParams: 4,
},
"VERSION": {
handler: versionHandler,
minParams: 0,
},
"WHO": {
handler: whoHandler,
minParams: 0,
},
"WHOIS": {
handler: whoisHandler,
minParams: 1,
},
"WHOWAS": {
handler: whowasHandler,
minParams: 1,
},
// fake handler for unknown commands (see #994: this ensures the response tags are correct)
var unknownCommand = Command{
handler: unknownCommandHandler,
usablePreReg: true,
}
var invalidUtf8Command = Command{
handler: invalidUtf8Handler,
usablePreReg: true,
}
// Commands holds all commands executable by a client connected to us.
var Commands map[string]Command
func init() {
Commands = map[string]Command{
"ACCEPT": {
handler: acceptHandler,
minParams: 1,
},
"AMBIANCE": {
handler: sceneHandler,
minParams: 2,
},
"AUTHENTICATE": {
handler: authenticateHandler,
usablePreReg: true,
minParams: 1,
},
"AWAY": {
handler: awayHandler,
usablePreReg: true,
minParams: 0,
},
"BATCH": {
handler: batchHandler,
minParams: 1,
allowedInBatch: true,
},
"CAP": {
handler: capHandler,
usablePreReg: true,
minParams: 1,
},
"CHATHISTORY": {
handler: chathistoryHandler,
minParams: 4,
},
"DEBUG": {
handler: debugHandler,
minParams: 1,
capabs: []string{"rehash"},
},
"DEFCON": {
handler: defconHandler,
capabs: []string{"defcon"},
},
"DEOPER": {
handler: deoperHandler,
minParams: 0,
},
"DLINE": {
handler: dlineHandler,
minParams: 1,
capabs: []string{"ban"},
},
"EXTJWT": {
handler: extjwtHandler,
minParams: 1,
},
"HELP": {
handler: helpHandler,
minParams: 0,
},
"HELPOP": {
handler: helpHandler,
minParams: 0,
},
"HISTORY": {
handler: historyHandler,
minParams: 1,
},
"INFO": {
handler: infoHandler,
},
"INVITE": {
handler: inviteHandler,
minParams: 2,
},
"ISON": {
handler: isonHandler,
minParams: 1,
},
"ISUPPORT": {
handler: isupportHandler,
usablePreReg: true,
},
"JOIN": {
handler: joinHandler,
minParams: 1,
},
"KICK": {
handler: kickHandler,
minParams: 2,
},
"KILL": {
handler: killHandler,
minParams: 1,
capabs: []string{"kill"},
},
"KLINE": {
handler: klineHandler,
minParams: 1,
capabs: []string{"ban"},
},
"LANGUAGE": {
handler: languageHandler,
usablePreReg: true,
minParams: 1,
},
"LIST": {
handler: listHandler,
minParams: 0,
},
"LUSERS": {
handler: lusersHandler,
minParams: 0,
},
"MARKREAD": {
handler: markReadHandler,
minParams: 0, // send FAIL instead of ERR_NEEDMOREPARAMS
},
"METADATA": {
handler: metadataHandler,
minParams: 2,
usablePreReg: true,
},
"MODE": {
handler: modeHandler,
minParams: 1,
},
"MONITOR": {
handler: monitorHandler,
minParams: 1,
},
"MOTD": {
handler: motdHandler,
minParams: 0,
},
"NAMES": {
handler: namesHandler,
minParams: 0,
},
"NICK": {
handler: nickHandler,
usablePreReg: true,
minParams: 1,
},
"NOTICE": {
handler: messageHandler,
minParams: 2,
allowedInBatch: true,
},
"NPC": {
handler: npcHandler,
minParams: 3,
},
"NPCA": {
handler: npcaHandler,
minParams: 3,
},
"OPER": {
handler: operHandler,
minParams: 1,
},
"PART": {
handler: partHandler,
minParams: 1,
},
"PASS": {
handler: passHandler,
usablePreReg: true,
minParams: 1,
},
"PERSISTENCE": {
handler: persistenceHandler,
minParams: 1,
},
"PING": {
handler: pingHandler,
usablePreReg: true,
minParams: 1,
},
"PONG": {
handler: pongHandler,
usablePreReg: true,
minParams: 1,
},
"PRIVMSG": {
handler: messageHandler,
minParams: 2,
allowedInBatch: true,
},
"RELAYMSG": {
handler: relaymsgHandler,
minParams: 3,
},
"REGISTER": {
handler: registerHandler,
minParams: 3,
usablePreReg: true,
},
"RENAME": {
handler: renameHandler,
minParams: 2,
},
"SAJOIN": {
handler: sajoinHandler,
minParams: 1,
capabs: []string{"sajoin"},
},
"SANICK": {
handler: sanickHandler,
minParams: 2,
capabs: []string{"samode"},
},
"SAMODE": {
handler: modeHandler,
minParams: 1,
capabs: []string{"samode"},
},
"SCENE": {
handler: sceneHandler,
minParams: 2,
},
"SETNAME": {
handler: setnameHandler,
minParams: 1,
},
"SUMMON": {
handler: summonHandler,
},
"TAGMSG": {
handler: messageHandler,
minParams: 1,
},
"QUIT": {
handler: quitHandler,
usablePreReg: true,
minParams: 0,
},
"REDACT": {
handler: redactHandler,
minParams: 2,
},
"REHASH": {
handler: rehashHandler,
minParams: 0,
capabs: []string{"rehash"},
},
"TIME": {
handler: timeHandler,
minParams: 0,
},
"TOPIC": {
handler: topicHandler,
minParams: 1,
},
"UBAN": {
handler: ubanHandler,
minParams: 1,
capabs: []string{"ban"},
},
"UNDLINE": {
handler: unDLineHandler,
minParams: 1,
capabs: []string{"ban"},
},
"UNINVITE": {
handler: inviteHandler,
minParams: 2,
},
"UNKLINE": {
handler: unKLineHandler,
minParams: 1,
capabs: []string{"ban"},
},
"USER": {
handler: userHandler,
usablePreReg: true,
minParams: 4,
},
"USERHOST": {
handler: userhostHandler,
minParams: 1,
},
"USERS": {
handler: usersHandler,
},
"VERIFY": {
handler: verifyHandler,
usablePreReg: true,
minParams: 2,
},
"VERSION": {
handler: versionHandler,
minParams: 0,
},
"WEBIRC": {
handler: webircHandler,
usablePreReg: true,
minParams: 4,
},
"WEBPUSH": {
handler: webpushHandler,
minParams: 2,
},
"WHO": {
handler: whoHandler,
minParams: 1,
},
"WHOIS": {
handler: whoisHandler,
minParams: 1,
},
"WHOWAS": {
handler: whowasHandler,
minParams: 1,
},
"ZNC": {
handler: zncHandler,
minParams: 1,
},
}
initializeServices()
}

File diff suppressed because it is too large Load Diff

101
irc/config_test.go Normal file
View File

@ -0,0 +1,101 @@
// Copyright (c) 2020 Shivaram Lingamneni
// released under the MIT license
package irc
import (
"reflect"
"testing"
)
func TestEnvironmentOverrides(t *testing.T) {
var config Config
config.Server.Compatibility.SendUnprefixedSasl = true
config.History.Enabled = true
defaultUserModes := "+i"
config.Accounts.DefaultUserModes = &defaultUserModes
config.Server.WebSockets.AllowedOrigins = []string{"https://www.ircv3.net"}
config.Server.MOTD = "long.motd.txt" // overwrite this
env := []string{
`USER=shivaram`, // unrelated var
`ORAGONO_USER=oragono`, // this should be ignored as well
`ERGO__NETWORK__NAME=example.com`,
`ORAGONO__SERVER__COMPATIBILITY__FORCE_TRAILING=false`,
`ORAGONO__SERVER__COERCE_IDENT="~user"`,
`ERGO__SERVER__MOTD=short.motd.txt`,
`ORAGONO__ACCOUNTS__NICK_RESERVATION__ENABLED=true`,
`ERGO__ACCOUNTS__DEFAULT_USER_MODES="+iR"`,
`ORAGONO__SERVER__IP_CLOAKING={"enabled": true, "enabled-for-always-on": true, "netname": "irc", "cidr-len-ipv4": 32, "cidr-len-ipv6": 64, "num-bits": 64}`,
}
for _, envPair := range env {
_, _, err := mungeFromEnvironment(&config, envPair)
if err != nil {
t.Errorf("couldn't apply override `%s`: %v", envPair, err)
}
}
if config.Network.Name != "example.com" {
t.Errorf("unexpected value of network.name: %s", config.Network.Name)
}
if config.Server.CoerceIdent != "~user" {
t.Errorf("unexpected value of coerce-ident: %s", config.Server.CoerceIdent)
}
if config.Server.MOTD != "short.motd.txt" {
t.Errorf("unexpected value of motd: %s", config.Server.MOTD)
}
if !config.Accounts.NickReservation.Enabled {
t.Errorf("did not set bool as expected")
}
if !config.Server.Compatibility.SendUnprefixedSasl {
t.Errorf("overwrote unrelated field")
}
if !config.History.Enabled {
t.Errorf("overwrote unrelated field")
}
if !reflect.DeepEqual(config.Server.WebSockets.AllowedOrigins, []string{"https://www.ircv3.net"}) {
t.Errorf("overwrote unrelated field: %#v", config.Server.WebSockets.AllowedOrigins)
}
cloakConf := config.Server.Cloaks
if !(cloakConf.Enabled == true && cloakConf.EnabledForAlwaysOn == true && cloakConf.Netname == "irc" && cloakConf.CidrLenIPv6 == 64) {
t.Errorf("bad value of Cloaks: %#v", config.Server.Cloaks)
}
if *config.Server.Compatibility.ForceTrailing != false {
t.Errorf("couldn't set unset ptr field to false")
}
if *config.Accounts.DefaultUserModes != "+iR" {
t.Errorf("couldn't override pre-set ptr field")
}
}
func TestEnvironmentOverrideErrors(t *testing.T) {
var config Config
config.Server.Compatibility.SendUnprefixedSasl = true
config.History.Enabled = true
invalidEnvs := []string{
`ORAGONO__=asdf`,
`ORAGONO__SERVER__=asdf`,
`ORAGONO__SERVER____=asdf`,
`ORAGONO__NONEXISTENT_KEY=1`,
`ORAGONO__SERVER__NONEXISTENT_KEY=1`,
// invalid yaml:
`ORAGONO__SERVER__IP_CLOAKING__NETNAME="`,
// invalid type:
`ORAGONO__SERVER__IP_CLOAKING__NUM_BITS=asdf`,
`ORAGONO__SERVER__STS=[]`,
// index into non-struct:
`ORAGONO__NETWORK__NAME__QUX=1`,
// private field:
`ORAGONO__SERVER__PASSWORDBYTES="asdf"`,
}
for _, env := range invalidEnvs {
success, _, err := mungeFromEnvironment(&config, env)
if err == nil || success {
t.Errorf("accepted invalid env override `%s`", env)
}
}
}

View File

@ -0,0 +1,280 @@
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package connection_limits
import (
"crypto/md5"
"errors"
"fmt"
"sync"
"time"
"github.com/ergochat/ergo/irc/flatip"
"github.com/ergochat/ergo/irc/utils"
)
var (
ErrLimitExceeded = errors.New("too many concurrent connections")
ErrThrottleExceeded = errors.New("too many recent connection attempts")
)
type CustomLimitConfig struct {
Nets []string
MaxConcurrent int `yaml:"max-concurrent-connections"`
MaxPerWindow int `yaml:"max-connections-per-window"`
}
// tuples the key-value pair of a CIDR and its custom limit/throttle values
type customLimit struct {
name [16]byte
customID string // operator-configured identifier for a custom net
maxConcurrent int
maxPerWindow int
nets []flatip.IPNet
}
type limiterKey struct {
maskedIP flatip.IP
prefixLen uint8 // 0 for the fake nets we generate for custom limits
}
// LimiterConfig controls the automated connection limits.
// rawLimiterConfig contains all the YAML-visible fields;
// LimiterConfig contains additional denormalized private fields
type rawLimiterConfig struct {
Count bool
MaxConcurrent int `yaml:"max-concurrent-connections"`
Throttle bool
Window time.Duration
MaxPerWindow int `yaml:"max-connections-per-window"`
CidrLenIPv4 int `yaml:"cidr-len-ipv4"`
CidrLenIPv6 int `yaml:"cidr-len-ipv6"`
Exempted []string
CustomLimits map[string]CustomLimitConfig `yaml:"custom-limits"`
}
type LimiterConfig struct {
rawLimiterConfig
exemptedNets []flatip.IPNet
customLimits []customLimit
}
func (config *LimiterConfig) UnmarshalYAML(unmarshal func(interface{}) error) (err error) {
if err = unmarshal(&config.rawLimiterConfig); err != nil {
return err
}
return config.postprocess()
}
func (config *LimiterConfig) postprocess() (err error) {
exemptedNets, err := utils.ParseNetList(config.Exempted)
if err != nil {
return fmt.Errorf("Could not parse limiter exemption list: %v", err.Error())
}
config.exemptedNets = make([]flatip.IPNet, len(exemptedNets))
for i, exempted := range exemptedNets {
config.exemptedNets[i] = flatip.FromNetIPNet(exempted)
}
for identifier, customLimitConf := range config.CustomLimits {
nets := make([]flatip.IPNet, len(customLimitConf.Nets))
for i, netStr := range customLimitConf.Nets {
normalizedNet, err := flatip.ParseToNormalizedNet(netStr)
if err != nil {
return fmt.Errorf("Bad net %s in custom-limits block %s: %w", netStr, identifier, err)
}
nets[i] = normalizedNet
}
if len(customLimitConf.Nets) == 0 {
// see #1421: this is the legacy config format where the
// dictionary key of the block is a CIDR string
normalizedNet, err := flatip.ParseToNormalizedNet(identifier)
if err != nil {
return fmt.Errorf("Custom limit block %s has no defined nets", identifier)
}
nets = []flatip.IPNet{normalizedNet}
}
config.customLimits = append(config.customLimits, customLimit{
maxConcurrent: customLimitConf.MaxConcurrent,
maxPerWindow: customLimitConf.MaxPerWindow,
name: md5.Sum([]byte(identifier)),
customID: identifier,
nets: nets,
})
}
return nil
}
// Limiter manages the automated client connection limits.
type Limiter struct {
sync.Mutex
config *LimiterConfig
// IP/CIDR -> count of clients connected from there:
limiter map[limiterKey]int
// IP/CIDR -> throttle state:
throttler map[limiterKey]ThrottleDetails
}
// addrToKey canonicalizes `addr` to a string key, and returns
// the relevant connection limit and throttle max-per-window values
func (cl *Limiter) addrToKey(addr flatip.IP) (key limiterKey, customID string, limit int, throttle int) {
for _, custom := range cl.config.customLimits {
for _, net := range custom.nets {
if net.Contains(addr) {
return limiterKey{maskedIP: custom.name, prefixLen: 0}, custom.customID, custom.maxConcurrent, custom.maxPerWindow
}
}
}
var prefixLen int
if addr.IsIPv4() {
prefixLen = cl.config.CidrLenIPv4
addr = addr.Mask(prefixLen, 32)
prefixLen += 96
} else {
prefixLen = cl.config.CidrLenIPv6
addr = addr.Mask(prefixLen, 128)
}
return limiterKey{maskedIP: addr, prefixLen: uint8(prefixLen)}, "", cl.config.MaxConcurrent, cl.config.MaxPerWindow
}
// AddClient adds a client to our population if possible. If we can't, throws an error instead.
func (cl *Limiter) AddClient(addr flatip.IP) error {
cl.Lock()
defer cl.Unlock()
// we don't track populations for exempted addresses or nets - this is by design
if flatip.IPInNets(addr, cl.config.exemptedNets) {
return nil
}
addrString, _, maxConcurrent, maxPerWindow := cl.addrToKey(addr)
// check limiter
var count int
if cl.config.Count {
count = cl.limiter[addrString] + 1
if count > maxConcurrent {
return ErrLimitExceeded
}
}
if cl.config.Throttle {
details := cl.throttler[addrString] // retrieve mutable throttle state from the map
// add in constant state to process the limiting operation
g := GenericThrottle{
ThrottleDetails: details,
Duration: cl.config.Window,
Limit: maxPerWindow,
}
throttled, _ := g.Touch() // actually check the limit
cl.throttler[addrString] = g.ThrottleDetails // store modified mutable state
if throttled {
// back out the limiter add
return ErrThrottleExceeded
}
}
// success, record in limiter
if cl.config.Count {
cl.limiter[addrString] = count
}
return nil
}
// RemoveClient removes the given address from our population
func (cl *Limiter) RemoveClient(addr flatip.IP) {
cl.Lock()
defer cl.Unlock()
if !cl.config.Count || flatip.IPInNets(addr, cl.config.exemptedNets) {
return
}
addrString, _, _, _ := cl.addrToKey(addr)
count := cl.limiter[addrString]
count -= 1
if count < 0 {
count = 0
}
cl.limiter[addrString] = count
}
type LimiterStatus struct {
Exempt bool
Count int
MaxCount int
Throttle int
MaxPerWindow int
ThrottleDuration time.Duration
}
func (cl *Limiter) Status(addr flatip.IP) (netName string, status LimiterStatus) {
cl.Lock()
defer cl.Unlock()
if flatip.IPInNets(addr, cl.config.exemptedNets) {
status.Exempt = true
return
}
status.ThrottleDuration = cl.config.Window
limiterKey, customID, maxConcurrent, maxPerWindow := cl.addrToKey(addr)
status.MaxCount = maxConcurrent
status.MaxPerWindow = maxPerWindow
status.Count = cl.limiter[limiterKey]
status.Throttle = cl.throttler[limiterKey].Count
netName = customID
if netName == "" {
netName = flatip.IPNet{
IP: limiterKey.maskedIP,
PrefixLen: limiterKey.prefixLen,
}.String()
}
return
}
// ResetThrottle resets the throttle count for an IP
func (cl *Limiter) ResetThrottle(addr flatip.IP) {
cl.Lock()
defer cl.Unlock()
if !cl.config.Throttle || flatip.IPInNets(addr, cl.config.exemptedNets) {
return
}
addrString, _, _, _ := cl.addrToKey(addr)
delete(cl.throttler, addrString)
}
// ApplyConfig atomically applies a config update to a connection limit handler
func (cl *Limiter) ApplyConfig(config *LimiterConfig) {
cl.Lock()
defer cl.Unlock()
if cl.limiter == nil {
cl.limiter = make(map[limiterKey]int)
}
if cl.throttler == nil {
cl.throttler = make(map[limiterKey]ThrottleDetails)
}
cl.config = config
}

View File

@ -0,0 +1,95 @@
// Copyright (c) 2018 Shivaram Lingamneni
// released under the MIT license
package connection_limits
import (
"crypto/md5"
"testing"
"time"
"github.com/ergochat/ergo/irc/flatip"
)
func easyParseIP(ipstr string) (result flatip.IP) {
result, err := flatip.ParseIP(ipstr)
if err != nil {
panic(err)
}
return
}
var baseConfig = LimiterConfig{
rawLimiterConfig: rawLimiterConfig{
Count: true,
MaxConcurrent: 4,
Throttle: true,
Window: time.Second * 600,
MaxPerWindow: 8,
CidrLenIPv4: 32,
CidrLenIPv6: 64,
Exempted: []string{"localhost"},
CustomLimits: map[string]CustomLimitConfig{
"google": {
Nets: []string{"8.8.0.0/16"},
MaxConcurrent: 128,
MaxPerWindow: 256,
},
},
},
}
func TestKeying(t *testing.T) {
config := baseConfig
config.postprocess()
var limiter Limiter
limiter.ApplyConfig(&config)
// an ipv4 /32 looks like a /128 to us after applying the 4-in-6 mapping
key, _, maxConc, maxWin := limiter.addrToKey(easyParseIP("1.1.1.1"))
assertEqual(key.prefixLen, uint8(128), t)
assertEqual(key.maskedIP[12:], []byte{1, 1, 1, 1}, t)
assertEqual(maxConc, 4, t)
assertEqual(maxWin, 8, t)
testIPv6 := easyParseIP("2607:5301:201:3100::7426")
key, _, maxConc, maxWin = limiter.addrToKey(testIPv6)
assertEqual(key.prefixLen, uint8(64), t)
assertEqual(flatip.IP(key.maskedIP), easyParseIP("2607:5301:201:3100::"), t)
assertEqual(maxConc, 4, t)
assertEqual(maxWin, 8, t)
key, _, maxConc, maxWin = limiter.addrToKey(easyParseIP("8.8.4.4"))
assertEqual(key.prefixLen, uint8(0), t)
assertEqual([16]byte(key.maskedIP), md5.Sum([]byte("google")), t)
assertEqual(maxConc, 128, t)
assertEqual(maxWin, 256, t)
}
func TestLimits(t *testing.T) {
regularIP := easyParseIP("2607:5301:201:3100::7426")
config := baseConfig
config.postprocess()
var limiter Limiter
limiter.ApplyConfig(&config)
for i := 0; i < 4; i++ {
err := limiter.AddClient(regularIP)
if err != nil {
t.Errorf("ip should not be blocked, but %v", err)
}
}
err := limiter.AddClient(regularIP)
if err != ErrLimitExceeded {
t.Errorf("ip should be blocked, but %v", err)
}
limiter.RemoveClient(regularIP)
err = limiter.AddClient(regularIP)
if err != nil {
t.Errorf("ip should not be blocked, but %v", err)
}
}

View File

@ -0,0 +1,51 @@
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package connection_limits
import (
"time"
)
// ThrottleDetails holds the connection-throttling details for a subnet/IP.
type ThrottleDetails struct {
Start time.Time
Count int
}
// GenericThrottle allows enforcing limits of the form
// "at most X events per time window of duration Y"
type GenericThrottle struct {
ThrottleDetails // variable state: what events have been seen
// these are constant after creation:
Duration time.Duration // window length to consider
Limit int // number of events allowed per window
}
// Touch checks whether an additional event is allowed:
// it either denies it (by returning false) or allows it (by returning true)
// and records it
func (g *GenericThrottle) Touch() (throttled bool, remainingTime time.Duration) {
return g.touch(time.Now().UTC())
}
func (g *GenericThrottle) touch(now time.Time) (throttled bool, remainingTime time.Duration) {
if g.Limit == 0 {
return // limit of 0 disables throttling
}
elapsed := now.Sub(g.Start)
if elapsed > g.Duration {
// reset window, record the operation
g.Start = now
g.Count = 1
return false, 0
} else if g.Count >= g.Limit {
// we are throttled
return true, g.Start.Add(g.Duration).Sub(now)
} else {
// we are not throttled, record the operation
g.Count += 1
return false, 0
}
}

View File

@ -0,0 +1,123 @@
// Copyright (c) 2018 Shivaram Lingamneni
// released under the MIT license
package connection_limits
import (
"reflect"
"testing"
"time"
)
func assertEqual(supplied, expected interface{}, t *testing.T) {
if !reflect.DeepEqual(supplied, expected) {
t.Errorf("expected %v but got %v", expected, supplied)
}
}
func TestGenericThrottle(t *testing.T) {
minute, _ := time.ParseDuration("1m")
second, _ := time.ParseDuration("1s")
zero, _ := time.ParseDuration("0s")
throttler := GenericThrottle{
Duration: minute,
Limit: 2,
}
now := time.Now()
throttled, remaining := throttler.touch(now)
assertEqual(throttled, false, t)
assertEqual(remaining, zero, t)
now = now.Add(second)
throttled, remaining = throttler.touch(now)
assertEqual(throttled, false, t)
assertEqual(remaining, zero, t)
now = now.Add(second)
throttled, remaining = throttler.touch(now)
assertEqual(throttled, true, t)
assertEqual(remaining, 58*second, t)
now = now.Add(minute)
throttled, remaining = throttler.touch(now)
assertEqual(throttled, false, t)
assertEqual(remaining, zero, t)
}
func TestGenericThrottleDisabled(t *testing.T) {
minute, _ := time.ParseDuration("1m")
throttler := GenericThrottle{
Duration: minute,
Limit: 0,
}
for i := 0; i < 1024; i += 1 {
throttled, _ := throttler.Touch()
if throttled {
t.Error("disabled throttler should not throttle")
}
}
}
func makeTestThrottler(v4len, v6len int) *Limiter {
minute, _ := time.ParseDuration("1m")
maxConnections := 3
config := LimiterConfig{
rawLimiterConfig: rawLimiterConfig{
Count: false,
Throttle: true,
CidrLenIPv4: v4len,
CidrLenIPv6: v6len,
MaxPerWindow: maxConnections,
Window: minute,
},
}
config.postprocess()
var limiter Limiter
limiter.ApplyConfig(&config)
return &limiter
}
func TestConnectionThrottle(t *testing.T) {
throttler := makeTestThrottler(32, 64)
addr := easyParseIP("8.8.8.8")
for i := 0; i < 3; i += 1 {
err := throttler.AddClient(addr)
assertEqual(err, nil, t)
}
err := throttler.AddClient(addr)
assertEqual(err, ErrThrottleExceeded, t)
}
func TestConnectionThrottleIPv6(t *testing.T) {
throttler := makeTestThrottler(32, 64)
var err error
err = throttler.AddClient(easyParseIP("2001:0db8::1"))
assertEqual(err, nil, t)
err = throttler.AddClient(easyParseIP("2001:0db8::2"))
assertEqual(err, nil, t)
err = throttler.AddClient(easyParseIP("2001:0db8::3"))
assertEqual(err, nil, t)
err = throttler.AddClient(easyParseIP("2001:0db8::4"))
assertEqual(err, ErrThrottleExceeded, t)
}
func TestConnectionThrottleIPv4(t *testing.T) {
throttler := makeTestThrottler(24, 64)
var err error
err = throttler.AddClient(easyParseIP("192.168.1.101"))
assertEqual(err, nil, t)
err = throttler.AddClient(easyParseIP("192.168.1.102"))
assertEqual(err, nil, t)
err = throttler.AddClient(easyParseIP("192.168.1.103"))
assertEqual(err, nil, t)
err = throttler.AddClient(easyParseIP("192.168.1.104"))
assertEqual(err, ErrThrottleExceeded, t)
}

View File

@ -0,0 +1,49 @@
// Copyright (c) 2019 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// released under the MIT license
package connection_limits
import (
"sync"
"time"
)
// TorLimiter is a combined limiter and throttler for use on connections
// proxied from a Tor hidden service (so we don't have meaningful IPs,
// a notion of CIDR width, etc.)
type TorLimiter struct {
sync.Mutex
numConnections int
maxConnections int
throttle GenericThrottle
}
func (tl *TorLimiter) Configure(maxConnections int, duration time.Duration, maxConnectionsPerDuration int) {
tl.Lock()
defer tl.Unlock()
tl.maxConnections = maxConnections
tl.throttle.Duration = duration
tl.throttle.Limit = maxConnectionsPerDuration
}
func (tl *TorLimiter) AddClient() error {
tl.Lock()
defer tl.Unlock()
if tl.maxConnections != 0 && tl.maxConnections <= tl.numConnections {
return ErrLimitExceeded
}
throttled, _ := tl.throttle.Touch()
if throttled {
return ErrThrottleExceeded
}
tl.numConnections += 1
return nil
}
func (tl *TorLimiter) RemoveClient() {
tl.Lock()
tl.numConnections -= 1
tl.Unlock()
}

View File

@ -1,18 +1,14 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2014-2015 Edmund Huber
// Copyright (c) 2016- Daniel Oaks <daniel@danieloaks.net>
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import "fmt"
const (
// SemVer is the semantic version of Oragono.
SemVer = "0.3.0"
)
var (
// Ver is the full version of Oragono, used in responses to clients.
Ver = fmt.Sprintf("oragono-%s", SemVer)
// maxLastArgLength is used to simply cap off the final argument when creating general messages where we need to select a limit.
// for instance, in MONITOR lists, RPL_ISUPPORT lists, etc.
maxLastArgLength = 400
// maxTargets is the maximum number of targets for PRIVMSG and NOTICE.
maxTargets = 4
)

View File

@ -0,0 +1,199 @@
// Copyright 2010 The Go Authors. All rights reserved.
package custime
import (
"errors"
"time"
)
// see https://github.com/golang/go/blob/7ad512e7ffe576c4894ea84b02e954846fbda643/src/time/format.go#L1251
// This is a forked version of the ParseDuration function that also handles days/months/years
var errLeadingInt = errors.New("time: bad [0-9]*") // never printed
// leadingInt consumes the leading [0-9]* from s.
func leadingInt(s string) (x int64, rem string, err error) {
i := 0
for ; i < len(s); i++ {
c := s[i]
if c < '0' || c > '9' {
break
}
if x > (1<<63-1)/10 {
// overflow
return 0, "", errLeadingInt
}
x = x*10 + int64(c) - '0'
if x < 0 {
// overflow
return 0, "", errLeadingInt
}
}
return x, s[i:], nil
}
// leadingFraction consumes the leading [0-9]* from s.
// It is used only for fractions, so does not return an error on overflow,
// it just stops accumulating precision.
func leadingFraction(s string) (x int64, scale float64, rem string) {
i := 0
scale = 1
overflow := false
for ; i < len(s); i++ {
c := s[i]
if c < '0' || c > '9' {
break
}
if overflow {
continue
}
if x > (1<<63-1)/10 {
// It's possible for overflow to give a positive number, so take care.
overflow = true
continue
}
y := x*10 + int64(c) - '0'
if y < 0 {
overflow = true
continue
}
x = y
scale *= 10
}
return x, scale, s[i:]
}
var unitMap = map[string]int64{
"ns": int64(time.Nanosecond),
"us": int64(time.Microsecond),
"µs": int64(time.Microsecond), // U+00B5 = micro symbol
"μs": int64(time.Microsecond), // U+03BC = Greek letter mu
"ms": int64(time.Millisecond),
"s": int64(time.Second),
"m": int64(time.Minute),
"h": int64(time.Hour),
"d": int64(time.Hour * 24),
"w": int64(time.Hour * 24 * 7),
"mo": int64(time.Hour * 24 * 30),
"y": int64(time.Hour * 24 * 365),
}
// ParseDuration parses a duration string.
// A duration string is a possibly signed sequence of
// decimal numbers, each with optional fraction and a unit suffix,
// such as "300ms", "-1.5h" or "2h45m".
// Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
func ParseDuration(s string) (time.Duration, error) {
// [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+
orig := s
var d int64
neg := false
// Consume [-+]?
if s != "" {
c := s[0]
if c == '-' || c == '+' {
neg = c == '-'
s = s[1:]
}
}
// Special case: if all that is left is "0", this is zero.
if s == "0" {
return 0, nil
}
if s == "" {
return 0, errors.New("time: invalid duration " + orig)
}
for s != "" {
var (
v, f int64 // integers before, after decimal point
scale float64 = 1 // value = v + f/scale
)
var err error
// The next character must be [0-9.]
if !(s[0] == '.' || '0' <= s[0] && s[0] <= '9') {
return 0, errors.New("time: invalid duration " + orig)
}
// Consume [0-9]*
pl := len(s)
v, s, err = leadingInt(s)
if err != nil {
return 0, errors.New("time: invalid duration " + orig)
}
pre := pl != len(s) // whether we consumed anything before a period
// Consume (\.[0-9]*)?
post := false
if s != "" && s[0] == '.' {
s = s[1:]
pl := len(s)
f, scale, s = leadingFraction(s)
post = pl != len(s)
}
if !pre && !post {
// no digits (e.g. ".s" or "-.s")
return 0, errors.New("time: invalid duration " + orig)
}
// Consume unit.
i := 0
for ; i < len(s); i++ {
c := s[i]
if c == '.' || '0' <= c && c <= '9' {
break
}
}
if i == 0 {
return 0, errors.New("time: missing unit in duration " + orig)
}
u := s[:i]
s = s[i:]
unit, ok := unitMap[u]
if !ok {
return 0, errors.New("time: unknown unit " + u + " in duration " + orig)
}
if v > (1<<63-1)/unit {
// overflow
return 0, errors.New("time: invalid duration " + orig)
}
v *= unit
if f > 0 {
// float64 is needed to be nanosecond accurate for fractions of hours.
// v >= 0 && (f*unit/scale) <= 3.6e+12 (ns/h, h is the largest unit)
v += int64(float64(f) * (float64(unit) / scale))
if v < 0 {
// overflow
return 0, errors.New("time: invalid duration " + orig)
}
}
d += v
if d < 0 {
// overflow
return 0, errors.New("time: invalid duration " + orig)
}
}
if neg {
d = -d
}
return time.Duration(d), nil
}
type Duration time.Duration
func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error {
var orig string
var err error
if err = unmarshal(&orig); err != nil {
return err
}
result, err := ParseDuration(orig)
if err == nil {
*d = Duration(result)
}
return err
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
// Copyright (c) 2022 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// released under the MIT license
package datastore
import (
"time"
"github.com/ergochat/ergo/irc/utils"
)
type Table uint16
// XXX these are persisted and must remain stable;
// do not reorder, when deleting use _ to ensure that the deleted value is skipped
const (
TableMetadata Table = iota
TableChannels
TableChannelPurges
)
type KV struct {
UUID utils.UUID
Value []byte
}
// A Datastore provides the following abstraction:
// 1. Tables, each keyed on a UUID (the implementation is free to merge
// the table name and the UUID into a single key as long as the rest of
// the contract can be satisfied). Table names are [a-z0-9_]+
// 2. The ability to efficiently enumerate all uuid-value pairs in a table
// 3. Gets, sets, and deletes for individual (table, uuid) keys
type Datastore interface {
Backoff() time.Duration
GetAll(table Table) ([]KV, error)
// This is rarely used because it would typically lead to TOCTOU races
Get(table Table, key utils.UUID) (value []byte, err error)
Set(table Table, key utils.UUID, value []byte, expiration time.Time) error
// Note that deleting a nonexistent key is not considered an error
Delete(table Table, key utils.UUID) error
}

View File

@ -1,75 +0,0 @@
// Copyright (c) 2012-2014 Jeremy Latt
// released under the MIT license
package irc
import (
"fmt"
"os"
"runtime"
"runtime/debug"
"runtime/pprof"
"time"
"github.com/DanielOaks/girc-go/ircmsg"
)
// DEBUG GCSTATS/NUMGOROUTINE/etc
func debugHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
if !client.flags[Operator] {
return false
}
switch msg.Params[0] {
case "GCSTATS":
stats := debug.GCStats{
Pause: make([]time.Duration, 10),
PauseQuantiles: make([]time.Duration, 5),
}
debug.ReadGCStats(&stats)
client.Notice(fmt.Sprintf("last GC: %s", stats.LastGC.Format(time.RFC1123)))
client.Notice(fmt.Sprintf("num GC: %d", stats.NumGC))
client.Notice(fmt.Sprintf("pause total: %s", stats.PauseTotal))
client.Notice(fmt.Sprintf("pause quantiles min%%: %s", stats.PauseQuantiles[0]))
client.Notice(fmt.Sprintf("pause quantiles 25%%: %s", stats.PauseQuantiles[1]))
client.Notice(fmt.Sprintf("pause quantiles 50%%: %s", stats.PauseQuantiles[2]))
client.Notice(fmt.Sprintf("pause quantiles 75%%: %s", stats.PauseQuantiles[3]))
client.Notice(fmt.Sprintf("pause quantiles max%%: %s", stats.PauseQuantiles[4]))
case "NUMGOROUTINE":
count := runtime.NumGoroutine()
client.Notice(fmt.Sprintf("num goroutines: %d", count))
case "PROFILEHEAP":
profFile := "ergonomadic.mprof"
file, err := os.Create(profFile)
if err != nil {
client.Notice(fmt.Sprintf("error: %s", err))
break
}
defer file.Close()
pprof.Lookup("heap").WriteTo(file, 0)
client.Notice(fmt.Sprintf("written to %s", profFile))
case "STARTCPUPROFILE":
profFile := "ergonomadic.prof"
file, err := os.Create(profFile)
if err != nil {
client.Notice(fmt.Sprintf("error: %s", err))
break
}
if err := pprof.StartCPUProfile(file); err != nil {
defer file.Close()
client.Notice(fmt.Sprintf("error: %s", err))
break
}
client.Notice(fmt.Sprintf("CPU profile writing to %s", profFile))
case "STOPCPUPROFILE":
pprof.StopCPUProfile()
client.Notice(fmt.Sprintf("CPU profiling stopped"))
}
return false
}

280
irc/dline.go Normal file
View File

@ -0,0 +1,280 @@
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"encoding/json"
"fmt"
"strings"
"sync"
"time"
"github.com/ergochat/ergo/irc/flatip"
"github.com/tidwall/buntdb"
)
const (
keyDlineEntry = "bans.dlinev2 %s"
)
// IPBanInfo holds info about an IP/net ban.
type IPBanInfo struct {
// RequireSASL indicates a "soft" ban; connections are allowed but they must SASL
RequireSASL bool
// Reason is the ban reason.
Reason string `json:"reason"`
// OperReason is an oper ban reason.
OperReason string `json:"oper_reason"`
// OperName is the oper who set the ban.
OperName string `json:"oper_name"`
// time of ban creation
TimeCreated time.Time
// duration of the ban; 0 means "permanent"
Duration time.Duration
}
func (info IPBanInfo) timeLeft() time.Duration {
return time.Until(info.TimeCreated.Add(info.Duration))
}
func (info IPBanInfo) TimeLeft() string {
if info.Duration == 0 {
return "indefinite"
} else {
return info.timeLeft().Truncate(time.Second).String()
}
}
// BanMessage returns the ban message.
func (info IPBanInfo) BanMessage(message string) string {
reason := info.Reason
if reason == "" {
reason = "No reason given"
}
message = fmt.Sprintf(message, reason)
if info.Duration != 0 {
message += fmt.Sprintf(" [%s]", info.TimeLeft())
}
return message
}
// DLineManager manages and dlines.
type DLineManager struct {
sync.RWMutex // tier 1
persistenceMutex sync.Mutex // tier 2
// networks that are dlined:
networks map[flatip.IPNet]IPBanInfo
// this keeps track of expiration timers for temporary bans
expirationTimers map[flatip.IPNet]*time.Timer
server *Server
}
// NewDLineManager returns a new DLineManager.
func NewDLineManager(server *Server) *DLineManager {
var dm DLineManager
dm.networks = make(map[flatip.IPNet]IPBanInfo)
dm.expirationTimers = make(map[flatip.IPNet]*time.Timer)
dm.server = server
dm.loadFromDatastore()
return &dm
}
// AllBans returns all bans (for use with APIs, etc).
func (dm *DLineManager) AllBans() map[string]IPBanInfo {
allb := make(map[string]IPBanInfo)
dm.RLock()
defer dm.RUnlock()
for key, info := range dm.networks {
allb[key.HumanReadableString()] = info
}
return allb
}
// AddNetwork adds a network to the blocked list.
func (dm *DLineManager) AddNetwork(network flatip.IPNet, duration time.Duration, requireSASL bool, reason, operReason, operName string) error {
dm.persistenceMutex.Lock()
defer dm.persistenceMutex.Unlock()
// assemble ban info
info := IPBanInfo{
RequireSASL: requireSASL,
Reason: reason,
OperReason: operReason,
OperName: operName,
TimeCreated: time.Now().UTC(),
Duration: duration,
}
id := dm.addNetworkInternal(network, info)
return dm.persistDline(id, info)
}
func (dm *DLineManager) addNetworkInternal(flatnet flatip.IPNet, info IPBanInfo) (id flatip.IPNet) {
id = flatnet
var timeLeft time.Duration
if info.Duration != 0 {
timeLeft = info.timeLeft()
if timeLeft <= 0 {
return
}
}
dm.Lock()
defer dm.Unlock()
dm.networks[flatnet] = info
dm.cancelTimer(flatnet)
if info.Duration == 0 {
return
}
// set up new expiration timer
timeCreated := info.TimeCreated
processExpiration := func() {
dm.Lock()
defer dm.Unlock()
banInfo, ok := dm.networks[flatnet]
if ok && banInfo.TimeCreated.Equal(timeCreated) {
delete(dm.networks, flatnet)
// TODO(slingamn) here's where we'd remove it from the radix tree
delete(dm.expirationTimers, flatnet)
}
}
dm.expirationTimers[flatnet] = time.AfterFunc(timeLeft, processExpiration)
return
}
func (dm *DLineManager) cancelTimer(flatnet flatip.IPNet) {
oldTimer := dm.expirationTimers[flatnet]
if oldTimer != nil {
oldTimer.Stop()
delete(dm.expirationTimers, flatnet)
}
}
func (dm *DLineManager) persistDline(id flatip.IPNet, info IPBanInfo) error {
// save in datastore
dlineKey := fmt.Sprintf(keyDlineEntry, id.String())
// assemble json from ban info
b, err := json.Marshal(info)
if err != nil {
dm.server.logger.Error("internal", "couldn't marshal d-line", err.Error())
return err
}
bstr := string(b)
var setOptions *buntdb.SetOptions
if info.Duration != 0 {
setOptions = &buntdb.SetOptions{Expires: true, TTL: info.Duration}
}
err = dm.server.store.Update(func(tx *buntdb.Tx) error {
_, _, err := tx.Set(dlineKey, bstr, setOptions)
return err
})
if err != nil {
dm.server.logger.Error("internal", "couldn't store d-line", err.Error())
}
return err
}
func (dm *DLineManager) unpersistDline(id flatip.IPNet) error {
dlineKey := fmt.Sprintf(keyDlineEntry, id.String())
return dm.server.store.Update(func(tx *buntdb.Tx) error {
_, err := tx.Delete(dlineKey)
return err
})
}
// RemoveNetwork removes a network from the blocked list.
func (dm *DLineManager) RemoveNetwork(network flatip.IPNet) error {
dm.persistenceMutex.Lock()
defer dm.persistenceMutex.Unlock()
id := network
present := func() bool {
dm.Lock()
defer dm.Unlock()
_, ok := dm.networks[id]
delete(dm.networks, id)
dm.cancelTimer(id)
return ok
}()
if !present {
return errNoExistingBan
}
return dm.unpersistDline(id)
}
// CheckIP returns whether or not an IP address was banned, and how long it is banned for.
func (dm *DLineManager) CheckIP(addr flatip.IP) (isBanned bool, info IPBanInfo) {
dm.RLock()
defer dm.RUnlock()
// check networks
// TODO(slingamn) use a radix tree as the data plane for this
for flatnet, info := range dm.networks {
if flatnet.Contains(addr) {
return true, info
}
}
// no matches!
return
}
func (dm *DLineManager) loadFromDatastore() {
dlinePrefix := fmt.Sprintf(keyDlineEntry, "")
dm.server.store.View(func(tx *buntdb.Tx) error {
tx.AscendGreaterOrEqual("", dlinePrefix, func(key, value string) bool {
if !strings.HasPrefix(key, dlinePrefix) {
return false
}
// get address name
key = strings.TrimPrefix(key, dlinePrefix)
// load addr/net
hostNet, err := flatip.ParseToNormalizedNet(key)
if err != nil {
dm.server.logger.Error("internal", "bad dline cidr", err.Error())
return true
}
// load ban info
var info IPBanInfo
err = json.Unmarshal([]byte(value), &info)
if err != nil {
dm.server.logger.Error("internal", "bad dline data", err.Error())
return true
}
// set opername if it isn't already set
if info.OperName == "" {
info.OperName = dm.server.name
}
// add to the server
dm.addNetworkInternal(hostNet, info)
return true
})
return nil
})
}
func (s *Server) loadDLines() {
s.dlines = NewDLineManager(s)
}

102
irc/email/dkim.go Normal file
View File

@ -0,0 +1,102 @@
// Copyright (c) 2020 Shivaram Lingamneni
// released under the MIT license
package email
import (
"bytes"
"crypto"
"crypto/ed25519"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"errors"
"fmt"
"os"
dkim "github.com/emersion/go-msgauth/dkim"
)
var (
ErrMissingFields = errors.New("DKIM config is missing fields")
)
type DKIMConfig struct {
Domain string
Selector string
KeyFile string `yaml:"key-file"`
privKey crypto.Signer
}
func (dkim *DKIMConfig) Enabled() bool {
return dkim.Domain != ""
}
func (dkim *DKIMConfig) Postprocess() (err error) {
if !dkim.Enabled() {
return nil
}
if dkim.Selector == "" || dkim.KeyFile == "" {
return ErrMissingFields
}
keyBytes, err := os.ReadFile(dkim.KeyFile)
if err != nil {
return fmt.Errorf("Could not read DKIM key file: %w", err)
}
dkim.privKey, err = parseDKIMPrivKey(keyBytes)
if err != nil {
return fmt.Errorf("Could not parse DKIM key file: %w", err)
}
return nil
}
func parseDKIMPrivKey(input []byte) (crypto.Signer, error) {
if len(input) == 0 {
return nil, errors.New("DKIM private key is empty")
}
// raw ed25519 private key format
if len(input) == ed25519.PrivateKeySize {
return ed25519.PrivateKey(input), nil
}
d, _ := pem.Decode(input)
if d == nil {
return nil, errors.New("Invalid PEM data for DKIM private key")
}
if rsaKey, err := x509.ParsePKCS1PrivateKey(d.Bytes); err == nil {
return rsaKey, nil
}
if k, err := x509.ParsePKCS8PrivateKey(d.Bytes); err == nil {
switch key := k.(type) {
case *rsa.PrivateKey:
return key, nil
case ed25519.PrivateKey:
return key, nil
default:
return nil, fmt.Errorf("Unacceptable type for DKIM private key: %T", k)
}
}
return nil, errors.New("No acceptable format for DKIM private key")
}
func DKIMSign(message []byte, dkimConfig DKIMConfig) (result []byte, err error) {
options := dkim.SignOptions{
Domain: dkimConfig.Domain,
Selector: dkimConfig.Selector,
Signer: dkimConfig.privKey,
HeaderCanonicalization: dkim.CanonicalizationRelaxed,
BodyCanonicalization: dkim.CanonicalizationRelaxed,
}
input := bytes.NewBuffer(message)
output := bytes.NewBuffer(make([]byte, 0, len(message)+1024))
err = dkim.Sign(output, input, &options)
return output.Bytes(), err
}

268
irc/email/email.go Normal file
View File

@ -0,0 +1,268 @@
// Copyright (c) 2020 Shivaram Lingamneni
// released under the MIT license
package email
import (
"bufio"
"bytes"
"errors"
"fmt"
"io"
"net"
"os"
"regexp"
"strings"
"time"
"github.com/ergochat/ergo/irc/custime"
"github.com/ergochat/ergo/irc/smtp"
"github.com/ergochat/ergo/irc/utils"
)
var (
ErrBlacklistedAddress = errors.New("Email address is blacklisted")
ErrInvalidAddress = errors.New("Email address is invalid")
ErrNoMXRecord = errors.New("Couldn't resolve MX record")
)
type BlacklistSyntax uint
const (
BlacklistSyntaxGlob BlacklistSyntax = iota
BlacklistSyntaxRegexp
)
func blacklistSyntaxFromString(status string) (BlacklistSyntax, error) {
switch strings.ToLower(status) {
case "glob", "":
return BlacklistSyntaxGlob, nil
case "re", "regex", "regexp":
return BlacklistSyntaxRegexp, nil
default:
return BlacklistSyntaxRegexp, fmt.Errorf("Unknown blacklist syntax type `%s`", status)
}
}
func (bs *BlacklistSyntax) UnmarshalYAML(unmarshal func(interface{}) error) error {
var orig string
var err error
if err = unmarshal(&orig); err != nil {
return err
}
if result, err := blacklistSyntaxFromString(orig); err == nil {
*bs = result
return nil
} else {
return err
}
}
type MTAConfig struct {
Server string
Port int
Username string
Password string
ImplicitTLS bool `yaml:"implicit-tls"`
}
type MailtoConfig struct {
// legacy config format assumed the use of an MTA/smarthost,
// so server, port, etc. appear directly at top level
// XXX: see https://github.com/go-yaml/yaml/issues/63
MTAConfig `yaml:",inline"`
Enabled bool
Sender string
HeloDomain string `yaml:"helo-domain"`
RequireTLS bool `yaml:"require-tls"`
Protocol string `yaml:"protocol"`
LocalAddress string `yaml:"local-address"`
localAddress net.Addr
VerifyMessageSubject string `yaml:"verify-message-subject"`
DKIM DKIMConfig
MTAReal MTAConfig `yaml:"mta"`
AddressBlacklist []string `yaml:"address-blacklist"`
AddressBlacklistSyntax BlacklistSyntax `yaml:"address-blacklist-syntax"`
AddressBlacklistFile string `yaml:"address-blacklist-file"`
blacklistRegexes []*regexp.Regexp
Timeout time.Duration
PasswordReset struct {
Enabled bool
Cooldown custime.Duration
Timeout custime.Duration
} `yaml:"password-reset"`
}
func (config *MailtoConfig) compileBlacklistEntry(source string) (re *regexp.Regexp, err error) {
if config.AddressBlacklistSyntax == BlacklistSyntaxGlob {
return utils.CompileGlob(source, false)
} else {
return regexp.Compile(fmt.Sprintf("^%s$", source))
}
}
func (config *MailtoConfig) processBlacklistFile(filename string) (result []*regexp.Regexp, err error) {
f, err := os.Open(filename)
if err != nil {
return
}
defer f.Close()
reader := bufio.NewReader(f)
lineNo := 0
for {
line, err := reader.ReadString('\n')
lineNo++
line = strings.TrimSpace(line)
if line != "" && line[0] != '#' {
if compiled, compileErr := config.compileBlacklistEntry(line); compileErr == nil {
result = append(result, compiled)
} else {
return result, fmt.Errorf("Failed to compile line %d of blacklist-regex-file `%s`: %w", lineNo, line, compileErr)
}
}
switch err {
case io.EOF:
return result, nil
case nil:
continue
default:
return result, err
}
}
}
func (config *MailtoConfig) Postprocess(heloDomain string) (err error) {
if config.Sender == "" {
return errors.New("Invalid mailto sender address")
}
// check for MTA config fields at top level,
// copy to MTAReal if present
if config.Server != "" && config.MTAReal.Server == "" {
config.MTAReal = config.MTAConfig
}
if config.HeloDomain == "" {
config.HeloDomain = heloDomain
}
if config.AddressBlacklistFile != "" {
config.blacklistRegexes, err = config.processBlacklistFile(config.AddressBlacklistFile)
if err != nil {
return err
}
} else if len(config.AddressBlacklist) != 0 {
config.blacklistRegexes = make([]*regexp.Regexp, 0, len(config.AddressBlacklist))
for _, reg := range config.AddressBlacklist {
compiled, err := config.compileBlacklistEntry(reg)
if err != nil {
return err
}
config.blacklistRegexes = append(config.blacklistRegexes, compiled)
}
}
config.Protocol = strings.ToLower(config.Protocol)
if config.Protocol == "" {
config.Protocol = "tcp"
}
if !(config.Protocol == "tcp" || config.Protocol == "tcp4" || config.Protocol == "tcp6") {
return fmt.Errorf("Invalid protocol for email sending: `%s`", config.Protocol)
}
if config.LocalAddress != "" {
ipAddr := net.ParseIP(config.LocalAddress)
if ipAddr == nil {
return fmt.Errorf("Could not parse local-address for email sending: `%s`", config.LocalAddress)
}
config.localAddress = &net.TCPAddr{
IP: ipAddr,
Port: 0,
}
}
if config.MTAConfig.Server != "" {
// smarthost, nothing more to validate
return nil
}
return config.DKIM.Postprocess()
}
// are we sending email directly, as opposed to deferring to an MTA?
func (config *MailtoConfig) DirectSendingEnabled() bool {
return config.MTAReal.Server == ""
}
// get the preferred MX record hostname, "" on error
func lookupMX(domain string) (server string) {
var minPref uint16
results, err := net.LookupMX(domain)
if err != nil {
return
}
for _, result := range results {
if minPref == 0 || result.Pref < minPref {
server, minPref = result.Host, result.Pref
}
}
return
}
func ComposeMail(config MailtoConfig, recipient, subject string) (message bytes.Buffer) {
fmt.Fprintf(&message, "From: %s\r\n", config.Sender)
fmt.Fprintf(&message, "To: %s\r\n", recipient)
dkimDomain := config.DKIM.Domain
if dkimDomain != "" {
fmt.Fprintf(&message, "Message-ID: <%s@%s>\r\n", utils.GenerateSecretKey(), dkimDomain)
} else {
// #2108: send Message-ID even if dkim is not enabled
fmt.Fprintf(&message, "Message-ID: <%s-%s>\r\n", utils.GenerateSecretKey(), config.Sender)
}
fmt.Fprintf(&message, "Date: %s\r\n", time.Now().UTC().Format(time.RFC1123Z))
fmt.Fprintf(&message, "Subject: %s\r\n", subject)
message.WriteString("\r\n") // blank line: end headers, begin message body
return message
}
func SendMail(config MailtoConfig, recipient string, msg []byte) (err error) {
recipientLower := strings.ToLower(recipient)
for _, reg := range config.blacklistRegexes {
if reg.MatchString(recipientLower) {
return ErrBlacklistedAddress
}
}
if config.DKIM.Enabled() {
msg, err = DKIMSign(msg, config.DKIM)
if err != nil {
return
}
}
var addr string
var auth smtp.Auth
var implicitTLS bool
if !config.DirectSendingEnabled() {
addr = fmt.Sprintf("%s:%d", config.MTAReal.Server, config.MTAReal.Port)
if config.MTAReal.Username != "" && config.MTAReal.Password != "" {
auth = smtp.PlainAuth("", config.MTAReal.Username, config.MTAReal.Password, config.MTAReal.Server)
}
implicitTLS = config.MTAReal.ImplicitTLS
} else {
idx := strings.IndexByte(recipient, '@')
if idx == -1 {
return ErrInvalidAddress
}
mx := lookupMX(recipient[idx+1:])
if mx == "" {
return ErrNoMXRecord
}
addr = fmt.Sprintf("%s:smtp", mx)
}
return smtp.SendMail(
addr, auth, config.HeloDomain, config.Sender, []string{recipient}, msg,
config.RequireTLS, implicitTLS, config.Protocol, config.localAddress, config.Timeout,
)
}

104
irc/errors.go Normal file
View File

@ -0,0 +1,104 @@
// Copyright (c) 2012-2014 Jeremy Latt
// Copyright (c) 2014-2015 Edmund Huber
// Copyright (c) 2016-2017 Daniel Oaks <daniel@danieloaks.net>
// released under the MIT license
package irc
import (
"errors"
"fmt"
"time"
"github.com/ergochat/ergo/irc/utils"
)
// Runtime Errors
var (
errAccountAlreadyRegistered = errors.New(`Account already exists`)
errAccountAlreadyUnregistered = errors.New(`That account name was registered previously and can't be reused`)
errAccountAlreadyVerified = errors.New(`Account is already verified`)
errAccountCantDropPrimaryNick = errors.New("Can't unreserve primary nickname")
errAccountCreation = errors.New("Account could not be created")
errAccountDoesNotExist = errors.New("Account does not exist")
errAccountInvalidCredentials = errors.New("Invalid account credentials")
errAccountBadPassphrase = errors.New(`Passphrase contains forbidden characters or is otherwise invalid`)
errAccountNickReservationFailed = errors.New("Could not (un)reserve nick")
errAccountNotLoggedIn = errors.New("You're not logged into an account")
errAccountAlreadyLoggedIn = errors.New("You're already logged into an account")
errAccountTooManyNicks = errors.New("Account has too many reserved nicks")
errAccountUnverified = errors.New(`Account is not yet verified`)
errAccountSuspended = errors.New(`Account has been suspended`)
errAccountVerificationFailed = errors.New("Account verification failed")
errAccountVerificationInvalidCode = errors.New("Invalid account verification code")
errAccountUpdateFailed = errors.New(`Error while updating your account information`)
errAccountMustHoldNick = errors.New(`You must hold that nickname in order to register it`)
errAuthRequired = errors.New("You must be logged into an account to do this")
errAuthzidAuthcidMismatch = errors.New(`authcid and authzid must be the same`)
errCertfpAlreadyExists = errors.New(`An account already exists for your certificate fingerprint`)
errChannelNotOwnedByAccount = errors.New("Channel not owned by the specified account")
errChannelTransferNotOffered = errors.New(`You weren't offered ownership of that channel`)
errChannelAlreadyRegistered = errors.New("Channel is already registered")
errChannelNotRegistered = errors.New("Channel is not registered")
errChannelNameInUse = errors.New(`Channel name in use`)
errInvalidChannelName = errors.New(`Invalid channel name`)
errMonitorLimitExceeded = errors.New("Monitor limit exceeded")
errNickMissing = errors.New("nick missing")
errNicknameInvalid = errors.New("invalid nickname")
errNicknameInUse = errors.New("nickname in use")
errInsecureReattach = errors.New("insecure reattach")
errNicknameReserved = errors.New("nickname is reserved")
errNickAccountMismatch = errors.New(`Your nickname must match your account name; try logging out and logging back in with SASL`)
errNoExistingBan = errors.New("Ban does not exist")
errNoSuchChannel = errors.New(`No such channel`)
errChannelPurged = errors.New(`This channel was purged by the server operators and cannot be used`)
errChannelPurgedAlready = errors.New(`This channel was already purged and cannot be purged again`)
errConfusableIdentifier = errors.New("This identifier is confusable with one already in use")
errInsufficientPrivs = errors.New("Insufficient privileges")
errInvalidUsername = errors.New("Invalid username")
errFeatureDisabled = errors.New(`That feature is disabled`)
errBanned = errors.New("IP or nickmask banned")
errInvalidParams = utils.ErrInvalidParams
errNoVhost = errors.New(`You do not have an approved vhost`)
errLimitExceeded = errors.New("Limit exceeded")
errNoop = errors.New("Action was a no-op")
errCASFailed = errors.New("Compare-and-swap update of database value failed")
errEmptyCredentials = errors.New("No more credentials are approved")
errCredsExternallyManaged = errors.New("Credentials are externally managed and cannot be changed here")
errNoSCRAMCredentials = errors.New("SCRAM credentials are not initialized for this account; consult the user guide")
errInvalidMultilineBatch = errors.New("Invalid multiline batch")
errTimedOut = errors.New("Operation timed out")
errInvalidUtf8 = errors.New("Message rejected for invalid utf8")
errClientDestroyed = errors.New("Client was already destroyed")
errTooManyChannels = errors.New("You have joined too many channels")
errWrongChannelKey = errors.New("Cannot join password-protected channel without the password")
errInviteOnly = errors.New("Cannot join invite-only channel without an invite")
errRegisteredOnly = errors.New("Cannot join registered-only channel without an account")
errValidEmailRequired = errors.New("A valid email address is required for account registration")
errInvalidAccountRename = errors.New("Account renames can only change the casefolding of the account name")
errNameReserved = errors.New(`Name reserved due to a prior registration`)
errInvalidBearerTokenType = errors.New("invalid bearer token type")
)
// String Errors
var (
errCouldNotStabilize = errors.New("Could not stabilize string while casefolding")
errStringIsEmpty = errors.New("String is empty")
errInvalidCharacter = errors.New("Invalid character")
)
type CertKeyError struct {
Err error
}
func (ck *CertKeyError) Error() string {
return fmt.Sprintf("Invalid TLS cert/key pair: %v", ck.Err)
}
type ThrottleError struct {
time.Duration
}
func (te *ThrottleError) Error() string {
return fmt.Sprintf(`Please wait at least %v and try again`, te.Duration.Round(time.Millisecond))
}

123
irc/fakelag.go Normal file
View File

@ -0,0 +1,123 @@
// Copyright (c) 2018 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// released under the MIT license
package irc
import (
"maps"
"time"
)
// fakelag is a system for artificially delaying commands when a user issues
// them too rapidly
type FakelagState uint
const (
// initially, the client is "bursting" and can send n commands without
// encountering fakelag
FakelagBursting FakelagState = iota
// after that, they're "throttled" and we sleep in between commands until
// they're spaced sufficiently far apart
FakelagThrottled
)
// this is intentionally not threadsafe, because it should only be touched
// from the loop that accepts the client's input and runs commands
type Fakelag struct {
config FakelagConfig
suspended bool
nowFunc func() time.Time
sleepFunc func(time.Duration)
state FakelagState
burstCount uint // number of messages sent in the current burst
lastTouch time.Time
}
func (fl *Fakelag) Initialize(config FakelagConfig) {
fl.config = config
// XXX don't share mutable member CommandBudgets:
if config.CommandBudgets != nil {
fl.config.CommandBudgets = maps.Clone(config.CommandBudgets)
}
fl.nowFunc = time.Now
fl.sleepFunc = time.Sleep
fl.state = FakelagBursting
}
// Idempotently turn off fakelag if it's enabled
func (fl *Fakelag) Suspend() {
if fl.config.Enabled {
fl.suspended = true
fl.config.Enabled = false
}
}
// Idempotently turn fakelag back on if it was previously Suspend'ed
func (fl *Fakelag) Unsuspend() {
if fl.suspended {
fl.config.Enabled = true
fl.suspended = false
}
}
// register a new command, sleep if necessary to delay it
func (fl *Fakelag) Touch(command string) {
if !fl.config.Enabled {
return
}
if budget, ok := fl.config.CommandBudgets[command]; ok && budget > 0 {
fl.config.CommandBudgets[command] = budget - 1
return
}
now := fl.nowFunc()
// XXX if lastTouch.IsZero(), treat it as "very far in the past", which is fine
elapsed := now.Sub(fl.lastTouch)
fl.lastTouch = now
if fl.state == FakelagBursting {
// determine if the previous burst is over
if elapsed > fl.config.Cooldown {
fl.burstCount = 0
}
fl.burstCount++
if fl.burstCount > fl.config.BurstLimit {
// reset burst window for next time
fl.burstCount = 0
// transition to throttling
fl.state = FakelagThrottled
// continue to throttling logic
} else {
return
}
}
if fl.state == FakelagThrottled {
if elapsed > fl.config.Cooldown {
// let them burst again
fl.state = FakelagBursting
fl.burstCount = 1
return
}
var sleepDuration time.Duration
if fl.config.MessagesPerWindow > 0 {
// space them out by at least window/messagesperwindow
sleepDuration = time.Duration((int64(fl.config.Window) / int64(fl.config.MessagesPerWindow)) - int64(elapsed))
} else {
// only burst messages are allowed: sleep until cooldown expires,
// then count this as a burst message
sleepDuration = time.Duration(int64(fl.config.Cooldown) - int64(elapsed))
fl.state = FakelagBursting
fl.burstCount = 1
}
if sleepDuration > 0 {
fl.sleepFunc(sleepDuration)
// the touch time should take into account the time we slept
fl.lastTouch = fl.nowFunc()
}
}
}

155
irc/fakelag_test.go Normal file
View File

@ -0,0 +1,155 @@
// Copyright (c) 2018 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// released under the MIT license
package irc
import (
"testing"
"time"
)
type mockTime struct {
now time.Time
sleepList []time.Duration
lastCheckedSleep int
}
func (mt *mockTime) Now() (now time.Time) {
return mt.now
}
func (mt *mockTime) Sleep(dur time.Duration) {
mt.sleepList = append(mt.sleepList, dur)
mt.pause(dur)
}
func (mt *mockTime) pause(dur time.Duration) {
mt.now = mt.now.Add(dur)
}
func (mt *mockTime) lastSleep() (slept bool, duration time.Duration) {
if mt.lastCheckedSleep == len(mt.sleepList)-1 {
slept = false
return
}
slept = true
mt.lastCheckedSleep += 1
duration = mt.sleepList[mt.lastCheckedSleep]
return
}
func newFakelagForTesting(window time.Duration, burstLimit uint, throttleMessagesPerWindow uint, cooldown time.Duration) (*Fakelag, *mockTime) {
fl := Fakelag{}
fl.config = FakelagConfig{
Enabled: true,
Window: window,
BurstLimit: burstLimit,
MessagesPerWindow: throttleMessagesPerWindow,
Cooldown: cooldown,
}
mt := new(mockTime)
mt.now, _ = time.Parse("Mon Jan 2 15:04:05 -0700 MST 2006", "Mon Jan 2 15:04:05 -0700 MST 2006")
mt.lastCheckedSleep = -1
fl.nowFunc = mt.Now
fl.sleepFunc = mt.Sleep
return &fl, mt
}
func TestFakelag(t *testing.T) {
window, _ := time.ParseDuration("1s")
fl, mt := newFakelagForTesting(window, 3, 2, window)
fl.Touch("")
slept, _ := mt.lastSleep()
if slept {
t.Fatalf("should not have slept")
}
interval, _ := time.ParseDuration("100ms")
for i := 0; i < 2; i++ {
mt.pause(interval)
fl.Touch("")
slept, _ := mt.lastSleep()
if slept {
t.Fatalf("should not have slept")
}
}
mt.pause(interval)
fl.Touch("")
if fl.state != FakelagThrottled {
t.Fatalf("should be throttled")
}
slept, duration := mt.lastSleep()
if !slept {
t.Fatalf("should have slept due to fakelag")
}
expected, _ := time.ParseDuration("400ms")
if duration != expected {
t.Fatalf("incorrect sleep time: %v != %v", expected, duration)
}
// send another message without a pause; we should have to sleep for 500 msec
fl.Touch("")
if fl.state != FakelagThrottled {
t.Fatalf("should be throttled")
}
slept, duration = mt.lastSleep()
expected, _ = time.ParseDuration("500ms")
if duration != expected {
t.Fatalf("incorrect sleep time: %v != %v", duration, expected)
}
mt.pause(interval * 6)
fl.Touch("")
if fl.state != FakelagThrottled {
t.Fatalf("should still be throttled")
}
slept, duration = mt.lastSleep()
if duration != 0 {
t.Fatalf("we paused for long enough that we shouldn't sleep here")
}
mt.pause(window * 2)
fl.Touch("")
if fl.state != FakelagBursting {
t.Fatalf("should be bursting again")
}
slept, _ = mt.lastSleep()
if slept {
t.Fatalf("should not have slept")
}
}
func TestSuspend(t *testing.T) {
window, _ := time.ParseDuration("1s")
fl, _ := newFakelagForTesting(window, 3, 2, window)
assertEqual(fl.config.Enabled, true)
// suspend idempotently disables
fl.Suspend()
assertEqual(fl.config.Enabled, false)
fl.Suspend()
assertEqual(fl.config.Enabled, false)
// unsuspend idempotently enables
fl.Unsuspend()
assertEqual(fl.config.Enabled, true)
fl.Unsuspend()
assertEqual(fl.config.Enabled, true)
fl.Suspend()
assertEqual(fl.config.Enabled, false)
fl2, _ := newFakelagForTesting(window, 3, 2, window)
fl2.config.Enabled = false
// if we were never enabled, suspend and unsuspend are both no-ops
fl2.Suspend()
assertEqual(fl2.config.Enabled, false)
fl2.Suspend()
assertEqual(fl2.config.Enabled, false)
fl2.Unsuspend()
assertEqual(fl2.config.Enabled, false)
fl2.Unsuspend()
assertEqual(fl2.config.Enabled, false)
}

33
irc/flatip/adhoc.go Normal file
View File

@ -0,0 +1,33 @@
// Copyright 2020 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// Released under the MIT license
package flatip
// begin ad-hoc utilities
// ParseToNormalizedNet attempts to interpret a string either as an IP
// network in CIDR notation, returning an IPNet, or as an IP address,
// returning an IPNet that contains only that address.
func ParseToNormalizedNet(netstr string) (ipnet IPNet, err error) {
_, ipnet, err = ParseCIDR(netstr)
if err == nil {
return
}
ip, err := ParseIP(netstr)
if err == nil {
ipnet.IP = ip
ipnet.PrefixLen = 128
}
return
}
// IPInNets is a convenience function for testing whether an IP is contained
// in any member of a slice of IPNet's.
func IPInNets(addr IP, nets []IPNet) bool {
for _, net := range nets {
if net.Contains(addr) {
return true
}
}
return false
}

220
irc/flatip/flatip.go Normal file
View File

@ -0,0 +1,220 @@
// Copyright 2020 Shivaram Lingamneni <slingamn@cs.stanford.edu>
// Copyright 2009 The Go Authors
// Released under the MIT license
package flatip
import (
"bytes"
"errors"
"net"
)
var (
v4InV6Prefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}
IPv6loopback = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
IPv6zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
IPv4zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 0, 0, 0}
ErrInvalidIPString = errors.New("String could not be interpreted as an IP address")
)
// packed versions of net.IP and net.IPNet; these are pure value types,
// so they can be compared with == and used as map keys.
// IP is a 128-bit representation of an IP address, using the 4-in-6 mapping
// to represent IPv4 addresses.
type IP [16]byte
// IPNet is a IP network. In a valid value, all bits after PrefixLen are zeroes.
type IPNet struct {
IP
PrefixLen uint8
}
// NetIP converts an IP into a net.IP.
func (ip IP) NetIP() (result net.IP) {
result = make(net.IP, 16)
copy(result[:], ip[:])
return
}
// FromNetIP converts a net.IP into an IP.
func FromNetIP(ip net.IP) (result IP) {
if len(ip) == 16 {
copy(result[:], ip[:])
} else {
result[10] = 0xff
result[11] = 0xff
copy(result[12:], ip[:])
}
return
}
// IPv4 returns the IP address representation of a.b.c.d
func IPv4(a, b, c, d byte) (result IP) {
copy(result[:12], v4InV6Prefix)
result[12] = a
result[13] = b
result[14] = c
result[15] = d
return
}
// ParseIP parses a string representation of an IP address into an IP.
// Unlike net.ParseIP, it returns an error instead of a zero value on failure,
// since the zero value of `IP` is a representation of a valid IP (::0, the
// IPv6 "unspecified address").
func ParseIP(ipstr string) (ip IP, err error) {
// TODO reimplement this without net.ParseIP
netip := net.ParseIP(ipstr)
if netip == nil {
err = ErrInvalidIPString
return
}
netip = netip.To16()
copy(ip[:], netip)
return
}
// String returns the string representation of an IP
func (ip IP) String() string {
// TODO reimplement this without using (net.IP).String()
return (net.IP)(ip[:]).String()
}
// IsIPv4 returns whether the IP is an IPv4 address.
func (ip IP) IsIPv4() bool {
return bytes.Equal(ip[:12], v4InV6Prefix)
}
// IsLoopback returns whether the IP is a loopback address.
func (ip IP) IsLoopback() bool {
if ip.IsIPv4() {
return ip[12] == 127
} else {
return ip == IPv6loopback
}
}
func (ip IP) IsUnspecified() bool {
return ip == IPv4zero || ip == IPv6zero
}
func rawCidrMask(length int) (m IP) {
n := uint(length)
for i := 0; i < 16; i++ {
if n >= 8 {
m[i] = 0xff
n -= 8
continue
}
m[i] = ^byte(0xff >> n)
return
}
return
}
func (ip IP) applyMask(mask IP) (result IP) {
for i := 0; i < 16; i += 1 {
result[i] = ip[i] & mask[i]
}
return
}
func cidrMask(ones, bits int) (result IP) {
switch bits {
case 32:
return rawCidrMask(96 + ones)
case 128:
return rawCidrMask(ones)
default:
return
}
}
// Mask returns the result of masking ip with the CIDR mask of
// length 'ones', out of a total of 'bits' (which must be either
// 32 for an IPv4 subnet or 128 for an IPv6 subnet).
func (ip IP) Mask(ones, bits int) (result IP) {
return ip.applyMask(cidrMask(ones, bits))
}
// ToNetIPNet converts an IPNet into a net.IPNet.
func (cidr IPNet) ToNetIPNet() (result net.IPNet) {
return net.IPNet{
IP: cidr.IP.NetIP(),
Mask: net.CIDRMask(int(cidr.PrefixLen), 128),
}
}
// Contains retuns whether the network contains `ip`.
func (cidr IPNet) Contains(ip IP) bool {
maskedIP := ip.Mask(int(cidr.PrefixLen), 128)
return cidr.IP == maskedIP
}
func (cidr IPNet) Size() (ones, bits int) {
if cidr.IP.IsIPv4() {
return int(cidr.PrefixLen) - 96, 32
} else {
return int(cidr.PrefixLen), 128
}
}
// FromNetIPnet converts a net.IPNet into an IPNet.
func FromNetIPNet(network net.IPNet) (result IPNet) {
ones, _ := network.Mask.Size()
if len(network.IP) == 16 {
copy(result.IP[:], network.IP[:])
} else {
result.IP[10] = 0xff
result.IP[11] = 0xff
copy(result.IP[12:], network.IP[:])
ones += 96
}
// perform masking so that equal CIDRs are ==
result.IP = result.IP.Mask(ones, 128)
result.PrefixLen = uint8(ones)
return
}
// String returns a string representation of an IPNet.
func (cidr IPNet) String() string {
ip := make(net.IP, 16)
copy(ip[:], cidr.IP[:])
ipnet := net.IPNet{
IP: ip,
Mask: net.CIDRMask(int(cidr.PrefixLen), 128),
}
return ipnet.String()
}
// HumanReadableString returns a string representation of an IPNet;
// if the network contains only a single IP address, it returns
// a representation of that address.
func (cidr IPNet) HumanReadableString() string {
if cidr.PrefixLen == 128 {
return cidr.IP.String()
}
return cidr.String()
}
// IsZero tests whether ipnet is the zero value of an IPNet, 0::0/0.
// Although this is a valid subnet, it can still be used as a sentinel
// value in some contexts.
func (ipnet IPNet) IsZero() bool {
return ipnet == IPNet{}
}
// ParseCIDR parses a string representation of an IP network in CIDR notation,
// then returns it as an IPNet (along with the original, unmasked address).
func ParseCIDR(netstr string) (ip IP, ipnet IPNet, err error) {
// TODO reimplement this without net.ParseCIDR
nip, nipnet, err := net.ParseCIDR(netstr)
if err != nil {
return
}
return FromNetIP(nip), FromNetIPNet(*nipnet), nil
}

208
irc/flatip/flatip_test.go Normal file
View File

@ -0,0 +1,208 @@
package flatip
import (
"bytes"
"fmt"
"math/rand"
"net"
"reflect"
"testing"
"time"
)
func easyParseIP(ipstr string) (result net.IP) {
result = net.ParseIP(ipstr)
if result == nil {
panic(ipstr)
}
return
}
func easyParseFlat(ipstr string) (result IP) {
x := easyParseIP(ipstr)
return FromNetIP(x)
}
func easyParseIPNet(nipstr string) (result net.IPNet) {
_, nip, err := net.ParseCIDR(nipstr)
if err != nil {
panic(err)
}
return *nip
}
func TestBasic(t *testing.T) {
nip := easyParseIP("8.8.8.8")
flatip := FromNetIP(nip)
if flatip.String() != "8.8.8.8" {
t.Errorf("conversions don't work")
}
}
func TestLoopback(t *testing.T) {
localhost_v4 := easyParseFlat("127.0.0.1")
localhost_v4_again := easyParseFlat("127.2.3.4")
google := easyParseFlat("8.8.8.8")
loopback_v6 := easyParseFlat("::1")
google_v6 := easyParseFlat("2607:f8b0:4006:801::2004")
if !(localhost_v4.IsLoopback() && localhost_v4_again.IsLoopback() && loopback_v6.IsLoopback()) {
t.Errorf("can't detect loopbacks")
}
if google_v6.IsLoopback() || google.IsLoopback() {
t.Errorf("incorrectly detected loopbacks")
}
}
func TestContains(t *testing.T) {
nipnet := easyParseIPNet("8.8.0.0/16")
flatipnet := FromNetIPNet(nipnet)
nip := easyParseIP("8.8.8.8")
flatip_ := FromNetIP(nip)
if !flatipnet.Contains(flatip_) {
t.Errorf("contains doesn't work")
}
}
var testIPStrs = []string{
"8.8.8.8",
"127.0.0.1",
"1.1.1.1",
"128.127.65.64",
"2001:0db8::1",
"::1",
"255.255.255.255",
}
func doMaskingTest(ip net.IP, t *testing.T) {
flat := FromNetIP(ip)
netLen := len(ip) * 8
for i := 0; i < netLen; i++ {
masked := flat.Mask(i, netLen)
netMask := net.CIDRMask(i, netLen)
netMasked := ip.Mask(netMask)
if !bytes.Equal(masked[:], netMasked.To16()) {
t.Errorf("Masking %s with %d/%d; expected %s, got %s", ip.String(), i, netLen, netMasked.String(), masked.String())
}
}
}
func assertEqual(found, expected interface{}) {
if !reflect.DeepEqual(found, expected) {
panic(fmt.Sprintf("expected %#v, found %#v", expected, found))
}
}
func TestSize(t *testing.T) {
_, net, err := ParseCIDR("8.8.8.8/24")
if err != nil {
panic(err)
}
ones, bits := net.Size()
assertEqual(ones, 24)
assertEqual(bits, 32)
_, net, err = ParseCIDR("2001::0db8/64")
if err != nil {
panic(err)
}
ones, bits = net.Size()
assertEqual(ones, 64)
assertEqual(bits, 128)
_, net, err = ParseCIDR("2001::0db8/96")
if err != nil {
panic(err)
}
ones, bits = net.Size()
assertEqual(ones, 96)
assertEqual(bits, 128)
}
func TestMasking(t *testing.T) {
for _, ipstr := range testIPStrs {
doMaskingTest(easyParseIP(ipstr), t)
}
}
func TestMaskingFuzz(t *testing.T) {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
buf := make([]byte, 4)
for i := 0; i < 10000; i++ {
r.Read(buf)
doMaskingTest(net.IP(buf), t)
}
buf = make([]byte, 16)
for i := 0; i < 10000; i++ {
r.Read(buf)
doMaskingTest(net.IP(buf), t)
}
}
func BenchmarkMasking(b *testing.B) {
ip := easyParseIP("2001:0db8::42")
flat := FromNetIP(ip)
b.ResetTimer()
for i := 0; i < b.N; i++ {
flat.Mask(64, 128)
}
}
func BenchmarkMaskingLegacy(b *testing.B) {
ip := easyParseIP("2001:0db8::42")
mask := net.CIDRMask(64, 128)
b.ResetTimer()
for i := 0; i < b.N; i++ {
ip.Mask(mask)
}
}
func BenchmarkMaskingCached(b *testing.B) {
i := easyParseIP("2001:0db8::42")
flat := FromNetIP(i)
mask := cidrMask(64, 128)
b.ResetTimer()
for i := 0; i < b.N; i++ {
flat.applyMask(mask)
}
}
func BenchmarkMaskingConstruct(b *testing.B) {
for i := 0; i < b.N; i++ {
cidrMask(69, 128)
}
}
func BenchmarkContains(b *testing.B) {
ip := easyParseIP("2001:0db8::42")
flat := FromNetIP(ip)
_, ipnet, err := net.ParseCIDR("2001:0db8::/64")
if err != nil {
panic(err)
}
flatnet := FromNetIPNet(*ipnet)
b.ResetTimer()
for i := 0; i < b.N; i++ {
flatnet.Contains(flat)
}
}
func BenchmarkContainsLegacy(b *testing.B) {
ip := easyParseIP("2001:0db8::42")
_, ipnetptr, err := net.ParseCIDR("2001:0db8::/64")
if err != nil {
panic(err)
}
ipnet := *ipnetptr
b.ResetTimer()
for i := 0; i < b.N; i++ {
ipnet.Contains(ip)
}
}

24
irc/flock/flock.go Normal file
View File

@ -0,0 +1,24 @@
//go:build !(plan9 || solaris)
package flock
import (
"errors"
"github.com/gofrs/flock"
)
var (
CouldntAcquire = errors.New("Couldn't acquire flock (is another Ergo running?)")
)
func TryAcquireFlock(path string) (fl Flocker, err error) {
f := flock.New(path)
success, err := f.TryLock()
if err != nil {
return nil, err
} else if !success {
return nil, CouldntAcquire
}
return f, nil
}

14
irc/flock/flock_iface.go Normal file
View File

@ -0,0 +1,14 @@
package flock
// documentation for github.com/gofrs/flock incorrectly claims that
// Flock implements sync.Locker; it does not because the Unlock method
// has a return type (err).
type Flocker interface {
Unlock() error
}
type noopFlocker struct{}
func (n *noopFlocker) Unlock() error {
return nil
}

View File

@ -0,0 +1,7 @@
//go:build plan9 || solaris
package flock
func TryAcquireFlock(path string) (fl Flocker, err error) {
return &noopFlocker{}, nil
}

Some files were not shown because too many files have changed in this diff Show More