401 lines
12 KiB
PHP
401 lines
12 KiB
PHP
<?php
|
|
/*
|
|
----------------------------------------------------------------------
|
|
AlternC - Web Hosting System
|
|
Copyright (C) 2000-2012 by the AlternC Development Team.
|
|
https://alternc.org/
|
|
----------------------------------------------------------------------
|
|
LICENSE
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License (GPL)
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
To read the license please visit http://www.gnu.org/copyleft/gpl.html
|
|
----------------------------------------------------------------------
|
|
Purpose of file: Manage piwik Statistics set
|
|
----------------------------------------------------------------------
|
|
*/
|
|
|
|
/**
|
|
* This class manage piwik statistics management through AlternC, using piwik's "API".
|
|
*/
|
|
class m_piwik {
|
|
var $piwik_server_uri;
|
|
var $piwik_admin_token;
|
|
var $alternc_users;
|
|
var $alternc_sites;
|
|
|
|
function hook_menu() {
|
|
global $quota;
|
|
if ( empty($this->piwik_server_uri) || empty($this->piwik_admin_token)) return false;
|
|
|
|
$obj = array(
|
|
'title' => _("Piwik statistics"),
|
|
'ico' => 'images/piwik.png',
|
|
'link' => 'toggle',
|
|
'pos' => 115,
|
|
'links' => array(
|
|
array( 'txt' => _("Piwik Users"), 'url' => 'piwik_userlist.php'),
|
|
array( 'txt' => _("Piwik Sites"), 'url' => 'piwik_sitelist.php'),
|
|
),
|
|
) ;
|
|
|
|
return $obj;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/** Constructor
|
|
*/
|
|
function m_piwik() {
|
|
$this->piwik_server_uri=variable_get('piwik_server_uri',null,'Remote Piwik server uri');
|
|
$this->piwik_admin_token=variable_get('piwik_admin_token',null,'Remote Piwik super-admin token');
|
|
$this->alternc_users = $this->get_alternc_users();
|
|
$this->alternc_sites = $this->get_alternc_sites();
|
|
}
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
/** hook called when an AlternC account is deleted
|
|
*/
|
|
function hook_admin_del_member() {
|
|
//FIXME : implement the hook_admin_del_member for piwik
|
|
return true;
|
|
}
|
|
|
|
|
|
/* ----------------------------------------------------------------- */
|
|
/** Returns the used quota for the $name service for the current user.
|
|
* @param $name string name of the quota
|
|
* @return integer the number of service used or false if an error occured
|
|
* @access private
|
|
*/
|
|
function hook_quota_get() {
|
|
global $db, $cuid;
|
|
$db->query("SELECT COUNT(id) AS nb FROM piwik_users WHERE uid='$cuid'");
|
|
$q=Array("name"=>"piwik", "description"=>_("Statistics through Piwik accounts"), "used"=>0);
|
|
if ($db->next_record()) {
|
|
$q['used']=$db->f('nb');
|
|
}
|
|
return $q;
|
|
}
|
|
|
|
|
|
function url() {
|
|
return $this->piwik_server_uri;
|
|
}
|
|
|
|
|
|
/***********************/
|
|
/* User-related tasks */
|
|
/***********************/
|
|
|
|
|
|
function user_add($user_login, $user_mail = null) {
|
|
|
|
global $db, $mem, $cuid, $err;
|
|
|
|
$user_login = $this->clean_user_name($user_login);
|
|
$user_pass = create_pass();
|
|
$user_mail = $user_mail ? $user_mail : $mem->user['mail'];
|
|
$user_mail = create_pass(4) . '@gmail.com'; // FIXME $user_mail; Unicité sur les emails ... Soit on ajoute + random soit, on prompt
|
|
$user_alias = $user_login;
|
|
|
|
$api_data = $this->call_privileged_page('API', 'UsersManager.addUser', array('userLogin' => $user_login, 'password' => $user_pass, 'email' => $user_mail, 'alias' => $user_alias), 'JSON');
|
|
if ($api_data) {
|
|
if ($api_data->result === 'success') {
|
|
$user = $this->get_user($user_login);
|
|
$user_creation_date = $user->date_registered;
|
|
return $db->query("INSERT INTO piwik_users (uid, login, created_date) VALUES ('$cuid', '$user_login', '$user_creation_date')");
|
|
}
|
|
} else { // api_data = false -> error is already filled
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
// Edite un user
|
|
function user_edit() {
|
|
//FIXME
|
|
return true;
|
|
}
|
|
|
|
function get_site_access($user_login) {
|
|
return $this->call_privileged_page('API', 'UsersManager.getSitesAccessFromUser', array('userLogin' => $user_login));
|
|
}
|
|
|
|
function get_users_access_from_site($site_id) {
|
|
global $err, $cuid;
|
|
|
|
if (!is_numeric($site_id)) {
|
|
$err->raise('piwik', 'site_id must be numeric');
|
|
return FALSE;
|
|
}
|
|
if (!in_array($site_id, $this->alternc_sites)) {
|
|
$err->raise('piwik', "you don't own this piwik website");
|
|
return FALSE;
|
|
}
|
|
|
|
$api_data = $this->call_privileged_page('API', 'UsersManager.getUsersAccessFromSite', array('idSite' => $site_id));
|
|
if ($api_data !== FALSE) {
|
|
$api_data = $api_data[0]; // Data is in the first column
|
|
foreach ($this->alternc_users AS $key=>$user) {
|
|
if (!array_key_exists($user, $api_data)) {
|
|
$api_data->$user = 'noaccess';
|
|
}
|
|
}
|
|
return $api_data;
|
|
}
|
|
else return FALSE;
|
|
}
|
|
|
|
/**
|
|
* @param string $user_login
|
|
*/
|
|
function get_user($user_login) {
|
|
$api_data = $this->call_privileged_page('API', 'UsersManager.getUser', array('userLogin' => $user_login));
|
|
|
|
if ($api_data)
|
|
return $api_data[0];
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
function get_alternc_users() {
|
|
global $db, $cuid;
|
|
|
|
static $alternc_users = array();
|
|
$db->query("SELECT login FROM piwik_users WHERE uid='$cuid'");
|
|
while ($db->next_record())
|
|
array_push($alternc_users, $db->f('login'));
|
|
|
|
return $alternc_users;
|
|
}
|
|
// Supprime l'utilisateur Piwik passé en parametre
|
|
// Ne le supprime pas localement tant que pas supprimé en remote
|
|
function user_delete($piwik_user_login) {
|
|
global $db, $cuid, $err;
|
|
|
|
$db->query("SELECT created_date, COUNT(id) AS cnt FROM piwik_users WHERE uid='$cuid' AND login='$piwik_user_login'");
|
|
$db->next_record();
|
|
|
|
if ($db->f('cnt') == 1) {
|
|
$api_data = $this->call_privileged_page('API', 'UsersManager.deleteUser', array('userLogin' => $piwik_user_login));
|
|
if ($api_data->result == 'success') {
|
|
return $db->query("DELETE FROM piwik_users WHERE uid='$cuid' AND login='$piwik_user_login'");
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
} else {
|
|
$err->raise("piwik", _("You are not allowed to delete the statistics of this website"));
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
function users_list() {
|
|
global $db, $cuid;
|
|
$db->query("SELECT login FROM piwik_users WHERE uid = '$cuid'");
|
|
if ($db->num_rows() == 0)
|
|
return array();
|
|
$users = '';
|
|
while ($db->next_record())
|
|
$users .= ($users !== '') ? ',' . $db->f('login') : $db->f('login');
|
|
return $this->call_privileged_page('API', 'UsersManager.getUsers', array('userLogins' => $users));
|
|
}
|
|
|
|
|
|
// Verifie que l'utilisateur existe bien dans piwik
|
|
function user_checkremote($puser_id) {
|
|
//FIXME
|
|
return true;
|
|
}
|
|
|
|
|
|
// Récupére un token pour le SSO avec piwik pour l'user
|
|
function user_remoteauth() {
|
|
//FIXME
|
|
return true;
|
|
}
|
|
|
|
// Montre la liste des site pour lesques un user à accés
|
|
function user_access() {
|
|
// FIXME
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************/
|
|
/* Site-related tasks */
|
|
/***********************/
|
|
|
|
|
|
function site_list() {
|
|
$api_data = $this->call_privileged_page('API', 'SitesManager.getAllSites');
|
|
$data = array();
|
|
|
|
if($api_data) {
|
|
foreach ($api_data AS $site) {
|
|
|
|
if (!in_array($site->idsite, $this->alternc_sites))
|
|
continue;
|
|
|
|
$item = new stdClass();
|
|
|
|
$item->id = $site->idsite;
|
|
$item->name = $site->name;
|
|
$item->main_url = $site->main_url;
|
|
|
|
$user_data = $this->call_privileged_page('API', 'UsersManager.getUsersAccessFromSite', array('idSite' => $site->idsite));
|
|
|
|
//if (is_array($user_data)) {
|
|
// printvar($user_data);
|
|
//} else if(is_object($user_data)) {
|
|
$item->rights = $user_data[0];
|
|
//}
|
|
|
|
$data[] = $item;
|
|
}
|
|
return $data;
|
|
} else
|
|
return FALSE;
|
|
}
|
|
|
|
function site_js_tag($site_id) {
|
|
return $this->call_privileged_page('API', 'SitesManager.getJavascriptTag', array('idSite' => $site_id, 'piwikUrl' => $this->piwik_server_uri))->value;
|
|
}
|
|
|
|
function get_alternc_sites() {
|
|
global $db, $cuid;
|
|
|
|
static $alternc_sites = array();
|
|
$db->query("SELECT piwik_id AS site_id FROM piwik_sites WHERE uid='$cuid'");
|
|
while ($db->next_record())
|
|
array_push($alternc_sites, $db->f('site_id'));
|
|
|
|
return $alternc_sites;
|
|
}
|
|
|
|
function get_site_list()
|
|
{
|
|
return $this->call_privileged_page('API', 'SitesManager.getAllSites');
|
|
}
|
|
// Ajoute un site à Piwik
|
|
// can't figure out how to pass multiple url through the API
|
|
function site_add($siteName, $urls, $ecommerce = FALSE) {
|
|
$urls = is_array($urls) ? implode(',', $urls) : $urls;
|
|
$api_data = $this->call_privileged_page('API', 'SitesManager.addSite', array('siteName' => $siteName, 'urls' => $urls));
|
|
printvar($api_data);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//SitesManager.deleteSite (idSite)
|
|
// Supprime un site de Piwik
|
|
function site_delete($site_id) {
|
|
global $db, $cuid, $err;
|
|
|
|
$db->query("SELECT COUNT(id) AS cnt FROM piwik_sites WHERE uid='$cuid' AND piwik_id='$site_id'");
|
|
$db->next_record();
|
|
|
|
if ($db->f('cnt') == 1) {
|
|
$api_data = $this->call_privileged_page('API', 'SitesManager.deleteSite', array('idSite' => $site_id));
|
|
if ($api_data->result == 'success') {
|
|
return $db->query("DELETE FROM piwik_sites where uid='$cuid' AND piwik_id='$site_id' LIMIT 1");
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
} else {
|
|
$err->raise("piwik", _("You are not allowed to delete the statistics of this website"));
|
|
return FALSE;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
function site_set_user_right($site_id, $login, $right)
|
|
{
|
|
global $err;
|
|
if (!in_array($right, array('noaccess', 'view', 'admin')))
|
|
return FALSE;
|
|
$api_data = $this->call_privileged_page('API', 'UsersManager.setUserAccess', array('userLogin' => $login, 'access' => $right, 'idSites' => $site_id));
|
|
if ($api_data->result == 'success') {
|
|
return TRUE;
|
|
} else {
|
|
$err->raise('piwik', $api_data->messsage);
|
|
return FALSE;
|
|
}
|
|
}
|
|
// Ajoute un alias sur un site existant
|
|
function site_alias_add() {
|
|
// FIXME
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
/* Helper code FIXME: rename those function using "private" + "_" prefix */
|
|
|
|
function clean_user_name($username) {
|
|
return mysql_real_escape_string(trim($username));
|
|
}
|
|
|
|
|
|
function dev() {
|
|
// $this->call_page('module', 'method', array('user' => 'fser', 'pass' => 'toto'));
|
|
// return $this->users_list();
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $module
|
|
* @param string $method
|
|
*/
|
|
function call_page($module, $method, $arguments=array(), $output = 'JSON') {
|
|
global $err;
|
|
$url = sprintf('%s/?module=%s&method=%s&format=%s', $this->piwik_server_uri, $module, $method, $output);
|
|
foreach ($arguments AS $k=>$v)
|
|
$url .= sprintf('&%s=%s', urlencode($k), $v); // urlencode($v));
|
|
|
|
$page_content = file_get_contents($url);
|
|
if ($page_content === FALSE) {
|
|
$err->raise("piwik", _("Unable to reach the API"));
|
|
return FALSE;
|
|
}
|
|
if ($output == 'JSON') {
|
|
$api_data = json_decode($page_content);
|
|
if ($api_data === FALSE) {
|
|
$err->raise("piwik", _("Error while decoding response from the API"));
|
|
return FALSE;
|
|
}
|
|
|
|
return $api_data;
|
|
} else {
|
|
$err->raise("piwik", _("Other format than JSON is not implemented yet"));
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $module
|
|
* @param string $method
|
|
*/
|
|
function call_privileged_page($module, $method, $arguments=array(), $output = 'JSON') {
|
|
$arguments['token_auth'] = $this->piwik_admin_token;
|
|
return $this->call_page($module, $method, $arguments, $output);
|
|
}
|
|
|
|
|
|
} /* Class piwik */
|