First slice of in-chat file/photo sharing (dedicated file plane, images inline + file chips, session-only). This stage adds the wire types and the pure, unit-tested logic; no transport or UI yet. - protocol: new FILES_ALPN / FILES_PROTO (peerspeak/files/1) for the dedicated file-transfer plane. Bump GOSSIP_PROTO 1->2 + sig domain v2 (Chat gained an attachment field, so cross-version peers fail fast rather than half-work) and Cargo 0.2.0 -> 0.3.0 per VERSIONING.md. BREAKING wire change: all peers must run >= 0.3.0. - new src/files.rs: ChatAttachment descriptor (name/size/kind/id; bytes travel off-gossip), AttachmentKind, plus pure seams — sanitize_filename (path-traversal/control-char/length-safe), size_within_cap, image magic-byte sniffing + defensive limited decode (decode-bomb guard), 32-byte request parsing, human_size. 13 unit tests. - GossipMessage::Chat and RoomEvent::ChatMessage carry an optional ChatAttachment; send_chat takes Option<ChatAttachment>. Untrusted inbound descriptors are filename-sanitized + size-validated on ingest. serde(default) keeps the field forward-compatible at the JSON layer; +round-trip and pre-v2 back-compat tests. The attachment id is a random 32-byte handle (rand, already a dep), not a content hash — the fetch is authenticated + encrypted + member-gated, so no crypto-hash dep is needed. 349 lib tests pass, clippy clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
69 lines
2.2 KiB
Bash
69 lines
2.2 KiB
Bash
# Maintainer: mollusk <jitty+lc1iz0dc@protonmail.com>
|
|
pkgname=peerspeak-git
|
|
_pkgname=peerspeak
|
|
pkgver=0.2.0.r218.gcbba4b6
|
|
pkgrel=1
|
|
pkgdesc="Decentralized peer-to-peer voice chat (Rust/iroh/PipeWire/Opus/iced)"
|
|
arch=('x86_64')
|
|
url="https://gitbutter.xyz/mollusk/peerspeak"
|
|
license=('custom')
|
|
depends=('pipewire' 'opus')
|
|
makedepends=('git' 'cargo' 'pkgconf')
|
|
optdepends=('pixelpass: screen sharing inside a room'
|
|
'mpv: screen-share viewer (vlc is used as a fallback)')
|
|
provides=('peerspeak')
|
|
conflicts=('peerspeak')
|
|
options=('!lto' '!debug')
|
|
source=("$_pkgname::git+ssh://git@gitbutter.xyz/mollusk/peerspeak.git")
|
|
sha256sums=('SKIP')
|
|
|
|
pkgver() {
|
|
cd "$srcdir/$_pkgname"
|
|
# 0.1.0.r<commits>.g<short-sha> — sorts monotonically across rebuilds.
|
|
printf '%s.r%s.g%s' \
|
|
"$(awk -F'\"' '/^version =/{print $2; exit}' Cargo.toml)" \
|
|
"$(git rev-list --count HEAD)" \
|
|
"$(git rev-parse --short HEAD)"
|
|
}
|
|
|
|
prepare() {
|
|
cd "$srcdir/$_pkgname"
|
|
# Vendor deps up front so build() can run --frozen (no surprise network).
|
|
export CARGO_HOME="$srcdir/cargo-home"
|
|
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
|
|
}
|
|
|
|
build() {
|
|
cd "$srcdir/$_pkgname"
|
|
export CARGO_HOME="$srcdir/cargo-home"
|
|
export RUSTUP_TOOLCHAIN=stable
|
|
export CARGO_TARGET_DIR=target
|
|
cargo build --frozen --release --bin "$_pkgname"
|
|
}
|
|
|
|
check() {
|
|
cd "$srcdir/$_pkgname"
|
|
export CARGO_HOME="$srcdir/cargo-home"
|
|
export RUSTUP_TOOLCHAIN=stable
|
|
# Library unit tests only — the integration suites bind real iroh/QUIC
|
|
# endpoints and fail in a sandboxed/offline build environment.
|
|
cargo test --frozen --release --lib
|
|
}
|
|
|
|
package() {
|
|
cd "$srcdir/$_pkgname"
|
|
|
|
install -Dm755 "target/release/$_pkgname" "$pkgdir/usr/bin/$_pkgname"
|
|
install -Dm644 "packaging/$_pkgname.desktop" \
|
|
"$pkgdir/usr/share/applications/$_pkgname.desktop"
|
|
|
|
# Hicolor icon theme (scalable SVG + the rendered raster sizes).
|
|
install -Dm644 "assets/icons/$_pkgname.svg" \
|
|
"$pkgdir/usr/share/icons/hicolor/scalable/apps/$_pkgname.svg"
|
|
local s
|
|
for s in 16 24 32 48 64 128 256 512; do
|
|
install -Dm644 "assets/icons/$_pkgname-$s.png" \
|
|
"$pkgdir/usr/share/icons/hicolor/${s}x${s}/apps/$_pkgname.png"
|
|
done
|
|
}
|