• v1.5.0 0be8eb5cdf

    ipx 1.5.0 Stable

    rays released this 2026-10-23 09:41:57 -07:00 | 9 commits to main since this release

    Changed

    • Traces show more of where a request's time goes: a page of items' query and its files apart, artwork's cache, check and fetch, the status counts, and each part of changing or leaving a feed (#350).
    • A page of items finds its files by feed as well as item: it read every file's row in the database, about a quarter of a second a page (#344).
    • A page of items asks for its count beside the items, and the feed list asks its five questions at once, where each waited for the one before (#346).
    • A Signal's counts of items and of unread ones are worked out in one pass, not two (#348).
    • Artwork kept on disk is read and written off the threads that answer requests, and two requests for the same missing artwork fetch it once (#345, #349).
    • Unread lists and counts start from each person's oldest unread item in each feed, which the daily cleanup works out, instead of reading the whole back catalogue and everything you have read (#347, #352).

    Fixed

    • A WordPress.com site that answers its feed with a browser check (HTTP 403, "Checking your browser...") is read from WordPress.com's API instead, so Pelgrane Press's feed no longer fails for hours at a time. The items are the ones the feed gave: same ids (#317).

    Security

    • An episode that comes as a torrent downloads into a folder of its own, torrent-<id> in its podcast's folder. A torrent could name a path anywhere on the server for Delete, the cleanup and playback to act on, and could overwrite other episodes' files of the same name (#318, #331).
    • A downloaded file opens in the browser only when it is audio, video, an image other than SVG, a PDF or plain text, and is saved otherwise. An SVG or web page a podcast sent ran its script as iPX, signed in as whoever opened it (#319).
    • An OPML nested more than 100 levels deep is refused, uploaded or fetched. A deep enough one stopped iPX, and a subscribed one stopped it again each time it restarted (#322).
    • A .torrent file larger than 10 MB, or slower than the torrent stall limit, is refused. iPX read one into memory however large it was (#330).
    • Feeds, episodes, artwork and .torrent files are no longer fetched from internal addresses (loopback, the LAN, Docker's networks), redirects included, unless config.toml's fetch_internal lists them. Adding a feed could read what a service inside the network answered (#320).
    • HTTPS connections no longer trust certificates from emSign's distrusted intermediates, and certificate checks use constant-time comparisons: rustls-webpki, webpki-roots and ctutils are updated (#351).
    • A new install's admin gets a random password, written to admin-password beside config.toml and readable by iPX's user alone, or the one in IPX_ADMIN_PASSWORD. Every install began as admin / ipodderx, a password published in the README, and the log printed it (#321).
    • A show kept from a private OPML or Patreon list stays private, with the list's username and password, once the list is removed or left. It became public and was shared to the directory (#332).
    • A feed's username and password go to its own host alone: not to its episodes on other hosts, nor to the feeds an OPML lists on other hosts, which took the OPML's password on every check (#327, #328).
    • A check of one feed asks at most eight hosts whether its artwork is on https. A feed could name artwork on as many hosts as it liked, each asked in turn for up to 20 seconds, and hold up every other feed's check for hours (#339).
    • An OPML or Patreon list may bring in up to 2,000 feeds; one with more shows an error and adds none. A list of tens of thousands held up checking for everyone, and adding its feeds read the whole feeds table once for each (#337).
    • A request that changes something is refused when a browser sent it from another site. A page on another site, a sibling subdomain included, could mark everything read, start downloads, subscribe you to a Directory feed or sign you out (#336).
    • ipx user passwd signs the account out of every browser, and says how many of its API tokens still work. A session signed in with the old password went on working (#334).
    • Live updates about a feed go only to the people who read it, and admins. Everyone signed in had every feed's, errors included, which carried a paid feed's address with its key (#325).
    • An open page stops getting live updates within half a minute of its account being removed. They went on until the page was closed (#335).
    • Only someone subscribed to a feed, or an admin, may mark it private. Anyone signed in could keep anyone's feed, or a whole OPML's, out of the directory, and only an admin could undo it (#333).
    • An OPML upload may add up to 2,000 feeds; one with more is refused and adds none. Importing tens of thousands held up every change to the feed list for minutes and left them all in it (#338).
    • Password checks stay a few at a time when the person signing in gives up before the answer. Each sign-in that hung up let another start, so a flood of them used every core (#324).
    • Jev picks at most 20 icons an hour for each person, on the server's key; past that the page says to choose one by hand. Anyone signed in could have it pick without end, on the server's bill, holding back everyone's Signals (#340).
    • Each person's Signals on an item are judged in a call of their own, on the server's key too. One person's description was in the question that decided another's verdicts (#343).
    Downloads