=== maca Sec ===
Contributors: maca59
Tags: security, firewall, login, two-factor, malware scanner
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.3.16
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Complete WordPress security — firewall, login protection, 2FA, hardening, scanning, and logging. Free, open source, no premium locks.

== Description ==

**maca Sec** is a security plugin that brings firewall (WAF), login protection, two-factor authentication (2FA), hardening, file scanning, vulnerability checks, and security logging into one WordPress admin experience.

All features are included from the start — no premium tiers and no locked modules.

= Features =

* **Firewall (WAF)** — SQL injection, XSS, path traversal, dangerous uploads, spoofed Referer, User-Agent blocking, country blocks, IP allowlist/blocklist
* **Rate limiting** — Per-IP limits for the site, wp-login, wp-admin, XML-RPC, and REST API; optional smart weighting (burst, URL, cookies, referer)
* **AI bot guard** — Per-bot allow/block/limit for GPTBot, ClaudeBot, Bytespider, PerplexityBot, Amazonbot
* **Attack shield** — Temporary maintenance mode under extreme traffic
* **Login security** — Brute-force protection, optional captcha, password rules, login alerts
* **Two-factor authentication (2FA)** — TOTP with recovery codes
* **Session management** — Idle logout and active session overview
* **Hardening** — Common WordPress hardening options and HTTP security headers
* **Security scanner** — Configuration checks and suspicious code patterns
* **File monitor** — Detects changes to critical files
* **CVE scanning** — Per-plugin risk board (WPScan), CVE alerts, update recommendations
* **Supply chain guard** — Plugin author changes, WordPress.org checksum verification, admin asset domain monitoring
* **Behavior detection** — Heuristic REST/POST analysis with risk scores 0–100
* **Honeypot traps** — Fake login, XML-RPC, and REST paths; logs IP, country, ASN; auto-block
* **Security log** — Filterable event log with IP actions
* **maca Hub (optional)** — Remote status and allowlist sync when used with the maca Hub app

= Languages =

The plugin UI uses Swedish source strings on Swedish WordPress sites (`sv_*` locales). All other locales load the bundled English translation (`languages/maca-sec-en_US.mo`).

Bundled legal documents and the in-plugin guide are available in Swedish and English.

= Terms and privacy =

On first activation you are asked to accept the bundled **Terms of Use** and **Privacy Policy** before security protection is enabled. If those documents are updated in a later plugin version, you must accept again before protection resumes.

Full copies are included in the plugin (`docs/`) and may also be published on maca.se.

== Installation ==

1. Upload the `maca-sec` folder to `/wp-content/plugins/`, or install the zip via **Plugins → Add New → Upload Plugin**.
2. Activate **maca Sec** through the **Plugins** menu.
3. Read and accept **Terms & Policy** when prompted.
4. Open **maca Sec → Guide** for a recommended setup checklist.

== Frequently Asked Questions ==

= Is every feature free? =

Yes. There are no premium modules or paid upgrades inside the plugin.

= Does the plugin phone home? =

The plugin sends limited, anonymous telemetry to maca Development (see **External services**). No passwords, security log content, visitor IP addresses, or personal user data are included in that telemetry.

You can disable telemetry completely with this filter in a small custom plugin or your theme's `functions.php`:

`add_filter( 'maca_sec_api_send_telemetry', '__return_false' );`

= Do I need maca Hub? =

No. maca Hub is optional and only used if you connect the site to the maca Hub app for remote management or Hub-synced IP allowlists.

= Does this replace another security plugin? =

maca Sec can run many protections on its own. Running multiple full security plugins at once may cause conflicts (duplicate firewall rules, duplicate login limits, etc.). Test carefully if you keep another security plugin active.

= What data is stored on my site? =

Security logs, blocked/allowed IPs, scan results, file monitor hashes, plugin settings, and optional 2FA secrets in user meta. Data is removed when you uninstall the plugin via `uninstall.php`.

== External services ==

This plugin connects to external services only when the related feature is used or when telemetry is enabled.

= maca Development telemetry (api.maca.se) =

**What:** Limited lifecycle telemetry  
**When:** Plugin activated, deactivated, uninstalled; security protection enabled/disabled; optional deactivation feedback reason  
**Data sent:** Plugin slug and version, normalized public site URL, WordPress version, PHP version, site locale, event name, and (for deactivation feedback) an optional reason code/label you choose in the modal  
**Not sent:** Passwords, security log contents, visitor IPs, or personal user data  
**Endpoint:** `https://api.maca.se/v1/sec/events.php`  
**Terms / privacy:** See bundled `docs/integritetspolicy.en.md` (Privacy Policy)  
**Disable:** `add_filter( 'maca_sec_api_send_telemetry', '__return_false' );`

= maca Hub API (api.maca.se) — optional =

**What:** Hub allowlist sync and account-wide trusted IP management  
**When:** Only if Hub allowlist sync is enabled and the site is linked to maca Hub  
**Data sent:** Site key, trusted IP entries, and related sync metadata  
**Endpoint:** `https://api.maca.se/` (Hub API paths)  
**Disable:** Turn off Hub allowlist sync under **maca Sec → maca Hub app**

= WPScan API — optional =

**What:** CVE / vulnerability data for plugins and themes  
**When:** Only if you enter a WPScan API token under **maca Sec → Scanner**  
**Data sent:** Plugin/theme identifiers needed to look up vulnerabilities (per WPScan API)  
**Endpoint:** WPScan API (`https://wpscan.com/api/v3/`)  
**Disable:** Remove the WPScan API token in plugin settings

= Google reCAPTCHA — optional =

**What:** Login captcha verification  
**When:** Only if reCAPTCHA is enabled and keys are configured  
**Data sent:** Captcha token to Google for verification  
**Endpoint:** Google reCAPTCHA  
**Disable:** Disable captcha or switch provider in **maca Sec → Login**

= Cloudflare Turnstile — optional =

**What:** Login captcha verification  
**When:** Only if Turnstile is enabled and keys are configured  
**Data sent:** Turnstile token to Cloudflare for verification  
**Endpoint:** Cloudflare Turnstile  
**Disable:** Disable captcha or switch provider in **maca Sec → Login**

= ip-api.com — optional =

**What:** Country code lookup for geo blocking  
**When:** Country blocking is enabled and the country code is not provided by the server/CDN  
**Data sent:** Visitor IP address for lookup (cached locally for 7 days)  
**Endpoint:** `http://ip-api.com/json/{ip}?fields=countryCode`  
**Disable:** Disable country blocking under **maca Sec → Firewall**

= WordPress.org plugin checksums — optional =

**What:** Official file checksum verification for plugins from the WordPress.org directory  
**When:** Only if supply chain guard and checksum verification are enabled under **maca Sec → Supply chain & AI**  
**Data sent:** Plugin slug and version to fetch checksum manifests  
**Endpoint:** `https://api.wordpress.org/plugins/checksums/1.0/`  
**Disable:** Disable supply chain guard or checksum verification in plugin settings

= maca Hub REST on your site — optional =

**What:** Allows the maca Hub app (with a valid site key) to read status, toggle protection, create one-time admin logins, and sync trusted IPs  
**When:** Only when maca Hub remote actions are allowed in settings  
**Disable:** Disable remote Hub actions under **maca Sec → maca Hub app**

== Screenshots ==

1. Dashboard with security score and recent events
2. Firewall settings with WAF, rate limiting, and IP lists
3. Security scanner results
4. Security log with filters

== Changelog ==

= 1.3.16 =
* New: File monitoring — line diff, SHA-256 before/after, and best-effort writer for `.htaccess` and `wp-config.php` (redacted snapshots; shown in Scanner/Logs and sent to Hub).
* Fix: Hub `file_change_events` status label character encoding.

= 1.3.14 =
* Fix: Hub Accept/Fix REST routes are registered by maca Sec when Hub Connector on the site is too old (avoids 404 "No route was found").

= 1.3.13 =
* New: Filesystem guard content analysis for new PHP files (size, SHA-256, Silence is golden, risk level, known maca signer).

= 1.3.8 =
* New: Scanner warns when the active theme exposes Version in style.css, with hardening tips.

= 1.3.7 =
* New: Hardening — strip ?ver= from CSS/JS, block readme/license in themes/plugins, block root readme.html/license.txt, block wp-includes/version.php.
* New: Strict smart rate limiting with lower burst/URL thresholds.
* New: Maximum protection profile enables all new fingerprint settings.

= 1.3.6 =
* New: Hardening option to disable WP-Cron on page visits, with an in-admin info box and generic server-cron setup (HTTP or WP-CLI).
* New: Maximum protection profile enables WP-Cron hardening.

= 1.2.9 =
* New: Kollektiv hotintelligens via maca Hub — anonym rapportering och nätverksblockeringar.
* New: Filsystemsvakt 2.0 — djup PHP-skanning i uploads/teman (eval, Base64, webshells).
* New: Säkerhetsbetyg 0–100 med checklista på instrumentpanelen.
* New: Live Attack Map-data i Hub-payload (attacker/min, länder, typer, blockerade IP).

= 1.2.8 =
* New: AI-bot-skydd — per-bot policy (Tillåt / Blockera / Begränsa) för GPTBot, ClaudeBot, Bytespider, PerplexityBot och Amazonbot.
* New: Smart hastighetsbegränsning — beteendeviktning (burst, URL, metod, cookies, referer) för färre falska positiva.
* New: maca Hub-rapportering för AI-botar och smart rate limiting.

= 1.2.7 =
* Changed: Admin-menyn omorganiserad — Instrumentpanel, Skanner, Inställningar, Loggar, Guide och Villkor & policy i sidomenyn.
* Changed: Brandvägg, Inloggning, Hårdning, Supply chain & AI och maca Hub-app finns nu som flikar under Inställningar.
* Changed: Gamla meny-URL:er omdirigeras till rätt inställningsflik.

= 1.2.6 =
* Fix: Säkerhetsloggen kraschade med «Call to undefined method Maca_Sec_Logger::get_log_context_lines()».

= 1.2.5 =
* Fix: Undviker fatal error «Cannot redeclare class Maca_Plugin_Updater» när maca Hub Connector och maca Sec är aktiva samtidigt.

= 1.2.4 =
* i18n: 86 nya engelska översättningar (supply chain, beteendeanalys, CVE-tabell, honeypot). Cursor-regel och release-rutin för språkfiler.

= 1.2.3 =
* Docs: CHANGELOG.md, versionsrutin i README och Cursor-regel; användarguide (SV/EN) för CVE-tabell och honeypot-fällor.

= 1.2.2 =
* New: CVE-plugin-tabell under Skanner (Hög risk / Uppdatera snarast / Ingen känd sårbarhet) via WPScan.
* New: Kritisk logg och e-post vid nya hög-risk-CVE.
* New: Honeypot-fällor — falska login-, XML-RPC- och REST-sökvägar med loggning (IP, land, ASN, User-Agent) och direkt IP-spärr.
* New: maca Hub-rapportering för CVE-tabell och honeypot-träffar.

= 1.2.1 =
* Docs: supply chain & behavior detection in user guide (SV/EN), readme, and maca Hub reporting.

= 1.2.0 =
* New: Supply chain guard — plugin author changes, WordPress.org checksum verification, WP.org removal alerts, admin external JS/domain monitoring.
* New: Behavior detection — heuristic REST/POST analysis with configurable risk scores (0–100) and optional auto-block.
* New: Admin page **Supply chain & AI** with settings, alerts, and recent behavior events.

= 1.1.39 =
* Fix: fatalt fel från v1.1.31 — återställde saknad funktion maca_sec_api_record_send_failure() i maca-api.php (triggades vid telemetri på Loopia).

= 1.1.38 =
* Fix: Loopia — uppdateringsping och updater init skjuts till init/shutdown (undviker fatal vid uppgradering från äldre versioner).

= 1.1.37 =
* Refaktor: delad uppdateringsmotor (`Maca_Plugin_Updater`) — samma api.maca.se-flöde som övriga maca-plugins.

= 1.1.36 =
* Nyhet: automatisk uppdateringskontroll via api.maca.se — ny version visas under Tillägg och Instrumentpanel → Uppdateringar med ett-klicks-uppdatering.

= 1.1.35 =
* Fix: Loopia — telemetri via samma ingest som maca Restu (`/v1/restu/events.php`) med fallback till `/v1/sec/events.php`; utan explicit sslverify. Väntande ping skickas när maca Hub Connector pollar sajten.

= 1.1.34 =
* Fix: Loopia — aktivering/avaktivering skickar blockerande wp_remote_post direkt (inte bara kö/cron). Livscykel-events ignorerar 429-backoff. Avaktiveringsmodalen markerar inte längre som skickad utan lyckad leverans.

= 1.1.33 =
* Fix: fatal vid uppdatering — spawn_cron() körs inte längre under plugins_loaded (WP_CRON_LOCK_TIMEOUT).

= 1.1.32 =
* Borttagen gul admin-notis om väntande Hub-registrering och HTTP 429 (telemetri sker tyst i bakgrunden).

= 1.1.31 =
* Fix: telemetrileverans som maca Restu free — admin_init + shutdown på varje wp-admin-sida, endpoint events.php, ingen cron-only gate (Loopia).

= 1.1.30 =
* Fix: HTTP 429 från api.maca.se — max ett telemetriförsök per sidladdning, 30 min backoff vid rate limit, inga dubbla försök via admin_init + shutdown + spawn_cron.

= 1.1.29 =
* Fix: aktiveringsregistrering till maca Hub även via Hub Connector (REST) och på Loopia — telemetri skickas vid shutdown i samma request, inte bara via WP-Cron. Bättre admin-retry, felmeddelande i wp-admin om leverans misslyckas.

= 1.1.28 =
* Fix: aktivering/avaktivering registreras nu i maca Hub även på Loopia/Simply — väntande telemetri skickas direkt vid nästa säkra wp-admin-besök (inte bara via WP-Cron som sällan körs). Avaktivering skickas direkt i deactivate-hooken.

= 1.1.27 =
* Fix: skydd aktiveras nu alltid efter godkända villkor (även omgodkännande eller när växeln redan stod på). Hub-växeln sparar via shutdown så options.php inte hänger (spinner). Uppgradering från ≤1.0.93 sätter skydd på igen automatiskt.

= 1.1.26 =
* Fix: regression från v1.0.94 (villkor & policy) — befintliga installationer (≤1.0.93 eller skydd på utan godkännande) migreras automatiskt så skyddet inte pausas i onödan. Enhetlig default för skyddsväxeln. Vid godkännande eller aktivering av skydd rensas legacy-data och filbaslinje byggs via cron (inte i samma request). Omaktivering behåller skyddsstatus om villkor redan är godkända.

= 1.1.25 =
* Fix: ingen HTTP till api.maca.se under plugin-aktivering, avaktivering eller skyddsväxel (allt via kö + cron). Avaktiveringsmodalen blockerar inte längre. MU-plugin anropar inte wp_cache_flush() på varje sidladdning.

= 1.1.24 =
* Fix: spinner/hängande sparning när skyddet aktiveras på Loopia — ingen full wp_cache_flush() längre vid skyddsväxeln (kan låsa requesten). Telemetri körs inte under options.php-sparning.

= 1.1.23 =
* Fix: 500/minnesfel när säkerhetsskyddet slås på — filövervakaren laddar inte längre gamla jätte-blobbar eller bygger filbaslinje synkront i webbrequesten. Rensar legacy-data innan skydd aktiveras.

= 1.1.22 =
* Fix: rensar legacy-blobbar (filbaslinje m.m.) direkt vid plugin-aktivering och sänker maxstorlek till 64 KB innan data laddas i minnet. Förhindrar återfall efter backup/omaktivering när gamla autoload-rader finns kvar i databasen.

= 1.1.21 =
* Fix: registrering i maca Hub när WP-Cron inte körs (t.ex. Loopia) — väntande telemetri levereras nu direkt från wp-admin om cron-eventet uteblir.

= 1.1.20 =
* Fix: tömmer object cache (alloptions) automatiskt vid plugin-uppdatering. Ny nödfil emergency/flush.php för sajter utan cache-knapp i hostingpanelen. Skydd mot överstora JSON-filer i maca-sec-data/.

= 1.1.19 =
* Fix: sista kvarvarande get_option() på filbaslinjen (get_pending_changes) som kunde ladda överstora legacy-rader när skyddet aktiverades. Rensar nu alla maca_sec_*-rader över 512 KB och tömmer options-cache.

= 1.1.18 =
* Fix: legacy-rensning läser inte längre in överstora option_value-rader i minnet (1.1.17 kunde fortfarande ge 500). Inkluderar nöd-MU-plugin som rensar innan WordPress laddar options.

= 1.1.17 =
* Fix: stora maca Sec-datablobbar (filbaslinje, skanningsresultat m.m.) lagras nu i wp-content/maca-sec-data/ istället för wp_options. Rensar automatiskt överstora legacy-rader som orsakade minnesfel (500) på vissa sajter, t.ex. vid aktivering av skyddet eller på wp-admin/options.php.

= 1.1.16 =
* Fix: telemetrileverans sker nu i ett eget WP-Cron-event istället för i webbrequesten. Ett långsamt api.maca.se kan därför aldrig hänga en admin-request eller ge 500 (t.ex. när skyddet slås på).

= 1.1.15 =
* Fix: registrerings-pingen flyttad till shutdown så att ett långsamt api.maca.se aldrig kan fördröja eller ge 500 när skyddet slås på. Skickas endast på riktiga admin-sidladdningar (ej AJAX/REST/cron).

= 1.1.14 =
* Registrerings-ping vid installation och uppdatering: även befintliga användare som bara uppdaterar pluginet registreras nu i maca Hub. Pingen är idempotent och släcks så fort api.maca.se bekräftat, och är throttlad till som mest var 15:e minut.

= 1.1.13 =
* Aktiveringstelemetri sätter nu en pending-flagga och skickas om på nästa admin-request om leveransen tappas under aktiveringen (löser att sajter på t.ex. Loopia inte dök upp i maca Hub).

= 1.1.11 =
* Aktiverings- och avaktiveringstelemetri skickas nu blockerande så att den når api.maca.se även på hostar (t.ex. Loopia) där icke-blockerande anrop tappas.

= 1.1.10 =
* Plugin Check fixes: i18n translators comments, escaping, ordered placeholders, telemetry filter docs.
* `Tested up to` set to WordPress 7.0.

= 1.1.9 =
* Add WordPress.org `readme.txt` and GPL `LICENSE` file.
* Document external services and telemetry; add `maca_sec_api_send_telemetry` filter to disable telemetry.
* Set Author URI to GitHub; remove Plugin URI from plugin header.
* Exclude developer build files from distribution zip.

= 1.1.8 =
* Maintenance and translation updates.

= 1.1.0 =
* English translation bundle (`maca-sec-en_US.mo`) for non-Swedish locales.
* English variants of guide, terms, and privacy policy.

== Upgrade Notice ==

= 1.2.2 =
CVE-status per plugin och honeypot-fällor med ASN-loggning. Se Skanner respektive Inloggning.

= 1.2.0 =
New supply chain protection and behavior-based attack detection with risk scores. See **maca Sec → Supply chain & AI**.

= 1.1.36 =
Automatiska uppdateringar via api.maca.se — ny version visas i WordPress uppdateringsflöde.

= 1.1.35 =
Loopia: använder Restu-ingest + Hub Connector-poll som backup för Plugin-statistik.

= 1.1.34 =
Kritiskt för Loopia: Hub-registrering vid aktivering och avaktivering.

= 1.1.33 =
Kritiskt: rättar fatal error vid plugin-uppdatering på maca.se och liknande sajter.

= 1.1.32 =
Tar bort gul varning om Hub-registrering/HTTP 429 i wp-admin.

= 1.1.31 =
Rättar Hub-registrering på Loopia — samma leveransmönster som maca Restu free.

= 1.1.30 =
Rättar HTTP 429 vid registrering i maca Hub (för många API-anrop per sidladdning).

= 1.1.29 =
Rättar att aktivering inte registreras i maca Hub på Loopia och vid fjärraktivering via Connector.

= 1.1.28 =
Rättar att plugin-aktivering inte registreras i maca Hub på Loopia/Simply.

= 1.1.27 =
Rättar att skydd inte aktiverades efter godkända villkor och spinner vid sparning på maca Hub-app-sidan.

= 1.1.26 =
Rättar villkors-/skyddsregressionen från v1.0.94 för befintliga sajter; säkrare aktivering av skydd.

= 1.1.18 =
Rättar kvarstående minnesfel vid legacy-rensning; nöd-MU-plugin ingår.

= 1.1.17 =
Rättar minnesfel/500 på sajter med stora maca Sec-datablobbar i wp_options.

= 1.1.16 =
Rättar 500-fel när skyddet slås på; telemetri levereras via cron utanför webbrequesten.

= 1.1.15 =
Rättar 500-fel när skyddet slås på; registrerings-pingen kan aldrig blockera admin-requesten.

= 1.1.14 =
Befintliga användare registreras nu i maca Hub vid uppdatering, inte bara vid nyaktivering.

= 1.1.13 =
Aktiveringstelemetri levereras nu tillförlitligt även när shutdown-leveransen tappas på vissa hostar.

= 1.1.11 =
Tillförlitlig leverans av aktiverings-/avaktiveringstelemetri på fler hostar.

= 1.1.10 =
Plugin Check compatibility and WordPress 7.0 tested header.

= 1.1.9 =
Prepares the plugin for WordPress.org submission (readme, license, telemetry documentation).
