Core/Services/Hosting — cPanel API köprüsü (5 dosya)
Doğrulanan kod tabanı:
c23b431f· Tarih: 2026-10-05 · Yayın: 0.9.7 = bu commit + sonrası; belge yalnız doğrulama anındaki kodu anlatır
Kaynak klasör:Core/Services/Hosting/— 5*.php= 1 kök +Data/1 +
Handlers/2 +Providers/1.
Envanter: 5 dosyanın 5'i anlatıldı.
Doğrulama platformu: Windows + PHP 8.3.secrets.phpaçılmadı, cPanel
API çağrısı yapılmadı (gece görevi kuralı: sır dosyası yasak).
1. Ne işe yarar, kim kullanır
cPanel UAPI'sine HTTP köprüsü. 5 sınıf, üç katman:
CPanelService (servis) ← kayıt: logicMap['services']['cpanel']
└─ bridge() → CPanelProvider (provider) ← kayıt YOK (elle tutulan bağımlılık)
├─ call($module, $function, $params) ← tüm UAPI çağrıları buradan
└─ getSsoUrl($target, $email) / redirect()
└─ mail() → CPanelMailHandler ← kayıt: logicMap['handlers']['cpanelMail']
└─ domains() → CPanelDomainsHandler ← kayıt: logicMap['handlers']['cpanelDomains']
└─ host() / sso()
Data\CpanelData ← sabitler (kota, SSO hedefleri)
Kimler çağırır: yönetim panelindeki e-posta ve alan adı ekranları
(RouteBlueprint üzerinden). Bu çalışmada çağıran örnek bulunamadı
(CPanelService dışında service('cpanel') referansı tarandı, panel
kaynakları Bundles/RbnSuite/RbnAdmin altında ve bu göreve dahil değil).
2. Klasör/dosya envanteri (5/5)
| Dosya | Görev | Önemli public yöntemler |
|---|---|---|
CPanelService.php (68) |
İnce servis kabuğu — provider ve handler'lara yönlendirir. | bridge(), call(string $module,string $function,array $params=[]): array, host(): string, mail(), sso(), domains() |
Providers/CPanelProvider.php (229) |
Asıl köprü. Tembel kimlik bilgisi, UAPI çağrısı, SSO URL üretimi, yönlendirme. | afterBoot(): void (korumalı), host(): string, isConfigured(): bool, call(string $module,string $function,array $params=[]): array, getSsoUrl(string $target,?string $email=null): array, redirect(string $target,?string $email=null): void · korumalı: credentials(): array |
Handlers/CPanelMailHandler.php (121) |
E-posta hesabı işlemleri (8 uç). | list(string $domain): array, create(string $email,string $password,string $domain,int $quota=0): array, delete(string $email,string $domain): array, getWebmailSession(string $email): array, changePassword(string $email,string $password,string $domain): array, listAll(): array, editQuota(string $email,string $domain,int $quota): array |
Handlers/CPanelDomainsHandler.php (24) |
Alan adı listeleme (tek metot, en küçük sınıf). | list(): array |
Data/CpanelData.php (75) |
final veri/sabit sınıfı. |
const DEFAULT_QUOTA = 1024 (MB), const DESTINATIONS (7 hedef) |
3. Akış — CPanelProvider::call() (Providers/CPanelProvider.php:80-108)
call('Email', 'list_pops', ['domain'=>'…'])
├─ credentials() :84 → :43-57
│ · cache'lenmiş $host/$user/$token döner :45-47
│ · Secrets::section('cpanel') → $c :50 ← fail-closed
│ · RuntimeException: bölüm yoksa/eksikse :41 yorumu
│ · 'sessiz fallback YOK' :83
├─ !isConfigured() → ['status'=>0, 'errors'=>['cPanel configuration is missing or invalid.']] :86-88
├─ URL: https://{host}:2083/execute/{module}/{function} :90
├─ remote->request('GET', $url, $params, [], false, [
│ connect_timeout: 5, timeout: 15,
│ CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
│ CURLOPT_USERPWD => "user:token",
│ CURLOPT_SSL_VERIFYPEER => false, ← ⚠️
│ CURLOPT_SSL_VERIFYHOST => false ← ⚠️
│ ]) :92-101
├─ status 'error' | 'remote_error' → ['status'=>0,'errors'=>[message]] :103-105
└─ return $response['data'] ?? [] :107
4. Akış — getSsoUrl() ve redirect() (:113-…)
getSsoUrl($target, $email = null)
├─ $target = strtolower($target) :115
├─ !isset(CpanelData::DESTINATIONS[$target])
│ → ['success'=>false, 'message'=>"Geçersiz hedef: '{$target}'"] :116-121
└─ CpanelData::DESTINATIONS[$target] ile SSO oturumu üretir :…
redirect($target, $email = null)
└─ getSsoUrl() → başarılıysa header('Location: …') + exit :170
5. Yapılandırma ve sabitler (ölçülen)
CpanelData (tümü ölçüldü):
| Sabit | Değer |
|---|---|
DEFAULT_QUOTA |
1024 (MB) |
DESTINATIONS |
7 hedef |
DESTINATIONS içeriği (ölçülen tam liste):
| Anahtar | Port | Yol |
|---|---|---|
cpanel |
2083 | /frontend/jupiter/index.html |
filemanager |
2083 | /frontend/jupiter/filemanager/index.html |
phpmyadmin |
2083 | /3rdparty/phpMyAdmin/index.php |
email |
2083 | /frontend/jupiter/mail/pops/index.html |
domains |
2083 | /frontend/jupiter/domains/index.html |
cron |
2083 | /frontend/jupiter/cron/index.html |
webmail |
2096 | /3rdparty/roundcube/index.php |
Her anahtar {port, path, title, message, sub_message} taşır.
| Diğer | Değer | Kaynak |
|---|---|---|
| UAPI portu | 2083 (Sabit, yapılandırılamaz) |
:90 |
| Webmail portu | 2096 |
CpanelData |
| Bağlantı zaman aşımı | connect_timeout: 5, timeout: 15 sn |
:93-94 |
| Kimlik doğrulama | HTTP Basic (CURLAUTH_BASIC) |
:96 |
isConfigured() geçersiz saydığı yer tutucu |
str_contains($host, 'your-cpanel-host') |
:74 |
6. Tuzaklar ve kurallar (kodda görülen — ölçülmediği belirtilmiş)
- Tembel kimlik yükleme bilinçli (
:26-35yorumu, B-1):afterBoot()
hiçbir sırı okumaz. Kimlik bilgileri ilk gerçek kullanımda
credentials()içinde çözülür. Gerekçe: "sır dosyası olmayan siteler bu
provider'ı boot edebilir, çünkü cPanel işlevi çağrılana kadar dosya zorunlu
değildir." - fail-closed, sessiz fallback yok (
:41,:83):Secrets::section('cpanel')
bölümü yoksa/eksikseRuntimeExceptionfırlatır.
Tuzak:isConfigured()kontrolücredentials()sonrasında gelir
(:84→:86), yani kimlik yoksa istisna, kimlik var ama geçersizse
hata dizisi döner. - ⛔ SSL doğrulaması KAPALI (
:98-99):
CURLOPT_SSL_VERIFYPEER => falseveCURLOPT_SSL_VERIFYHOST => false.
Bu, Basic kimlik bilgilerinin (user:token) TLS el sıkışması olmadan
gönderilmesi anlamına gelir. Kodda gerekçe yorumu yoktur.
(Bu çalışmada düzeltilmedi — belge salt okunurdur. Öneri: en az
CURLOPT_SSL_VERIFYPEER => true+ CA doğrulaması; üretim öncesi
karar proje sahibinindir.) CPanelService::call()imzasıCPanelProvider::call()ile aynı ama
bridge()üzerinden delegasyon yapar — yani iki katman vardır ve
parametreler birebir aynıdır.CPanelDomainsHandler24 satırdır ve tek metottur —list()yalnız
Email/Domainsmodülünü çağırır. Alan adı oluşturma/silme yoktur
(salt okunur).CpanelData::DEFAULT_QUOTAMB cinsindendir (:19yorumu) ve
CPanelMailHandler::create()için$quota = 0varsayılanı kullanır —
yani0geçildiğinde provider 1024'e düşmez,0gönderir. Düşürme
mantığıCPanelMailHandleriçinde değilCpanelDatatarafındadır
(ölçülmedi).CPanelProviderkayıt haritasında YOK.logicMapiçinde yalnız
services['cpanel']var;CPanelProviderbridge()ile elle alınır.
Ölçüldü:handler('cpanelMail')vehandler('cpanelDomains')çözülüyor,
amaprovider('cpanel')araması için kayıt yoktur.
7. Örnek (gerçek koddan)
// Core/Services/Hosting/Providers/CPanelProvider.php:43-57 (tembel + fail-closed)
private function credentials(): array
{
if ($this->host !== null && $this->user !== null && $this->token !== null) {
return ['host' => $this->host, 'user' => $this->user, 'token' => $this->token];
}
// Fail-closed: dosya yoksa/eksikse burada RuntimeException fırlatılır.
$c = Secrets::section('cpanel');
$this->host = $c['host'];
$this->user = $c['user'];
$this->token = $c['token'];
return $c;
}
// Ölçülen çıktı — CpanelData sabitleri (reflection ile, sır dosyasına dokunulmadan)
// CpanelData::DEFAULT_QUOTA = 1024
// CpanelData::DESTINATIONS → 7 anahtar: cpanel, filemanager, phpmyadmin,
// email, domains, cron, webmail
8. İlgili belgeler
- Core/Services genel · System · Gatekeepers
- Core/System/Config.md (
Secretsokuyucusu) ·
Core/Http/Engine.md (RemoteRequest/cURL) ·
Core/Base/Services.md (BaseProvider) - Kavram: yapılandırma · Açık sorular §1.14