Skip to content

Releases: wearenoformat/nf-logbook

Noformat Logbook 1.3.1

Choose a tag to compare

@drasko-noformat drasko-noformat released this 03 Nov 14:31
e0f8936

Fixed

  • Update checks on shared hosting. GitHub's API allows 60 anonymous requests per hour per IP address, and hosts such as WP Engine send many sites through one address, so "Check now" could fail with "API rate limit exceeded" for hours. Without a token, a rate-limited check now reads the latest release's manifest.json through the plain download link (github.com/{repo}/releases/latest/download/manifest.json), which is not counted against that limit. The package must be this repository's own release download, and its SHA-256 is verified as before. Private repositories (with a token) are unchanged.

Noformat Logbook 1.3.0

Choose a tag to compare

@drasko-noformat drasko-noformat released this 03 Nov 12:20
50374c7

Added (resolve issues)

  • Resolve / Reopen in the System log line detail for warning, error and critical events, Resolve all open (every open warning/error/critical issue in the current filters, at most 200 per call) and a Hide resolved toggle (resolved=hide, also honoured by the live tail and the export). Resolved lines are shown dimmed with a Resolved chip.
  • An issue is the event's fingerprint, or the single event (event:<id>) when it has none. Resolving records "resolved through event id N" (N = the newest event with that fingerprint at that moment), resolved_at and resolved_by (user id only). An event counts as resolved iff its id ≤ N, so a later occurrence opens the issue again; resolving also closes the fingerprint's aggregation window so the recurrence is stored as a new event instead of raising the resolved event's count.
  • Resolved issues are excluded from the System log severity counters, the Content log "Needs attention" line and the dashboard widget's system line (whose links now open the System log with resolved=hide).
  • New events logger.issue_resolved and logger.issue_reopened (system, notice, object issue / <fingerprint|event:id>, context {fingerprint, event_id, through_id} / {fingerprint, event_id}), one per issue, also for Resolve all open. The Controlroom mirrors resolutions from them.
  • wp nflog resolve <fingerprint|event:ID>... | --all-open [--window=…] and wp nflog reopen <fingerprint|event:ID>....
  • Admin AJAX nflog_resolve / nflog_resolve_all (POST, nonce, manage_options plus System log access).

Storage

  • Schema version 2: new table {prefix}nflog_resolutions (issue_key PK, fingerprint, event_id, through_id, resolved_at, resolved_by), created by the existing dbDelta upgrade (Schema::maybeUpgrade(), admin and WP-CLI). Prune removes resolutions whose events are all gone (through_id ≤ the prune boundary); uninstall drops the table with the others. Events, the hash chain and {prefix}nflog_fingerprints rows are not changed.
  • Until the upgrade has run, views simply show nothing as resolved.

Unchanged

  • REST API and docs/CONTRACT.md: events are served as stored; GET /summary and GET /health keep counting every event. The manifest reports database schema 2.

Noformat Logbook 1.2.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 17:19

Changed (name)

  • The plugin is renamed from Noformat Logger to Noformat Logbook: folder and slug nf-logbook, main file nf-logbook.php (basename nf-logbook/nf-logbook.php), text domain nf-logbook, admin page Tools → Noformat Logbook (tools.php?page=nf-logbook&tab=…), repository and Update URI https://github.com/wearenoformat/nf-logbook, release asset nf-logbook.zip (top folder nf-logbook/, manifest slug nf-logbook), MU loader mu-loader/nf-logbook-loader.php. Every user-visible string (admin titles, Tools submenu, notices, dashboard widget, CLI messages, View details, docs) says Noformat Logbook. The plugin's own events (logger.*) carry object_id nf-logbook.
  • Unchanged (wire and storage contract): REST namespace noformat-logger/v1 and its routes, the X-NF-* signing headers, the hash chain and canonical JSON, the producer name wp-noformat-logger, event fields, tables {prefix}nflog_*, options and transients (nflog_*, noformat_logger_*), constants NOFORMAT_LOGGER_*, hooks noformat_logger/*, capabilities, cron hooks, wp nflog and the PHP namespace Noformat\Logger. uninstall.php drops the same tables and options as before.
  • tools.php?page=noformat-logger[&tab=…] redirects (301) to tools.php?page=nf-logbook with its tab and filters, next to the existing 1.0 and 0.x redirects.
  • wp nflog install-mu-loader installs nf-logbook-loader.php and removes an old noformat-logger-loader.php from mu-plugins.

Upgrade note

  • Sites on 1.1.x cannot auto-update across the rename (WordPress sees a different plugin). Once per site: deactivate Noformat Logger, remove wp-content/plugins/noformat-logger/ without WordPress "Delete" (that runs uninstall.php, which drops the log tables when "delete data on uninstall" is set), install nf-logbook.zip and activate Noformat Logbook. The log, chain, key and settings carry over because the tables and options are unchanged. Details: docs/UPDATES.md → Upgrading from 1.1.x.

Tests

  • Unit and integration tests use the new slug, folder and asset name; setup.sh links the plugin as plugins/nf-logbook (and drops a dangling plugins/noformat-logger link); smoke-admin.sh checks the 1.1 redirects; smoke-errors.sh checks that install-mu-loader removes the old loader file.
  • tests/integration/smoke-update-private.sh (in run-all.sh): the updater's private-repository (token) path end to end against a GitHub emulator mu-plugin (tests/integration/github-emulator.php, a pre_http_request filter; no network to GitHub, no real token): 404 without a token, 401 with a wrong one, 200 / ETag 304 with the right one, manifest and package through the asset API with the redirect to storage followed without Authorization, wp plugin update to 9.9.9, SHA-256 refusal of a tampered zip, and the token never printed or stored.

Noformat Logger 1.1.1

Choose a tag to compare

@github-actions github-actions released this 02 Nov 10:06

Changed

  • Plugin description: "Tamper-evident, privacy-preserving log of content changes and error, security and stability signals." (the clause about the Controlroom reading it over a signed API is gone from the header and the View details modal; the signed API itself is unchanged).

Fixed (noise in the Content log)

Machine-written state no longer shows up as content changes. Both rules log the write at debug with context.technical: true and context.technical_reason, so it is dropped unless log_debug is on (like the existing technical meta keys). Notice and critical options (siteurl, home, admin_email, {prefix}user_roles, users_can_register, default_role, active_plugins, blogname, permalink_structure, theme_mods_*, … and anything the noformat_logger/option_severity / critical_options filters raise above info) are always exempt.

  • Write-on-read rule (RequestContext::machineWriteReason()): an option.* or meta.* (all object types) write during a GET or HEAD request (front-end views, admin page loads, REST GETs; reason read_request), during WP-Cron (cron) or in the admin-ajax heartbeat action (heartbeat) is machine state. A non-REST GET that carries _wpnonce (activate / trash links, bulk edit on edit.php) is still a deliberate action. POST/PUT/PATCH/DELETE, REST writes, forms and WP-CLI are unchanged; ACF grouped events are unchanged.
  • State-key patterns (Config::defaultTechnicalKeyPatterns(), filter noformat_logger/technical_key_patterns; reason key_pattern), whatever the method: names containing a state word (dismissed, pointer(s), version_info, usage_analytics, sticky_admin_messages, last_checked, last_run, last_update_check, transient, batch, queue, lock, telemetry, install_date, activation_time, review_notice) or ending in notification(s) / notices / admin_notice, and the prefixes wp_yoast_, _yoast_, imagify_, gsmtp_, gform_version, _transient_, _site_transient_ plus rg_gforms_message. Keys ending in _settings / _options are exempt (imagify_settings saved from its screen stays info), and so are the Yoast fields an editor types (MetaListener::MEANINGFUL_KEYS). Covers wp_yoast_notifications, wpseo_notifications, gsmtp_version_info, gform_version_info, gform_sticky_admin_messages, imagify_optimize_media_batch_*. rg_gforms_* as a whole is deliberately not on the list: most of those options are Gravity Forms settings.

Changed (errors)

  • doing_it_wrong for _load_textdomain_just_in_time (raised on every request by translation-eager plugins since WordPress 6.7) is info instead of warning; still aggregated by fingerprint. Every other doing_it_wrong stays warning.

Noformat Logger 1.1.0

Choose a tag to compare

@drasko-noformat drasko-noformat released this 02 Nov 09:04

Added (updates)

  • The plugin updates like any other plugin, from the GitHub Releases of wearenoformat/wp-noformat-logger (constant NOFORMAT_LOGGER_UPDATE_REPO), with no update server of our own: Dashboard → Updates and the Plugins screen show update now, the auto-update toggle works, wp plugin update noformat-logger works, and View details shows the release notes (src/Update/, docs/UPDATES.md).
  • Update URI: https://github.com/wearenoformat/wp-noformat-logger (was false); update_plugins_github.com returns the latest release's update array, plugins_api the details modal.
  • Release discovery: one GET /repos/{repo}/releases/latest per check, cached 6 hours in the transient noformat_logger_update with the ETag reused (304 keeps the cache); the release's manifest.json (version, requirements, changelog, sha256) is read only when the release changed. On 403/429/404 or network errors the cached answer is kept and a human reason recorded ("GitHub answered 404: the repository is private or the name is wrong …").
  • Every package is downloaded over HTTPS by the plugin and its SHA-256 compared with the manifest; a mismatch refuses the update ("… failed the SHA-256 check …"). The unpacked folder is always renamed to noformat-logger. Our own update clears the cache and is logged as plugin.updated (by the updater itself when PluginThemeListener is off).
  • Optional constants NOFORMAT_LOGGER_UPDATE_TOKEN (fine-grained read-only token for a private repository; it would live in every site's wp-config, a public repository or releases-only mirror is recommended) and NOFORMAT_LOGGER_UPDATE_MANIFEST (self-hosted manifest URL, bypasses GitHub).
  • Status tab: Updates card (installed, latest, source, last check, result) with Check now for administrators; wp nflog update-check [--cached] [--format=json] prints the same line.
  • Packaging: .distignore, tools/release.sh <version> (version / CHANGELOG / tag checks, composer check, zip with top folder noformat-logger/, manifest.json, tag, gh release create; --local-only for tests) and .github/workflows/release.yml (same on a pushed v* tag).
  • Integration: tests/integration/smoke-update.sh (in run-all.sh) updates the test site from a locally served 9.9.9 release through WP-CLI and checks that a tampered zip is refused.

Changed (wp-admin)

  • The admin UI moves under Tools: one page, Tools → Noformat Logger (tools.php?page=noformat-logger), replaces the top-level menu and its four submenus; the screens are in-page tabs (Content log · System log · Status · Settings, &tab=content|system|status|settings) styled with the existing design system (.nflog-tabs).
  • Access rules are unchanged (Content log per events_visible_to, System log per system_log_visible_to, Status for everyone who may open the page with key actions for manage_options, Settings for manage_options). A tab the user may not open is not rendered and a direct ?tab= request to it answers 403; without tab the first allowed tab opens (an administrator under events_visible_to = capability_only now lands on the System log instead of a "no permission" view).
  • The 1.0 URLs (admin.php?page=noformat-logger, …-system, …-status, …-settings) and the older tools.php?page=noformat-logger&tab=events redirect with 301 to the matching tab, filters kept.
  • Every internal link (dashboard widget, the "Needs attention" strip, the Content log / System log cross-links, the console and toolbar filter forms, the Status key form, exports) points to the tabs. New Settings action link on the Plugins screen for administrators.