diff options
author | matt <matt@59fd770c-687e-43c8-a1e3-f5a4ff64c105> | 2010-06-23 07:45:36 +0400 |
---|---|---|
committer | matt <matt@59fd770c-687e-43c8-a1e3-f5a4ff64c105> | 2010-06-23 07:45:36 +0400 |
commit | 7e1b5d6b762340cbff1bb928d15815980c7649a7 (patch) | |
tree | e07da179b9e1372866d2349777bd1cc6b4c9e8cf /plugins/SitesManager | |
parent | 999f46479294713104c962bfe7469e9b6e7a4bbf (diff) | |
parent | c98ea06f2cccec81c6ccce49162a583494e44d91 (diff) |
Diffstat (limited to 'plugins/SitesManager')
-rw-r--r-- | plugins/SitesManager/API.php | 567 | ||||
-rw-r--r-- | plugins/SitesManager/Controller.php | 45 | ||||
-rw-r--r-- | plugins/SitesManager/SitesManager.php | 106 | ||||
-rw-r--r-- | plugins/SitesManager/templates/DisplayJavascriptCode.tpl | 5 | ||||
-rw-r--r-- | plugins/SitesManager/templates/SitesManager.js | 168 | ||||
-rw-r--r-- | plugins/SitesManager/templates/SitesManager.tpl | 132 | ||||
-rw-r--r-- | plugins/SitesManager/tests/SitesManager.test.php | 369 |
7 files changed, 1180 insertions, 212 deletions
diff --git a/plugins/SitesManager/API.php b/plugins/SitesManager/API.php index 81c660875f..e00c159a8b 100644 --- a/plugins/SitesManager/API.php +++ b/plugins/SitesManager/API.php @@ -17,6 +17,10 @@ class Piwik_SitesManager_API { static private $instance = null; + + /** + * @return Piwik_SitesManager_API + */ static public function getInstance() { if (self::$instance == null) @@ -27,6 +31,11 @@ class Piwik_SitesManager_API return self::$instance; } + const OPTION_EXCLUDED_IPS_GLOBAL = 'SitesManager_ExcludedIpsGlobal'; + const OPTION_DEFAULT_TIMEZONE = 'SitesManager_DefaultTimezone'; + const OPTION_DEFAULT_CURRENCY = 'SitesManager_DefaultCurrency'; + const OPTION_EXCLUDED_QUERY_PARAMETERS_GLOBAL = 'SitesManager_ExcludedQueryParameters'; + /** * Returns the javascript tag for the given idSite. * This tag must be included on every page to be tracked by Piwik @@ -34,7 +43,7 @@ class Piwik_SitesManager_API * @param int $idSite * @return string The Javascript tag ready to be included on the HTML pages */ - static public function getJavascriptTag( $idSite, $piwikUrl = '', $actionName = '') + public function getJavascriptTag( $idSite, $piwikUrl = '', $actionName = '') { Piwik::checkUserHasViewAccess($idSite); @@ -56,10 +65,10 @@ class Piwik_SitesManager_API * @exception if the site ID doesn't exist or the user doesn't have access to it * @return array */ - static public function getSiteFromId( $idSite ) + public function getSiteFromId( $idSite ) { Piwik::checkUserHasViewAccess( $idSite ); - $site = Zend_Registry::get('db')->fetchRow("SELECT * FROM ".Piwik::prefixTable("site")." WHERE idsite = ?", $idSite); + $site = Zend_Registry::get('db')->fetchRow("SELECT * FROM ".Piwik_Common::prefixTable("site")." WHERE idsite = ?", $idSite); return $site; } @@ -69,11 +78,11 @@ class Piwik_SitesManager_API * * @return array list of alias URLs */ - static private function getAliasSiteUrlsFromId( $idsite ) + private function getAliasSiteUrlsFromId( $idsite ) { $db = Zend_Registry::get('db'); $result = $db->fetchAll("SELECT url - FROM ".Piwik::prefixTable("site_url"). " + FROM ".Piwik_Common::prefixTable("site_url"). " WHERE idsite = ?", $idsite); $urls = array(); foreach($result as $url) @@ -89,11 +98,11 @@ class Piwik_SitesManager_API * @exception if the website ID doesn't exist or the user doesn't have access to it * @return array list of URLs */ - static public function getSiteUrlsFromId( $idSite ) + public function getSiteUrlsFromId( $idSite ) { Piwik::checkUserHasViewAccess($idSite); - $site = self::getSiteFromId($idSite); - $urls = self::getAliasSiteUrlsFromId($idSite); + $site = $this->getSiteFromId($idSite); + $urls = $this->getAliasSiteUrlsFromId($idSite); return array_merge(array($site['main_url']), $urls); } @@ -102,10 +111,10 @@ class Piwik_SitesManager_API * * @return array the list of websites ID */ - static public function getAllSitesId() + public function getAllSitesId() { Piwik::checkUserIsSuperUser(); - $result = Piwik_FetchAll("SELECT idsite FROM ".Piwik::prefixTable('site')); + $result = Piwik_FetchAll("SELECT idsite FROM ".Piwik_Common::prefixTable('site')); $idSites = array(); foreach($result as $idSite) { @@ -121,10 +130,10 @@ class Piwik_SitesManager_API * * @return array for each site, an array of information (idsite, name, main_url, etc.) */ - static public function getSitesWithAdminAccess() + public function getSitesWithAdminAccess() { - $sitesId = self::getSitesIdWithAdminAccess(); - return self::getSitesFromIds($sitesId); + $sitesId = $this->getSitesIdWithAdminAccess(); + return $this->getSitesFromIds($sitesId); } /** @@ -133,10 +142,10 @@ class Piwik_SitesManager_API * * @return array for each site, an array of information (idsite, name, main_url, etc.) */ - static public function getSitesWithViewAccess() + public function getSitesWithViewAccess() { - $sitesId = self::getSitesIdWithViewAccess(); - return self::getSitesFromIds($sitesId); + $sitesId = $this->getSitesIdWithViewAccess(); + return $this->getSitesFromIds($sitesId); } /** @@ -145,10 +154,10 @@ class Piwik_SitesManager_API * * @return array array for each site, an array of information (idsite, name, main_url, etc.) */ - static public function getSitesWithAtLeastViewAccess() + public function getSitesWithAtLeastViewAccess() { - $sitesId = self::getSitesIdWithAtLeastViewAccess(); - return self::getSitesFromIds($sitesId); + $sitesId = $this->getSitesIdWithAtLeastViewAccess(); + return $this->getSitesFromIds($sitesId); } /** @@ -157,7 +166,7 @@ class Piwik_SitesManager_API * * @return array list of websites ID */ - static public function getSitesIdWithAdminAccess() + public function getSitesIdWithAdminAccess() { $sitesId = Zend_Registry::get('access')->getSitesIdWithAdminAccess(); return $sitesId; @@ -169,7 +178,7 @@ class Piwik_SitesManager_API * * @return array list of websites ID */ - static public function getSitesIdWithViewAccess() + public function getSitesIdWithViewAccess() { return Zend_Registry::get('access')->getSitesIdWithViewAccess(); } @@ -180,7 +189,7 @@ class Piwik_SitesManager_API * * @return array list of websites ID */ - static public function getSitesIdWithAtLeastViewAccess() + public function getSitesIdWithAtLeastViewAccess() { return Zend_Registry::get('access')->getSitesIdWithAtLeastViewAccess(); } @@ -191,7 +200,7 @@ class Piwik_SitesManager_API * * @param array list of website ID */ - static private function getSitesFromIds( $idSites ) + private function getSitesFromIds( $idSites ) { if(count($idSites) === 0) { @@ -199,57 +208,105 @@ class Piwik_SitesManager_API } $db = Zend_Registry::get('db'); $sites = $db->fetchAll("SELECT * - FROM ".Piwik::prefixTable("site")." + FROM ".Piwik_Common::prefixTable("site")." WHERE idsite IN (".implode(", ", $idSites).") ORDER BY idsite ASC"); return $sites; } - + + /** + * Returns the list of websites ID associated with a URL. + * + * @param string $url + * @return array list of websites ID + */ + public function getSitesIdFromSiteUrl( $url ) + { + $url = $this->removeTrailingSlash($url); + + if(Piwik::isUserIsSuperUser()) + { + $ids = Zend_Registry::get('db')->fetchAll( + 'SELECT idsite FROM ' . Piwik_Common::prefixTable('site') . ' WHERE main_url = ? ' . + 'UNION SELECT idsite FROM ' . Piwik_Common::prefixTable('site_url') . ' WHERE url = ?', array($url, $url)); + } + else + { + $login = Piwik::getCurrentUserLogin(); + $ids = Zend_Registry::get('db')->fetchAll( + 'SELECT idsite FROM ' . Piwik_Common::prefixTable('site') . ' WHERE main_url = ? ' . + 'AND idsite IN (' . Piwik_Access::getSqlAccessSite('idsite') . ') ' . + 'UNION SELECT idsite FROM ' . Piwik_Common::prefixTable('site_url') . ' WHERE url = ? ' . + 'AND idsite IN (' . Piwik_Access::getSqlAccessSite('idsite') . ')', array($url, $login, $url, $login)); + } + + return $ids; + } + /** - * Add a website in the database. + * Add a website. + * Requires Super User access. * * The website is defined by a name and an array of URLs. - * The name must not be empty. - * The URLs array must contain at least one URL called the 'main_url' ; - * if several URLs are provided in the array, they will be recorded as Alias URLs for - * this website. - * - * Requires Super User access. + * @param string Site name + * @param array|string The URLs array must contain at least one URL called the 'main_url' ; + * if several URLs are provided in the array, they will be recorded + * as Alias URLs for this website. + * @param string Comma separated list of IPs to exclude from the reports (allows wildcards) + * @param string Timezone string, eg. 'Europe/London' * * @return int the website ID created */ - static public function addSite( $siteName, $urls ) + public function addSite( $siteName, $urls, $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null ) { Piwik::checkUserIsSuperUser(); - self::checkName($siteName); - $urls = self::cleanParameterUrls($urls); - self::checkUrls($urls); - self::checkAtLeastOneUrl($urls); + $this->checkName($siteName); + $urls = $this->cleanParameterUrls($urls); + $this->checkUrls($urls); + $this->checkAtLeastOneUrl($urls); + $timezone = trim($timezone); + + if(empty($timezone)) + { + $timezone = $this->getDefaultTimezone(); + } + $this->checkValidTimezone($timezone); + + if(empty($currency)) + { + $currency = $this->getDefaultCurrency(); + } + $this->checkValidCurrency($currency); $db = Zend_Registry::get('db'); $url = $urls[0]; $urls = array_slice($urls, 1); - $db->insert(Piwik::prefixTable("site"), array( - 'name' => $siteName, - 'main_url' => $url, - ) - ); + $bind = array( 'name' => $siteName, + 'main_url' => $url, + 'ts_created' => Piwik_Date::now()->getDatetime() + ); + + $bind['excluded_ips'] = $this->checkAndReturnExcludedIps($excludedIps); + $bind['excluded_parameters'] = $this->checkAndReturnExcludedQueryParameters($excludedQueryParameters); + $bind['timezone'] = $timezone; + $bind['currency'] = $currency; + $db->insert(Piwik_Common::prefixTable("site"), $bind); $idSite = $db->lastInsertId(); - self::insertSiteUrls($idSite, $urls); + $this->insertSiteUrls($idSite, $urls); // we reload the access list which doesn't yet take in consideration this new website Zend_Registry::get('access')->reloadAccess(); - self::postUpdateWebsite($idSite); + $this->postUpdateWebsite($idSite); return (int)$idSite; } - private static function postUpdateWebsite($idSite) + private function postUpdateWebsite($idSite) { Piwik_Common::regenerateCacheWebsiteAttributes($idSite); } @@ -261,11 +318,11 @@ class Piwik_SitesManager_API * * @param int $idSite */ - static public function deleteSite( $idSite ) + public function deleteSite( $idSite ) { Piwik::checkUserIsSuperUser(); - $idSites = Piwik_SitesManager_API::getAllSitesId(); + $idSites = Piwik_SitesManager_API::getInstance()->getAllSitesId(); if(!in_array($idSite, $idSites)) { throw new Exception("website id = $idSite not found"); @@ -278,13 +335,13 @@ class Piwik_SitesManager_API $db = Zend_Registry::get('db'); - $db->query("DELETE FROM ".Piwik::prefixTable("site")." + $db->query("DELETE FROM ".Piwik_Common::prefixTable("site")." WHERE idsite = ?", $idSite); - $db->query("DELETE FROM ".Piwik::prefixTable("site_url")." + $db->query("DELETE FROM ".Piwik_Common::prefixTable("site_url")." WHERE idsite = ?", $idSite); - $db->query("DELETE FROM ".Piwik::prefixTable("access")." + $db->query("DELETE FROM ".Piwik_Common::prefixTable("access")." WHERE idsite = ?", $idSite); Piwik_Common::deleteCacheWebsiteAttributes($idSite); @@ -296,7 +353,7 @@ class Piwik_SitesManager_API * * @exception if the parameter is not an array or if array empty */ - static private function checkAtLeastOneUrl( $urls ) + private function checkAtLeastOneUrl( $urls ) { if(!is_array($urls) || count($urls) == 0) @@ -305,6 +362,52 @@ class Piwik_SitesManager_API } } + private function checkValidTimezone($timezone) + { + $timezones = $this->getTimezonesList(); + foreach($timezones as $continent => $cities) + { + foreach($cities as $timezoneId => $city) + { + if($timezoneId == $timezone) + { + return true; + } + } + } + throw new Exception(Piwik_TranslateException('SitesManager_ExceptionInvalidTimezone', array($timezone))); + } + + private function checkValidCurrency($currency) + { + if(!in_array($currency, array_keys($this->getCurrencyList()))) + { + throw new Exception(Piwik_TranslateException('SitesManager_ExceptionInvalidCurrency', array($currency, "USD, EUR, etc."))); + } + } + + /** + * Checks that the submitted IPs (comma separated list) are valid + * Returns the cleaned up IPs + * @param $excludedIps + * + * @return array of IPs + */ + private function checkAndReturnExcludedIps($excludedIps) + { + $ips = explode(',', $excludedIps); + $ips = array_map('trim', $ips); + $ips = array_filter($ips, 'strlen'); + foreach($ips as $ip) + { + if(!$this->isValidIp($ip)) + { + throw new Exception(Piwik_TranslateException('SitesManager_ExceptionInvalidIPFormat', array($ip, "1.2.3.4 or 1.2.3.*"))); + } + } + $ips = implode(',', $ips); + return $ips; + } /** * Add a list of alias Urls to the given idSite * @@ -313,22 +416,136 @@ class Piwik_SitesManager_API * * @return int the number of inserted URLs */ - static public function addSiteAliasUrls( $idSite, $urls) + public function addSiteAliasUrls( $idSite, $urls) { Piwik::checkUserHasAdminAccess( $idSite ); - $urls = self::cleanParameterUrls($urls); - self::checkUrls($urls); + $urls = $this->cleanParameterUrls($urls); + $this->checkUrls($urls); - $urlsInit = self::getSiteUrlsFromId($idSite); + $urlsInit = $this->getSiteUrlsFromId($idSite); $toInsert = array_diff($urls, $urlsInit); - self::insertSiteUrls($idSite, $toInsert); - self::postUpdateWebsite($idSite); + $this->insertSiteUrls($idSite, $toInsert); + $this->postUpdateWebsite($idSite); return count($toInsert); } /** + * Sets IPs to be excluded from all websites. IPs can contain wildcards. + * Will also apply to websites created in the future. + * + * @param string Comma separated list of IPs to exclude from being tracked (allows wildcards) + * @return bool + */ + public function setGlobalExcludedIps($excludedIps) + { + Piwik::checkUserIsSuperUser(); + $excludedIps = $this->checkAndReturnExcludedIps($excludedIps); + Piwik_SetOption(self::OPTION_EXCLUDED_IPS_GLOBAL, $excludedIps); + Piwik_Common::deleteAllCache(); + return true; + } + + /** + * Returns the list of URL query parameters that are excluded from all websites + * + * @return string Comma separated list of URL parameters + */ + public function getExcludedQueryParametersGlobal() + { + Piwik::checkUserHasSomeAdminAccess(); + return Piwik_GetOption(self::OPTION_EXCLUDED_QUERY_PARAMETERS_GLOBAL); + } + + /** + * Sets list of URL query parameters to be excluded on all websites. + * Will also apply to websites created in the future. + * + * @param string Comma separated list of URL query parameters to exclude from URLs + * @return bool + */ + public function setGlobalExcludedQueryParameters($excludedQueryParameters) + { + Piwik::checkUserIsSuperUser(); + $excludedQueryParameters = $this->checkAndReturnExcludedQueryParameters($excludedQueryParameters); + Piwik_SetOption(self::OPTION_EXCLUDED_QUERY_PARAMETERS_GLOBAL, $excludedQueryParameters); + Piwik_Common::deleteAllCache(); + return true; + } + + /** + * Returns the list of IPs that are excluded from all websites + * + * @return string Comma separated list of IPs + */ + public function getExcludedIpsGlobal() + { + Piwik::checkUserHasSomeAdminAccess(); + return Piwik_GetOption(self::OPTION_EXCLUDED_IPS_GLOBAL); + } + + /** + * Returns the default currency that will be set when creating a website through the API. + * + * @return string Currency ID eg. 'USD' + */ + public function getDefaultCurrency() + { + Piwik::checkUserHasSomeAdminAccess(); + $defaultCurrency = Piwik_GetOption(self::OPTION_DEFAULT_CURRENCY); + if($defaultCurrency) + { + return $defaultCurrency; + } + return 'USD'; + } + + /** + * Sets the default currency that will be used when creating websites + * + * @param $defaultCurrency string eg. 'USD' + * @return bool + */ + public function setDefaultCurrency($defaultCurrency) + { + Piwik::checkUserIsSuperUser(); + $this->checkValidCurrency($defaultCurrency); + Piwik_SetOption(self::OPTION_DEFAULT_CURRENCY, $defaultCurrency); + return true; + } + + /** + * Returns the default timezone that will be set when creating a website through the API. + * Via the UI, if the default timezone is not UTC, it will be pre-selected in the drop down + * + * @return string Timezone eg. UTC+7 or Europe/Paris + */ + public function getDefaultTimezone() + { + $defaultTimezone = Piwik_GetOption(self::OPTION_DEFAULT_TIMEZONE); + if($defaultTimezone) + { + return $defaultTimezone; + } + return 'UTC'; + } + + /** + * Sets the default timezone that will be used when creating websites + * + * @param $defaultTimezone string eg. Europe/Paris or UTC+8 + * @return bool + */ + public function setDefaultTimezone($defaultTimezone) + { + Piwik::checkUserIsSuperUser(); + $this->checkValidTimezone($defaultTimezone); + Piwik_SetOption(self::OPTION_DEFAULT_TIMEZONE, $defaultTimezone); + return true; + } + + /** * Update an existing website. * If only one URL is specified then only the main url will be updated. * If several URLs are specified, both the main URL and the alias URLs will be updated. @@ -336,59 +553,234 @@ class Piwik_SitesManager_API * @param int website ID defining the website to edit * @param string website name * @param string|array the website URLs + * @param string Comma separated list of IPs to exclude from being tracked (allows wildcards) + * @param string Timezone * * @exception if any of the parameter is not correct * * @return bool true on success */ - static public function updateSite( $idSite, $siteName, $urls = null) + public function updateSite( $idSite, $siteName, $urls = null, $excludedIps = null, $excludedQueryParameters = null, $timezone = null, $currency = null) { Piwik::checkUserHasAdminAccess($idSite); - self::checkName($siteName); + $this->checkName($siteName); // SQL fields to update $bind = array(); if(!is_null($urls)) { - $urls = self::cleanParameterUrls($urls); - self::checkUrls($urls); - self::checkAtLeastOneUrl($urls); + $urls = $this->cleanParameterUrls($urls); + $this->checkUrls($urls); + $this->checkAtLeastOneUrl($urls); $url = $urls[0]; $bind['main_url'] = $url; } + + if(!is_null($currency)) + { + $currency = trim($currency); + $this->checkValidCurrency($currency); + $bind['currency'] = $currency; + } + if(!is_null($timezone)) + { + $timezone = trim($timezone); + $this->checkValidTimezone($timezone); + $bind['timezone'] = $timezone; + } + $bind['excluded_ips'] = $this->checkAndReturnExcludedIps($excludedIps); + $bind['excluded_parameters'] = $this->checkAndReturnExcludedQueryParameters($excludedQueryParameters); $bind['name'] = $siteName; - $db = Zend_Registry::get('db'); - $db->update(Piwik::prefixTable("site"), + $db->update(Piwik_Common::prefixTable("site"), $bind, "idsite = $idSite" ); // we now update the main + alias URLs - self::deleteSiteAliasUrls($idSite); + $this->deleteSiteAliasUrls($idSite); if(count($urls) > 1) { - $insertedUrls = self::addSiteAliasUrls($idSite, array_slice($urls,1)); + $insertedUrls = $this->addSiteAliasUrls($idSite, array_slice($urls,1)); + } + $this->postUpdateWebsite($idSite); + } + + private function checkAndReturnExcludedQueryParameters($parameters) + { + $parameters = trim($parameters); + if(empty($parameters)) + { + return ''; } - self::postUpdateWebsite($idSite); + + $parameters = explode(',', $parameters); + $parameters = array_map('trim', $parameters); + $parameters = array_filter($parameters, 'strlen'); + $parameters = array_unique($parameters); + return implode(',', $parameters); + } + + /** + * Returns the list of supported currencies + * @see getCurrencySymbols() + * @return array ( currencyId => currencyName) + */ + public function getCurrencyList() + { + return array( + 'USD' => 'US Dollar ($)', + 'EUR' => 'Euro (€)', + 'JPY' => 'Japanese Yen (¥)', + 'GBP' => 'British Pound Sterling (£)', + 'AUD' => 'Australian Dollar (A$)', + 'KRW' => 'South Korean Won (₩)', + 'BRL' => 'Brazilian Real (R$)', + 'CNY' => 'Chinese Yuan Renminbi (CN¥)', + 'DKK' => 'Danish Krone (Dkr)', + 'RUB' => 'Russian Ruble (RUB)', + 'SEK' => 'Swedish Krona (Skr)', + 'NOK' => 'Norwegian Krone (Nkr)', + 'PLN' => 'Polish Zloty (zł)', + 'TRY' => 'Turkish Lira (TL)', + 'TWD' => 'New Taiwan Dollar (NT$)', + 'HKD' => 'Hong Kong Dollar (HK$)', + 'THB' => 'Thai Baht (฿)', + 'IDR' => 'Indonesian Rupiah (Rp)', + 'ARS' => 'Argentine Peso (AR$)', + 'MXN' => 'Mexican Peso (MXN)', + 'VND' => 'Vietnamese Dong (₫)', + 'PHP' => 'Philippine Peso (Php)', + 'INR' => 'Indian Rupee (Rs.)', + 'VEF' => 'Venezuelan bolívar (Bs. F)', + 'CHF' => 'Swiss Franc (Fr.)', + ); + } + + /** + * Returns the list of currency symbols + * @see getCurrencyList() + * @return array( currencyId => currencySymbol ) + */ + public function getCurrencySymbols() + { + return array( + 'USD' => '$', + 'EUR' => '€', + 'JPY' => '¥', + 'GBP' => '£', + 'AUD' => 'A$', + 'KRW' => '₩', + 'BRL' => 'R$', + 'CNY' => 'CN¥', + 'DKK' => 'Dkr', + 'RUB' => 'RUB', + 'SEK' => 'Skr', + 'NOK' => 'Nkr', + 'PLN' => 'zł', + 'TRY' => 'TL', + 'TWD' => 'NT$', + 'HKD' => 'HK$', + 'THB' => '฿', + 'IDR' => 'Rp', + 'ARS' => 'AR$', + 'MXN' => 'MXN', + 'VND' => '₫', + 'PHP' => 'Php', + 'INR' => 'Rs.', + 'VEF' => 'Bs. F', + 'CHF' => 'Fr.', + ); + } + + + /** + * Returns the list of timezones supported. + * Used for addSite and updateSite + * + * @TODO NOT COMPATIBLE WITH API RESPONSE AUTO BUILDER + * + * @return array of timezone strings + */ + public function getTimezonesList() + { + if(!Piwik::isTimezoneSupportEnabled()) + { + return array('UTC' => $this->getTimezonesListUTCOffsets()); + } + + $continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific'); + $timezones = timezone_identifiers_list(); + + $return = array(); + foreach($timezones as $timezone) + { + $timezoneExploded = explode('/', $timezone); + $continent = $timezoneExploded[0]; + + // only display timezones that are grouped by continent + if(!in_array($continent, $continents)) + { + continue; + } + $city = $timezoneExploded[1]; + if(!empty($timezoneExploded[2])) + { + $city .= ' - '.$timezoneExploded[2]; + } + $city = str_replace('_', ' ', $city); + $return[$continent][$timezone] = $city; + } + + foreach($continents as $continent) + { + ksort($return[$continent]); + } + + $return['UTC'] = $this->getTimezonesListUTCOffsets(); + return $return; + } + + private function getTimezonesListUTCOffsets() + { + // manually add the UTC offsets + $GmtOffsets = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, + 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14); + + $return = array(); + foreach($GmtOffsets as $offset) + { + if($offset > 0) + { + $offset = '+'.$offset; + } + elseif($offset == 0) + { + $offset = ''; + } + $offset = 'UTC' . $offset; + $offsetName = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset); + $return[$offset] = $offsetName; + } + return $return; } /** * Insert the list of alias URLs for the website. * The URLs must not exist already for this website! */ - static private function insertSiteUrls($idSite, $urls) + private function insertSiteUrls($idSite, $urls) { if(count($urls) != 0) { $db = Zend_Registry::get('db'); foreach($urls as $url) { - $db->insert(Piwik::prefixTable("site_url"), array( + $db->insert(Piwik_Common::prefixTable("site_url"), array( 'idsite' => $idSite, 'url' => $url ) @@ -400,10 +792,10 @@ class Piwik_SitesManager_API /** * Delete all the alias URLs for the given idSite. */ - static private function deleteSiteAliasUrls($idsite) + private function deleteSiteAliasUrls($idsite) { $db = Zend_Registry::get('db'); - $db->query("DELETE FROM ".Piwik::prefixTable("site_url") ." + $db->query("DELETE FROM ".Piwik_Common::prefixTable("site_url") ." WHERE idsite = ?", $idsite); } @@ -412,7 +804,7 @@ class Piwik_SitesManager_API * * @return string the URL without the trailing slash */ - static private function removeTrailingSlash($url) + private function removeTrailingSlash($url) { // if there is a final slash, we take the URL without this slash (expected URL format) if(strlen($url) > 5 @@ -428,17 +820,33 @@ class Piwik_SitesManager_API * * @return bool */ - static private function isValidUrl( $url ) + private function isValidUrl( $url ) { return Piwik_Common::isLookLikeUrl($url); } /** + * Tests if the IP is a valid IP, allowing wildcards, except in the first octet. + * Wildcards can only be used from right to left, ie. 1.1.*.* is allowed, but 1.1.*.1 is not. + * + * @param $ip + * @return bool + */ + private function isValidIp( $ip ) + { + return preg_match('~^(\d+)\.(\d+)\.(\d+)\.(\d+)$~', $ip, $matches) !== 0 + || preg_match('~^(\d+)\.(\d+)\.(\d+)\.\*$~', $ip, $matches) !== 0 + || preg_match('~^(\d+)\.(\d+)\.\*.\*$~', $ip, $matches) !== 0 + || preg_match('~^(\d+)\.\*\.\*\.\*$~', $ip, $matches) !== 0 + ; + } + + /** * Check that the website name has a correct format. * * @exception if the website name is empty */ - static private function checkName($siteName) + private function checkName($siteName) { if(empty($siteName)) { @@ -452,11 +860,11 @@ class Piwik_SitesManager_API * @exception if any of the urls is not valid * @param array */ - static private function checkUrls($urls) + private function checkUrls($urls) { foreach($urls as $url) { - if(!self::isValidUrl($url)) + if(!$this->isValidUrl($url)) { throw new Exception(sprintf(Piwik_TranslateException("SitesManager_ExceptionInvalidUrl"),$url)); } @@ -471,19 +879,20 @@ class Piwik_SitesManager_API * @param string|array urls * @return array the array of cleaned URLs */ - static private function cleanParameterUrls( $urls ) + private function cleanParameterUrls( $urls ) { if(!is_array($urls)) { $urls = array($urls); } + + $urls = array_map('urldecode', $urls); foreach($urls as &$url) { - $url = self::removeTrailingSlash($url); + $url = $this->removeTrailingSlash($url); } $urls = array_unique($urls); return $urls; } } - diff --git a/plugins/SitesManager/Controller.php b/plugins/SitesManager/Controller.php index ddf93d109b..84dc3d5a03 100644 --- a/plugins/SitesManager/Controller.php +++ b/plugins/SitesManager/Controller.php @@ -19,17 +19,56 @@ class Piwik_SitesManager_Controller extends Piwik_Controller function index() { $view = Piwik_View::factory('SitesManager'); - $sites = Piwik_SitesManager_API::getSitesWithAdminAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAdminAccess(); foreach($sites as &$site) { - $site['alias_urls'] = Piwik_SitesManager_API::getSiteUrlsFromId($site['idsite']); + $site['alias_urls'] = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($site['idsite']); + $site['excluded_ips'] = str_replace(',','<br/>', $site['excluded_ips']); + $site['excluded_parameters'] = str_replace(',','<br/>', $site['excluded_parameters']); } $view->adminSites = $sites; + + $timezones = Piwik_SitesManager_API::getInstance()->getTimezonesList(); + $view->timezoneSupported = Piwik::isTimezoneSupportEnabled(); + $view->timezones = json_encode($timezones); + $view->defaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone(); + + $view->currencies = json_encode(Piwik_SitesManager_API::getInstance()->getCurrencyList()); + $view->defaultCurrency = Piwik_SitesManager_API::getInstance()->getDefaultCurrency(); + + $view->utcTime = Piwik_Date::now()->getDatetime(); + $excludedIpsGlobal = Piwik_SitesManager_API::getInstance()->getExcludedIpsGlobal(); + $view->globalExcludedIps = str_replace(',',"\n", $excludedIpsGlobal); + $excludedQueryParametersGlobal = Piwik_SitesManager_API::getInstance()->getExcludedQueryParametersGlobal(); + $view->globalExcludedQueryParameters = str_replace(',',"\n", $excludedQueryParametersGlobal); + $view->currentIpAddress = Piwik_Common::getIpString(); + $this->setGeneralVariablesView($view); $view->menu = Piwik_GetAdminMenu(); echo $view->render(); } + function setGlobalSettings() + { + $response = new Piwik_API_ResponseBuilder(Piwik_Common::getRequestVar('format')); + + try { + $this->checkTokenInUrl(); + $timezone = Piwik_Common::getRequestVar('timezone', false); + $excludedIps = Piwik_Common::getRequestVar('excludedIps', false); + $excludedQueryParameters = Piwik_Common::getRequestVar('excludedQueryParameters', false); + $currency = Piwik_Common::getRequestVar('currency', false); + Piwik_SitesManager_API::getInstance()->setDefaultTimezone($timezone); + Piwik_SitesManager_API::getInstance()->setDefaultCurrency($currency); + Piwik_SitesManager_API::getInstance()->setGlobalExcludedQueryParameters($excludedQueryParameters); + Piwik_SitesManager_API::getInstance()->setGlobalExcludedIps($excludedIps); + $toReturn = $response->getResponse(); + } catch(Exception $e ) { + $toReturn = $response->getResponseException( $e ); + } + echo $toReturn; + } + function displayJavascriptCode() { $idSite = Piwik_Common::getRequestVar('idsite', 1); @@ -38,6 +77,8 @@ class Piwik_SitesManager_Controller extends Piwik_Controller $view = Piwik_View::factory('DisplayJavascriptCode'); $this->setGeneralVariablesView($view); $view->menu = Piwik_GetAdminMenu(); + $site = new Piwik_Site($idSite); + $view->displaySiteName = $site->getName(); $view->jsTag = $jsTag; echo $view->render(); } diff --git a/plugins/SitesManager/SitesManager.php b/plugins/SitesManager/SitesManager.php index b2542e966c..dfca3e2c6f 100644 --- a/plugins/SitesManager/SitesManager.php +++ b/plugins/SitesManager/SitesManager.php @@ -19,11 +19,10 @@ class Piwik_SitesManager extends Piwik_Plugin public function getInformation() { $info = array( - 'name' => 'Sites Management', - 'description' => 'Websites Management in Piwik: Add a new Website, Edit an existing one, Show the Javascript code to include on your pages. All the actions are also available through the API.', + 'description' => Piwik_Translate('SitesManager_PluginDescription'), 'author' => 'Piwik', - 'homepage' => 'http://piwik.org/', - 'version' => '0.1', + 'author_homepage' => 'http://piwik.org/', + 'version' => Piwik_Version::VERSION, ); return $info; } @@ -33,21 +32,105 @@ class Piwik_SitesManager extends Piwik_Plugin return array( 'template_css_import' => 'css', 'AdminMenu.add' => 'addMenu', - 'Common.fetchWebsiteAttributes' => 'recordWebsiteHostsInCache', + 'Common.fetchWebsiteAttributes' => 'recordWebsiteDataInCache', ); } + function addMenu() + { + Piwik_AddAdminMenu('SitesManager_MenuSites', + array('module' => 'SitesManager', 'action' => 'index'), + Piwik::isUserHasSomeAdminAccess(), + $order = 5); + } + function css() { echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"themes/default/styles.css\" />\n"; } - function recordWebsiteHostsInCache($notification) + /** + * Hooks when a website tracker cache is flushed (website updated, cache deleted, or empty cache) + * Will record in the tracker config file all data needed for this website in Tracker. + * + * @param $notification + * @return void + */ + function recordWebsiteDataInCache($notification) { - $idsite = $notification->getNotificationInfo(); + $idSite = $notification->getNotificationInfo(); // add the 'hosts' entry in the website array $array =& $notification->getNotificationObject(); - $urls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $array['hosts'] = $this->getTrackerHosts($idSite); + $array['excluded_ips'] = $this->getTrackerExcludedIps($idSite); + $array['excluded_parameters'] = $this->getTrackerExcludedQueryParameters($idSite); + } + + /** + * Returns the array of excluded IPs to save in the config file + * @param $idSite + * @return array + */ + private function getTrackerExcludedIps($idSite) + { + $website = Piwik_SitesManager_API::getInstance()->getSiteFromId($idSite); + $excludedIps = $website['excluded_ips']; + $globalExcludedIps = Piwik_SitesManager_API::getInstance()->getExcludedIpsGlobal(); + + $excludedIps .= ',' . $globalExcludedIps; + + $ipRanges = array(); + foreach(explode(',', $excludedIps) as $ip) + { + $ipMin = $ipMax = $ip; + if(substr_count($ip, '*') > 0) + { + $ipMin = str_replace('*', '0', $ip); + $ipMax = str_replace('*', '255', $ip); + } + $ipRange = array( ip2long($ipMin), ip2long($ipMax)); + + // we can still get invalid IPs at this stage (eg. ip2long(555.1.1.1) would return false) + if($ipRange[0] === false || $ipRange[1] === false) + { + continue; + } + + // long data type is signed; convert to stringified unsigned number + $ipRange[0] = sprintf("%u", $ipRange[0]); + $ipRange[1] = sprintf("%u", $ipRange[1]); + + $ipRanges[] = $ipRange; + } + return $ipRanges; + } + + /** + * Returns the array of URL query parameters to exclude from URLs + * @param $idSite + * @return array + */ + private function getTrackerExcludedQueryParameters($idSite) + { + $website = Piwik_SitesManager_API::getInstance()->getSiteFromId($idSite); + $excludedQueryParameters = $website['excluded_parameters']; + $globalExcludedQueryParameters = Piwik_SitesManager_API::getInstance()->getExcludedQueryParametersGlobal(); + + $excludedQueryParameters .= ',' . $globalExcludedQueryParameters; + $parameters = explode(',', $excludedQueryParameters); + $parameters = array_filter($parameters, 'strlen'); + $parameters = array_unique($parameters); + return $parameters; + } + + /** + * Returns the hosts alias URLs + * @param $idSite + * @return array + */ + private function getTrackerHosts($idSite) + { + $urls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idSite); $hosts = array(); foreach($urls as $url) { @@ -57,12 +140,7 @@ class Piwik_SitesManager extends Piwik_Plugin $hosts[] = $url['host']; } } - $array['hosts'] = $hosts; + return $hosts; } - function addMenu() - { - Piwik_AddAdminMenu('SitesManager_MenuSites', array('module' => 'SitesManager', 'action' => 'index')); - } } - diff --git a/plugins/SitesManager/templates/DisplayJavascriptCode.tpl b/plugins/SitesManager/templates/DisplayJavascriptCode.tpl index 9fa7c7f617..29a1e53170 100644 --- a/plugins/SitesManager/templates/DisplayJavascriptCode.tpl +++ b/plugins/SitesManager/templates/DisplayJavascriptCode.tpl @@ -2,7 +2,6 @@ {assign var=showPeriodSelection value=false} {include file="CoreAdminHome/templates/header.tpl"} {loadJavascriptTranslations plugins='SitesManager'} -{include file="CoreAdminHome/templates/menu.tpl"} {literal} <style> @@ -13,7 +12,7 @@ code { border-width:1px 1px 1px 5px; direction:ltr; display:block; - font-size:80%; + font-size:90%; margin:2px 2px 20px; padding:4px; text-align:left; @@ -22,7 +21,7 @@ code { </style> {/literal} -<h2>{$siteName}</h2> +<h2>{$displaySiteName}</h2> <p>{'SitesManager_JsTrackingTagHelp'|translate}:</p> <code>{$jsTag}</code> diff --git a/plugins/SitesManager/templates/SitesManager.js b/plugins/SitesManager/templates/SitesManager.js index 7b523b98a4..cf14893c8c 100644 --- a/plugins/SitesManager/templates/SitesManager.js +++ b/plugins/SitesManager/templates/SitesManager.js @@ -1,8 +1,7 @@ function getDeleteSiteAJAX( idSite ) { var ajaxRequest = piwikHelper.getStandardAjaxConf(); - piwikHelper.toggleAjaxLoading(); - + var parameters = {}; parameters.module = 'API'; parameters.format = 'json'; @@ -18,19 +17,28 @@ function getDeleteSiteAJAX( idSite ) function getAddSiteAJAX( row ) { var ajaxRequest = piwikHelper.getStandardAjaxConf(); - piwikHelper.toggleAjaxLoading(); var parameters = {}; - var siteName = $(row).find('input#siteadd_name').val(); - var urls = $(row).find('textarea#siteadd_urls').val(); - var urls = urls.trim().split("\n"); - + var siteName = $(row).find('input#name').val(); + var urls = $(row).find('textarea#urls').val(); + urls = getApiFormatUrls(urls); + var excludedIps = $(row).find('textarea#excludedIps').val(); + excludedIps = getApiFormatTextarea(excludedIps); + var timezone = encodeURIComponent($(row).find('#timezones option:selected').val()); + var currency = encodeURIComponent($(row).find('#currencies option:selected').val()); + var excludedQueryParameters = $(row).find('textarea#excludedQueryParameters').val(); + excludedQueryParameters = getApiFormatTextarea(excludedQueryParameters); + var request = ''; request += '&module=API'; request += '&format=json'; request += '&method=SitesManager.addSite'; siteName = encodeURIComponent(siteName); request += '&siteName='+siteName; + request += '&timezone='+timezone; + request += '¤cy='+currency; + request += '&excludedIps='+excludedIps; + request += '&excludedQueryParameters='+excludedQueryParameters; $.each(urls, function (key,value){ request+= '&urls[]='+escape(value);} ); request += '&token_auth=' + piwik.token_auth; @@ -39,15 +47,33 @@ function getAddSiteAJAX( row ) return ajaxRequest; } +function getApiFormatUrls(urls) +{ + var aUrls = urls.trim().split("\n"); + for(var i=0; i < aUrls.length; i++) { + aUrls[i] = encodeURIComponent(aUrls[i]); + } + return aUrls; +} +function getApiFormatTextarea(textareaContent) +{ + return textareaContent.trim().split("\n").join(','); +} + function getUpdateSiteAJAX( row ) { var ajaxRequest = piwikHelper.getStandardAjaxConf(); - piwikHelper.toggleAjaxLoading(); var siteName = $(row).find('input#siteName').val(); var idSite = $(row).children('#idSite').html(); - var urls = $(row).find('textarea#urls').val().trim().split("\n"); - + var urls = $(row).find('textarea#urls').val(); + urls = getApiFormatUrls(urls); + var excludedIps = $(row).find('textarea#excludedIps').val(); + excludedIps = getApiFormatTextarea(excludedIps); + var excludedQueryParameters = $(row).find('textarea#excludedQueryParameters').val(); + excludedQueryParameters = getApiFormatTextarea(excludedQueryParameters); + var timezone = encodeURIComponent($(row).find('#timezones option:selected').val()); + var currency = encodeURIComponent($(row).find('#currencies option:selected').val()); var request = ''; request += '&module=API'; request += '&format=json'; @@ -55,6 +81,10 @@ function getUpdateSiteAJAX( row ) siteName = encodeURIComponent(siteName); request += '&siteName='+siteName; request += '&idSite='+idSite; + request += '&timezone='+timezone; + request += '¤cy='+currency; + request += '&excludedIps='+excludedIps; + request += '&excludedQueryParameters='+excludedQueryParameters; $.each(urls, function (key,value){ if(value.length>1) request+= '&urls[]='+value;} ); request += '&token_auth=' + piwik.token_auth; @@ -63,9 +93,31 @@ function getUpdateSiteAJAX( row ) return ajaxRequest; } +function getGlobalSettingsAJAX() +{ + var ajaxRequest = piwikHelper.getStandardAjaxConf('ajaxLoadingGlobalSettings', 'ajaxErrorGlobalSettings'); + var timezone = encodeURIComponent($('#defaultTimezone option:selected').val()); + var currency = encodeURIComponent($('#defaultCurrency option:selected').val()); + var excludedIps = $('textarea#globalExcludedIps').val(); + excludedIps = getApiFormatTextarea(excludedIps); + var excludedQueryParameters = $('textarea#globalExcludedQueryParameters').val(); + excludedQueryParameters = getApiFormatTextarea(excludedQueryParameters); + var request = ''; + request += 'module=SitesManager'; + request += '&action=setGlobalSettings'; + request += '&format=json'; + request += '&timezone='+timezone; + request += '¤cy='+currency; + request += '&excludedIps='+excludedIps; + request += '&excludedQueryParameters='+excludedQueryParameters; + request += '&token_auth=' + piwik.token_auth; + ajaxRequest.data = request; + return ajaxRequest; +} + $(document).ready( function() { $('.addRowSite').click( function() { - piwikHelper.ajaxHideError(); + piwikHelper.hideAjaxError(); $(this).toggle(); var numberOfRows = $('table#editSites')[0].rows.length; @@ -73,22 +125,25 @@ $(document).ready( function() { $(' <tr id="'+newRowId+'">\ <td> </td>\ - <td><input id="siteadd_name" value="Name" size=25></td>\ - <td><textarea cols=30 rows=3 id="siteadd_urls">http://siteUrl.com/\nhttp://siteUrl2.com/</textarea></td>\ - <td><img src="plugins/UsersManager/images/ok.png" class="addsite" href="#"></td>\ - <td><img src="plugins/UsersManager/images/remove.png" class="cancel"></td>\ + <td><input id="name" value="Name" size="15" /></td>\ + <td><textarea cols="25" rows="3" id="urls">http://siteUrl.com/\nhttp://siteUrl2.com/</textarea><br />'+aliasUrlsHelp+'</td>\ + <td><textarea cols="20" rows="4" id="excludedIps"></textarea><br />'+excludedIpHelp+'</td>\ + <td><textarea cols="20" rows="4" id="excludedQueryParameters"></textarea><br />'+excludedQueryParametersHelp+'</td>\ + <td>'+getTimezoneSelector(defaultTimezone)+'<br />' + timezoneHelp + '</td>\ + <td>'+getCurrencySelector(defaultCurrency)+'<br />' + currencyHelp + '</td>\ + <td><img src="plugins/UsersManager/images/ok.png" class="addsite" href="#" title="' + _pk_translate('SitesManager_Save_js') + '" /></td>\ + <td><img src="plugins/UsersManager/images/remove.png" class="cancel" title="' + _pk_translate('SitesManager_Cancel_js') +'" /></td>\ </tr>') .appendTo('#editSites') ; - $('#'+newRowId).keypress( submitSiteOnEnter ); $('.addsite').click( function(){ $.ajax( getAddSiteAJAX($('tr#'+newRowId)) ); } ); - $('.cancel').click(function() { piwikHelper.ajaxHideError(); $(this).parents('tr').remove(); $('.addRowSite').toggle(); }); - + $('.cancel').click(function() { piwikHelper.hideAjaxError(); $(this).parents('tr').remove(); $('.addRowSite').toggle(); }); + return false; } ); // when click on deleteuser, the we ask for confirmation and then delete the user $('.deleteSite').click( function() { - piwikHelper.ajaxHideError(); + piwikHelper.hideAjaxError(); var idRow = $(this).attr('id'); var nameToDelete = $(this).parent().parent().find('input#siteName').val() || $(this).parent().parent().find('td#siteName').html(); var idsiteToDelete = $(this).parent().parent().find('#idSite').html(); @@ -101,7 +156,7 @@ $(document).ready( function() { var alreadyEdited = new Array; $('.editSite') .click( function() { - piwikHelper.ajaxHideError(); + piwikHelper.hideAjaxError(); var idRow = $(this).attr('id'); if(alreadyEdited[idRow]==1) return; alreadyEdited[idRow] = 1; @@ -113,14 +168,39 @@ $(document).ready( function() { var idName = $(n).attr('id'); if(idName == 'siteName') { - var contentAfter = '<input id="'+idName+'" value="'+contentBefore+'" size="25">'; + var contentAfter = '<input id="'+idName+'" value="'+contentBefore+'" size="15" />'; $(n) .html(contentAfter) .keypress( submitSiteOnEnter ); } if(idName == 'urls') { - var contentAfter = '<textarea cols=30 rows=3 id="urls">'+contentBefore.replace(/<br *\/? *>/gi,"\n")+'</textarea>'; + var contentAfter = '<textarea cols="25" rows="3" id="urls">'+contentBefore.replace(/<br *\/? *>/gi,"\n")+'</textarea>'; + contentAfter += '<br />'+aliasUrlsHelp; + $(n).html(contentAfter); + } + if(idName == 'excludedIps') + { + var contentAfter = '<textarea cols="20" rows="4" id="excludedIps">'+contentBefore.replace(/<br *\/? *>/gi,"\n")+'</textarea>'; + contentAfter += '<br />'+excludedIpHelp; + $(n).html(contentAfter); + } + if(idName == 'excludedQueryParameters') + { + var contentAfter = '<textarea cols="20" rows="4" id="excludedQueryParameters">'+contentBefore.replace(/<br *\/? *>/gi,"\n")+'</textarea>'; + contentAfter += '<br />'+excludedQueryParametersHelp; + $(n).html(contentAfter); + } + if(idName == 'timezone') + { + var contentAfter = getTimezoneSelector(contentBefore); + contentAfter += '<br />' + timezoneHelp; + $(n).html(contentAfter); + } + if(idName == 'currency') + { + var contentAfter = getCurrencySelector(contentBefore); + contentAfter += '<br />' + currencyHelp; $(n).html(contentAfter); } } @@ -128,15 +208,55 @@ $(document).ready( function() { $(this) .toggle() .parent() - .prepend( $('<img src="plugins/UsersManager/images/ok.png" class="updateSite">') + .prepend( $('<img src="plugins/UsersManager/images/ok.png" class="updateSite" title="' + _pk_translate('SitesManager_Save_js') + '" />') .click( function(){ $.ajax( getUpdateSiteAJAX( $('tr#'+idRow) ) ); } ) ); } ); + $('#globalSettingsSubmit').click( function() { + $.ajax( getGlobalSettingsAJAX() ); + }); + + $('#defaultTimezone').html( getTimezoneSelector(defaultTimezone)); + $('#defaultCurrency').html( getCurrencySelector(defaultCurrency)); + $('td.editableSite').click( function(){ $(this).parent().find('.editSite').click(); } ); }); - + +function getTimezoneSelector(selectedTimezone) +{ + var html = '<select id="timezones">'; + for(var continent in timezones) { + html += '<optgroup label="' + continent + '">'; + for(var timezoneId in timezones[continent]) { + var selected = ''; + if(timezoneId == selectedTimezone) { + selected = ' selected="selected" '; + } + html += '<option ' + selected + ' value="'+ timezoneId + '">' + timezones[continent][timezoneId] + '</option>'; + } + html += "</optgroup>\n"; + } + html += '</select>'; + return html; +} + + +function getCurrencySelector(selectedCurrency) +{ + var html = '<select id="currencies">'; + for(var currency in currencies) { + var selected = ''; + if(currency == selectedCurrency) { + selected = ' selected="selected" '; + } + html += '<option ' + selected + ' value="'+ currency + '">' + currencies[currency] + '</option>'; + } + html += '</select>'; + return html; +} + function submitSiteOnEnter(e) { var key=e.keyCode || e.which; diff --git a/plugins/SitesManager/templates/SitesManager.tpl b/plugins/SitesManager/templates/SitesManager.tpl index 39d7f9261a..b61a3eaea2 100644 --- a/plugins/SitesManager/templates/SitesManager.tpl +++ b/plugins/SitesManager/templates/SitesManager.tpl @@ -2,9 +2,47 @@ {assign var=showPeriodSelection value=false} {include file="CoreAdminHome/templates/header.tpl"} {loadJavascriptTranslations plugins='SitesManager'} -{include file="CoreAdminHome/templates/menu.tpl"} + +<script type="text/javascript"> +{capture assign=excludedIpHelpPlain}{'SitesManager_HelpExcludedIps'|translate:"1.2.3.*":"1.2.*.*"}<br /><br /> {'SitesManager_YourCurrentIpAddressIs'|translate:"<i>$currentIpAddress</i>"}{/capture} +{assign var=excludedIpHelp value=$excludedIpHelpPlain|inlineHelp} +var excludedIpHelp = '{$excludedIpHelp|escape:javascript}'; +var aliasUrlsHelp = '{'SitesManager_AliasUrlHelp'|translate|inlineHelp|escape:javascript}'; +{capture assign=defaultTimezoneHelpPlain} + {if $timezoneSupported} + {'SitesManager_ChooseCityInSameTimezoneAsYou'|translate} + {else} + {'SitesManager_AdvancedTimezoneSupportNotFound'|translate} + {/if} <br /><br />{'SitesManager_UTCTimeIs'|translate:$utcTime} +{/capture} + +{capture assign=timezoneHelpPlain} + {$defaultTimezoneHelpPlain} + <br /><br />{'SitesManager_ChangingYourTimezoneWillOnlyAffectDataForward'|translate} +{/capture} + +{capture assign=currencyHelpPlain} + {'SitesManager_CurrencySymbolWillBeUsedForGoals'|translate|inlineHelp} +{/capture} + +{capture assign=excludedQueryParametersHelp} + {'SitesManager_ListOfQueryParametersToExclude'|translate} + <br /><br /> + {'SitesManager_PiwikWillAutomaticallyExcludeCommonSessionParameters'|translate:"phpsessid, sessionid, etc."} +{/capture} +{assign var=excludedQueryParametersHelp value=$excludedQueryParametersHelp|inlineHelp} +var excludedQueryParametersHelp = '{$excludedQueryParametersHelp|escape:javascript}'; +var timezoneHelp = '{$timezoneHelpPlain|inlineHelp|escape:javascript}'; +var currencyHelp = '{$currencyHelpPlain|escape:javascript}'; +{assign var=defaultTimezoneHelp value=$defaultTimezoneHelpPlain|inlineHelp}; +var timezones = {$timezones}; +var currencies = {$currencies}; +var defaultTimezone = '{$defaultTimezone}'; +var defaultCurrency = '{$defaultCurrency}'; +</script> <script type="text/javascript" src="plugins/SitesManager/templates/SitesManager.js"></script> + {literal} <style> .addRowSite:hover, .editableSite:hover, .addsite:hover, .cancel:hover, .deleteSite:hover, .editSite:hover, .updateSite:hover{ @@ -22,13 +60,27 @@ #editSites { valign: top; } +option, select { + font-size:11px; +} +textarea { +font-size:9pt; +} +.admin thead th { +vertical-align:middle; +} </style> {/literal} + <h2>{'SitesManager_WebsitesManagement'|translate}</h2> -<p>{'SitesManager_MainDescription'|translate}</p> +<p>{'SitesManager_MainDescription'|translate} +{if $isSuperUser} +<br />{'SitesManager_SuperUserCan'|translate:"<a href='#globalSettings'>":"</a>"} +{/if} +</p> +{ajaxErrorDiv} +{ajaxLoadingDiv} -<div id="ajaxError" style="display:none"></div> -<div id="ajaxLoading" style="display:none"><div id="loadingPiwik"><img src="themes/default/images/loading-blue.gif" alt="" /> {'General_LoadingData'|translate} </div></div> {if $adminSites|@count == 0} {'SitesManager_NoWebsites'|translate} @@ -39,6 +91,10 @@ <th>{'SitesManager_Id'|translate}</th> <th>{'SitesManager_Name'|translate}</th> <th>{'SitesManager_Urls'|translate}</th> + <th>{'SitesManager_ExcludedIps'|translate}</th> + <th>{'SitesManager_ExcludedParameters'|translate|replace:" ":"<br />"}</th> + <th>{'SitesManager_Timezone'|translate}</th> + <th>{'SitesManager_Currency'|translate}</th> <th> </th> <th> </th> <th> {'SitesManager_JsTrackingTag'|translate} </th> @@ -50,15 +106,75 @@ <td id="idSite">{$site.idsite}</td> <td id="siteName" class="editableSite">{$site.name}</td> <td id="urls" class="editableSite">{foreach from=$site.alias_urls item=url}{$url}<br />{/foreach}</td> - <td><img src='plugins/UsersManager/images/edit.png' class="editSite" id="row{$i}" href='#' alt="" /></td> - <td><img src='plugins/UsersManager/images/remove.png' class="deleteSite" id="row{$i}" value="{'General_Delete'|translate}" alt="" /></td> + <td id="excludedIps" class="editableSite">{foreach from=$site.excluded_ips item=ip}{$ip}<br />{/foreach}</td> + <td id="excludedQueryParameters" class="editableSite">{foreach from=$site.excluded_parameters item=parameter}{$parameter}<br />{/foreach}</td> + <td id="timezone" class="editableSite">{$site.timezone}</td> + <td id="currency" class="editableSite">{$site.currency}</td> + <td><img src='plugins/UsersManager/images/edit.png' class="editSite" id="row{$i}" href='#' title="{'General_Edit'|translate}" /></td> + <td><img src='plugins/UsersManager/images/remove.png' class="deleteSite" id="row{$i}" title="{'General_Delete'|translate}" value="{'General_Delete'|translate}" /></td> <td><a href='{url action=displayJavascriptCode idsite=$site.idsite}'>{'SitesManager_ShowTrackingTag'|translate}</a></td> </tr> {/foreach} - </tbody> </table> - <div class="addRowSite"><a href="#"><img src='plugins/UsersManager/images/add.png' alt="" /> {'SitesManager_AddSite'|translate}</a></div> + {if $isSuperUser} + <div class="addRowSite"><a href=""><img src='plugins/UsersManager/images/add.png' alt="" /> {'SitesManager_AddSite'|translate}</a></div> + {/if} +{/if} + +{if $isSuperUser} +<br /> + <a name='globalSettings'></a> + <h2>{'SitesManager_GlobalWebsitesSettings'|translate}</h2> + <br /> + <table style='width:600px' class="adminTable adminTableNoBorder" > + + <tr><td colspan="2"> + <b>{'SitesManager_GlobalListExcludedIps'|translate}</b> + <p>{'SitesManager_ListOfIpsToBeExcludedOnAllWebsites'|translate} </p> + </td></tr> + <tr><td> + <textarea cols="30" rows="3" id="globalExcludedIps">{$globalExcludedIps} +</textarea> + </td><td> + {$excludedIpHelp} + </td></tr> + + <tr><td colspan="2"> + <b>{'SitesManager_GlobalListExcludedQueryParameters'|translate}</b> + <p>{'SitesManager_ListOfQueryParametersToBeExcludedOnAllWebsites'|translate} </p> + </td></tr> + <tr><td> + <textarea cols="30" rows="3" id="globalExcludedQueryParameters">{$globalExcludedQueryParameters} +</textarea> + </td><td> + {$excludedQueryParametersHelp} + </td></tr> + + <tr><td colspan="2"> + <b>{'SitesManager_DefaultTimezoneForNewWebsites'|translate}</b> + <p>{'SitesManager_SelectDefaultTimezone'|translate} </p> + </td></tr> + <tr><td> + <div id='defaultTimezone'></div> + </td><td> + {$defaultTimezoneHelp} + </td></tr> + + <tr><td colspan="2"> + <b>{'SitesManager_DefaultCurrencyForNewWebsites'|translate}</b> + <p>{'SitesManager_SelectDefaultCurrency'|translate} </p> + </td></tr> + <tr><td> + <div id='defaultCurrency'></div> + </td><td> + {$currencyHelpPlain} + </td></tr> + </table> + <span style='margin-left:20px'><input type="submit" class="submit" id='globalSettingsSubmit' value="{'General_Save'|translate}" /></span> + {ajaxErrorDiv id=ajaxErrorGlobalSettings} + {ajaxLoadingDiv id=ajaxLoadingGlobalSettings} {/if} +<br /><br /><br /><br /> {include file="CoreAdminHome/templates/footer.tpl"} diff --git a/plugins/SitesManager/tests/SitesManager.test.php b/plugins/SitesManager/tests/SitesManager.test.php index db4c765812..fbaf8c7adf 100644 --- a/plugins/SitesManager/tests/SitesManager.test.php +++ b/plugins/SitesManager/tests/SitesManager.test.php @@ -7,10 +7,15 @@ if(!defined('PIWIK_CONFIG_TEST_INCLUDED')) require_once PIWIK_PATH_TEST_TO_ROOT . "/tests/config_test.php"; } -require_once "Database.test.php"; +require_once PIWIK_PATH_TEST_TO_ROOT . '/tests/core/Database.test.php'; class Test_Piwik_SitesManager extends Test_Database { + public function __construct() + { + Piwik_PluginsManager::getInstance()->unloadPlugin('ExampleFeedburner'); + parent::__construct(); + } public function setUp() { parent::setUp(); @@ -19,6 +24,9 @@ class Test_Piwik_SitesManager extends Test_Database $pseudoMockAccess = new FakeAccess; FakeAccess::$superUser = true; Zend_Registry::set('access', $pseudoMockAccess); + + // clear static Site cache + Piwik_Site::clearCache(); } /** @@ -27,7 +35,7 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_emptyName() { try { - Piwik_SitesManager_API::addSite("",array("http://piwik.net")); + Piwik_SitesManager_API::getInstance()->addSite("",array("http://piwik.net")); } catch (Exception $expected) { return; @@ -41,7 +49,7 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_noUrls() { try { - Piwik_SitesManager_API::addSite("name",array()); + Piwik_SitesManager_API::getInstance()->addSite("name",array()); } catch (Exception $expected) { return; @@ -55,7 +63,7 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_wrongUrls1() { try { - Piwik_SitesManager_API::addSite("name",array("")); + Piwik_SitesManager_API::getInstance()->addSite("name",array("")); } catch (Exception $expected) { return; @@ -68,7 +76,7 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_wrongUrls2() { try { - Piwik_SitesManager_API::addSite("name",""); + Piwik_SitesManager_API::getInstance()->addSite("name",""); } catch (Exception $expected) { return; @@ -82,7 +90,7 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_wrongUrls3() { try { - Piwik_SitesManager_API::addSite("name","httpww://piwik.net"); + Piwik_SitesManager_API::getInstance()->addSite("name","httpww://piwik.net"); } catch (Exception $expected) { return; @@ -96,7 +104,7 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_wrongUrls4() { try { - Piwik_SitesManager_API::addSite("name","httpww://piwik.net/gqg~#"); + Piwik_SitesManager_API::getInstance()->addSite("name","httpww://piwik.net/gqg~#"); } catch (Exception $expected) { return; @@ -105,19 +113,68 @@ class Test_Piwik_SitesManager extends Test_Database } /** + * Test with valid IPs + */ + public function test_addSite_excludedIpsAndtimezoneAndCurrencyAndExcludedQueryParameters_valid() + { + $ips = '1.2.3.4,1.1.1.*,1.2.*.*,1.*.*.*'; + $timezone = 'Europe/Paris'; + $currency = 'EUR'; + $excludedQueryParameters = 'p1,P2, P33333'; + $expectedExcludedQueryParameters = 'p1,P2,P33333'; + $idsite = Piwik_SitesManager_API::getInstance()->addSite("name","http://piwik.net/", $ips, $excludedQueryParameters,$timezone, $currency); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); + $this->assertEqual($siteInfo['excluded_ips'], $ips); + $this->assertEqual($siteInfo['timezone'], $timezone); + $this->assertEqual($siteInfo['currency'], $currency); + $this->assertEqual($siteInfo['excluded_parameters'], $expectedExcludedQueryParameters); + } + + /** + * Test with invalid IPs + */ + public function test_addSite_excludedIps_notValid() + { + $invalidIps = array( + '35817587341', + 'ieagieha', + '1.2.3', + '*.1.1.1', + '*.*.1.1', + '*.*.*.1', + '*.*.*.*', + '1.1.1.1.1', + ); + foreach($invalidIps as $ip) + { + $raised = false; + try { + $idsite = Piwik_SitesManager_API::getInstance()->addSite("name","http://piwik.net/", $ip); + } catch(Exception $e) { + $raised = true; + } + if(!$raised) + { + $this->fail('was expecting invalid IP exception to raise'); + } + } + $this->pass(); + } + + /** * one url -> one main_url and nothing inserted as alias urls */ public function test_addSite_oneUrl() { $url = "http://piwik.net/"; $urlOK = "http://piwik.net"; - $idsite = Piwik_SitesManager_API::addSite("name",$url); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("name",$url); $this->assertIsA( $idsite,'int'); - $siteInfo = Piwik_SitesManager_API::getSiteFromId($idsite); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); $this->assertEqual($siteInfo['main_url'], $urlOK); - $siteUrls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $this->assertTrue(count($siteUrls)===1); } @@ -128,13 +185,13 @@ class Test_Piwik_SitesManager extends Test_Database { $urls = array("http://piwik.net/","http://piwik.com","https://piwik.net/test/"); $urlsOK = array("http://piwik.net","http://piwik.com","https://piwik.net/test"); - $idsite = Piwik_SitesManager_API::addSite("super website",$urls); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("super website",$urls); $this->assertIsA( $idsite,'int'); - $siteInfo = Piwik_SitesManager_API::getSiteFromId($idsite); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); $this->assertEqual($siteInfo['main_url'], $urlsOK[0]); - $siteUrls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $this->assertEqual($siteUrls, $urlsOK); } @@ -144,10 +201,10 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite_strangeName() { $name = "supertest(); ~@@()''!£\$'%%^'!£"; - $idsite = Piwik_SitesManager_API::addSite($name,"http://piwik.net"); + $idsite = Piwik_SitesManager_API::getInstance()->addSite($name,"http://piwik.net"); $this->assertIsA( $idsite,'int'); - $siteInfo = Piwik_SitesManager_API::getSiteFromId($idsite); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); $this->assertEqual($siteInfo['name'], $name); } @@ -157,14 +214,14 @@ class Test_Piwik_SitesManager extends Test_Database public function test_addSite() { $name = "website "; - $idsite = Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")); $this->assertIsA( $idsite,'int'); - $siteInfo = Piwik_SitesManager_API::getSiteFromId($idsite); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); $this->assertEqual($siteInfo['name'], $name); $this->assertEqual($siteInfo['main_url'], "http://piwik.net"); - $siteUrls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $this->assertEqual($siteUrls, array("http://piwik.net","http://piwik.com/test")); return $idsite; @@ -177,7 +234,7 @@ class Test_Piwik_SitesManager extends Test_Database { $idsite = $this->test_addSite(); - $siteUrlsBefore = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $toAdd = array( "http://piwik1.net", "http://piwik2.net", @@ -195,10 +252,10 @@ class Test_Piwik_SitesManager extends Test_Database "http://l42578gqege.f4", "http://super.com/test/test/atqata675675/te"); - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls($idsite, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd); $this->assertEqual($insertedUrls, count($toAdd)); - $siteUrlsAfter = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $shouldHave = array_merge($siteUrlsBefore, $toAddValid); sort($shouldHave); @@ -215,14 +272,14 @@ class Test_Piwik_SitesManager extends Test_Database { $idsite = $this->test_addSite(); - $siteUrlsBefore = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $toAdd = array_merge($siteUrlsBefore, array("http://piwik1.net","http://piwik2.net")); - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls($idsite, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd); $this->assertEqual($insertedUrls, count($toAdd) - count($siteUrlsBefore)); - $siteUrlsAfter = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $shouldHave = $toAdd; sort($shouldHave); @@ -239,14 +296,14 @@ class Test_Piwik_SitesManager extends Test_Database { $idsite = $this->test_addSite(); - $siteUrlsBefore = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $toAdd = array(); - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls($idsite, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd); $this->assertEqual($insertedUrls, count($toAdd)); - $siteUrlsAfter = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $shouldHave = $siteUrlsBefore; sort($shouldHave); @@ -263,14 +320,14 @@ class Test_Piwik_SitesManager extends Test_Database { $idsite = $this->test_addSite(); - $siteUrlsBefore = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsBefore = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $toAdd = $siteUrlsBefore; - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls($idsite, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd); $this->assertEqual($insertedUrls, 0); - $siteUrlsAfter = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $siteUrlsAfter = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $shouldHave = $siteUrlsBefore; sort($shouldHave); @@ -287,7 +344,7 @@ class Test_Piwik_SitesManager extends Test_Database $idsite = $this->test_addSite(); $toAdd = array("htt{}p://pigeq.com/test"); try { - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls($idsite, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls($idsite, $toAdd); } catch (Exception $expected) { return; @@ -302,7 +359,7 @@ class Test_Piwik_SitesManager extends Test_Database { $toAdd = array("http://pigeq.com/test"); try { - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls(-1, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls(-1, $toAdd); } catch (Exception $expected) { return; @@ -318,7 +375,7 @@ class Test_Piwik_SitesManager extends Test_Database $toAdd = array("http://pigeq.com/test"); try { - $insertedUrls = Piwik_SitesManager_API::addSiteAliasUrls(155, $toAdd); + $insertedUrls = Piwik_SitesManager_API::getInstance()->addSiteAliasUrls(155, $toAdd); } catch (Exception $expected) { return; @@ -331,7 +388,7 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_getAllSitesId_noId() { - $ids = Piwik_SitesManager_API::getAllSitesId(); + $ids = Piwik_SitesManager_API::getInstance()->getAllSitesId(); $this->assertEqual(array(),$ids); } @@ -342,14 +399,14 @@ class Test_Piwik_SitesManager extends Test_Database { $name="tetq"; $idsites = array( - Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")), - Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")), - Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")), - Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")), - Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")), + Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")), + Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")), + Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")), + Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")), + Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")), ); - $ids = Piwik_SitesManager_API::getAllSitesId(); + $ids = Piwik_SitesManager_API::getInstance()->getAllSitesId(); $this->assertEqual($idsites,$ids); } @@ -360,7 +417,7 @@ class Test_Piwik_SitesManager extends Test_Database { try { - $siteInfo = Piwik_SitesManager_API::getSiteFromId(0); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId(0); } catch (Exception $expected) { return; @@ -375,7 +432,7 @@ class Test_Piwik_SitesManager extends Test_Database { try { - $siteInfo = Piwik_SitesManager_API::getSiteFromId("x1"); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId("x1"); } catch (Exception $expected) { return; @@ -388,7 +445,7 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_getSiteFromId_wrongId3() { - $idsite = Piwik_SitesManager_API::addSite("site",array("http://piwik.net","http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site",array("http://piwik.net","http://piwik.com/test/")); $this->assertEqual($idsite,1); // set noaccess to site 1 @@ -396,7 +453,7 @@ class Test_Piwik_SitesManager extends Test_Database FakeAccess::setIdSitesAdmin (array()); try { - $siteInfo = Piwik_SitesManager_API::getSiteFromId(1); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId(1); } catch (Exception $expected) { return; @@ -410,10 +467,10 @@ class Test_Piwik_SitesManager extends Test_Database function test_getSiteFromId_normalId() { $name = "website ''"; - $idsite = Piwik_SitesManager_API::addSite($name,array("http://piwik.net","http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite($name,array("http://piwik.net","http://piwik.com/test/")); $this->assertIsA( $idsite,'int'); - $siteInfo = Piwik_SitesManager_API::getSiteFromId($idsite); + $siteInfo = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); $this->assertEqual($siteInfo['name'], $name); $this->assertEqual($siteInfo['main_url'], "http://piwik.net"); } @@ -426,7 +483,7 @@ class Test_Piwik_SitesManager extends Test_Database { FakeAccess::setIdSitesAdmin (array()); - $sites = Piwik_SitesManager_API::getSitesWithAdminAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAdminAccess(); $this->assertEqual($sites, array()); } @@ -435,18 +492,18 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_getSitesWithAdminAccess() { - $idsite = Piwik_SitesManager_API::addSite("site1",array("http://piwik.net","http://piwik.com/test/")); - $idsite = Piwik_SitesManager_API::addSite("site2",array("http://piwik.com/test/")); - $idsite = Piwik_SitesManager_API::addSite("site3",array("http://piwik.org")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org")); $resultWanted = array( - 0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net"), - 1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org"), + 0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net", "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD'), + 1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org", "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD'), ); FakeAccess::setIdSitesAdmin (array(1,3)); - $sites = Piwik_SitesManager_API::getSitesWithAdminAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAdminAccess(); // we dont test the ts_created unset($sites[0]['ts_created']); @@ -462,7 +519,7 @@ class Test_Piwik_SitesManager extends Test_Database FakeAccess::setIdSitesView (array()); FakeAccess::setIdSitesAdmin (array()); - $sites = Piwik_SitesManager_API::getSitesWithViewAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithViewAccess(); $this->assertEqual($sites, array()); } @@ -471,19 +528,19 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_getSitesWithViewAccess() { - $idsite = Piwik_SitesManager_API::addSite("site1",array("http://piwik.net","http://piwik.com/test/")); - $idsite = Piwik_SitesManager_API::addSite("site2",array("http://piwik.com/test/")); - $idsite = Piwik_SitesManager_API::addSite("site3",array("http://piwik.org")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org")); $resultWanted = array( - 0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net"), - 1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org"), + 0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net", "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD'), + 1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org", "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD'), ); FakeAccess::setIdSitesView (array(1,3)); FakeAccess::setIdSitesAdmin (array()); - $sites = Piwik_SitesManager_API::getSitesWithViewAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithViewAccess(); // we dont test the ts_created unset($sites[0]['ts_created']); unset($sites[1]['ts_created']); @@ -498,7 +555,7 @@ class Test_Piwik_SitesManager extends Test_Database FakeAccess::setIdSitesView (array()); FakeAccess::setIdSitesAdmin (array()); - $sites = Piwik_SitesManager_API::getSitesWithAtLeastViewAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess(); $this->assertEqual($sites, array()); } @@ -507,19 +564,19 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_getSitesWithAtLeastViewAccess() { - $idsite = Piwik_SitesManager_API::addSite("site1",array("http://piwik.net","http://piwik.com/test/")); - $idsite = Piwik_SitesManager_API::addSite("site2",array("http://piwik.com/test/")); - $idsite = Piwik_SitesManager_API::addSite("site3",array("http://piwik.org")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com/test/")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.org")); $resultWanted = array( - 0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net"), - 1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org"), + 0 => array("idsite" => 1, "name" => "site1", "main_url" =>"http://piwik.net", "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD'), + 1 => array("idsite" => 3, "name" => "site3", "main_url" =>"http://piwik.org", "excluded_ips" => "", 'excluded_parameters' => '', 'timezone' => 'UTC', 'currency' => 'USD'), ); FakeAccess::setIdSitesView (array(1,3)); FakeAccess::setIdSitesAdmin (array()); - $sites = Piwik_SitesManager_API::getSitesWithAtLeastViewAccess(); + $sites = Piwik_SitesManager_API::getInstance()->getSitesWithAtLeastViewAccess(); // we dont test the ts_created unset($sites[0]['ts_created']); unset($sites[1]['ts_created']); @@ -532,9 +589,9 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_getSiteUrlsFromId_noUrls() { - $idsite = Piwik_SitesManager_API::addSite("site1",array("http://piwik.net")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net")); - $urls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $urls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $this->assertEqual(array("http://piwik.net"),$urls); } @@ -549,14 +606,14 @@ class Test_Piwik_SitesManager extends Test_Database "http://piwik.com"); sort($site); - $idsite = Piwik_SitesManager_API::addSite("site1",$site); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",$site); $siteWanted = array("http://piwik.net", "http://piwik.org", "http://piwik.com"); sort($siteWanted); - $urls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $urls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $this->assertEqual($siteWanted, $urls); @@ -571,7 +628,7 @@ class Test_Piwik_SitesManager extends Test_Database FakeAccess::setIdSitesAdmin (array()); try { - Piwik_SitesManager_API::getSiteUrlsFromId(1); + Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId(1); } catch (Exception $expected) { return; @@ -588,12 +645,12 @@ class Test_Piwik_SitesManager extends Test_Database "http://piwiknew.net", "http://piwiknew.org", "http://piwiknew.fr"); - $idsite = Piwik_SitesManager_API::addSite("site1",$urls); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",$urls); $newMainUrl = "http://main.url"; - Piwik_SitesManager_API::updateSite($idsite, "test toto@{}", $newMainUrl ); + Piwik_SitesManager_API::getInstance()->updateSite($idsite, "test toto@{}", $newMainUrl ); - $allUrls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $allUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); $this->assertEqual($allUrls[0], $newMainUrl); $aliasUrls = array_slice($allUrls,1); @@ -605,12 +662,12 @@ class Test_Piwik_SitesManager extends Test_Database */ function test_updateSite_strangeNameNoUrl() { - $idsite = Piwik_SitesManager_API::addSite("site1","http://main.url"); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1","http://main.url"); $newName ="test toto@{'786'}"; - Piwik_SitesManager_API::updateSite($idsite, $newName ); + Piwik_SitesManager_API::getInstance()->updateSite($idsite, $newName ); - $site = Piwik_SitesManager_API::getSiteFromId($idsite); + $site = Piwik_SitesManager_API::getInstance()->getSiteFromId($idsite); $this->assertEqual($site['name'],$newName); // url didn't change because parameter url NULL in updateSite @@ -629,20 +686,168 @@ class Test_Piwik_SitesManager extends Test_Database "http://piwiknew.net", "http://piwiknew.org", "http://piwiknew.fr"); - $idsite = Piwik_SitesManager_API::addSite("site1",$urls); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",$urls); $newurls = array("http://piwiknew2.com", "http://piwiknew2.net", "http://piwiknew2.org", "http://piwiknew2.fr"); - Piwik_SitesManager_API::updateSite($idsite, "test toto@{}",$newurls ); + Piwik_SitesManager_API::getInstance()->updateSite($idsite, "test toto@{}",$newurls ); - $allUrls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $allUrls = Piwik_SitesManager_API::getInstance()->getSiteUrlsFromId($idsite); sort($allUrls); sort($newurls); $this->assertEqual($allUrls,$newurls); } -} + function test_addSites_invalidTimezone() + { + // trying invalid timezones + try { + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'), '', '', 'UTC+15'); + $this->fail('invalid timezone should raise an exception'); + } catch(Exception $e) { + } + try { + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'), '', '', 'Paris'); + $this->fail('invalid timezone should raise an exception'); + } catch(Exception $e) { + } + $this->pass(); + } + + function test_addSites_invalidCurrency() + { + $invalidCurrency = '€'; + try { + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'), '', 'UTC', $invalidCurrency); + $this->fail('invalid currency should raise an exception'); + } catch(Exception $e) { + } + $this->pass(); + } + + function test_setDefaultTimezoneAndCurrencyAndExcludedQueryParametersAndExcludedIps() + { + // test that they return default values + $defaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone(); + $this->assertEqual($defaultTimezone, 'UTC'); + $defaultCurrency = Piwik_SitesManager_API::getInstance()->getDefaultCurrency(); + $this->assertEqual($defaultCurrency, 'USD'); + $excludedIps = Piwik_SitesManager_API::getInstance()->getExcludedIpsGlobal(); + $this->assertEqual($excludedIps, ''); + $excludedQueryParameters = Piwik_SitesManager_API::getInstance()->getExcludedQueryParametersGlobal(); + $this->assertEqual($excludedQueryParameters, ''); + + // test that when not specified, defaults are set as expected + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org')); + $site = new Piwik_Site($idsite); + $this->assertEqual($site->getTimezone(), 'UTC'); + $this->assertEqual($site->getCurrency(), 'USD'); + $this->assertEqual($site->getExcludedQueryParameters(), ''); + $this->assertEqual($site->getExcludedIps(), ''); + + // set the global timezone and get it + $newDefaultTimezone = 'UTC+5.5'; + Piwik_SitesManager_API::getInstance()->setDefaultTimezone($newDefaultTimezone); + $defaultTimezone = Piwik_SitesManager_API::getInstance()->getDefaultTimezone(); + $this->assertEqual($defaultTimezone, $newDefaultTimezone); + + // set the default currency and get it + $newDefaultCurrency = 'EUR'; + Piwik_SitesManager_API::getInstance()->setDefaultCurrency($newDefaultCurrency); + $defaultCurrency = Piwik_SitesManager_API::getInstance()->getDefaultCurrency(); + $this->assertEqual($defaultCurrency, $newDefaultCurrency); + + // set the global IPs to exclude and get it + $newGlobalExcludedIps = '1.1.1.*,1.1.*.*,150.1.1.1'; + Piwik_SitesManager_API::getInstance()->setGlobalExcludedIps($newGlobalExcludedIps); + $globalExcludedIps = Piwik_SitesManager_API::getInstance()->getExcludedIpsGlobal(); + $this->assertEqual($globalExcludedIps, $newGlobalExcludedIps); + + // set the global URL query params to exclude and get it + $newGlobalExcludedQueryParameters = 'PHPSESSID,blabla, TesT'; + // removed the space + $expectedGlobalExcludedQueryParameters = 'PHPSESSID,blabla,TesT'; + Piwik_SitesManager_API::getInstance()->setGlobalExcludedQueryParameters($newGlobalExcludedQueryParameters); + $globalExcludedQueryParameters = Piwik_SitesManager_API::getInstance()->getExcludedQueryParametersGlobal(); + $this->assertEqual($globalExcludedQueryParameters, $expectedGlobalExcludedQueryParameters); + + // create a website and check that default currency and default timezone are set + // however, excluded IPs and excluded query Params are not returned + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array('http://example.org'), '', '', $newDefaultTimezone); + $site = new Piwik_Site($idsite); + $this->assertEqual($site->getTimezone(), $newDefaultTimezone); + $this->assertEqual($site->getCreationDate()->toString(), date('Y-m-d')); + $this->assertEqual($site->getCurrency(), $newDefaultCurrency); + $this->assertEqual($site->getExcludedIps(), ''); + $this->assertEqual($site->getExcludedQueryParameters(), ''); + } + + function test_getSitesIdFromSiteUrl_SuperUser() + { + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com","http://piwik.net")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.com","http://piwik.org")); + + $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.org'); + $this->assertTrue(count($idsites) == 1); + + $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.net'); + $this->assertTrue(count($idsites) == 2); + + $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com'); + $this->assertTrue(count($idsites) == 3); + } + + function test_getSitesIdFromSiteUrl_User() + { + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site1",array("http://piwik.net","http://piwik.com")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site2",array("http://piwik.com","http://piwik.net")); + $idsite = Piwik_SitesManager_API::getInstance()->addSite("site3",array("http://piwik.com","http://piwik.org")); + + $saveAccess = Zend_Registry::get('access'); + + Piwik_UsersManager_API::getInstance()->addUser("user1", "geqgegagae", "tegst@tesgt.com", "alias"); + Piwik_UsersManager_API::getInstance()->setUserAccess("user1", "view", array(1)); + + Piwik_UsersManager_API::getInstance()->addUser("user2", "geqgegagae", "tegst2@tesgt.com", "alias"); + Piwik_UsersManager_API::getInstance()->setUserAccess("user2", "view", array(1)); + Piwik_UsersManager_API::getInstance()->setUserAccess("user2", "admin", array(3)); + + Piwik_UsersManager_API::getInstance()->addUser("user3", "geqgegagae", "tegst3@tesgt.com", "alias"); + Piwik_UsersManager_API::getInstance()->setUserAccess("user3", "view", array(1,2)); + Piwik_UsersManager_API::getInstance()->setUserAccess("user3", "admin", array(3)); + + $pseudoMockAccess = new FakeAccess; + FakeAccess::$superUser = false; + FakeAccess::$identity = 'user1'; + FakeAccess::setIdSitesView (array(1)); + FakeAccess::setIdSitesAdmin (array()); + Zend_Registry::set('access', $pseudoMockAccess); + $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com'); + $this->assertTrue(count($idsites) == 1); + + $pseudoMockAccess = new FakeAccess; + FakeAccess::$superUser = false; + FakeAccess::$identity = 'user2'; + FakeAccess::setIdSitesView (array(1)); + FakeAccess::setIdSitesAdmin (array(3)); + Zend_Registry::set('access', $pseudoMockAccess); + $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com'); + $this->assertTrue(count($idsites) == 2); + + $pseudoMockAccess = new FakeAccess; + FakeAccess::$superUser = false; + FakeAccess::$identity = 'user3'; + FakeAccess::setIdSitesView (array(1,2)); + FakeAccess::setIdSitesAdmin (array(3)); + Zend_Registry::set('access', $pseudoMockAccess); + $idsites = Piwik_SitesManager_API::getInstance()->getSitesIdFromSiteUrl('http://piwik.com'); + $this->assertTrue(count($idsites) == 3); + + Zend_Registry::set('access', $saveAccess); + } +} |