- Updated class \ncc\Objects > CliHelpSection to use method calls rather than direct property access

- Updated class `\ncc\Objects > ComposerJson` to use method calls rather than direct property access
 - Updated class `\ncc\Objects > ComposerLock` to use method calls rather than direct property access
 - Updated class `\ncc\Objects > DefinedRemoteSource` to use method calls rather than direct property access
 - Updated class `\ncc\Objects > HttpRequest` to use method calls rather than direct property access and implemented
   `SerializableObjectInterface`
 - Updated class `\ncc\Objects > HttpResponse` to use method calls rather than direct property access and implemented
   `SerializableObjectInterface`
 - Fixed hash comparisons to use `hash_equals` implementations to combat against Timing Attacks
This commit is contained in:
Netkas 2023-08-28 22:54:54 -04:00
parent eeffb15eb7
commit 42c26c92a0
No known key found for this signature in database
GPG key ID: 5DAF58535614062B
16 changed files with 1338 additions and 363 deletions

View file

@ -25,6 +25,7 @@ features and reduced the number of exceptions down to 15 exceptions.
### Fixed ### Fixed
- Fixed MITM attack vector in `\ncc\Classes > HttpClient > prepareCurl()` - Fixed MITM attack vector in `\ncc\Classes > HttpClient > prepareCurl()`
- Fixed all @throw tags in the project to use the correct exception class - Fixed all @throw tags in the project to use the correct exception class
- Fixed hash comparisons to use `hash_equals` implementations to combat against Timing Attacks
### Changed ### Changed
- Corrected code-smell and code style issues in `\ncc\Classes > HttpClient` - Corrected code-smell and code style issues in `\ncc\Classes > HttpClient`
@ -177,6 +178,14 @@ features and reduced the number of exceptions down to 15 exceptions.
and implemented `BytecodeObjectInterface` and implemented `BytecodeObjectInterface`
- Updated class `\ncc\Objects\SymlinkDictionary > SymlinkEntry` to use method calls rather than direct property access - Updated class `\ncc\Objects\SymlinkDictionary > SymlinkEntry` to use method calls rather than direct property access
- Updated class `\ncc\Objects\Vault\Password > AccessToken` to use method calls rather than direct property access - Updated class `\ncc\Objects\Vault\Password > AccessToken` to use method calls rather than direct property access
- Updated class `\ncc\Objects > CliHelpSection` to use method calls rather than direct property access
- Updated class `\ncc\Objects > ComposerJson` to use method calls rather than direct property access
- Updated class `\ncc\Objects > ComposerLock` to use method calls rather than direct property access
- Updated class `\ncc\Objects > DefinedRemoteSource` to use method calls rather than direct property access
- Updated class `\ncc\Objects > HttpRequest` to use method calls rather than direct property access and implemented
`SerializableObjectInterface`
- Updated class `\ncc\Objects > HttpResponse` to use method calls rather than direct property access and implemented
`SerializableObjectInterface`
### Removed ### Removed
- Removed `FileNotFoundException` and `DirectoryNotFoundException` from `\ncc\Exceptions` - Removed `FileNotFoundException` and `DirectoryNotFoundException` from `\ncc\Exceptions`

View file

@ -866,7 +866,7 @@
try try
{ {
$definedEntry = DefinedRemoteSource::fromArray(Functions::loadJsonFile($repo_path, Functions::FORCE_ARRAY)); $definedEntry = DefinedRemoteSource::fromArray(Functions::loadJsonFile($repo_path, Functions::FORCE_ARRAY));
if(!$source_manager->getRemoteSource($definedEntry->name)) if(!$source_manager->getRemoteSource($definedEntry->getName()))
$source_manager->addRemoteSource($definedEntry); $source_manager->addRemoteSource($definedEntry);
} }
catch(Exception $e) catch(Exception $e)

View file

@ -105,7 +105,7 @@ namespace ncc\CLI\Management;
Console::out('Remote sources:', 1); Console::out('Remote sources:', 1);
foreach($sources as $source) foreach($sources as $source)
{ {
Console::out(' - ' . $source->name . ' (' . $source->host . ')', 1); Console::out(' - ' . $source->getName() . ' (' . $source->getHost() . ')', 1);
} }
Console::out('Total: ' . count($sources), 1); Console::out('Total: ' . count($sources), 1);
@ -153,10 +153,10 @@ namespace ncc\CLI\Management;
$source_manager = new RemoteSourcesManager(); $source_manager = new RemoteSourcesManager();
$source = new DefinedRemoteSource(); $source = new DefinedRemoteSource();
$source->name = $name; $source->setName($name);
$source->type = $type; $source->setType($type);
$source->host = $host; $source->setHost($host);
$source->ssl = $ssl; $source->setSsl($ssl);
if(!$source_manager->addRemoteSource($source)) if(!$source_manager->addRemoteSource($source))
{ {

View file

@ -212,15 +212,15 @@
$filesystem->mkdir($base_dir . DIRECTORY_SEPARATOR . 'build'); $filesystem->mkdir($base_dir . DIRECTORY_SEPARATOR . 'build');
$version_map = self::getVersionMap($composer_lock); $version_map = self::getVersionMap($composer_lock);
foreach ($composer_lock->Packages as $package) foreach ($composer_lock->getPackages() as $package)
{ {
$package_path = $base_dir . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . $package->name; $package_path = $base_dir . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . $package->getName();
// Load the composer lock file // Load the composer lock file
$composer_package = $composer_lock->getPackage($package->name); $composer_package = $composer_lock->getPackage($package->getName());
if ($composer_package === null) if ($composer_package === null)
{ {
throw new PackageException(sprintf('Package "%s" not found in composer lock file', $package->name)); throw new PackageException(sprintf('Package "%s" not found in composer lock file', $package->getName()));
} }
// Convert it to an NCC project configuration // Convert it to an NCC project configuration
@ -250,9 +250,9 @@
private static function getVersionMap(ComposerLock $composerLock): array private static function getVersionMap(ComposerLock $composerLock): array
{ {
$version_map = []; $version_map = [];
foreach($composerLock->Packages as $package) foreach($composerLock->getPackges() as $package)
{ {
$version_map[$package->name] = $package->version; $version_map[$package->getName()] = $package->getVersion();
} }
return $version_map; return $version_map;
} }
@ -310,20 +310,12 @@
{ {
// Generate a new project configuration object // Generate a new project configuration object
$project_configuration = new ProjectConfiguration(); $project_configuration = new ProjectConfiguration();
$project_configuration->assembly->setName($composer_package->getName());
$project_configuration->assembly->setDescription($composer_package->getDescription());
if (isset($composer_package->name)) if(isset($version_map[$composer_package->getName()]))
{ {
$project_configuration->assembly->setName($composer_package->name); $project_configuration->assembly->setVersion(self::versionMap($composer_package->getName(), $version_map));
}
if (isset($composer_package->description))
{
$project_configuration->assembly->setDescription($composer_package->description);
}
if(isset($version_map[$composer_package->name]))
{
$project_configuration->assembly->setVersion(self::versionMap($composer_package->name, $version_map));
} }
if($project_configuration->assembly->getVersion() === null || $project_configuration->assembly->getVersion() === '') if($project_configuration->assembly->getVersion() === null || $project_configuration->assembly->getVersion() === '')
@ -333,17 +325,17 @@
$project_configuration->assembly->setUuid(Uuid::v1()->toRfc4122()); $project_configuration->assembly->setUuid(Uuid::v1()->toRfc4122());
$project_configuration->assembly->setPackage(self::toPackageName($composer_package->name)); $project_configuration->assembly->setPackage(self::toPackageName($composer_package->getName()));
// Add the update source // Add the update source
$project_configuration->project->setUpdateSource(new ProjectConfiguration\UpdateSource()); $project_configuration->project->setUpdateSource(new ProjectConfiguration\UpdateSource());
$project_configuration->project->getUpdateSource()?->setSource(sprintf('%s@composer', str_ireplace('\\', '/', $composer_package->name))); $project_configuration->project->getUpdateSource()?->setSource(sprintf('%s@composer', str_ireplace('\\', '/', $composer_package->getName())));
$project_configuration->project->getUpdateSource()?->setRepository(null); $project_configuration->project->getUpdateSource()?->setRepository(null);
// Process the dependencies // Process the dependencies
if($composer_package->require !== null && count($composer_package->require) > 0) if($composer_package->getRequire() !== null && count($composer_package->getRequire()) > 0)
{ {
foreach ($composer_package->require as $item) foreach ($composer_package->getRequire() as $item)
{ {
// Check if the dependency is already in the project configuration // Check if the dependency is already in the project configuration
$package_name = self::toPackageName($item->getPackageName()); $package_name = self::toPackageName($item->getPackageName());
@ -674,7 +666,7 @@
$filesystem = new Filesystem(); $filesystem = new Filesystem();
// Process the source files // Process the source files
if ($composer_package->autoload !== null) if ($composer_package->getAutoload() !== null)
{ {
$source_directory = $package_path . DIRECTORY_SEPARATOR . '.src'; $source_directory = $package_path . DIRECTORY_SEPARATOR . '.src';
@ -688,10 +680,10 @@
$static_files = []; $static_files = [];
// Extract all the source directories // Extract all the source directories
if ($composer_package->autoload->getPsr4() !== null && count($composer_package->autoload->getPsr4()) > 0) if ($composer_package->getAutoloadDev()->getPsr4() !== null && count($composer_package->getAutoload()->getPsr4()) > 0)
{ {
Console::outVerbose('Extracting PSR-4 source directories'); Console::outVerbose('Extracting PSR-4 source directories');
foreach ($composer_package->autoload->getPsr4() as $namespace_pointer) foreach ($composer_package->getAutoload()->getPsr4() as $namespace_pointer)
{ {
if ($namespace_pointer->getPath() !== null && !in_array($namespace_pointer->getPath(), $source_directories, true)) if ($namespace_pointer->getPath() !== null && !in_array($namespace_pointer->getPath(), $source_directories, true))
{ {
@ -700,10 +692,10 @@
} }
} }
if ($composer_package->autoload->getPsr0() !== null && count($composer_package->autoload->getPsr0()) > 0) if ($composer_package->getAutoload()->getPsr0() !== null && count($composer_package->getAutoload()->getPsr0()) > 0)
{ {
Console::outVerbose('Extracting PSR-0 source directories'); Console::outVerbose('Extracting PSR-0 source directories');
foreach ($composer_package->autoload->getPsr0() as $namespace_pointer) foreach ($composer_package->getAutoload()->getPsr0() as $namespace_pointer)
{ {
if ($namespace_pointer->getPath() !== null && !in_array($namespace_pointer->getPath(), $source_directories, true)) if ($namespace_pointer->getPath() !== null && !in_array($namespace_pointer->getPath(), $source_directories, true))
{ {
@ -712,10 +704,10 @@
} }
} }
if ($composer_package->autoload->getFiles() !== null && count($composer_package->autoload->getFiles()) > 0) if ($composer_package->getAutoload()->getFiles() !== null && count($composer_package->getAutoload()->getFiles()) > 0)
{ {
Console::outVerbose('Extracting static files'); Console::outVerbose('Extracting static files');
foreach ($composer_package->autoload->getFiles() as $file) foreach ($composer_package->getAutoload()->getFiles() as $file)
{ {
$static_files[] = $package_path . DIRECTORY_SEPARATOR . $file; $static_files[] = $package_path . DIRECTORY_SEPARATOR . $file;
} }
@ -751,7 +743,7 @@
$parsed_path = str_ireplace($package_path . DIRECTORY_SEPARATOR, '', $item->getPathName()); $parsed_path = str_ireplace($package_path . DIRECTORY_SEPARATOR, '', $item->getPathName());
Console::outDebug(sprintf('copying file %s for package %s', $parsed_path, $composer_package->name)); Console::outDebug(sprintf('copying file %s for package %s', $parsed_path, $composer_package->getName()));
$filesystem->copy($item->getPathName(), $source_directory . DIRECTORY_SEPARATOR . $parsed_path); $filesystem->copy($item->getPathName(), $source_directory . DIRECTORY_SEPARATOR . $parsed_path);
} }
} }
@ -763,7 +755,7 @@
foreach ($static_files as $file) foreach ($static_files as $file)
{ {
$parsed_path = str_ireplace($package_path . DIRECTORY_SEPARATOR, '', $file); $parsed_path = str_ireplace($package_path . DIRECTORY_SEPARATOR, '', $file);
Console::outDebug(sprintf('copying file %s for package %s', $parsed_path, $composer_package->name)); Console::outDebug(sprintf('copying file %s for package %s', $parsed_path, $composer_package->getName()));
$filesystem->copy($file, $source_directory . DIRECTORY_SEPARATOR . $parsed_path); $filesystem->copy($file, $source_directory . DIRECTORY_SEPARATOR . $parsed_path);
unset($file); unset($file);
} }
@ -789,16 +781,16 @@
// Check configuration if composer.extension.display_licenses is set // Check configuration if composer.extension.display_licenses is set
if($filesystem->exists($package_path . DIRECTORY_SEPARATOR . $license_file) && Functions::cbool(Functions::getConfigurationProperty('composer.extension.display_licenses'))) if($filesystem->exists($package_path . DIRECTORY_SEPARATOR . $license_file) && Functions::cbool(Functions::getConfigurationProperty('composer.extension.display_licenses')))
{ {
Console::out(sprintf('License for package %s:', $composer_package->name)); Console::out(sprintf('License for package %s:', $composer_package->getName()));
Console::out(IO::fread($package_path . DIRECTORY_SEPARATOR . $license_file)); Console::out(IO::fread($package_path . DIRECTORY_SEPARATOR . $license_file));
break; break;
} }
} }
if(Functions::cbool(!is_null($composer_package->authors) && count($composer_package->authors) > 0 && Functions::getConfigurationProperty('composer.extension.display_authors'))) if(Functions::cbool(!is_null($composer_package->getAuthors()) && count($composer_package->getAuthors()) > 0 && Functions::getConfigurationProperty('composer.extension.display_authors')))
{ {
Console::out(sprintf('Authors for package %s:', $composer_package->name)); Console::out(sprintf('Authors for package %s:', $composer_package->getName()));
foreach($composer_package->authors as $author) foreach($composer_package->getAuthors() as $author)
{ {
Console::out(sprintf(' - %s', $author->getName())); Console::out(sprintf(' - %s', $author->getName()));

View file

@ -55,11 +55,11 @@
public static function getGitRepository(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): RepositoryQueryResults public static function getGitRepository(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): RepositoryQueryResults
{ {
$httpRequest = new HttpRequest(); $httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->ssl ? "https" : "http"); $protocol = ($definedRemoteSource->isSsl() ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $packageInput->vendor); $owner_f = str_ireplace("/", "%2F", $packageInput->vendor);
$owner_f = str_ireplace(".", "%2F", $owner_f); $owner_f = str_ireplace(".", "%2F", $owner_f);
$repository = urlencode($packageInput->package); $repository = urlencode($packageInput->package);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->host . "/repos/$owner_f/$repository"; $httpRequest->setUrl($protocol . '://' . $definedRemoteSource->getHost() . "/repos/$owner_f/$repository");
$response_decoded = self::getJsonResponse($httpRequest, $entry); $response_decoded = self::getJsonResponse($httpRequest, $entry);
$query = new RepositoryQueryResults(); $query = new RepositoryQueryResults();
@ -119,11 +119,11 @@
private static function getReleases(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): array private static function getReleases(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): array
{ {
$httpRequest = new HttpRequest(); $httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->ssl ? "https" : "http"); $protocol = ($definedRemoteSource->isSsl() ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $packageInput->vendor); $owner_f = str_ireplace("/", "%2F", $packageInput->vendor);
$owner_f = str_ireplace(".", "%2F", $owner_f); $owner_f = str_ireplace(".", "%2F", $owner_f);
$repository = urlencode($packageInput->package); $repository = urlencode($packageInput->package);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->host . "/repos/$owner_f/$repository/releases"; $httpRequest->setUrl($protocol . '://' . $definedRemoteSource->getHost() . "/repos/$owner_f/$repository/releases");
$response_decoded = self::getJsonResponse($httpRequest, $entry); $response_decoded = self::getJsonResponse($httpRequest, $entry);
if(count($response_decoded) === 0) if(count($response_decoded) === 0)
@ -190,19 +190,19 @@
*/ */
private static function getJsonResponse(HttpRequest $httpRequest, ?Entry $entry): array private static function getJsonResponse(HttpRequest $httpRequest, ?Entry $entry): array
{ {
$httpRequest->Type = HttpRequestType::GET; $httpRequest->setType(HttpRequestType::GET);
$httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry, false); $httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry, false);
$httpRequest->Headers[] = 'X-GitHub-Api-Version: 2022-11-28'; $httpRequest->addHeader('X-GitHub-Api-Version: 2022-11-28');
$httpRequest->Headers[] = 'Accept: application/vnd.github+json'; $httpRequest->addHeader('Accept: application/vnd.github+json');
$response = HttpClient::request($httpRequest, true); $response = HttpClient::request($httpRequest, true);
if ($response->StatusCode !== 200) if ($response->getStatusCode() !== 200)
{ {
throw new GitException(sprintf('Github returned an error (%s): %s', $response->StatusCode, $response->Body)); throw new GitException(sprintf('Github returned an error (%s): %s', $response->getStatusCode(), $response->getBody()));
} }
return Functions::loadJson($response->Body, Functions::FORCE_ARRAY); return Functions::loadJson($response->getBody(), Functions::FORCE_ARRAY);
} }
/** /**
@ -221,7 +221,7 @@
if (count($releases) === 0) if (count($releases) === 0)
{ {
throw new GitException(sprintf('No releases found for %s/%s on %s.', $packageInput->vendor, $packageInput->package, $definedRemoteSource->host)); throw new GitException(sprintf('No releases found for %s/%s on %s.', $packageInput->vendor, $packageInput->package, $definedRemoteSource->getHost()));
} }
if ($packageInput->version === Versions::LATEST) if ($packageInput->version === Versions::LATEST)
@ -265,7 +265,7 @@
if ($selected_version === null) if ($selected_version === null)
{ {
throw new GitException(sprintf('Version %s not found for %s/%s on %s.', $packageInput->version, $packageInput->vendor, $packageInput->package, $definedRemoteSource->host)); throw new GitException(sprintf('Version %s not found for %s/%s on %s.', $packageInput->version, $packageInput->vendor, $packageInput->package, $definedRemoteSource->getHost()));
} }
} }
else else
@ -275,7 +275,7 @@
if (!isset($releases[$selected_version])) if (!isset($releases[$selected_version]))
{ {
throw new GitException(sprintf('Version %s not found for %s/%s on %s.', $packageInput->version, $packageInput->vendor, $packageInput->package, $definedRemoteSource->host)); throw new GitException(sprintf('Version %s not found for %s/%s on %s.', $packageInput->version, $packageInput->vendor, $packageInput->package, $definedRemoteSource->getHost()));
} }
return $releases[$selected_version]; return $releases[$selected_version];

View file

@ -56,22 +56,22 @@
public static function getGitRepository(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry=null): RepositoryQueryResults public static function getGitRepository(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry=null): RepositoryQueryResults
{ {
$httpRequest = new HttpRequest(); $httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->ssl ? "https" : "http"); $protocol = ($definedRemoteSource->isSsl() ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $packageInput->vendor); $owner_f = str_ireplace("/", "%2F", $packageInput->vendor);
$owner_f = str_ireplace(".", "%2F", $owner_f); $owner_f = str_ireplace(".", "%2F", $owner_f);
$project_f = str_ireplace("/", "%2F", $packageInput->package); $project_f = str_ireplace("/", "%2F", $packageInput->package);
$project_f = str_ireplace(".", "%2F", $project_f); $project_f = str_ireplace(".", "%2F", $project_f);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->host . "/api/v4/projects/$owner_f%2F$project_f"; $httpRequest->setUrl($protocol . '://' . $definedRemoteSource->getHost() . "/api/v4/projects/$owner_f%2F$project_f");
$httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry); $httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry);
$response = HttpClient::request($httpRequest, true); $response = HttpClient::request($httpRequest, true);
if($response->StatusCode !== 200) if($response->getStatusCode() !== 200)
{ {
throw new GitException(sprintf('Failed to fetch releases for the given repository. Status code: %s', $response->StatusCode)); throw new GitException(sprintf('Failed to fetch releases for the given repository. Status code: %s', $response->getStatusCode()));
} }
$response_decoded = Functions::loadJson($response->Body, Functions::FORCE_ARRAY); $response_decoded = Functions::loadJson($response->getBody(), Functions::FORCE_ARRAY);
$query = new RepositoryQueryResults(); $query = new RepositoryQueryResults();
$query->Files->GitSshUrl = ($response_decoded['ssh_url_to_repo'] ?? null); $query->Files->GitSshUrl = ($response_decoded['ssh_url_to_repo'] ?? null);
@ -171,7 +171,7 @@
*/ */
public static function getNccPackage(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): RepositoryQueryResults public static function getNccPackage(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): RepositoryQueryResults
{ {
throw new NotSupportedException(sprintf('The given repository source "%s" does not support ncc packages.', $definedRemoteSource->host)); throw new NotSupportedException(sprintf('The given repository source "%s" does not support ncc packages.', $definedRemoteSource->getHost()));
} }
/** /**
@ -190,23 +190,23 @@
private static function getReleases(string $owner, string $repository, DefinedRemoteSource $definedRemoteSource, ?Entry $entry): array private static function getReleases(string $owner, string $repository, DefinedRemoteSource $definedRemoteSource, ?Entry $entry): array
{ {
$httpRequest = new HttpRequest(); $httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->ssl ? "https" : "http"); $protocol = ($definedRemoteSource->isSsl() ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $owner); $owner_f = str_ireplace("/", "%2F", $owner);
$owner_f = str_ireplace(".", "%2F", $owner_f); $owner_f = str_ireplace(".", "%2F", $owner_f);
$repository_f = str_ireplace("/", "%2F", $repository); $repository_f = str_ireplace("/", "%2F", $repository);
$repository_f = str_ireplace(".", "%2F", $repository_f); $repository_f = str_ireplace(".", "%2F", $repository_f);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->host . "/api/v4/projects/$owner_f%2F$repository_f/releases"; $httpRequest->setUrl($protocol . '://' . $definedRemoteSource->getHost() . "/api/v4/projects/$owner_f%2F$repository_f/releases");
$httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry); $httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry);
$response = HttpClient::request($httpRequest, true); $response = HttpClient::request($httpRequest, true);
if($response->StatusCode !== 200) if($response->getStatusCode() !== 200)
{ {
throw new GitException(sprintf('Failed to fetch releases for repository %s/%s. Status code: %s', $owner, $repository, $response->StatusCode)); throw new GitException(sprintf('Failed to fetch releases for repository %s/%s. Status code: %s', $owner, $repository, $response->getStatusCode()));
} }
$response_decoded = Functions::loadJson($response->Body, Functions::FORCE_ARRAY); $response_decoded = Functions::loadJson($response->getBody(), Functions::FORCE_ARRAY);
if(count($response_decoded) === 0) if(count($response_decoded) === 0)
{ {

View file

@ -43,15 +43,15 @@ namespace ncc\Classes;
*/ */
private static function prepareCurl(HttpRequest $request): CurlHandle private static function prepareCurl(HttpRequest $request): CurlHandle
{ {
$curl = curl_init($request->Url); $curl = curl_init($request->geturl());
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true); curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_MAXREDIRS, 5); curl_setopt($curl, CURLOPT_MAXREDIRS, 5);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_HTTPHEADER, $request->Headers); curl_setopt($curl, CURLOPT_HTTPHEADER, $request->getHeaders());
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->Type); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getType());
curl_setopt($curl, CURLOPT_NOPROGRESS, false); curl_setopt($curl, CURLOPT_NOPROGRESS, false);
curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, static function($curl, $downloadSize, $downloaded) curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, static function($curl, $downloadSize, $downloaded)
@ -73,7 +73,7 @@ namespace ncc\Classes;
} }
}); });
switch($request->Type) switch($request->getType())
{ {
case HttpRequestType::GET: case HttpRequestType::GET:
curl_setopt($curl, CURLOPT_HTTPGET, true); curl_setopt($curl, CURLOPT_HTTPGET, true);
@ -81,17 +81,17 @@ namespace ncc\Classes;
case HttpRequestType::POST: case HttpRequestType::POST:
curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POST, true);
if($request->Body !== null) if($request->getBody() !== null)
{ {
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->Body); curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getBody());
} }
break; break;
case HttpRequestType::PUT: case HttpRequestType::PUT:
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
if($request->Body !== null) if($request->getBody() !== null)
{ {
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->Body); curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getBody());
} }
break; break;
@ -100,16 +100,16 @@ namespace ncc\Classes;
break; break;
} }
if (is_array($request->Authentication)) if (is_array($request->getAuthentication()))
{ {
curl_setopt($curl, CURLOPT_USERPWD, $request->Authentication[0] . ':' . $request->Authentication[1]); curl_setopt($curl, CURLOPT_USERPWD, $request->getAuthentication()[0] . ':' . $request->getAuthentication()[1]);
} }
else if (is_string($request->Authentication)) else if (is_string($request->getAuthentication()))
{ {
curl_setopt($curl, CURLOPT_USERPWD, $request->Authentication); curl_setopt($curl, CURLOPT_USERPWD, $request->getAuthentication());
} }
foreach ($request->Options as $option => $value) foreach ($request->getOptions() as $option => $value)
{ {
curl_setopt($curl, $option, $value); curl_setopt($curl, $option, $value);
} }
@ -140,16 +140,16 @@ namespace ncc\Classes;
$curl = self::prepareCurl($httpRequest); $curl = self::prepareCurl($httpRequest);
Console::outDebug(sprintf(' => %s request %s', $httpRequest->Type, $httpRequest->Url)); Console::outDebug(sprintf(' => %s request %s', $httpRequest->getType(), $httpRequest->getUrl()));
if($httpRequest->Headers !== null && count($httpRequest->Headers) > 0) if(count($httpRequest->getHeaders()) > 0)
{ {
Console::outDebug(sprintf(' => headers: %s', implode(', ', $httpRequest->Headers))); Console::outDebug(sprintf(' => headers: %s', implode(', ', $httpRequest->getHeaders())));
} }
if($httpRequest->Body !== null) if($httpRequest->getBody() !== null)
{ {
Console::outDebug(sprintf(' => body: %s', $httpRequest->Body)); Console::outDebug(sprintf(' => body: %s', $httpRequest->getBody()));
} }
$response = curl_exec($curl); $response = curl_exec($curl);
@ -166,13 +166,13 @@ namespace ncc\Classes;
$body = substr($response, $headerSize); $body = substr($response, $headerSize);
$httpResponse = new HttpResponse(); $httpResponse = new HttpResponse();
$httpResponse->StatusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); $httpResponse->setStatusCode(curl_getinfo($curl, CURLINFO_HTTP_CODE));
$httpResponse->Headers = self::parseHeaders($headers); $httpResponse->setHeaders(self::parseHeaders($headers));
$httpResponse->Body = $body; $httpResponse->setBody($body);
Console::outDebug(sprintf(' <= %s response', $httpResponse->StatusCode)); Console::outDebug(sprintf(' <= %s response', $httpResponse->getStatusCode()));
Console::outDebug(sprintf(' <= headers: %s', (implode(', ', $httpResponse->Headers)))); Console::outDebug(sprintf(' <= headers: %s', (implode(', ', $httpResponse->getHeaders()))));
Console::outDebug(sprintf(' <= body: %s', $httpResponse->Body)); Console::outDebug(sprintf(' <= body: %s', $httpResponse->getBody()));
curl_close($curl); curl_close($curl);

View file

@ -423,10 +423,10 @@
Console::outVerbose('Adding remote source ' . $package->header->getUpdateSource()->getRepository()->getName()); Console::outVerbose('Adding remote source ' . $package->header->getUpdateSource()->getRepository()->getName());
$defined_remote_source = new DefinedRemoteSource(); $defined_remote_source = new DefinedRemoteSource();
$defined_remote_source->name = $package->header->getUpdateSource()?->getRepository()->getName(); $defined_remote_source->setName($package->header->getUpdateSource()?->getRepository()?->getName());
$defined_remote_source->host = $package->header->getUpdateSource()?->getRepository()->getHost(); $defined_remote_source->setHost($package->header->getUpdateSource()?->getRepository()?->getHost());
$defined_remote_source->type = $package->header->getUpdateSource()?->getRepository()->getType(); $defined_remote_source->setType($package->header->getUpdateSource()?->getRepository()?->getType());
$defined_remote_source->ssl = $package->header->getUpdateSource()?->getRepository()->isSsl(); $defined_remote_source->setSsl($package->header->getUpdateSource()?->getRepository()?->isSsl());
$sources_manager->addRemoteSource($defined_remote_source); $sources_manager->addRemoteSource($defined_remote_source);
} }

View file

@ -109,8 +109,10 @@
{ {
foreach($this->Sources as $existingSource) foreach($this->Sources as $existingSource)
{ {
if($existingSource->name === $source->name) if($existingSource->getName() === $source->getName())
{
return false; return false;
}
} }
$this->Sources[] = $source; $this->Sources[] = $source;
@ -127,7 +129,7 @@
{ {
foreach($this->Sources as $source) foreach($this->Sources as $source)
{ {
if($source->name === $name) if($source->getName() === $name)
{ {
return $source; return $source;
} }
@ -146,7 +148,7 @@
{ {
foreach($this->Sources as $index => $source) foreach($this->Sources as $index => $source)
{ {
if($source->name === $name) if($source->getName() === $name)
{ {
unset($this->Sources[$index]); unset($this->Sources[$index]);
return true; return true;

View file

@ -1,24 +1,24 @@
<?php <?php
/* /*
* Copyright (c) Nosial 2022-2023, all rights reserved. * Copyright (c) Nosial 2022-2023, all rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without * associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following * Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions: * conditions:
* *
* The above copyright notice and this permission notice shall be included in all copies or substantial portions * The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software. * of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
* *
*/ */
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
@ -34,21 +34,21 @@
* *
* @var array|null * @var array|null
*/ */
public $Parameters; private $parameters;
/** /**
* A description of the option * A description of the option
* *
* @var string|null * @var string|null
*/ */
public $Description; private $description;
/** /**
* The default value of the option * The default value of the option
* *
* @var string|null * @var string|null
*/ */
public $Default; private $default;
/** /**
* Public Constructor * Public Constructor
@ -59,9 +59,57 @@
*/ */
public function __construct(?array $parameters=null, ?string $description=null, ?string $default=null) public function __construct(?array $parameters=null, ?string $description=null, ?string $default=null)
{ {
$this->Parameters = $parameters; $this->parameters = $parameters;
$this->Description = $description; $this->description = $description;
$this->Default = $default; $this->default = $default;
}
/**
* @return array|null
*/
public function getParameters(): ?array
{
return $this->parameters;
}
/**
* @param array|null $parameters
*/
public function setParameters(?array $parameters): void
{
$this->parameters = $parameters;
}
/**
* @return string|null
*/
public function getDescription(): ?string
{
return $this->description;
}
/**
* @param string|null $description
*/
public function setDescription(?string $description): void
{
$this->description = $description;
}
/**
* @return string|null
*/
public function getDefault(): ?string
{
return $this->default;
}
/**
* @param string|null $default
*/
public function setDefault(?string $default): void
{
$this->default = $default;
} }
/** /**
@ -72,9 +120,9 @@
public function toArray(): array public function toArray(): array
{ {
return [ return [
'parameters' => $this->Parameters, 'parameters' => $this->parameters,
'description' => $this->Description, 'description' => $this->description,
'default' => $this->Default 'default' => $this->default
]; ];
} }
@ -90,17 +138,17 @@
if(isset($data['parameters'])) if(isset($data['parameters']))
{ {
$object->Parameters = $data['parameters']; $object->parameters = $data['parameters'];
} }
if(isset($data['description'])) if(isset($data['description']))
{ {
$object->Description = $data['description']; $object->description = $data['description'];
} }
if(isset($data['default'])) if(isset($data['default']))
{ {
$object->Default = $data['default']; $object->default = $data['default'];
} }
return $object; return $object;
@ -117,12 +165,12 @@
{ {
$out = []; $out = [];
if(count($this->Parameters) > 0) if(count($this->parameters) > 0)
{ {
if($param_padding > 0) if($param_padding > 0)
{ {
/** @noinspection PhpRedundantOptionalArgumentInspection */ /** @noinspection PhpRedundantOptionalArgumentInspection */
$result = str_pad(implode(' ', $this->Parameters), $param_padding, ' ', STR_PAD_RIGHT); $result = str_pad(implode(' ', $this->parameters), $param_padding, ' ', STR_PAD_RIGHT);
if(!$basic) if(!$basic)
{ {
@ -133,22 +181,22 @@
} }
elseif($basic) elseif($basic)
{ {
$out[] .= implode(' ', $this->Parameters); $out[] .= implode(' ', $this->parameters);
} }
else else
{ {
$out[] .= Console::formatColor(implode(' ', $this->Parameters), ConsoleColors::GREEN); $out[] .= Console::formatColor(implode(' ', $this->parameters), ConsoleColors::GREEN);
} }
} }
if($this->Description !== null) if($this->description !== null)
{ {
$out[] = $this->Description; $out[] = $this->description;
} }
if($this->Default !== null) if($this->default !== null)
{ {
$out[] = '(Default: ' . $this->Default . ')'; $out[] = '(Default: ' . $this->default . ')';
} }
return implode(' ', $out); return implode(' ', $out);

View file

@ -1,24 +1,24 @@
<?php <?php
/* /*
* Copyright (c) Nosial 2022-2023, all rights reserved. * Copyright (c) Nosial 2022-2023, all rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without * associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following * Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions: * conditions:
* *
* The above copyright notice and this permission notice shall be included in all copies or substantial portions * The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software. * of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
* *
*/ */
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
@ -40,7 +40,7 @@
* *
* @var string * @var string
*/ */
public $name; private $name;
/** /**
* A short description of the package. Usually * A short description of the package. Usually
@ -48,7 +48,7 @@
* *
* @var string * @var string
*/ */
public $description; private $description;
/** /**
* The version of the package, in most cases this is not * The version of the package, in most cases this is not
@ -60,14 +60,14 @@
* *
* @var string|null * @var string|null
*/ */
public $version; private $version;
/** /**
* The type of package, it defaults to library * The type of package, it defaults to library
* *
* @var string * @var string
*/ */
public $type; private $type;
/** /**
* An array of keywords that the package is related to. * An array of keywords that the package is related to.
@ -82,21 +82,21 @@
* *
* @var string[] * @var string[]
*/ */
public $keywords; private $keywords;
/** /**
* A URL to the website of the project * A URL to the website of the project
* *
* @var string|null * @var string|null
*/ */
public $homepage; private $homepage;
/** /**
* A relative path to the readme document * A relative path to the readme document
* *
* @var string|null * @var string|null
*/ */
public $readme; private $readme;
/** /**
* Release date of the version * Release date of the version
@ -105,7 +105,7 @@
* *
* @var string|null * @var string|null
*/ */
public $time; private $time;
/** /**
* The license of the package. This can either be a string or * The license of the package. This can either be a string or
@ -113,17 +113,17 @@
* *
* @var string|string[]|null * @var string|string[]|null
*/ */
public $license; private $license;
/** /**
* @var Author[]|null * @var Author[]|null
*/ */
public $authors; private $authors;
/** /**
* @var Support|null * @var Support|null
*/ */
public $support; private $support;
/** /**
* Map of packages required by this package. The package * Map of packages required by this package. The package
@ -131,7 +131,7 @@
* *
* @var PackageLink[]|null * @var PackageLink[]|null
*/ */
public $require; private $require;
/** /**
* Map of packages required for developing this package, or running tests, * Map of packages required for developing this package, or running tests,
@ -141,7 +141,7 @@
* *
* @var PackageLink[]|null * @var PackageLink[]|null
*/ */
public $require_dev; private $require_dev;
/** /**
* Map of packages that conflict with this version of this package. They will * Map of packages that conflict with this version of this package. They will
@ -149,7 +149,7 @@
* *
* @var PackageLink[]|null * @var PackageLink[]|null
*/ */
public $conflict; private $conflict;
/** /**
* Map of packages that are replaced by this package. This allows you to fork a * Map of packages that are replaced by this package. This allows you to fork a
@ -159,7 +159,7 @@
* *
* @var PackageLink[]|null * @var PackageLink[]|null
*/ */
public $replace; private $replace;
/** /**
* Map of packages that are provided by this package. This is mostly useful for * Map of packages that are provided by this package. This is mostly useful for
@ -169,7 +169,7 @@
* *
* @var PackageLink[]|null * @var PackageLink[]|null
*/ */
public $provide; private $provide;
/** /**
* Suggested packages that can enhance or work well with this package. These are * Suggested packages that can enhance or work well with this package. These are
@ -179,35 +179,35 @@
* *
* @var Suggestion[]|null * @var Suggestion[]|null
*/ */
public $suggest; private $suggest;
/** /**
* Autoload mapping for a PHP autoloader. * Autoload mapping for a PHP autoloader.
* *
* @var Autoloader|null * @var Autoloader|null
*/ */
public $autoload; private $autoload;
/** /**
* This section allows defining autoload rules for development purposes. * This section allows defining autoload rules for development purposes.
* *
* @var Autoloader|null * @var Autoloader|null
*/ */
public $autoload_dev; private $autoload_dev;
/** /**
* A list of paths which should get appended to PHP's include_path. * A list of paths which should get appended to PHP's include_path.
* *
* @var string[]|null * @var string[]|null
*/ */
public $include_path; private $include_path;
/** /**
* Defines the installation target. * Defines the installation target.
* *
* @var string|null * @var string|null
*/ */
public $target_directory; private $target_directory;
/** /**
* This defines the default behavior for filtering packages by * This defines the default behavior for filtering packages by
@ -222,21 +222,21 @@
* *
* @var ComposerPackageTypes|null * @var ComposerPackageTypes|null
*/ */
public $minimum_stability; private $minimum_stability;
/** /**
* Custom package repositories to use. * Custom package repositories to use.
* *
* @var array|null * @var array|null
*/ */
public $repositories; private $repositories;
/** /**
* A set of configuration options. It is only used for projects. * A set of configuration options. It is only used for projects.
* *
* @var array|null * @var array|null
*/ */
public $configuration; private $configuration;
/** /**
* Composer allows you to hook into various parts of the installation * Composer allows you to hook into various parts of the installation
@ -244,35 +244,35 @@
* *
* @var array|null * @var array|null
*/ */
public $scripts; private $scripts;
/** /**
* Arbitrary extra data for consumption by scripts. * Arbitrary extra data for consumption by scripts.
* *
* @var array|null * @var array|null
*/ */
public $extra; private $extra;
/** /**
* A set of files that should be treated as binaries and made available into the bin-dir (from config). * A set of files that should be treated as binaries and made available into the bin-dir (from config).
* *
* @var array|null * @var array|null
*/ */
public $Bin; private $bin;
/** /**
* A set of options for creating package archives. * A set of options for creating package archives.
* *
* @var array|null * @var array|null
*/ */
public $archive; private $archive;
/** /**
* Indicates whether this package has been abandoned. * Indicates whether this package has been abandoned.
* *
* @var bool * @var bool
*/ */
public $abandoned; private $abandoned;
/** /**
* A list of regex patterns of branch names that are * A list of regex patterns of branch names that are
@ -282,16 +282,498 @@
* *
* @var array|null * @var array|null
*/ */
public $non_feature_branches; private $non_feature_branches;
/**
* Public Constructor.
*/
public function __construct() public function __construct()
{ {
$this->type = ComposerPackageTypes::LIBRARY; $this->type = ComposerPackageTypes::LIBRARY;
$this->minimum_stability = ComposerStabilityTypes::STABLE; $this->minimum_stability = ComposerStabilityTypes::STABLE;
$this->PreferStable = false;
$this->abandoned = false; $this->abandoned = false;
} }
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @param string $description
*/
public function setDescription(string $description): void
{
$this->description = $description;
}
/**
* @return string|null
*/
public function getVersion(): ?string
{
return $this->version;
}
/**
* @param string|null $version
*/
public function setVersion(?string $version): void
{
$this->version = $version;
}
/**
* @return string
*/
public function getType(): string
{
return $this->type;
}
/**
* @param string $type
*/
public function setType(string $type): void
{
$this->type = $type;
}
/**
* @return string[]
*/
public function getKeywords(): array
{
return $this->keywords;
}
/**
* @param string[] $keywords
*/
public function setKeywords(array $keywords): void
{
$this->keywords = $keywords;
}
/**
* @return string|null
*/
public function getHomepage(): ?string
{
return $this->homepage;
}
/**
* @param string|null $homepage
*/
public function setHomepage(?string $homepage): void
{
$this->homepage = $homepage;
}
/**
* @return string|null
*/
public function getReadme(): ?string
{
return $this->readme;
}
/**
* @param string|null $readme
*/
public function setReadme(?string $readme): void
{
$this->readme = $readme;
}
/**
* @return string|null
*/
public function getTime(): ?string
{
return $this->time;
}
/**
* @param string|null $time
*/
public function setTime(?string $time): void
{
$this->time = $time;
}
/**
* @return string|string[]|null
*/
public function getLicense(): array|string|null
{
return $this->license;
}
/**
* @param string|string[]|null $license
*/
public function setLicense(array|string|null $license): void
{
$this->license = $license;
}
/**
* @return Author[]|null
*/
public function getAuthors(): ?array
{
return $this->authors;
}
/**
* @param Author[]|null $authors
*/
public function setAuthors(?array $authors): void
{
$this->authors = $authors;
}
/**
* @return Support|null
*/
public function getSupport(): ?Support
{
return $this->support;
}
/**
* @param Support|null $support
*/
public function setSupport(?Support $support): void
{
$this->support = $support;
}
/**
* @return PackageLink[]|null
*/
public function getRequire(): ?array
{
return $this->require;
}
/**
* @param PackageLink[]|null $require
*/
public function setRequire(?array $require): void
{
$this->require = $require;
}
/**
* @return PackageLink[]|null
*/
public function getRequireDev(): ?array
{
return $this->require_dev;
}
/**
* @param PackageLink[]|null $require_dev
*/
public function setRequireDev(?array $require_dev): void
{
$this->require_dev = $require_dev;
}
/**
* @return PackageLink[]|null
*/
public function getConflict(): ?array
{
return $this->conflict;
}
/**
* @param PackageLink[]|null $conflict
*/
public function setConflict(?array $conflict): void
{
$this->conflict = $conflict;
}
/**
* @return PackageLink[]|null
*/
public function getReplace(): ?array
{
return $this->replace;
}
/**
* @param PackageLink[]|null $replace
*/
public function setReplace(?array $replace): void
{
$this->replace = $replace;
}
/**
* @return PackageLink[]|null
*/
public function getProvide(): ?array
{
return $this->provide;
}
/**
* @param PackageLink[]|null $provide
*/
public function setProvide(?array $provide): void
{
$this->provide = $provide;
}
/**
* @return Suggestion[]|null
*/
public function getSuggest(): ?array
{
return $this->suggest;
}
/**
* @param Suggestion[]|null $suggest
*/
public function setSuggest(?array $suggest): void
{
$this->suggest = $suggest;
}
/**
* @return Autoloader|null
*/
public function getAutoload(): ?Autoloader
{
return $this->autoload;
}
/**
* @param Autoloader|null $autoload
*/
public function setAutoload(?Autoloader $autoload): void
{
$this->autoload = $autoload;
}
/**
* @return Autoloader|null
*/
public function getAutoloadDev(): ?Autoloader
{
return $this->autoload_dev;
}
/**
* @param Autoloader|null $autoload_dev
*/
public function setAutoloadDev(?Autoloader $autoload_dev): void
{
$this->autoload_dev = $autoload_dev;
}
/**
* @return string[]|null
*/
public function getIncludePath(): ?array
{
return $this->include_path;
}
/**
* @param string[]|null $include_path
*/
public function setIncludePath(?array $include_path): void
{
$this->include_path = $include_path;
}
/**
* @return string|null
*/
public function getTargetDirectory(): ?string
{
return $this->target_directory;
}
/**
* @param string|null $target_directory
*/
public function setTargetDirectory(?string $target_directory): void
{
$this->target_directory = $target_directory;
}
/**
* @return ComposerPackageTypes|string|null
*/
public function getMinimumStability(): ComposerPackageTypes|string|null
{
return $this->minimum_stability;
}
/**
* @param ComposerPackageTypes|string|null $minimum_stability
*/
public function setMinimumStability(ComposerPackageTypes|string|null $minimum_stability): void
{
$this->minimum_stability = $minimum_stability;
}
/**
* @return array|null
*/
public function getRepositories(): ?array
{
return $this->repositories;
}
/**
* @param array|null $repositories
*/
public function setRepositories(?array $repositories): void
{
$this->repositories = $repositories;
}
/**
* @return array|null
*/
public function getConfiguration(): ?array
{
return $this->configuration;
}
/**
* @param array|null $configuration
*/
public function setConfiguration(?array $configuration): void
{
$this->configuration = $configuration;
}
/**
* @return array|null
*/
public function getScripts(): ?array
{
return $this->scripts;
}
/**
* @param array|null $scripts
*/
public function setScripts(?array $scripts): void
{
$this->scripts = $scripts;
}
/**
* @return array|null
*/
public function getExtra(): ?array
{
return $this->extra;
}
/**
* @param array|null $extra
*/
public function setExtra(?array $extra): void
{
$this->extra = $extra;
}
/**
* @return array|null
*/
public function getBin(): ?array
{
return $this->bin;
}
/**
* @param array|null $bin
*/
public function setBin(?array $bin): void
{
$this->bin = $bin;
}
/**
* @return array|null
*/
public function getArchive(): ?array
{
return $this->archive;
}
/**
* @param array|null $archive
*/
public function setArchive(?array $archive): void
{
$this->archive = $archive;
}
/**
* @return bool
*/
public function isAbandoned(): bool
{
return $this->abandoned;
}
/**
* @param bool $abandoned
*/
public function setAbandoned(bool $abandoned): void
{
$this->abandoned = $abandoned;
}
/**
* @return array|null
*/
public function getNonFeatureBranches(): ?array
{
return $this->non_feature_branches;
}
/**
* @param array|null $non_feature_branches
*/
public function setNonFeatureBranches(?array $non_feature_branches): void
{
$this->non_feature_branches = $non_feature_branches;
}
/** /**
* Returns an array representation of the object * Returns an array representation of the object
* *
@ -396,7 +878,7 @@
'config' => $this->configuration, 'config' => $this->configuration,
'scripts' => $this->scripts, 'scripts' => $this->scripts,
'extra' => $this->extra, 'extra' => $this->extra,
'bin' => $this->Bin, 'bin' => $this->bin,
'archive' => $this->archive, 'archive' => $this->archive,
'abandoned' => $this->abandoned, 'abandoned' => $this->abandoned,
'non-feature-branches' => $this->non_feature_branches 'non-feature-branches' => $this->non_feature_branches
@ -567,7 +1049,7 @@
if(isset($data['bin'])) if(isset($data['bin']))
{ {
$object->Bin = $data['bin']; $object->bin = $data['bin'];
} }
if(isset($data['archive'])) if(isset($data['archive']))

View file

@ -1,24 +1,24 @@
<?php <?php
/* /*
* Copyright (c) Nosial 2022-2023, all rights reserved. * Copyright (c) Nosial 2022-2023, all rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without * associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following * Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions: * conditions:
* *
* The above copyright notice and this permission notice shall be included in all copies or substantial portions * The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software. * of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
* *
*/ */
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
@ -29,62 +29,62 @@
/** /**
* @var string * @var string
*/ */
public $Readme; private $readme;
/** /**
* @var string * @var string
*/ */
public $ContentHash; private $content_hash;
/** /**
* @var ComposerJson[]|null * @var ComposerJson[]|null
*/ */
public $Packages; private $packages;
/** /**
* @var array|null * @var array|null
*/ */
public $PackagesDev; private $packages_dev;
/** /**
* @var array|null * @var array|null
*/ */
public $Aliases; private $aliases;
/** /**
* @var string|null * @var string|null
*/ */
public $MinimumStability; private $minimum_stability;
/** /**
* @var array|null * @var array|null
*/ */
public $StabilityFlags; private $stability_flags;
/** /**
* @var bool * @var bool
*/ */
public $PreferStable; private $prefer_stable;
/** /**
* @var bool * @var bool
*/ */
public $PreferLowest; private $prefer_lowest;
/** /**
* @var array|null * @var array|null
*/ */
public $Platform; private $platform;
/** /**
* @var array|null * @var array|null
*/ */
public $PlatformDev; private $platform_dev;
/** /**
* @var string|null * @var string|null
*/ */
public $PluginApiVersion; private $plugin_api_version;
/** /**
* Returns an existing package from the lock file * Returns an existing package from the lock file
@ -94,9 +94,9 @@
*/ */
public function getPackage(string $name): ?ComposerJson public function getPackage(string $name): ?ComposerJson
{ {
foreach($this->Packages as $package) foreach($this->packages as $package)
{ {
if($package->name === $name) if($package->getName() === $name)
{ {
return $package; return $package;
} }
@ -105,6 +105,198 @@
return null; return null;
} }
/**
* @return string
*/
public function getReadme(): string
{
return $this->readme;
}
/**
* @param string $readme
*/
public function setReadme(string $readme): void
{
$this->readme = $readme;
}
/**
* @return string
*/
public function getContentHash(): string
{
return $this->content_hash;
}
/**
* @param string $content_hash
*/
public function setContentHash(string $content_hash): void
{
$this->content_hash = $content_hash;
}
/**
* @return ComposerJson[]|null
*/
public function getPackages(): ?array
{
return $this->packages;
}
/**
* @param ComposerJson[]|null $packages
*/
public function setPackages(?array $packages): void
{
$this->packages = $packages;
}
/**
* @return array|null
*/
public function getPackagesDev(): ?array
{
return $this->packages_dev;
}
/**
* @param array|null $packages_dev
*/
public function setPackagesDev(?array $packages_dev): void
{
$this->packages_dev = $packages_dev;
}
/**
* @return array|null
*/
public function getAliases(): ?array
{
return $this->aliases;
}
/**
* @param array|null $aliases
*/
public function setAliases(?array $aliases): void
{
$this->aliases = $aliases;
}
/**
* @return string|null
*/
public function getMinimumStability(): ?string
{
return $this->minimum_stability;
}
/**
* @param string|null $minimum_stability
*/
public function setMinimumStability(?string $minimum_stability): void
{
$this->minimum_stability = $minimum_stability;
}
/**
* @return array|null
*/
public function getStabilityFlags(): ?array
{
return $this->stability_flags;
}
/**
* @param array|null $stability_flags
*/
public function setStabilityFlags(?array $stability_flags): void
{
$this->stability_flags = $stability_flags;
}
/**
* @return bool
*/
public function isPreferStable(): bool
{
return $this->prefer_stable;
}
/**
* @param bool $prefer_stable
*/
public function setPreferStable(bool $prefer_stable): void
{
$this->prefer_stable = $prefer_stable;
}
/**
* @return bool
*/
public function isPreferLowest(): bool
{
return $this->prefer_lowest;
}
/**
* @param bool $prefer_lowest
*/
public function setPreferLowest(bool $prefer_lowest): void
{
$this->prefer_lowest = $prefer_lowest;
}
/**
* @return array|null
*/
public function getPlatform(): ?array
{
return $this->platform;
}
/**
* @param array|null $platform
*/
public function setPlatform(?array $platform): void
{
$this->platform = $platform;
}
/**
* @return array|null
*/
public function getPlatformDev(): ?array
{
return $this->platform_dev;
}
/**
* @param array|null $platform_dev
*/
public function setPlatformDev(?array $platform_dev): void
{
$this->platform_dev = $platform_dev;
}
/**
* @return string|null
*/
public function getPluginApiVersion(): ?string
{
return $this->plugin_api_version;
}
/**
* @param string|null $plugin_api_version
*/
public function setPluginApiVersion(?string $plugin_api_version): void
{
$this->plugin_api_version = $plugin_api_version;
}
/** /**
* Returns an array representation of the object * Returns an array representation of the object
* *
@ -113,26 +305,26 @@
public function toArray(): array public function toArray(): array
{ {
$_packages = []; $_packages = [];
if($this->Packages !== null) if($this->packages !== null)
{ {
foreach($this->Packages as $package) foreach($this->packages as $package)
{ {
$_packages[] = $package->toArray(); $_packages[] = $package->toArray();
} }
} }
return [ return [
'_readme' => $this->Readme, '_readme' => $this->readme,
'content-hash' => $this->ContentHash, 'content-hash' => $this->content_hash,
'packages' => $_packages, 'packages' => $_packages,
'packages-dev' => $this->PackagesDev, 'packages-dev' => $this->packages_dev,
'aliases' => $this->Aliases, 'aliases' => $this->aliases,
'minimum-stability' => $this->MinimumStability, 'minimum-stability' => $this->minimum_stability,
'stability-flags' => $this->StabilityFlags, 'stability-flags' => $this->stability_flags,
'prefer-stable' => $this->PreferStable, 'prefer-stable' => $this->prefer_stable,
'prefer-lowest' => $this->PreferLowest, 'prefer-lowest' => $this->prefer_lowest,
'platform' => $this->Platform, 'platform' => $this->platform,
'platform-dev' => $this->PlatformDev, 'platform-dev' => $this->platform_dev,
'plugin-api-version' => $this->PluginApiVersion, 'plugin-api-version' => $this->plugin_api_version,
]; ];
} }
@ -146,25 +338,25 @@
{ {
$object = new self(); $object = new self();
$object->Readme = $data['_readme']; $object->readme = $data['_readme'];
$object->ContentHash = $data['content-hash']; $object->content_hash = $data['content-hash'];
$object->Packages = []; $object->packages = [];
if($data['packages'] !== null) if($data['packages'] !== null)
{ {
foreach($data['packages'] as $package) foreach($data['packages'] as $package)
{ {
$object->Packages[] = ComposerJson::fromArray($package); $object->packages[] = ComposerJson::fromArray($package);
} }
} }
$object->PackagesDev = $data['packages-dev']; $object->packages_dev = $data['packages-dev'];
$object->Aliases = $data['aliases']; $object->aliases = $data['aliases'];
$object->MinimumStability = $data['minimum-stability']; $object->minimum_stability = $data['minimum-stability'];
$object->StabilityFlags = $data['stability-flags']; $object->stability_flags = $data['stability-flags'];
$object->PreferStable = $data['prefer-stable']; $object->prefer_stable = $data['prefer-stable'];
$object->PreferLowest = $data['prefer-lowest']; $object->prefer_lowest = $data['prefer-lowest'];
$object->Platform = $data['platform']; $object->platform = $data['platform'];
$object->PlatformDev = $data['platform-dev']; $object->platform_dev = $data['platform-dev'];
$object->PluginApiVersion = $data['plugin-api-version']; $object->plugin_api_version = $data['plugin-api-version'];
return $object; return $object;
} }

View file

@ -1,24 +1,24 @@
<?php <?php
/* /*
* Copyright (c) Nosial 2022-2023, all rights reserved. * Copyright (c) Nosial 2022-2023, all rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without * associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following * Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions: * conditions:
* *
* The above copyright notice and this permission notice shall be included in all copies or substantial portions * The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software. * of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
* *
*/ */
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
@ -37,28 +37,92 @@
* *
* @var string * @var string
*/ */
public $name; private $name;
/** /**
* The type of service NCC should use with this source (gitlab, github, etc...). * The type of service NCC should use with this source (gitlab, github, etc...).
* *
* @var string|DefinedRemoteSourceType * @var string|DefinedRemoteSourceType
*/ */
public $type; private $type;
/** /**
* The host of the service NCC should use with this source (gitlab.com, github.com, git.example.com:8080 etc...). * The host of the service NCC should use with this source (gitlab.com, github.com, git.example.com:8080 etc...).
* *
* @var string * @var string
*/ */
public $host; private $host;
/** /**
* If SSL should be used when connecting to the service * If SSL should be used when connecting to the service
* *
* @var bool * @var bool
*/ */
public $ssl; private $ssl;
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @return DefinedRemoteSourceType|string
*/
public function getType(): DefinedRemoteSourceType|string
{
return $this->type;
}
/**
* @param DefinedRemoteSourceType|string $type
*/
public function setType(DefinedRemoteSourceType|string $type): void
{
$this->type = $type;
}
/**
* @return string
*/
public function getHost(): string
{
return $this->host;
}
/**
* @param string $host
*/
public function setHost(string $host): void
{
$this->host = $host;
}
/**
* @return bool
*/
public function isSsl(): bool
{
return $this->ssl;
}
/**
* @param bool $ssl
*/
public function setSsl(bool $ssl): void
{
$this->ssl = $ssl;
}
/** /**
* Returns an array representation of the object * Returns an array representation of the object

View file

@ -1,100 +1,193 @@
<?php <?php
/* /*
* Copyright (c) Nosial 2022-2023, all rights reserved. * Copyright (c) Nosial 2022-2023, all rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without * associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following * Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions: * conditions:
* *
* The above copyright notice and this permission notice shall be included in all copies or substantial portions * The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software. * of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
* *
*/ */
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace ncc\Objects; namespace ncc\Objects;
use JsonException;
use ncc\Enums\HttpRequestType; use ncc\Enums\HttpRequestType;
use ncc\Interfaces\SerializableObjectInterface;
use RuntimeException;
class HttpRequest class HttpRequest implements SerializableObjectInterface
{ {
/** /**
* The HTTP request type. * The HTTP request type.
* *
* @var string|HttpRequestType * @var string|HttpRequestType
*/ */
public $Type; private $type;
/** /**
* The URL to send the request to. * The URL to send the request to.
* *
* @var string * @var string
*/ */
public $Url; private $url;
/** /**
* The headers to send with the request. * The headers to send with the request.
* *
* @var array * @var array
*/ */
public $Headers; private $headers;
/** /**
* The body to send with the request. * The body to send with the request.
* *
* @var string|null * @var string|null
*/ */
public $Body; private $body;
/** /**
* The authentication username or password to send with the request. * The authentication username or password to send with the request.
* *
* @var array|string * @var array|string
*/ */
public $Authentication; private $authentication;
/** /**
* An array of curl options to set * An array of curl options to set
* *
* @var array * @var array
*/ */
public $Options; private $options;
/**
* Public Constructor
*/
public function __construct() public function __construct()
{ {
$this->Type = HttpRequestType::GET; $this->type = HttpRequestType::GET;
$this->Body = null; $this->options = [];
$this->Headers = [ $this->headers = [
'User-Agent: ncc/1.0' 'User-Agent: ncc/1.0'
]; ];
$this->Options = [];
} }
/** /**
* Returns an array representation of the object. * @return HttpRequestType|string
* */
public function getType(): HttpRequestType|string
{
return $this->type;
}
/**
* @param HttpRequestType|string $type
*/
public function setType(HttpRequestType|string $type): void
{
$this->type = $type;
}
/**
* @return string
*/
public function getUrl(): string
{
return $this->url;
}
/**
* @param string $url
*/
public function setUrl(string $url): void
{
$this->url = $url;
}
/**
* @return array|string[]
*/
public function getHeaders(): array
{
return $this->headers;
}
/**
* @param array|string[] $headers
*/
public function setHeaders(array $headers): void
{
$this->headers = $headers;
}
/**
* @param string $header
* @return void
*/
public function addHeader(string $header): void
{
$this->headers[] = $header;
}
/**
* @return string|null
*/
public function getBody(): ?string
{
return $this->body;
}
/**
* @param string|null $body
*/
public function setBody(?string $body): void
{
$this->body = $body;
}
/**
* @return array|string
*/
public function getAuthentication(): array|string
{
return $this->authentication;
}
/**
* @param array|string $authentication
*/
public function setAuthentication(array|string $authentication): void
{
$this->authentication = $authentication;
}
/**
* @return array * @return array
*/ */
public function toArray(): array public function getOptions(): array
{ {
return [ return $this->options;
'type' => $this->Type, }
'url' => $this->Url,
'headers' => $this->Headers, /**
'body' => $this->Body, * @param array $options
'authentication' => $this->Authentication, */
'options' => $this->Options public function setOptions(array $options): void
]; {
$this->options = $options;
} }
/** /**
@ -105,24 +198,50 @@
*/ */
public function requestHash(): string public function requestHash(): string
{ {
return hash('sha1', json_encode($this->toArray())); try
{
return hash('sha1', json_encode($this->toArray(), JSON_THROW_ON_ERROR));
}
catch(JsonException $e)
{
throw new RuntimeException(sprintf('Failed to hash request: %s', $e->getMessage()), $e->getCode(), $e);
}
}
/**
* Returns an array representation of the object.
*
* @return array
*/
public function toArray(): array
{
return [
'type' => $this->type,
'url' => $this->url,
'headers' => $this->headers,
'body' => $this->body,
'authentication' => $this->authentication,
'options' => $this->options
];
} }
/** /**
* Constructs a new HttpRequest object from an array representation. * Constructs a new HttpRequest object from an array representation.
* *
* @param array $data * @param array $data
* @return static * @return HttpRequest
*/ */
public static function fromArray(array $data): self public static function fromArray(array $data): HttpRequest
{ {
$request = new self(); $request = new self();
$request->Type = $data['type'];
$request->Url = $data['url']; $request->type = $data['type'];
$request->Headers = $data['headers']; $request->url = $data['url'];
$request->Body = $data['body']; $request->headers = $data['headers'];
$request->Authentication = $data['authentication']; $request->body = $data['body'];
$request->Options = $data['options']; $request->authentication = $data['authentication'];
$request->options = $data['options'];
return $request; return $request;
} }
} }

View file

@ -1,57 +1,110 @@
<?php <?php
/* /*
* Copyright (c) Nosial 2022-2023, all rights reserved. * Copyright (c) Nosial 2022-2023, all rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without * associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following * Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions: * conditions:
* *
* The above copyright notice and this permission notice shall be included in all copies or substantial portions * The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software. * of the Software.
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. * DEALINGS IN THE SOFTWARE.
* *
*/ */
/** @noinspection PhpMissingFieldTypeInspection */ /** @noinspection PhpMissingFieldTypeInspection */
namespace ncc\Objects; namespace ncc\Objects;
class HttpResponse use ncc\Interfaces\SerializableObjectInterface;
class HttpResponse implements SerializableObjectInterface
{ {
/** /**
* The HTTP status code. * The HTTP status code.
* *
* @var int * @var int
*/ */
public $StatusCode; private $status_code;
/** /**
* The headers returned by the server. * The headers returned by the server.
* *
* @var array * @var array
*/ */
public $Headers; private $headers;
/** /**
* The body returned by the server. * The body returned by the server.
* *
* @var string * @var string
*/ */
public $Body; private $body;
/**
* HttpResponse constructor.
*/
public function __construct() public function __construct()
{ {
$this->StatusCode = 0; $this->status_code = 0;
$this->Headers = []; $this->headers = [];
$this->Body = ''; $this->body = (string)null;
}
/**
* @return int
*/
public function getStatusCode(): int
{
return $this->status_code;
}
/**
* @param int $status_code
*/
public function setStatusCode(int $status_code): void
{
$this->status_code = $status_code;
}
/**
* @return array
*/
public function getHeaders(): array
{
return $this->headers;
}
/**
* @param array $headers
*/
public function setHeaders(array $headers): void
{
$this->headers = $headers;
}
/**
* @return string
*/
public function getBody(): string
{
return $this->body;
}
/**
* @param string $body
*/
public function setBody(string $body): void
{
$this->body = $body;
} }
/** /**
@ -62,9 +115,23 @@
public function toArray(): array public function toArray(): array
{ {
return [ return [
'status_code' => $this->StatusCode, 'status_code' => $this->status_code,
'headers' => $this->Headers, 'headers' => $this->headers,
'body' => $this->Body 'body' => $this->body
]; ];
} }
/**
* @inheritDoc
*/
public static function fromArray(array $data): HttpResponse
{
$object = new self();
$object->status_code = $data['status_code'];
$object->headers = $data['headers'];
$object->body = $data['body'];
return $object;
}
} }

View file

@ -203,9 +203,9 @@
foreach($input as $optionsSection) foreach($input as $optionsSection)
{ {
if(count($optionsSection->Parameters) > 0) if(count($optionsSection->getParameters()) > 0)
{ {
foreach($optionsSection->Parameters as $parameter) foreach($optionsSection->getParameters() as $parameter)
{ {
if($current_count < strlen($parameter)) if($current_count < strlen($parameter))
{ {
@ -572,7 +572,7 @@
switch ($entry->getPassword()?->getAuthenticationType()) switch ($entry->getPassword()?->getAuthenticationType())
{ {
case AuthenticationType::ACCESS_TOKEN: case AuthenticationType::ACCESS_TOKEN:
$http_request->Headers[] = "Authorization: Bearer " . $entry->getPassword(); $http_request->addHeader("Authorization: Bearer " . $entry->getPassword());
break; break;
case AuthenticationType::USERNAME_PASSWORD: case AuthenticationType::USERNAME_PASSWORD:
@ -582,8 +582,8 @@
if($expect_json) if($expect_json)
{ {
$http_request->Headers[] = "Accept: application/json"; $http_request->addHeader("Accept: application/json");
$http_request->Headers[] = "Content-Type: application/json"; $http_request->addHeader("Content-Type: application/json");
} }
return $http_request; return $http_request;
@ -607,8 +607,8 @@
$out_path = self::getTmpDir() . "/" . basename($url); $out_path = self::getTmpDir() . "/" . basename($url);
$http_request = new HttpRequest(); $http_request = new HttpRequest();
$http_request->Url = $url; $http_request->setUrl($url);
$http_request->Type = HttpRequestType::GET; $http_request->setType(HttpRequestType::GET);
$http_request = self::prepareGitServiceRequest($http_request, $entry, false); $http_request = self::prepareGitServiceRequest($http_request, $entry, false);
Console::out('Downloading file ' . $url); Console::out('Downloading file ' . $url);
@ -790,7 +790,7 @@
{ {
$results = new RepositoryQueryResults(); $results = new RepositoryQueryResults();
switch($definedRemoteSource->type) switch($definedRemoteSource->getType())
{ {
case DefinedRemoteSourceType::GITHUB: case DefinedRemoteSourceType::GITHUB:
$source = GithubService::class; $source = GithubService::class;
@ -807,7 +807,7 @@
// Check if the specified version is a release // Check if the specified version is a release
try try
{ {
Console::outVerbose(sprintf('Attempting to fetch source code from %s', $definedRemoteSource->host)); Console::outVerbose(sprintf('Attempting to fetch source code from %s', $definedRemoteSource->getHost()));
$release_results = $source::getRelease($packageInput, $definedRemoteSource, $entry); $release_results = $source::getRelease($packageInput, $definedRemoteSource, $entry);
} }
catch(Exception $e) catch(Exception $e)