X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FModule%2FSettings%2FUserExport.php;h=74bb517c39637509b5b0b70bf358d59ac42f3554;hb=142b399c848a3ff5f3e0f452361d284a1b5dc135;hp=740ec0ec045a233c46d341a12c4a1929564d2514;hpb=6c4ddbdcd802b37dd644b6d1919dca4404214914;p=friendica.git diff --git a/src/Module/Settings/UserExport.php b/src/Module/Settings/UserExport.php index 740ec0ec04..74bb517c39 100644 --- a/src/Module/Settings/UserExport.php +++ b/src/Module/Settings/UserExport.php @@ -1,8 +1,8 @@ session = $session; + $this->dbaDefinition = $dbaDefinition; + } + /** * Handle the request to export data. * At the moment one can export three different data set @@ -48,33 +72,34 @@ class UserExport extends BaseSettings * If there is an action required through the URL / path, react * accordingly and export the requested data. * - * @param array $parameters Router-supplied parameters + * @param array $request * @return string - * @throws HTTPException\ForbiddenException - * @throws HTTPException\InternalServerErrorException + * @throws ForbiddenException + * @throws InternalServerErrorException + * @throws ServiceUnavailableException */ - public static function content(array $parameters = []) + protected function content(array $request = []): string { - if (!local_user()) { - throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); + if (!$this->session->getLocalUserId()) { + throw new HTTPException\ForbiddenException($this->l10n->t('Permission denied.')); } - parent::content($parameters); + parent::content(); /** * options shown on "Export personal data" page * list of array( 'link url', 'link text', 'help text' ) */ $options = [ - ['settings/userexport/account', DI::l10n()->t('Export account'), DI::l10n()->t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')], - ['settings/userexport/backup', DI::l10n()->t('Export all'), DI::l10n()->t("Export your account info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account \x28photos are not exported\x29")], - ['settings/userexport/contact', DI::l10n()->t('Export Contacts to CSV'), DI::l10n()->t("Export the list of the accounts you are following as CSV file. Compatible to e.g. Mastodon.")], + ['settings/userexport/account', $this->l10n->t('Export account'), $this->l10n->t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')], + ['settings/userexport/backup', $this->l10n->t('Export all'), $this->l10n->t('Export your account info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')], + ['settings/userexport/contact', $this->l10n->t('Export Contacts to CSV'), $this->l10n->t('Export the list of the accounts you are following as CSV file. Compatible to e.g. Mastodon.')], ]; Hook::callAll('uexport_options', $options); - $tpl = Renderer::getMarkupTemplate("settings/userexport.tpl"); + $tpl = Renderer::getMarkupTemplate('settings/userexport.tpl'); return Renderer::replaceMacros($tpl, [ - '$title' => DI::l10n()->t('Export personal data'), + '$title' => $this->l10n->t('Export personal data'), '$options' => $options ]); } @@ -85,39 +110,33 @@ class UserExport extends BaseSettings * to the browser which then offers a save / open dialog * to the user. * - * @param array $parameters Router-supplied parameters * @throws HTTPException\ForbiddenException */ - public static function rawContent(array $parameters = []) + protected function rawContent(array $request = []) { - if (!local_user() || !empty(DI::app()->user['uid']) && DI::app()->user['uid'] != local_user()) { - throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.')); + if (!$this->session->getLocalUserId()) { + throw new HTTPException\ForbiddenException($this->l10n->t('Permission denied.')); } - $args = DI::args(); - if ($args->getArgc() == 3) { - // @TODO Replace with router-provided arguments - $action = $args->get(2); - $user = DI::app()->user; - switch ($action) { - case "backup": - header("Content-type: application/json"); - header('Content-Disposition: attachment; filename="' . $user['nickname'] . '.' . $action . '"'); - self::exportAll(local_user()); + if (isset($this->parameters['action'])) { + switch ($this->parameters['action']) { + case 'backup': + header('Content-type: application/json'); + header('Content-Disposition: attachment; filename="' . DI::app()->getLoggedInUserNickname() . '.' . $this->parameters['action'] . '"'); + $this->echoAll($this->session->getLocalUserId()); break; - case "account": - header("Content-type: application/json"); - header('Content-Disposition: attachment; filename="' . $user['nickname'] . '.' . $action . '"'); - self::exportAccount(local_user()); + case 'account': + header('Content-type: application/json'); + header('Content-Disposition: attachment; filename="' . DI::app()->getLoggedInUserNickname() . '.' . $this->parameters['action'] . '"'); + $this->echoAccount($this->session->getLocalUserId()); break; - case "contact": - header("Content-type: application/csv"); - header('Content-Disposition: attachment; filename="' . $user['nickname'] . '-contacts.csv' . '"'); - self::exportContactsAsCSV(local_user()); + case 'contact': + header('Content-type: application/csv'); + header('Content-Disposition: attachment; filename="' . DI::app()->getLoggedInUserNickname() . '-contacts.csv' . '"'); + $this->echoContactsAsCSV($this->session->getLocalUserId()); break; } - - exit(); + System::exit(); } } @@ -126,11 +145,11 @@ class UserExport extends BaseSettings * @return array * @throws \Exception */ - private static function exportMultiRow(string $query) + private function exportMultiRow(string $query): array { - $dbStructure = DBStructure::definition(DI::app()->getBasePath(), false); + $dbStructure = $this->dbaDefinition->getAll(); - preg_match("/\s+from\s+`?([a-z\d_]+)`?/i", $query, $match); + preg_match('/\s+from\s+`?([a-z\d_]+)`?/i', $query, $match); $table = $match[1]; $result = []; @@ -158,33 +177,32 @@ class UserExport extends BaseSettings * @return array * @throws \Exception */ - private static function exportRow(string $query) + private function exportRow(string $query): array { - $dbStructure = DBStructure::definition(DI::app()->getBasePath(), false); + $dbStructure = $this->dbaDefinition->getAll(); - preg_match("/\s+from\s+`?([a-z\d_]+)`?/i", $query, $match); + preg_match('/\s+from\s+`?([a-z\d_]+)`?/i', $query, $match); $table = $match[1]; $result = []; - $r = q($query); - if (DBA::isResult($r)) { - foreach ($r as $rr) { - foreach ($rr as $k => $v) { - if (empty($dbStructure[$table]['fields'][$k])) { - continue; - } - - switch ($dbStructure[$table]['fields'][$k]['type']) { - case 'datetime': - $result[$k] = $v ?? DBA::NULL_DATETIME; - break; - default: - $result[$k] = $v; - break; - } + $rows = DBA::p($query); + while ($row = DBA::fetch($rows)) { + foreach ($row as $k => $v) { + if (empty($dbStructure[$table]['fields'][$k])) { + continue; + } + + switch ($dbStructure[$table]['fields'][$k]['type']) { + case 'datetime': + $result[$k] = $v ?? DBA::NULL_DATETIME; + break; + default: + $result[$k] = $v; + break; } } } + DBA::close($rows); return $result; } @@ -195,10 +213,10 @@ class UserExport extends BaseSettings * @param int $user_id * @throws \Exception */ - private static function exportContactsAsCSV(int $user_id) + private function echoContactsAsCSV(int $user_id) { if (!$user_id) { - throw new \RuntimeException(DI::l10n()->t('Permission denied.')); + throw new \RuntimeException($this->l10n->t('Permission denied.')); } // write the table header (like Mastodon) @@ -215,52 +233,52 @@ class UserExport extends BaseSettings * @param int $user_id * @throws \Exception */ - private static function exportAccount(int $user_id) + private function echoAccount(int $user_id) { if (!$user_id) { - throw new \RuntimeException(DI::l10n()->t('Permission denied.')); + throw new \RuntimeException($this->l10n->t('Permission denied.')); } - $user = self::exportRow( + $user = $this->exportRow( sprintf("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", $user_id) ); - $contact = self::exportMultiRow( + $contact = $this->exportMultiRow( sprintf("SELECT * FROM `contact` WHERE `uid` = %d ", $user_id) ); - $profile = self::exportMultiRow( + $profile = $this->exportMultiRow( sprintf("SELECT *, 'default' AS `profile_name`, 1 AS `is-default` FROM `profile` WHERE `uid` = %d ", $user_id) ); - $profile_fields = self::exportMultiRow( + $profile_fields = $this->exportMultiRow( sprintf("SELECT * FROM `profile_field` WHERE `uid` = %d ", $user_id) ); - $photo = self::exportMultiRow( + $photo = $this->exportMultiRow( sprintf("SELECT * FROM `photo` WHERE uid = %d AND profile = 1", $user_id) ); foreach ($photo as &$p) { $p['data'] = bin2hex($p['data']); } - $pconfig = self::exportMultiRow( + $pconfig = $this->exportMultiRow( sprintf("SELECT * FROM `pconfig` WHERE uid = %d", $user_id) ); - $group = self::exportMultiRow( + $group = $this->exportMultiRow( sprintf("SELECT * FROM `group` WHERE uid = %d", $user_id) ); - $group_member = self::exportMultiRow( + $group_member = $this->exportMultiRow( sprintf("SELECT `group_member`.`gid`, `group_member`.`contact-id` FROM `group_member` INNER JOIN `group` ON `group`.`id` = `group_member`.`gid` WHERE `group`.`uid` = %d", $user_id) ); $output = [ - 'version' => FRIENDICA_VERSION, + 'version' => App::VERSION, 'schema' => DB_UPDATE_VERSION, - 'baseurl' => DI::baseUrl(), + 'baseurl' => $this->baseUrl, 'user' => $user, 'contact' => $contact, 'profile' => $profile, @@ -280,13 +298,13 @@ class UserExport extends BaseSettings * @param int $user_id * @throws \Exception */ - private static function exportAll(int $user_id) + private function echoAll(int $user_id) { if (!$user_id) { - throw new \RuntimeException(DI::l10n()->t('Permission denied.')); + throw new \RuntimeException($this->l10n->t('Permission denied.')); } - self::exportAccount($user_id); + $this->echoAccount($user_id); echo "\n"; $total = Post::count(['uid' => $user_id]);