public function updateApp($app_id, $version = null) { $app = Mysql::getInstance()->from('apps')->where(array('id' => $app_id))->get()->first(); if (empty($app)) { return false; } if ($version === null) { return $this->installApp($app_id); } $tmp_file = '/tmp/' . uniqid('app_') . '.zip'; $repo = new GitHub($app['url']); $zip_url = 'https://github.com/' . $repo->getOwner() . '/' . $repo->getRepository() . '/archive/' . $version . '.zip'; file_put_contents($tmp_file, fopen($zip_url, 'r', false, stream_context_create(array('http' => array('header' => "User-Agent: stalker_portal\r\n"))))); if (empty($app['alias'])) { $app['alias'] = self::safeFilename($app['name']); } $path = PROJECT_PATH . '/../../' . Config::getSafe('apps_path', 'stalker_apps/') . $app['alias']; umask(0); if (!is_dir($path)) { mkdir($path, 0755, true); } $archive = new ZipArchive(); if ($archive->open($tmp_file) === true) { $entry = $archive->getNameIndex(0); $dir = substr($entry, 0, strpos($entry, '/')); $result = $archive->extractTo($path); $archive->close(); rename($path . '/' . $dir, $path . '/' . $version); } else { return false; } unlink($tmp_file); if ($result) { $update_data = array('current_version' => $version); $update_data['alias'] = $app['alias']; if (!isset($repo)) { $repo = new GitHub($app['url']); } $info = $repo->getFileContent('package.json'); if (!empty($info['description'])) { $update_data['description'] = $info['description']; } if (!empty($info['config']['icons'])) { $update_data['icons'] = $info['config']['icons']; } else { $update_data['icons'] = 'icons'; } if (!empty($info['config']['backgroundColor'])) { $update_data['icon_color'] = $info['config']['backgroundColor']; } Mysql::getInstance()->update('apps', $update_data, array('id' => $app_id)); } return $result; }
public function application_get_data_from_repo() { if (!$this->isAjax || $this->method != 'POST' || empty($this->postData['apps']['url'])) { $this->app->abort(404, $this->setLocalization('Page not found')); } if ($no_auth = $this->checkAuth()) { return $no_auth; } $response['action'] = 'buildSaveForm'; $response['data'] = array(); $response['error'] = ''; try { $repo = new \GitHub($this->postData['apps']['url']); $response['data'] = $repo->getFileContent('package.json'); if (!array_key_exists('repository', $response['data'])) { $response['data']['repository']['url'] = $this->postData['apps']['url']; } } catch (\GitHubError $e) { $response['error'] = $this->setLocalization($e->getMessage()); } $response = $this->generateAjaxResponse($response); return new Response(json_encode($response), empty($error) ? 200 : 500); }