admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('550w-media-request'), 'labels' => array( 'states' => array('processing' => fiftyw_media_label('处理中', __('Processing', '550w-media')), 'success' => fiftyw_media_label('已完成', __('Completed', '550w-media')), 'failed' => fiftyw_media_label('失败', __('Failed', '550w-media')), 'expired' => fiftyw_media_label('已过期', __('Expired', '550w-media')), 'accepted' => fiftyw_media_label('已受理', __('Accepted', '550w-media')), 'rejected' => fiftyw_media_label('已拒绝', __('Rejected', '550w-media'))), 'kinds' => array('image' => fiftyw_media_label('图片', __('Image', '550w-media')), 'video' => fiftyw_media_label('视频', __('Video', '550w-media'))), 'busy' => fiftyw_media_label('正在提交,请勿重复操作…', __('Submitting — do not repeat this operation…', '550w-media')), 'unknown' => fiftyw_media_label('结果未知:请先查询任务,不要重新提交收费操作。', __('Outcome unknown. Check the task before resubmitting a charged operation.', '550w-media')), 'newTask' => fiftyw_media_label('已收到回执。若任务处理中,请稍后点击查询。', __('Receipt received. If processing, check the task again later.', '550w-media')), 'library' => fiftyw_media_label('选择图片或视频', __('Choose an image or video', '550w-media')), 'query' => fiftyw_media_label('查询任务', __('Check task', '550w-media')), 'openImage' => fiftyw_media_label('打开图片 / 下载', __('Open image / download', '550w-media')), 'openVideo' => fiftyw_media_label('打开解析视频 / 下载', __('Open resolved video / download', '550w-media')), 'processedImage' => fiftyw_media_label('处理后的图片', __('Processed image', '550w-media')), ), )); }); function fiftyw_media_guard() { if (!current_user_can('manage_options')) { wp_die(esc_html__('You are not allowed to manage this account.', '550w-media'), '', array('response' => 403)); } } foreach (array('connect', 'disconnect', 'callback') as $fiftyw_media_verb) { add_action('admin_post_550w_oauth_' . $fiftyw_media_verb, function() use ($fiftyw_media_verb) { $verb = $fiftyw_media_verb; fiftyw_media_guard(); nocache_headers(); header('Referrer-Policy: no-referrer'); $status = 'connected'; try { if ($verb !== 'callback') { check_admin_referer('550w-oauth'); } if ($verb === 'connect') { $url = Fiftyw_Media_OAuth::start(); // Fixed authorization destination; wp_safe_redirect intentionally rejects external OAuth hosts. add_filter('allowed_redirect_hosts', function($hosts) { $hosts[] = 'www.550wai.cn'; return $hosts; }); wp_safe_redirect($url, 302, '550W OAuth'); exit; } if ($verb === 'disconnect') { Fiftyw_Media_OAuth::disconnect(); $status = 'disconnected'; } if ($verb === 'callback') { $state = isset($_GET['state']) && is_string($_GET['state']) ? sanitize_text_field(wp_unslash($_GET['state'])) : ''; $code = isset($_GET['code']) && is_string($_GET['code']) ? sanitize_text_field(wp_unslash($_GET['code'])) : ''; Fiftyw_Media_OAuth::callback($state, $code); } } catch (Throwable $error) { $status = 'connection_failed'; } wp_safe_redirect(add_query_arg('connection', $status, admin_url('tools.php?page=550w-media'))); exit; }); } function fiftyw_media_public_result($value, $action) { $data = is_array($value['data'] ?? null) ? $value['data'] : $value; if (is_array($data['task'] ?? null)) { $data = $data['task']; } $code = $value['code']; $status = isset($data['status']) && is_scalar($data['status']) ? (string) $data['status'] : ($code === 200 ? 'accepted' : 'rejected'); $task = $data['taskId'] ?? $value['taskId'] ?? ''; if (!is_string($task) && !is_int($task)) { $task = ''; } $task = substr((string) $task, 0, 128); $url = ''; $candidate = $action === 'share' ? ($data['video'] ?? '') : ($status === 'success' ? ($data['resultUrl'] ?? '') : ''); if (is_string($candidate) && $candidate) { try { $url = fiftyw_media_url($candidate); } catch (InvalidArgumentException $error) { $url = ''; } if (wp_parse_url($url, PHP_URL_SCHEME) !== 'https') { $url = ''; } } return array('code' => $code, 'status' => $status, 'taskId' => $task, 'resultUrl' => $url, 'kind' => str_starts_with($action, 'image') ? 'image' : 'video', 'message' => $code === 200 ? fiftyw_media_label('请求已返回,请查看状态与结果。', __('Request returned. Review the status and result.', '550w-media')) : fiftyw_media_label('服务未受理,请检查凭据、积分或素材条件。', __('Service rejected the request. Check credentials, credits and media requirements.', '550w-media'))); } add_action('wp_ajax_550w_media_request', function() { fiftyw_media_guard(); check_ajax_referer('550w-media-request', 'nonce'); $input = wp_unslash($_POST); foreach ($input as $value) { if (!is_string($value)) { wp_send_json_error(array('message' => fiftyw_media_label('无效请求。', __('Invalid request.', '550w-media'))), 400); } } $operation = $input['operationId'] ?? ''; $input['action'] = $input['mediaAction'] ?? ''; try { // Uploaded temporary paths must not be text-sanitized. fiftyw_media_source verifies // is_uploaded_file, error, extension, detected image MIME and size before reading. $value = fiftyw_media_execute($input, $_FILES['media'] ?? null); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $result = fiftyw_media_public_result($value, $input['action']); $history = get_user_meta(get_current_user_id(), fiftyw_media_history_key(), true); $history = is_array($history) ? $history : array(); $entry = array_merge($result, array('operationId' => $operation, 'authMode' => $input['authMode'], 'createdAt' => time())); if ($result['taskId']) { $history = array_values(array_filter($history, function($item) use ($result) { return ($item['taskId'] ?? '') !== $result['taskId']; })); } array_unshift($history, $entry); $history = array_slice(array_values(array_filter($history, function($item) { return ($item['createdAt'] ?? 0) > time() - 7 * DAY_IN_SECONDS; })), 0, 20); // Receipts are business state, never telemetry. No account credentials or source paths are stored here. update_user_meta(get_current_user_id(), fiftyw_media_history_key(), $history); wp_send_json_success($entry); } catch (InvalidArgumentException $error) { wp_send_json_error(array('message' => fiftyw_media_label('请检查素材、账户、积分确认及高级区域参数。', __('Check the media, account, credit consent and region parameters.', '550w-media')), 'outcome' => 'not_submitted'), 400); } catch (Throwable $error) { wp_send_json_error(array('message' => fiftyw_media_label('结果未确认。请先查询现有任务,避免重复收费提交。', __('Outcome not confirmed. Query existing tasks before resubmitting.', '550w-media')), 'outcome' => 'unknown'), 502); } }); add_action('wp_ajax_550w_media_clear_history', function() { fiftyw_media_guard(); check_ajax_referer('550w-media-request', 'nonce'); delete_user_meta(get_current_user_id(), fiftyw_media_history_key()); wp_send_json_success(); }); add_filter('media_row_actions', function($actions, $post) { if (current_user_can('manage_options') && current_user_can('edit_post', $post->ID) && preg_match('~^(image|video)/~', get_post_mime_type($post))) { $actions['550w_erase'] = '' . esc_html(fiftyw_media_label('550W 擦除', __('Erase with 550W', '550w-media'))) . ''; } return $actions; }, 10, 2); function fiftyw_media_page() { fiftyw_media_guard(); // Read-only page hints, not state changes: capability checks apply, IDs are absint, // connection messages use a fixed allowlist and every output is escaped. // phpcs:disable WordPress.Security.NonceVerification.Recommended $home = fiftyw_media_home(); $cn = FIFTYW_MEDIA_REGION === 'cn'; $history = get_user_meta(get_current_user_id(), fiftyw_media_history_key(), true); $history = is_array($history) ? array_filter($history, function($entry) { return ($entry['createdAt'] ?? 0) > time() - 7 * DAY_IN_SECONDS; }) : array(); $selected_attachment = isset($_GET['attachment']) ? absint($_GET['attachment']) : 0; if ($selected_attachment && (!current_user_can('edit_post', $selected_attachment) || get_post_type($selected_attachment) !== 'attachment')) { $selected_attachment = 0; } $initial = $selected_attachment && str_starts_with((string) get_post_mime_type($selected_attachment), 'video/') ? 'video' : 'image'; ?>
fiftyw_media_label('图片', __('Image', '550w-media')), 'video' => fiftyw_media_label('视频', __('Video', '550w-media')), 'processing' => fiftyw_media_label('处理中', __('Processing', '550w-media')), 'success' => fiftyw_media_label('已完成', __('Completed', '550w-media')), 'failed' => fiftyw_media_label('失败', __('Failed', '550w-media')), 'expired' => fiftyw_media_label('已过期', __('Expired', '550w-media')), 'accepted' => fiftyw_media_label('已受理', __('Accepted', '550w-media')), 'rejected' => fiftyw_media_label('已拒绝', __('Rejected', '550w-media'))); return $labels[$value] ?? fiftyw_media_label('结果未知', __('Outcome unknown', '550w-media')); }