$data ); } $data = self::redact( $data ); $line = '[' . gmdate( 'Y-m-d\TH:i:s\Z' ) . '] [AIT AIAA] ' . sanitize_text_field( $event ) . ' | ' . wp_json_encode( $data ); $written = self::write_to_upload_log( $line . "\n" ); if ( ! $written ) { // Fallback to PHP error log if uploads isn't writable. error_log( rtrim( $line ) ); } } private static function write_to_upload_log( $text ) { if ( ! function_exists( 'wp_upload_dir' ) ) { return false; } $uploads = wp_upload_dir(); if ( empty( $uploads['basedir'] ) ) { return false; } $dir = trailingslashit( $uploads['basedir'] ) . 'ait-aiaa-logs'; if ( ! wp_mkdir_p( $dir ) ) { return false; } $file = trailingslashit( $dir ) . 'ait-aiaa.log'; // Append with lock to avoid interleaving. $result = @file_put_contents( $file, $text, FILE_APPEND | LOCK_EX ); return ( false !== $result ); } private static function redact( $data ) { $blocked_keys = array( 'openai_api_key', 'api_key', 'authorization', 'Authorization', 'page_source', 'outerHTML', 'html', 'document', 'raw_html', ); $walker = function( $value ) use ( &$walker, $blocked_keys ) { if ( is_array( $value ) ) { $out = array(); foreach ( $value as $k => $v ) { if ( is_string( $k ) && in_array( $k, $blocked_keys, true ) ) { $out[ $k ] = '[REDACTED]'; continue; } if ( is_string( $v ) && strlen( $v ) > 800 ) { $v = substr( $v, 0, 800 ) . '…'; } $out[ $k ] = $walker( $v ); } return $out; } if ( is_string( $value ) && strlen( $value ) > 800 ) { return substr( $value, 0, 800 ) . '…'; } return $value; }; return $walker( $data ); } }