mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-16 22:43:19 +00:00
1012 lines
31 KiB
PHP
1012 lines
31 KiB
PHP
<?php
|
|
|
|
if (!defined('GV_defaultQuery'))
|
|
define('GV_defaultQuery', 'last');
|
|
if (!defined('GV_bandeauHome'))
|
|
define('GV_bandeauHome', 'QUERY');
|
|
|
|
class user
|
|
{
|
|
|
|
var $id = false;
|
|
var $_rights_sbas = array(
|
|
);
|
|
var $_rights_bas = array(
|
|
);
|
|
var $_rights_records = array(
|
|
);
|
|
var $_global_rights = array(
|
|
'taskmanager' => false,
|
|
'manageusers' => false,
|
|
'order' => false,
|
|
'report' => false,
|
|
'push' => false,
|
|
'addrecord' => false,
|
|
'modifyrecord' => false,
|
|
'changestatus' => false,
|
|
'doctools' => false,
|
|
'deleterecord' => false,
|
|
'addtoalbum' => false,
|
|
'coll_modify_struct' => false,
|
|
'coll_manage' => false,
|
|
'order_master' => false,
|
|
'bas_modif_th' => false,
|
|
'bas_modify_struct' => false,
|
|
'bas_manage' => false,
|
|
'bas_chupub' => false
|
|
);
|
|
public static $locales = array(
|
|
'ar_SA' => 'العربية'
|
|
, 'de_DE' => 'Deutsch'
|
|
, 'en_GB' => 'English'
|
|
// ,'es_LA' => 'Español'
|
|
, 'fr_FR' => 'Français'
|
|
// ,'nb_NO' => 'Norsk (bokmål)'
|
|
// ,'zh_CN' => '中文(简体)'
|
|
);
|
|
private $data = array(
|
|
'password' => '',
|
|
'email' => '',
|
|
'login' => '',
|
|
'is_admin' => false,
|
|
'firstname' => false,
|
|
'display_name' => false,
|
|
'gender' => false,
|
|
'lastname' => false,
|
|
'address' => false,
|
|
'city' => false,
|
|
'geonameid' => false,
|
|
'zip' => false,
|
|
'tel' => false,
|
|
'fax' => false,
|
|
'job' => false,
|
|
'company' => false
|
|
);
|
|
private static $_instance = array();
|
|
var $_prefs = array();
|
|
private static $_users = array();
|
|
var $_updated_prefs = array();
|
|
private static $def_values = array(
|
|
'view' => 'thumbs',
|
|
'images_per_page' => 20,
|
|
'images_size' => 120,
|
|
'editing_images_size' => 134,
|
|
'editing_top_box' => '180px',
|
|
'editing_right_box' => '400px',
|
|
'editing_left_box' => '710px',
|
|
'basket_sort_field' => 'name',
|
|
'basket_sort_order' => 'ASC',
|
|
'warning_on_delete_story' => 'true',
|
|
'client_basket_status' => '1',
|
|
'css' => '000000',
|
|
'start_page_query' => GV_defaultQuery,
|
|
'start_page' => GV_bandeauHome,
|
|
'rollover_thumbnail' => 'caption',
|
|
'technical_display' => '1',
|
|
'doctype_display' => '1',
|
|
'bask_val_order' => 'nat',
|
|
'basket_caption_display' => '0',
|
|
'basket_status_display' => '0',
|
|
'basket_title_display' => '0'
|
|
);
|
|
private static $avalaible_values = array(
|
|
'view' => array('thumbs', 'list'),
|
|
'basket_sort_field' => array('name', 'date'),
|
|
'basket_sort_order' => array('ASC', 'DESC'),
|
|
'start_page' => array('PUBLI', 'QUERY', 'LAST_QUERY', 'HELP'),
|
|
'technical_display' => array('0', '1', 'group'),
|
|
'rollover_thumbnail' => array('caption', 'preview'),
|
|
'bask_val_order' => array('nat', 'asc', 'desc')
|
|
);
|
|
|
|
/**
|
|
* @return user
|
|
*/
|
|
public static function getInstance($id=false)
|
|
{
|
|
if (is_int((int) $id) && (int) $id > 0)
|
|
{
|
|
$id = (int) $id;
|
|
}
|
|
else
|
|
throw new Exception('Invalid usr_id');
|
|
|
|
if (!isset(self::$_instance[$id]))
|
|
{
|
|
$cache_user = false;
|
|
if (defined('GV_memcached') && GV_memcached)
|
|
{
|
|
$cache_user = cache_user::getInstance();
|
|
}
|
|
if ($cache_user && (($tmp = $cache_user->get($id)) != false))
|
|
{
|
|
self::$_instance[$id] = $tmp;
|
|
}
|
|
else
|
|
{
|
|
self::$_instance[$id] = new user($id);
|
|
|
|
if ($cache_user)
|
|
$cache_user->set($id, self::$_instance[$id]);
|
|
}
|
|
}
|
|
return array_key_exists($id, self::$_instance) ? self::$_instance[$id] : false;
|
|
}
|
|
|
|
public static function clear_cache($id)
|
|
{
|
|
$cache = cache_user::getInstance($id);
|
|
|
|
return $cache->delete($id);
|
|
}
|
|
|
|
function __construct($id=false)
|
|
{
|
|
if ($id !== false)
|
|
{
|
|
return $this->load($id);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static function getMyRss($renew = false)
|
|
{
|
|
$conn = connection::getInstance();
|
|
$session = session::getInstance();
|
|
|
|
$token = $title = false;
|
|
|
|
$sql = 'SELECT value FROM tokens WHERE usr_id="' . $conn->escape_string($session->usr_id) . '" AND type="rss"';
|
|
if (!$renew)
|
|
{
|
|
if (($rs = $conn->query($sql)))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$token = $row['value'];
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$sql = 'DELETE FROM tokens WHERE usr_id="' . $conn->escape_string($session->usr_id) . '" AND type="rss"';
|
|
$conn->query($sql);
|
|
}
|
|
if ($token === false)
|
|
{
|
|
$token = random::getUrlToken('rss', $session->usr_id);
|
|
}
|
|
$texte = false;
|
|
if ($token !== false)
|
|
{
|
|
|
|
$texte = '<p>' . _('publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.') . '</p><p>' . _('publications::Ne le partagez pas, il est strictement confidentiel') . '</p>
|
|
<div><input type="text" style="width:100%" value="' . GV_ServerName . 'atom/' . $token . '"/></div>';
|
|
$title = _('publications::votre rss personnel');
|
|
}
|
|
|
|
return array('texte' => $texte, 'titre' => $title, 'token' => $token, 'url' => GV_ServerName . 'atom/' . $token);
|
|
}
|
|
|
|
/**
|
|
* Query in the cache
|
|
*
|
|
* @param unknown_type $query
|
|
* @return unknown_type
|
|
*/
|
|
public static function saveQuery($query)
|
|
{
|
|
$conn = connection::getInstance();
|
|
$session = session::getInstance();
|
|
|
|
$usr_id = $session->usr_id;
|
|
$ses_id = $session->ses_id;
|
|
|
|
if (($id = $conn->getId("DSEL")) != false)
|
|
{
|
|
$sql = "INSERT INTO dsel (id, name, usr_id, query) VALUES ('" . $conn->escape_string($id) . "','" . $conn->escape_string($query) . "', '" . $conn->escape_string($usr_id) . "', '" . $conn->escape_string($query) . "')";
|
|
$conn->query($sql);
|
|
}
|
|
|
|
if (user::getPrefs('start_page') == 'LAST_QUERY')
|
|
user::setPrefs('start_page_query', $query);
|
|
|
|
$sql = 'UPDATE cache SET query = "' . $conn->escape_string($query) . '" WHERE usr_id = "' . $conn->escape_string($usr_id) . '" AND session_id="' . $conn->escape_string($ses_id) . '"';
|
|
|
|
if ($conn->query($sql))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static function getInfos($usr)
|
|
{
|
|
$display_name = _('phraseanet::utilisateur inconnu');
|
|
try
|
|
{
|
|
$user = self::getInstance($usr);
|
|
$display_name = $user->display_name;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
|
|
}
|
|
return $display_name;
|
|
}
|
|
|
|
public function __set($name, $value)
|
|
{
|
|
if ($name === 'password')
|
|
$value = hash('sha256', $value);
|
|
$this->data[$name] = $value;
|
|
}
|
|
|
|
public function __get($name)
|
|
{
|
|
if (array_key_exists($name, $this->data))
|
|
{
|
|
return $this->data[$name];
|
|
}
|
|
|
|
$trace = debug_backtrace();
|
|
trigger_error(
|
|
'Undefined property via __get(): ' . $name .
|
|
' in ' . $trace[0]['file'] .
|
|
' on line ' . $trace[0]['line'], E_USER_NOTICE);
|
|
return null;
|
|
}
|
|
|
|
public function __isset($name)
|
|
{
|
|
if (array_key_exists($name, $this->data))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
public function save()
|
|
{
|
|
$conn = connection::getInstance();
|
|
if ($this->id === false)
|
|
{
|
|
if (!$conn)
|
|
throw new Exception('Unable to get valid connection');
|
|
if (($id = $conn->getId('USR')) !== false)
|
|
{
|
|
if (trim($this->login) !== '' && trim($this->password) !== '')
|
|
{
|
|
$sql = 'INSERT INTO usr (usr_id, usr_login, usr_password, usr_creationdate) VALUES ("' . $conn->escape_string($id) . '", "' . $conn->escape_string($this->login) . '", "' . $conn->escape_string($this->password) . '", NOW())';
|
|
if ($conn->query($sql))
|
|
$this->id = $id;
|
|
else
|
|
throw new Exception('Error while saving user : ' . $conn->last_error());
|
|
}
|
|
else
|
|
throw new Exception('Invalid username or password');
|
|
}
|
|
else
|
|
throw new Exception('Unable to get new usr_id');
|
|
}
|
|
|
|
if ($this->id !== false)
|
|
{
|
|
$sql = 'UPDATE usr SET
|
|
usr_login = "' . $conn->escape_string($this->login) . '"
|
|
,usr_password = "' . $conn->escape_string($this->password) . '"
|
|
,usr_mail = ' . (trim($this->email) != '' ? '"' . $conn->escape_string($this->email) . '"' : 'null') . '
|
|
,usr_modificationdate = NOW()
|
|
,create_db = "' . ($this->is_admin ? '1' : '0') . '"
|
|
WHERE usr_id = "' . $this->id . '"';
|
|
|
|
if (!$conn->query($sql))
|
|
{
|
|
throw new Exception('unable to update');
|
|
}
|
|
$this->id = $id;
|
|
}
|
|
return $this->id;
|
|
}
|
|
|
|
public function load($id)
|
|
{
|
|
|
|
$conn = connection::getInstance();
|
|
if ($conn && $id !== false)
|
|
{
|
|
if ((int) $id > 0)
|
|
{
|
|
$sql = 'SELECT usr_id, create_db, usr_login, usr_nom, usr_prenom, usr_sexe as gender,
|
|
usr_mail, adresse, ville, cpostal, tel, fax, fonction, societe, geonameid
|
|
FROM usr WHERE usr_id="' . $conn->escape_string((int) $id) . '"';
|
|
}
|
|
elseif (is_string($id))
|
|
{
|
|
$sql = 'SELECT usr_id, create_db, usr_login, usr_nom, usr_prenom, usr_sexe as gender,
|
|
usr_mail, adresse, ville, cpostal, tel, fax, fonction, societe, geonameid
|
|
FROM usr WHERE usr_login="' . $conn->escape_string((string) $id) . '"';
|
|
}
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$this->id = $row['usr_id'];
|
|
$this->email = $row['usr_mail'];
|
|
$this->login = $row['usr_login'];
|
|
|
|
$this->firstname = $row['usr_nom'];
|
|
$this->lastname = $row['usr_prenom'];
|
|
$this->address = $row['adresse'];
|
|
$this->city = $row['ville'];
|
|
$this->geonameid = $row['geonameid'];
|
|
$this->zip = $row['cpostal'];
|
|
$this->gender = $row['gender'];
|
|
$this->tel = $row['tel'];
|
|
$this->fax = $row['fax'];
|
|
$this->job = $row['fonction'];
|
|
$this->company = $row['societe'];
|
|
|
|
|
|
if (trim($row['usr_nom']) !== '' || trim($row['usr_prenom']) !== '')
|
|
$display_name = $row['usr_prenom'] . ' ' . $row['usr_nom'];
|
|
elseif (trim($row['usr_mail']) !== '')
|
|
$display_name = $row['usr_mail'];
|
|
else
|
|
$display_name = $row['usr_login'];
|
|
|
|
$this->display_name = $display_name;
|
|
|
|
$this->is_admin = $row['create_db'] == '1' ? true : false;
|
|
$this->_global_rights['taskmanager'] = $this->is_admin;
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
if (!$this->id)
|
|
{
|
|
throw new Exception(_('Undefined usr_id ' . $id));
|
|
trigger_error('Undefined usr_id ' . $id . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE);
|
|
return false;
|
|
}
|
|
$sql = 'select DISTINCT c.base_id,c.record_id
|
|
FROM (sselcont c, ssel s)
|
|
LEFT JOIN (validate u) ON (u.usr_id = "' . $conn->escape_string($this->id) . '" and u.can_hd=1 AND u.ssel_id = c.ssel_id)
|
|
WHERE c.ssel_id =s.ssel_id AND s.usr_id="' . $conn->escape_string($this->id) . '" AND (c.canHD = 1 OR u.ssel_id = s.ssel_id)';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$currentid = $row["base_id"] . "_" . $row["record_id"];
|
|
$this->_rights_records[$currentid] = $currentid;
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
$sql = 'SELECT base_id, canaddrecord, manage, canadmin, chgstatus, candwnldpreview, canpreview, candwnldhd, needwatermark, restrict_dwnld,
|
|
remain_dwnld, canmodifrecord, canputinalbum, canreport, mask_and, mask_xor, candeleterecord, imgtools, canpush, cancmd, modify_struct
|
|
FROM basusr WHERE usr_id="' . $conn->escape_string($this->id) . '" AND actif="1"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
if ($row['canadmin'] == '1')
|
|
$this->_global_rights['manageusers'] = true;
|
|
if ($row['manage'] == '1')
|
|
$this->_global_rights['coll_manage'] = true;
|
|
if ($row['modify_struct'] == '1')
|
|
$this->_global_rights['coll_modify_struct'] = true;
|
|
if ($row['cancmd'] == '1')
|
|
$this->_global_rights['order'] = true;
|
|
if ($row['canpush'] == '1')
|
|
$this->_global_rights['push'] = true;
|
|
if ($row['canaddrecord'] == '1')
|
|
$this->_global_rights['addrecord'] = true;
|
|
if ($row['canmodifrecord'] == '1')
|
|
$this->_global_rights['modifyrecord'] = true;
|
|
if ($row['chgstatus'] == '1')
|
|
$this->_global_rights['changestatus'] = true;
|
|
if ($row['imgtools'] == '1')
|
|
$this->_global_rights['doctools'] = true;
|
|
if ($row['candeleterecord'] == '1')
|
|
$this->_global_rights['deleterecord'] = true;
|
|
if ($row['canputinalbum'] == '1')
|
|
$this->_global_rights['addtoalbum'] = true;
|
|
if ($row['canreport'] == '1')
|
|
$this->_global_rights['report'] = true;
|
|
|
|
|
|
$this->_rights_bas[$row['base_id']]['chgstatus'] = ($row['chgstatus'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['cancmd'] = ($row['cancmd'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canaddrecord'] = ($row['canaddrecord'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canpush'] = ($row['canpush'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['candeleterecord'] = ($row['candeleterecord'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canadmin'] = ($row['canadmin'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['chgstatus'] = ($row['chgstatus'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['candwnldpreview'] = ($row['candwnldpreview'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canpreview'] = ($row['canpreview'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['candwnldhd'] = ($row['candwnldhd'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['needwatermark'] = ($row['needwatermark'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['restrict_dwnld'] = ($row['restrict_dwnld'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['remain_dwnld'] = ($row['remain_dwnld'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canmodifrecord'] = ($row['canmodifrecord'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canputinalbum'] = ($row['canputinalbum'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['canreport'] = ($row['canreport'] == '1' ? true : false);
|
|
$this->_rights_bas[$row['base_id']]['mask_and'] = $row['mask_and'];
|
|
$this->_rights_bas[$row['base_id']]['mask_xor'] = $row['mask_xor'];
|
|
$this->_rights_bas[$row['base_id']]['order_manager'] = false;
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
$sql = 'SELECT * FROM sbasusr WHERE usr_id="' . $conn->escape_string($this->id) . '"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
|
|
if ($row['bas_modif_th'] == '1')
|
|
$this->_global_rights['bas_modif_th'] = true;
|
|
if ($row['bas_modify_struct'] == '1')
|
|
$this->_global_rights['bas_modify_struct'] = true;
|
|
if ($row['bas_manage'] == '1')
|
|
$this->_global_rights['bas_manage'] = true;
|
|
if ($row['bas_chupub'] == '1')
|
|
$this->_global_rights['bas_chupub'] = true;
|
|
|
|
$this->_rights_sbas[$row['sbas_id']]['bas_modify_struct'] = ($row['bas_modify_struct'] == '1' ? true : false);
|
|
$this->_rights_sbas[$row['sbas_id']]['bas_manage'] = ($row['bas_manage'] == '1' ? true : false);
|
|
$this->_rights_sbas[$row['sbas_id']]['bas_chupub'] = ($row['bas_chupub'] == '1' ? true : false);
|
|
$this->_rights_sbas[$row['sbas_id']]['bas_modif_th'] = ($row['bas_modif_th'] == '1' ? true : false);
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
$sql = 'SELECT base_id FROM order_masters WHERE usr_id="' . $conn->escape_string($id) . '"';
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$this->_global_rights['order_master'] = true;
|
|
$this->_rights_bas[$row['base_id']]['order_manager'] = true;
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
|
|
$sql = 'SELECT prop, value FROM usr_settings WHERE usr_id="' . $conn->escape_string($id) . '"';
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$this->_prefs[$row['prop']] = $row['value'];
|
|
}
|
|
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
$evt_mngr = eventsmanager::getInstance();
|
|
$notifications = $evt_mngr->list_notifications_avalaible($this->id);
|
|
|
|
foreach ($notifications as $notification_group => $nots)
|
|
{
|
|
foreach ($nots as $notification)
|
|
{
|
|
if (!isset($this->_prefs['notification_' . $notification['id']]))
|
|
{
|
|
$this->_prefs['notification_' . $notification['id']] = '1';
|
|
// $this->_updated_prefs[] = 'notification_'.$notification['id'];
|
|
$this->update_pref('notification_' . $notification['id'], '1');
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach (self::$def_values as $k => $v)
|
|
{
|
|
if (!isset($this->_prefs[$k]))
|
|
{
|
|
$this->_prefs[$k] = $v;
|
|
$this->update_pref($k, $v);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected static $_preview_rights = array();
|
|
|
|
public static function right_preview($usr_id, $base_id, $record_id)
|
|
{
|
|
$key = $base_id . '_' . $record_id . '_' . $usr_id;
|
|
if (isset(self::$_preview_rights[$key]))
|
|
return self::$_preview_rights[$key];
|
|
|
|
$sql = 'SELECT sselcont_id FROM sselcont c, ssel s
|
|
LEFT JOIN validate v, validate_datas vd
|
|
ON (v.id = vd.validate_id AND vd.sselcont_id = c.sselcont_id)
|
|
WHERE c.base_id = :base_id AND c.record_id = :record_id
|
|
AND s.ssel_id = c.ssel_id
|
|
AND (s.usr_id = :usr_id OR v.usr_id = :usr_id_v)';
|
|
|
|
$sql = 'SELECT c.sselcont_id
|
|
FROM (sselcont c, ssel s)
|
|
LEFT JOIN validate v ON v.ssel_id = s.ssel_id
|
|
LEFT JOIN validate_datas vd
|
|
ON ( v.id = vd.validate_id AND vd.sselcont_id = c.sselcont_id )
|
|
WHERE c.base_id = :base_id
|
|
AND c.record_id = :record_id
|
|
AND s.ssel_id = c.ssel_id
|
|
AND (s.usr_id = :usr_id OR v.usr_id = :usr_id_v)';
|
|
|
|
$params = array(
|
|
'base_id' => $base_id
|
|
, ':record_id' => $record_id
|
|
, ':usr_id' => $usr_id
|
|
, ':usr_id_v' => $usr_id
|
|
);
|
|
|
|
$conn = connection::getPDOConnection();
|
|
$stmt = $conn->prepare($sql);
|
|
$stmt->execute($params);
|
|
|
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
self::$_preview_rights[$key] = ($row && $row['sselcont_id'] > 0);
|
|
|
|
$stmt->closeCursor();
|
|
|
|
return self::$_preview_rights[$key];
|
|
}
|
|
|
|
function update_pref($prop, $value)
|
|
{
|
|
if (!isset($this->id))
|
|
return false;
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$sql = 'REPLACE INTO usr_settings (usr_id, prop, value) VALUES ("' . $conn->escape_string($this->id) . '","' . $conn->escape_string($prop) . '", ' . (is_null($conn->escape_string($value)) ? 'NULL' : '"' . $conn->escape_string($value) . '"') . ')';
|
|
$conn->query($sql);
|
|
|
|
$cache = cache_user::getInstance();
|
|
$cache->set($this->id, $this);
|
|
|
|
return;
|
|
}
|
|
|
|
public static function avLanguages()
|
|
{
|
|
$lngs = array();
|
|
|
|
$path = dirname(__FILE__) . "/../../locale";
|
|
if ($hdir = opendir($path))
|
|
{
|
|
while (false !== ($file = readdir($hdir)))
|
|
{
|
|
if (substr($file, 0, 1) == "." || mb_strtolower($file) == "cvs")
|
|
continue;
|
|
if (is_dir($path . "/" . $file) && strpos($file, '_') == 2 && strlen($file) == 5)
|
|
{
|
|
if (!array_key_exists($file, self::$locales))
|
|
continue;
|
|
$supFile = explode('_', $file);
|
|
if (!isset($lngs[$supFile[0]]))
|
|
$lngs[$supFile[0]] = array();
|
|
$lngs[$supFile[0]][$file] = array('name' => self::$locales[$file], 'selected' => false);
|
|
}
|
|
}
|
|
}
|
|
return $lngs;
|
|
}
|
|
|
|
public static function detectLanguage($setLng = null)
|
|
{
|
|
$avLanguages = self::avLanguages();
|
|
$sel = $askLng = $askLocale = '';
|
|
|
|
$session = session::getInstance();
|
|
$session->usr_i18n = $session->usr_l10n = false;
|
|
|
|
$lng = GV_default_lng;
|
|
|
|
if ($setLng !== null)
|
|
{
|
|
$askLng = substr($setLng, 0, 2);
|
|
$askLocale = $setLng;
|
|
}
|
|
elseif ($session->isset_cookie('locale'))
|
|
{
|
|
$askLng = substr($session->get_cookie('locale'), 0, 2);
|
|
$askLocale = $session->get_cookie('locale');
|
|
}
|
|
elseif (defined('GV_default_lng'))
|
|
{
|
|
$askLng = substr(GV_default_lng, 0, 2);
|
|
$askLocale = GV_default_lng;
|
|
}
|
|
|
|
|
|
if ($askLng != '' && isset($avLanguages[$askLng]) && isset($avLanguages[$askLng][$askLocale]))
|
|
{
|
|
$avLanguages[$askLng][$askLocale]['selected'] = true;
|
|
$sel = $askLocale;
|
|
}
|
|
|
|
if ($sel === '' && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
|
|
{
|
|
$languages = explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
|
$found = false;
|
|
|
|
foreach ($languages as $language)
|
|
{
|
|
$language = explode(',', mb_strtolower($language));
|
|
if (count($language) != 2)
|
|
continue;
|
|
|
|
foreach ($language as $lang)
|
|
{
|
|
if (strpos($lang, '-') == 2 && strlen($lang) == 5)
|
|
{
|
|
$l = explode('-', $lang);
|
|
$l[0] = mb_strtolower($l[0]);
|
|
$l[1] = strtoupper($l[1]);
|
|
|
|
if ($sel != '')
|
|
{
|
|
$found = true;
|
|
break;
|
|
}
|
|
$lang = implode('_', $l);
|
|
if (isset($avLanguages[$l[0]]))
|
|
{
|
|
if (!isset($avLanguages[$l[0]][$lang]))
|
|
{
|
|
$lang = end(array_keys($avLanguages[$l[0]]));
|
|
}
|
|
$avLanguages[$l[0]][$lang]['selected'] = true;
|
|
$sel = $lang;
|
|
$found = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ($found)
|
|
break;
|
|
}
|
|
if (!$found && array_key_exists(substr(GV_default_lng, 0, 2), $avLanguages))
|
|
{
|
|
if (!isset($avLanguages[substr(GV_default_lng, 0, 2)][GV_default_lng]))
|
|
{
|
|
define('GV_default_lng', end(array_keys($avLanguages[substr(GV_default_lng, 0, 2)])));
|
|
}
|
|
$avLanguages[substr(GV_default_lng, 0, 2)][GV_default_lng]['selected'] = true;
|
|
$sel = GV_default_lng;
|
|
}
|
|
}
|
|
if ($sel == '')
|
|
{
|
|
$key = end(array_keys($avLanguages));
|
|
$lang = end(array_keys($avLanguages[$key]));
|
|
$avLanguages[$key][$lang]['selected'] = true;
|
|
$sel = $lang;
|
|
}
|
|
$session->locale = $sel;
|
|
|
|
if (($session->isset_cookie('locale') && $session->get_cookie('locale') != $sel) || !$session->isset_cookie('locale'))
|
|
$session->set_cookie("locale", $sel, 0, false);
|
|
|
|
$sel = explode('_', $sel);
|
|
|
|
$session->usr_i18n = $sel[0];
|
|
$session->usr_l10n = $sel[1];
|
|
|
|
return $avLanguages;
|
|
}
|
|
|
|
public static function setPrefs($prop, $value, $usr_id = false)
|
|
{
|
|
$session = session::getInstance();
|
|
if (!$usr_id)
|
|
$usr_id = $session->usr_id;
|
|
|
|
$user = self::getInstance($usr_id);
|
|
|
|
if (isset($user->_prefs[$prop]) && $user->_prefs[$prop] === $value)
|
|
return $value;
|
|
|
|
$ok = true;
|
|
|
|
if (isset(self::$avalaible_values[$prop]))
|
|
{
|
|
$ok = false;
|
|
if (in_array($value, self::$avalaible_values[$prop]))
|
|
$ok = true;
|
|
}
|
|
|
|
if ($ok)
|
|
{
|
|
$user->_prefs[$prop] = $value;
|
|
$user->update_pref($prop, $value);
|
|
}
|
|
$cache = cache_user::getInstance();
|
|
$cache->set($usr_id, $user);
|
|
|
|
return $user->_prefs[$prop];
|
|
}
|
|
|
|
public static function getPrefs($prop, $usr_id = false)
|
|
{
|
|
|
|
$session = session::getInstance();
|
|
if (!$usr_id)
|
|
$usr_id = $session->usr_id;
|
|
|
|
$user = self::getInstance($usr_id);
|
|
|
|
if (!isset($user->_prefs[$prop]))
|
|
{
|
|
$user->_prefs[$prop] = null;
|
|
$user->update_pref($prop, null);
|
|
}
|
|
|
|
|
|
return $user->_prefs[$prop];
|
|
}
|
|
|
|
public static function updateClientInfos($app_id)
|
|
{
|
|
|
|
$session = session::getInstance();
|
|
if (!isset($session->usr_id) || !isset($session->ses_id))
|
|
return;
|
|
|
|
$ses_id = $session->ses_id;
|
|
$usr_id = $session->usr_id;
|
|
|
|
$appName = array(
|
|
'1' => 'Prod',
|
|
'2' => 'Client',
|
|
'3' => 'Admin',
|
|
'4' => 'Report',
|
|
'5' => 'Thesaurus',
|
|
'6' => 'Compare',
|
|
'7' => 'Validate',
|
|
'8' => 'Upload',
|
|
'9' => 'API'
|
|
);
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
if (isset($appName[$app_id]))
|
|
{
|
|
|
|
$sql = 'SELECT dist_logid FROM cache WHERE session_id="' . $conn->escape_string($ses_id) . '"';
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
|
|
$logs = unserialize($row['dist_logid']);
|
|
|
|
$logs = !is_array($logs) ? array() : $logs;
|
|
|
|
$sbas_ids = array_keys($logs);
|
|
|
|
foreach ($sbas_ids as $sbas_id)
|
|
{
|
|
if (isset($logs[$sbas_id]))
|
|
{
|
|
$connSbas = connection::getInstance($sbas_id);
|
|
if ($connSbas)
|
|
{
|
|
$sql = 'SELECT appli FROM log WHERE id = "' . $connSbas->escape_string($logs[$sbas_id]) . '"';
|
|
if ($rs3 = $connSbas->query($sql))
|
|
{
|
|
if ($row3 = $connSbas->fetch_assoc($rs3))
|
|
{
|
|
$applis = unserialize($row3['appli']);
|
|
|
|
if (!in_array($app_id, $applis))
|
|
{
|
|
$applis[] = $app_id;
|
|
}
|
|
|
|
$sql = 'UPDATE log SET appli="' . $connSbas->escape_string(serialize($applis)) . '" WHERE id="' . $connSbas->escape_string($logs[$sbas_id]) . '"';
|
|
$connSbas->query($sql);
|
|
}
|
|
$connSbas->free_result($rs3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if ($conn)
|
|
{
|
|
$theclient = browser::getInstance();
|
|
$appinf["date"] = date("d/m/Y G:i:s");
|
|
$appinf["ip"] = $theclient->getIP();
|
|
$appinf["usrid"] = $usr_id;
|
|
$ph_session = phrasea_open_session($ses_id, $usr_id);
|
|
$appinf["db"] = array();
|
|
foreach ($ph_session["bases"] as $abas)
|
|
$appinf["db"][] = $abas["sbas_id"];
|
|
$appinf["info"] = $theclient->getPlatform() . ' / ' . $theclient->getBrowser() . ' (' . ($session->isset_cookie('screen') ? $session->get_cookie('screen') : 'unknown') . ')';
|
|
$appinf["usr"] = null;
|
|
$sql = "SELECT usr_nom,usr_prenom,usr_mail,societe,tel FROM usr WHERE usr_id='" . $conn->escape_string($usr_id) . "'";
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
$appinf["usr"] = $row;
|
|
$conn->free_result($rs);
|
|
}
|
|
$sql = "SELECT app FROM cache WHERE session_id='" . $conn->escape_string($ses_id) . "'";
|
|
$apps = array();
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
$apps = unserialize($row['app']);
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
if (!in_array($app_id, $apps))
|
|
$apps[] = $app_id;
|
|
|
|
$sql = "UPDATE cache SET app='" . $conn->escape_string(serialize($apps)) . "',appinf='" . $conn->escape_string(serialize($appinf)) . "' WHERE session_id='" . $conn->escape_string($ses_id) . "'";
|
|
|
|
$conn->query($sql);
|
|
}
|
|
return;
|
|
}
|
|
|
|
public static function get_sys_admins()
|
|
{
|
|
$sql = 'SELECT usr_id, usr_login FROM usr WHERE create_db="1"';
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$users = array();
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
$users[$row['usr_id']] = $row['usr_login'];
|
|
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
return $users;
|
|
}
|
|
|
|
public static function get_simple_users_list()
|
|
{
|
|
$sql = "SELECT usr_id, usr_login FROM usr
|
|
WHERE usr_login NOT LIKE '(#%'
|
|
AND invite='0'
|
|
AND usr_login != 'autoregister'
|
|
AND usr_login != 'invite'
|
|
AND create_db != '1'
|
|
ORDER by usr_login ASC";
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$users = array();
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
$users[$row['usr_id']] = $row['usr_login'];
|
|
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
return $users;
|
|
}
|
|
|
|
public static function set_sys_admins($admins)
|
|
{
|
|
$conn = connection::getInstance();
|
|
$session = session::getInstance();
|
|
|
|
$sql = "UPDATE usr SET create_db='0' WHERE create_db='1' AND usr_id != '" . $session->usr_id . "'";
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
$sql = "UPDATE usr SET create_db='1' WHERE usr_id IN (" . implode(',', $admins) . ")";
|
|
|
|
if ($conn->query($sql))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static function reset_sys_admins_rights()
|
|
{
|
|
$conn = connection::getInstance();
|
|
$users = self::get_sys_admins();
|
|
|
|
$sql = "SELECT * FROM sbas";
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
|
|
foreach ($users as $usr_id => $value)
|
|
{
|
|
$sql = "REPLACE INTO sbasusr (sbas_id,usr_id,bas_manage,bas_modify_struct,bas_modif_th,bas_chupub) VALUES ('" . $conn->escape_string($row['sbas_id']) . "','" . $conn->escape_string($usr_id) . "','1','1','1','1')";
|
|
$conn->query($sql);
|
|
|
|
$sql = "SELECT * FROM bas WHERE sbas_id = '" . $conn->escape_string($row['sbas_id']) . "'";
|
|
if ($rsB = $conn->query($sql))
|
|
{
|
|
while ($rowB = $conn->fetch_assoc($rsB))
|
|
{
|
|
$sql = "REPLACE INTO basusr " .
|
|
" (base_id,usr_id,canpreview,canhd,canputinalbum,candwnldhd,candwnldsubdef,candwnldpreview,cancmd,canadmin,actif,canreport,canpush,creationdate,canaddrecord,canmodifrecord,candeleterecord,chgstatus,imgtools,manage,modify_struct,bas_manage,bas_modify_struct)" .
|
|
" VALUES " .
|
|
" ('" . $conn->escape_string($rowB['base_id']) . "','" . $conn->escape_string($usr_id) . "','1','1','1','1','1','1','1','1','1','1','1',now(),'1','1','1','1','1','1','1','1','1')";
|
|
$conn->query($sql);
|
|
}
|
|
}
|
|
self::clear_cache($usr_id);
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
public static function get_locale($usr_id)
|
|
{
|
|
$conn = connection::getInstance();
|
|
|
|
$locale = GV_default_lng;
|
|
|
|
$sql = "SELECT locale FROM usr WHERE usr_id = '" . $usr_id . "'";
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$locale = $row['locale'];
|
|
}
|
|
}
|
|
return $locale;
|
|
}
|
|
|
|
public static function create_special($usr_login)
|
|
{
|
|
$ret = false;
|
|
try
|
|
{
|
|
$conn = connection::getInstance();
|
|
|
|
$user = new user();
|
|
|
|
$user->password = $usr_login;
|
|
$user->login = $usr_login;
|
|
$user->email = '';
|
|
$user->superu = false;
|
|
$user->is_admin = false;
|
|
|
|
$id = $user->save();
|
|
$ret = self::getInstance($id);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
} |