]> git.mxchange.org Git - friendica.git/commitdiff
Create new Settings\RemoveMe module class
authorHypolite Petovan <hypolite@mrpetovan.com>
Tue, 8 Nov 2022 04:58:21 +0000 (23:58 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Tue, 8 Nov 2022 23:33:54 +0000 (18:33 -0500)
- Moved route from /removeme to /settings/removeme
- Combined templates into one

doc/Remove-Account.md
doc/de/Remove-Account.md
src/Model/User.php
src/Module/BaseSettings.php
src/Module/Settings/RemoveMe.php [new file with mode: 0644]
src/Module/Tos.php
static/routes.config.php
view/templates/settings/removeme.tpl [new file with mode: 0644]

index 21e0ebf7e0c0dd06cb65a9ed62ba68ec46f70d08..83cb941e80e90d9cd61293d403033f869e6a353e 100644 (file)
@@ -5,7 +5,7 @@ Remove Account
 
 We don't like to see people leave Friendica, but if you need to remove your account, you should visit the URL
 
-http://sitename/removeme
+http://sitename/settings/removeme
 
 with your web browser.
 You will need to be logged in at the time.
index dccb0655a1cb56937a7c6394d95e8fcbf987f68b..5cba208fea213a1ef81d2693a75e90872094a94b 100644 (file)
@@ -5,7 +5,7 @@ Accounts löschen
 
 Wir freuen uns nicht, wenn Leute Friendica verlassen, aber wenn du deinen Account löschen willst, dann besuche die folgende URL
 
-[Lösche mich (http://NamederSeite/removeme)](../removeme)
+[Lösche mich (http://NamederSeite/settings/removeme)](../settings/removeme)
 
 in deinem Webbrowser. Du musst dabei eingeloggt sein. 
 
index 005e3bbf35ccc6213dc7d098ab8deaea1a90b15b..3f5376e0b85684de6232c68ba18ca9972068dccf 100644 (file)
@@ -1418,7 +1418,7 @@ class User
                If you are new and do not know anybody here, they may help
                you to make some new and interesting friends.
 
-               If you ever want to delete your account, you can do so at %1$s/removeme
+               If you ever want to delete your account, you can do so at %1$s/settings/removeme
 
                Thank you and welcome to %4$s.'));
 
@@ -1522,7 +1522,7 @@ class User
                        If you are new and do not know anybody here, they may help
                        you to make some new and interesting friends.
 
-                       If you ever want to delete your account, you can do so at %3$s/removeme
+                       If you ever want to delete your account, you can do so at %3$s/settings/removeme
 
                        Thank you and welcome to %2$s.',
                        $user['nickname'],
index a9bc156f121f60615dc34cfef354a6f55641ad76..013783c0aba83449d2e0a2fea143866562b04824 100644 (file)
@@ -111,8 +111,8 @@ class BaseSettings extends BaseModule
 
                $tabs[] = [
                        'label' => DI::l10n()->t('Remove account'),
-                       'url' => 'removeme',
-                       'selected' => ((DI::args()->getArgc() == 1) && (DI::args()->getArgv() === 'removeme') ? 'active' : ''),
+                       'url' => 'settings/removeme',
+                       'selected' => static::class === Settings\RemoveMe::class ? 'active' : '',
                        'accesskey' => 'r',
                ];
 
diff --git a/src/Module/Settings/RemoveMe.php b/src/Module/Settings/RemoveMe.php
new file mode 100644 (file)
index 0000000..b9a7f5c
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @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 <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Module\Settings;
+
+use Friendica\App;
+use Friendica\Core\Config\Capability\IManageConfigValues;
+use Friendica\Core\L10n;
+use Friendica\Core\Renderer;
+use Friendica\Core\Session\Capability\IHandleUserSessions;
+use Friendica\Database\Database;
+use Friendica\DI;
+use Friendica\Model\User;
+use Friendica\Model\User\Cookie;
+use Friendica\Module\BaseSettings;
+use Friendica\Module\Response;
+use Friendica\Navigation\SystemMessages;
+use Friendica\Util\Emailer;
+use Friendica\Util\Profiler;
+use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
+
+class RemoveMe extends BaseSettings
+{
+       /** @var IHandleUserSessions */
+       private $session;
+       /** @var IManageConfigValues */
+       private $config;
+       /** @var Database */
+       private $database;
+       /** @var Emailer */
+       private $emailer;
+       /** @var SystemMessages */
+       private $systemMessages;
+       /** @var Cookie */
+       private $cookie;
+
+       public function __construct(Cookie $cookie, SystemMessages $systemMessages, Emailer $emailer, Database $database, IManageConfigValues $config, 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->config         = $config;
+               $this->database       = $database;
+               $this->emailer        = $emailer;
+               $this->systemMessages = $systemMessages;
+               $this->cookie         = $cookie;
+       }
+
+       protected function post(array $request = [])
+       {
+               if (!$this->session->getLocalUserId()) {
+                       return;
+               }
+
+               if ($this->session->getSubManagedUserId()) {
+                       return;
+               }
+
+               $hash = $this->session->pop('remove_account_verify');
+               if (empty($hash) || empty($request[$hash])) {
+                       return;
+               }
+
+               try {
+                       $userId = User::getIdFromPasswordAuthentication($this->session->getLocalUserId(), trim($request[$hash]));
+               } catch (\Throwable $e) {
+                       $this->systemMessages->addNotice($e->getMessage());
+                       return;
+               }
+
+               // send notification to admins so that they can clean up the backups
+               $admin_mails = explode(',', $this->config->get('config', 'admin_email'));
+               foreach ($admin_mails as $mail) {
+                       $admin = $this->database->selectFirst('user', ['uid', 'language', 'email', 'username'], ['email' => trim($mail)]);
+                       if (!$admin) {
+                               continue;
+                       }
+
+                       $l10n = $this->l10n->withLang($admin['language']);
+
+                       $email = $this->emailer
+                               ->newSystemMail()
+                               ->withMessage(
+                                       $l10n->t('[Friendica System Notify]') . ' ' . $l10n->t('User deleted their account'),
+                                       $l10n->t('On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups.'),
+                                       $l10n->t('The user id is %d', $this->session->getLocalUserId()))
+                               ->forUser($admin)
+                               ->withRecipient($admin['email'])
+                               ->build();
+                       $this->emailer->send($email);
+               }
+
+               User::remove($userId);
+
+               $this->session->clear();
+               $this->cookie->clear();
+
+               $this->systemMessages->addInfo($this->t('Your user account has been successfully removed. Bye bye!'));
+               $this->baseUrl->redirect();
+       }
+
+       protected function content(array $request = []): string
+       {
+               parent::content();
+
+               if (!$this->session->getLocalUserId()) {
+                       $this->systemMessages->addNotice($this->t('Permission denied.'));
+                       $this->baseUrl->redirect();
+               }
+
+               $hash = Strings::getRandomHex();
+
+               $this->session->set('remove_account_verify', $hash);
+
+               $tpl = Renderer::getMarkupTemplate('settings/removeme.tpl');
+               return Renderer::replaceMacros($tpl, [
+                       '$l10n' => [
+                               'title' => DI::l10n()->t('Remove My Account'),
+                               'desc'  => DI::l10n()->t('This will completely remove your account. Once this has been done it is not recoverable.'),
+                       ],
+                       '$password' => [$hash, $this->t('Please enter your password for verification:'), null, null, true],
+               ]);
+       }
+}
index 49d56ed6cf1df05372245f377e110417c265c4e3..31beb665155e9317ce8910f4f6b3cab80fe20bcc 100644 (file)
@@ -56,7 +56,7 @@ class Tos extends BaseModule
 
                $this->privacy_operate    = $this->t('At the time of registration, and for providing communications between the user account and their contacts, the user has to provide a display name (pen name), an username (nickname) and a working email address. The names will be accessible on the profile page of the account by any visitor of the page, even if other profile details are not displayed. The email address will only be used to send the user notifications about interactions, but wont be visibly displayed. The listing of an account in the node\'s user directory or the global user directory is optional and can be controlled in the user settings, it is not necessary for communication.');
                $this->privacy_distribute = $this->t('This data is required for communication and is passed on to the nodes of the communication partners and is stored there. Users can enter additional private data that may be transmitted to the communication partners accounts.');
-               $this->privacy_delete     = $this->t('At any point in time a logged in user can export their account data from the <a href="%1$s/settings/userexport">account settings</a>. If the user wants to delete their account they can do so at <a href="%1$s/removeme">%1$s/removeme</a>. The deletion of the account will be permanent. Deletion of the data will also be requested from the nodes of the communication partners.', $this->baseUrl);
+               $this->privacy_delete     = $this->t('At any point in time a logged in user can export their account data from the <a href="%1$s/settings/userexport">account settings</a>. If the user wants to delete their account they can do so at <a href="%1$s/settings/removeme">%1$s/settings/removeme</a>. The deletion of the account will be permanent. Deletion of the data will also be requested from the nodes of the communication partners.', $this->baseUrl);
                // In some cases we don't need every single one of the above separate, but all in one block.
                // So here is an array to look over
                $this->privacy_complete = [$this->t('Privacy Statement'), $this->privacy_operate,
@@ -90,7 +90,7 @@ class Tos extends BaseModule
                                '$privstatementtitle'   => $this->t('Privacy Statement'),
                                '$privacy_operate'      => $this->t('At the time of registration, and for providing communications between the user account and their contacts, the user has to provide a display name (pen name), an username (nickname) and a working email address. The names will be accessible on the profile page of the account by any visitor of the page, even if other profile details are not displayed. The email address will only be used to send the user notifications about interactions, but wont be visibly displayed. The listing of an account in the node\'s user directory or the global user directory is optional and can be controlled in the user settings, it is not necessary for communication.'),
                                '$privacy_distribute'   => $this->t('This data is required for communication and is passed on to the nodes of the communication partners and is stored there. Users can enter additional private data that may be transmitted to the communication partners accounts.'),
-                               '$privacy_delete'       => $this->t('At any point in time a logged in user can export their account data from the <a href="%1$s/settings/userexport">account settings</a>. If the user wants to delete their account they can do so at <a href="%1$s/removeme">%1$s/removeme</a>. The deletion of the account will be permanent. Deletion of the data will also be requested from the nodes of the communication partners.', $this->baseUrl)
+                               '$privacy_delete'       => $this->t('At any point in time a logged in user can export their account data from the <a href="%1$s/settings/userexport">account settings</a>. If the user wants to delete their account they can do so at <a href="%1$s/settings/removeme">%1$s/settings/removeme</a>. The deletion of the account will be permanent. Deletion of the data will also be requested from the nodes of the communication partners.', $this->baseUrl)
                        ]);
                } else {
                        return '';
index 321e7659c4126b5f0635addf1baefc058fe9c47e..12d68f40163bc815159e6c19857de8468f98091c 100644 (file)
@@ -605,6 +605,7 @@ return [
                        '/photo[/new]'         => [Module\Settings\Profile\Photo\Index::class, [R::GET, R::POST]],
                        '/photo/crop/{guid}'   => [Module\Settings\Profile\Photo\Crop::class,  [R::GET, R::POST]],
                ],
+               '/removeme'              => [Module\Settings\RemoveMe::class,              [R::GET, R::POST]],
                '/userexport[/{action}]' => [Module\Settings\UserExport::class,            [R::GET         ]],
        ],
 
diff --git a/view/templates/settings/removeme.tpl b/view/templates/settings/removeme.tpl
new file mode 100644 (file)
index 0000000..0532d9c
--- /dev/null
@@ -0,0 +1,16 @@
+<div class="generic-page-wrapper">
+    {{include file="section_title.tpl" title=$l10n.title}}
+
+       <div id="remove-account-wrapper">
+               <div id="remove-account-desc">{{$l10n.desc nofilter}}</div>
+
+               <form action="settings/removeme" autocomplete="off" method="post">
+            {{include file="field_password.tpl" field=$password}}
+
+                       <div class="form-group pull-right settings-submit-wrapper">
+                               <button type="submit" name="submit" class="btn btn-primary" value="{{$l10n.title}}"><i class="fa fa-trash fa-fw"></i>&nbsp;{{$l10n.title}}</button>
+                       </div>
+                       <div class="clear"></div>
+               </form>
+       </div>
+</div>