rnids / rsreg-epp-client
Independent third-party PHP client for RNIDS/RSreg EPP; unaffiliated with RNIDS
Requires
- php: >=8.1
- ext-dom: *
- ext-json: *
- ext-openssl: *
Requires (Dev)
- oblak/wordpress-coding-standard: ^1.1
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-phpunit: ^1.4
- phpunit/phpunit: ^10.5
- symfony/var-dumper: ^6.4
Suggests
- ext-intl: Required to accept Unicode domain and host names; ASCII Punycode input works without it
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-12 17:20:39 UTC
README
RNIDS / RSreg EPP Client
Independent PHP Client for RNIDS / RSreg EPP
This is an independent third-party PHP library for RNIDS/RSreg EPP integration.
It is not affiliated with, endorsed by, or supported by RNIDS. The RNIDS/RSreg
names identify the integration target; the package name and RNIDS\ namespace
are retained for compatibility.
The library provides fluent APIs for PHP 8.1+ applications, with deterministic XML handling, typed internal DTOs, native stream transport, and predictable command execution.
The latest stable 2.x release receives bug and security fixes through September 30, 2028. It is an LTS candidate pending the remaining registry acceptance checks. See support and compatibility, upgrading from 1.x, and the security policy.
Key Features
- RNIDS-first API design with fluent entry points for session, domain, contact, and host operations.
- Deterministic EPP request lifecycle over native stream transport and frame codec boundaries.
- Validated request arrays, typed internal DTOs, and documented response shapes.
- Explicit protocol/transport exception strategy under
RNIDS\Exception\*. - Separate XML composition/parsing modules for easier testing and maintenance.
- Coverage-aware quality gate with static analysis and coding standards checks.
Installation
Install via Composer:
composer require rnids/rsreg-epp-client
Internationalized domain and host names are converted to ASCII Punycode when building
EPP commands. Unicode input requires the PHP intl extension; callers without it
can supply ASCII Punycode names. Registry responses retain the ASCII names sent by
the registry. Other Unicode fields, such as contact names and remarks, are unchanged.
Usage
<?php declare(strict_types=1); use RNIDS\Client; $client = Client::ready([ 'host' => 'epp.example.rs', 'port' => 700, 'username' => 'client-id', 'password' => 'secret', 'language' => 'en', 'tls' => [ 'clientCertificatePath' => '/secure/path/client.pem', 'clientCertificatePassword' => 'certificate-passphrase', 'caFilePath' => '/secure/path/rnids-ca.pem', ], ]); $domainInfo = $client->domain()->info('example.rs'); $meta = $client->responseMeta(); $client->close();
The default greetingMode is unsolicited, which reads the server greeting before
login. The RNIDS development endpoint was observed to wait for an explicit hello; set
'greetingMode' => 'hello' when connecting to epp-test.rnids.rs. Both modes wait
for the actual login result before making the client available. The development
server was also observed to omit clTRID on some successful responses: set
'requireClientTransactionId' => false there. This accepts omitted IDs only;
present IDs must still match the command. The default remains true. Confirm the
configuration required by your endpoint; these compatibility options do not change
TLS verification.
Common fluent entry points:
- Session:
$client->session()->hello(),login(),logout(),poll() - Domain:
$client->domain()->check(),info(),register(),renew(),update(),delete(), andtransferRequest()/transferQuery()/transferApprove()/transferCancel()/transferReject() - Contact:
$client->contact()->check(),create(),info(),update(),delete() - Host:
$client->host()->check(),info(),create(),update(),delete()
Runtime contact policy:
- Contact creation retains the
OBL-...generation policy; update, info, and delete preserve the supplied registry identifier. - Contact
extension.identDescriptionpreserves caller-provided values.
Native connections require TLS by default. allowPlaintext => true explicitly enables
unencrypted transport for a local test peer. Tests and custom adapters can inject a
Transport through new Client($config, $transport) or Client::ready($config, $transport).
Domain updates support nameservers and glue addresses. DNSSEC uses DS records in
dnssec, as shown in the domain API; the legacy RNIDS dnsSec
boolean alone does not provision DNSSEC. Existing getCode(), getState(), and
transfer() methods remain available as compatibility aliases.
composer test runs the offline quality gate, including a local EPP server.
composer test:live is an explicit RNIDS validation run and fails if its prerequisites
are missing or any tests are skipped. See Contributing for setup.
Documentation
- Support and compatibility:
SUPPORT.md - Upgrade guide:
UPGRADING.md - CLI usage:
docs/cli.md - Verified registry behavior:
docs/registry-compatibility.md - LTS acceptance procedure:
docs/lts-acceptance.md - API Reference Index:
docs/api-reference.md - Client API:
docs/api-client.md - Session API:
docs/api-session.md - Domain API:
docs/api-domain.md - Contact API:
docs/api-contact.md - Host API:
docs/api-host.md - EPP Protocol Reference:
docs/epp-protocol/epp-reference-index.md
Live test cleanup
Live cleanup records resource names and states in RNIDS_EPP_RESOURCE_LEDGER, or
/tmp/rnids-live-resources-<pid>.json by default. RNIDS may accept a domain deletion
with code 1000 while retaining pendingDelete; the suite verifies that state and
records the domain and its linked contacts as pending, not removed. Unexpected
cleanup failures still fail the run. Process pending records after registry deletion
completes. The ledger contains object identifiers and states, never credentials.
Contributing
For local setup, quality gates, commit conventions, and PR guidelines, see CONTRIBUTING.md.
License
Apache-2.0. See LICENSE.