diff --git a/controller/Controller.class.php b/controller/Controller.class.php index 9ca262e9..f657035b 100644 --- a/controller/Controller.class.php +++ b/controller/Controller.class.php @@ -67,8 +67,10 @@ class Controller case '/dl/lbry_setup.sh': return ['internal/dl-not-supported', ['_no_layout' => true]]; case '/lbry-osx-latest.dmg': + // THIS ROUTE IS DEPRECATED. IT WILL BE REMOVED SOON. return static::redirect('https://github.com/lbryio/lbry/releases/download/v0.2.5/lbry.0.2.5.dmg', 307); case '/lbry-linux-latest.deb': + // THIS ROUTE IS DEPRECATED. IT WILL BE REMOVED SOON. return static::redirect('https://github.com/lbryio/lbry/releases/download/v0.2.5/lbry_0.2.5_amd64.deb', 307); case '/art': return static::redirect('/what'); diff --git a/controller/action/DownloadActions.class.php b/controller/action/DownloadActions.class.php index 798190ef..d9493d5f 100644 --- a/controller/action/DownloadActions.class.php +++ b/controller/action/DownloadActions.class.php @@ -37,7 +37,7 @@ class DownloadActions extends Actions 'osTitle' => $osTitle, 'osIcon' => $osIcon, 'downloadHtml' => View::exists('download/' . $partial) ? - View::render('download/' . $partial) : + View::render('download/' . $partial, ['downloadUrl' => static::getDownloadUrl($os)]) : false ]]; } @@ -89,6 +89,54 @@ class DownloadActions extends Actions return null; } + protected static function getDownloadUrl($os, $useCache = true) + { + if (!in_array($os, array_keys(static::getOses()))) + { + throw new DomainException('Unknown OS'); + } + + $apc = $useCache && extension_loaded('apc') && ini_get('apc.enabled'); + $key = 'lbry_release_data'; + $releaseData = null; + + if ($apc) + { + $releaseData = apc_fetch($key); + } + + if (!$releaseData) + { + try + { + $releaseData = json_decode(Curl::get('https://api.github.com/repos/lbryio/lbry/releases/latest', [], ['user_agent' => 'LBRY']), true); + if ($apc) + { + apc_store($key, $releaseData, 600); // cache for 10 min + } + } + catch (Exception $e) + { + } + } + + if (!$releaseData) + { + return null; + } + + foreach($releaseData['assets'] as $asset) + { + if ($os == static::OS_LINUX && $asset['content_type'] == 'application/x-debian-package' || + $os == static::OS_OSX && $asset['content_type'] == 'application/x-diskcopy') + { + return $asset['browser_download_url']; + } + } + + return null; + } + // protected static function validateDownloadAccess() // { // $seshionKey = 'has-get-access'; diff --git a/lib/tools/Curl.class.php b/lib/tools/Curl.class.php new file mode 100644 index 00000000..ca6cc3ee --- /dev/null +++ b/lib/tools/Curl.class.php @@ -0,0 +1,144 @@ + [], + 'verify' => true, + 'timeout' => 5, + 'follow_redirects' => true, + 'user_agent' => null, + 'proxy' => null, + 'password' => null, + 'cookie' => null, + 'json_post' => false, + ]; + + $invalid = array_diff_key($options, $defaults); + if ($invalid) + { + throw new DomainException('Invalid curl options: ' . join(', ', array_keys($invalid))); + } + + $options = array_merge($defaults, $options); + + if (!in_array($method, [static::GET, static::POST])) + { + throw new DomainException('Invalid method: ' . $method); + } + + if ($options['headers'] && $options['headers'] !== array_values($options['headers'])) // associative array + { + throw new DomainException('Headers must not be an associative array. Its a simple array with values of the form "Header: value"'); + } + + $ch = curl_init(); + + if ($method == static::GET && $params) + { + $url .= (strpos($url, '?') === false ? '?' : '&') . http_build_query($params); + } + + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_HTTPHEADER => $options['headers'], + CURLOPT_RETURNTRANSFER => true, + // CURLOPT_FAILONERROR => true, + CURLOPT_FOLLOWLOCATION => $options['follow_redirects'], + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => $options['timeout'], + CURLOPT_SSL_VERIFYPEER => $options['verify'], + // CURLOPT_SSL_VERIFYHOST => $options['verify'] ? 2 : 0, // php doc says to always keep this at 2 in production environments + CURLOPT_USERAGENT => $options['user_agent'], + ]); + + if ($method == static::POST) + { + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $options['json_post'] ? json_encode($params) : http_build_query($params)); + } + + if ($options['proxy']) + { + curl_setopt($ch, CURLOPT_PROXY, $options['proxy']); + curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); + } + + if ($options['password']) + { + curl_setopt($ch, CURLOPT_USERPWD, $options['password']); + } + + if ($options['cookie']) + { + curl_setopt($ch, CURLOPT_COOKIE, $options['cookie']); + } + + $startingResponse = false; + $headers = []; + curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $h) use (&$headers, &$startingResponse) + { + $value = trim($h); + if ($value === '') + { + $startingResponse = true; + } + elseif ($startingResponse) + { + $startingResponse = false; + $headers = [$value]; + } + else + { + $headers[] = $value; + } + return strlen($h); + }); + + + $responseContent = curl_exec($ch); + + $statusCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); + + if (curl_errno($ch)) + { + throw new CurlException($ch); + } + + curl_close($ch); + + return [$statusCode, $headers, $responseContent]; + } +} + +class CurlException extends Exception +{ + protected $errno, $error, $info, $handle; + + public function __construct($curlHandle, Exception $previous = null) + { + $this->handle = $curlHandle; + $this->errno = curl_errno($curlHandle); + $this->error = curl_error($curlHandle); + $this->info = curl_getinfo($curlHandle); + + parent::__construct($this->error, $this->errno, $previous); + } +} \ No newline at end of file diff --git a/view/template/download/_linux.php b/view/template/download/_linux.php index ebcd3c36..79d43b23 100644 --- a/view/template/download/_linux.php +++ b/view/template/download/_linux.php @@ -1,6 +1,7 @@

- + href=""

Works with Ubuntu, Debian, or any distro with apt or dpkg. - Prefer to build from source? Go here. + Prefer to build from source? Go here.
diff --git a/view/template/download/_osx.php b/view/template/download/_osx.php index ed286b0f..5f55fb2d 100644 --- a/view/template/download/_osx.php +++ b/view/template/download/_osx.php @@ -1,6 +1,7 @@

- + href=""