Manjaro Linux: TOTP PSA

I set up my pobox.com account set up with two-factor authentication through my Yubikey, so logging in requires my user ID, password, and a Time-based One-time Password generated through the Yubikey Authenticator program. A few weeks ago, pobox occasionally rejected the TOTP and it eventually became a hard failure. Oddly, other sites I’ve set up with TOTP 2FA continued to work fine.

My initial trouble report:

The last couple of times I’ve tried to sign in, the usual TOTP copy-n-paste from my Yubikey authenticator has failed.

Up to that point, it worked flawlessly.

Manually typing the TOTP also fails.

I have reset my (complex!) password to no avail; I use Firefox’s password manager to fill it in.

I do have a set of lockout codes, but they’re a solution to a different problem.

Given the constant updates to Firefox (102.0.3), it’s almost certain the hole is in my end of the boat. I have disabled all the usual ad blocking for pobox.com, although there may be other domains I’ve overlooked.

Other than that, my email seems to be working just fine …

Any suggestions on how to proceed? (Obviously, I’m not going to be able to sign on to look at the ticket.)

Thanks …

This is the fastest I’ve ever reached Tier 2:

We’re happy to help you with this. I’ve escalated your ticket to our Tier 2 agents, as they are best suited to assist with this issue.

There is nothing like a good new problem to take your mind off all your old problems:

I’ve had a chat with our Tier 2 agents about this and they’ve suggested I escalate it to our developers to have a look at.

Somewhat later:

I am afraid to say that our developers were unable to find any clear reason as to why your Yubikey failed.

Yubikey devices verify by connecting with Yubikey’s server, and it is possible that this connection failed.

Can you please try using the Yubikey again to see if the issue is still occurring?

If it’s still failing, can you please try adding a new Yubikey device to see if it works?

Of course, the problem didn’t magically Go Away, but I did more experimentation and figured out where the hole was in my end of the boat:

Ah-HA! It’s a PEBKAC error!

For unknown reasons, this PC was not set for automatic NTP time updates(*). Its time had drifted (presumably since I installed it back in June 2021) and was now 58 seconds behind real time, exceeding pobox’s tolerance.

Other websites apparently allow a few more seconds of slop before disallowing a TOTP, so I had not yet run afoul of their limit.

Some lesser-used sites threw me out, however, but I had not looked beyond the most common sites.

The default TOTP interval is 30 seconds, so perhaps pobox allows only ±1 interval and the other sites allow ±2? Frankly, I think pobox has it right: everybody else prioritizes customer sat over security.

Got the clock set correctly and, gosh, TOTP works fine.

Mark it solved, but definitely add “Soooo, is your PC’s clock set for automatic updates?” to the debugging protocol.

Thanks …

(*) I’ve installed all of the boxen here and would not ever have picked “Yeah, sure, I want to dink with the clock.”

The solution looks like this:

Manjaro Time and Date Settings - Auto Set
Manjaro Time and Date Settings – Auto Set

Which was unchecked on this PC.

Of course, systemd has long since subsumed NTP, making everything I thought I once knew obsolete: now it’s handled by timesyncd.

How you make sure time synchronization is enabled goes like this:

$ systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; preset: enabled)
     Active: active (running) since Thu 2022-08-25 06:49:31 EDT; 10h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 355 (systemd-timesyn)
     Status: "Contacted time server 23.157.160.168:123 (2.manjaro.pool.ntp.org)."
      Tasks: 2 (limit: 19063)
     Memory: 2.2M
        CPU: 188ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─355 /usr/lib/systemd/systemd-timesyncd

Aug 25 06:49:31 shiitake systemd[1]: Starting Network Time Synchronization...
Aug 25 06:49:31 shiitake systemd[1]: Started Network Time Synchronization.
Aug 25 06:50:12 shiitake systemd-timesyncd[355]: Timed out waiting for reply from 162.159.200.123:123 (2.manjaro.pool.ntp.org).
Aug 25 06:50:12 shiitake systemd-timesyncd[355]: Contacted time server 23.157.160.168:123 (2.manjaro.pool.ntp.org).
Aug 25 06:50:12 shiitake systemd-timesyncd[355]: Initial clock synchronization to Thu 2022-08-25 06:50:12.850444 EDT.

If it’s enabled and running, then it’s all good.

Whereupon all my TOTP passwords began working again.

I checked two other Manjaro systems: one had auto updates enabled, one didn’t. I have no explanation.

SJCAM M20: Another Battery Bites the Dust

A little more than two years after replacing its internal battery, the SJCAM M20 camera on my Tour Easy once again wouldn’t last to the end of the driveway if I forgot to turn on the external battery pack. This time around, the camera was so firmly jammed in the printed seat frame mount that I had to cut the mount apart.

Yup, that puppy is all swoll up:

SJCAM M20 swollen battery - side view
SJCAM M20 swollen battery – side view

Poor thing looks like a tiny pillow:

SJCAM M20 swollen battery - pouch
SJCAM M20 swollen battery – pouch

While I had it apart, I tried to clean / refurbish the button contacts on the top. Unfortunately, they’re pretty well buried in the camera frame and I was unwilling to dismantle the optics, remove the display, and gut the camera to find out if they were more accessible from the back surface:

SJCAM M20 - switch internals
SJCAM M20 – switch internals

While all that was going on, I ran off a new mount in white PETG:

SJCAM M20 - white case installed
SJCAM M20 – white case installed

I’m down to the last battery. The “4.35V” on the pillow indicates they’re special high-voltage lithium-polymer cells, so I can’t just drop a random lithium pouch cell in there and expect it to Just Work.

I think the “782633” is the cell size, so, if I were willing to have a few thousand on the shelf, a 552525 pouch might fit. The reduced capacity wouldn’t be a problem, as it must just keep the camera’s clock ticking between rides.

Drat!

Tour Easy Creaking: Seat Stay

Over the course of a few days, my Tour Easy recumbent developed a slight squeak that turned into a definite creak, then the seat started shifting slightly under hill-climbing forces. Of course, no force I could apply in the garage caused the slightest squeak / creak / motion. A decade ago this was due to a sheared screw at the dropout, but everything seemed to be in good order.

So I applied a drop of penetrating oil to each of the many joints in the seat hardware, went on a few more rides, and eventually the seat started moving with normal pedaling forces.

The left strut clamp looked fine:

Tour Easy seat stay - left side
Tour Easy seat stay – left side

OK, it looks grubby. I’d rather ride than lick my bike clean.

The right clamp definitely showed signs of motion:

Tour Easy seat stay - right side slip
Tour Easy seat stay – right side slip

I extracted the strut assembly, degreased the clamps, reinstalled in reverse order, replaced the nuts, snugged everything down, and it’s all good again:

Tour Easy seat stay - renutted
Tour Easy seat stay – renutted

Yeah, I should have replaced those screws, but I didn’t even have to take the wheel off, sooooo

Layered Paper Coaster: GCMC Test

A few more attempts at layered paper construction, done with plain white Art Paper of various vintages:

Layered paper coasters
Layered paper coasters

The middle one comes from a version of the original GCMC marquetry shape generator, tweaked to produce just the frame SVG, called by a Bash script to change the sash width, and imported into LightBurn for laser control:

LightBurn - Marq-6-0.6-0.0mm
LightBurn – Marq-6-0.6-0.0mm

I generated the plain disk for the bottom by deleting all the inner shapes.

The left and right coasters use LightBurn’s Offset tool to reduce the size of the interior holes on successive layers:

LightBurn - Marq-8-0.40-20.0mm-Layers
LightBurn – Marq-8-0.40-20.0mm-Layers

Although the GCMC version turned out OK, you’ll note it lacks the central disk, as I was unwilling to tweak the code enough to make the disk diameter vary with the kerf width.

Applying the LB Offset tool requires selecting only the inner shapes (it has an option to ignore the inner shapes) and applying the appropriate offset. Because the tool remembers its previous settings, it’s straightforward to step the offset from 1.0 mm to 7.0 mm on successive patterns.

Applying glue (from a glue stick!) to the bottom of each disk, aligning them atop each other, and pressing them together becomes tedious in short order. If I had to do a lot of these, I’d be tempted to add three wings (not at 120° angles!) around the perimeter with holes for pegs, then stacking the layers in a fixture to ensure good alignment. A polygonal perimeter would simplify trimming the tabs.

Spray adhesive might be faster, but each layer would have sticky edges and the finished coaster would become a dust collector par excellence.

I like the overall effect, but …

The OpenSCAD source code as a GitHub Gist:

#!/bin/bash
# Layering paper cutouts
# Ed Nisley KE4ZNU - 2022-08-21
Flags='-P 4 --pedantic' # quote to avoid leading hyphen gotcha
SVGFlags='--svg --svg-no-movelayer --svg-opacity=1.0 --svg-toolwidth=0.2'
# Set these to match your file layout
ProjPath='/mnt/bulkdata/Project Files/Laser Cutter/Coasters/Source Code'
LibPath='/opt/gcmc/library'
ScriptPath=$ProjPath
Script='Marquetry Layers.gcmc'
[ -z "$1" ] && leaves="6" || leaves="$1"
[ -z "$2" ] && aspect="0.50" || aspect="$2"
[ -z "$3" ] && center="0.0mm" || center="$3"
numlayers=8
sashmin=2.0
sashstep=2.0
sashmax=$(echo "$sashmin+$sashstep*($numlayers-1)" | bc)
echo min: $sashmin step: $sashstep max: $sashmax
for sash in $(seq $sashmin $sashstep $sashmax) ; do
fn=Marq-$leaves-$aspect-$center-S$sash.svg
echo Output: $fn
gcmc $Flags $SVGFlags --include "$LibPath" \
-D "NumLeaves=$leaves" -D "LeafAspect=$aspect" -D "CenterDia=$center" \
-D "Sash=${sash}mm" \
"$ScriptPath"/"$Script" > "$fn"
done
view raw layers.sh hosted with ❤ by GitHub
// Marquetry Layers
// Ed Nisley KE4ZNU
// 2022-08-21 layered paper test piece
layerstack("Frame","Leaves","Rim","Base","Center","Tool1"); // SVG layers map to LightBurn colors
//-----
// Library routines
include("tracepath.inc.gcmc");
include("varcs.inc.gcmc");
FALSE = 0;
TRUE = !FALSE;
//-----
// Command line parameters
// -D various useful tidbits
// add unit to speeds and depths: 2000mm / -3.00mm / etc
if (!isdefined("OuterDia")) {
OuterDia = 120.0mm;
}
if (!isdefined("CenterDia")) {
CenterDia = 20.0mm;
}
if (!isdefined("NumLeaves")) {
NumLeaves = 8;
}
if (!isdefined("Sash")) {
Sash = 4.0mm;
}
if (!isdefined("LeafAspect")) {
LeafAspect = 0.50;
}
// Leaf values
LeafStemAngle = 360.0deg/NumLeaves; // subtended by inner sides
LeafStemHA = LeafStemAngle/2;
LeafOAL = OuterDia/2 - Sash - (Sash/2)/sin(LeafStemHA);
LeafWidth = LeafAspect*LeafOAL;
L1 = (LeafWidth/2)/tan(LeafStemHA);
L2 = LeafOAL - L1;
// message("Len: ",LeafOAL," L1: ",L1," L2: ",L2);
LeafTipHA = to_deg(atan(LeafWidth/2,L2)); // subtended by outer sides
LeafTipAngle = 2*LeafTipHA;
// message("Width: ",LeafWidth);
// message("Tip HA: ",LeafTipHA);
LeafID = CenterDia + 2*Sash;
LeafOD = LeafID + LeafOAL;
// message("ID: ",LeafID," OD: ",LeafOD);
// Find leaf and rim vertices
P0 = [(Sash/2) / sin(LeafStemHA),0.0mm];
m = tan(LeafStemHA);
y0 = -(Sash/2) / cos(LeafStemHA);
if (CenterDia) { // one sash width around center spot
a = 1 + pow(m,2);
b = 2 * m * y0;
c = pow(y0,2) - pow(LeafID/2,2);
xp = (-b + sqrt(pow(b,2) - 4*a*c))/(2*a);
xn = (-b - sqrt(pow(b,2) - 4*a*c))/(2*a);
y = xp*tan(LeafStemHA) - (Sash/2) / cos(LeafStemHA);
P1 = [xp,y];
if (FALSE) {
message("a: ",a);
message("b: ",b);
message("c: ",c);
message("p: ",xp," n: ",xn," y: ",y);
}
}
else { // force sharp point without center spot
P1 = P0;
}
P2 = P0 + [L1,LeafWidth/2];
P3 = P0 + [LeafOAL,0mm];
P4 = P3 + [Sash/sin(LeafTipHA),0.0mm];
P5r = P4.x * sin(LeafTipHA) / sin(180deg - LeafStemHA - LeafTipHA);
P5 = rotate_xy([P5r,0.0mm],LeafStemHA);
P6 = rotate_xy(P4,LeafStemAngle);
t2 = pow(tan(-LeafTipHA),2);
a = 1 + t2;
b = -2 * t2 * P4.x;
c = t2 * pow(P4.x,2) - pow(P3.x,2);
xp = (-b + sqrt(pow(b,2) - 4*a*c))/(2*a);
xn = (-b - sqrt(pow(b,2) - 4*a*c))/(2*a);
y = (xp - P4.x)*tan(-LeafTipHA);
// message("p: ",xp," n: ",xn," y: ",y);
P4a = [xp,y];
P6a = rotate_xy(P4a,LeafStemAngle - 2*atan(P4a.y,P4a.x));
if (FALSE) {
message("P0: ",P0);
message("P1: ",P1);
message("P2: ",P2);
message("P3: ",P3);
message("P4: ",P4);
message("P4a: ",P4a);
message("P5: ",P5);
message("P6: ",P6);
message("P6a: ",P6a);
}
// Construct paths
LeafPoints = {P1,P2,P3,[P2.x,-P2.y],[P1.x,-P1.y]};
if (P0 != P1) {
StemArc = varc_ccw(P1 - [P1.x,-P1.y],LeafID/2);
StemArc += [P1.x,-P1.y];
LeafPoints += StemArc;
}
RimChord = length(P4a - P6a);
RimThick = OuterDia/2 - Sash - length(P5);
RimPoints = {P4a,P5,P6a};
RimArc = varc_cw(P4a - P6a,P4a.x);
RimArc += P6a;
RimPoints += RimArc;
//--- Lay out the frame
linecolor(0xff0000);
layer("Frame");
if (CenterDia) {
goto([CenterDia/2,0mm]);
circle_cw([0mm,0mm]);
}
repeat(NumLeaves;i) {
a = (i-1)*LeafStemAngle;
tracepath(rotate_xy(LeafPoints,a));
}
repeat(NumLeaves;i) {
a = (i-1)*LeafStemAngle;
tracepath(rotate_xy(RimPoints,a));
}
linecolor(0xff0000);
goto([OuterDia/2,0]);
circle_cw([0mm,0mm]);

Acrylic Coasters: Edge Finishing, Round 4

Lacking a 4-jaw chuck for the lathe, this should suffice:

Coaster Epoxy Rim - chuck-in-chuck setup
Coaster Epoxy Rim – chuck-in-chuck setup

Which is just the Sherline 4-jaw chuck chucked in the lathe’s 3-jaw chuck, with both chuck Jaw 1 positions lined up and marked on the acrylic disk fixture. The picture is a recreation set up after the fact, because I lack a good picture of the overall scene.

Now it’s easy enough to center the fixture, stick the coaster in place with reasonable accuracy, then tweak the Sherline chuck to center the coaster:

Coaster Epoxy Rim - turning setup
Coaster Epoxy Rim – turning setup

Because the bottom layer is a laser-cut disk, eyeballometrically aligning its edge to a simple pointer worked surprisingly well:

Coaster Epoxy Rim - locating mirror edge
Coaster Epoxy Rim – locating mirror edge

Turning the OD down to match the bottom disk meant I could finally get decent results with zero drama:

Coaster Epoxy Rim - turned samples
Coaster Epoxy Rim – turned samples

From the bottom, this one has a 3 mm mirror, the 3 mm fluorescent green frame + petals, and a 1.6 mm top sheet:

Coaster Epoxy Rim - turned 6 petal mirror
Coaster Epoxy Rim – turned 6 petal mirror

This one has a 3M double-sided tape with low-surface-energy adhesive layers between the mirror and the fluorescent blue frame + petal, with epoxy between the top layer and the frame.

Coaster Epoxy Rim - turned 4 petal
Coaster Epoxy Rim – turned 4 petal

If I never tell anybody, they’ll think the slightly granular look if the tape was deliberate; it looks OK to me.

And, for completeness, the crash test dummy from the start of this adventure:

Coaster Epoxy Rim - turned 6 petal black
Coaster Epoxy Rim – turned 6 petal black

I don’t know how to avoid the bubbles, as the usual torch-the-top and pull-a-vacuum techniques pop bubbles at the epoxy-air interface. These bubbles are trapped under the top acrylic sheet, even though I was rather painstaking about easing the layer down from one side to the other while chasing bubbles along.

Maybe I can define bubbles as Part of the Art?

Definitely fancier than chipboard, although not nearly as absorbent.

Acrylic Coasters: Edge Finishing, Round 3

Although I could turn the coaster fixture’s OD, the lathe jaws are slightly longer than the fixture is thick:

Coaster Epoxy Rim - turning fixture rim
Coaster Epoxy Rim – turning fixture rim

So the fixture needs a spacer:

Coaster Epoxy Rim - cutting chuck spacer
Coaster Epoxy Rim – cutting chuck spacer

The ID is bigger and the OD is smaller than the fixture, so it won’t get in the way of further proceedings:

Coaster Epoxy Rim - 3-jaw lathe setup
Coaster Epoxy Rim – 3-jaw lathe setup

The pad on the live center came from the cookie cut from the fixture, with a just slightly off-center 3 mm hole poked into it to hold the point away from the coaster.

A ring of carpet tape on the fixture provides traction holding the coaster in place:

Coaster Epoxy Rim - carpet tape
Coaster Epoxy Rim – carpet tape

That turned out to be more trouble than it was worth; scissoring a pair of strips to fit the OD works just fine.

In any event, the live center applies enough pressure to keep the adhesive happy.

The fixture disk is sacrificial, so it now has a notch around its front face where the cutter cleared the coaster.

Although I intended to shim the fixture against the chuck jaws to center the coaster, my first attempt at manually centering the thing on the fixture was Close Enough™ that I just turned the OD to see how well the whole process worked:

Coaster Epoxy Rim - turned 6 petal black
Coaster Epoxy Rim – turned 6 petal black

The edge finish is arguably not Good Enough™, but it looks much better in person. In particular, the difference between the transparent acrylic top layer and the black acrylic frame around the petals is much more prominent in the photo, perhaps due to scatter from the overhead desk light.

This was the original crash test dummy acrylic coaster, so more care will be in order for the next set. In particular, shimming the fixture requires removing and replacing it for each adjustment, which can easily become a non-converging process.

Next up: I like little chucks

Acrylic Coasters: Edge Finishing, Round 2

Because the Sherline mill can’t cut all the way around a 4 inch OD coaster clamped to its table, I set up the 4-jaw chuck on the rotary table and centered the nicely round fixture:

Coaster Epoxy Rim - centering fixture plate
Coaster Epoxy Rim – centering fixture plate

Admittedly, the centering need not be so precise, but practice makes perfect.

A few strips of double-stick tape affixed the test coaster, with too many clamps applied to settle it in place:

Coaster Epoxy Rim - Sherline clamp setup
Coaster Epoxy Rim – Sherline clamp setup

A few sissy cuts demonstrated the tape lacked sufficient stickiness to hold the coaster in place against the milling cutter’s uplift. I managed to mill most of the perimeter with those clamps in place, moving each one from just ahead of the cutter to just behind the cutter.

That way lies both madness and organic damage.

There are better tapes and better adhesives, all trading off a really sticky fixture against difficulty extracting an undamaged part.

A more complex circular fixture with built-in mechanical edge clamps extending around a major part of the perimeter seems like entirely too much of a diversion for a couple of obscene-gerund coasters.

A live center in a lathe tailstock applies pressure in exactly the right place to hold a circular object against a fixture while slicing off the entire perimeter, with the only problem being centering the object.

Maybe shimming the fixture against one chuck jaw will suffice?