Added GET /domains/{domainId}/soa
This commit is contained in:
parent
28c0b0d08d
commit
bac3fd1dfb
|
@ -202,4 +202,27 @@ class Domains
|
||||||
return $res->withJson(['error' => 'SOA can not be set for slave domains'], 405);
|
return $res->withJson(['error' => 'SOA can not be set for slave domains'], 405);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSoa(Request $req, Response $res, array $args)
|
||||||
|
{
|
||||||
|
$userId = $req->getAttribute('userId');
|
||||||
|
$domainId = $args['domainId'];
|
||||||
|
|
||||||
|
$ac = new \Operations\AccessControl($this->c);
|
||||||
|
if (!$ac->canAccessDomain($userId, $domainId)) {
|
||||||
|
$this->logger->info('Non admin user tries to get domain without permission.');
|
||||||
|
return $res->withJson(['error' => 'You have no permissions for this domain.'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$soa = new \Operations\Soa($this->c);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$soaArray = $soa->getSoa($domainId);
|
||||||
|
|
||||||
|
return $res->withJson($soaArray, 200);
|
||||||
|
} catch (\Exceptions\NotFoundException $e) {
|
||||||
|
$this->logger->debug('User tried to get non existing soa.', ['domainId' => $domainId]);
|
||||||
|
return $res->withJson(['error' => 'This domain has no soa record.'], 404);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,6 +110,38 @@ class Soa
|
||||||
$this->db->commit();
|
$this->db->commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get soa record for domain
|
||||||
|
*
|
||||||
|
* @param $domainId Domain to get soa from
|
||||||
|
*
|
||||||
|
* @return array Soa data as associative array
|
||||||
|
*/
|
||||||
|
public function getSoa(int $domainId)
|
||||||
|
{
|
||||||
|
$query = $this->db->prepare('SELECT content FROM records WHERE domain_id=:domainId AND type=\'SOA\'');
|
||||||
|
$query->bindValue(':domainId', $domainId, \PDO::PARAM_INT);
|
||||||
|
$query->execute();
|
||||||
|
|
||||||
|
$record = $query->fetch();
|
||||||
|
|
||||||
|
if ($record === false) {
|
||||||
|
throw new \Exceptions\NotFoundException();
|
||||||
|
}
|
||||||
|
|
||||||
|
$soaArray = explode(' ', $record['content']);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'primary' => $soaArray[0],
|
||||||
|
'email' => $this->toEmail($soaArray[1]),
|
||||||
|
'serial' => intval($soaArray[2]),
|
||||||
|
'refresh' => intval($soaArray[3]),
|
||||||
|
'retry' => intval($soaArray[4]),
|
||||||
|
'expire' => intval($soaArray[5]),
|
||||||
|
'ttl' => intval($soaArray[6])
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increases the serial number of the given domain to the next required.
|
* Increases the serial number of the given domain to the next required.
|
||||||
*
|
*
|
||||||
|
|
|
@ -34,6 +34,7 @@ $app->group('/v1', function () {
|
||||||
$this->put('/domains/{domainId}', '\Controllers\Domains:put');
|
$this->put('/domains/{domainId}', '\Controllers\Domains:put');
|
||||||
|
|
||||||
$this->put('/domains/{domainId}/soa', '\Controllers\Domains:putSoa');
|
$this->put('/domains/{domainId}/soa', '\Controllers\Domains:putSoa');
|
||||||
|
$this->get('/domains/{domainId}/soa', '\Controllers\Domains:getSoa');
|
||||||
})->add('\Middlewares\Authentication');
|
})->add('\Middlewares\Authentication');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -48,20 +48,120 @@ test.run(async function () {
|
||||||
|
|
||||||
assert.equal(res.status, 422, 'Updating SOA with missing fields should fail.');
|
assert.equal(res.status, 422, 'Updating SOA with missing fields should fail.');
|
||||||
|
|
||||||
//Set soa for zone without one
|
//Getting soa data from master zone without soa should fail
|
||||||
var res = await req({
|
var res = await req({
|
||||||
url: '/domains/1/soa',
|
url: '/domains/1/soa',
|
||||||
method: 'put',
|
method: 'get'
|
||||||
data: {
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 404, 'Not existing soa should trigger error');
|
||||||
|
|
||||||
|
//Getting soa data from slave zone should fail
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 404, 'Geting soa from slave should trigger error');
|
||||||
|
|
||||||
|
//Soa data for test
|
||||||
|
var soaData = {
|
||||||
primary: 'ns1.example.com',
|
primary: 'ns1.example.com',
|
||||||
email: 'hostmaster@example.com',
|
email: 'hostmaster@example.com',
|
||||||
refresh: 3600,
|
refresh: 3600,
|
||||||
retry: 900,
|
retry: 900,
|
||||||
expire: 604800,
|
expire: 604800,
|
||||||
ttl: 86400
|
ttl: 86400
|
||||||
}
|
};
|
||||||
|
|
||||||
|
//Set soa for zone without one
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'put',
|
||||||
|
data: soaData
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.equal(res.status, 204, 'Updating SOA for Zone without one should succeed.');
|
assert.equal(res.status, 204, 'Updating SOA for Zone without one should succeed.');
|
||||||
|
|
||||||
|
//Get the new soa
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 200, 'Getting soa should succeed.');
|
||||||
|
const firstSerial = res.data.serial;
|
||||||
|
delete res.data['serial'];
|
||||||
|
assert.equal(res.data, soaData, 'The set and get data should be equal');
|
||||||
|
|
||||||
|
//Soa data for update test
|
||||||
|
soaData = {
|
||||||
|
primary: 'ns2.example.com',
|
||||||
|
email: 'hostmasterFoo@example.com',
|
||||||
|
refresh: 3601,
|
||||||
|
retry: 901,
|
||||||
|
expire: 604801,
|
||||||
|
ttl: 86401
|
||||||
|
};
|
||||||
|
|
||||||
|
//Update soa with new values
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'put',
|
||||||
|
data: soaData
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 204, 'Updating SOA for Zone should succeed.');
|
||||||
|
|
||||||
|
//Check if update suceeded
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 200, 'Getting updated soa should succeed.');
|
||||||
|
assert.true(firstSerial < res.data.serial, 'Serial value should increase with update');
|
||||||
|
delete res.data['serial'];
|
||||||
|
assert.equal(res.data, soaData, 'The set and get data should be equal after update');
|
||||||
|
});
|
||||||
|
|
||||||
|
await test('user', async function (assert, req) {
|
||||||
|
//Soa data for test
|
||||||
|
var soaData = {
|
||||||
|
primary: 'ns1.example.com',
|
||||||
|
email: 'hostmaster@example.com',
|
||||||
|
refresh: 3600,
|
||||||
|
retry: 900,
|
||||||
|
expire: 604800,
|
||||||
|
ttl: 86400
|
||||||
|
};
|
||||||
|
|
||||||
|
//Updating soa for domain with permissions should work
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'put',
|
||||||
|
data: soaData
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 204, 'Updating SOA for Zone should succeed for user.');
|
||||||
|
|
||||||
|
//Get the updated soa
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/1/soa',
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 200, 'Getting soa should succeed for user.');
|
||||||
|
delete res.data['serial'];
|
||||||
|
assert.equal(res.data, soaData, 'The set and get data should be equal');
|
||||||
|
|
||||||
|
//Updating soa for domain with permissions should work
|
||||||
|
var res = await req({
|
||||||
|
url: '/domains/4/soa',
|
||||||
|
method: 'put',
|
||||||
|
data: soaData
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(res.status, 403, 'Updating SOA for Zone without permissions should fail.');
|
||||||
});
|
});
|
||||||
});
|
});
|
Loading…
Reference in a new issue