PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/UsersManager/Controller.php

https://github.com/quarkness/piwik
PHP | 321 lines | 249 code | 28 blank | 44 comment | 23 complexity | 03d8991eedffbd7ae396392e572ca6ba MD5 | raw file
  1. <?php
  2. /**
  3. * Piwik - Open source web analytics
  4. *
  5. * @link http://piwik.org
  6. * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  7. * @version $Id$
  8. *
  9. * @category Piwik_Plugins
  10. * @package Piwik_UsersManager
  11. */
  12. /**
  13. *
  14. * @package Piwik_UsersManager
  15. */
  16. class Piwik_UsersManager_Controller extends Piwik_Controller_Admin
  17. {
  18. /**
  19. * The "Manage Users and Permissions" Admin UI screen
  20. */
  21. function index()
  22. {
  23. $view = Piwik_View::factory('UsersManager');
  24. $IdSitesAdmin = Piwik_SitesManager_API::getInstance()->getSitesIdWithAdminAccess();
  25. $idSiteSelected = 1;
  26. if(count($IdSitesAdmin) > 0)
  27. {
  28. $defaultWebsiteId = $IdSitesAdmin[0];
  29. $idSiteSelected = Piwik_Common::getRequestVar('idsite', $defaultWebsiteId);
  30. }
  31. if($idSiteSelected==='all')
  32. {
  33. $usersAccessByWebsite = array();
  34. }
  35. else
  36. {
  37. $usersAccessByWebsite = Piwik_UsersManager_API::getInstance()->getUsersAccessFromSite( $idSiteSelected );
  38. }
  39. // we dont want to display the user currently logged so that the user can't change his settings from admin to view...
  40. $currentlyLogged = Piwik::getCurrentUserLogin();
  41. $usersLogin = Piwik_UsersManager_API::getInstance()->getUsersLogin();
  42. foreach($usersLogin as $login)
  43. {
  44. if(!isset($usersAccessByWebsite[$login]))
  45. {
  46. $usersAccessByWebsite[$login] = 'noaccess';
  47. }
  48. }
  49. unset($usersAccessByWebsite[$currentlyLogged]);
  50. // $usersAccessByWebsite is not supposed to contain unexistant logins, but it does when upgrading from some old Piwik version
  51. foreach($usersAccessByWebsite as $login => $access)
  52. {
  53. if(!in_array($login, $usersLogin))
  54. {
  55. unset($usersAccessByWebsite[$login]);
  56. continue;
  57. }
  58. }
  59. ksort($usersAccessByWebsite);
  60. $users = array();
  61. $usersAliasByLogin = array();
  62. if(Piwik::isUserHasSomeAdminAccess())
  63. {
  64. $users = Piwik_UsersManager_API::getInstance()->getUsers();
  65. foreach($users as $user)
  66. {
  67. $usersAliasByLogin[$user['login']] = $user['alias'];
  68. }
  69. }
  70. $view->idSiteSelected = $idSiteSelected;
  71. $view->users = $users;
  72. $view->usersAliasByLogin = $usersAliasByLogin;
  73. $view->usersCount = count($users) - 1;
  74. $view->usersAccessByWebsite = $usersAccessByWebsite;
  75. $websites = Piwik_SitesManager_API::getInstance()->getSitesWithAdminAccess();
  76. function orderByName($a, $b) { return strcmp($a['name'], $b['name']); }
  77. uasort($websites, 'orderByName');
  78. $view->websites = $websites;
  79. $this->setBasicVariablesView($view);
  80. $view->menu = Piwik_GetAdminMenu();
  81. echo $view->render();
  82. }
  83. /**
  84. * Returns default date for Piwik reports
  85. *
  86. * @param string $user
  87. * @return string today, yesterday, week, month, year
  88. */
  89. protected function getDefaultDateForUser($user)
  90. {
  91. $userSettingsDate = Piwik_UsersManager_API::getInstance()->getUserPreference($user, Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT_DATE);
  92. if($userSettingsDate === false)
  93. {
  94. return Zend_Registry::get('config')->General->default_day;
  95. }
  96. return $userSettingsDate;
  97. }
  98. /**
  99. * The "User Settings" admin UI screen view
  100. */
  101. public function userSettings()
  102. {
  103. $view = Piwik_View::factory('userSettings');
  104. $userLogin = Piwik::getCurrentUserLogin();
  105. if(Piwik::isUserIsSuperUser())
  106. {
  107. $view->userAlias = $userLogin;
  108. $view->userEmail = Piwik::getSuperUserEmail();
  109. if(!Zend_Registry::get('config')->isFileWritable())
  110. {
  111. $view->configFileNotWritable = true;
  112. }
  113. }
  114. else
  115. {
  116. $user = Piwik_UsersManager_API::getInstance()->getUser($userLogin);
  117. $view->userAlias = $user['alias'];
  118. $view->userEmail = $user['email'];
  119. }
  120. $defaultReport = Piwik_UsersManager_API::getInstance()->getUserPreference($userLogin, Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT);
  121. if($defaultReport === false)
  122. {
  123. $defaultReport = $this->getDefaultWebsiteId();
  124. }
  125. $view->defaultReport = $defaultReport;
  126. $view->defaultDate = $this->getDefaultDateForUser($userLogin);
  127. $view->availableDefaultDates = array(
  128. 'today' => Piwik_Translate('General_Today'),
  129. 'yesterday' => Piwik_Translate('General_Yesterday'),
  130. 'previous7' => Piwik_Translate('General_PreviousDays', 7),
  131. 'previous30' => Piwik_Translate('General_PreviousDays', 30),
  132. 'last7' => Piwik_Translate('General_LastDays', 7),
  133. 'last30' => Piwik_Translate('General_LastDays', 30),
  134. 'week' => Piwik_Translate('General_CurrentWeek'),
  135. 'month' => Piwik_Translate('General_CurrentMonth'),
  136. 'year' => Piwik_Translate('General_CurrentYear'),
  137. );
  138. $view->ignoreCookieSet = Piwik_Tracker_IgnoreCookie::isIgnoreCookieFound();
  139. $this->initViewAnonymousUserSettings($view);
  140. $view->piwikHost = Piwik_Url::getCurrentHost();
  141. $this->setBasicVariablesView($view);
  142. $view->menu = Piwik_GetAdminMenu();
  143. echo $view->render();
  144. }
  145. public function setIgnoreCookie()
  146. {
  147. Piwik::checkUserHasSomeViewAccess();
  148. Piwik::checkUserIsNotAnonymous();
  149. $this->checkTokenInUrl();
  150. Piwik_Tracker_IgnoreCookie::setIgnoreCookie();
  151. Piwik::redirectToModule('UsersManager', 'userSettings');
  152. }
  153. /**
  154. * The Super User can modify Anonymous user settings
  155. * @param Piwik_View $view
  156. */
  157. protected function initViewAnonymousUserSettings($view)
  158. {
  159. if(!Piwik::isUserIsSuperUser())
  160. {
  161. return;
  162. }
  163. $userLogin = 'anonymous';
  164. // Which websites are available to the anonymous users?
  165. $anonymousSitesAccess = Piwik_UsersManager_API::getInstance()->getSitesAccessFromUser($userLogin);
  166. $anonymousSites = array();
  167. foreach($anonymousSitesAccess as $info)
  168. {
  169. $idSite = $info['site'];
  170. $anonymousSites[$idSite] = Piwik_SitesManager_API::getInstance()->getSiteFromId($idSite);
  171. }
  172. $view->anonymousSites = $anonymousSites;
  173. // Which report is displayed by default to the anonymous user?
  174. $anonymousDefaultReport = Piwik_UsersManager_API::getInstance()->getUserPreference($userLogin, Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT);
  175. if($anonymousDefaultReport === false)
  176. {
  177. if(empty($anonymousSites))
  178. {
  179. $anonymousDefaultReport = Piwik::getLoginPluginName();
  180. }
  181. else
  182. {
  183. // we manually imitate what would happen, in case the anonymous user logs in
  184. // and is redirected to the first website available to him in the list
  185. // @see getDefaultWebsiteId()
  186. reset($anonymousSites);
  187. $anonymousDefaultReport = key($anonymousSites);
  188. }
  189. }
  190. $view->anonymousDefaultReport = $anonymousDefaultReport;
  191. $view->anonymousDefaultDate = $this->getDefaultDateForUser($userLogin);
  192. }
  193. /**
  194. * Records settings for the anonymous users (default report, default date)
  195. */
  196. public function recordAnonymousUserSettings()
  197. {
  198. $response = new Piwik_API_ResponseBuilder(Piwik_Common::getRequestVar('format'));
  199. try {
  200. Piwik::checkUserIsSuperUser();
  201. $this->checkTokenInUrl();
  202. $anonymousDefaultReport = Piwik_Common::getRequestVar('anonymousDefaultReport');
  203. $anonymousDefaultDate = Piwik_Common::getRequestVar('anonymousDefaultDate');
  204. $userLogin = 'anonymous';
  205. Piwik_UsersManager_API::getInstance()->setUserPreference($userLogin,
  206. Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT,
  207. $anonymousDefaultReport);
  208. Piwik_UsersManager_API::getInstance()->setUserPreference($userLogin,
  209. Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT_DATE,
  210. $anonymousDefaultDate);
  211. $toReturn = $response->getResponse();
  212. } catch(Exception $e ) {
  213. $toReturn = $response->getResponseException( $e );
  214. }
  215. echo $toReturn;
  216. }
  217. /**
  218. * Records settings from the "User Settings" page
  219. */
  220. public function recordUserSettings()
  221. {
  222. $response = new Piwik_API_ResponseBuilder(Piwik_Common::getRequestVar('format'));
  223. try {
  224. $this->checkTokenInUrl();
  225. $alias = Piwik_Common::getRequestVar('alias');
  226. $email = Piwik_Common::getRequestVar('email');
  227. $defaultReport = Piwik_Common::getRequestVar('defaultReport');
  228. $defaultDate = Piwik_Common::getRequestVar('defaultDate');
  229. $newPassword = false;
  230. $password = Piwik_Common::getRequestvar('password', false);
  231. $passwordBis = Piwik_Common::getRequestvar('passwordBis', false);
  232. if(!empty($password)
  233. || !empty($passwordBis))
  234. {
  235. if($password != $passwordBis)
  236. {
  237. throw new Exception(Piwik_Translate('Login_PasswordsDoNotMatch'));
  238. }
  239. $newPassword = $password;
  240. }
  241. $userLogin = Piwik::getCurrentUserLogin();
  242. if(Piwik::isUserIsSuperUser())
  243. {
  244. $superUser = Zend_Registry::get('config')->superuser;
  245. $updatedSuperUser = false;
  246. if($newPassword !== false)
  247. {
  248. $newPassword = Piwik_Common::unsanitizeInputValue($newPassword);
  249. $md5PasswordSuperUser = md5($newPassword);
  250. $superUser->password = $md5PasswordSuperUser;
  251. $updatedSuperUser = true;
  252. }
  253. if($superUser->email != $email)
  254. {
  255. $superUser->email = $email;
  256. $updatedSuperUser = true;
  257. }
  258. if($updatedSuperUser)
  259. {
  260. Zend_Registry::get('config')->superuser = $superUser->toArray();
  261. }
  262. }
  263. else
  264. {
  265. Piwik_UsersManager_API::getInstance()->updateUser($userLogin, $newPassword, $email, $alias);
  266. if($newPassword !== false)
  267. {
  268. $newPassword = Piwik_Common::unsanitizeInputValue($newPassword);
  269. }
  270. }
  271. // logs the user in with the new password
  272. if($newPassword !== false)
  273. {
  274. $info = array(
  275. 'login' => $userLogin,
  276. 'md5Password' => md5($newPassword),
  277. 'rememberMe' => false,
  278. );
  279. Piwik_PostEvent('Login.initSession', $info);
  280. }
  281. Piwik_UsersManager_API::getInstance()->setUserPreference($userLogin,
  282. Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT,
  283. $defaultReport);
  284. Piwik_UsersManager_API::getInstance()->setUserPreference($userLogin,
  285. Piwik_UsersManager_API::PREFERENCE_DEFAULT_REPORT_DATE,
  286. $defaultDate);
  287. $toReturn = $response->getResponse();
  288. } catch(Exception $e ) {
  289. $toReturn = $response->getResponseException( $e );
  290. }
  291. echo $toReturn;
  292. }
  293. }