feat(users): govern profiles and access

Normalize fixed profile fields, profile actions, and the five-column capability matrix for comments, uploads, and downloads.
This commit is contained in:
2026-08-13 00:24:54 +08:00
parent 0b06b2c7df
commit 8241570ca2
67 changed files with 780 additions and 1127 deletions
+18 -3
View File
@@ -55,7 +55,7 @@ trait FrontSubmitPay {
}
}
$downloads = $this->normalize_front_downloads($raw['downloads'] ?? $data['pay_download'] ?? []);
$downloads = $this->normalize_front_downloads($raw['downloads'] ?? $data['pay_download'] ?? [], $user_id);
if (!empty($downloads) && $this->user_can_cap('new_post_pay_download', $user_id)) {
$pay_type = DomainModel::PAY_TYPE_DOWNLOAD;
$meta['downloads'] = $downloads;
@@ -163,7 +163,7 @@ trait FrontSubmitPay {
* @param mixed $raw
* @return array<int, array<string, string>>
*/
private function normalize_front_downloads($raw): array {
private function normalize_front_downloads($raw, int $user_id): array {
if (!is_array($raw)) {
return [];
}
@@ -178,16 +178,31 @@ trait FrontSubmitPay {
if ($url === '') {
continue;
}
$attachment_id = attachment_url_to_postid($url);
if ($attachment_id > 0 && !$this->can_use_front_submit_resource($attachment_id, $user_id)) {
continue;
}
$out[] = [
'label' => sanitize_text_field((string) ($row['label'] ?? $row['name'] ?? '')),
'url' => $url,
'type' => 'external',
'type' => $attachment_id > 0 ? 'direct' : 'external',
'extract_code' => sanitize_text_field((string) ($row['extract_code'] ?? $row['copy_val'] ?? $row['more'] ?? '')),
];
}
return DomainModel::sanitize_downloads($out);
}
private function can_use_front_submit_resource(int $attachment_id, int $user_id): bool {
if ($attachment_id <= 0 || !$this->user_can_cap('upload_resource_attachment', $user_id)) {
return false;
}
$attachment = get_post($attachment_id);
return $attachment instanceof \WP_Post
&& $attachment->post_type === 'attachment'
&& (int) $attachment->post_author === $user_id
&& get_post_meta($attachment_id, '_aksrt_front_submit_upload_type', true) === 'resource';
}
/**
* @param array<string, mixed> $meta
*/