xref: /plugin/lastseen/README.md (revision 34b8413f371c8ced24cf179370bf6a8907b81994)
1*34b8413fStracker-user# User Last Seen plugin for DokuWiki
2*34b8413fStracker-user
3*34b8413fStracker-userRecords when each registered user was last active on the wiki, and shows it in an Admin-panel page next to the User Manager. Useful for spotting dormant or stale accounts.
4*34b8413fStracker-user
5*34b8413fStracker-userThis is an original plugin (not a fork), built for a Librarian-based wiki.
6*34b8413fStracker-user
7*34b8413fStracker-user## What it does
8*34b8413fStracker-user
9*34b8413fStracker-user- Every authenticated request updates that user's "last seen" timestamp. This is **last activity**, not just last login — a page view made with a persistent ("remember me") cookie counts, because the tracker hooks `DOKUWIKI_STARTED`, which fires after authentication resolves regardless of how the user authenticated.
10*34b8413fStracker-user- An Admin page (**User Last Seen**, next to User Manager) lists every registered user with four columns: **Username · Display name · Groups · Last seen**. No email column.
11*34b8413fStracker-user- "Last seen" shows both an absolute timestamp and a relative time ("3 days ago"). Users never seen since the plugin was installed show "never".
12*34b8413fStracker-user- Column headers are clickable to sort — sort by "Last seen" ascending to float dormant accounts to the top.
13*34b8413fStracker-user
14*34b8413fStracker-user## Why an Admin page and not a column in the User Manager
15*34b8413fStracker-user
16*34b8413fStracker-userThe bundled User Manager fires no events for table rendering — its table is built with hardcoded `echo` statements and a fixed five-column layout. Adding a column would require forking the bundled `usermanager` plugin, which DokuWiki *core* upgrades overwrite (unlike third-party plugins). A separate Admin page uses only public APIs (`retrieveUsers()`, the admin-plugin interface), survives upgrades untouched, and can do things a cramped column can't — sortable, relative times, "never" highlighting.
17*34b8413fStracker-user
18*34b8413fStracker-user## Architecture
19*34b8413fStracker-user
20*34b8413fStracker-user| Component | Role |
21*34b8413fStracker-user| --- | --- |
22*34b8413fStracker-user| `action.php` | Hooks `DOKUWIKI_STARTED`. If `REMOTE_USER` is set, records the user as seen (throttled). |
23*34b8413fStracker-user| `helper.php` | Owns the storage file and format. `record()` is internally throttled; `getAll()` / `getTimestamp()` for reads. |
24*34b8413fStracker-user| `admin.php` | The **User Last Seen** Admin page. Enumerates users via the auth backend, renders the sortable table. |
25*34b8413fStracker-user
26*34b8413fStracker-user**Storage.** A single serialized `username → unix-timestamp` map at `{metadir}/_lastseen.dat`. The meta directory is used (not cache) so the data survives cache clears and DokuWiki upgrades. Writes are atomic (`io_saveFile()`) under a lock (`io_lock()`).
27*34b8413fStracker-user
28*34b8413fStracker-user**Throttling.** Recording on every page view would be wasteful. `record()` only rewrites a user's timestamp if the stored one is older than `update_interval` (default 600s / 10 min). Heavy browsing produces at most one write per interval per user. "Last seen" is therefore accurate to within the interval, which is plenty for spotting dormant accounts.
29*34b8413fStracker-user
30*34b8413fStracker-user## Configuration
31*34b8413fStracker-user
32*34b8413fStracker-userAdmin → Configuration Settings:
33*34b8413fStracker-user
34*34b8413fStracker-user| Setting | Default | Effect |
35*34b8413fStracker-user| --- | --- | --- |
36*34b8413fStracker-user| `update_interval` | `600` | Throttle: minimum seconds between last-seen writes per user. Lower = more precise, more disk I/O. Minimum 60. |
37*34b8413fStracker-user| `show_never` | `1` (on) | List users never seen since install. Turn off to show only users with recorded activity. |
38*34b8413fStracker-user
39*34b8413fStracker-user## Access
40*34b8413fStracker-user
41*34b8413fStracker-userThe Admin page is **admin-only** (`forAdminOnly()` returns true) — last-seen data is mildly sensitive. To also allow managers (users in `$conf['manager']`), change `forAdminOnly()` in `admin.php` to return `false`.
42*34b8413fStracker-user
43*34b8413fStracker-user## Requirements and caveats
44*34b8413fStracker-user
45*34b8413fStracker-user- **Auth backend.** Built and tested against `authplain` (the default file-based backend). The Admin page enumerates users via `retrieveUsers()`. If the active backend can't list users (some LDAP/AD configurations), the page detects this via `$auth->canDo('getUsers')` and shows a notice instead of an incomplete roster.
46*34b8413fStracker-user- **Historical data.** Tracking begins at install — users are "never" until their first authenticated request afterward.
47*34b8413fStracker-user- **Deleted users.** If a user is removed from the wiki, their entry lingers in the storage file as harmless orphan data; the Admin page won't display it (it only shows users returned by `retrieveUsers()`). The file can be deleted to reset all data — it's rebuilt automatically.
48*34b8413fStracker-user- **Privacy.** This is mild activity tracking. Admin-only visibility is the intended boundary; for a staff wiki this is a normal administrative function.
49*34b8413fStracker-user
50*34b8413fStracker-user## Install
51*34b8413fStracker-user
52*34b8413fStracker-userDrop the folder into `lib/plugins/lastseen/`, or use Admin → Extension Manager → Manual Install to upload the zip. No "update suppression" date trick is needed — this is a local plugin with no upstream in the dokuwiki.org repository, so the Extension Manager never offers an update for it.
53*34b8413fStracker-user
54*34b8413fStracker-user## Tested against
55*34b8413fStracker-user
56*34b8413fStracker-userDokuWiki `2025-05-14b "Librarian"` — 27 functional tests covering storage, throttle behavior, user enumeration, and table rendering, all passing under `error_reporting=E_ALL`.
57*34b8413fStracker-user
58*34b8413fStracker-user## License
59*34b8413fStracker-user
60*34b8413fStracker-userGPL 2.
61