PageRenderTime 36ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/core/Tiki/Command/RedactDBCommand.php

https://gitlab.com/ElvisAns/tiki
PHP | 204 lines | 158 code | 23 blank | 23 comment | 7 complexity | 7a80481dbee7160adf4834fe74a00417 MD5 | raw file
  1. <?php
  2. // (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
  3. //
  4. // All Rights Reserved. See copyright.txt for details and a complete list of authors.
  5. // Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
  6. // $Id$
  7. namespace Tiki\Command;
  8. use Symfony\Component\Console\Command\Command;
  9. use Symfony\Component\Console\Input\InputArgument;
  10. use Symfony\Component\Console\Input\InputInterface;
  11. use Symfony\Component\Console\Input\InputOption;
  12. use Symfony\Component\Console\Output\OutputInterface;
  13. class RedactDBCommand extends Command
  14. {
  15. protected function configure()
  16. {
  17. $this
  18. ->setName('database:redact')
  19. ->setDescription('Redact database')
  20. ->addOption(
  21. 'force',
  22. null,
  23. InputOption::VALUE_NONE,
  24. 'Force installation. Overwrite any current database.'
  25. );
  26. }
  27. protected function execute(InputInterface $input, OutputInterface $output)
  28. {
  29. // Not used, just a reminder
  30. $force = $input->getOption('force');
  31. // Here we go
  32. $tikilib = \TikiLib::lib('tiki');
  33. // For $dbs_tiki - better way?
  34. require('db/redact/local.php');
  35. $output->writeln('<info>Redacting database.</info>');
  36. // Reset admin account
  37. $output->writeln('<info>Resetting admin account.</info>');
  38. $query = "UPDATE users_users SET email = ? WHERE login='admin';";
  39. $bindvars = ['admin@example.com'];
  40. $result = $tikilib->query($query, $bindvars);
  41. $query = "UPDATE `users_users` SET `hash`= md5('admin') WHERE `login`='admin'";
  42. $result = $tikilib->query($query);
  43. // first get valid prefix
  44. $userprefix = 'user_';
  45. $userprefixready = false;
  46. $userprefixindex = 0;
  47. while (! $userprefixready) {
  48. $query = "SELECT count(*) FROM users_users WHERE login LIKE '" . $userprefix . "%';";
  49. $result = $tikilib->getOne($query);
  50. if ($result > 0) {
  51. $userprefixindex++;
  52. $userprefix = 'user' . $userprefixindex . '_';
  53. } else {
  54. $userprefixready = true;
  55. }
  56. }
  57. $output->writeln('<comment>Using user names like ' . $userprefix . '123.</comment>');
  58. // Pseudonymise e-mail
  59. $output->writeln('<comment>Pseudonymising user e-mails.</comment>');
  60. $query = " SELECT DISTINCT table_name
  61. FROM information_schema.columns
  62. WHERE column_name = 'email'
  63. AND table_name <> 'users_users'
  64. AND table_schema = '$dbs_tiki';";
  65. $result = $tikilib->query($query);
  66. $ret = [];
  67. while ($res = $result->fetchRow()) {
  68. $ret[] = $res;
  69. }
  70. foreach ($ret as $table) {
  71. unset($bindvars);
  72. $output->writeln('<info>' . $table['table_name'] . '</info>');
  73. $query = "UPDATE " . $table['table_name'] . " t, users_users u SET t.email = CONCAT('" . $userprefix . "', u.userId, '@example.com') WHERE t.email = u.email AND u.login <> 'admin';";
  74. $result = $tikilib->query($query);
  75. $query = "SET @newnum:=0;UPDATE " . $table['table_name'] . " t SET t.email = CONCAT('emailchanged', @newnum:=@newnum+1, '@example.com') WHERE t.email NOT LIKE '" . $userprefix . "%@example.com';";
  76. $result = $tikilib->query($query);
  77. }
  78. // Pseudonymise user name
  79. $output->writeln('<comment>Pseudonymising user names.</comment>');
  80. $query = " SELECT DISTINCT table_name
  81. FROM information_schema.columns
  82. WHERE column_name = 'user'
  83. AND table_name <> 'users_users'
  84. AND table_schema = '$dbs_tiki';";
  85. $result = $tikilib->query($query);
  86. $ret = [];
  87. while ($res = $result->fetchRow()) {
  88. $ret[] = $res;
  89. }
  90. foreach ($ret as $table) {
  91. unset($bindvars);
  92. $output->writeln('<info>' . $table['table_name'] . '</info>');
  93. $query = "UPDATE " . $table['table_name'] . " t, users_users u SET t.user = CONCAT('" . $userprefix . "', u.userId) WHERE t.user = u.login AND u.login <> 'admin';";
  94. $result = $tikilib->query($query);
  95. }
  96. // Pseudonymise user selector tracker fields
  97. $output->writeln('<comment>Pseudonymising user selector tracker fields.</comment>');
  98. $query = "SELECT fieldId, trackerId, name FROM tiki_tracker_fields WHERE type='u';";
  99. $result = $tikilib->query($query);
  100. $ret = [];
  101. while ($res = $result->fetchRow()) {
  102. $ret[] = $res;
  103. }
  104. foreach ($ret as $field) {
  105. unset($bindvars);
  106. $output->writeln('<info>Tracker ' . $field['trackerId'] . ' Field ' . $field['fieldId'] . ': ' . $field['name'] . '</info>');
  107. $trackername = $tikilib->getOne('SELECT name FROM tiki_trackers WHERE trackerId = ' . $field['trackerId'] . ';');
  108. $output->writeln('<comment>Consider removing data from Tracker ' . $field['trackerId'] . ' (' . $trackername . ').</comment>');
  109. $query = "UPDATE tiki_tracker_item_fields t, users_users u SET t.value = CONCAT('" . $userprefix . "', u.userId) WHERE t.value = u.login AND u.login <> 'admin';";
  110. $result = $tikilib->query($query);
  111. }
  112. // Final user pseudonymisation in users_users
  113. $query = "SELECT MAX(userId) FROM users_users;";
  114. $num = $tikilib->getOne($query);
  115. for ($i = 2; $i <= $num; $i++) {
  116. $query = "UPDATE `users_users` SET `email` = ?, `login` = ?, `hash`=md5( ? ) WHERE `userId` = ?";
  117. $bindvars = ["$userprefix$i@example.com", "$userprefix$i", "pass$i", $i];
  118. $result = $tikilib->query($query, $bindvars);
  119. // TODO : Update user avatars
  120. }
  121. $query = "UPDATE `users_users` SET `provpass` = '';";
  122. $result = $tikilib->query($query);
  123. // Remove user web-mail accounts
  124. $output->writeln('<info>Removing user mail accounts.</info>');
  125. $query = "DELETE FROM tiki_user_preferences WHERE prefName = 'cypht_user_config';";
  126. $result = $tikilib->query($query);
  127. $output->writeln('<info>Removing mail queue.</info>');
  128. $query = "TRUNCATE TABLE tiki_mail_queue;";
  129. $result = $tikilib->query($query);
  130. // Remove messu_messages
  131. $output->writeln('<info>Removing user messu.</info>');
  132. $query = "TRUNCATE TABLE messu_messages;";
  133. $result = $tikilib->query($query);
  134. // Remove all session data
  135. $output->writeln('<info>Removing session data.</info>');
  136. $query = "TRUNCATE TABLE sessions;";
  137. $result = $tikilib->query($query);
  138. $query = "TRUNCATE TABLE tiki_cookies;";
  139. $result = $tikilib->query($query);
  140. $query = "TRUNCATE TABLE tiki_sessions;";
  141. $result = $tikilib->query($query);
  142. // Remove payments
  143. $output->writeln('<info>Removing payments data.</info>');
  144. $query = "TRUNCATE TABLE tiki_payment_received;";
  145. $result = $tikilib->query($query);
  146. $query = "TRUNCATE TABLE tiki_payment_requests;";
  147. $result = $tikilib->query($query);
  148. // Remove DSN and mailin
  149. $output->writeln('<info>Removing DSN and mailin account data.</info>');
  150. $query = "TRUNCATE TABLE tiki_dsn;";
  151. $result = $tikilib->query($query);
  152. $query = "TRUNCATE TABLE tiki_mailin_accounts;";
  153. $result = $tikilib->query($query);
  154. // Remove auth tokens
  155. $output->writeln('<info>Removing auth tokens.</info>');
  156. $query = "TRUNCATE TABLE tiki_auth_tokens;";
  157. $result = $tikilib->query($query);
  158. // Remove web services
  159. $output->writeln('<info>Removing webservices info.</info>');
  160. $query = "TRUNCATE TABLE tiki_webservice;";
  161. $result = $tikilib->query($query);
  162. // Remove google, intertiki, ldap and 3rd party data
  163. $output->writeln('<info>Removing google, intertiki, ldap and other 3rd party app data.</info>');
  164. $query = "DELETE FROM tiki_preferences WHERE " .
  165. "name LIKE 'auth_ldap_%' OR " .
  166. "name LIKE '%key' OR " .
  167. "name LIKE '%secret' OR " .
  168. "name LIKE '%secr' OR " .
  169. "name LIKE '%client_id' OR " .
  170. "name LIKE '%application_id' OR " .
  171. "name LIKE '%access_token%' OR " .
  172. "name LIKE '%salt' OR " .
  173. "name = 'registerPasscode' OR " .
  174. "name = 'interlist' OR " .
  175. "name LIKE '%intertiki%';";
  176. $result = $tikilib->query($query);
  177. $output->writeln('<comment>Read the disclaimer!</comment>');
  178. $output->writeln('<comment>The following means jack:</comment>');
  179. $output->writeln('<info>Finished redacting database.</info>');
  180. }
  181. }