7 Commits
1.0.2 ... 1.0.5

Author SHA1 Message Date
ea64578fd9 PushEvent - Updated the validateRequest() method
+ Added ability to skip secret key validation, which is useful for newer version of gitea (as its depreciated now)
2021-11-04 20:52:06 -06:00
dbdff87baf Hotfix - Renamed occurences of old method name
+ Replaced instances of `getRawFile()` with `getFileContents()`
2021-11-02 14:47:41 -06:00
785d0b43a2 Fixed errant operator 2021-08-26 12:54:55 -06:00
f468b67335 Repositories - Updated the getRawFile() method
+ Renamed the `getRawFile()` method to `getFileContents`
+ Updated the method to make it use the `/repos/{owner}/{repo}/contents/{filepath}` API route
2020-08-05 22:13:22 -06:00
d37650a882 Amendment - Fixed a bug in the new "getByID" method 2020-04-01 13:05:25 -06:00
e60312fab3 Repositories - Added a new "getById" method
+ Added a new method for retrieving repositories using their ID
2020-03-31 17:19:46 -06:00
cc6bd39f82 Tag Model - Fixed a tag ID related bug
+ Fixed a bug that was causing Acappella to only generate out composer packages for the most recent tag in each repository
2020-03-31 16:13:43 -06:00
5 changed files with 76 additions and 28 deletions

View File

@ -112,28 +112,73 @@ class Repositories extends AbstractAllApiRequester
} }
/** /**
* Get the raw contents of a file stored inside a repository * Get a repository using its ID
*
* Example:
* ```
* $client->repositories()->getByID($repoId);
* ```
*
* @param string repoId The ID of the repository
* @return Repository
*/
public function getById(int $repoId)
{
$client = $this->getClient();
try {
$response = $this->get("repositories/$repoId");
$statusCode = $response->getStatusCode();
$body = (string) $response->getBody();
if ($statusCode == 200) {
return Repository::fromJson(
$client,
$this,
json_decode($body)
);
}
return false;
} catch (ServerException $serverError) {
return false;
}
}
/**
* Get the contents of a file in a certain in repository commit/branch/tag
* using the repository's name and owner * using the repository's name and owner
* *
* Example: * Example:
* ``` * ```
* $client->repositories()->getRawFile($owner, $repoName, "README.md"); * $client->repositories()->getFileContents($owner, $repoName, "README.md", "v2.0.0");
* ``` * ```
* *
* @param string $owner The owner of the repository * @param string $owner The owner of the repository
* @param string $repoName The name of the repository * @param string $repoName The name of the repository
* @param string $filepath The path to the raw file (relative to the repository root) * @param string $filepath The path to the file (relative to the repository root)
* @param string $ref The name of the commit/branch/tag. Default the repositorys default branch (usually master)
* @return string * @return string
*/ */
public function getRawFile(string $owner, string $repoName, string $filepath) public function getFileContents(string $owner, string $repoName, string $filepath, string $ref="")
{ {
$client = $this->getClient(); $client = $this->getClient();
try { try {
$response = $this->get("repos/$owner/$repoName/raw/$filepath"); if ($ref !== "") {
$response = $this->get("repos/$owner/$repoName/contents/$filepath",[
"ref" => $ref
]);
} else {
$response = $this->get("repos/$owner/$repoName/contents/$filepath");
}
$statusCode = $response->getStatusCode(); $statusCode = $response->getStatusCode();
$body = (string) $response->getBody();
if ($statusCode == 200) { if ($statusCode == 200) {
return $body; $body = (string) $response->getBody();
$jsonObj = json_decode($body, true);
if (array_key_exists("content", $jsonObj)) {
$base64FileContents = $jsonObj["content"];
$fileContents = base64_decode($base64FileContents);
return $fileContents;
}
} }
return false; return false;

View File

@ -66,7 +66,7 @@ class Client implements RequestChainableInterface
{ {
// Append a slash to any URL that doesn't end in '/' // Append a slash to any URL that doesn't end in '/'
if (!$this->endsWith($giteaURL, '/')) { if (!$this->endsWith($giteaURL, '/')) {
$giteaURL += "/"; $giteaURL .= "/";
} }
$this->giteaURL = $giteaURL; $this->giteaURL = $giteaURL;
$this->authToken = $authToken; $this->authToken = $authToken;

View File

@ -44,9 +44,9 @@ class Tag extends AbstractApiModel {
if (count($args) >= 2) { if (count($args) >= 2) {
$id = $args[0]; $id = $args[0];
$name = $args[1]; $name = $args[1];
if (!is_numeric($id)) { if (!is_string($id)) {
$argumentType = gettype($id); $argumentType = gettype($id);
throw new InvalidArgumentException("The \"__construct()\" function requires the 3rd parameter to be of the integer type, but a \"$argumentType\" was passed in"); throw new InvalidArgumentException("The \"__construct()\" function requires the 3rd parameter to be of the string type, but a \"$argumentType\" was passed in");
} }
if (!is_string($name)) { if (!is_string($name)) {
$argumentType = gettype($name); $argumentType = gettype($name);
@ -71,7 +71,7 @@ class Tag extends AbstractApiModel {
$newTag = new static( $newTag = new static(
$client, $client,
$caller, $caller,
isset($map->id) && is_numeric($map->id) ? $map->id : -1, isset($map->id) && is_string($map->id) ? $map->id : -1,
isset($map->name) && is_string($map->name) ? $map->name : '' isset($map->name) && is_string($map->name) ? $map->name : ''
); );
$newTag->setTarballURL(isset($map->tarball_url) && is_string($map->tarball_url) ? new Uri($map->tarball_url) : null); $newTag->setTarballURL(isset($map->tarball_url) && is_string($map->tarball_url) ? new Uri($map->tarball_url) : null);
@ -104,7 +104,7 @@ class Tag extends AbstractApiModel {
* Gets the tag identifier. * Gets the tag identifier.
* @return int The tag identifier. * @return int The tag identifier.
*/ */
function getId(): int { function getId(): string {
return $this->id; return $this->id;
} }

View File

@ -59,9 +59,10 @@ class PushEvent extends AbstractApiModel {
* @param array $server The HTTP SERVER array for the push event * @param array $server The HTTP SERVER array for the push event
* @param string $body The raw data from the request body * @param string $body The raw data from the request body
* @param string $secretKey The secret key to from your server * @param string $secretKey The secret key to from your server
* @return void * @param bool $skipSecretValidation If set to true, secret key validation will be skipped (used for newer versions of Gitea)
* @return bool
*/ */
public static function validateRequest(array $server, string $body, string $secretKey) public static function validateRequest(array $server, string $body, string $secretKey, bool $skipSecretValidation = false)
{ {
// Validate request protocol // Validate request protocol
if ($server['REQUEST_METHOD'] != 'POST') { if ($server['REQUEST_METHOD'] != 'POST') {
@ -80,18 +81,20 @@ class PushEvent extends AbstractApiModel {
throw new \RuntimeException("FAILED: Empty Body - The request has an empty body"); throw new \RuntimeException("FAILED: Empty Body - The request has an empty body");
} }
// Validate header signature if (!$skipSecretValidation) {
$headerSignature = isset($server['HTTP_X_GITEA_SIGNATURE']) ? $server['HTTP_X_GITEA_SIGNATURE'] : ''; // Validate header signature
if (empty($headerSignature)) { $headerSignature = isset($server['HTTP_X_GITEA_SIGNATURE']) ? $server['HTTP_X_GITEA_SIGNATURE'] : '';
throw new \RuntimeException("FAILED: Signature Missing - The request is missing the Gitea signature"); if (empty($headerSignature)) {
} throw new \RuntimeException("FAILED: Signature Missing - The request is missing the Gitea signature");
}
// calculate payload signature
$payload_signature = hash_hmac('sha256', $rawContent, $secretKey, false); // calculate payload signature
$payload_signature = hash_hmac('sha256', $rawContent, $secretKey, false);
// check payload signature against header signature
if ($headerSignature != $payload_signature) { // check payload signature against header signature
throw new \RuntimeException("FAILED: Access Denied - The push event's secret does not match the expected secret"); if ($headerSignature != $payload_signature) {
throw new \RuntimeException("FAILED: Access Denied - The push event's secret does not match the expected secret");
}
} }
return true; return true;

View File

@ -82,7 +82,7 @@ if ($repository) {
} }
// print("Getting contents of \"composer.json\" file \n\n"); // print("Getting contents of \"composer.json\" file \n\n");
// $rawFile = $giteaClient->repositories()->getRawFile("Sitelease", "sl-theme-recipe", "composer.json"); // $rawFile = $giteaClient->repositories()->getFileContents("Sitelease", "sl-theme-recipe", "composer.json");
// if ($rawFile) { // if ($rawFile) {
// var_dump(json_encode($rawFile)); // var_dump(json_encode($rawFile));
// print("\n\n"); // print("\n\n");
@ -91,7 +91,7 @@ if ($repository) {
// } // }
// print("Getting contents of \"composer.json\" file \n\n"); // print("Getting contents of \"composer.json\" file \n\n");
// $rawFile = $giteaClient->repositories()->getRawFile("Sitelease", "sl-theme-recipe", "composer.json"); // $rawFile = $giteaClient->repositories()->getFileContents("Sitelease", "sl-theme-recipe", "composer.json");
// if ($rawFile) { // if ($rawFile) {
// var_dump($rawFile); // var_dump($rawFile);
// print("\n\n"); // print("\n\n");