<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://micropipes.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://micropipes.com/" rel="alternate" type="text/html" /><updated>2026-07-16T20:56:32-07:00</updated><id>https://micropipes.com/feed.xml</id><title type="html">all night diner</title><subtitle>Wil Clouser&apos;s personal blog. Opinions are my own.</subtitle><author><name>Wil Clouser</name><email>clouserw@micropipes.com</email></author><entry><title type="html">Firefox Sync adds official PostgreSQL support</title><link href="https://micropipes.com/2026/04/23/firefox-sync-adds-official-postgresql-support/" rel="alternate" type="text/html" title="Firefox Sync adds official PostgreSQL support" /><published>2026-04-23T00:00:00-07:00</published><updated>2026-04-23T00:00:00-07:00</updated><id>https://micropipes.com/2026/04/23/firefox-sync-adds-official-postgresql-support</id><content type="html" xml:base="https://micropipes.com/2026/04/23/firefox-sync-adds-official-postgresql-support/"><![CDATA[<p>The Sync Storage team has landed official PostgreSQL support for Firefox Sync.</p>

<p>Historically, Sync has only officially supported Google Spanner as a storage backend, with MySQL working unofficially. That has been a pretty high barrier to entry for people self-hosting their own services.</p>

<p>With PostgreSQL support, we hope to make self-hosting more approachable and continue supporting people who want the agency of hosting their data on infrastructure they control.</p>

<p>There is updated documentation for running it with Docker, including a one-shot <code class="language-plaintext highlighter-rouge">docker compose</code> setup:</p>

<p><a href="https://mozilla-services.github.io/syncstorage-rs/how-to/how-to-run-with-docker.html">https://mozilla-services.github.io/syncstorage-rs/how-to/how-to-run-with-docker.html</a></p>

<p>Mozilla is publishing Docker images for the PostgreSQL build here:</p>

<p><a href="https://ghcr.io/mozilla-services/syncstorage-rs/syncstorage-rs-postgres">https://ghcr.io/mozilla-services/syncstorage-rs/syncstorage-rs-postgres</a></p>

<p>If you’ve been interested in self-hosting Sync but were put off by the storage requirements, take another look.  If you run into bugs or have feedback, please file issues here:</p>

<p><a href="https://github.com/mozilla-services/syncstorage-rs/issues">https://github.com/mozilla-services/syncstorage-rs/issues</a></p>]]></content><author><name>Wil Clouser</name></author><category term="Mozilla" /><category term="software" /><summary type="html"><![CDATA[The Sync Storage team has landed official PostgreSQL support for Firefox Sync.]]></summary></entry><entry><title type="html">Keith Burgan’s Interactive Forms</title><link href="https://micropipes.com/2025/09/18/keith-burgans-interactive-forms/" rel="alternate" type="text/html" title="Keith Burgan’s Interactive Forms" /><published>2025-09-18T00:00:00-07:00</published><updated>2025-09-18T00:00:00-07:00</updated><id>https://micropipes.com/2025/09/18/keith-burgans-interactive-forms</id><content type="html" xml:base="https://micropipes.com/2025/09/18/keith-burgans-interactive-forms/"><![CDATA[<blockquote>
  <p>Within “interactive entertainment”, we can divide things into four <em>forms –</em> patterns of design that, in theory, work in a certain way.</p>
  <ul>
    <li>Toy: Systems that have no prescribed goals</li>
    <li>Puzzle: Prescribes a goal</li>
    <li>Contest: Allows measurement, play session is limited</li>
    <li>Strategy Game: Obfuscates measurement, incomplete information requires ambiguous decision-making</li>
  </ul>
</blockquote>

<p><a href="http://keithburgun.net/interactive-forms/">source</a></p>

<p>A friend told me about this theory of game forms months ago, and we eventually tracked down the source: Keith Burgan.  Keith also talks more in depth about <a href="http://keithburgun.net/contests-explained/">contests on his blog</a>.</p>

<p>Simple examples my friend and I talked about:</p>
<ul>
  <li><strong>Toy:</strong> Playing freely with Lego blocks</li>
  <li><strong>Puzzle:</strong> Following Lego instructions to complete a model</li>
  <li><strong>Contest:</strong> Completing the model against a timer</li>
  <li><strong>Game:</strong> Building with others from a limited pool of blocks</li>
</ul>

<p>We found <a href="https://www.erasmatazz.com/library/the-journal-of-computer/jcgd-volume-4/my-definition-of-game.html">other taxonomies</a> but I like the simplicity of Keith’s.</p>]]></content><author><name>Wil Clouser</name></author><category term="quotes" /><summary type="html"><![CDATA[Within “interactive entertainment”, we can divide things into four forms – patterns of design that, in theory, work in a certain way. Toy: Systems that have no prescribed goals Puzzle: Prescribes a goal Contest: Allows measurement, play session is limited Strategy Game: Obfuscates measurement, incomplete information requires ambiguous decision-making]]></summary></entry><entry><title type="html">Jailbreak a Nixplay W10P Photo Frame</title><link href="https://micropipes.com/2025/09/14/jailbreak-a-nixplay-w10p-photo-frame/" rel="alternate" type="text/html" title="Jailbreak a Nixplay W10P Photo Frame" /><published>2025-09-14T00:00:00-07:00</published><updated>2025-09-14T00:00:00-07:00</updated><id>https://micropipes.com/2025/09/14/jailbreak-a-nixplay-w10p-photo-frame</id><content type="html" xml:base="https://micropipes.com/2025/09/14/jailbreak-a-nixplay-w10p-photo-frame/"><![CDATA[<p>I own an older Nixplay W10P frame from 2023 which, despite having gigabytes of
free space, will no longer accept new photos due to recent <a href="https://www.nixplay.ca/blogs/legal-policy-documents/important-update-from-nixplay-ceo-2025-changes-to-your-services-a">mandatory changes
in the Nixplay’s terms of
service</a>.
I’m not opposed to a company charging for services but their reasoning of
“rising storage and bandwidth costs” is unconvincing given both have declined
significantly in recent years.  It’s reasonable to speculate that the next
update will continue to erode the reasons I chose the frame in the first place.
Who wants to bet it will be something to do with AI?</p>

<p>Anyway, I’ve decided to decline these new terms and delete my Nixplay account.
However, I don’t want to lose the functionality of the hardware.  Yo-less
uploaded a detailed <a href="https://www.youtube.com/watch?v=TN5errM5UbA">video on youtube demonstrating how to jailbreak the
Nixplay frame</a>.  The process
seemed straightforward, involving nothing more than plugging a cord into a W10E
frame and connecting to <code class="language-plaintext highlighter-rouge">adbd</code>.  I found that the process for the older W10P
model was not as seamless. Since I spent a chunk my weekend working through
this, I wanted to document the steps here to help others who may face similar
issues.</p>

<hr />

<p><strong>The good news:</strong> You don’t have to take your frame apart at all.  Both the
USB port and the reset button are accessible externally.</p>

<p><strong>The bad news:</strong> Unfortunately, the firmware does not include the <code class="language-plaintext highlighter-rouge">adbd</code>
executable in the system image, so it’s not immediately possible to connect to
the frame using <code class="language-plaintext highlighter-rouge">adb</code>. I am using macOS for this process, and when first
plugging in the frame, it does not show up in the system by default:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>% brew <span class="nb">install </span>usbutils
% lsusb
Bus 000 Device 001: ID 1d6b:XHCI
XHCI
XHCI Linux Foundation USB 3.1 Bus
</code></pre></div></div>

<p>Hold down the reset button for about 5 seconds and try it again though:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>% lsusb
Bus 002 Device 001: ID 2207:310d Fuzhou Rockchip Electronics Co., Ltd. Composite Device
Bus 000 Device 000: ID 2207:310d Fuzhou Rockchip Electronics Co., Ltd. USB 3.1 Bus
Bus 000 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
</code></pre></div></div>

<p>It lives!  At this point, the frame is detected. The screen will go black, and
Android tools will not yet be functional, but we can use this bootloader to
proceed. Let’s start by getting the necessary tools.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># brew's rkflashtool.  Note the syntax is slightly different than linux's...</span>
brew <span class="nb">install </span>rkflashtool
<span class="c"># adb &amp; friends</span>
brew <span class="nb">install</span> <span class="nt">--cask</span> android-platform-tools
</code></pre></div></div>

<p>I suggest taking a full backup just in case but we actually only need the
system and recovery images.  Skip the <code class="language-plaintext highlighter-rouge">userdata.img</code> at the end unless you have
a specific need as it takes a couple of hours to run.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>

<span class="c"># Script courtesy of ChatGPT.  Note that if you don't have a `W10P` model frame these offsets might not be right!</span>

<span class="c"># Make sure rkflashtool is in your PATH or use full path</span>
<span class="nv">RKFLASHTOOL</span><span class="o">=</span>rkflashtool

<span class="nb">echo</span> <span class="s2">"Dumping uboot..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00002000 0x00002000 <span class="o">&gt;</span> uboot.img

<span class="nb">echo</span> <span class="s2">"Dumping trust..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00004000 0x00002000 <span class="o">&gt;</span> trust.img

<span class="nb">echo</span> <span class="s2">"Dumping misc..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00006000 0x00002000 <span class="o">&gt;</span> misc.img

<span class="nb">echo</span> <span class="s2">"Dumping resource..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00008000 0x00008000 <span class="o">&gt;</span> resource.img

<span class="nb">echo</span> <span class="s2">"Dumping kernel..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00010000 0x00006000 <span class="o">&gt;</span> kernel.img

<span class="nb">echo</span> <span class="s2">"Dumping boot..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00016000 0x00006000 <span class="o">&gt;</span> boot.img

<span class="nb">echo</span> <span class="s2">"Dumping recovery..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x0001C000 0x00010000 <span class="o">&gt;</span> recovery.img

<span class="nb">echo</span> <span class="s2">"Dumping backup..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x0002C000 0x000A0000 <span class="o">&gt;</span> backup.img

<span class="nb">echo</span> <span class="s2">"Dumping cache..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x000CC000 0x000A0000 <span class="o">&gt;</span> cache.img

<span class="nb">echo</span> <span class="s2">"Dumping metadata..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x0016C000 0x00008000 <span class="o">&gt;</span> metadata.img

<span class="nb">echo</span> <span class="s2">"Dumping kpanic..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00174000 0x00002000 <span class="o">&gt;</span> kpanic.img

<span class="nb">echo</span> <span class="s2">"Dumping radical_update..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00176000 0x00020000 <span class="o">&gt;</span> radical_update.img

<span class="nb">echo</span> <span class="s2">"Dumping keys..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x00196000 0x00008000 <span class="o">&gt;</span> keys.img

<span class="nb">echo</span> <span class="s2">"Dumping system..."</span>
<span class="nv">$RKFLASHTOOL</span> r 0x0019E000 0x00280000 <span class="o">&gt;</span> system.img

<span class="nb">echo</span> <span class="s2">"Dumping userdata (rest of flash)..."</span>
<span class="c"># adjust length if you know exact remaining size</span>
<span class="nv">$RKFLASHTOOL</span> r 0x0041E000 0x00C00000 <span class="o">&gt;</span> userdata.img

<span class="nb">echo</span> <span class="s2">"All partitions dumped."</span>

</code></pre></div></div>

<p>The next step is to add the <code class="language-plaintext highlighter-rouge">adbd</code> executable, which is missing from the system
image. Fortunately, it exists in the recovery image.  I had to use Debian to
manage all the image modification because I didn’t want to fight OS X and ext4.
Here’s how to extract it.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># on debian</span>
<span class="nb">mkdir </span>recovery_wd
<span class="nb">cd </span>recovery_wd
<span class="nb">cp</span> ../recovery.img <span class="nb">.</span>
<span class="c"># creates zImage, initrd.img, and bootimg.cfg.</span>
<span class="c"># `apt install abootimg` if you need to</span>
abootimg <span class="nt">-x</span> recovery.img
<span class="nb">mkdir </span>ramdisk
<span class="nb">cd </span>ramdisk
<span class="nb">gzip</span> <span class="nt">-dc</span> ../initrd.img | cpio <span class="nt">-i</span>

<span class="c"># You'll find a copy of `adbd` in /sbin/ but first we'll need to mount the system image so we have a place to put it.</span>

<span class="nb">cd</span> ../..
<span class="nb">mkdir </span>simg
mount <span class="nt">-t</span> ext4 system.img simg
<span class="nb">cd </span>simg
<span class="c"># Now you're in the system image we dumped from the frame</span>
<span class="nb">mkdir </span>sbin
<span class="nb">cd </span>sbin
<span class="nb">cp</span> ../../recovery_wd/ramdisk/sbin/adbd <span class="nb">.</span>
<span class="nb">chmod </span>755 adbd
<span class="nb">cd</span> ../..
<span class="nb">sync
</span>umount simg
</code></pre></div></div>

<p>Now that the system image includes <code class="language-plaintext highlighter-rouge">adbd</code>, it’s time to write it back to the frame.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Write to the system partition</span>
rkflashtool w system &lt; /path/to/system.img
<span class="c"># Reboot</span>
rkflashtool b
</code></pre></div></div>

<p>At this point <code class="language-plaintext highlighter-rouge">adbd</code> is present but not auto-starting. There are multiple
conditions in the system’s <code class="language-plaintext highlighter-rouge">init.rc</code> file to start <code class="language-plaintext highlighter-rouge">adbd</code> (e.g. <code class="language-plaintext highlighter-rouge">on
property:sys.usb.config=adb &amp;&amp; property:sys.usb.configfs=1</code>) and presumably one
of those doesn’t get set.  I didn’t want to keep chasing this so next we’ll
patch the boot image to just start adbd directly:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># back on debian</span>
<span class="nb">mkdir </span>bood_wd
<span class="nb">cd </span>boot_wd
<span class="nb">cp</span> ../boot.img <span class="nb">.</span>
abootimg <span class="nt">-x</span> boot.img
<span class="nb">mkdir </span>ramdisk
<span class="nb">cd </span>ramdisk
<span class="nb">gzip</span> <span class="nt">-dc</span> ../initrd.img | cpio <span class="nt">-i</span>
</code></pre></div></div>

<p>Add these lines within the existing <code class="language-plaintext highlighter-rouge">on boot</code> section of the <code class="language-plaintext highlighter-rouge">init.rc</code> above
the <code class="language-plaintext highlighter-rouge">class_start default</code> line.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    setprop sys.usb.config adb
    setprop sys.usb.configfs 1
    setprop service.adb.root 1
    start adbd

    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18D1
    write /sys/class/android_usb/android0/idProduct D001
    write /sys/class/android_usb/android0/functions adb
    write /sys/class/android_usb/android0/enable 1
</code></pre></div></div>

<p>And then create a new boot image with this change:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find <span class="nb">.</span> | cpio <span class="nt">-o</span> <span class="nt">-H</span> newc | <span class="nb">gzip</span> <span class="o">&gt;</span> ../initrd-new.img
<span class="nb">cd</span> ..
abootimg <span class="nt">--create</span> ../boot-new.img <span class="nt">-f</span> bootimg.cfg <span class="nt">-k</span> zImage <span class="nt">-r</span> initrd-new.img
</code></pre></div></div>

<p>Transfer the new image to the frame</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rkflashtool w boot &lt; boot-new.img
rkflashtool b
</code></pre></div></div>

<p>After rebooting the frame <code class="language-plaintext highlighter-rouge">adbd</code> should fire up.  <code class="language-plaintext highlighter-rouge">adb</code> commands (and <code class="language-plaintext highlighter-rouge">vysor</code>
from the original video) should be able to connect and you can follow the
directions in the video to install the apps you want.</p>]]></content><author><name>Wil Clouser</name></author><category term="software" /><category term="walkthrough" /><summary type="html"><![CDATA[I own an older Nixplay W10P frame from 2023 which, despite having gigabytes of free space, will no longer accept new photos due to recent mandatory changes in the Nixplay’s terms of service. I’m not opposed to a company charging for services but their reasoning of “rising storage and bandwidth costs” is unconvincing given both have declined significantly in recent years. It’s reasonable to speculate that the next update will continue to erode the reasons I chose the frame in the first place. Who wants to bet it will be something to do with AI?]]></summary></entry><entry><title type="html">Bowser in his Koopa Clown Car</title><link href="https://micropipes.com/2025/01/10/bowser-in-his-koopa-clown-car/" rel="alternate" type="text/html" title="Bowser in his Koopa Clown Car" /><published>2025-01-10T00:00:00-08:00</published><updated>2025-01-10T00:00:00-08:00</updated><id>https://micropipes.com/2025/01/10/bowser-in-his-koopa-clown-car</id><content type="html" xml:base="https://micropipes.com/2025/01/10/bowser-in-his-koopa-clown-car/"><![CDATA[<p><img src="/assets/img/2025-art-bowser-1.jpg" alt="Bowser in his Koopa Clown Car" /></p>

<p>I learned this was called a Koopa Clown Car while searching for “bowser in his
teacup”.  About 20” tall.</p>]]></content><author><name>Wil Clouser</name></author><category term="art" /><category term="laser" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://micropipes.com/assets/img/2025-art-bowser-2.jpg" /><media:content medium="image" url="https://micropipes.com/assets/img/2025-art-bowser-2.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mozilla Accounts password hashing upgrades</title><link href="https://micropipes.com/2024/10/28/mozilla-accounts-password-hashing-upgrades/" rel="alternate" type="text/html" title="Mozilla Accounts password hashing upgrades" /><published>2024-10-28T00:00:00-07:00</published><updated>2024-10-28T00:00:00-07:00</updated><id>https://micropipes.com/2024/10/28/mozilla-accounts-password-hashing-upgrades</id><content type="html" xml:base="https://micropipes.com/2024/10/28/mozilla-accounts-password-hashing-upgrades/"><![CDATA[<p>We’ve recently finished two significant changes to how Mozilla Accounts handles
password hashes which will improve security and increase flexibility around
changing emails.  The changes are entirely transparent to end-users and are
applied automatically when someone logs in.</p>

<h2 id="randomizing-salts">Randomizing Salts</h2>

<p>If a system is going to store passwords, best practice is to hash the password
with a unique salt per row.  When accounts was first built we used an account’s
email address as the unique salt for password hashing.  This saved a column in
the database and some bandwidth but overall I think was a poor idea.  It meant
<a href="https://github.com/mozilla/fxa/issues/14178">people couldn’t re-use their email
addresses</a> and it leaves <abbr title="Personally Identifiable Information">PII</abbr> sitting around
unnecessarily.</p>

<p>Instead, a better idea is just to generate a random salt.  We’ve now
transitioned Mozilla Accounts to random salts.</p>

<h2 id="increasing-key-stretching-iterations">Increasing Key Stretching Iterations</h2>

<p>Eight years ago <a href="https://www.rfk.id.au/">Ryan Kelly</a> filed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1320222">bug
1320222</a> to review
Mozilla Accounts’ client-side key stretching capabilities and sparked a
spirited conversation about iterations and the priority of the bug.  Overall,
this is routine maintenance - we expect any amount of stretching we do will
have to be revisited periodically due to hardware improving and the value we
choose is a compromise between security and time to login, particularly on
older hardware.</p>

<p>Since we were generating new hashes for the random salts already we took the
opportunity to increase our PBKDF2 iterations from 1000 to 650000 – a number
we’re seeing others in the industry using.  This means logging in with slower
hardware (like older mobile phones) may be noticeably slower.  Below is an
excerpt from the analysis we did showing a Macbook from 2007 will take an
additional ~3 seconds to log in:</p>

<table>
  <thead>
    <tr>
      <th>Key Stretch Iterations</th>
      <th>Overhead on 2007 Macbook</th>
      <th>Overhead on 2021 MacBook Pro M1</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>100,000</td>
      <td>0.4800024 seconds</td>
      <td>0.00000681 seconds</td>
    </tr>
    <tr>
      <td>200,000</td>
      <td>0.9581234 seconds</td>
      <td>0.00000169 seconds</td>
    </tr>
    <tr>
      <td>300,000</td>
      <td>1.4539928 seconds</td>
      <td>0.00000277 seconds</td>
    </tr>
    <tr>
      <td>400,000</td>
      <td>1.9337903 seconds</td>
      <td>0.00029750 seconds</td>
    </tr>
    <tr>
      <td>500,000</td>
      <td>2.4146366 seconds</td>
      <td>0.00079127 seconds</td>
    </tr>
    <tr>
      <td>600,000</td>
      <td>2.9482827 seconds</td>
      <td>0.00112186 seconds</td>
    </tr>
    <tr>
      <td>700,000</td>
      <td>3.3960513 seconds</td>
      <td>0.00117956 seconds</td>
    </tr>
    <tr>
      <td>800,000</td>
      <td>3.8675677 seconds</td>
      <td>0.00117956 seconds</td>
    </tr>
    <tr>
      <td>900,000</td>
      <td>4.3614942 seconds</td>
      <td>0.00141616 seconds</td>
    </tr>
  </tbody>
</table>

<h2 id="implementation">Implementation</h2>

<p><a href="https://github.com/dschom">Dan Schomburg</a> did the heavy lifting to make this a
smooth and successful project.  He built the v2 system alongside v1 so both
hashes are generated simultaneously and if the v2 exists the login system will
use that.  This lets us roll the feature out slowly and gives us control if we
need to disable it or roll back.</p>

<p>We tested the code for several months on our staging server before rolling it
out in production.  When we did enable it in production it was over the course
of several weeks via small percentages while we watched for unintended
side-effects and bug reports.</p>

<p>I’m pleased to say everything appers to be working smoothly.  As always, if you
notice any issues please <a href="https://github.com/mozilla/fxa/issues">let us know</a>.</p>]]></content><author><name>Wil Clouser</name></author><category term="Mozilla" /><category term="software" /><summary type="html"><![CDATA[We’ve recently finished two significant changes to how Mozilla Accounts handles password hashes which will improve security and increase flexibility around changing emails. The changes are entirely transparent to end-users and are applied automatically when someone logs in.]]></summary></entry><entry><title type="html">PyFxA 0.7.9 Released</title><link href="https://micropipes.com/2024/09/30/pyfxa-0.7.9-released/" rel="alternate" type="text/html" title="PyFxA 0.7.9 Released" /><published>2024-09-30T00:00:00-07:00</published><updated>2024-09-30T00:00:00-07:00</updated><id>https://micropipes.com/2024/09/30/pyfxa-0.7.9-released</id><content type="html" xml:base="https://micropipes.com/2024/09/30/pyfxa-0.7.9-released/"><![CDATA[<p>We released <a href="https://github.com/mozilla/PyFxA/releases/tag/0.7.9">PyFxA 0.7.9</a> last week (<a href="https://pypi.org/project/pyfxa/">pypi</a>).  This added:</p>

<ul>
  <li>Support for key stretching v2.  See the end of <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1320222">bug
1320222</a> for some
details.  V1 will continue to work, but we’ll remove support for it at some
point in the future.</li>
  <li>Upgraded to support (and test!) Python 3</li>
</ul>

<p>Special thanks to <a href="https://rob.cogit8.org/">Rob Hudson</a> and <a href="https://github.com/dschom">Dan Schomburg</a> for thier efforts.</p>]]></content><author><name>Wil Clouser</name></author><category term="Mozilla" /><category term="software" /><summary type="html"><![CDATA[We released PyFxA 0.7.9 last week (pypi). This added:]]></summary></entry><entry><title type="html">Using Borg on TrueNAS</title><link href="https://micropipes.com/2024/06/18/using-borg-on-truenas/" rel="alternate" type="text/html" title="Using Borg on TrueNAS" /><published>2024-06-18T00:00:00-07:00</published><updated>2024-06-18T00:00:00-07:00</updated><id>https://micropipes.com/2024/06/18/using-borg-on-truenas</id><content type="html" xml:base="https://micropipes.com/2024/06/18/using-borg-on-truenas/"><![CDATA[<p>I installed TrueNAS a couple months ago to try out ZFS.  It has some simple
backup options built-in but I didn’t see any encrypted options.  Since I use
<a href="https://www.borgbackup.org/">Borg</a> elsewhere I thought this was a good
opportunity to figure out how to put it on TrueNAS. TrueNAS is based on Debian,
but relying on direct package installations isn’t recommended so I needed
another option.</p>

<p>I was going to use <a href="https://truecharts.org/charts/stable/borg-server/">TrueCharts’ borg chart</a> but TrueNAS SCALE is
<a href="https://forums.truenas.com/t/the-future-of-electric-eel-and-apps/5409/7">phasing out support for charts completely</a>
so I opted to install a binary manually and see if a standard approach appears
later.  It turned out to be pretty straight forward, steps below:</p>

<ol>
  <li>Download a <a href="https://github.com/borgbackup/borg/releases">borg binary</a>.
You’ll want to use a version of the unfortunately-named <code class="language-plaintext highlighter-rouge">borg-linuxnewer64</code>
builds which are built for Debian 12.  I used the latest stable version,
<code class="language-plaintext highlighter-rouge">1.2.8</code>.</li>
  <li>Copy the binary somewhere.  I put it in <code class="language-plaintext highlighter-rouge">/mnt/bin/</code>.</li>
  <li>Try to run <code class="language-plaintext highlighter-rouge">/mnt/bin/borg -V</code>.  If you get an error saying
<code class="language-plaintext highlighter-rouge">/mnt/bin/borg: error while loading shared libraries: libz.so.1: failed to
map segment from shared object</code> you need to add a temp directory it can
write to.  I made <code class="language-plaintext highlighter-rouge">/mnt/tmp</code> and then ran <code class="language-plaintext highlighter-rouge">export TMPDIR="/mnt/tmp"</code>.</li>
</ol>

<p>Now <code class="language-plaintext highlighter-rouge">/mnt/bin/borg -V</code> should work and you can add it to whatever scripts you
use to backup your system.  Don’t forget to set the TMPDIR in your scripts too.</p>]]></content><author><name>Wil Clouser</name></author><category term="software" /><category term="walkthrough" /><summary type="html"><![CDATA[I installed TrueNAS a couple months ago to try out ZFS. It has some simple backup options built-in but I didn’t see any encrypted options. Since I use Borg elsewhere I thought this was a good opportunity to figure out how to put it on TrueNAS. TrueNAS is based on Debian, but relying on direct package installations isn’t recommended so I needed another option.]]></summary></entry><entry><title type="html">Nyan Cat</title><link href="https://micropipes.com/2024/06/09/nyan-cat/" rel="alternate" type="text/html" title="Nyan Cat" /><published>2024-06-09T00:00:00-07:00</published><updated>2024-06-09T00:00:00-07:00</updated><id>https://micropipes.com/2024/06/09/nyan-cat</id><content type="html" xml:base="https://micropipes.com/2024/06/09/nyan-cat/"><![CDATA[<p><img src="/assets/img/2024-art-nyan-cat-1.jpg" alt="Nyan Cat hanging on the wall" /></p>

<p>Nyan Cat!  A classic internet meme.  I made this to put over a window.  About
30” long and 6” tall.</p>

<p><img src="/assets/img/2024-art-nyan-cat-2.jpg" alt="Nyan Cat under construction on a table" /></p>]]></content><author><name>Wil Clouser</name></author><category term="art" /><category term="laser" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Mario and Link</title><link href="https://micropipes.com/2024/05/31/mario-and-link/" rel="alternate" type="text/html" title="Mario and Link" /><published>2024-05-31T00:00:00-07:00</published><updated>2024-05-31T00:00:00-07:00</updated><id>https://micropipes.com/2024/05/31/mario-and-link</id><content type="html" xml:base="https://micropipes.com/2024/05/31/mario-and-link/"><![CDATA[<p>All of these are cut with a laser and painted with acrylics.</p>

<p><img src="/assets/img/2024-art-small-mario.jpg" alt="Mario hanging on the wall" /></p>

<p>A small Mario for me and a couple of Links to give away to friends.  All about
6” tall because that’s the size scrap I have.</p>

<p><img src="/assets/img/2024-art-small-link.jpg" alt="Two Links on a table" /></p>]]></content><author><name>Wil Clouser</name></author><category term="art" /><category term="laser" /><summary type="html"><![CDATA[All of these are cut with a laser and painted with acrylics.]]></summary></entry><entry><title type="html">Retiring BrowserID on Mozilla Accounts</title><link href="https://micropipes.com/2024/05/19/retiring-browserid-on-mozilla-accounts/" rel="alternate" type="text/html" title="Retiring BrowserID on Mozilla Accounts" /><published>2024-05-19T00:00:00-07:00</published><updated>2024-05-19T00:00:00-07:00</updated><id>https://micropipes.com/2024/05/19/retiring-browserid-on-mozilla-accounts</id><content type="html" xml:base="https://micropipes.com/2024/05/19/retiring-browserid-on-mozilla-accounts/"><![CDATA[<p>The <abbr title="too long; didn't read">tl;dr</abbr> here is that Mozilla
Accounts is turning off SyncStorage BrowserID support and it probably doesn’t
affect you at all.</p>

<h2 id="a-little-history">A little history</h2>

<p>In 2011, when Mozilla Accounts (called “Firefox Accounts” back then) was first
built it used BrowserID identity certificates in its authentication model.  The
BrowserID protocol never took off and Mozilla’s work on it ended in 2016.
However, the sync service in Firefox continued to use BrowserID even as OAuth
support was added to Mozilla Accounts as an alternative for all other relying
parties.</p>

<p>Over time, we recognized BrowserID was becoming a maintenance liability.  As a
non-standard protocol it created significant complexity in our codebase.
Therefore, we decided to migrate the Firefox clients off of it in favor of
OAuth.</p>

<p>This was an enormous effort, and while much more could be written about this
transition, the main takeaway is that Firefox Sync’s BrowserID support ended
with Firefox 78, which shipped in June 2020 and reached its end of life in
November 2021.</p>

<h2 id="present-day">Present day</h2>

<p>We’ve been waiting a long time for the usage of Firefox 78 to drop.</p>

<p>Aside from being an <abbr title="Extended Support Release">ESR</abbr> version
there are a couple of other reasons for its extra longevity:</p>

<ul>
  <li>It was the last version of the browser to support Flash</li>
  <li>It was the last version of the browser to support OS X versions &lt; 10.12</li>
</ul>

<p>With Flash now largely obsolete on the web and traffic from older operating
systems becoming rarer, we’ve decided that now is the appropriate time to turn
off support for this legacy protocol.</p>

<p>To avoid surprises and not leave anyone behind, we attempted to email anyone
still using that endpoint earlier this year. We didn’t receive any feedback and
we continued with the plan.</p>

<h2 id="our-method">Our method</h2>

<p>Our plan is simple:  BrowserID requests are the only traffic hitting our
<code class="language-plaintext highlighter-rouge">/v1/certificate/sign</code> endpoint.  We’ll begin returning <code class="language-plaintext highlighter-rouge">HTTP 404</code> replies to a
small percentage of traffic from that endpoint and monitor for any issues.
Our testing showed no concerns but it’s challenging to be comprehensive with so
many combinations of browser versions and operating systems.  Over the next few
weeks we’ll continue to ramp up the percentage of 404s until we can remove the
endpoint completely and let the traffic bounce off the front-end like any other
404.</p>

<h2 id="current-status">Current status</h2>

<p>Surprise!  I’m a few weeks late with this post.  We started returning 404s on
May 1 and are currently up to ~66% of traffic on that endpoint.  So far there
haven’t been any unexpected complications.  We’ll continue to increase over the
next few weeks and aim to have all the code removed this summer.</p>]]></content><author><name>Wil Clouser</name></author><category term="Mozilla" /><category term="software" /><summary type="html"><![CDATA[The tl;dr here is that Mozilla Accounts is turning off SyncStorage BrowserID support and it probably doesn’t affect you at all.]]></summary></entry></feed>