mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-01 05:47:31 -06:00
* packaging: Flatpak finds and prints to CUPS printers The Print dialog listed no printers in the Flatpak: the runtime has libcups but not lpstat/lp, the sandbox couldn't reach the CUPS socket, and driverless network printers (lpstat -e) need Avahi. Bundle lpstat/lp/lpoptions from CUPS 2.4.20 (Apache-2.0, statically linked, licence installed) and grant --socket=cups and --system-talk-name=org.freedesktop.Avahi in both manifests. * print: lp takes the job only when CUPS lists a printer; the only printer by default; ~/.cups read-only Review (CodeRabbit) on bundling lp in the Flatpak: - With lp present but CUPS down or empty, the job failed on lp instead of reaching the IPP route and the print portal. lp_route now gives up the route when lpstat lists no printer, before anything is submitted. - With no printer named, no default and one queue, IPP picked it but lp failed. lp_route names the only printer. - The sandbox ignored the user's default printer, saved options and client.conf server: grant ~/.cups read-only in both manifests. * print: no printers for lp means the portal, not IPP; bounded listing; CUPS socket wrapper Review: - When lp is there but CUPS lists no printer, the job went to the IPP route, whose server detection ignores ~/.cups/client.conf and could print to a local default printer instead of the configured server. It now goes to the print portal, or fails with no portal. - The lpstat listing before a job is bounded (10 s, then lp takes the job as before) and runs outside SPOOLER, which guards only Windows driver calls. - Flatpak mounts the host's CUPS socket at /var/run/cups/cups.sock whatever path client.conf or CUPS_SERVER names; the CUPS tools now run through a wrapper that points a socket path missing in the sandbox there, leaving server names alone. * packaging: redirect a custom CUPS socket only when it is the one Flatpak mounted Review (CodeRabbit): Flatpak picks the socket it mounts at /var/run/cups/cups.sock with stricter rules than CUPS (flatpak-run-cups.c: a socket CUPS_SERVER, else the first line spelled exactly "ServerName /path" in ~/.cups/client.conf, else the default), while CUPS reads the keyword in any case and takes the last ServerName. The wrapper now redirects only when CUPS' socket is the one Flatpak chose, so a job can't reach a different server; otherwise CUPS fails on the missing path. * print: a printer listing past its deadline kills and reaps lpstat Review: the 10 s limit stopped waiting but left a hung lpstat and its thread running, so repeated print attempts could pile them up. photocraft now runs the two lpstat listings itself (craft-print's lpstat_command and an equivalent lpstat -e, parsed by printers_parsed) and kills and reaps each one at the shared deadline. The output is read on a thread that ends with the process, so nothing outlives the job. * packaging: never redirect a CUPS_SERVER the sandbox was given Review (CodeRabbit): Flatpak picks the socket it mounts from the host's CUPS_SERVER, so one set by flatpak run --env or an override may not be what it mounted. The wrapper now leaves any CUPS_SERVER alone and redirects only a client.conf socket that matches Flatpak's choice; otherwise CUPS fails on the missing path instead of reaching a different server. * packaging: point CUPS at the mounted socket only when it is the one Flatpak chose, else fail Review (CodeRabbit): with a custom socket listed first and the default last in ~/.cups/client.conf, Flatpak mounts the custom one at /var/run/cups/cups.sock while CUPS picks the last line, finds that path, and talks to the custom server. The wrapper now compares CUPS' socket with Flatpak's choice even when the path exists: equal, CUPS is pointed at the mount; different, the tool fails with an error instead of reaching another server. Also (CodeRabbit): - A printer named in the job goes to lp even when CUPS lists none: listing can be forbidden while printing is not, and the portal can't honour a name. - A failed lpstat -e (CUPS unreachable, listing forbidden) means the list can't be told, so lp takes the job, instead of an empty list sending it to the portal. - A listing longer than 1 MiB counts as no answer, instead of growing without bound. - The kill test checks the process with kill -0, which works on every Unix. - docs/printing.md: the only-printer fallback is on the lp and IPP routes, and the portal is Linux only.