RBN Core - Framework v0.9.7 76 belge

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.php açı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ş)

  1. Tembel kimlik yükleme bilinçli (:26-35 yorumu, 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."
  2. fail-closed, sessiz fallback yok (:41, :83): Secrets::section('cpanel')
    bölümü yoksa/eksikse RuntimeException fırlatır.
    Tuzak: isConfigured() kontrolü credentials() sonrasında gelir
    (:84 → :86), yani kimlik yoksa istisna, kimlik var ama geçersizse
    hata dizisi döner.
  3. ⛔ SSL doğrulaması KAPALI (:98-99):
    CURLOPT_SSL_VERIFYPEER => false ve CURLOPT_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.)
  4. CPanelService::call() imzası CPanelProvider::call() ile aynı ama
    bridge() üzerinden delegasyon yapar — yani iki katman vardır ve
    parametreler birebir aynıdır.
  5. CPanelDomainsHandler 24 satırdır ve tek metottur — list() yalnız
    Email/Domains modülünü çağırır. Alan adı oluşturma/silme yoktur
    (salt okunur).
  6. CpanelData::DEFAULT_QUOTA MB cinsindendir (:19 yorumu) ve
    CPanelMailHandler::create() için $quota = 0 varsayılanı kullanır —
    yani 0 geçildiğinde provider 1024'e düşmez, 0 gönderir. Düşürme
    mantığı CPanelMailHandler içinde değil CpanelData tarafındadır
    (ölçülmedi).
  7. CPanelProvider kayıt haritasında YOK. logicMap içinde yalnız
    services['cpanel'] var; CPanelProvider bridge() ile elle alınır.
    Ölçüldü: handler('cpanelMail') ve handler('cpanelDomains') çözülüyor,
    ama provider('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