=== ITX UserOps — User Management, Login Activity, Sessions & Audit Log ===
Contributors: nanosani
Tags: user management, login activity, user sessions, disable users, audit log
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.9.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

One admin console for your WordPress users: online status, login activity, sessions, disable accounts, audit log and bulk actions.

== Description ==

WordPress has no unified user administration console. To see who is online, keep a login audit trail, force-logout a compromised account, disable a departed contractor without deleting their content, find out whether the password reset actually went out, or edit a role without deciphering sixty capability checkboxes, you normally need five or six single-purpose plugins.

**ITX UserOps replaces that whole stack with one fast, cohesive console** — the kind of user administration Microsoft 365 or Google Workspace admins get out of the box.

[Website](https://itxuserops.com/) | [Documentation](https://itxuserops.com/docs/getting-started/) | [All features](https://itxuserops.com/features/) | [Changelog](https://itxuserops.com/changelog/) | [Support](https://itxuserops.com/support/)

= Unified user dashboard =

* Every user in one table: online-now indicator, last login, last activity, active sessions, role, status, registered date, post count
* Server-side search, sorting and pagination — stays fast at 100,000+ users
* Quick filters that combine: role, status, online now, last login (today / 7 / 30 / 90 days / never), registered date range, inactive 30/60/90 days
* Overview tiles — online now, logins today, failed logins, disabled accounts, security alerts — each clickable, drilling into the matching filtered view
* Toggleable columns, per-admin

[Dashboard documentation →](https://itxuserops.com/docs/console/dashboard/)

= Disable users without deleting them =

* One click disables an account: the user can no longer log in **on any channel** — wp-login, XML-RPC, REST, application passwords — and every active session is destroyed instantly
* Content, comments and history stay intact
* Customizable "account disabled" message
* Safety rails: you can never disable yourself or the last administrator

[Account status documentation →](https://itxuserops.com/docs/console/account-status/)

= Session management =

* See every active session per user: browser, OS, device, IP, signed-in time, last activity
* Terminate any single session, log a user out everywhere, or log **all** users out (your own session survives)

[Sessions documentation →](https://itxuserops.com/docs/console/sessions/)

= Login & user audit log =

* Dedicated Login Log: every sign-in attempt — success, failed or blocked — with user, IP, device, user agent, and which door it came through (login form, XML-RPC, REST API or WP-CLI)
* Records logins, failed logins (with attempted username), logouts, blocked logins, registrations, deletions, role changes, password changes/resets, email and profile changes, application passwords, and bulk actions
* Site visibility: content published/updated/trashed/deleted (with author and actor), plugin activations/deactivations, theme switches and WordPress core updates
* **Tamper-evident**: each entry is chained to the one before it, so database-level tampering — an edited dump, SQL injection, a rogue database user — is detectable
* Filter by event, user, actor, IP, severity and date; full-text search; CSV export
* Configurable retention (30 days up to keep-forever) with daily auto-purge
* Brute-force flood protection: failed-login noise is aggregated, never table-flooding

[Activity log documentation →](https://itxuserops.com/docs/console/activity-log/) · [How tamper evidence works →](https://itxuserops.com/docs/console/tamper-evidence/)

= Email log =

* Every message WordPress hands to the mail server, recorded at the moment of hand-off: recipient, subject, timing, and what the server said back
* Honest states: nothing is labelled "Delivered" or "Sent", because your site cannot observe either. The good state is **Handed off**, failures carry the server's error, and results another plugin merely claimed are shown as reported rather than observed
* You choose which kinds of mail are logged — account mail on by default, high-volume kinds off — which is what keeps the log small on a busy store
* Message contents are **not stored unless you switch it on** — and when you do, password reset links, one-time codes and application passwords are stripped before anything is written, so the log cannot become a way in
* Its own retention setting with no "keep forever", and one-click deletion of stored message contents

[Email log documentation →](https://itxuserops.com/docs/console/email-log/)

= Role editor =

* WordPress permissions as a grid of **areas** (Posts, Pages, Media, Comments, Users, Site settings, Plugins & themes) against **levels** (None, View, Contribute, Manage) — instead of sixty raw checkboxes. Custom post types get their own row automatically
* Draft-first: every edit collects into a draft and nothing touches the live role until you press Publish
* A Plain English view of the role as toggleable statements, side-by-side role comparison, and people management — add someone to a role, move people out, reassign between roles
* Capabilities the grid does not manage are never touched, and a role the grid cannot describe shows the exact difference instead of quietly rewriting it on save
* "Restore WordPress defaults" puts the five built-in roles back exactly as WordPress ships them
* Guardrails enforced on the server, not merely hidden in the screen: you cannot grant access you do not hold, change your own role, or demote the last administrator

[Roles documentation →](https://itxuserops.com/docs/console/roles/)

= Per-user profile drawer =

* Click any user for an Entra-ID-style panel: overview with 30-day login sparkline, live session list, that user's complete activity trail, and the mail sent to them — without leaving the page

[Profile drawer documentation →](https://itxuserops.com/docs/console/profile-drawer/)

= Bulk actions =

* Multi-select users → change role, disable, enable, log out, send password reset, delete with content reassignment, export to CSV
* Runs in batches with a progress bar — no timeouts on large sites

[Bulk actions documentation →](https://itxuserops.com/docs/console/bulk-actions/)

= Works behind Cloudflare and reverse proxies =

* Behind a CDN, load balancer or reverse proxy, logs normally record the proxy's address instead of the visitor's. Name your proxy (Cloudflare's ranges are built in) and the real client IP is recorded instead
* Forwarding headers are only trusted when the request genuinely arrives from a configured range, so they cannot be forged

[Client IP documentation →](https://itxuserops.com/docs/console/proxies/)

= Privacy and GDPR =

* GDPR mode zeroes the last part of every captured IP before it is stored
* Log retention is capped and auto-purged; email bodies are opt-in and redacted
* Uninstalling can remove every trace of plugin data — your choice, off by default

[Privacy documentation →](https://itxuserops.com/docs/reference/privacy/)

= Extras =

* Live "online users" count in the admin bar and a user-overview dashboard widget
* Online status and a UserOps details link right in the native Users screen
* Works on multisite — each subsite gets its own console ([multisite notes →](https://itxuserops.com/docs/console/multisite/))

= Performance =

Built to a strict budget: front-end requests incur at most one throttled database write per user per minute — no admin-ajax polling, no autoloaded bloat. Logs live in their own indexed tables, never in wp_options. The plugin makes no external HTTP requests and loads no remote assets.

[Performance notes →](https://itxuserops.com/docs/reference/performance/)

= Free, and complete =

Everything described above is free, fully functional, and stays that way. A separate premium edition exists for security teams — two-factor enforcement, passkeys, security alerts, temporary accounts, delegation and more — described at [itxuserops.com/pricing](https://itxuserops.com/pricing/). Nothing on this page requires it.

== Installation ==

= Minimum requirements =

* WordPress 6.0 or newer
* PHP 7.4 or newer
* Works on single sites and multisite networks

[Requirements in detail →](https://itxuserops.com/docs/getting-started/requirements/)

= Installing from your WordPress dashboard (recommended) =

1. Sign in to your WordPress admin and go to **Plugins → Add New Plugin**
2. Search for **ITX UserOps**
3. Click **Install Now**, then **Activate**

= Installing by upload =

1. Download the plugin zip from this page
2. In your WordPress admin, go to **Plugins → Add New Plugin → Upload Plugin**
3. Choose the zip, click **Install Now**, then **Activate**

Or unzip it into `wp-content/plugins/` over SFTP and activate from the Plugins screen.

[Installation guide →](https://itxuserops.com/docs/getting-started/install/)

= After activation =

Activation changes nothing on your site: no role is edited, no email is sent, no existing data is touched. The console appears as **ITX UserOps** in the admin menu — open the Dashboard and your users, sessions and logs are already there; recording starts from the moment the plugin is active.

A guided tour of what to look at first — the dashboard, the login log, retention settings, and proxy configuration if you are behind Cloudflare — is in [Your first hour →](https://itxuserops.com/docs/getting-started/first-hour/)

= Updating =

Update from the Plugins screen like any other plugin. Database schema upgrades run automatically and every step is additive — existing log entries stay readable.

= Uninstalling =

Deactivating stops all recording and clears the plugin's scheduled tasks. Uninstalling keeps your data by default; if you want a complete removal, enable **Delete all plugin data on uninstall** in ITX UserOps → Settings first, and uninstalling then removes every table, option and user-meta entry the plugin ever created.

== Frequently Asked Questions ==

= How do I disable a WordPress user without deleting them? =

Open ITX UserOps → Dashboard, find the user, and choose "Disable account" from the row menu. They immediately lose access on every login channel while their content and history remain untouched. Re-enable them any time.

= How do I log out all WordPress users at once? =

ITX UserOps → Dashboard → "Log out all users". Every session on the site is destroyed except your current one.

= How can I see who is currently online? =

The dashboard's "Online" column shows a live indicator for every user with activity in the last 5 minutes, and the "Online now" filter lists exactly who is connected.

= Does it slow down my site? =

No. Visitors trigger zero extra queries. Logged-in users trigger at most one tiny indexed write per minute. All heavy lifting happens only on the plugin's own admin pages.

= Is it GDPR friendly? =

Yes. Enable "Anonymize IP addresses" and the last octet of every captured IP is zeroed before storage. Log retention is capped and auto-purged, and uninstalling can remove every trace of plugin data.

= Does it work on multisite? =

Yes — each subsite gets its own dashboard, log and settings. Subsite admins cannot disable super admins.

= Where is the audit log stored? =

In its own indexed database table — not in wp_options or postmeta — so a busy log never slows down the rest of your site.

== Screenshots ==

1. User dashboard — who is online, logins, security alerts, role breakdown and recent activity in one view
2. Per-user profile drawer with sessions, devices, activity and one-click account actions
3. Login log — successes, failures, blocked attempts and logouts charted over 14 days
4. Failed-login detail with IP address, user agent and aggregated attack counts
5. Activity log with per-severity charts and filtering by event, severity, IP and date
6. Activity entry detail — who changed what, from where, with the full metadata
7. Email log — what the site sent and what the mail server said, with per-message detail
8. Role editor — areas and levels instead of raw capabilities, with drafts and compare
9. The raw capability list, one click away and always in step with the grid
10. Settings — staff detection, log retention, email logging, IP detection and privacy controls

== Development ==

The admin interface is a React app built with @wordpress/scripts. The
human-readable source lives in `assets/src/`; the compiled bundle in
`assets/build/` is generated with:

`npm install && npm run build`

No third-party JavaScript libraries are bundled — the app uses the
@wordpress/* packages that ship with WordPress core. The plugin makes no
external HTTP requests and loads no remote assets.

== Changelog ==

= 1.9.1 =
The first update on WordPress.org since 1.0.0, condensing the development releases in between. What is new compared to 1.0.0:

* New: Roles. WordPress permissions described the way people think about them — a grid of areas (Posts, Pages, Media, Comments, Users, Site settings, Plugins & themes) against levels (None, View, Contribute, Manage) instead of sixty raw checkboxes. Custom post types get their own row automatically.
* Roles is draft-first: every edit collects into a draft, a bar counts the changes, and nothing touches the live role until you press Publish. Leaving with a draft open prompts you like any unsaved form.
* Alongside the grid: a Plain English view of the role as toggleable statements, side-by-side role comparison with differences highlighted, people management (add someone to a role, move people out, reassign between roles), create/duplicate/rename/delete, and "Restore WordPress defaults" for the five built-in roles.
* Capabilities the grid does not manage are never touched — if WooCommerce or a membership plugin added something to a role, saving leaves it byte-for-byte. A role the grid cannot describe reads "Custom" and shows the exact difference instead of quietly rewriting it on save.
* Role guardrails are enforced on the server, not merely hidden in the screen: you cannot grant access you do not hold yourself, change your own role, or demote the last administrator. The administrator role is visible but not editable. Activation changes nothing until you choose to change it.
* New: an Email Log. Every message WordPress hands to the mail server is recorded — recipient, subject, timing, and what the server said back. Nothing is labelled "Delivered" or "Sent", because your site cannot observe either: the good state is "Handed off", failures carry the server's error, and results another plugin merely claimed are shown as reported rather than observed.
* You choose which kinds of mail are logged; account mail and the plugin's own mail are on by default, high-volume kinds are off. Message contents are not stored unless you switch it on — and when you do, password reset links, one-time codes and application passwords are stripped before anything is written, so the log cannot become a way in. Stored contents can be deleted again in one click.
* New: client IP detection behind Cloudflare, a load balancer or another reverse proxy (Cloudflare's ranges are built in). Forwarding headers are only trusted when the request genuinely arrives from a configured range, so they cannot be forged.
* New: the activity log is tamper-evident. Each entry is chained to the one before it, so database-level tampering — an edited dump, SQL injection, a rogue database user — is detectable, and legitimate retention deletion records itself so it is never mistaken for interference.
* New: the activity log records which door a sign-in attempt came through — the login form, XML-RPC, the REST API or WP-CLI — shown as "Signed in via" in the event details.
* New: each user's profile panel gains an Emails tab beside Overview, Sessions and Activity; log rows on every screen open a keyboard-accessible side panel; every dashboard overview tile drills into its matching filtered view.
* Fixed: repeat login lockouts now double in length as intended — the record the escalation counted from was being deleted the moment a lock expired, so an attacker could simply wait out the shortest lockout and go again.
* Fixed: changing roles from the bulk actions bar, which failed on every site, and bulk-action failures that closed the toolbar without saying why.
* Performance: the online-users counter, dashboard counts and activity-log totals are cached instead of recomputed on every admin page load, session cleanup and IP searches are indexed, and the dashboard no longer counts every user account per visit.
* Database schema upgrades from version 1 to 6 run automatically on update; every step is additive and existing entries stay readable.

The full release-by-release history is at https://itxuserops.com/changelog/

= 1.0.0 =
* Initial release: unified user dashboard, enable/disable accounts, device-grouped session management, activity & login audit log, profile drawer, bulk actions with CSV export, admin-bar online counter, user-overview dashboard widget, and native Users-screen integration.

== Upgrade Notice ==

= 1.9.1 =
First update since 1.0.0. Adds the Roles editor and the Email Log, proxy-aware IP detection, a tamper-evident activity log, and many fixes. Database upgrades run automatically and are additive — nothing existing is touched.
