Files
bitvid/tests/app/is-user-logged-in.test.mjs
T
thePR0M3TH3ANandClaude Opus 4.8 bb33b12649 fix(auth): anonymous view-event session actor no longer reports you as logged out
After watching/opening a video, zapping showed "Log in and connect a wallet"
even though logged in. Recording a view creates an anonymous session actor with
source "session" (SignerManager.ensureSessionActor). isUserLoggedIn() treated any
declaredSource on a different-pubkey session actor as a managed alternate
identity and returned false — so the view-event telemetry actor logged the user
out app-wide (zap gate, etc.).

Fix: "session" is the anonymous telemetry source, not a login identity — only a
managed source (e.g. "nsec") for a different pubkey disqualifies. (Commit
7985a481 intended to allow anonymous actors but only covered the sourceless
shape; the real actor carries source "session".)

tests/app/is-user-logged-in.test.mjs: added the real view-event actor shape
(source "session", different pubkey) → logged in; the "nsec" rejection case still
holds. Mutation-verified.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-21 21:52:52 -04:00

159 lines
4.2 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import { Application } from "../../js/app.js";
import { nostrClient } from "../../js/nostrClientFacade.js";
import { HEX64_REGEX } from "../../js/utils/hex.js";
function createTestApp(pubkey) {
const app = {
_pubkey: pubkey,
normalizeHexPubkey(value) {
if (typeof value !== "string") {
return null;
}
const trimmed = value.trim();
if (!trimmed) {
return null;
}
if (HEX64_REGEX.test(trimmed)) {
return trimmed.toLowerCase();
}
return null;
},
isUserLoggedIn: Application.prototype.isUserLoggedIn,
};
Object.defineProperty(app, "pubkey", {
get() {
return this._pubkey;
},
set(value) {
this._pubkey = value;
},
});
return app;
}
test("isUserLoggedIn returns false when no user pubkey is set", () => {
const previousPubkey = nostrClient.pubkey;
const previousSessionActor = nostrClient.sessionActor;
try {
nostrClient.pubkey = null;
nostrClient.sessionActor = null;
const app = createTestApp(null);
assert.equal(app.isUserLoggedIn(), false);
} finally {
nostrClient.pubkey = previousPubkey;
nostrClient.sessionActor = previousSessionActor;
}
});
test("isUserLoggedIn treats extension logins as authenticated", () => {
const previousPubkey = nostrClient.pubkey;
const previousSessionActor = nostrClient.sessionActor;
try {
const pubkey = "893a31fa5a6481295bb76ea2dd8d5ec70640e6e6ad398e6547d771e8256af11f";
nostrClient.pubkey = pubkey;
nostrClient.sessionActor = { pubkey };
const app = createTestApp(pubkey);
assert.equal(app.isUserLoggedIn(), true);
} finally {
nostrClient.pubkey = previousPubkey;
nostrClient.sessionActor = previousSessionActor;
}
});
test("isUserLoggedIn guards against mismatched nostrClient state", () => {
const previousPubkey = nostrClient.pubkey;
const previousSessionActor = nostrClient.sessionActor;
try {
const pubkey = "a".repeat(64);
nostrClient.pubkey = "b".repeat(64);
nostrClient.sessionActor = { pubkey };
const app = createTestApp(pubkey);
assert.equal(app.isUserLoggedIn(), false);
} finally {
nostrClient.pubkey = previousPubkey;
nostrClient.sessionActor = previousSessionActor;
}
});
test("isUserLoggedIn ignores anonymous session actor mismatches", () => {
const previousPubkey = nostrClient.pubkey;
const previousSessionActor = nostrClient.sessionActor;
try {
const pubkey = "c".repeat(64);
nostrClient.pubkey = pubkey;
nostrClient.sessionActor = {
pubkey: "d".repeat(64),
privateKey: "e".repeat(64),
createdAt: Date.now(),
};
const app = createTestApp(pubkey);
assert.equal(app.isUserLoggedIn(), true);
} finally {
nostrClient.pubkey = previousPubkey;
nostrClient.sessionActor = previousSessionActor;
}
});
test("isUserLoggedIn allows the anonymous view-event session actor (source 'session')", () => {
// Regression: watching a video creates an anonymous view-event actor with
// source "session" and a different pubkey. It must NOT log the user out (which
// broke zaps with "Log in and connect a wallet").
const previousPubkey = nostrClient.pubkey;
const previousSessionActor = nostrClient.sessionActor;
try {
const pubkey = "1".repeat(64);
nostrClient.pubkey = pubkey;
nostrClient.sessionActor = {
pubkey: "2".repeat(64),
privateKey: "3".repeat(64),
source: "session",
createdAt: Date.now(),
};
const app = createTestApp(pubkey);
assert.equal(app.isUserLoggedIn(), true);
} finally {
nostrClient.pubkey = previousPubkey;
nostrClient.sessionActor = previousSessionActor;
}
});
test("isUserLoggedIn rejects mismatched managed session actors", () => {
const previousPubkey = nostrClient.pubkey;
const previousSessionActor = nostrClient.sessionActor;
try {
const pubkey = "f".repeat(64);
nostrClient.pubkey = pubkey;
nostrClient.sessionActor = {
pubkey: "0".repeat(64),
source: "nsec",
};
const app = createTestApp(pubkey);
assert.equal(app.isUserLoggedIn(), false);
} finally {
nostrClient.pubkey = previousPubkey;
nostrClient.sessionActor = previousSessionActor;
}
});