| 1 |
<?php |
| 2 |
|
| 3 |
namespace SyncBasalam\Utilities; |
| 4 |
|
| 5 |
defined('ABSPATH') || exit; |
| 6 |
|
| 7 |
/** |
| 8 |
* Builds the dedicated site-access API payload without modifying ticket prose. |
| 9 |
* Passwords are never written to options/logs and ordinary spaces are kept. |
| 10 |
*/ |
| 11 |
class TicketAccessData |
| 12 |
{ |
| 13 |
public static function fromRequest(array $request): array |
| 14 |
{ |
| 15 |
$siteDomain = defined('SYNC_BASALAM_SITE_ACCESS_DOMAIN') |
| 16 |
? (string) constant('SYNC_BASALAM_SITE_ACCESS_DOMAIN') |
| 17 |
: get_site_url(); |
| 18 |
$payload = ['domain' => untrailingslashit($siteDomain)]; |
| 19 |
|
| 20 |
$wordpress = self::section($request, [ |
| 21 |
'login_url' => 'dashboard_login_url', |
| 22 |
'username' => 'dashboard_username', |
| 23 |
'password' => 'dashboard_password', |
| 24 |
], 'پیشخوان وردپرس'); |
| 25 |
|
| 26 |
$hostPanel = self::section($request, [ |
| 27 |
'login_url' => 'host_panel_login_url', |
| 28 |
'username' => 'host_panel_username', |
| 29 |
'password' => 'host_panel_password', |
| 30 |
], 'کنترل پنل هاست'); |
| 31 |
|
| 32 |
if ($wordpress !== null) $payload['wordpress'] = $wordpress; |
| 33 |
if ($hostPanel !== null) $payload['host_panel'] = $hostPanel; |
| 34 |
|
| 35 |
return count($payload) > 1 ? $payload : []; |
| 36 |
} |
| 37 |
|
| 38 |
private static function section(array $request, array $fields, string $label): ?array |
| 39 |
{ |
| 40 |
$rawLoginUrl = isset($request[$fields['login_url']]) |
| 41 |
? trim((string) wp_unslash($request[$fields['login_url']])) |
| 42 |
: ''; |
| 43 |
$loginUrl = $rawLoginUrl === '' ? null : esc_url_raw($rawLoginUrl); |
| 44 |
if ($rawLoginUrl !== '' && $loginUrl === '') { |
| 45 |
throw new \InvalidArgumentException('آدرس ورود ' . $label . ' � |
| 46 |
عتبر نیست.'); |
| 47 |
} |
| 48 |
|
| 49 |
$username = isset($request[$fields['username']]) |
| 50 |
? trim(sanitize_text_field(wp_unslash($request[$fields['username']]))) |
| 51 |
: ''; |
| 52 |
$password = isset($request[$fields['password']]) |
| 53 |
? self::password($request[$fields['password']]) |
| 54 |
: ''; |
| 55 |
|
| 56 |
$hasAnyValue = $rawLoginUrl !== '' || $username !== '' || $password !== ''; |
| 57 |
if (!$hasAnyValue) return null; |
| 58 |
|
| 59 |
if ($username === '' || $password === '') { |
| 60 |
throw new \InvalidArgumentException( |
| 61 |
'برای ' . $label . ' نا� |
| 62 |
کاربری و ر� |
| 63 |
ز عبور را کا� |
| 64 |
ل وارد کنید.' |
| 65 |
); |
| 66 |
} |
| 67 |
|
| 68 |
return [ |
| 69 |
'login_url' => $loginUrl, |
| 70 |
'username' => $username, |
| 71 |
'password' => $password, |
| 72 |
]; |
| 73 |
} |
| 74 |
|
| 75 |
private static function password($value): string |
| 76 |
{ |
| 77 |
$password = wp_check_invalid_utf8(wp_unslash((string) $value)); |
| 78 |
if (mb_strlen($password) > 1024) { |
| 79 |
throw new \InvalidArgumentException('ر� |
| 80 |
ز عبور طولانیتر از حد � |
| 81 |
جاز است.'); |
| 82 |
} |
| 83 |
if (preg_match('/[\x00-\x1F\x7F]/u', $password)) { |
| 84 |
throw new \InvalidArgumentException('ر� |
| 85 |
ز عبور دارای نویسه کنترلی نا� |
| 86 |
عتبر است.'); |
| 87 |
} |
| 88 |
return $password; |
| 89 |
} |
| 90 |
} |
| 91 |
|