Silent self-update, active sessions with real client IPs, genre/year browsing, handoff fix #119

Merged
bvandeusen merged 15 commits from dev into main 2026-08-05 15:14:49 -04:00
3 changed files with 8 additions and 5 deletions
Showing only changes of commit a07fb3867a - Show all commits
+1 -1
View File
@@ -100,7 +100,7 @@ func (h *handlers) handleLogin(w http.ResponseWriter, r *http.Request) {
// the active-sessions surface: a session that was born somewhere the // the active-sessions surface: a session that was born somewhere the
// user recognises but is being used from somewhere they don't is the // user recognises but is being used from somewhere they don't is the
// case this whole surface exists to surface. // case this whole surface exists to surface.
Ip: auth.ClientIP(r), Ip: auth.ClientIP(r, h.netSettings.Hops()),
}); err != nil { }); err != nil {
h.logger.Error("api: insert session failed", "err", err) h.logger.Error("api: insert session failed", "err", err)
writeErr(w, apierror.InternalMsg("insert failed", err)) writeErr(w, apierror.InternalMsg("insert failed", err))
+1 -1
View File
@@ -175,7 +175,7 @@ func (h *handlers) handleRegister(w http.ResponseWriter, r *http.Request) {
UserID: user.ID, UserID: user.ID,
TokenHash: auth.HashSessionToken(sessionToken), TokenHash: auth.HashSessionToken(sessionToken),
UserAgent: r.UserAgent(), UserAgent: r.UserAgent(),
Ip: auth.ClientIP(r), Ip: auth.ClientIP(r, h.netSettings.Hops()),
}); err != nil { }); err != nil {
h.logger.Error("register: insert session failed", "err", err) h.logger.Error("register: insert session failed", "err", err)
writeErr(w, apierror.Internal(err)) writeErr(w, apierror.Internal(err))
@@ -34,7 +34,10 @@ describe('NetworkSettingsCard', () => {
getNetworkSettings.mockResolvedValue(settings()); getNetworkSettings.mockResolvedValue(settings());
render(NetworkSettingsCard); render(NetworkSettingsCard);
expect(await screen.findByText('198.51.100.7')).toBeTruthy(); // The address legitimately appears twice — as the detected client and
// inside the forwarded chain — so wait on the unique label, not the value.
await screen.findByText('Your address right now');
expect(screen.getAllByText('198.51.100.7').length).toBeGreaterThan(0);
expect(screen.getByText('172.18.0.1:40000')).toBeTruthy(); expect(screen.getByText('172.18.0.1:40000')).toBeTruthy();
}); });
@@ -83,7 +86,7 @@ describe('NetworkSettingsCard', () => {
); );
render(NetworkSettingsCard); render(NetworkSettingsCard);
await screen.findByText('198.51.100.7'); await screen.findByText('Your address right now');
expect(screen.queryByText(/arrived with/)).toBeNull(); expect(screen.queryByText(/arrived with/)).toBeNull();
}); });
@@ -101,6 +104,6 @@ describe('NetworkSettingsCard', () => {
const retry = await screen.findByRole('button', { name: 'Try again' }); const retry = await screen.findByRole('button', { name: 'Try again' });
getNetworkSettings.mockResolvedValue(settings()); getNetworkSettings.mockResolvedValue(settings());
await fireEvent.click(retry); await fireEvent.click(retry);
await screen.findByText('198.51.100.7'); await screen.findByText('Your address right now');
}); });
}); });