diff --git a/nodejs/middleware/auth.js b/nodejs/middleware/auth.js
index a12b20a..29baf4d 100755
--- a/nodejs/middleware/auth.js
+++ b/nodejs/middleware/auth.js
@@ -37,7 +37,12 @@ async function auth(req, res, next){
async function authIO(socket, next){
try{
- let token = await Auth.checkToken(socket.handshake.auth.token || 0);
+ // No token in the handshake (e.g. a page hit before login, or a socket
+ // opened while logged out) → reject the socket cleanly without doing an
+ // AuthToken.get(0) lookup that throws a noisy EntryNotFound trace.
+ let tok = socket.handshake.auth && socket.handshake.auth.token;
+ if(!tok) return next(Auth.errors.login());
+ let token = await Auth.checkToken(tok);
socket.user = token.user;
next();
}catch(error){
diff --git a/nodejs/models/dns_provider.js b/nodejs/models/dns_provider.js
index f6e5640..6c0a671 100644
--- a/nodejs/models/dns_provider.js
+++ b/nodejs/models/dns_provider.js
@@ -200,7 +200,6 @@ class DnsProvider extends Table{
...(domain.zoneId !== undefined ? {zoneId: domain.zoneId} : {}),
});
}
- console.log('currentDomains:', currentDomains)
for(let domain of currentDomains){
if(!domain) continue
diff --git a/nodejs/views/api_tokens.ejs b/nodejs/views/api_tokens.ejs
index 5c57cb5..5aa27b0 100644
--- a/nodejs/views/api_tokens.ejs
+++ b/nodejs/views/api_tokens.ejs
@@ -43,13 +43,21 @@
}
function fmtTime(ms){
- if(!ms) return '—';
- return moment(new Date(ms)).fromNow() + ' (' + moment(new Date(ms)).format('YYYY-MM-DD HH:mm') + ')';
+ // created_on/last_used_on come back from Redis as strings (model-redis
+ // only coerces fields with an explicit `type`); moment(value, "x") parses
+ // a numeric string-or-number as a Unix-ms timestamp, unlike new Date(str).
+ if(!ms || Number(ms) === 0) return '—';
+ var t = moment(ms, "x");
+ if(!t.isValid()) return '—';
+ return t.fromNow() + ' (' + t.format('YYYY-MM-DD HH:mm') + ')';
}
function fmtExpiry(token){
- if(!token.expires_at) return 'never';
- if(token.isExpired) return 'expired';
- return '' + moment(new Date(token.expires_at)).fromNow() + '';
+ // expires_at is type:number (a real number); isExpired is a class getter
+ // that is NOT serialized to the client, so compute expiry here.
+ var exp = Number(token.expires_at);
+ if(!exp) return 'never';
+ if(Date.now() > exp) return 'expired';
+ return '' + moment(exp, "x").fromNow() + '';
}
function processToken(token){