# Alan Adı Kişi Kancaları

https://dev.wisecp.com/tr/alan-adi-kisi-kancalari

Alan adının arkasındaki kişiyi, gizliliği ve transfer kilidini yöneten on bir kanca.

## Genel Bakış

Bu üç konu birbirine bağlıdır. Kişi bilgisi kayıt kuruluşunun **zorunlu** tuttuğu veridir, gizlilik onu dışarıdan saklar, transfer kilidi ise adın izinsiz taşınmasını engeller.

Üçü de sağlayıcıya canlı yazılır. Kayıtlı kişi profilleri ise **bizim tarafımızda** durur: müşterinin tekrar tekrar aynı bilgiyi girmemesi için saklanan şablonlardır ve kendi kancalarını taşırlar.

## Referans

### Kişi bilgisi yazımını durdurma

gatedomain.contacts_save

`AdminServices` dört rol birden

Kişi bilgileri sağlayıcıya yazılmadan önce çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$whoisarrayDört rolün verisi: `registrant`, `administrative`, `technical`, `billing`. Her rol ad, soyad, e-posta, telefon ve adres alanlarını taşır.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.contacts_save', 10, function ($service, $whois) {
    // Kayit sahibi e-postasi dogrulanmadan degistirilemez.
    $mail = (string) ($whois['registrant']['EMail'] ?? '');
    if ($mail !== '' && !Acme::verified($mail))
        return 'Kayit sahibi e-postasi once dogrulanmalidir.';

    return null;
});
```

### Kişi değişikliğini izleme

actiondomain.contacts_saved

`AdminServices` yalnız başarıda

Kişi bilgileri sağlayıcıya yazıldıktan sonra çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$whoisarraySağlayıcıya yazılan dört rolün verisi.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.contacts_saved', 10, function ($service, $whois) {
    Audit::whois($service['name'] ?? '', $whois['registrant']['EMail'] ?? '');
});
```

### Gizlilik değişikliğini durdurma

gatedomain.privacy_change

`AdminServices` açma ve kapama

Gizlilik sağlayıcıda değişmeden önce çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$statusstringİstenen durum: `enable` ya da `disable`. İstenen durumdur, yeni durum değil.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.privacy_change', 10, function ($service, $status) {
    // Bazi uzantilar gizliligi hic desteklemez.
    if ($status === 'enable' && Acme::noPrivacyTld($service['name'] ?? ''))
        return 'Bu uzantida gizlilik sunulmuyor.';

    return null;
});
```

### Gizlilik durumunu izleme

actiondomain.privacy_changed

`AdminServices` yeni durum bool

Gizlilik sağlayıcıda değiştikten sonra çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$enabledboolYeni durum: `true` gizlilik açık. Kapıdaki metin değerinden farklı olarak burası mantıksal değerdir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.privacy_changed', 10, function ($service, $enabled) {
    Billing::privacyFee((int) ($service['id'] ?? 0), (bool) $enabled);
});
```

### Transfer kilidi değişikliğini durdurma

gatedomain.transfer_lock_change

`AdminServices` açma ve kapama

Kilit sağlayıcıda değişmeden önce çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$statusstringİstenen durum: `enable` kilitle, `disable` aç.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.transfer_lock_change', 10, function ($service, $status) {
    // Kilit acmak adin baskasina tasinmasinin ilk adimidir.
    if ($status === 'disable' && Acme::recentlyChangedOwner($service))
        return 'Sahip degisikliginden sonra 60 gun kilit acilamaz.';

    return null;
});
```

### Kilit durumunu izleme

actiondomain.transfer_lock_changed

`AdminServices` yeni durum bool

Kilit sağlayıcıda değiştikten sonra çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$lockedboolYeni durum: `true` kilitli.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.transfer_lock_changed', 10, function ($service, $locked) {
    if (!$locked) Ops::watch('domain-unlocked', $service['name'] ?? '');
});
```

### Bildirilecek kilit durumunu değiştirme

filterdomain.transfer_lock_status

`Hook::runRefs` referansla

Kilit durumu ekrana ya da API yanıtına gitmeden önce çalışır.

Parametreler 2

$lockedboolrefBildirilecek durum. Sağlayıcı bilgi vermiyorsa buradan doldurabilirsiniz.

$servicearrayAlan adı hizmet kaydı.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.transfer_lock_status', 10, function (&$locked, $service) {
    // Saglayici bilmiyorsa kendi kaydimizdan doldur.
    if ($locked === null) $locked = Acme::lockMirror((int) ($service['id'] ?? 0));
});
```

### Transfer kodu isteğini durdurma

gatedomain.epp_code_get

`AdminServices` kod sahibine gider

Transfer kodu sağlayıcıdan istenmeden önce çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$serviceIdintHizmet kimliği.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.epp_code_get', 10, function ($service, $serviceId) {
    // Transfer kodu adin baskasina gecmesinin anahtaridir.
    if (Acme::openDispute($serviceId)) return 'Acik anlasmazlik varken kod verilmez.';

    return null;
});
```

### Transfer kodu isteğini izleme

actiondomain.epp_code_retrieved

`AdminServices` değer iki türlü gelir

Kod sağlayıcıdan alındıktan sonra çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$codestring|boolKodun kendisi, ya da `true`. `true` demek "kod döndürülmedi, sahibine e-postayla gönderildi" demektir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.epp_code_retrieved', 10, function ($service, $code) {
    // Kodu ASLA loglamayin: adin anahtaridir.
    Audit::note('epp-requested', $service['name'] ?? '',
        $code === true ? 'e-posta ile gonderildi' : 'ekranda gosterildi');
});
```

### Kişi profili kaydını durdurma

gatedomain.whois_profile_save

`ClientDomains` bizim tarafımızda

Kayıtlı kişi profili veritabanına yazılmadan önce çalışır. Bu kanca sağlayıcıya **gitmez**; profil bizim tarafımızda saklanan bir şablondur.

Parametreler 3

$uidintProfil sahibinin hesap kimliği. Hizmet değil **hesap** gelir.

$informationarrayKişi alanları: `FirstName`, `LastName`, `Company`, `EMail`, `Phone`, adres alanları.

$profileIdint`0` yeni profil, sıfırdan büyük değer düzenlenen profilin kimliği.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır. `null` ya da boş string akışı sürdürür.

Dinleyici PHP

```php
Hook::add('gate:domain.whois_profile_save', 10,
    function ($uid, $information, $profileId) {
        if ($profileId > 0) return null;                  // duzenlemeye karisma
        if (Acme::profileCount($uid) >= 10) return 'En fazla 10 profil saklanir.';
        return null;
    });
```

### Profil kaydını izleme

actiondomain.whois_profile_saved

`ClientDomains` kimlik artık dolu

Profil kaydedildikten sonra çalışır.

Parametreler 3

$uidintHesap kimliği.

$profileIdintKaydedilen profilin kimliği. Yeni profilde de artık doludur.

$informationarrayKaydedilen alanlar.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.whois_profile_saved', 10,
    function ($uid, $profileId, $information) {
        Acme::indexProfile($uid, $profileId, $information['EMail'] ?? '');
    });
```

## Tuzaklar

> **Transfer kodu adın anahtarıdır**
> 
> Kod eline geçen biri alan adını başka bir sağlayıcıya taşıyabilir. Olay kancasında gelen değeri **loglamayın**, bildirime koymayın, dış sisteme göndermeyin. Değer `true` ise kod zaten sahibine e-postayla gitmiştir; elinizde kod yoktur ve olması da gerekmez.

> **Kapıda metin, olayda mantıksal değer**
> 
> Gizlilik ve kilit kapıları **istenen durumu metin olarak** verir (`enable`/`disable`); olay kancaları ise **gerçekleşen durumu mantıksal değer olarak** verir. İkisini karıştırmak sessiz hataya yol açar: bir metin her zaman doğru sayılır.

> **Profil kancaları hizmet değil hesap taşır**
> 
> Kayıtlı profil kancalarının ilk parametresi **hesap kimliğidir**, hizmet kaydı değil. Diğer alan adı kancalarına alışmış bir dinleyici burada `$service['name']` okumaya kalkar ve boş bulur. Profil bir alan adına değil, bir hesaba aittir.

> **Kayıt sahibi değişikliği doğrulama tetikleyebilir**
> 
> Kayıt sahibinin e-postasını değiştirmek çoğu uzantıda **yeniden doğrulama** başlatır ve doğrulanmayan ad askıya alınabilir. Kişi yazımına dokunan bir dinleyici bu sonucu bilerek yazılmalıdır; doğrulama durumunun kendi filtresi vardır.

## İlgili Makaleler

- [Alan Adı Edinme Kancaları](https://dev.wisecp.com/tr/alan-adi-edinme-kancalari)
- [Alan Adı DNS Kancaları](https://dev.wisecp.com/tr/alan-adi-dns-kancalari)
- Alan Adı Kancaları
