Compare commits
No commits in common. "010914b7bdd8bea95d8ca4035015e7c941e298ff" and "19576dd6b78096c8d6319190cdf73ad5d6f8f568" have entirely different histories.
010914b7bd
...
19576dd6b7
|
@ -34,11 +34,11 @@ class CommandGroup
|
||||||
echo COLOR_YELLOW . str_pad(string: $this->name, length: $longestCommandLength + 1) . COLOR_WHITE . $this->description . COLOR_DEFAULT . PHP_EOL;
|
echo COLOR_YELLOW . str_pad(string: $this->name, length: $longestCommandLength + 1) . COLOR_WHITE . $this->description . COLOR_DEFAULT . PHP_EOL;
|
||||||
foreach ($this->commands as $command) {
|
foreach ($this->commands as $command) {
|
||||||
echo COLOR_GREEN . str_pad(string: ' ', length: $longestCommandLength + 1, pad_type: STR_PAD_LEFT) . $this->name . ':' . $command->getName();
|
echo COLOR_GREEN . str_pad(string: ' ', length: $longestCommandLength + 1, pad_type: STR_PAD_LEFT) . $this->name . ':' . $command->getName();
|
||||||
foreach ($command->getMandatoryParameters() as $optionals) {
|
foreach ($command->getMandatoryParameters() as $parameter) {
|
||||||
echo ' <' . $optionals . '>';
|
echo ' <' . $parameter . '>';
|
||||||
}
|
}
|
||||||
foreach ($command->getOptionalParameters() as $mandatory) {
|
foreach ($command->getOptionalParameters() as $parameter) {
|
||||||
echo ' {' . $mandatory . '}';
|
echo ' {' . $parameter . '}';
|
||||||
}
|
}
|
||||||
echo COLOR_WHITE . ' ' . $command->getDescription();
|
echo COLOR_WHITE . ' ' . $command->getDescription();
|
||||||
echo COLOR_DEFAULT . PHP_EOL;
|
echo COLOR_DEFAULT . PHP_EOL;
|
||||||
|
|
|
@ -9,21 +9,7 @@ class ConfigController
|
||||||
{
|
{
|
||||||
private array $config;
|
private array $config;
|
||||||
|
|
||||||
/**
|
public function __construct(bool $verbose = false, bool $quiet = false) {
|
||||||
* @param bool $verbose
|
|
||||||
* @param bool $quiet
|
|
||||||
* @param bool $test
|
|
||||||
*/
|
|
||||||
public function __construct(bool $verbose = false, bool $quiet = false, bool $test = false)
|
|
||||||
{
|
|
||||||
|
|
||||||
if ($test) {
|
|
||||||
$configFile = dirname(path: __DIR__, levels: 2) . "/config.json.test";
|
|
||||||
if (!file_exists(filename: $configFile)) {
|
|
||||||
echo 'No testing (config.json.test) config has benn setup.' . PHP_EOL;
|
|
||||||
die(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$configFile = dirname(path: __DIR__, levels: 2) . "/config.json.local";
|
$configFile = dirname(path: __DIR__, levels: 2) . "/config.json.local";
|
||||||
if (!file_exists(filename: $configFile)) {
|
if (!file_exists(filename: $configFile)) {
|
||||||
$configFile = dirname(path: __DIR__, levels: 2) . "/config.json";
|
$configFile = dirname(path: __DIR__, levels: 2) . "/config.json";
|
||||||
|
@ -40,7 +26,6 @@ class ConfigController
|
||||||
}
|
}
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
$configJSON = file_get_contents(filename: $configFile);
|
$configJSON = file_get_contents(filename: $configFile);
|
||||||
|
|
||||||
if (json_decode(json: $configJSON) === null) {
|
if (json_decode(json: $configJSON) === null) {
|
||||||
|
@ -51,13 +36,19 @@ class ConfigController
|
||||||
|
|
||||||
$this->config = json_decode(json: $configJSON, associative: true);
|
$this->config = json_decode(json: $configJSON, associative: true);
|
||||||
|
|
||||||
$this->config['verbose'] = (bool)$verbose;
|
if ($verbose) {
|
||||||
$this->config['quiet'] = (bool)$quiet;
|
$this->config['verbose'] = true;
|
||||||
$this->config['test'] = (bool)$test;
|
} else {
|
||||||
|
$this->config['verbose'] = false;
|
||||||
|
}
|
||||||
|
if ($quiet) {
|
||||||
|
$this->config['quiet'] = true;
|
||||||
|
} else {
|
||||||
|
$this->config['quiet'] = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getConfig(string $configKey): string
|
public function getConfig(string $configKey): string {
|
||||||
{
|
|
||||||
return $this->config[$configKey];
|
return $this->config[$configKey];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,17 +22,17 @@ use UnhandledMatchError;
|
||||||
*/
|
*/
|
||||||
#[OAT\Info(version: '0.0.1', title: 'bindAPI')]
|
#[OAT\Info(version: '0.0.1', title: 'bindAPI')]
|
||||||
#[OAT\Server(
|
#[OAT\Server(
|
||||||
url: "{schema}://{hostname}/api",
|
url : "{schema}://{hostname}/api",
|
||||||
description: "The bindAPI URL.",
|
description: "The bindAPI URL.",
|
||||||
variables: [
|
variables : [
|
||||||
new OAT\ServerVariable(
|
new OAT\ServerVariable(
|
||||||
serverVariable: "schema",
|
serverVariable: "schema",
|
||||||
default: "https",
|
default : "https",
|
||||||
enum: ["https", "http"]
|
enum : ["https", "http"]
|
||||||
),
|
),
|
||||||
new OAT\ServerVariable(
|
new OAT\ServerVariable(
|
||||||
serverVariable: "hostname",
|
serverVariable: "hostname",
|
||||||
default: "ns2.24unix.net",
|
default : "ns2.24unix.net",
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)]
|
)]
|
||||||
|
@ -41,10 +41,10 @@ use UnhandledMatchError;
|
||||||
)]
|
)]
|
||||||
#[OAT\SecurityScheme(
|
#[OAT\SecurityScheme(
|
||||||
securityScheme: "Authorization",
|
securityScheme: "Authorization",
|
||||||
type: "apiKey",
|
type : "apiKey",
|
||||||
description: "description",
|
description : "description",
|
||||||
name: "X-API-Key",
|
name : "X-API-Key",
|
||||||
in: "header"
|
in : "header"
|
||||||
)]
|
)]
|
||||||
class RequestController
|
class RequestController
|
||||||
{
|
{
|
||||||
|
@ -63,8 +63,6 @@ class RequestController
|
||||||
* @param DomainRepository $domainRepository
|
* @param DomainRepository $domainRepository
|
||||||
* @param DynDNSRepository $dynDNSRepository
|
* @param DynDNSRepository $dynDNSRepository
|
||||||
* @param PanelRepository $panelRepository
|
* @param PanelRepository $panelRepository
|
||||||
* @param ConfigController $configController
|
|
||||||
* @param EncryptionController $encryptionController
|
|
||||||
* @param Logger $logger
|
* @param Logger $logger
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
|
@ -74,8 +72,6 @@ class RequestController
|
||||||
private readonly DomainRepository $domainRepository,
|
private readonly DomainRepository $domainRepository,
|
||||||
private readonly DynDNSRepository $dynDNSRepository,
|
private readonly DynDNSRepository $dynDNSRepository,
|
||||||
private readonly PanelRepository $panelRepository,
|
private readonly PanelRepository $panelRepository,
|
||||||
private readonly ConfigController $configController,
|
|
||||||
private readonly EncryptionController $encryptionController,
|
|
||||||
private readonly Logger $logger)
|
private readonly Logger $logger)
|
||||||
{
|
{
|
||||||
$this->status = '';
|
$this->status = '';
|
||||||
|
@ -88,29 +84,29 @@ class RequestController
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
#[OAT\Get(
|
#[OAT\Get(
|
||||||
path: '/domains',
|
path : '/domains',
|
||||||
operationId: 'getAllDomains',
|
operationId: 'getAllDomains',
|
||||||
description: 'Returns a list of all domains on this server.',
|
description: 'Returns a list of all domains on this server.',
|
||||||
summary: 'Listing all domains.',
|
summary : 'Listing all domains.',
|
||||||
// security: [
|
// security: [
|
||||||
// 'Authorization' => [
|
// 'Authorization' => [
|
||||||
//
|
//
|
||||||
// "read:api"
|
// "read:api"
|
||||||
// ]
|
// ]
|
||||||
// ],
|
// ],
|
||||||
servers: [],
|
servers : [],
|
||||||
tags: ['Domains'],
|
tags : ['Domains'],
|
||||||
responses: [
|
responses : [
|
||||||
new OAT\Response(
|
new OAT\Response(
|
||||||
response: 200,
|
response : 200,
|
||||||
description: 'OK'
|
description: 'OK'
|
||||||
),
|
),
|
||||||
new OAT\Response(
|
new OAT\Response(
|
||||||
response: 401,
|
response : 401,
|
||||||
description: 'API key is missing or invalid.'
|
description: 'API key is missing or invalid.'
|
||||||
),
|
),
|
||||||
new OAT\Response(
|
new OAT\Response(
|
||||||
response: 404,
|
response : 404,
|
||||||
description: 'Domain not found.'
|
description: 'Domain not found.'
|
||||||
)]
|
)]
|
||||||
)]
|
)]
|
||||||
|
@ -211,27 +207,27 @@ class RequestController
|
||||||
|
|
||||||
#[
|
#[
|
||||||
OAT\Get(
|
OAT\Get(
|
||||||
path: '/domains/{name}',
|
path : '/domains/{name}',
|
||||||
operationId: 'getSingleDomain',
|
operationId: 'getSingleDomain',
|
||||||
description: 'Returns information of a single domain specified by its domain name.',
|
description: 'Returns information of a single domain specified by its domain name.',
|
||||||
summary: 'Returns a single domain.',
|
summary : 'Returns a single domain.',
|
||||||
security: [
|
security : [
|
||||||
],
|
],
|
||||||
tags: ['Domains'],
|
tags : ['Domains'],
|
||||||
parameters: [
|
parameters : [
|
||||||
new OAT\Parameter(name: 'name', in: 'path', required: true, schema: new OAT\Schema(type: 'string')),
|
new OAT\Parameter(name: 'name', in: 'path', required: true, schema: new OAT\Schema(type: 'string')),
|
||||||
],
|
],
|
||||||
responses: [
|
responses : [
|
||||||
new OAT\Response(
|
new OAT\Response(
|
||||||
response: 200,
|
response : 200,
|
||||||
description: 'OK'
|
description: 'OK'
|
||||||
),
|
),
|
||||||
new OAT\Response(
|
new OAT\Response(
|
||||||
response: 401,
|
response : 401,
|
||||||
description: 'API key is missing or invalid.'
|
description: 'API key is missing or invalid.'
|
||||||
),
|
),
|
||||||
new OAT\Response(
|
new OAT\Response(
|
||||||
response: 404,
|
response : 404,
|
||||||
description: 'Domain not found.'
|
description: 'Domain not found.'
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
@ -300,11 +296,8 @@ class RequestController
|
||||||
} else {
|
} else {
|
||||||
[$prefix,] = explode(separator: '.', string: $apiKey);
|
[$prefix,] = explode(separator: '.', string: $apiKey);
|
||||||
if ($apiResult = $this->apikeyRepository->findByPrefix(prefix: $prefix)) {
|
if ($apiResult = $this->apikeyRepository->findByPrefix(prefix: $prefix)) {
|
||||||
$encryptedHash = $apiResult->getApikey();
|
$storedHash = $apiResult->getApiToken();
|
||||||
$encryptionKey = $this->configController->getConfig(configKey: 'encryptionKey');
|
if (!password_verify(password: $apiKey, hash: $storedHash)) {
|
||||||
$decryptedHash = $this->encryptionController->safeDecrypt(encrypted: $encryptedHash, key: $encryptionKey);
|
|
||||||
|
|
||||||
if (!password_verify(password: $apiKey, hash: $decryptedHash)) {
|
|
||||||
$this->status = "401 Unauthorized";
|
$this->status = "401 Unauthorized";
|
||||||
$this->message = "API key mismatch.";
|
$this->message = "API key mismatch.";
|
||||||
return false;
|
return false;
|
||||||
|
@ -539,19 +532,19 @@ class RequestController
|
||||||
if (!empty($panel->getAaaa())) {
|
if (!empty($panel->getAaaa())) {
|
||||||
$domainData = $this->apiController->sendCommand(
|
$domainData = $this->apiController->sendCommand(
|
||||||
requestType: 'GET',
|
requestType: 'GET',
|
||||||
serverName: $panel->getName(),
|
serverName : $panel->getName(),
|
||||||
versionIP: 6,
|
versionIP : 6,
|
||||||
apiKey: $panel->getApikey(),
|
apiKey : $panel->getApikey(),
|
||||||
command: 'domains/name/' . $domainName,
|
command : 'domains/name/' . $domainName,
|
||||||
serverType: 'panel');
|
serverType : 'panel');
|
||||||
} else {
|
} else {
|
||||||
$domainData = $this->apiController->sendCommand(
|
$domainData = $this->apiController->sendCommand(
|
||||||
requestType: 'GET',
|
requestType: 'GET',
|
||||||
serverName: $panel->getName(),
|
serverName : $panel->getName(),
|
||||||
versionIP: 4,
|
versionIP : 4,
|
||||||
apiKey: $panel->getApikey(),
|
apiKey : $panel->getApikey(),
|
||||||
command: 'domains/name/' . $domainName,
|
command : 'domains/name/' . $domainName,
|
||||||
serverType: 'panel');
|
serverType : 'panel');
|
||||||
}
|
}
|
||||||
|
|
||||||
$domainDecodedData = json_decode(json: $domainData['data']);
|
$domainDecodedData = json_decode(json: $domainData['data']);
|
||||||
|
@ -560,19 +553,19 @@ class RequestController
|
||||||
if (!empty($panel->getAaaa())) {
|
if (!empty($panel->getAaaa())) {
|
||||||
$dnsData = $this->apiController->sendCommand(
|
$dnsData = $this->apiController->sendCommand(
|
||||||
requestType: 'GET',
|
requestType: 'GET',
|
||||||
serverName: $panel->getName(),
|
serverName : $panel->getName(),
|
||||||
versionIP: 6,
|
versionIP : 6,
|
||||||
apiKey: $panel->getApikey(),
|
apiKey : $panel->getApikey(),
|
||||||
command: 'dns/' . $domainID,
|
command : 'dns/' . $domainID,
|
||||||
serverType: 'panel');
|
serverType : 'panel');
|
||||||
} else {
|
} else {
|
||||||
$dnsData = $this->apiController->sendCommand(
|
$dnsData = $this->apiController->sendCommand(
|
||||||
requestType: 'GET',
|
requestType: 'GET',
|
||||||
serverName: $panel->getName(),
|
serverName : $panel->getName(),
|
||||||
versionIP: 4,
|
versionIP : 4,
|
||||||
apiKey: $panel->getApikey(),
|
apiKey : $panel->getApikey(),
|
||||||
command: 'dns/' . $domainID,
|
command : 'dns/' . $domainID,
|
||||||
serverType: 'panel');
|
serverType : 'panel');
|
||||||
}
|
}
|
||||||
|
|
||||||
$dnsDataDecoded = json_decode(json: $dnsData['data']);
|
$dnsDataDecoded = json_decode(json: $dnsData['data']);
|
||||||
|
@ -609,22 +602,22 @@ class RequestController
|
||||||
if (!empty($panel->getAaaa())) {
|
if (!empty($panel->getAaaa())) {
|
||||||
$result = $this->apiController->sendCommand(
|
$result = $this->apiController->sendCommand(
|
||||||
requestType: 'PUT',
|
requestType: 'PUT',
|
||||||
serverName: $panel->getName(),
|
serverName : $panel->getName(),
|
||||||
versionIP: 6,
|
versionIP : 6,
|
||||||
apiKey: $panel->getApikey(),
|
apiKey : $panel->getApikey(),
|
||||||
command: 'dns/' . $domainID,
|
command : 'dns/' . $domainID,
|
||||||
serverType: 'panel',
|
serverType : 'panel',
|
||||||
body: json_decode(json: $newDnsData, associative: true)
|
body : json_decode(json: $newDnsData, associative: true)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$result = $this->apiController->sendCommand(
|
$result = $this->apiController->sendCommand(
|
||||||
requestType: 'PUT',
|
requestType: 'PUT',
|
||||||
serverName: $panel->getName(),
|
serverName : $panel->getName(),
|
||||||
versionIP: 4,
|
versionIP : 4,
|
||||||
apiKey: $panel->getApikey(),
|
apiKey : $panel->getApikey(),
|
||||||
command: 'dns/' . $domainID,
|
command : 'dns/' . $domainID,
|
||||||
serverType: 'panel',
|
serverType : 'panel',
|
||||||
body: json_decode(json: $newDnsData, associative: true)
|
body : json_decode(json: $newDnsData, associative: true)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($result['header'] == 200) {
|
if ($result['header'] == 200) {
|
||||||
|
|
|
@ -16,8 +16,8 @@ class Apikey
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private int $id = 0,
|
private int $id = 0,
|
||||||
private string $name = '',
|
private string $name = '',
|
||||||
private string $apikey = '',
|
private string $apiTokenPrefix = '',
|
||||||
private string $apikeyPrefix = '',
|
private string $apiToken = '',
|
||||||
private readonly string $passphrase = ''
|
private readonly string $passphrase = ''
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -27,39 +27,31 @@ class Apikey
|
||||||
|
|
||||||
$encryptionKey = $configController->getConfig(configKey: 'encryptionKey');
|
$encryptionKey = $configController->getConfig(configKey: 'encryptionKey');
|
||||||
|
|
||||||
$this->apikey = strtok(string: $this->passphrase, token: '.');
|
$this->apiTokenPrefix = strtok(string: $this->passphrase, token: '.');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->apikey = $encryptionController->safeEncrypt(message: $this->passphrase, key: $encryptionKey);
|
$this->apiToken = $encryptionController->safeEncrypt(message: $this->passphrase, key: $encryptionKey);
|
||||||
} catch (Exception|SodiumException $e) {
|
} catch (Exception|SodiumException $e) {
|
||||||
die($e->getMessage() . PHP_EOL);
|
die($e->getMessage() . PHP_EOL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getPassphrase(): string
|
|
||||||
{
|
|
||||||
return $this->passphrase;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
public function getApikey(): string
|
public function getApiToken(): string
|
||||||
{
|
{
|
||||||
return $this->apikey;
|
return $this->apiToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getApikeyPrefix(): string
|
public function getApiTokenPrefix(): string
|
||||||
{
|
{
|
||||||
return $this->apikeyPrefix;
|
return $this->apiTokenPrefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -88,19 +80,19 @@ class Apikey
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $apikeyPrefix
|
* @param string $apiTokenPrefix
|
||||||
*/
|
*/
|
||||||
public function setApikeyPrefix(string $apikeyPrefix): void
|
public function setApiTokenPrefix(string $apiTokenPrefix): void
|
||||||
{
|
{
|
||||||
$this->apikeyPrefix = $apikeyPrefix;
|
$this->apiTokenPrefix = $apiTokenPrefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param String $apiToken
|
* @param String $apiToken
|
||||||
*/
|
*/
|
||||||
public function setApikey(string $apikey): void
|
public function setApiToken(string $apiToken): void
|
||||||
{
|
{
|
||||||
$this->apikey = $apikey;
|
$this->apiToken = $apiToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ class DynDNS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
public function __construct(private string $name, private string $a = '', private string $aaaa = '', private $password = '', private int $id = 0)
|
public function __construct(private string $name, private string $a, private string $aaaa, private $password = '', private int $id = 0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue