]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Settings/UserExport.php
Reformat Module\Settings\UserExport
[friendica.git] / src / Module / Settings / UserExport.php
index 740ec0ec045a233c46d341a12c4a1929564d2514..74bb517c39637509b5b0b70bf358d59ac42f3554 100644 (file)
@@ -1,8 +1,8 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
- * @license   GNU AGPL version 3 or any later version
+ * @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
@@ -23,20 +23,44 @@ namespace Friendica\Module\Settings;
 
 use Friendica\App;
 use Friendica\Core\Hook;
+use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
+use Friendica\Core\Session\Capability\IHandleUserSessions;
+use Friendica\Core\System;
 use Friendica\Database\DBA;
-use Friendica\Database\DBStructure;
+use Friendica\Database\Definition\DbaDefinition;
 use Friendica\DI;
+use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Model\Post;
 use Friendica\Module\BaseSettings;
+use Friendica\Module\Response;
 use Friendica\Network\HTTPException;
+use Friendica\Network\HTTPException\ForbiddenException;
+use Friendica\Network\HTTPException\InternalServerErrorException;
+use Friendica\Network\HTTPException\ServiceUnavailableException;
+use Friendica\Util\Profiler;
+use Psr\Log\LoggerInterface;
 
 /**
  * Module to export user data
  **/
 class UserExport extends BaseSettings
 {
+       /** @var IHandleUserSessions */
+       private $session;
+
+       /** @var DbaDefinition */
+       private $dbaDefinition;
+
+       public function __construct(DbaDefinition $dbaDefinition, IHandleUserSessions $session, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+       {
+               parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
+
+               $this->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]);