fix(instanda): hygiene pass + v1.1.0 (uninstall, notices, cron, resubmit, theme)
- F-15: uninstall now removes ALL espinstanda_* options and transients (incl. the encrypted password and its self-provisioned key). - F-16: register the "Gravity Forms required" admin notice unconditionally so it is reachable when GF is inactive (gform_loaded never fires then). - F-22: self-heal the daily retention cron on admin_init (matches the schema self-heal). - F-19: re-validate the stored payload via Field_Mapper::validate_payload() before a resubmit (DB-tamper trust boundary). - F-20: increment the retry count on resubmit and dispatch the previously-dead espinstanda_resubmit_success notification event. - F-23: emit the theme's Form-5 date-range JS only on pages that embed a Gravity Form and disconnect the MutationObserver (was observing the DOM subtree forever). - F-24: bump plugin to 1.1.0; add readme.txt changelog documenting the audit fixes and the required ops actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -159,14 +159,24 @@ final class Resubmit_Handler {
|
||||
$store->append_event($tx_id, 'Resubmit aborted - stored payload unreadable.', 'error');
|
||||
return;
|
||||
}
|
||||
// Trust boundary: the stored body is untrusted input on the way back out to the
|
||||
// insurer - re-validate it before re-sending (guards against DB tampering).
|
||||
$payload_errors = (new Field_Mapper())->validate_payload($body);
|
||||
if ($payload_errors) {
|
||||
$store->append_event($tx_id, 'Resubmit aborted - stored payload failed re-validation: ' . implode(', ', $payload_errors), 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
$store->increment_retry($tx_id); // this attempt is a retry - keep the count truthful
|
||||
|
||||
$result = (new Api_Client())->start_quote($body, $tx->dedupe_key);
|
||||
if ($result->ok && $result->quote_ref !== null) {
|
||||
if ($result->ok && $result->quote_ref !== null && $result->quote_ref !== '') {
|
||||
$store->mark_success($tx_id, $result->quote_ref, $result->url_single_use, $result->http_status);
|
||||
Failure_Surface::bump();
|
||||
|
||||
if ($tx->entry_id) {
|
||||
Entry_Integration::record($tx->entry_id, $result->quote_ref, (string) $result->url_single_use, 'delivered', $tx->environment);
|
||||
self::notify_resubmit_success((int) $tx->entry_id);
|
||||
} else {
|
||||
// Stranded lead (no entry) - mint a fresh link and email the customer (option B).
|
||||
$fresh = (string) $result->url_single_use;
|
||||
@@ -182,4 +192,19 @@ final class Resubmit_Handler {
|
||||
Failure_Surface::bump();
|
||||
}
|
||||
}
|
||||
|
||||
/** Dispatch the registered espinstanda_resubmit_success notification event for an entry. */
|
||||
private static function notify_resubmit_success(int $entry_id): void {
|
||||
if (!class_exists('\GFAPI')) {
|
||||
return;
|
||||
}
|
||||
$entry = \GFAPI::get_entry($entry_id);
|
||||
if (is_wp_error($entry)) {
|
||||
return;
|
||||
}
|
||||
$form = \GFAPI::get_form((int) $entry['form_id']);
|
||||
if ($form) {
|
||||
\GFAPI::send_notifications($form, $entry, 'espinstanda_resubmit_success');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user