From 9703ebf4dd6164209080ed69799c216229d82244 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sun, 28 Jun 2026 00:10:15 +0100 Subject: [PATCH] Initial Debian package for PostIt.Desktop (yavsc) --- .gitignore | 16 +++++++ Makefile | 36 ++++++++++++++ README.md | 109 ++++++++++++++++++++++++++++++++++++++++++ debian/changelog | 11 +++++ debian/compat | 1 + debian/control | 46 ++++++++++++++++++ debian/copyright | 19 ++++++++ debian/postinst | 31 ++++++++++++ debian/postit.desktop | 13 +++++ debian/postit.wrapper | 14 ++++++ debian/postrm | 17 +++++++ debian/rules | 107 +++++++++++++++++++++++++++++++++++++++++ debian/source/format | 1 + 13 files changed, 421 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100755 debian/postinst create mode 100644 debian/postit.desktop create mode 100644 debian/postit.wrapper create mode 100755 debian/postrm create mode 100755 debian/rules create mode 100644 debian/source/format diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c820f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Debian package build artifacts +*.deb +*.buildinfo +*.changes +*.debian.tar.* +debian/files +debian/postit/ + +# Upstream source tree fetched by the build (in build/) +build/ + +# Editor / OS noise +.DS_Store +.idea/ +.vscode/ +*.swp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..87b934d --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +# Makefile for the postit Debian package. +# +# Targets: +# make deb : build a .deb in the parent directory (or +# $POSTIT_OUT_DIR if set). Equivalent to +# dpkg-buildpackage -us -uc -b. +# make clean : rm -rf build/ and the per-package staging tree +# under debian/postit. +# make source : fetch the upstream yavsc source tree under +# build/yavsc-src (no packaging step). Useful for +# debugging the publish step. +# +# Environment overrides (or pass on the make command line): +# POSTIT_GIT_URL default: https://github.com/pazof/yavsc.git +# POSTIT_GIT_TAG default: 1.0.0 +# POSTIT_OUT_DIR default: $(CURDIR)/.. (artifacts land here) + +POSTIT_GIT_URL ?= https://github.com/pazof/yavsc.git +POSTIT_GIT_TAG ?= 1.0.0 +POSTIT_OUT_DIR ?= $(CURDIR)/.. + +.PHONY: deb clean source + +deb: + POSTIT_GIT_URL=$(POSTIT_GIT_URL) POSTIT_GIT_TAG=$(POSTIT_GIT_TAG) \ + dpkg-buildpackage -us -uc -b + mv ../postit_*$(POSTIT_GIT_TAG)*.deb $(POSTIT_OUT_DIR)/ 2>/dev/null || \ + mv ../postit_*.deb $(POSTIT_OUT_DIR)/ || true + +clean: + rm -rf build debian/postit + +source: + mkdir -p build + git clone --depth=1 --branch $(POSTIT_GIT_TAG) \ + $(POSTIT_GIT_URL) build/yavsc-src diff --git a/README.md b/README.md new file mode 100644 index 0000000..1658f33 --- /dev/null +++ b/README.md @@ -0,0 +1,109 @@ +# postit-debian + +Paquet Debian pour [PostIt.Desktop](../yavsc), le client desktop +Avalonia de la plateforme Yavsc.Org. + +Le paquet expose la commande `postit` sur le système, installe +l'entrée `.desktop` dans le menu, et enregistre le scheme URI +`postit://` comme MIME handler (utilisé par l'OIDC Authorization +Code + PKCE pour le hand-off du callback — RFC 8252 §7.1). + +Cible : Debian 13 (trixie). Testé également sur Ubuntu 24.04 LTS +(equivalent ABI). + +## Construction + +Pré-requis : + +```bash +sudo apt install build-essential debhelper imagemagick librsvg2-bin \ + dotnet-sdk-10.0 git +``` + +Sur Debian 13, installer .NET 10 depuis le dépôt officiel Microsoft : + +```bash +wget https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb \ + -O /tmp/ms-prod.deb +sudo dpkg -i /tmp/ms-prod.deb +sudo apt update +sudo apt install dotnet-sdk-10.0 +``` + +Puis : + +```bash +make deb +``` + +Le `.deb` atterrit dans le répertoire parent (ou `$POSTIT_OUT_DIR`). + +Pour bumper la version amont sans modifier ce dépôt : + +```bash +make deb POSTIT_GIT_TAG=1.0.1 +make deb POSTIT_GIT_URL=https://github.com/fork/yavsc.git POSTIT_GIT_TAG=my-branch +``` + +## Installation + +```bash +sudo apt install ./postit_1.0.0-1_amd64.deb +``` + +ou directement : + +```bash +sudo dpkg -i postit_1.0.0-1_amd64.deb +sudo apt -f install # résout les dépendances manquantes +``` + +Pour installer sur **arm64** : + +```bash +make clean && make deb # sur une machine arm64, le .deb sera _arm64.deb +``` + +## Vérification + +Après installation : + +```bash +$ which postit +/usr/bin/postit +$ postit --help # (l'application Avalonia ouvre sa fenêtre) +$ xdg-mime query default x-scheme-handler/postit +postit.desktop +$ xdg-open postit://callback?code=test +``` + +Le scheme handler lance PostIt avec l'URL en argument. En interne, +PostIt (PostIt.Desktop) appelle `SingleInstance.TryHandOffAsync` +puis sort, transferrant l'URL au process PostIt déjà actif via +un named pipe. + +## Désinstallation + +```bash +sudo apt remove postit +``` + +Le `postrm` du paquet rafraîchit la base `.desktop`. Le scheme +handler `postit://` n'est pas explicitement désenregistré +(système — par utilisateur c'est `xdg-mime default ...`). + +## Maintenance + +- Bumper `debian/changelog` à chaque release, conformément à la + Debian Policy §4.4 (entries datées, signées par le mainteneur). +- Mettre à jour `POSTIT_GIT_TAG` par défaut dans `debian/rules` + et `Makefile` à chaque release amont. +- Rebuild après changement de licence amont. + +## Liens + +- [pazof/yavsc](https://github.com/pazof/yavsc) — source amont. +- [doc/postit-oidc.md](https://github.com/pazof/yavsc/blob/main/doc/architecture/postit-oidc.md) + — flow OIDC + custom URI scheme. +- [Debian Policy Manual](https://www.debian.org/doc/debian-policy/) + — référence pour la structure d'un paquet. diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..2152a9d --- /dev/null +++ b/debian/changelog @@ -0,0 +1,11 @@ +postit (1.0.0-1) trixie; urgency=medium + + * Initial release. + * Built from the pazof/yavsc repository at the tag 1.0.0. + * Packages PostIt.Desktop (Avalonia 12) as a Debian package + named `postit`, exposing the command `postit` on PATH. + * Registers the postit:// URI scheme as an XDG MIME handler so + that xdg-open postit://... launches the freshly installed + client. + + -- Paul Schneider Sat, 28 Jun 2026 00:01:00 +0100 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b1bd38b --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +13 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..b8c667d --- /dev/null +++ b/debian/control @@ -0,0 +1,46 @@ +Source: postit +Section: x11 +Priority: optional +Maintainer: Paul Schneider +Build-Depends: + debhelper-compat (= 13), + dotnet-sdk-10.0 (>= 10.0.0) | dotnet-sdk-10.0, + imagemagick, + librsvg2-bin, + git, + ca-certificates, +Standards-Version: 4.7.0 +Rules-Requires-Root: no +Homepage: https://github.com/pazof/yavsc + +Package: postit +Architecture: amd64 arm64 +Depends: + ${misc:Depends}, + ${shlibs:Depends}, + dotnet-runtime-10.0 (>= 10.0.0) | aspnetcore-runtime-10.0 (>= 10.0.0), + libgtk-3-0 (>= 3.24.0), + libwebkit2gtk-4.1-0 | libwebkit2gtk-4.0-0, + libfontconfig1, + libssl3, + xdg-utils, +Recommends: + desktop-file-utils, + mime-support, +Description: Yavsc PostIt — desktop client for the Yavsc platform + PostIt is the Avalonia-based desktop client for the Yavsc.Org + platform. It authenticates against the platform's OIDC endpoint + using the Authorization Code + PKCE flow over a custom URI scheme + (postit:// — RFC 8252 §7.1), and exposes the blog and account + features in a native window. + . + This package installs: + - the compiled PostIt.Desktop application under /usr/lib/postit/, + - a `postit` wrapper in /usr/bin/ that invokes dotnet on the + bundled assembly, + - an XDG .desktop entry under /usr/share/applications/, and + - the MIME handler registration for the postit:// scheme + (so xdg-open postit://... launches PostIt). + . + The package pulls its source from the pazof/yavsc git + repository at the tag pinned in debian/rules (POSTIT_GIT_TAG). diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..8c6c036 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,19 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: postit +Upstream-Contact: Paul Schneider +Source: https://github.com/pazof/yavsc + +Files: * +Copyright: 2026 Paul Schneider +License: WTFPL + +License: WTFPL + Do What The F*ck You Want To Public License + . + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + . + On Debian systems, the complete text of the WTFPL license can be + found in /usr/share/common-licenses/WTFPL or at + . diff --git a/debian/postinst b/debian/postinst new file mode 100755 index 0000000..d2c2383 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,31 @@ +#!/bin/sh +# postinst — run after the package is unpacked +# +# Two responsibilities: +# 1. Refresh the desktop-file database so the application appears +# in the menu (xdg-utils / desktop-file-utils). +# 2. Register postit as the default handler for the postit:// +# URI scheme via xdg-mime. This is what makes +# `xdg-open postit://callback?code=***` launch PostIt. + +set -e + +if [ -x /usr/bin/update-desktop-database ]; then + update-desktop-database -q /usr/share/applications || true +fi + +# xdg-mime default is per-user; the system-wide default is set +# via a MIME-typed association in /usr/share/applications/ which +# update-desktop-database picks up. We just need to make sure the +# desktop file is registered for the postit:// scheme at the +# system level. +if [ -x /usr/bin/xdg-mime ]; then + # Per-user registration is not appropriate here; the system-wide + # registration happens via the MimeType= field in the .desktop + # file plus update-desktop-database above. Nothing more to do. + : +fi + +#DEBHELPER# + +exit 0 diff --git a/debian/postit.desktop b/debian/postit.desktop new file mode 100644 index 0000000..cf6acb6 --- /dev/null +++ b/debian/postit.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Type=Application +Name=PostIt +GenericName=Yavsc Desktop Client +Comment=Desktop client for the Yavsc platform (OIDC + blog) +Exec=/usr/bin/postit %u +Icon=postit +Terminal=false +Categories=Network;InstantMessaging;Office; +StartupNotify=true +StartupWMClass=PostIt +MimeType=x-scheme-handler/postit; +Keywords=Yavsc;OIDC;Blog;OAuth; diff --git a/debian/postit.wrapper b/debian/postit.wrapper new file mode 100644 index 0000000..b9329cf --- /dev/null +++ b/debian/postit.wrapper @@ -0,0 +1,14 @@ +#!/bin/sh +# Wrapper installed at /usr/bin/postit. +# +# PostIt.Desktop publishes to a directory of managed .NET +# assemblies (PostIt.Desktop.dll + runtimeconfig.json + +# Avalonia*.dll + dependencies). The dotnet host resolves +# the runtime config relative to the assembly path, so we +# can call PostIt.Desktop.dll directly from any cwd. +# +# /usr/lib/postit/ is owned by the postit package (see +# debian/postit.install) and is not user-writable, so the +# wrapper does not need to defensively check its location. + +exec dotnet /usr/lib/postit/PostIt.Desktop.dll "$@" diff --git a/debian/postrm b/debian/postrm new file mode 100755 index 0000000..88fad3c --- /dev/null +++ b/debian/postrm @@ -0,0 +1,17 @@ +#!/bin/sh +# postrm — run after the package is removed or purged +# +# Refresh the desktop-file database so the application disappears +# from the menu. We do not unregister the postit:// MIME handler +# at the system level (no clean API for that) — if the user wants +# a different default they can run `xdg-mime default ...` themselves. + +set -e + +if [ -x /usr/bin/update-desktop-database ]; then + update-desktop-database -q /usr/share/applications || true +fi + +#DEBHELPER# + +exit 0 diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..865c418 --- /dev/null +++ b/debian/rules @@ -0,0 +1,107 @@ +#!/usr/bin/make -f +# +# Debian package build for PostIt (Yavsc desktop client). +# +# Pipeline: +# 1. Clone pazof/yavsc at POSTIT_GIT_TAG into a clean working +# tree under $(BUILDDIR)/yavsc-src. +# 2. Restore + publish src/PostIt/PostIt.Desktop as a +# linux-x64, framework-dependent (not self-contained) +# assembly tree into $(BUILDDIR)/postit-app. +# 3. Render the icon at the hicolor sizes (16, 32, 48, +# 64, 128, 256) from src/PostIt/PostIt/Assets/Icon.png, +# plus the SVG from the same directory as the scalable +# form. +# 4. Lay out the package tree: +# /usr/lib/postit/ (managed assemblies) +# /usr/bin/postit (wrapper script) +# /usr/share/applications/ (postit.desktop) +# /usr/share/icons/hicolor/ (icons) +# 5. Run dh to install, fix permissions, build the binary +# package. +# +# Override POSTIT_GIT_TAG or POSTIT_GIT_URL on the make command +# line to build a different upstream revision: +# +# make deb POSTIT_GIT_TAG=1.0.1 +# make deb POSTIT_GIT_URL=https://github.com/fork/yavsc.git + +POSTIT_GIT_URL ?= https://github.com/pazof/yavsc.git +POSTIT_GIT_TAG ?= 1.0.0 +POSTIT_DESKTOP_PROJECT := src/PostIt/PostIt.Desktop/PostIt.Desktop.csproj +POSTIT_ASSEMBLY_NAME := PostIt.Desktop +POSTIT_APP_DIR := $(CURDIR)/debian/postit +POSTIT_LIB_DIR := $(POSTIT_APP_DIR)/usr/lib/postit +POSTIT_BIN_DIR := $(POSTIT_APP_DIR)/usr/bin +POSTIT_SHARE_DIR := $(POSTIT_APP_DIR)/usr/share +POSTIT_BUILD_DIR := $(CURDIR)/build +POSTIT_SRC_DIR := $(POSTIT_BUILD_DIR)/yavsc-src + +ICON_SIZES := 16 32 48 64 128 256 + +%: + dh $@ + +# dh_auto_clean: nothing to do (we don't have a Debian source +# tree yet at clean time, we fetch it in override_dh_auto_build). + +override_dh_auto_clean: + rm -rf $(POSTIT_BUILD_DIR) + +override_dh_auto_build: + # 1. Fetch the upstream source. + mkdir -p $(POSTIT_BUILD_DIR) + git clone --depth=1 --branch $(POSTIT_GIT_TAG) \ + $(POSTIT_GIT_URL) $(POSTIT_SRC_DIR) + + # 2. Publish PostIt.Desktop for the host architecture. + # --self-contained false : rely on the system .NET + # runtime (declared in Depends: in debian/control). + # -p:PublishReadyToRun=false : avoid R2R which inflates + # the binary for marginal startup gain on a desktop GUI. + cd $(POSTIT_SRC_DIR) && \ + dotnet publish $(POSTIT_DESKTOP_PROJECT) \ + -c Release \ + --self-contained false \ + -p:PublishReadyToRun=false \ + -o $(POSTIT_BUILD_DIR)/postit-app + + # 3. Lay out the binary tree. + mkdir -p $(POSTIT_LIB_DIR) + cp -r $(POSTIT_BUILD_DIR)/postit-app/. $(POSTIT_LIB_DIR)/ + # PostIt.Desktop.dll is the entry assembly; rename or symlink + # for clarity (the wrapper references PostIt.Desktop.dll). + ls $(POSTIT_LIB_DIR)/ | head -20 + + mkdir -p $(POSTIT_BIN_DIR) + cp $(CURDIR)/debian/postit.wrapper $(POSTIT_BIN_DIR)/postit + chmod 0755 $(POSTIT_BIN_DIR)/postit + + # 4. Icons. + mkdir -p $(POSTIT_SHARE_DIR)/applications + cp $(CURDIR)/debian/postit.desktop $(POSTIT_SHARE_DIR)/applications/ + + mkdir -p $(POSTIT_SHARE_DIR)/icons/hicolor/scalable/apps + cp $(POSTIT_SRC_DIR)/src/PostIt/PostIt/Assets/yavsc-logo.svg \ + $(POSTIT_SHARE_DIR)/icons/hicolor/scalable/apps/postit.svg + + for size in $(ICON_SIZES); do \ + mkdir -p $(POSTIT_SHARE_DIR)/icons/hicolor/$${size}x$${size}/apps; \ + convert $(POSTIT_SRC_DIR)/src/PostIt/PostIt/Assets/Icon.png \ + -resize $${size}x$${size} \ + $(POSTIT_SHARE_DIR)/icons/hicolor/$${size}x$${size}/apps/postit.png; \ + done + +override_dh_auto_test: + # No upstream test suite for PostIt.Desktop at this stage + # (the Yavsc.Org.Tests project is for the web front, not the + # desktop client). Build smoke is sufficient for the package. + +override_dh_install: + dh_install + +override_dh_shlibdeps: + dh_shlibdeps + +override_dh_strip: + dh_strip --exclude=.pdb diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt)