lbry.com/controller/action/OpsActions.class.php
2016-09-08 11:08:12 -04:00

90 lines
2.6 KiB
PHP

<?php
class OpsActions extends Actions
{
public static function executePostCommit(): array
{
$payload = Request::getParam('payload');
if (!$payload)
{
return NavActions::execute400(['error' => 'No payload']);
}
$payload = json_decode($payload, true);
if ($payload['ref'] === 'refs/heads/master')
{
$sig = Request::getHttpHeader('X-Hub-Signature');
if (!$sig)
{
return NavActions::execute400(['error' => "HTTP header 'X-Hub-Signature' is missing."]);
}
list($algo, $hash) = explode('=', Request::getHttpHeader('X-Hub-Signature'), 2) + ['', ''];
if (!in_array($algo, hash_algos(), true))
{
return NavActions::execute400(['error' => 'Invalid hash algorithm "' . htmlspecialchars($algo) . '"']);
}
$rawPost = file_get_contents('php://input');
$secret = Config::get('github_key');
if ($hash !== hash_hmac($algo, $rawPost, $secret))
{
return NavActions::execute400(['error' => 'Hash does not match.']);
}
file_put_contents(ROOT_DIR . '/data/writeable/NEEDS_UPDATE', '');
}
return [null, []];
}
public static function executeLogUpload(): array
{
$log = Request::getPostParam('log') ? urldecode(Request::getPostParam('log')) : null;
if (Request::getPostParam('name'))
{
$name = substr(trim(urldecode(Request::getPostParam('name'))), 0, 50);
}
elseif (Request::getPostParam('date'))
{
$name = substr(trim(urldecode(Request::getPostParam('date'))), 0, 20) . '_' .
substr(trim(urldecode(Request::getPostParam('hash'))), 0, 20) . '_' .
substr(trim(urldecode(Request::getPostParam('sys'))), 0, 50) . '_' .
substr(trim(urldecode(Request::getPostParam('type'))), 0, 20);
}
else
{
$name = null;
}
$name = preg_replace('/[^A-Za-z0-9_-]+/', '', $name);
if (!$log || !$name)
{
return NavActions::execute400(['error' => "Required params: log, name"]);
}
$awsKey = Config::get('aws_log_access_key');
$awsSecret = Config::get('aws_log_secret_key');
if (!$log || !$name)
{
throw new RuntimeException('Missing AWS credentials');
}
$tmpFile = tempnam(sys_get_temp_dir(), 'lbryinstalllog');
file_put_contents($tmpFile, $log);
if (filesize($tmpFile) > 1024 * 1024 * 2)
{
return NavActions::execute400(['error' => 'Log file is too large']);
}
S3::$useExceptions = true;
S3::setAuth($awsKey, $awsSecret);
S3::putObject(S3::inputFile($tmpFile, false), 'lbry-install-logs', $name);
unlink($tmpFile);
return [null, []];
}
}