1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
# Aegis
Aegis is a desktop Usenet reader written in Go with Fyne. It connects to an
NNTP server directly or through SOCKS5, supports implicit TLS, optional
`AUTHINFO USER/PASS` authentication, group discovery, local subscriptions,
overview search, article retrieval, and text article posting.
## Group population
Before subscribing, Aegis displays an estimated post count for every group
returned by `LIST ACTIVE`. The estimate is `high - low + 1`. NNTP article
numbers can contain gaps, so this is an upper-bound style estimate rather than
a guaranteed count. After selecting a group, the server's `GROUP` response is
used for the current article count.
## Build and test
```sh
gofmt -w .
go test ./...
go test -race ./...
go vet -buildvcs=false ./...
go build -buildvcs=false -o aegis .
```
The `-buildvcs=false` option is useful when the source directory is not a Git
working tree.
## Configuration and credentials
Settings are stored in the user configuration directory as
`aegis/config.json` with mode `0600`. The NNTP password is never written to
that file and remains only in memory for the current application run.
TLS certificate validation is enabled by default. The Settings screen has an
explicit `Do not verify the TLS certificate` opt-in for local testing or a
pinned/trusted connection that cannot present a verifiable certificate. It can
expose account credentials and article traffic to a man-in-the-middle and
should not be enabled on an untrusted network.
## Identity and message cryptography
The posting profile is VFace-compatible but optional for publishing. Its
username, email address, and canonical Ed25519 public key are joined as
`username|email|public-key`. That exact string produces the 48x48 transparent
PNG identicon through the existing Ch1ffr3punk `identicon-cli` executable.
Aegis accepts no uploaded or alternate profile image and no image format other
than the validated PNG. It publishes the SHA-256 identity hash, the SHA-256
hash of the PNG, and the verification link
`https://identicons.virebent.art` together with `Face:` and the interoperable
`X-Ed25519-Pub` header. Aegis looks first at
`/home/gabriel1/Projects/identicons/identicons-cli`, then at the configured
`AEGIS_IDENTICON_CLI` path and other standard locations. The executable must
return a 48x48 PNG as base64. Aegis does not embed the identicon GUI.
Age is the software encryption format. OpenPGP is not exposed as a standalone
software format: it is reserved for the YubiKey OpenPGP integration. The
optional VFace profile generates an Ed25519 identity and stores it in an
age-encrypted local vault protected by a user password of at least 12
characters.
The composer keeps the classic Usenet path as the default. It sends RFC 5322
and MIME-compatible text articles directly to NNTP, with UTF-8 `8bit` text,
canonical CRLF line endings, and a generated `Message-ID`. Optional composer
modes can sign the canonical body with an Ed25519 key, encrypt the body with
age (native X25519 or SSH Ed25519/RSA recipients), or do both. These modes add
`X-Aegis-*` metadata,
including the inline verification key, its SHA-256 fingerprint, and an
optional HTTPS key URL. The URL is metadata only and is never fetched
automatically.
Ed25519 is used for signatures, not encryption. The age recipient must be an
encryption key, and private keys are supplied for the current operation only.
The optional SURB integration remains a separate future task and is not part
of classic Usenet posting.
TLS connections require TLS 1.2 or 1.3. For TLS 1.2, Aegis offers only
ECDHE-AES-GCM suites. Go does not expose TLS 1.3 cipher-suite selection, so a
TLS 1.3 connection can still negotiate the platform's ChaCha20-Poly1305
suite. Deployments that require GCM exclusively must cap the NNTP server at
TLS 1.2.
## Current limits
- implicit TLS and STARTTLS are supported; COMPRESS DEFLATE is deliberately
rejected whenever TLS is enabled and is available only for cleartext NNTP;
- SOCKS5 username/password authentication is not exposed in the interface;
- at most the latest 500 overview records are loaded per group;
- posting creates MIME 1.0 text articles with UTF-8 and `8bit` by default;
attachment file selection remains pending; article lines are validated at a maximum of 998
octets and sent with canonical CRLF line endings;
- composer supports age and optional VFace Ed25519 signing; OpenPGP remains
reserved for the YubiKey integration;
- SMTP mail2news delivery supports cleartext, implicit TLS or STARTTLS. It
reuses the single NNTP proxy configuration, and SOCKS5 routing is required
for `.onion` hosts; the SMTP password is session-only;
- subscriptions are local Aegis preferences, because NNTP itself has no
standard server-side subscription command.
The complete-client audit and prioritized roadmap are in
[`docs/client-feature-audit.md`](docs/client-feature-audit.md). Optional
features remain part of the main Aegis binary for now, without a runtime
plugin directory.
|