Basic fee extension support now completed

This commit is contained in:
Pinga 2023-12-20 09:30:24 +02:00
parent 04eac7a648
commit 49d7822d1a
4 changed files with 89 additions and 28 deletions

View file

@ -740,7 +740,6 @@ class EppWriter {
$writer->endElement(); // End of 'fee:period'
$writer->startElement('fee:fee');
$writer->writeAttribute('description', 'Fee');
$writer->writeAttribute('refundable', 1);
$writer->writeAttribute('grace-period', 'P5D');
$writer->text($fee['fee']);
@ -787,6 +786,27 @@ class EppWriter {
$writer->writeElement('domain:exDate', $exDateFormatted);
$writer->endElement(); // End of 'domain:creData'
$writer->endElement(); // End of 'resData'
if (isset($resp['fee_include']) && $resp['fee_include'] == true) {
$writer->startElement('extension');
$writer->startElement('fee:creData');
$writer->writeAttribute('xmlns:fee', 'urn:ietf:params:xml:ns:epp:fee-1.0');
$writer->writeElement('fee:currency', 'USD');
$writer->startElement('fee:fee');
$writer->writeAttribute('refundable', 1);
$writer->writeAttribute('grace-period', 'P5D');
$writer->text($resp['fee_price']);
$writer->endElement(); // End of 'fee:fee'
$writer->writeElement('fee:balance', $resp['fee_balance']);
$writer->writeElement('fee:creditLimit', $resp['fee_creditLimit']);
$writer->endElement(); // End of 'fee:creData'
$writer->endElement(); // End of 'extension'
}
}
$this->_postamble($writer, $resp);

View file

@ -341,15 +341,29 @@ function processDomainCheck($conn, $db, $xml, $trans) {
$returnValue = getDomainPrice($db, $domainName, $tld_id, $date_add, $commandName);
$price = $returnValue['price'];
// Add to fee response array
$feeResponses[] = [
'command' => $commandName,
'period' => $period,
'period_unit' => $period_unit,
'avail' => $domainEntry[1],
'fee' => $price,
'name' => $domainName,
];
$sth = $db->prepare("SELECT price FROM domain_restore_price WHERE tldid = ? LIMIT 1");
$sth->execute([$tld_id]);
$restore_price = $sth->fetchColumn();
if ($commandName == 'restore') {
$feeResponses[] = [
'command' => $commandName,
'period' => $period,
'period_unit' => $period_unit,
'avail' => $domainEntry[1],
'fee' => $restore_price,
'name' => $domainName,
];
} else {
$feeResponses[] = [
'command' => $commandName,
'period' => $period,
'period_unit' => $period_unit,
'avail' => $domainEntry[1],
'fee' => $price,
'name' => $domainName,
];
}
} else {
$feeResponses[] = [
'command' => $commandName,

View file

@ -574,6 +574,11 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
$domainName = $xml->command->create->children('urn:ietf:params:xml:ns:domain-1.0')->create->name;
$clTRID = (string) $xml->command->clTRID;
$extensionNode = $xml->command->extension;
if (isset($extensionNode)) {
$fee_create = $xml->xpath('//fee:create')[0] ?? null;
}
$parts = extractDomainAndTLD($domainName);
$label = $parts['domain'];
$domain_extension = $parts['tld'];
@ -1038,6 +1043,24 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
try {
$db->beginTransaction();
$response = [];
if (isset($fee_create)) {
$response['fee_fee'] = (string) $fee_create->children('urn:ietf:params:xml:ns:epp:fee-1.0')->fee;
if ($response['fee_fee'] >= $price) {
$response['fee_currency'] = (string) $fee_create->children('urn:ietf:params:xml:ns:epp:fee-1.0')->currency;
$response['fee_price'] = $price;
$response['fee_balance'] = $registrar_balance;
$response['fee_creditLimit'] = $creditLimit;
$response['fee_include'] = true;
} else {
$response['fee_include'] = false;
$db->rollBack();
sendEppError($conn, $db, 2004, "Provided fee is less than the server domain fee", $clTRID, $trans);
return;
}
}
$domainSql = "INSERT INTO domain (name,tldid,registrant,crdate,exdate,lastupdate,clid,crid,upid,trdate,trstatus,reid,redate,acid,acdate,rgpstatus,addPeriod)
VALUES(:name, :tld_id, :registrant_id, CURRENT_TIMESTAMP(3), DATE_ADD(CURRENT_TIMESTAMP(3), INTERVAL :date_add MONTH), NULL, :registrar_id, :registrar_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'addPeriod', :date_add2)";
@ -1072,10 +1095,12 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
// Data sanity checks
// Validate keyTag
if (!isset($keyTag) || !is_int($keyTag)) {
$db->rollBack();
sendEppError($conn, $db, 2005, 'Incomplete keyTag provided', $clTRID, $trans);
return;
}
if ($keyTag < 0 || $keyTag > 65535) {
$db->rollBack();
sendEppError($conn, $db, 2006, 'Invalid keyTag provided', $clTRID, $trans);
return;
}
@ -1083,12 +1108,14 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
// Validate alg
$validAlgorithms = [2, 3, 5, 6, 7, 8, 10, 13, 14, 15, 16];
if (!isset($alg) || !in_array($alg, $validAlgorithms)) {
$db->rollBack();
sendEppError($conn, $db, 2006, 'Invalid algorithm', $clTRID, $trans);
return;
}
// Validate digestType and digest
if (!isset($digestType) || !is_int($digestType)) {
$db->rollBack();
sendEppError($conn, $db, 2005, 'Invalid digestType', $clTRID, $trans);
return;
}
@ -1098,10 +1125,12 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
4 => 96 // SHA-384
];
if (!isset($validDigests[$digestType])) {
$db->rollBack();
sendEppError($conn, $db, 2006, 'Unsupported digestType', $clTRID, $trans);
return;
}
if (!isset($digest) || strlen($digest) != $validDigests[$digestType] || !ctype_xdigit($digest)) {
$db->rollBack();
sendEppError($conn, $db, 2006, 'Invalid digest length or format', $clTRID, $trans);
return;
}
@ -1122,24 +1151,28 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
// Validate flags
$validFlags = [256, 257];
if (isset($flags) && !in_array($flags, $validFlags)) {
$db->rollBack();
sendEppError($conn, $db, 2005, 'Invalid flags', $clTRID, $trans);
return;
}
// Validate protocol
if (isset($protocol) && $protocol != 3) {
$db->rollBack();
sendEppError($conn, $db, 2006, 'Invalid protocol', $clTRID, $trans);
return;
}
// Validate algKeyData
if (isset($algKeyData)) {
$db->rollBack();
sendEppError($conn, $db, 2005, 'Invalid algKeyData encoding', $clTRID, $trans);
return;
}
// Validate pubKey
if (isset($pubKey) && base64_encode(base64_decode($pubKey, true)) !== $pubKey) {
$db->rollBack();
sendEppError($conn, $db, 2005, 'Invalid pubKey encoding', $clTRID, $trans);
return;
}
@ -1329,7 +1362,7 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
$stmt->execute();
}
$db->exec("UPDATE statistics SET created_domains = created_domains + 1 WHERE date = CURDATE()");
$db->commit();
} catch (Exception $e) {
$db->rollBack();
@ -1337,18 +1370,16 @@ function processDomainCreate($conn, $db, $xml, $clid, $database_type, $trans) {
sendEppError($conn, $db, 2400, "Database failure: " . $e->getMessage(), $clTRID, $trans);
}
$svTRID = generateSvTRID();
$response = [
'command' => 'create_domain',
'resultCode' => 1000,
'lang' => 'en-US',
'message' => 'Command completed successfully',
'name' => $domainName,
'crDate' => $crdate,
'exDate' => $exdate,
'clTRID' => $clTRID,
'svTRID' => $svTRID,
];
$response['command'] = 'create_domain';
$response['resultCode'] = 1000;
$response['lang'] = 'en-US';
$response['message'] = 'Command completed successfully';
$response['name'] = $domainName;
$response['crDate'] = $crdate;
$response['exDate'] = $exdate;
$response['clTRID'] = $clTRID;
$response['svTRID'] = $svTRID;
$epp = new EPP\EppWriter();
$xml = $epp->epp_writer($response);
updateTransaction($db, 'create', 'domain', $domainName, 1000, 'Command completed successfully', $svTRID, $xml, $trans);