diff options
author | Julius Härtl <jus@bitgrid.net> | 2017-04-23 15:24:20 +0300 |
---|---|---|
committer | Julius Härtl <jus@bitgrid.net> | 2017-10-25 15:00:16 +0300 |
commit | 0b49dc10486f1444de5892f4bf902eb8c860117a (patch) | |
tree | 2532308dbf03d91c68beff0c70fe0fa885994345 /lib/Sections | |
parent | 280ee5db1e1f7f617ae90da534c0d1bc96b03db0 (diff) |
Allow apps to define custom bug report details
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Diffstat (limited to 'lib/Sections')
-rw-r--r-- | lib/Sections/ClientSection.php | 70 | ||||
-rw-r--r-- | lib/Sections/LogSection.php | 43 | ||||
-rw-r--r-- | lib/Sections/ServerSection.php | 244 |
3 files changed, 357 insertions, 0 deletions
diff --git a/lib/Sections/ClientSection.php b/lib/Sections/ClientSection.php new file mode 100644 index 0000000..7463096 --- /dev/null +++ b/lib/Sections/ClientSection.php @@ -0,0 +1,70 @@ +<?php +/** + * @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\IssueTemplate\Sections; + +use OCP\IRequest; +use OCA\IssueTemplate\Section; + +class ClientSection extends Section { + + public function __construct(IRequest $request) { + parent::__construct('client-detail', 'Client configuration'); + + $app = $request->getParam('app'); + + if($app !== 'ios' && $app !== 'android') { + $this->createDetail('Browser', $this->getBrowser()); + $this->createDetail('Operating system', ''); + } + + if($app === 'android') { + $this->createDetail('Android version', ''); + $this->createDetail('Device model', ''); + $this->createDetail('Stock or customized system:', ''); + $this->createDetail('Nextcloud app version:', ''); + $this->createDetail('Nextcloud server version:', ''); + } + } + + private function getBrowser() { + $browser = @get_browser(null, true); + $browserString = ''; + if($browser) { + if(array_key_exists('browser', $browser)) { + $browserString .= $browser['browser'] . ' '; + } + if(array_key_exists('version', $browser)) { + $browserString .= $browser['version'] . ' '; + } + if(array_key_exists('plattform', $browser)) { + $browserString .= $browser['plattform'] . ' '; + } + } + if(empty($browserString)) { + return $_SERVER['HTTP_USER_AGENT']; + } + return $browserString; + } + +}
\ No newline at end of file diff --git a/lib/Sections/LogSection.php b/lib/Sections/LogSection.php new file mode 100644 index 0000000..53ed2a2 --- /dev/null +++ b/lib/Sections/LogSection.php @@ -0,0 +1,43 @@ +<?php +/** + * @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\IssueTemplate\Sections; + + +use OCA\IssueTemplate\IDetail; +use OCA\IssueTemplate\Section; + +class LogSection extends Section { + + public function __construct() { + parent::__construct('log-detail', 'Logs'); + $this->createDetail('Browser log', 'Insert your webserver log here ', IDetail::TYPE_COLLAPSIBLE_PREFORMAT); + $this->createDetail('Nextcloud log', 'Insert your Nextcloud log here', IDetail::TYPE_COLLAPSIBLE_PREFORMAT); + $this->createDetail('Browser log', 'Insert your browser log here, this could for example include: + + a) The javascript console log + b) The network log + c) ...', IDetail::TYPE_COLLAPSIBLE); + } + +}
\ No newline at end of file diff --git a/lib/Sections/ServerSection.php b/lib/Sections/ServerSection.php new file mode 100644 index 0000000..573a6ba --- /dev/null +++ b/lib/Sections/ServerSection.php @@ -0,0 +1,244 @@ +<?php +/** + * @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\IssueTemplate\Sections; + +use OC\SystemConfig; +use OCA\IssueTemplate\IDetail; +use OCP\IConfig; +use OC\IntegrityCheck\Checker; +use OCP\App\IAppManager; +use OCP\IDBConnection; +use OCA\IssueTemplate\Section; +use OCA\Files_External\Service\BackendService; + +class ServerSection extends Section { + + /** @var IConfig */ + private $config; + /** @var Checker */ + private $checker; + /** @var IAppManager */ + private $appManager; + /** @var SystemConfig */ + private $systemConfig; + /** @var IDBConnection */ + private $connection; + + public function __construct(IConfig $config, + Checker $checker, + IAppManager $appManager, + IDBConnection $connection) { + parent::__construct('server-detail', 'Server configuration detail'); + $this->config = $config; + $this->checker = $checker; + $this->appManager = $appManager; + $this->systemConfig = \OC::$server->query('SystemConfig'); + $this->connection = $connection; + $this->createDetail('Operating system', $this->getOsVersion()); + $this->createDetail('Webserver', $this->getWebserver()); + $this->createDetail('Database', $this->getDatabaseInfo()); + $this->createDetail('PHP version', $this->getPhpVersion()); + $this->createDetail('Nextcloud version', $this->getNextcloudVersion()); + $this->createDetail('Updated from an older Nextcloud/ownCloud or fresh install', ''); + $this->createDetail('Where did you install Nextcloud from', $this->getInstallMethod()); + $this->createDetail('Signing status', $this->getIntegrityResults(), IDetail::TYPE_COLLAPSIBLE); + $this->createDetail('List of activated apps', $this->renderAppList(), IDetail::TYPE_COLLAPSIBLE_PREFORMAT); + + $this->createDetail('Configuration (config/config.php)', print_r(json_encode($this->getConfig(), JSON_PRETTY_PRINT), true), IDetail::TYPE_COLLAPSIBLE_PREFORMAT); + + $this->createDetail('Are you using external storage, if yes which one', 'local/smb/sftp/...'); + $this->createDetail('Are you using encryption', $this->getEncryptionInfo()); + $this->createDetail('Are you using an external user-backend, if yes which one', 'LDAP/ActiveDirectory/Webdav/...'); + + $this->createDetail('LDAP configuration (delete this part if not used)', 'With access to your command line run e.g.: +sudo -u www-data php occ ldap:show-config +from within your Nextcloud installation folder + +Without access to your command line download the data/owncloud.db to your local +computer or access your SQL server remotely and run the select query: +SELECT * FROM `oc_appconfig` WHERE `appid` = \'user_ldap\'; + + +Eventually replace sensitive data as the name/IP-address of your LDAP server or groups.', IDetail::TYPE_COLLAPSIBLE_PREFORMAT); + } + private function getWebserver() { + return $_SERVER['SERVER_SOFTWARE'] . ' (' . PHP_SAPI . ')'; + } + + private function getNextcloudVersion() { + return \OC_Util::getHumanVersion() . ' - ' . $this->config->getSystemValue('version'); + } + private function getOsVersion() { + return PHP_OS; + } + private function getPhpVersion() { + return PHP_VERSION . "\nModules loaded: " . implode(', ', get_loaded_extensions()); + } + + protected function getDatabaseInfo() { + return $this->config->getSystemValue('dbtype') . ' ' . $this->getDatabaseVersion(); + } + + /** + * original source from nextcloud/survey_client + * @link https://github.com/nextcloud/survey_client/blob/master/lib/Categories/Database.php#L80-L107 + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @author Joas Schilling <coding@schilljs.com> + * @license AGPL-3.0 + */ + private function getDatabaseVersion() { + switch ($this->config->getSystemValue('dbtype')) { + case 'sqlite': + case 'sqlite3': + $sql = 'SELECT sqlite_version() AS version'; + break; + case 'oci': + $sql = 'SELECT version FROM v$instance'; + break; + case 'mysql': + case 'pgsql': + default: + $sql = 'SELECT VERSION() AS version'; + break; + } + $result = $this->connection->executeQuery($sql); + $row = $result->fetch(); + $result->closeCursor(); + if ($row) { + return $this->cleanVersion($row['version']); + } + return 'N/A'; + } + + /** + * Try to strip away additional information + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @author Joas Schilling <coding@schilljs.com> + * @license AGPL-3.0 + * + * @param string $version E.g. `5.6.27-0ubuntu0.14.04.1` + * @return string `5.6.27` + */ + protected function cleanVersion($version) { + $matches = []; + preg_match('/^(\d+)(\.\d+)(\.\d+)/', $version, $matches); + if (isset($matches[0])) { + return $matches[0]; + } + return $version; + } + + private function getIntegrityResults() { + if(!$this->checker->isCodeCheckEnforced()) { + return 'Integrity checker has been disabled. Integrity cannot be verified.'; + } + return $this->checker->getResults(); + } + + private function getInstallMethod() { + $base = \OC::$SERVERROOT; + if(file_exists($base . '/.git')) { + return 'git'; + } + return 'unknown'; + } + + private function renderAppList() { + $apps = $this->getAppList(); + $result = "Enabled:\n"; + foreach ($apps['enabled'] as $name => $version) { + $result .= ' - ' . $name . ': ' . $version . "\n"; + } + + $result .= "Disabled:\n"; + foreach ($apps['disabled'] as $name => $version) { + $result .= ' - ' . $name . "\n"; + } + return $result; + } + + /** + * @return string[][] + */ + private function getAppList() { + $apps = \OC_App::getAllApps(); + $enabledApps = $disabledApps = []; + $versions = \OC_App::getAppVersions(); + + //sort enabled apps above disabled apps + foreach ($apps as $app) { + if ($this->appManager->isInstalled($app)) { + $enabledApps[] = $app; + } else { + $disabledApps[] = $app; + } + } + $apps = ['enabled' => [], 'disabled' => []]; + sort($enabledApps); + foreach ($enabledApps as $app) { + $apps['enabled'][$app] = isset($versions[$app]) ? $versions[$app] : true; + } + sort($disabledApps); + foreach ($disabledApps as $app) { + $apps['disabled'][$app] = null; + } + return $apps; + } + + protected function getEncryptionInfo() { + return $this->config->getAppValue('core', 'encryption_enabled', 'no'); + } + + protected function getExternalStorageInfo() { + if(\OC::$server->getAppManager()->isEnabledForUser('files_external')) { + // $mounts = $this->globalService->getStorageForAllUsers(); + // Global storage services + // https://github.com/nextcloud/server/blob/8c7d7d7746e76b77ad86cee3aae5dbd4d1bcd896/apps/files_external/lib/Command/ListCommand.php + /** @var BackendService $backendService */ + $backendService = \OC::$server->query(BackendService::class); + $result = array(); + foreach ($backendService->getAvailableBackends() as $backend) { + $result[] = $backend->getStorageClass(); + } + return $result; + } + return 'files_external is disabled'; + } + + private function getConfig() { + + $keys = $this->systemConfig->getKeys(); + $configs = []; + foreach ($keys as $key) { + $value = $this->systemConfig->getFilteredValue($key, serialize(null)); + if ($value !== 'N;') { + $configs[$key] = $value; + } + } + return $configs; + } + +}
\ No newline at end of file |