Skip to content

Commit 68ecc4a

Browse files
committed
Add pgp_fingerprint and wkd_email to release schema
Prepares for archlinux/archweb#648 which adds these fields to the releng releases JSON API.
1 parent 2f1d663 commit 68ecc4a

File tree

7 files changed

+72
-41
lines changed

7 files changed

+72
-41
lines changed

internal/database/migrations/000001_initial.up.sql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ CREATE TABLE release (
7777
sha256_sum TEXT,
7878
b2_sum TEXT,
7979
torrent_url TEXT,
80-
magnet_uri TEXT
80+
magnet_uri TEXT,
81+
pgp_fingerprint TEXT,
82+
wkd_email TEXT
8183
);
8284
CREATE INDEX idx_release_available_date ON release(available, release_date);
8385

internal/download/handler_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ func setupTestDB(t *testing.T) *sql.DB {
2626
version TEXT PRIMARY KEY, available INTEGER NOT NULL DEFAULT 1,
2727
info TEXT, created INTEGER, release_date INTEGER, kernel_version TEXT,
2828
file_name TEXT, file_length INTEGER, sha1_sum TEXT, sha256_sum TEXT,
29-
b2_sum TEXT, torrent_url TEXT, magnet_uri TEXT)`,
29+
b2_sum TEXT, torrent_url TEXT, magnet_uri TEXT,
30+
pgp_fingerprint TEXT, wkd_email TEXT)`,
3031

3132
`INSERT INTO release (version, available, info, release_date, kernel_version, file_name, file_length, created) VALUES
3233
('2024.01.01', 1, 'January release', 1704067200, '6.6.7', 'archlinux-2024.01.01-x86_64.iso', 900000000, 1704067200),

internal/download/templates.templ

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,11 @@ templ DownloadPage(data downloadData) {
4444
<pre class="ms-4 mt-2 mb-0 overflow-auto"><code>b2sum -c b2sums.txt</code></pre>
4545
</li>
4646
}
47-
// TODO: get signer email from upstream API once available
4847
<li class="mb-3">
4948
<a href={ templ.SafeURL(data.UpstreamISODir + data.Release.FileName + ".sig") }>PGP-Signatur</a>
50-
<pre class="ms-4 mt-2 mb-0 overflow-auto"><code>{ "gpg --auto-key-locate clear,wkd \\\n -v --locate-external-key \\\n pierre@archlinux.org" }</code></pre>
49+
if data.Release.WKDEmail != "" {
50+
<pre class="ms-4 mt-2 mb-0 overflow-auto"><code>{ fmt.Sprintf("gpg --auto-key-locate clear,wkd \\\n -v --locate-external-key \\\n %s", data.Release.WKDEmail) }</code></pre>
51+
}
5152
<pre class="ms-4 mt-2 mb-0 overflow-auto"><code>{ fmt.Sprintf("gpg --verify %s.sig", data.Release.FileName) }</code></pre>
5253
</li>
5354
</ul>

internal/releases/repository.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ import (
66
)
77

88
type Release struct {
9-
Version string
10-
Available bool
11-
Info string
12-
ReleaseDate int64
13-
Created int64
14-
KernelVersion string
15-
FileLength int64
16-
FileName string
17-
SHA1Sum string
18-
SHA256Sum string
19-
B2Sum string
20-
TorrentURL string
21-
MagnetURI string
9+
Version string
10+
Available bool
11+
Info string
12+
ReleaseDate int64
13+
Created int64
14+
KernelVersion string
15+
FileLength int64
16+
FileName string
17+
SHA1Sum string
18+
SHA256Sum string
19+
B2Sum string
20+
TorrentURL string
21+
MagnetURI string
22+
PGPFingerprint string
23+
WKDEmail string
2224
}
2325

2426
type Repository struct {
@@ -77,11 +79,13 @@ func (r *Repository) FindByVersion(ctx context.Context, version string) (Release
7779
err := r.db.QueryRowContext(ctx,
7880
`SELECT version, available, COALESCE(info, ''), COALESCE(release_date, 0), COALESCE(kernel_version, ''),
7981
COALESCE(file_length, 0), COALESCE(file_name, ''), COALESCE(sha1_sum, ''), COALESCE(sha256_sum, ''),
80-
COALESCE(b2_sum, ''), COALESCE(torrent_url, ''), COALESCE(magnet_uri, '')
82+
COALESCE(b2_sum, ''), COALESCE(torrent_url, ''), COALESCE(magnet_uri, ''),
83+
COALESCE(pgp_fingerprint, ''), COALESCE(wkd_email, '')
8184
FROM release WHERE version = ?`, version).Scan(
8285
&rel.Version, &rel.Available, &rel.Info, &rel.ReleaseDate, &rel.KernelVersion,
8386
&rel.FileLength, &rel.FileName, &rel.SHA1Sum, &rel.SHA256Sum,
8487
&rel.B2Sum, &rel.TorrentURL, &rel.MagnetURI,
88+
&rel.PGPFingerprint, &rel.WKDEmail,
8589
)
8690
return rel, err
8791
}
@@ -91,11 +95,13 @@ func (r *Repository) LatestAvailable(ctx context.Context) (Release, error) {
9195
err := r.db.QueryRowContext(ctx,
9296
`SELECT version, available, COALESCE(info, ''), COALESCE(release_date, 0), COALESCE(kernel_version, ''),
9397
COALESCE(file_length, 0), COALESCE(file_name, ''), COALESCE(sha1_sum, ''), COALESCE(sha256_sum, ''),
94-
COALESCE(b2_sum, ''), COALESCE(torrent_url, ''), COALESCE(magnet_uri, '')
98+
COALESCE(b2_sum, ''), COALESCE(torrent_url, ''), COALESCE(magnet_uri, ''),
99+
COALESCE(pgp_fingerprint, ''), COALESCE(wkd_email, '')
95100
FROM release WHERE available = 1 ORDER BY release_date DESC LIMIT 1`).Scan(
96101
&rel.Version, &rel.Available, &rel.Info, &rel.ReleaseDate, &rel.KernelVersion,
97102
&rel.FileLength, &rel.FileName, &rel.SHA1Sum, &rel.SHA256Sum,
98103
&rel.B2Sum, &rel.TorrentURL, &rel.MagnetURI,
104+
&rel.PGPFingerprint, &rel.WKDEmail,
99105
)
100106
return rel, err
101107
}

internal/releases/repository_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ func setupTestDB(t *testing.T) *sql.DB {
2121
version TEXT PRIMARY KEY, available INTEGER NOT NULL DEFAULT 1,
2222
info TEXT, created INTEGER, release_date INTEGER, kernel_version TEXT,
2323
file_name TEXT, file_length INTEGER, sha1_sum TEXT, sha256_sum TEXT,
24-
b2_sum TEXT, torrent_url TEXT, magnet_uri TEXT)`,
24+
b2_sum TEXT, torrent_url TEXT, magnet_uri TEXT,
25+
pgp_fingerprint TEXT, wkd_email TEXT)`,
2526
`INSERT INTO release (version, available, info, created, release_date, kernel_version, file_name, file_length) VALUES
2627
('2024.01.01', 1, 'January release', 1704067200, 1704067200, '6.6.7', 'archlinux-2024.01.01-x86_64.iso', 900000000),
2728
('2023.12.01', 1, 'December release', 1701388800, 1701388800, '6.6.4', 'archlinux-2023.12.01-x86_64.iso', 890000000),

internal/releases/templates.templ

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@ templ ReleaseDetail(rel Release) {
132132
<td><a href={ templ.SafeURL(rel.ISOSigUrl()) } rel="nofollow noopener">PGP-Signatur</a></td>
133133
</tr>
134134
}
135+
if rel.PGPFingerprint != "" {
136+
<tr>
137+
<th>PGP-Fingerprint</th>
138+
<td class="text-break">{ rel.PGPFingerprint }</td>
139+
</tr>
140+
}
141+
if rel.WKDEmail != "" {
142+
<tr>
143+
<th>PGP-Signer</th>
144+
<td>{ rel.WKDEmail }</td>
145+
</tr>
146+
}
135147
</tbody>
136148
</table>
137149
</div>

internal/releases/update.go

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,21 @@ type relengResponse struct {
2121
}
2222

2323
type relengRelease struct {
24-
Version string `json:"version"`
25-
Available bool `json:"available"`
26-
Info string `json:"info"`
27-
Created string `json:"created"`
28-
ReleaseDate string `json:"release_date"`
29-
KernelVersion *string `json:"kernel_version"`
30-
ISOUrl *string `json:"iso_url"`
31-
SHA1Sum *string `json:"sha1_sum"`
32-
SHA256Sum *string `json:"sha256_sum"`
33-
B2Sum *string `json:"b2_sum"`
34-
TorrentURL *string `json:"torrent_url"`
35-
MagnetURI *string `json:"magnet_uri"`
36-
Torrent *relengTorrent `json:"torrent"`
24+
Version string `json:"version"`
25+
Available bool `json:"available"`
26+
Info string `json:"info"`
27+
Created string `json:"created"`
28+
ReleaseDate string `json:"release_date"`
29+
KernelVersion *string `json:"kernel_version"`
30+
ISOUrl *string `json:"iso_url"`
31+
SHA1Sum *string `json:"sha1_sum"`
32+
SHA256Sum *string `json:"sha256_sum"`
33+
B2Sum *string `json:"b2_sum"`
34+
TorrentURL *string `json:"torrent_url"`
35+
MagnetURI *string `json:"magnet_uri"`
36+
PGPFingerprint *string `json:"pgp_fingerprint"`
37+
WKDEmail *string `json:"wkd_email"`
38+
Torrent *relengTorrent `json:"torrent"`
3739
}
3840

3941
type relengTorrent struct {
@@ -42,11 +44,13 @@ type relengTorrent struct {
4244
}
4345

4446
var (
45-
versionRe = regexp.MustCompile(`^[0-9]+[\.\-\w]+$`)
46-
kernelVersionRe = regexp.MustCompile(`^[\d\.]{5,10}$`)
47-
sha1Re = regexp.MustCompile(`^[0-9a-f]{40}$`)
48-
sha256Re = regexp.MustCompile(`^[0-9a-f]{64}$`)
49-
b2Re = regexp.MustCompile(`^[0-9a-f]{128}$`)
47+
versionRe = regexp.MustCompile(`^[0-9]+[\.\-\w]+$`)
48+
kernelVersionRe = regexp.MustCompile(`^[\d\.]{5,10}$`)
49+
sha1Re = regexp.MustCompile(`^[0-9a-f]{40}$`)
50+
sha256Re = regexp.MustCompile(`^[0-9a-f]{64}$`)
51+
b2Re = regexp.MustCompile(`^[0-9a-f]{128}$`)
52+
pgpFingerprintRe = regexp.MustCompile(`^[0-9A-F]{40}$`)
53+
emailRe = regexp.MustCompile(`^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$`)
5054
)
5155

5256
func Update(ctx context.Context, db *sql.DB) error {
@@ -64,14 +68,15 @@ func Update(ctx context.Context, db *sql.DB) error {
6468
defer func() { _ = tx.Rollback() }()
6569

6670
stmt, err := tx.PrepareContext(ctx,
67-
`INSERT INTO release (version, available, info, created, release_date, kernel_version, file_name, file_length, sha1_sum, sha256_sum, b2_sum, torrent_url, magnet_uri)
68-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
71+
`INSERT INTO release (version, available, info, created, release_date, kernel_version, file_name, file_length, sha1_sum, sha256_sum, b2_sum, torrent_url, magnet_uri, pgp_fingerprint, wkd_email)
72+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
6973
ON CONFLICT (version) DO UPDATE SET
7074
available = excluded.available, info = excluded.info, created = excluded.created,
7175
release_date = excluded.release_date, kernel_version = excluded.kernel_version,
7276
file_name = excluded.file_name, file_length = excluded.file_length,
7377
sha1_sum = excluded.sha1_sum, sha256_sum = excluded.sha256_sum, b2_sum = excluded.b2_sum,
74-
torrent_url = excluded.torrent_url, magnet_uri = excluded.magnet_uri`)
78+
torrent_url = excluded.torrent_url, magnet_uri = excluded.magnet_uri,
79+
pgp_fingerprint = excluded.pgp_fingerprint, wkd_email = excluded.wkd_email`)
7580
if err != nil {
7681
return err
7782
}
@@ -112,12 +117,15 @@ func Update(ctx context.Context, db *sql.DB) error {
112117
sha1Sum := matchOrNil(r.SHA1Sum, sha1Re)
113118
sha256Sum := matchOrNil(r.SHA256Sum, sha256Re)
114119
b2Sum := matchOrNil(r.B2Sum, b2Re)
120+
pgpFingerprint := matchOrNil(r.PGPFingerprint, pgpFingerprintRe)
121+
wkdEmail := matchOrNil(r.WKDEmail, emailRe)
115122

116123
if _, err := stmt.ExecContext(ctx,
117124
r.Version, r.Available, info, created, releaseDate,
118125
kernelVersion, fileName, fileLength,
119126
sha1Sum, sha256Sum, b2Sum,
120127
torrentURL, r.MagnetURI,
128+
pgpFingerprint, wkdEmail,
121129
); err != nil {
122130
return err
123131
}

0 commit comments

Comments
 (0)