diff options
Diffstat (limited to 'plugins/PrivacyManager/PrivacyManager.php')
-rw-r--r-- | plugins/PrivacyManager/PrivacyManager.php | 560 |
1 files changed, 267 insertions, 293 deletions
diff --git a/plugins/PrivacyManager/PrivacyManager.php b/plugins/PrivacyManager/PrivacyManager.php index 85c7a8f5ce..840fe5cfc2 100644 --- a/plugins/PrivacyManager/PrivacyManager.php +++ b/plugins/PrivacyManager/PrivacyManager.php @@ -29,70 +29,70 @@ class Piwik_PrivacyManager extends Piwik_Plugin const OPTION_LAST_DELETE_PIWIK_REPORTS = 'lastDelete_piwik_reports'; const OPTION_LAST_DELETE_PIWIK_LOGS_INITIAL = "lastDelete_piwik_logs_initial"; const DEFAULT_MAX_ROWS_PER_QUERY = 100000; - + // default config options for data purging feature public static $defaultPurgeDataOptions = array( - 'delete_logs_enable' => 0, - 'delete_logs_schedule_lowest_interval' => 7, - 'delete_logs_older_than' => 180, - 'delete_logs_max_rows_per_query' => self::DEFAULT_MAX_ROWS_PER_QUERY, - 'delete_reports_enable' => 0, - 'delete_reports_older_than' => 12, - 'delete_reports_keep_basic_metrics' => 1, - 'delete_reports_keep_day_reports' => 0, - 'delete_reports_keep_week_reports' => 0, - 'delete_reports_keep_month_reports' => 1, - 'delete_reports_keep_year_reports' => 1, - 'delete_reports_keep_range_reports' => 0, - 'delete_reports_keep_segment_reports' => 0, - ); - + 'delete_logs_enable' => 0, + 'delete_logs_schedule_lowest_interval' => 7, + 'delete_logs_older_than' => 180, + 'delete_logs_max_rows_per_query' => self::DEFAULT_MAX_ROWS_PER_QUERY, + 'delete_reports_enable' => 0, + 'delete_reports_older_than' => 12, + 'delete_reports_keep_basic_metrics' => 1, + 'delete_reports_keep_day_reports' => 0, + 'delete_reports_keep_week_reports' => 0, + 'delete_reports_keep_month_reports' => 1, + 'delete_reports_keep_year_reports' => 1, + 'delete_reports_keep_range_reports' => 0, + 'delete_reports_keep_segment_reports' => 0, + ); + public function getInformation() { return array( - 'description' => Piwik_Translate('PrivacyManager_PluginDescription'), - 'author' => 'Piwik', + 'description' => Piwik_Translate('PrivacyManager_PluginDescription'), + 'author' => 'Piwik', 'author_homepage' => 'http://piwik.org/', - 'version' => Piwik_Version::VERSION, + 'version' => Piwik_Version::VERSION, ); } public function getListHooksRegistered() { return array( - 'AssetManager.getJsFiles' => 'getJsFiles', - 'AdminMenu.add' => 'addMenu', + 'AssetManager.getJsFiles' => 'getJsFiles', + 'AdminMenu.add' => 'addMenu', 'TaskScheduler.getScheduledTasks' => 'getScheduledTasks', ); } - /** - * @param Piwik_Event_Notification $notification notification object - */ - function getScheduledTasks($notification) - { - $tasks = &$notification->getNotificationObject(); - - // both tasks are low priority so they will execute after most others, but not lowest, so - // they will execute before the optimize tables task - - $purgeReportDataTask = new Piwik_ScheduledTask( - $this, 'deleteReportData', null, new Piwik_ScheduledTime_Daily(), Piwik_ScheduledTask::LOW_PRIORITY - ); - $tasks[] = $purgeReportDataTask; - - $purgeLogDataTask = new Piwik_ScheduledTask( - $this, 'deleteLogData', null, new Piwik_ScheduledTime_Daily(), Piwik_ScheduledTask::LOW_PRIORITY - ); - $tasks[] = $purgeLogDataTask; - } - - /** - * @param Piwik_Event_Notification $notification notification object - */ + /** + * @param Piwik_Event_Notification $notification notification object + */ + function getScheduledTasks($notification) + { + $tasks = & $notification->getNotificationObject(); + + // both tasks are low priority so they will execute after most others, but not lowest, so + // they will execute before the optimize tables task + + $purgeReportDataTask = new Piwik_ScheduledTask( + $this, 'deleteReportData', null, new Piwik_ScheduledTime_Daily(), Piwik_ScheduledTask::LOW_PRIORITY + ); + $tasks[] = $purgeReportDataTask; + + $purgeLogDataTask = new Piwik_ScheduledTask( + $this, 'deleteLogData', null, new Piwik_ScheduledTime_Daily(), Piwik_ScheduledTask::LOW_PRIORITY + ); + $tasks[] = $purgeLogDataTask; + } + + /** + * @param Piwik_Event_Notification $notification notification object + */ function getJsFiles($notification) { - $jsFiles = &$notification->getNotificationObject(); + $jsFiles = & $notification->getNotificationObject(); $jsFiles[] = "plugins/PrivacyManager/templates/privacySettings.js"; } @@ -100,131 +100,118 @@ class Piwik_PrivacyManager extends Piwik_Plugin function addMenu() { Piwik_AddAdminMenu('PrivacyManager_MenuPrivacySettings', - array('module' => 'PrivacyManager', 'action' => 'privacySettings'), - Piwik::isUserHasSomeAdminAccess(), - $order = 7); + array('module' => 'PrivacyManager', 'action' => 'privacySettings'), + Piwik::isUserHasSomeAdminAccess(), + $order = 7); + } + + /** + * Returns the settings for the data purging feature. + * + * @return array + */ + public static function getPurgeDataSettings() + { + $settings = array(); + + // load settings from ini config + try { + $oldSettings = array( + 'enable_auto_database_size_estimate', + + // backwards compatibility: load old values in ini config if present + 'delete_logs_enable', + 'delete_logs_schedule_lowest_interval', + 'delete_logs_older_than', + ); + + $deleteLogsSettings = Piwik_Config::getInstance()->Deletelogs; + foreach ($oldSettings as $settingName) { + $settings[$settingName] = $deleteLogsSettings[$settingName]; + } + } catch (Exception $e) { + // ignore + } + + // load the settings for the data purging settings + foreach (self::$defaultPurgeDataOptions as $optionName => $defaultValue) { + $value = Piwik_GetOption($optionName); + if ($value !== false) { + $settings[$optionName] = $value; + } else { + // if the option hasn't been set/created, use the default value + if (!isset($settings[$optionName])) { + $settings[$optionName] = $defaultValue; + } + + // option is not saved in the DB, so save it now + Piwik_SetOption($optionName, $settings[$optionName]); + } + } + + return $settings; + } + + /** + * Saves the supplied data purging settings. + * + * @param array $settings The settings to save. + */ + public static function savePurgeDataSettings($settings) + { + $plugin = Piwik_PluginsManager::getInstance()->getLoadedPlugin('PrivacyManager'); + + foreach (self::$defaultPurgeDataOptions as $optionName => $defaultValue) { + if (isset($settings[$optionName])) { + Piwik_SetOption($optionName, $settings[$optionName]); + } + } } - - /** - * Returns the settings for the data purging feature. - * - * @return array - */ - public static function getPurgeDataSettings() - { - $settings = array(); - - // load settings from ini config - try - { - $oldSettings = array( - 'enable_auto_database_size_estimate', - - // backwards compatibility: load old values in ini config if present - 'delete_logs_enable', - 'delete_logs_schedule_lowest_interval', - 'delete_logs_older_than', - ); - - $deleteLogsSettings = Piwik_Config::getInstance()->Deletelogs; - foreach ($oldSettings as $settingName) - { - $settings[$settingName] = $deleteLogsSettings[$settingName]; - } - } - catch (Exception $e) - { - // ignore - } - - // load the settings for the data purging settings - foreach (self::$defaultPurgeDataOptions as $optionName => $defaultValue) - { - $value = Piwik_GetOption($optionName); - if ($value !== false) - { - $settings[$optionName] = $value; - } - else - { - // if the option hasn't been set/created, use the default value - if (!isset($settings[$optionName])) - { - $settings[$optionName] = $defaultValue; - } - - // option is not saved in the DB, so save it now - Piwik_SetOption($optionName, $settings[$optionName]); - } - } - - return $settings; - } - - /** - * Saves the supplied data purging settings. - * - * @param array $settings The settings to save. - */ - public static function savePurgeDataSettings( $settings ) - { - $plugin = Piwik_PluginsManager::getInstance()->getLoadedPlugin('PrivacyManager'); - - foreach (self::$defaultPurgeDataOptions as $optionName => $defaultValue) - { - if (isset($settings[$optionName])) - { - Piwik_SetOption($optionName, $settings[$optionName]); - } - } - } - + /** - * Deletes old archived data (reports & metrics). - * - * Archive tables are not optimized after, as that is handled by a separate scheduled task - * in CoreAdminHome. This is a scheduled task and will only execute every N days. The number + * Deletes old archived data (reports & metrics). + * + * Archive tables are not optimized after, as that is handled by a separate scheduled task + * in CoreAdminHome. This is a scheduled task and will only execute every N days. The number * of days is determined by the delete_logs_schedule_lowest_interval config option. - * + * * If delete_reports_enable is set to 1, old archive data is deleted. The following * config options can tweak this behavior: * - delete_reports_older_than: The number of months after which archive data is considered * old. The current month is not considered when applying this * value. - * - delete_reports_keep_basic_metrics: If set to 1, keeps certain metric data. Right now, + * - delete_reports_keep_basic_metrics: If set to 1, keeps certain metric data. Right now, * all metric data is kept. * - delete_reports_keep_day_reports: If set to 1, keeps old daily reports. * - delete_reports_keep_week_reports: If set to 1, keeps old weekly reports. * - delete_reports_keep_month_reports: If set to 1, keeps old monthly reports. * - delete_reports_keep_year_reports: If set to 1, keeps old yearly reports. */ - public function deleteReportData() - { + public function deleteReportData() + { $settings = self::getPurgeDataSettings(); - + // Make sure, data deletion is enabled - if ($settings['delete_reports_enable'] == 0) - { + if ($settings['delete_reports_enable'] == 0) { return; } - + // make sure purging should run at this time (unless this is a forced purge) - if (!$this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_PIWIK_REPORTS)) - { - return; + if (!$this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_PIWIK_REPORTS)) { + return; } - + // set last run time Piwik_SetOption(self::OPTION_LAST_DELETE_PIWIK_REPORTS, Piwik_Date::factory('today')->getTimestamp()); - - Piwik_PrivacyManager_ReportsPurger::make($settings, self::getAllMetricsToKeep())->purgeData(); - } - + + Piwik_PrivacyManager_ReportsPurger::make($settings, self::getAllMetricsToKeep())->purgeData(); + } + /** * Deletes old log data based on the options set in the Deletelogs config * section. This is a scheduled task and will only execute every N days. The number * of days is determined by the delete_logs_schedule_lowest_interval config option. - * + * * If delete_logs_enable is set to 1, old data in the log_visit, log_conversion, * log_conversion_item and log_link_visit_action tables is deleted. The following * options can tweak this behavior: @@ -236,19 +223,17 @@ class Piwik_PrivacyManager extends Piwik_Plugin public function deleteLogData() { $settings = self::getPurgeDataSettings(); - + // Make sure, data deletion is enabled - if ($settings['delete_logs_enable'] == 0) - { + if ($settings['delete_logs_enable'] == 0) { return; } - + // make sure purging should run at this time - if (!$this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_PIWIK_LOGS)) - { - return; + if (!$this->shouldPurgeData($settings, self::OPTION_LAST_DELETE_PIWIK_LOGS)) { + return; } - + /* * Tell the DB that log deletion has run BEFORE deletion is executed; * If deletion / table optimization exceeds execution time, other tasks maybe prevented of being executed @@ -256,169 +241,158 @@ class Piwik_PrivacyManager extends Piwik_Plugin */ $lastDeleteDate = Piwik_Date::factory("today")->getTimestamp(); Piwik_SetOption(self::OPTION_LAST_DELETE_PIWIK_LOGS, $lastDeleteDate); - + // execute the purge Piwik_PrivacyManager_LogDataPurger::make($settings)->purgeData(); } - + /** * Returns an array describing what data would be purged if both log data & report * purging is invoked. - * + * * The returned array maps table names with the number of rows that will be deleted. * If the table name is mapped with -1, the table will be dropped. - * + * * @param array $settings The config options to use in the estimate. If null, the real * options are used. * @return array */ - public static function getPurgeEstimate( $settings = null ) + public static function getPurgeEstimate($settings = null) + { + if (is_null($settings)) { + $settings = self::getPurgeDataSettings(); + } + + $result = array(); + + if ($settings['delete_logs_enable']) { + $logDataPurger = Piwik_PrivacyManager_LogDataPurger::make($settings); + $result = array_merge($result, $logDataPurger->getPurgeEstimate()); + } + + if ($settings['delete_reports_enable']) { + $reportsPurger = Piwik_PrivacyManager_ReportsPurger::make($settings, self::getAllMetricsToKeep()); + $result = array_merge($result, $reportsPurger->getPurgeEstimate()); + } + + return $result; + } + + /** + * Returns true if a report with the given year & month should be purged or not. + * + * If reportsOlderThan is set to null or not supplied, this function will check if + * a report should be purged, based on existing configuration. In this case, if + * delete_reports_enable is set to 0, this function will return false. + * + * @param int $reportDateYear The year of the report in question. + * @param int $reportDateMonth The month of the report in question. + * @param int|Piwik_Date $reportsOlderThan If an int, the number of months a report must be older than + * in order to be purged. If a date, the date a report must be + * older than in order to be purged. + * @return bool + */ + public static function shouldReportBePurged($reportDateYear, $reportDateMonth, $reportsOlderThan = null) + { + // if no 'older than' value/date was supplied, use existing config + if (is_null($reportsOlderThan)) { + // if report deletion is not enabled, the report shouldn't be purged + $settings = self::getPurgeDataSettings(); + if ($settings['delete_reports_enable'] == 0) { + return false; + } + + $reportsOlderThan = $settings['delete_reports_older_than']; + } + + // if a integer was supplied, assume it is the number of months a report must be older than + if (!($reportsOlderThan instanceof Piwik_Date)) { + $reportsOlderThan = Piwik_Date::factory('today')->subMonth(1 + $reportsOlderThan); + } + + return Piwik_PrivacyManager_ReportsPurger::shouldReportBePurged( + $reportDateYear, $reportDateMonth, $reportsOlderThan); + } + + /** + * Returns the general metrics to keep when the 'delete_reports_keep_basic_metrics' + * config is set to 1. + */ + private static function getMetricsToKeep() + { + return array('nb_uniq_visitors', 'nb_visits', 'nb_actions', 'max_actions', + 'sum_visit_length', 'bounce_count', 'nb_visits_converted', 'nb_conversions', + 'revenue', 'quantity', 'price', 'orders'); + } + + /** + * Returns the goal metrics to keep when the 'delete_reports_keep_basic_metrics' + * config is set to 1. + */ + private static function getGoalMetricsToKeep() + { + // keep all goal metrics + return array_values(Piwik_Archive::$mappingFromIdToNameGoal); + } + + /** + * Returns the names of metrics that should be kept when purging as they appear in + * archive tables. + */ + public static function getAllMetricsToKeep() { - if (is_null($settings)) - { - $settings = self::getPurgeDataSettings(); - } - - $result = array(); - - if ($settings['delete_logs_enable']) - { - $logDataPurger = Piwik_PrivacyManager_LogDataPurger::make($settings); - $result = array_merge($result, $logDataPurger->getPurgeEstimate()); - } - - if ($settings['delete_reports_enable']) - { - $reportsPurger = Piwik_PrivacyManager_ReportsPurger::make($settings, self::getAllMetricsToKeep()); - $result = array_merge($result, $reportsPurger->getPurgeEstimate()); - } - - return $result; + $metricsToKeep = self::getMetricsToKeep(); + + // convert goal metric names to correct archive names + if (Piwik_Common::isGoalPluginEnabled()) { + $goalMetricsToKeep = self::getGoalMetricsToKeep(); + + $maxGoalId = self::getMaxGoalId(); + + // for each goal metric, there's a different name for each goal, including the overview, + // the order report & cart report + foreach ($goalMetricsToKeep as $metric) { + for ($i = 1; $i <= $maxGoalId; ++$i) // maxGoalId can be 0 + { + $metricsToKeep[] = Piwik_Goals::getRecordName($metric, $i); + } + + $metricsToKeep[] = Piwik_Goals::getRecordName($metric); + $metricsToKeep[] = Piwik_Goals::getRecordName($metric, Piwik_Tracker_GoalManager::IDGOAL_ORDER); + $metricsToKeep[] = Piwik_Goals::getRecordName($metric, Piwik_Tracker_GoalManager::IDGOAL_CART); + } + } + + return $metricsToKeep; } - - /** - * Returns true if a report with the given year & month should be purged or not. - * - * If reportsOlderThan is set to null or not supplied, this function will check if - * a report should be purged, based on existing configuration. In this case, if - * delete_reports_enable is set to 0, this function will return false. - * - * @param int $reportDateYear The year of the report in question. - * @param int $reportDateMonth The month of the report in question. - * @param int|Piwik_Date $reportsOlderThan If an int, the number of months a report must be older than - * in order to be purged. If a date, the date a report must be - * older than in order to be purged. - * @return bool - */ - public static function shouldReportBePurged( $reportDateYear, $reportDateMonth, $reportsOlderThan = null ) - { - // if no 'older than' value/date was supplied, use existing config - if (is_null($reportsOlderThan)) - { - // if report deletion is not enabled, the report shouldn't be purged - $settings = self::getPurgeDataSettings(); - if ($settings['delete_reports_enable'] == 0) - { - return false; - } - - $reportsOlderThan = $settings['delete_reports_older_than']; - } - - // if a integer was supplied, assume it is the number of months a report must be older than - if (!($reportsOlderThan instanceof Piwik_Date)) - { - $reportsOlderThan = Piwik_Date::factory('today')->subMonth(1 + $reportsOlderThan); - } - - return Piwik_PrivacyManager_ReportsPurger::shouldReportBePurged( - $reportDateYear, $reportDateMonth, $reportsOlderThan); - } - - /** - * Returns the general metrics to keep when the 'delete_reports_keep_basic_metrics' - * config is set to 1. - */ - private static function getMetricsToKeep() - { - return array('nb_uniq_visitors', 'nb_visits', 'nb_actions', 'max_actions', - 'sum_visit_length', 'bounce_count', 'nb_visits_converted', 'nb_conversions', - 'revenue', 'quantity', 'price', 'orders'); - } - - /** - * Returns the goal metrics to keep when the 'delete_reports_keep_basic_metrics' - * config is set to 1. - */ - private static function getGoalMetricsToKeep() - { - // keep all goal metrics - return array_values(Piwik_Archive::$mappingFromIdToNameGoal); - } - - /** - * Returns the names of metrics that should be kept when purging as they appear in - * archive tables. - */ - public static function getAllMetricsToKeep() - { - $metricsToKeep = self::getMetricsToKeep(); - - // convert goal metric names to correct archive names - if (Piwik_Common::isGoalPluginEnabled()) - { - $goalMetricsToKeep = self::getGoalMetricsToKeep(); - - $maxGoalId = self::getMaxGoalId(); - - // for each goal metric, there's a different name for each goal, including the overview, - // the order report & cart report - foreach ($goalMetricsToKeep as $metric) - { - for ($i = 1; $i <= $maxGoalId; ++$i) // maxGoalId can be 0 - { - $metricsToKeep[] = Piwik_Goals::getRecordName($metric, $i); - } - - $metricsToKeep[] = Piwik_Goals::getRecordName($metric); - $metricsToKeep[] = Piwik_Goals::getRecordName($metric, Piwik_Tracker_GoalManager::IDGOAL_ORDER); - $metricsToKeep[] = Piwik_Goals::getRecordName($metric, Piwik_Tracker_GoalManager::IDGOAL_CART); - } - } - - return $metricsToKeep; - } - - /** - * Returns true if one of the purge data tasks should run now, false if it shouldn't. - */ - private function shouldPurgeData( $settings, $lastRanOption ) - { + + /** + * Returns true if one of the purge data tasks should run now, false if it shouldn't. + */ + private function shouldPurgeData($settings, $lastRanOption) + { // Log deletion may not run until it is once rescheduled (initial run). This is the // only way to guarantee the calculated next scheduled deletion time. $initialDelete = Piwik_GetOption(self::OPTION_LAST_DELETE_PIWIK_LOGS_INITIAL); - if (empty($initialDelete)) - { + if (empty($initialDelete)) { Piwik_SetOption(self::OPTION_LAST_DELETE_PIWIK_LOGS_INITIAL, 1); return false; } - + // Make sure, log purging is allowed to run now $lastDelete = Piwik_GetOption($lastRanOption); $deleteIntervalDays = $settings['delete_logs_schedule_lowest_interval']; $deleteIntervalSeconds = $this->getDeleteIntervalInSeconds($deleteIntervalDays); - - if ($lastDelete === false || - ($lastDelete !== false && ((int)$lastDelete + $deleteIntervalSeconds) <= time()) - ) - { - return true; - } - else // not time to run data purge - { - return false; - } - } + + if ($lastDelete === false || + ($lastDelete !== false && ((int)$lastDelete + $deleteIntervalSeconds) <= time()) + ) { + return true; + } else // not time to run data purge + { + return false; + } + } function getDeleteIntervalInSeconds($deleteInterval) { @@ -427,7 +401,7 @@ class Piwik_PrivacyManager extends Piwik_Plugin private static function getMaxGoalId() { - return Piwik_FetchOne("SELECT MAX(idgoal) FROM ".Piwik_Common::prefixTable('goal')); + return Piwik_FetchOne("SELECT MAX(idgoal) FROM " . Piwik_Common::prefixTable('goal')); } } |