%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/Survey/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/Survey/ServerReportHelper.php |
<?php
namespace OCA\Passwords\Helper\Survey;
use Exception;
use OC_App;
use OC_Util;
use OCA\Passwords\AppInfo\SystemRequirements;
use OCA\Passwords\Db\FolderRevisionMapper;
use OCA\Passwords\Db\PasswordRevisionMapper;
use OCA\Passwords\Db\ShareMapper;
use OCA\Passwords\Db\TagRevisionMapper;
use OCA\Passwords\Exception\ApiException;
use OCA\Passwords\Helper\AppSettings\ServiceSettingsHelper;
use OCA\Passwords\Helper\Image\AutoImageHelper;
use OCA\Passwords\Services\ConfigurationService;
use OCA\Passwords\Services\HelperService;
use OCP\Http\Client\IClientService;
use Throwable;
/**
* Class ServerReportHelper
*
* @package OCA\Passwords\Helper\Survey
*/
class ServerReportHelper {
const API_URL = 'https://statistics.passwordsapp.org/api.php';
/**
* @var ConfigurationService
*/
protected ConfigurationService $config;
/**
* @var ShareMapper
*/
protected ShareMapper $shareMapper;
/**
* @var ServiceSettingsHelper
*/
protected ServiceSettingsHelper $serviceSettings;
/**
* @var TagRevisionMapper
*/
protected TagRevisionMapper $tagRevisionMapper;
/**
* @var FolderRevisionMapper
*/
protected FolderRevisionMapper $folderRevisionMapper;
/**
* @var PasswordRevisionMapper
*/
protected PasswordRevisionMapper $passwordRevisionMapper;
/**
* @var HelperService
*/
protected HelperService $helperService;
/**
* @var IClientService
*/
protected IClientService $httpClientService;
/**
* ServerReportHelper constructor.
*
* @param ShareMapper $shareMapper
* @param ConfigurationService $config
* @param HelperService $helperService
* @param IClientService $httpClientService
* @param TagRevisionMapper $tagRevisionMapper
* @param ServiceSettingsHelper $serviceSettings
* @param FolderRevisionMapper $folderRevisionMapper
* @param PasswordRevisionMapper $passwordRevisionMapper
*/
public function __construct(
ShareMapper $shareMapper,
ConfigurationService $config,
HelperService $helperService,
IClientService $httpClientService,
TagRevisionMapper $tagRevisionMapper,
ServiceSettingsHelper $serviceSettings,
FolderRevisionMapper $folderRevisionMapper,
PasswordRevisionMapper $passwordRevisionMapper
) {
$this->config = $config;
$this->shareMapper = $shareMapper;
$this->helperService = $helperService;
$this->serviceSettings = $serviceSettings;
$this->httpClientService = $httpClientService;
$this->tagRevisionMapper = $tagRevisionMapper;
$this->folderRevisionMapper = $folderRevisionMapper;
$this->passwordRevisionMapper = $passwordRevisionMapper;
}
/**
* @param bool $enhanced
*/
public function sendReport(bool $enhanced = true): void {
if(!$this->hasData()) return;
$currentWeek = date('W');
if($this->config->getAppValue('survey/server/week', '') === $currentWeek) return;
$report = $this->getReport($enhanced);
try {
$client = $this->httpClientService->newClient();
$client->post(self::API_URL, ['json' => $report]);
$this->config->setAppValue('survey/server/week', $currentWeek);
} catch(Exception $e) {
}
}
/**
* @param bool $enhanced
*
* @return array
*/
public function getReport(bool $enhanced = true): array {
$report = [
'version' => $this->getVersions(),
'environment' => $this->getEnvironment()
];
if($enhanced) {
$report['services'] = $this->getServices();
$report['settings'] = $this->getSettings();
$report['status'] = $this->getStatus();
$report['apps'] = $this->getApps();
$report['sharing'] = $this->getSharing();
$report['encryption'] = $this->getEncryption();
}
return $report;
}
/**
* @return array
*/
protected function getVersions(): array {
return [
'server' => $this->config->getSystemValue('version'),
'app' => $this->config->getAppValue('installed_version'),
'lsr' => SystemRequirements::APP_LSR,
'php' => $this->config->getAppValue('web/php/version/string', phpversion()),
'cronPhp' => $this->config->getAppValue('cron/php/version/string', phpversion())
];
}
/**
* @return array
*/
protected function getEnvironment(): array {
$subdirectory = (
strlen(strval(parse_url($this->config->getSystemValue('overwrite.cli.url', ''), PHP_URL_PATH))) > 1 ||
strlen(strval($this->config->getSystemValue('overwritewebroot', ''))) > 1
);
return [
'os' => php_uname('s'),
'architecture' => php_uname('m'),
'bits' => PHP_INT_SIZE * 8,
'database' => $this->config->getSystemValue('dbtype'),
'cron' => $this->config->getAppValue('backgroundjobs_mode', 'ajax', 'core'),
'proxy' => !empty($this->config->getSystemValue('proxy', '')),
'sslProxy' => strtolower($this->config->getSystemValue('overwriteprotocol', '')) === 'https',
'subdirectory' => $subdirectory,
];
}
/**
* @return array
*/
protected function getServices(): array {
$images = $this->config->getAppValue('service/images', HelperService::IMAGES_AUTO);
if($images === HelperService::IMAGES_AUTO) {
try {
/** @var AutoImageHelper $helper */
$helper = $this->helperService->getImageHelper(HelperService::IMAGES_AUTO);
$images = $helper->getRealImageHelperName();
} catch(Throwable $e) {
$images = HelperService::IMAGES_GDLIB;
}
}
$previewApi = false;
$faviconApi = false;
try {
$previewApi = $this->serviceSettings->get('preview.api')['value'] !== '';
$faviconSetting = $this->serviceSettings->get('favicon.api');
$faviconApi = $faviconSetting['value'] !== $faviconSetting['default'];
} catch(ApiException $e) {
}
return [
'images' => $images,
'favicons' => $this->config->getAppValue('service/favicon', HelperService::FAVICON_DEFAULT),
'previews' => $this->config->getAppValue('service/preview', HelperService::PREVIEW_DEFAULT),
'security' => $this->config->getAppValue('service/security', HelperService::SECURITY_HIBP),
'words' => $this->config->getAppValue('service/words', HelperService::WORDS_AUTO),
'previewApi' => $previewApi,
'faviconApi' => $faviconApi
];
}
/**
* @return array
*/
protected function getSettings(): array {
$performance = $this->config->getAppValue('performance', null);
if($performance === null) $performance = in_array(php_uname('m'), ['amd64', 'x86_64']) ? 5:1;
if($performance < 0 || $performance > 6) $performance = 2;
return [
'channel' => OC_Util::getChannel(),
'nightlies' => $this->config->getAppValue('nightly/enabled', '0') === '1',
'handbook' => $this->config->getAppValue('handbook/url') !== null,
'performance' => intval($performance)
];
}
/**
* @return array
*/
protected function getStatus(): array {
$autoBackupRestored = $this->config->getAppValue('backup/update/restored', '0') === '1';
return [
'autoBackupRestored' => $autoBackupRestored
];
}
/**
* @return array
*/
protected function getApps(): array {
$appClass = new OC_App();
$apps = $appClass->listAllApps();
$data = [];
foreach(['guests', 'occweb', 'theming', 'passman', 'unsplash', 'impersonate', 'passwords_handbook'] as $app) {
$data[ $app ] = [
'installed' => false,
'enabled' => false
];
}
foreach($apps as $app) {
if(isset($data[ $app['id'] ])) {
$data[ $app['id'] ] = [
'installed' => true,
'enabled' => $app['active']
];
}
}
return $data;
}
/**
* @return array
*/
protected function getSharing(): array {
$count = count($this->shareMapper->findAll());
if($count === 0) {
$total = 0;
} else if($count <= 10) {
$total = 10;
} else if($count <= 25) {
$total = 25;
} else if($count <= 50) {
$total = 50;
} else if($count <= 100) {
$total = 100;
} else if($count <= 500) {
$total = 500;
} else {
$total = 501;
}
return ['shares' => $total];
}
/**
* @return array
*/
protected function getEncryption(): array {
return [
'sse' => $this->getSseEncryption(),
'cse' => $this->getCseEncryption()
];
}
/**
* @return array
*/
protected function getSseEncryption(): array {
$data = [];
$best = [0, 'none'];
foreach(['SSEv1r1', 'SSEv1r2', 'SSEv2r1', 'SSEv3r1', 'none'] as $encryption) {
$count = $this->countEntitiesByField($encryption);
$data[ $encryption ] = $count > 0;
if($count > $best[0]) $best = [$count, $encryption];
}
if($best[0] === 0) return [];
$data['default'] = $best[1];
return $data;
}
/**
* @return array
*/
protected function getCseEncryption(): array {
$data = [];
$best = [0, 'none'];
foreach(['CSEv1r1', 'none'] as $encryption) {
$count = $this->countEntitiesByField($encryption, 'cse_type');
$data[ $encryption ] = $count > 0;
if($count > $best[0]) $best = [$count, $encryption];
}
if($best[0] === 0) return [];
$data['default'] = $best[1];
return $data;
}
/**
* @param $value
* @param string $field
*
* @return int
*/
protected function countEntitiesByField($value, $field = 'sse_type'): int {
try {
return count($this->tagRevisionMapper->findAllByField($field, $value))
+ count($this->folderRevisionMapper->findAllByField($field, $value))
+ count($this->passwordRevisionMapper->findAllByField($field, $value));
} catch(Exception $e) {
return 0;
}
}
/**
* @return bool
*/
public function hasData(): bool {
return count($this->passwordRevisionMapper->findAll()) > 0;
}
}