{"id":386346,"date":"2026-11-10T09:44:32","date_gmt":"2026-11-10T09:44:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/aicpub-publisher-connector\/"},"modified":"2026-11-10T09:44:11","modified_gmt":"2026-11-10T09:44:11","slug":"aicpub-publisher-connector","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/aicpub-publisher-connector\/","author":15211215,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.9","stable_tag":"0.1.9","tested":"7.1.4","requires":"7.0","requires_php":"8.3","requires_plugins":null,"header_name":"AICPub Publisher Connector","header_author":"","header_description":"Explicitly paired, site-scoped Publisher protocol v1 connector.","last_updated":"2026-11-10 09:44:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/iconium\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":157,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"0.1.9":{"tag":"0.1.9","author":"iconium","date":"2026-11-10 09:44:11","revision":3794027}},"upgrade_notice":{"0.1.9":"<p>Back up the database, content and keys before updating. If your private install uses the publisher-connector folder, ask your administrator to verify the migration first. See Updating an existing installation for details.<\/p>","0.1.8":"<p>Back up all connector database options and any existing managed key file. Update files consistently without deactivation\/deletion\/reactivation. Existing keys and operation tombstones are preserved; new installations use database key storage.<\/p>","0.1.7":"<p>Back up the database and content, including the managed key. Pause and drain dispatch, then update files consistently without deactivation\/deletion\/reactivation. Preserve installation identity and journal. Read Updating an existing installation before upgrading.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3794027,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3794027,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3794027,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3794027,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.9"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[8196,96456,7143],"plugin_category":[],"plugin_contributors":[291776],"plugin_business_model":[],"class_list":["post-386346","plugin","type-plugin","status-publish","hentry","plugin_tags-approval","plugin_tags-editorial-workflow","plugin_tags-publishing","plugin_contributors-iconium","plugin_committers-iconium"],"banners":{"banner":"https:\/\/ps.w.org\/aicpub-publisher-connector\/assets\/banner-772x250.png?rev=3794027","banner_2x":"https:\/\/ps.w.org\/aicpub-publisher-connector\/assets\/banner-1544x500.png?rev=3794027","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/aicpub-publisher-connector\/assets\/icon-128x128.png?rev=3794027","icon_2x":"https:\/\/ps.w.org\/aicpub-publisher-connector\/assets\/icon-256x256.png?rev=3794027","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>AICPub Publisher Connector connects one WordPress site to the AICPub publishing\nservice. A WordPress administrator chooses the publishing user, allowed authors\nand categories, and whether the connection may publish publicly.<\/p>\n\n<p>An authorized AICPub user can prepare a draft or request a publication using\nthe permissions granted to that site. Every content change requires its own\napproval. The connector reports the result back to AICPub so the user can\nverify what WordPress saved or published.<\/p>\n\n<p>An AICPub account with access to the service is required. See External service\nfor the data exchanged during setup and publishing.<\/p>\n\n<h3>Administrator-managed connection<\/h3>\n\n<p>Open Settings &gt; AICPub Publisher Connector. Paste the one-use code and the exact local\npolicy JSON. The policy lists revision,execution_user_id,allowed_author_ids,\nallowed_category_ids,capabilities and html_profile=publisher-post-html-v1. Choose\nexisting users\/categories; arrays must be sorted and unique. site.read and\noperation.read are mandatory; draft.create,draft.update,media.upload,\npublished.update,publication.publish are\nseparate opt-in grants. The administrator then confirms the returned tenant,\nexact site and grants. Pending consent does not enable content operations.\nEvery content effect additionally needs its own current signed approval attestation.<\/p>\n\n<h3>External service<\/h3>\n\n<p>This connector integrates with AICPub (https:\/\/aicpub.com\/). An admitted AICPub\naccount is required for its account-first setup. The default setup service is\nhttps:\/\/app.aicpub.com\/; an operator may configure a separate test deployment.\nActivation alone does not connect an account or start a content transfer.<\/p>\n\n<p>When a WordPress administrator starts setup, the connector sends the site's name,\nHTTPS REST address, installation\/setup identifiers and a temporary setup proof to\nthe configured service. After account approval, the selected WordPress execution\nuser ID, allowed author\/category IDs or category scope, and granted capabilities\nare sent for consent. Setup status and pairing requests use those same service\nendpoints. The administrator must approve the account\/site and permissions before\nthe binding becomes active.<\/p>\n\n<p>For an active binding, authenticated service requests read the permitted site\nprofile and operation status and deliver only the content\/media and actions\ncovered by the granted policy and current signed approval. Responses can include\npermitted author\/category information, post\/media identifiers, URLs and operation\nverification results. Disconnect sends a revocation notice to the configured\nservice. Unknown write outcomes are inspected; they are not automatically retried.<\/p>\n\n<p>AICPub privacy information: https:\/\/aicpub.com\/privacy\/\nAICPub service terms: https:\/\/aicpub.com\/terms\/\nSupport: https:\/\/aicpub.com\/support\/<\/p>\n\n<h3>Updating an existing installation<\/h3>\n\n<p>The directory installs under <code>aicpub-publisher-connector<\/code>. Some earlier private\ninstallations use <code>publisher-connector<\/code>. If your site uses that older folder,\nask your site administrator to verify the migration and rollback path before\ninstalling the directory version. Changing the folder can stop WordPress from\nloading the active connector. Activating it again revokes the existing pairing.<\/p>\n\n<p>Keep the complete WordPress content-directory and database backup, including\nall connector options and any existing legacy key file.\nUpdate an active installation without deactivating, deleting or reactivating the plugin: those\nlifecycle actions revoke the connection and require pairing again. Pause and\ndrain service dispatch before a file-consistent replacement; retain the key and\noperation journal. A local upgrade from an observed 0.1.6 source snapshot passed;\nan actual connected production-account upgrade remains unverified. Once database-\nbacked ciphertext is stored, older releases cannot decrypt it. Use a release that\nsupports the current key format for rollback; never restore stale connection or\noperation records to make an older release appear usable.<\/p>\n\n<h3>Operations and lifecycle<\/h3>\n\n<p>POST outcomes are never automatically retried. Executing\/unknown operation rows\nremain nonexecutable; authenticated GET readback does not repair\/delete content.\nDisconnect revokes locally first; its service notice is attempted once. Reactivation\nrequires pairing. Deactivation\/uninstall preserve posts,media,installation identity\nand operation tombstones while removing active secret material. There is no automatic\ncontent cleanup or tombstone purge. Controlled restore\/clone requires revoking the\nservice epoch before copying\/restoring; undetected same-origin database rollback\ncannot be detected reliably by this plugin.<\/p>\n\n<p>Durable fixed-window quotas: authenticated tenant\/site requests 120\/minute; code\nexchange attempts 10\/10minutes per installation+admin and 30\/10minutes per direct IP.\nQuota and nonce state does not rely on WordPress transients\/object cache. A 429 is\nnot permission to retry a business POST; reconcile with authenticated reads.<\/p>\n\n<p>Native Sodium clears temporary secret buffers. On WordPress sodium_compat,\nreferences are released without calling its unsupported memory-wipe function;\nsecure physical memory erasure is not claimed for the PHP polyfill.<\/p>\n\n<h3>Explicit result control after connection renewal<\/h3>\n\n<p>The authenticated operation control route accepts the exact original expired\nrequest and original key ID through a current same-tenant\/site\/installation\nbinding. The old key ID is audit metadata; old secret material is not used.\nExisting executing\/completed\/cancelled rows must match the full original request\naudit fingerprint. Control holds the original execution lock and never writes,\ndeletes or republishes content. A missing correlated receipt can be repaired\ntransactionally, or an absent request can receive a nonexecutable tombstone.\nChanged content, missing correlation or another installation remain unresolved.\nA normal operation request cannot use this route as an execution fallback.<\/p>\n\n<h3>License<\/h3>\n\n<p>The distributed Publisher Connector package is licensed under GPL-2.0-or-later.\nSee LICENSE for the complete GNU General Public License version 2. This license\napplies to the distributed connector files, including its schema copy; it does\nnot relicense the separate publisher engine, operator workspaces or AICPub service.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In WordPress, open Plugins &gt; Add New Plugin and search for AICPub Publisher\nConnector.<\/li>\n<li>Select Install Now, then Activate.<\/li>\n<li>Open Settings &gt; AICPub Publisher Connector and select Connect to AICPub to begin\nconnecting your account and site.<\/li>\n<\/ol>\n\n<p>If you already have an active private installation, read Updating an existing\ninstallation before installing the directory version.<\/p>\n\n<p>The connector requires single-site WordPress 7.0 or later, PHP 8.3 or later,\nSodium (native or the WordPress polyfill), mbstring and iconv. Setup and content\noperations require the standard WordPress wpdb class with a native mysqli\nconnection. Database drop-ins that replace or extend wpdb are unsupported and\nfail closed. Ask the site administrator to verify these requirements first.<\/p>\n\n<p>The HTTPS REST address is detected automatically from WordPress. Open Settings &gt;\nAICPub Publisher Connector and choose Connect to AICPub. Sign in with an admitted AICPub\naccount and confirm the account and site. Return to WordPress to choose the\npublishing user, available authors, category access and optional public publishing.\nReview those permissions in AICPub, then return to WordPress to finish consent.\nYour WordPress password stays with WordPress. An account connection does not\napprove an article or enable public publishing automatically.<\/p>\n\n<p>The publishing user must not be an administrator or have site, plugin, theme or\nuser administration permissions. Use a content-only account, such as an Author\nfor its own articles or an Editor for the selected authors. Each remote write\nrechecks this boundary and runs with only post\/media capabilities; unfiltered\nHTML and other account capabilities are unavailable during execution. The local\nadministrator still controls pairing and consent in the WordPress dashboard.\nThe connector provides no remote plugin\/theme installation, user administration,\nsite configuration, code editing or login endpoint.<\/p>\n\n<p>If an existing publishing user has administrative permissions, content writes\npause and the dashboard explains how to reconnect with a suitable user. Receipt\nreads and existing content\/journals remain available. Resolve uncertain prior\noperations in AICPub before reconnecting; never resend them as new articles.<\/p>\n\n<p>For administrator-managed pairing, save the exact HTTPS service address supplied\nby your administrator before exchanging a code. The address is never taken from\na pairing code or HTTP headers. Service-address changes require a disconnected\/revoked\nbinding. API\/service constants remain optional operator overrides; an API override\nmust match the site's actual REST address. No wp-config.php edit is required.\nThe binding is revoked on a detected site-base or installation change.\nMultisite is unsupported. InnoDB and reliable primary-key AUTO_INCREMENT columns\nare required; the plugin does not repair a damaged WordPress database.<\/p>\n\n<p>Activation does not require editing wp-config.php. Fresh installations create a\nrandom 32-byte encryption key in a non-autoloaded WordPress database option.\nThe plugin never creates executable key files or writes to its plugin directory,\nWordPress core or content directories. Independent random database keys protect\npeer rate-limit identifiers and local recovery-plan signatures; authentication\ncookies, WordPress keys and salts are not used for these purposes.<\/p>\n\n<p>Secrets use authenticated sodium encryption. PUBLISHER_CONNECTOR_ENCRYPTION_KEY\nremains an optional advanced override: base64 encoding of exactly 32 bytes, held\noutside the database. Existing legacy encrypted bindings retain their original\nconfigured-key or WordPress-salt decryption path. Existing managed-v1 bindings\ncontinue to read their original private WP_CONTENT_DIR\/publisher-connector\/managed-key.php\nfile with descriptor\/permission checks. It is never created, rewritten, executed,\nrelocated or deleted by this version. No automatic key rotation is performed.\nMissing\/corrupt existing key material fails closed and is never silently replaced.<\/p>\n\n<p>Back up the database and complete WordPress content directory together. Preserve\nall publisher_connector_* options and any legacy managed-key.php across upgrades\nand moves. Existing file-backed bindings still require their original key file;\nnew database-backed bindings require their original key option. Treat database\nbackups as confidential: database-backed encryption does not protect against a\ncomplete database disclosure because the key and ciphertext share that storage.\nThe optional separately stored encryption override can provide that separation.\nRestore original keys; never replace them to bypass an unresolved connection.\nSite clones\/moves still require the controlled revoke\/re-pair procedure below.<\/p>\n\n<!--section=changelog-->\n<h4>0.1.9<\/h4>\n\n<ul>\n<li>Require a non-administrator publishing user and limit remote execution to content capabilities.<\/li>\n<li>Recheck permissions after pairing and pause writes if the publishing user gains administrative permissions.<\/li>\n<li>Replace direct mysqli calls with core wpdb operations while retaining session, transaction and no-replay checks.<\/li>\n<li>Preserve existing installation identity, keys, bindings and operation records during file updates.<\/li>\n<li>Add a separate permission for updating published posts and keep signed Connector REST responses out of the LiteSpeed cache.<\/li>\n<\/ul>\n\n<h4>0.1.8<\/h4>\n\n<ul>\n<li>Store fresh encryption keys in non-autoloaded options; never create PHP key files.<\/li>\n<li>Preserve read-only compatibility with existing file-backed and legacy ciphertext.<\/li>\n<li>Separate rate-limit and recovery keys from WordPress authentication material.<\/li>\n<li>Prepare core table identifiers and reject malformed\/non-POST privileged forms.<\/li>\n<li>Preserve pinned database-session and no-replay safeguards.<\/li>\n<\/ul>\n\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Directory candidate: account-first setup and explicit service disclosure.<\/li>\n<li>Keep existing installation identity, private key and operation tombstones.<\/li>\n<li>Reject replaced key files and unsafe storage without mutating permissions.<\/li>\n<li>Verify form nonces before reading connection actions.<\/li>\n<li>Use prepared journal identifiers and document necessary native security operations.<\/li>\n<\/ul>","raw_excerpt":"Connect WordPress to AICPub to save drafts or publish articles after you review and approve them.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/386346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=386346"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/iconium"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=386346"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=386346"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=386346"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=386346"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=386346"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=386346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}