PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/analytics/plugins/PrivacyManager/Controller.php

https://gitlab.com/yasminmostfa/thomas-site
PHP | 323 lines | 228 code | 54 blank | 41 comment | 32 complexity | 1b59d8c3cd2a54f9cf432454afdf7ae4 MD5 | raw file
  1. <?php
  2. /**
  3. * Piwik - free/libre analytics platform
  4. *
  5. * @link http://piwik.org
  6. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  7. *
  8. */
  9. namespace Piwik\Plugins\PrivacyManager;
  10. use Piwik\Common;
  11. use Piwik\Config as PiwikConfig;
  12. use Piwik\Container\StaticContainer;
  13. use Piwik\Date;
  14. use Piwik\Db;
  15. use Piwik\Metrics\Formatter;
  16. use Piwik\Nonce;
  17. use Piwik\Notification;
  18. use Piwik\Option;
  19. use Piwik\Piwik;
  20. use Piwik\Plugins\LanguagesManager\LanguagesManager;
  21. use Piwik\Scheduler\Scheduler;
  22. use Piwik\View;
  23. /**
  24. *
  25. */
  26. class Controller extends \Piwik\Plugin\ControllerAdmin
  27. {
  28. const OPTION_LAST_DELETE_PIWIK_LOGS = "lastDelete_piwik_logs";
  29. const ACTIVATE_DNT_NONCE = 'PrivacyManager.activateDnt';
  30. const DEACTIVATE_DNT_NONCE = 'PrivacyManager.deactivateDnt';
  31. public function saveSettings()
  32. {
  33. Piwik::checkUserHasSuperUserAccess();
  34. if ($_SERVER["REQUEST_METHOD"] == "POST") {
  35. $this->checkTokenInUrl();
  36. switch (Common::getRequestVar('form')) {
  37. case("formMaskLength"):
  38. $enable = Common::getRequestVar("anonymizeIPEnable", 0);
  39. if ($enable == 1) {
  40. IPAnonymizer::activate();
  41. } else if ($enable == 0) {
  42. IPAnonymizer::deactivate();
  43. } else {
  44. // pass
  45. }
  46. $privacyConfig = new Config();
  47. $privacyConfig->ipAddressMaskLength = Common::getRequestVar("maskLength", 1);
  48. $privacyConfig->useAnonymizedIpForVisitEnrichment = Common::getRequestVar("useAnonymizedIpForVisitEnrichment", 1);
  49. break;
  50. case("formDeleteSettings"):
  51. $this->checkDataPurgeAdminSettingsIsEnabled();
  52. $settings = $this->getPurgeSettingsFromRequest();
  53. PrivacyManager::savePurgeDataSettings($settings);
  54. break;
  55. default: //do nothing
  56. break;
  57. }
  58. }
  59. $notification = new Notification(Piwik::translate('General_YourChangesHaveBeenSaved'));
  60. $notification->context = Notification::CONTEXT_SUCCESS;
  61. Notification\Manager::notify('PrivacyManager_ChangesHaveBeenSaved', $notification);
  62. $this->redirectToIndex('PrivacyManager', 'privacySettings', null, null, null, array('updated' => 1));
  63. }
  64. private function checkDataPurgeAdminSettingsIsEnabled()
  65. {
  66. if (!self::isDataPurgeSettingsEnabled()) {
  67. throw new \Exception("Configuring deleting log data and report data has been disabled by Piwik admins.");
  68. }
  69. }
  70. /**
  71. * Utility function. Gets the delete logs/reports settings from the request and uses
  72. * them to populate config arrays.
  73. *
  74. * @return array An array containing the data deletion settings.
  75. */
  76. private function getPurgeSettingsFromRequest()
  77. {
  78. $settings = array();
  79. // delete logs settings
  80. $settings['delete_logs_enable'] = Common::getRequestVar("deleteEnable", 0);
  81. $settings['delete_logs_schedule_lowest_interval'] = Common::getRequestVar("deleteLowestInterval", 7);
  82. $settings['delete_logs_older_than'] = ((int)Common::getRequestVar("deleteOlderThan", 180) < 1) ?
  83. 1 : Common::getRequestVar("deleteOlderThan", 180);
  84. // delete reports settings
  85. $settings['delete_reports_enable'] = Common::getRequestVar("deleteReportsEnable", 0);
  86. $deleteReportsOlderThan = Common::getRequestVar("deleteReportsOlderThan", 3);
  87. $settings['delete_reports_older_than'] = $deleteReportsOlderThan < 3 ? 3 : $deleteReportsOlderThan;
  88. $settings['delete_reports_keep_basic_metrics'] = Common::getRequestVar("deleteReportsKeepBasic", 0);
  89. $settings['delete_reports_keep_day_reports'] = Common::getRequestVar("deleteReportsKeepDay", 0);
  90. $settings['delete_reports_keep_week_reports'] = Common::getRequestVar("deleteReportsKeepWeek", 0);
  91. $settings['delete_reports_keep_month_reports'] = Common::getRequestVar("deleteReportsKeepMonth", 0);
  92. $settings['delete_reports_keep_year_reports'] = Common::getRequestVar("deleteReportsKeepYear", 0);
  93. $settings['delete_reports_keep_range_reports'] = Common::getRequestVar("deleteReportsKeepRange", 0);
  94. $settings['delete_reports_keep_segment_reports'] = Common::getRequestVar("deleteReportsKeepSegments", 0);
  95. $settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
  96. return $settings;
  97. }
  98. /**
  99. * Echo's an HTML chunk describing the current database size, and the estimated space
  100. * savings after the scheduled data purge is run.
  101. */
  102. public function getDatabaseSize()
  103. {
  104. Piwik::checkUserHasSuperUserAccess();
  105. $view = new View('@PrivacyManager/getDatabaseSize');
  106. $forceEstimate = Common::getRequestVar('forceEstimate', 0);
  107. $view->dbStats = $this->getDeleteDBSizeEstimate($getSettingsFromQuery = true, $forceEstimate);
  108. $view->language = LanguagesManager::getLanguageCodeForCurrentUser();
  109. return $view->render();
  110. }
  111. public function privacySettings()
  112. {
  113. Piwik::checkUserHasSomeAdminAccess();
  114. $view = new View('@PrivacyManager/privacySettings');
  115. if (Piwik::hasUserSuperUserAccess()) {
  116. $view->deleteData = $this->getDeleteDataInfo();
  117. $view->anonymizeIP = $this->getAnonymizeIPInfo();
  118. $dntChecker = new DoNotTrackHeaderChecker();
  119. $view->dntSupport = $dntChecker->isActive();
  120. $view->canDeleteLogActions = Db::isLockPrivilegeGranted();
  121. $view->dbUser = PiwikConfig::getInstance()->database['username'];
  122. $view->deactivateNonce = Nonce::getNonce(self::DEACTIVATE_DNT_NONCE);
  123. $view->activateNonce = Nonce::getNonce(self::ACTIVATE_DNT_NONCE);
  124. }
  125. $view->language = LanguagesManager::getLanguageCodeForCurrentUser();
  126. $this->setBasicVariablesView($view);
  127. return $view->render();
  128. }
  129. /**
  130. * Executes a data purge, deleting log data and report data using the current config
  131. * options. Echo's the result of getDatabaseSize after purging.
  132. */
  133. public function executeDataPurge()
  134. {
  135. $this->checkDataPurgeAdminSettingsIsEnabled();
  136. Piwik::checkUserHasSuperUserAccess();
  137. $this->checkTokenInUrl();
  138. // if the request isn't a POST, redirect to index
  139. if ($_SERVER["REQUEST_METHOD"] != "POST"
  140. && !Common::isPhpCliMode()
  141. ) {
  142. $this->redirectToIndex('PrivacyManager', 'privacySettings');
  143. return;
  144. }
  145. $settings = PrivacyManager::getPurgeDataSettings();
  146. if ($settings['delete_logs_enable']) {
  147. /** @var LogDataPurger $logDataPurger */
  148. $logDataPurger = StaticContainer::get('Piwik\Plugins\PrivacyManager\LogDataPurger');
  149. $logDataPurger->purgeData($settings['delete_logs_older_than']);
  150. }
  151. if ($settings['delete_reports_enable']) {
  152. $reportsPurger = ReportsPurger::make($settings, PrivacyManager::getAllMetricsToKeep());
  153. $reportsPurger->purgeData(true);
  154. }
  155. }
  156. protected function getDeleteDBSizeEstimate($getSettingsFromQuery = false, $forceEstimate = false)
  157. {
  158. $this->checkDataPurgeAdminSettingsIsEnabled();
  159. // get the purging settings & create two purger instances
  160. if ($getSettingsFromQuery) {
  161. $settings = $this->getPurgeSettingsFromRequest();
  162. } else {
  163. $settings = PrivacyManager::getPurgeDataSettings();
  164. }
  165. $doDatabaseSizeEstimate = PiwikConfig::getInstance()->Deletelogs['enable_auto_database_size_estimate'];
  166. // determine the DB size & purged DB size
  167. $metadataProvider = StaticContainer::get('Piwik\Plugins\DBStats\MySQLMetadataProvider');
  168. $tableStatuses = $metadataProvider->getAllTablesStatus();
  169. $totalBytes = 0;
  170. foreach ($tableStatuses as $status) {
  171. $totalBytes += $status['Data_length'] + $status['Index_length'];
  172. }
  173. $formatter = new Formatter();
  174. $result = array(
  175. 'currentSize' => $formatter->getPrettySizeFromBytes($totalBytes)
  176. );
  177. // if the db size estimate feature is enabled, get the estimate
  178. if ($doDatabaseSizeEstimate || $forceEstimate == 1) {
  179. // maps tables whose data will be deleted with number of rows that will be deleted
  180. // if a value is -1, it means the table will be dropped.
  181. $deletedDataSummary = PrivacyManager::getPurgeEstimate($settings);
  182. $totalAfterPurge = $totalBytes;
  183. foreach ($tableStatuses as $status) {
  184. $tableName = $status['Name'];
  185. if (isset($deletedDataSummary[$tableName])) {
  186. $tableTotalBytes = $status['Data_length'] + $status['Index_length'];
  187. // if dropping the table
  188. if ($deletedDataSummary[$tableName] === ReportsPurger::DROP_TABLE) {
  189. $totalAfterPurge -= $tableTotalBytes;
  190. } else // if just deleting rows
  191. {
  192. if ($status['Rows'] > 0) {
  193. $totalAfterPurge -= ($tableTotalBytes / $status['Rows']) * $deletedDataSummary[$tableName];
  194. }
  195. }
  196. }
  197. }
  198. $result['sizeAfterPurge'] = $formatter->getPrettySizeFromBytes($totalAfterPurge);
  199. $result['spaceSaved'] = $formatter->getPrettySizeFromBytes($totalBytes - $totalAfterPurge);
  200. }
  201. return $result;
  202. }
  203. protected function getAnonymizeIPInfo()
  204. {
  205. Piwik::checkUserHasSuperUserAccess();
  206. $anonymizeIP = array();
  207. $privacyConfig = new Config();
  208. $anonymizeIP["enabled"] = IpAnonymizer::isActive();
  209. $anonymizeIP["maskLength"] = $privacyConfig->ipAddressMaskLength;
  210. $anonymizeIP["useAnonymizedIpForVisitEnrichment"] = $privacyConfig->useAnonymizedIpForVisitEnrichment;
  211. return $anonymizeIP;
  212. }
  213. protected function getDeleteDataInfo()
  214. {
  215. Piwik::checkUserHasSuperUserAccess();
  216. $deleteDataInfos = array();
  217. $deleteDataInfos["config"] = PrivacyManager::getPurgeDataSettings();
  218. $deleteDataInfos["deleteTables"] =
  219. "<br/>" . implode(", ", LogDataPurger::getDeleteTableLogTables());
  220. /** @var Scheduler $scheduler */
  221. $scheduler = StaticContainer::getContainer()->get('Piwik\Scheduler\Scheduler');
  222. $scheduleTimetable = $scheduler->getScheduledTimeForMethod("PrivacyManager", "deleteLogTables");
  223. $optionTable = Option::get(self::OPTION_LAST_DELETE_PIWIK_LOGS);
  224. //If task was already rescheduled, read time from taskTimetable. Else, calculate next possible runtime.
  225. if (!empty($scheduleTimetable) && ($scheduleTimetable - time() > 0)) {
  226. $nextPossibleSchedule = (int)$scheduleTimetable;
  227. } else {
  228. $date = Date::factory("today");
  229. $nextPossibleSchedule = $date->addDay(1)->getTimestamp();
  230. }
  231. //deletion schedule did not run before
  232. if (empty($optionTable)) {
  233. $deleteDataInfos["lastRun"] = false;
  234. //next run ASAP (with next schedule run)
  235. $date = Date::factory("today");
  236. $deleteDataInfos["nextScheduleTime"] = $nextPossibleSchedule;
  237. } else {
  238. $deleteDataInfos["lastRun"] = $optionTable;
  239. $deleteDataInfos["lastRunPretty"] = Date::factory((int)$optionTable)->getLocalized(Date::DATE_FORMAT_SHORT);
  240. //Calculate next run based on last run + interval
  241. $nextScheduleRun = (int)($deleteDataInfos["lastRun"] + $deleteDataInfos["config"]["delete_logs_schedule_lowest_interval"] * 24 * 60 * 60);
  242. //is the calculated next run in the past? (e.g. plugin was disabled in the meantime or something) -> run ASAP
  243. if (($nextScheduleRun - time()) <= 0) {
  244. $deleteDataInfos["nextScheduleTime"] = $nextPossibleSchedule;
  245. } else {
  246. $deleteDataInfos["nextScheduleTime"] = $nextScheduleRun;
  247. }
  248. }
  249. $formatter = new Formatter();
  250. $deleteDataInfos["nextRunPretty"] = $formatter->getPrettyTimeFromSeconds($deleteDataInfos["nextScheduleTime"] - time());
  251. return $deleteDataInfos;
  252. }
  253. public function deactivateDoNotTrack()
  254. {
  255. Piwik::checkUserHasSuperUserAccess();
  256. Nonce::checkNonce(self::DEACTIVATE_DNT_NONCE);
  257. $dntChecker = new DoNotTrackHeaderChecker();
  258. $dntChecker->deactivate();
  259. $this->redirectToIndex('PrivacyManager', 'privacySettings');
  260. }
  261. public function activateDoNotTrack()
  262. {
  263. Piwik::checkUserHasSuperUserAccess();
  264. Nonce::checkNonce(self::ACTIVATE_DNT_NONCE);
  265. $dntChecker = new DoNotTrackHeaderChecker();
  266. $dntChecker->activate();
  267. $this->redirectToIndex('PrivacyManager', 'privacySettings');
  268. }
  269. }