Activity status can be disabled; excluded from API responses when off
Why it matters
Activity status — 'last seen 3 minutes ago', 'currently online', 'typing' — reveals real-time behavioral patterns that users may want to keep private for safety or personal reasons. Domestic abuse victims, people avoiding specific contacts, and users who want to read messages without triggering social pressure are all impacted by forced activity disclosure. GDPR Art. 25 (privacy by design) requires that data minimization be the default: broadcast activity only when users have affirmatively chosen to share it. CWE-200 captures the information exposure when status fields are included in API responses regardless of user preference.
Severity rationale
Low because the exposed data is behavioral metadata rather than account credentials or PII, but the real-time nature makes it a safety concern for vulnerable users.
Remediation
Check the activityStatusVisible setting before including any lastSeen, isOnline, or typing indicators in API responses or WebSocket broadcasts. Apply the check server-side — omitting the field from the response is more reliable than frontend suppression. In your user profile serializer:
// src/lib/users/serialize.ts
export async function serializeUser(user: User, viewerId: string): Promise<PublicUser> {
const settings = await db.userSettings.findUnique({ where: { userId: user.id } });
return {
id: user.id,
name: user.name,
// conditionally include activity
...(settings?.activityStatusVisible && {
lastSeen: user.lastSeen,
isOnline: isUserOnline(user.id)
})
};
}
Also gate the WebSocket presence broadcast: skip emitting user:online and user:typing events for users with activity status disabled.
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Community Privacy & Controls Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- gdpr · Art. 25 — Data protection by design and by default — activity status minimization
- cwe · CWE-200 — Exposure of Sensitive Information to an Unauthorized Actor
- cwe · CWE-285 — Improper Authorization
Taxons
History
- 2026-04-18·v1.0.0·Initial import from community-privacy-controls·automated