';
+ }
+
+ /**
+ * @brief Display the menu available for this folder
+ *
+ */
+ public function display_menu()
+ {
+ if (DEBUGNOALYSS>1)
+ {
+ echo __CLASS__."→".__FUNCTION__;
+ }
+ $cn=Dossier::connect();
+ $user=new User($cn);
+
+ $aModule=$cn->get_array("select *
+ from profile_mobile pm
+ join menu_ref mr on (pm.me_code=mr.me_code)
+ where p_id=$1 order by pmo_order", [$user->get_profile()]);
+ require_once NOALYSS_TEMPLATE."/mobile-display_menu.php";
+ }
+
+ /**
+ * @brief execute the menu
+ * @global type $g_user
+ * @staticvar int $level
+ * @param type $p_access_code
+ * @return type
+ */
+ public function execute_menu($p_access_code)
+ {
+ global $g_user,$g_parameter,$cn;
+ $aModule=$this->load_module($p_access_code);
+ if ( empty($aModule)) {
+ return;
+ }
+ /*-- Load the standard headers if needed -- */
+ if ( $aModule['pmo_default'] == 1) {
+ $this->page_start();
+ }
+
+ echo HtmlInput::anchor("❮"._("Retour"), "mobile.php?".http_build_query(["gDossier"=>Dossier::id()]));
+
+ if ($aModule['me_file']!="")
+ {
+ if ($aModule['me_parameter']!=="")
+ {
+ // if there are paramter put them in superglobal
+ $array=compute_variable($aModule['me_parameter']);
+ put_global($array);
+ }
+ if (DEBUGNOALYSS==2)
+ {
+ echo $aModule['me_file'], " param : ", $aModule['me_parameter'];
+ }
+ /*
+ * Log the file we input to put in the folder test-noalyss for replaying it
+ */
+ if (LOGINPUT)
+ {
+ $file_loginput=fopen($_ENV['TMP'].'/scenario-'.$_SERVER['REQUEST_TIME'].'.php', 'a+');
+ fwrite($file_loginput, "include '".$aModule['me_file']."';");
+ fwrite($file_loginput, "\n");
+ fclose($file_loginput);
+ }
+ // if file is not a plugin, include the file, otherwise
+ // include the plugin launcher
+ if ($aModule['me_type']!='PL')
+ {
+ if (file_exists($aModule['me_file']))
+ {
+ require_once $aModule['me_file'];
+ }
+ elseif (file_exists(NOALYSS_INCLUDE.'/'.$aModule['me_file']))
+ {
+ require_once NOALYSS_INCLUDE.'/'.$aModule['me_file'];
+ }
+ else
+ {
+ echo echo_warning(_("Fichier non trouvé"));
+ }
+ }
+ else
+ {
+ require 'extension_get.inc.php';
+ }
+
+ exit();
+ }
+ elseif ($aModule['me_javascript']!='')
+ {
+ $js=str_replace('', dossier::id(), $aModule['me_javascript']);
+ echo create_script($js);
+ }
+ }
+
+}
diff --git a/include/class/mobile_device_mtable.class.php b/include/class/mobile_device_mtable.class.php
new file mode 100644
index 000000000..4a4b8a6aa
--- /dev/null
+++ b/include/class/mobile_device_mtable.class.php
@@ -0,0 +1,153 @@
+
+
+/**
+ * @file
+ * @brief Manage the table profile_mobile
+ */
+
+/**
+ * @class Mobile_Device_MTable
+ * @brief Manage the table profile_mobile
+ */
+class Mobile_Device_MTable extends Manage_Table_SQL
+{
+ private $profile_id; //!< profile_mobile.p_id profile
+
+ function __construct(Profile_Mobile_SQL $p_table)
+ {
+ parent::__construct($p_table);
+ $this->set_append_row(true);
+ $this->set_delete_row(true);
+ $this->set_col_label("me_code", _("Code Menu"));
+ $this->set_col_label("pmo_order", _("Ordre apparition"));
+ $this->set_col_label("pmo_default", _("Entêtes standards"));
+ $this->set_col_tips("pmo_default",80 );
+ $this->set_property_visible("pmo_id", false);
+ $this->set_property_visible("p_id", false);
+ $this->set_col_type("pmo_default", "select",array(
+ ["value"=>1,"label"=>_("Oui")],
+ ["value"=>0,"label"=>_("Non")]
+ ));
+ $this->set_col_type("me_code","custom");
+ $this->set_col_type("pmo_order","numeric");
+ $this->set_header_option("pmo_order",'style="text-align:right;"');
+ $this->set_callback("ajax_misc.php");
+ $this->add_json_param("op","mobile_device_menu");
+ $this->set_sort_column("pmo_order");
+ $this->set_col_sort(1);
+ $this->set_order(["me_code","pmo_order","pmo_default"]);
+
+
+ $this->set_object_name("profile_menu_mtable");
+ }
+ public function get_profile_id()
+ {
+ return $this->profile_id;
+ }
+
+ public function set_profile_id($profile_id)
+ {
+ $this->profile_id=$profile_id;
+ $this->get_table()->setp('p_id',$profile_id);
+ $this->add_json_param("profile_id",$profile_id);
+ return $this;
+ }
+
+ /**
+ * @brief
+ * @param number $p_id profile_mobile.pmo_id
+ * @param number $profile_id profile_mobile.p_id profile
+ * @return \Mobile_Device_MTable
+ */
+ static function build($p_id,$profile_id)
+ {
+ $cn=Dossier::connect();
+ $profile_mobile=new Profile_Mobile_SQL($cn,$p_id);
+ if ( $p_id== -1) {
+ $profile_mobile->setp("pmo_order",5);
+ $profile_mobile->setp("pmo_default",1);
+ }
+
+ $mobile_device_table=new Mobile_Device_MTable($profile_mobile);
+ /* $mobile_device_table->set_profile_id($profile_id);
+ $mobile_device_table->get_table()->setp('p_id',$profile_id);*/
+ return $mobile_device_table;
+ }
+ function input_custom($p_key,$p_value)
+ {
+
+ if ( $p_key == "me_code") {
+ $select = new ISelect("me_code");
+ $cn=$this->get_table()->get_cn();
+ $select->value=$cn->make_array("select me_code , me_code ||' '||coalesce(me_description,'') from menu_ref
+ where
+ me_type in ('PL','ME') and trim(me_code) != 'new_line'
+ order by me_code");
+ $select->rowsize=17;
+ $select->selected=$p_value;
+ echo td($select->input());
+ return;
+ }
+ }
+ function display_row_custom($p_key, $p_value, $p_id=0)
+ {
+ if ( $p_key == 'me_code') {
+ echo td($p_value);
+ return;
+ }
+ }
+ /**
+ * @brief before inserting or updating, check that the data are correct ,
+ *
+ */
+ function check()
+ {
+ // DB connection
+ $cn=$this->get_table()->cn;
+ // object to insert
+ $profile_mobile_sql=$this->get_table();
+ $profile_mobile_sql->me_code=strtoupper($profile_mobile_sql->getp('me_code'));
+ $me_code=$profile_mobile_sql->me_code;
+
+ $profile_id=$profile_mobile_sql->getp("p_id");
+ $pmo_id=$profile_mobile_sql->getp("pmo_id");
+
+ // check for duplicate
+ if ( $cn->get_value("select count(*) from profile_mobile where p_id = $1 and me_code=$2 and pmo_id <> $3",
+ array($profile_id,$me_code,$pmo_id )) > 0
+ ) {
+ $this->set_error("me_code", _("Doublon"));
+ }
+
+ if (isNumber($profile_mobile_sql->getp("pmo_order")) != 1 ) {
+ $this->set_error("pmo_order", _("doit être un nombre"));
+ }
+
+ if ( $cn->get_value("select count(*) from menu_ref where me_code=$1",[$me_code]) == 0) {
+ $this->set_error ("me_code",_('Menu code invalide'));
+ }
+ if ($this->count_error() > 0) {
+ return false;
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/include/class/profile_menu.class.php b/include/class/profile_menu.class.php
index b16e509f2..76d1dff84 100644
--- a/include/class/profile_menu.class.php
+++ b/include/class/profile_menu.class.php
@@ -21,12 +21,18 @@
require_once NOALYSS_INCLUDE.'/database/profile_menu_sql.class.php';
/**
- * Manage the menu of a profile
+ * @file
+ * @brief Manage the menu of a profile
*
* @author dany
*/
+/**
+ * @class Profile_Menu
+ * @brief Manage the menu of a profile
+ */
class Profile_Menu extends Profile_Menu_sql
{
+
function __construct($p_cn, $p_id=-1)
{
@@ -35,7 +41,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Display the content of a profile menu for printing
+ * @brief Display the content of a profile menu for printing
* @param type $resource
* @param type $p_id
*/
@@ -97,7 +103,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Show a table with all the menu and the type
+ * @brief Show a table with all the menu and the type
* @param type $p_id profile.p_id
*/
function display_profile_menu_detail()
@@ -224,7 +230,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Show the available profile for the profile $p_id, it concerns only the action of management (action-gestion)
+ * @brief Show the available profile for the profile $p_id, it concerns only the action of management (action-gestion)
* @param $p_id is the profile p_id
*/
function available_profile()
@@ -250,7 +256,7 @@ class Profile_Menu extends Profile_Menu_sql
}
/**
- * Show the available repository for the profile $p_id
+ * @brief Show the available repository for the profile $p_id
* @param $p_id is the profile p_id
*/
function available_repository()
@@ -273,6 +279,14 @@ class Profile_Menu extends Profile_Menu_sql
);
require_once NOALYSS_TEMPLATE.'/profile_sec_repository.php';
}
+ /**
+ * @brief menu for device
+ */
+ function mobile_device() {
+ $profile_mobile=Mobile_Device_MTable::build(0,$this->p_id);
+ $profile_mobile->display_table("where p_id=$1 order by pmo_order",[ $this->p_id ]);
+ echo create_script("profile_menu_mtable.param_add({profile_id:{$this->p_id}});");
+ }
}
diff --git a/include/class/user.class.php b/include/class/user.class.php
index 5a7cb6ff4..35771c04f 100644
--- a/include/class/user.class.php
+++ b/include/class/user.class.php
@@ -18,16 +18,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// Copyright Author Dany De Bontridder danydb@aevalys.eu
-/**
+/**
* @file
* @brief Data & function about connected users
*/
-
/**
* @brief Data & function about connected users
*
*/
-
require_once NOALYSS_INCLUDE.'/constant.php';
require_once NOALYSS_INCLUDE.'/lib/user_common.php';
require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
@@ -35,63 +33,115 @@ require_once NOALYSS_INCLUDE.'/lib/ac_common.php';
class User
{
- var $id;
- var $pass;
- var $db;
- var $admin;
- var $valid;
+ var $id; //!< in account_repository , ac_users.use_id
+ var $pass; //!< password
+ var $db; //!< database connx
+ var $admin; //!< is or is not admin
+ var $valid; //!< is or is not valid
var $first_name;
var $name;
- var $active ;
- var $login ;
- var $password ;
- var $email ;
+ var $active; //!< 1 active , 0 disables
+ var $login; //!< login lower case
+ var $password; //!< password
+ var $email; //!< user's email
+ var $access_mode; //!< MOBILE or PC depending if when connecting $login contains @mobile
- function __construct($p_cn, $p_id = -1)
- {
- // if p_id is not set then check the connected user
- if ($p_id == -1)
- {
- if (!isset($_SESSION[SESSION_KEY.'g_user']))
- {
- $http=new \HttpInput();
- $user_login=$http->request("p_user","string","");
- $user_password=$http->request("p_pass","string","");
+ function __construct($p_cn, $p_id=-1)
+ {
+ $this->db=$p_cn;
+ // if p_id is not set then check the connected user
+ if ($p_id==-1)
+ {
+ $this->connect_user();
+ }
+ else // if p_id is set get data of another user
+ {
+ $this->id=$p_id;
+ $this->load();
+ }
+ }
- if ($user_login != "" && $user_password != "") {
- $_SESSION[SESSION_KEY."g_user"]=$user_login;
- $_SESSION[SESSION_KEY."g_pass"]=$user_password;
- } else {
- echo '
';
- redirect('index.php', 1);
- exit();
- }
- }
+ /**
+ * @brief connect the user and set the $_SESSION variables if not set thanks the $_REQUEST
+ */
+ private function connect_user()
+ {
+ if (!isset($_SESSION[SESSION_KEY.'g_user']))
+ {
+ $http=new \HttpInput();
+ $user_login=$http->request("p_user", "string", "");
+ $user_password=$http->request("p_pass", "string", "");
- $this->login =strtolower($_SESSION[SESSION_KEY.'g_user']);
- $this->pass = $_SESSION[SESSION_KEY.'g_pass'];
- $this->id = -1;
- $this->db = $p_cn;
- $this->lang = (isset($_SESSION[SESSION_KEY.'g_lang'])) ? $_SESSION[SESSION_KEY.'g_lang'] : 'fr_FR.utf8';
- $this->valid = (isset($_SESSION[SESSION_KEY.'isValid'])) ? 1 : 0;
- if (isset($_SESSION[SESSION_KEY.'g_theme']))
- $this->theme = $_SESSION[SESSION_KEY.'g_theme'];
+ if ($user_login!=""&&$user_password!="")
+ {
+ $_SESSION[SESSION_KEY."g_user"]=$user_login;
+ $_SESSION[SESSION_KEY."g_pass"]=$user_password;
+ }
+ else
+ {
+ echo '
'._('Session expirée Utilisateur déconnecté').'
';
+ redirect('index.php', 1);
+ exit();
+ }
- $this->admin = ( isset($_SESSION[SESSION_KEY.'use_admin']) ) ? $_SESSION[SESSION_KEY.'use_admin'] : 0;
- if (isset($_SESSION[SESSION_KEY.'use_name']))
- $this->name = $_SESSION[SESSION_KEY.'use_name'];
- if (isset($_SESSION[SESSION_KEY.'use_first_name']))
- $this->first_name = $_SESSION[SESSION_KEY.'use_first_name'];
- $this->load();
- }
- else // if p_id is set get data of another user
- {
- $this->id = $p_id;
- $this->db = $p_cn;
- $this->load();
- }
- }
+ if (strpos($user_login, '@mobile')!=false)
+ {
+ $this->access_mode='MOBILE';
+ $this->login=str_ireplace("@mobile", "", $user_login);
+ }
+ else
+ {
+ $this->access_mode='PC';
+ $this->login=strtolower($user_login);
+ }
+
+ $_SESSION[SESSION_KEY."access_mode"]=$this->access_mode;
+ $_SESSION[SESSION_KEY.'g_user']=$this->login;
+ }
+ $this->login=$_SESSION[SESSION_KEY."g_user"];
+ $this->pass=$_SESSION[SESSION_KEY.'g_pass'];
+ $this->id=-1;
+ $this->lang=(isset($_SESSION[SESSION_KEY.'g_lang']))?$_SESSION[SESSION_KEY.'g_lang']:'fr_FR.utf8';
+ $this->access_mode=$_SESSION[SESSION_KEY."access_mode"];
+
+ if ($this->load()==-1)
+ {
+ echo '
'._('Utilisateur ou mot de passe incorrect').'
';
+
+ redirect('logout.php', 1);
+ exit();
+ }
+
+ $this->load_global_pref();
+
+ $_SESSION[SESSION_KEY.'g_lang']=$this->lang;
+ $this->valid=(isset($_SESSION[SESSION_KEY.'isValid']))?1:0;
+ if (isset($_SESSION[SESSION_KEY.'g_theme']))
+ {
+ $this->theme=$_SESSION[SESSION_KEY.'g_theme'];
+ }
+ $_SESSION[SESSION_KEY.'use_admin']=$this->admin;
+ $_SESSION[SESSION_KEY.'use_name']=$this->name;
+ $_SESSION[SESSION_KEY.'use_first_name']=$this->first_name;
+ }
+
+ /**
+ * @brief access_mode tells what mode must be used : pc or mobile
+ */
+ public function get_access_mode()
+ {
+ return $this->access_mode;
+ }
+
+ /**
+ * @brief access_mode tells what mode must be used : pc or mobile
+ */
+ public function set_access_mode($access_mode): object
+ {
+ $this->access_mode=$access_mode;
+ return $this;
+ }
/**
* @return int|mixed
@@ -106,7 +156,7 @@ class User
*/
public function setId(int $id): void
{
- $this->id = $id;
+ $this->id=$id;
}
/**
@@ -122,7 +172,7 @@ class User
*/
public function setPass($pass): void
{
- $this->pass = $pass;
+ $this->pass=$pass;
}
/**
@@ -138,7 +188,7 @@ class User
*/
public function setDb($db): void
{
- $this->db = $db;
+ $this->db=$db;
}
/**
@@ -154,7 +204,7 @@ class User
*/
public function setAdmin($admin): void
{
- $this->admin = $admin;
+ $this->admin=$admin;
}
/**
@@ -170,7 +220,7 @@ class User
*/
public function setValid(int $valid): void
{
- $this->valid = $valid;
+ $this->valid=$valid;
}
/**
@@ -186,7 +236,7 @@ class User
*/
public function setFirstName($first_name): void
{
- $this->first_name = $first_name;
+ $this->first_name=$first_name;
}
/**
@@ -202,7 +252,7 @@ class User
*/
public function setName($name): void
{
- $this->name = $name;
+ $this->name=$name;
}
/**
@@ -218,7 +268,7 @@ class User
*/
public function setActive($active): void
{
- $this->active = $active;
+ $this->active=$active;
}
/**
@@ -234,7 +284,7 @@ class User
*/
public function setLogin(string $login): void
{
- $this->login = $login;
+ $this->login=$login;
}
/**
@@ -250,7 +300,7 @@ class User
*/
public function setPassword($password): void
{
- $this->password = $password;
+ $this->password=$password;
}
/**
@@ -266,30 +316,30 @@ class User
*/
public function setEmail($email): void
{
- $this->email = $email;
+ $this->email=$email;
}
- /**\brief load data from database.
- * if this->id == -1, it is unknown so we have to retrieve it
- from the database by the login
- * return -1 if nothing is found
- */
+ /* * \brief load data from database.
+ * if this->id == -1, it is unknown so we have to retrieve it
+ from the database by the login
+ * return -1 if nothing is found
+ */
- function load()
- {
- /* if this->id == -1, it is unknown so we have to retrieve it from
- the database thanks it login */
- if ($this->id < 0)
- {
- $sql_cond = " where lower(use_login)=lower($1)";
- $sql_array = array($this->login);
- }
- else
- {
- $sql_cond = " where use_id=$1";
- $sql_array = array($this->id);
- }
- $sql = "select use_id,
+ function load()
+ {
+ /* if this->id == -1, it is unknown so we have to retrieve it from
+ the database thanks it login */
+ if ($this->id<0)
+ {
+ $sql_cond=" where lower(use_login)=lower($1)";
+ $sql_array=array($this->login);
+ }
+ else
+ {
+ $sql_cond=" where use_id=$1";
+ $sql_array=array($this->id);
+ }
+ $sql="select use_id,
use_first_name,
use_name,
use_login,
@@ -298,281 +348,284 @@ class User
use_pass,
use_email
from ac_users ";
- $cn = new Database();
- $Res = $cn->exec_sql($sql . $sql_cond, $sql_array);
- if (($Max = Database::num_row($Res)) == 0)
- return -1;
- $row = Database::fetch_array($Res, 0);
- $this->id = $row['use_id'];
- $this->first_name = $row['use_first_name'];
- $this->last_name = $row['use_name'];
- $this->name = $row['use_name'];
- $this->active = $row['use_active'];
- $this->login =strtolower($row['use_login']);
- $this->admin = $row['use_admin'];
- $this->password = $row['use_pass'];
- $this->email=$row['use_email'];
- }
+ $cn=new Database();
+ $Res=$cn->exec_sql($sql.$sql_cond, $sql_array);
+ if (($Max=Database::num_row($Res))==0)
+ return -1;
+ $row=Database::fetch_array($Res, 0);
+ $this->id=$row['use_id'];
+ $this->first_name=$row['use_first_name'];
+ $this->last_name=$row['use_name'];
+ $this->name=$row['use_name'];
+ $this->active=$row['use_active'];
+ $this->login=strtolower($row['use_login']);
+ $this->admin=$row['use_admin'];
+ $this->password=$row['use_pass'];
+ $this->email=$row['use_email'];
+ }
- function save()
- {
+ function save()
+ {
- $Sql = "update ac_users set use_first_name=$1, use_name=$2
+ $Sql="update ac_users set use_first_name=$1, use_name=$2
,use_active=$3,use_admin=$4,use_pass=$5 ,use_email = $7 where use_id=$6";
- $cn = new Database();
- $Res = $cn->exec_sql($Sql, array($this->first_name, $this->last_name, $this->active, $this->admin, $this->pass, $this->id,$this->email));
- }
- function insert()
- {
+ $cn=new Database();
+ $Res=$cn->exec_sql($Sql,
+ array($this->first_name, $this->last_name, $this->active, $this->admin, $this->pass, $this->id, $this->email));
+ }
- $Sql = "INSERT INTO ac_users(
+ function insert()
+ {
+
+ $Sql="INSERT INTO ac_users(
use_first_name, use_name, use_login, use_active,
use_admin, use_pass, use_email)
VALUES ($1, $2, $3, $4, $5, $6, $7) returning use_id";
- $cn = new Database();
- $this->id= $cn->get_value($Sql, array($this->first_name, $this->last_name, $this->login,1,0, $this->pass,$this->email));
- }
+ $cn=new Database();
+ $this->id=$cn->get_value($Sql,
+ array($this->first_name, $this->last_name, $this->login, 1, 0, $this->pass, $this->email));
+ }
- /**
- * \brief Check if user is active and exists in therepository
- * Automatically redirect, it doesn't check if a user can access a folder
- * \param $silent false, echo an error message and exit, true : exit without warning
- * default is false
- *
- ++ */
+ /**
+ * \brief Check if user is active and exists in therepository
+ * Automatically redirect, it doesn't check if a user can access a folder
+ * \param $silent false, echo an error message and exit, true : exit without warning
+ * default is false
+ *
+ ++ */
+ function Check($silent=false, $from='')
+ {
- function Check($silent = false, $from = '')
- {
+ $res=0;
+ $pass5=md5($this->pass);
- $res = 0;
- $pass5 = md5($this->pass);
-
- $cn = new Database();
- $sql = "select ac_users.use_login,ac_users.use_active, ac_users.use_pass,
+ $cn=new Database();
+ $sql="select ac_users.use_login,ac_users.use_active, ac_users.use_pass,
use_admin,use_first_name,use_name
from ac_users
where ac_users.use_id=$1
and ac_users.use_active=1
and ac_users.use_pass=$2";
- $ret = $cn->exec_sql($sql,array($this->id,$pass5));
- $res = Database::num_row($ret);
- if ($res > 0)
- {
- $r = Database::fetch_array($ret, 0);
- $_SESSION[SESSION_KEY.'use_admin'] = $r['use_admin'];
- $_SESSION[SESSION_KEY.'use_name'] = $r['use_name'];
- $_SESSION[SESSION_KEY.'use_first_name'] = $r['use_first_name'];
- $_SESSION[SESSION_KEY.'isValid'] = 1;
-
- $this->admin = $_SESSION[SESSION_KEY.'use_admin'];
- $this->name = $_SESSION[SESSION_KEY.'use_name'];
- $this->first_name = $_SESSION[SESSION_KEY.'use_first_name'];
- $this->load_global_pref();
- }
- $sql = "insert into audit_connect (ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
-
- if ($res == 0)
- {
- $cn->exec_sql($sql, array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"],
- $from, $_SERVER['REQUEST_URI'], 'FAIL'));
- if (!$silent)
- {
- echo '';
- redirect('index.html');
- }
- $this->valid = 0;
- session_unset();
- exit - 1;
- }
- else
- {
- if ($from == 'LOGIN')
- $cn->exec_sql($sql, array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $from,
- $_SERVER['REQUEST_URI'], 'SUCCESS'));
- $this->valid = 1;
- }
-
- return $ret;
- }
-
- /**
- * \brief return the access to a folder,
- * \param $p_dossier id if it is == 0 then we take the value from $_SESSION
- * \return the priv_priv
- * - X no access
- * - R has access (normal user)
-
- *
- */
-
- function get_folder_access($p_dossier = 0)
- {
-
- if ($p_dossier == 0)
- $p_dossier = dossier::id();
- if ($this->admin == 1) return 'R';
- $cn = new Database();
-
- $sql = "select 'R' from jnt_use_dos where use_id=$1 and dos_id=$2";
-
- $res = $cn->get_value($sql, array($this->id, $p_dossier));
-
- if ($cn->get_affected()== 0) return 'X';
- return $res;
- }
-
- /**
- * \brief save the access of a folder
- * \param $db_id the dossier id
- * \param $priv boolean, true then it is granted, false it is removed
- */
-
- function set_folder_access($db_id, $priv)
+ $ret=$cn->exec_sql($sql, array($this->id, $pass5));
+ $res=Database::num_row($ret);
+ if ($res>0)
{
+ $r=Database::fetch_array($ret, 0);
+ $_SESSION[SESSION_KEY.'use_admin']=$r['use_admin'];
+ $_SESSION[SESSION_KEY.'use_name']=$r['use_name'];
+ $_SESSION[SESSION_KEY.'use_first_name']=$r['use_first_name'];
+ $_SESSION[SESSION_KEY.'isValid']=1;
- $cn=new Database();
- if ($priv)
+ $this->admin=$_SESSION[SESSION_KEY.'use_admin'];
+ $this->name=$_SESSION[SESSION_KEY.'use_name'];
+ $this->first_name=$_SESSION[SESSION_KEY.'use_first_name'];
+ $this->load_global_pref();
+ }
+ $sql="insert into audit_connect (ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+
+ if ($res==0)
+ {
+ $cn->exec_sql($sql,
+ array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"],
+ $from, $_SERVER['REQUEST_URI'], 'FAIL'));
+ if (!$silent)
{
- // the access is granted
- $jnt=$cn->get_value("select jnt_id from jnt_use_dos where dos_id=$1 and use_id=$2",
- array($db_id, $this->id));
-
- if ($cn->size()==0)
- {
-
- $Res=$cn->exec_sql("insert into jnt_use_dos(dos_id,use_id) values($1,$2)", array($db_id, $this->id));
- }
- }
- else
- {
- // Access is revoked
- $cn->exec_sql('delete from jnt_use_dos where use_id = $1 and dos_id = $2 ', array($this->id, $db_id));
+ echo '';
+ redirect('index.html');
}
+ $this->valid=0;
+ session_unset();
+ exit-1;
+ }
+ else
+ {
+ if ($from=='LOGIN')
+ $cn->exec_sql($sql,
+ array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $from,
+ $_SERVER['REQUEST_URI'], 'SUCCESS'));
+ $this->valid=1;
}
+ return $ret;
+ }
+
/**
- * \brief check that a user is valid and the access to the folder
- * \param $p_ledger the ledger to check
- * \return the priv_priv
- * - O only predefined operation
- * - W write
- * - R read only
- * - X no access
- *
+ * \brief return the access to a folder,
+ * \param $p_dossier id if it is == 0 then we take the value from $_SESSION
+ * \return the priv_priv
+ * - X no access
+ * - R has access (normal user)
- *
- */
+ *
+ */
+ function get_folder_access($p_dossier=0)
+ {
- function get_ledger_access($p_ledger)
- {
- if ($this->admin == 1 ||
- $this->is_local_admin(dossier::id()) == 1
- || $this->get_status_security_ledger()==0)
- return 'W';
+ if ($p_dossier==0)
+ $p_dossier=dossier::id();
+ if ($this->admin==1)
+ return 'R';
+ $cn=new Database();
- $sql = "select uj_priv from user_sec_jrn where uj_login=$1 and uj_jrn_id=$2";
- $res = $this->db->get_value($sql, array($this->login, $p_ledger));
+ $sql="select 'R' from jnt_use_dos where use_id=$1 and dos_id=$2";
- if ($res == '')
- $res = 'X';
- return $res;
- }
+ $res=$cn->get_value($sql, array($this->id, $p_dossier));
- /**
- * \brief get all the available ledgers for the current user
- * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
- * \param $p_access =3 for Read or WRITE, 2 write, 1 for readonly
- * \param (boolean) $all if true show also inactive
- * \return a double array of available ledgers
- @verbatim
- [0] => [jrn_def_id]
- [jrn_def_type]
- [jrn_def_name]
- [jrn_def_class_deb]
- [jrn_def_class_cred]
- [jrn_type_id]
- [jrn_desc]
- [uj_priv]
- @endverbatim
- */
+ if ($cn->get_affected()==0)
+ return 'X';
+ return $res;
+ }
- function get_ledger($p_type = 'ALL', $p_access = 3,$disable=TRUE)
- {
- $p_type=strtoupper($p_type);
- if (! in_array($p_type, ["FIN","ALL","ODS","VEN",'ACH'])) {
- record_log(sprintf("UGL1, p_type %s",$p_type));
- throw new Exception("UGL1"._("Type incorrecte"));
+ /**
+ * \brief save the access of a folder
+ * \param $db_id the dossier id
+ * \param $priv boolean, true then it is granted, false it is removed
+ */
+ function set_folder_access($db_id, $priv)
+ {
+
+ $cn=new Database();
+ if ($priv)
+ {
+ // the access is granted
+ $jnt=$cn->get_value("select jnt_id from jnt_use_dos where dos_id=$1 and use_id=$2", array($db_id, $this->id));
+
+ if ($cn->size()==0)
+ {
+
+ $Res=$cn->exec_sql("insert into jnt_use_dos(dos_id,use_id) values($1,$2)", array($db_id, $this->id));
}
- if ($disable==TRUE) {
- $sql_enable="";
- } else {
- $sql_enable="and jrn_enable=1";
+ }
+ else
+ {
+ // Access is revoked
+ $cn->exec_sql('delete from jnt_use_dos where use_id = $1 and dos_id = $2 ', array($this->id, $db_id));
+ }
+ }
+
+ /**
+ * \brief check that a user is valid and the access to the folder
+ * \param $p_ledger the ledger to check
+ * \return the priv_priv
+ * - O only predefined operation
+ * - W write
+ * - R read only
+ * - X no access
+ *
+
+ *
+ */
+ function get_ledger_access($p_ledger)
+ {
+ if ($this->admin==1||
+ $this->is_local_admin(dossier::id())==1||$this->get_status_security_ledger()==0)
+ return 'W';
+
+ $sql="select uj_priv from user_sec_jrn where uj_login=$1 and uj_jrn_id=$2";
+ $res=$this->db->get_value($sql, array($this->login, $p_ledger));
+
+ if ($res=='')
+ $res='X';
+ return $res;
+ }
+
+ /**
+ * \brief get all the available ledgers for the current user
+ * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
+ * \param $p_access =3 for Read or WRITE, 2 write, 1 for readonly
+ * \param (boolean) $all if true show also inactive
+ * \return a double array of available ledgers
+ @verbatim
+ [0] => [jrn_def_id]
+ [jrn_def_type]
+ [jrn_def_name]
+ [jrn_def_class_deb]
+ [jrn_def_class_cred]
+ [jrn_type_id]
+ [jrn_desc]
+ [uj_priv]
+ @endverbatim
+ */
+ function get_ledger($p_type='ALL', $p_access=3, $disable=TRUE)
+ {
+ $p_type=strtoupper($p_type);
+ if (!in_array($p_type, ["FIN", "ALL", "ODS", "VEN", 'ACH']))
+ {
+ record_log(sprintf("UGL1, p_type %s", $p_type));
+ throw new Exception("UGL1"._("Type incorrecte"));
+ }
+ if ($disable==TRUE)
+ {
+ $sql_enable="";
+ }
+ else
+ {
+ $sql_enable="and jrn_enable=1";
+ }
+ if ($this->admin!=1&&$this->is_local_admin()!=1&&$this->get_status_security_ledger()==1)
+ {
+ $sql_type=($p_type=='ALL')?'':"and jrn_def_type=upper('".sql_string($p_type)."')";
+ switch ($p_access)
+ {
+ case 3:
+ $sql_access=" and uj_priv!= 'X' ";
+ break;
+ case 2:
+ $sql_access=" and uj_priv = 'W' and jrn_enable=1 ";
+ break;
+
+ case 1:
+ $sql_access=" and ( uj_priv = 'R' or uj_priv='W') ";
+ break;
}
- if ($this->admin != 1 && $this->is_local_admin() != 1 && $this->get_status_security_ledger() == 1)
- {
- $sql_type = ($p_type == 'ALL') ? '' : "and jrn_def_type=upper('" . sql_string($p_type) . "')";
- switch ($p_access)
- {
- case 3:
- $sql_access = " and uj_priv!= 'X' ";
- break;
- case 2:
- $sql_access = " and uj_priv = 'W' and jrn_enable=1 ";
- break;
- case 1:
- $sql_access = " and ( uj_priv = 'R' or uj_priv='W') ";
- break;
- }
-
- $sql = "select jrn_def_id,jrn_def_type,
+ $sql="select jrn_def_id,jrn_def_type,
jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_type_id,jrn_desc,uj_priv,
jrn_deb_max_line,jrn_cred_max_line,jrn_def_description,jrn_enable
from jrn_def join jrn_type on jrn_def_type=jrn_type_id
join user_sec_jrn on uj_jrn_id=jrn_def_id
where
- uj_login='" . $this->login . "'" .
- $sql_type . $sql_access .$sql_enable.
- " order by jrn_Def_name";
- }
- else
- {
- $sql_type = ($p_type == 'ALL') ? ' '.$sql_enable : "where jrn_def_type=upper('" . sql_string($p_type) . "') ".$sql_enable;
- $sql = "select jrn_def_id,jrn_def_type,jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_deb_max_line,jrn_cred_max_line,
+ uj_login='".$this->login."'".
+ $sql_type.$sql_access.$sql_enable.
+ " order by jrn_Def_name";
+ }
+ else
+ {
+ $sql_type=($p_type=='ALL')?' '.$sql_enable:"where jrn_def_type=upper('".sql_string($p_type)."') ".$sql_enable;
+ $sql="select jrn_def_id,jrn_def_type,jrn_def_name,jrn_def_class_deb,jrn_def_class_cred,jrn_deb_max_line,jrn_cred_max_line,
jrn_type_id,jrn_desc,'W' as uj_priv,jrn_def_description,jrn_enable
from jrn_def join jrn_type on jrn_def_type=jrn_type_id
$sql_type
order by jrn_Def_name";
- }
- $res = $this->db->exec_sql($sql);
- if (Database::num_row($res) == 0)
- return null;
- $array = Database::fetch_all($res);
- return $array;
- }
+ }
+ $res=$this->db->exec_sql($sql);
+ if (Database::num_row($res)==0)
+ return null;
+ $array=Database::fetch_all($res);
+ return $array;
+ }
- /**
- * \brief return an sql condition for filtering the permitted ledger
- * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
- * \param $p_access =3 for READ or WRITE, 2 READ and write, 1 for readonly
- *
- * \return sql condition like = jrn_def_id in (...)
- */
-
- function get_ledger_sql($p_type = 'ALL', $p_access = 3)
- {
- $aLedger = $this->get_ledger($p_type, $p_access);
- if (empty($aLedger))
- return ' jrn_def_id < 0 ';
- $sql = " jrn_def_id in (";
- foreach ($aLedger as $row)
- {
- $sql.=$row['jrn_def_id'] . ',';
- }
- $sql.='-1)';
- return $sql;
- }
+ /**
+ * \brief return an sql condition for filtering the permitted ledger
+ * \param $p_type = ALL or the type of the ledger (ACH,VEN,FIN,ODS)
+ * \param $p_access =3 for READ or WRITE, 2 READ and write, 1 for readonly
+ *
+ * \return sql condition like = jrn_def_id in (...)
+ */
+ function get_ledger_sql($p_type='ALL', $p_access=3)
+ {
+ $aLedger=$this->get_ledger($p_type, $p_access);
+ if (empty($aLedger))
+ return ' jrn_def_id < 0 ';
+ $sql=" jrn_def_id in (";
+ foreach ($aLedger as $row)
+ {
+ $sql.=$row['jrn_def_id'].',';
+ }
+ $sql.='-1)';
+ return $sql;
+ }
/**
* synomym for isAdmin,
@@ -583,472 +636,480 @@ class User
return $this->isAdmin();
}
- /**
- * @brief Check if an user is an admin
- *
- * @return 1 for yes 0 for no
- */
- function isAdmin()
- {
- $this->admin = 0;
- $pass5 = md5($this->pass);
- $sql = "select count(*) from ac_users where use_login=$1
+ /**
+ * @brief Check if an user is an admin
+ *
+ * @return 1 for yes 0 for no
+ */
+ function isAdmin()
+ {
+ $this->admin=0;
+ $pass5=md5($this->pass);
+ $sql="select count(*) from ac_users where use_login=$1
and use_active=1 and use_admin=1 ";
- $cn = new Database();
- $this->admin = $cn->get_value($sql, array($this->login));
- return $this->admin;
- }
+ $cn=new Database();
+ $this->admin=$cn->get_value($sql, array($this->login));
+ return $this->admin;
+ }
- /**
- * \brief Set the selected periode in the user's preferences
- *
- * \param $p_periode periode
- * \param - $p_user
- *
- */
- function set_periode($p_periode)
- {
- $sql = "update user_local_pref set parameter_value=$1 where user_id=$2 and parameter_type='PERIODE'";
- $Res = $this->db->exec_sql($sql,[$p_periode,$this->id]);
- }
+ /**
+ * \brief Set the selected periode in the user's preferences
+ *
+ * \param $p_periode periode
+ * \param - $p_user
+ *
+ */
+ function set_periode($p_periode)
+ {
+ $sql="update user_local_pref set parameter_value=$1 where user_id=$2 and parameter_type='PERIODE'";
+ $Res=$this->db->exec_sql($sql, [$p_periode, $this->id]);
+ }
- private function set_default_periode()
- {
+ private function set_default_periode()
+ {
- /* get the first periode */
- $sql = 'select min(p_id) as pid '
- . ' from parm_periode '
- . ' where p_closed = false and p_start = (select min(p_start) from parm_periode)';
- $Res = $this->db->exec_sql($sql);
+ /* get the first periode */
+ $sql='select min(p_id) as pid '
+ .' from parm_periode '
+ .' where p_closed = false and p_start = (select min(p_start) from parm_periode)';
+ $Res=$this->db->exec_sql($sql);
- $pid = Database::fetch_result($Res, 0, 0);
- /* if all the periode are closed, then we use the last closed period */
- if ($pid == null)
- {
- $sql = 'select min(p_id) as pid '
- . 'from parm_periode '
- . 'where p_start = (select max(p_start) from parm_periode)';
- $Res2 = $this->db->exec_sql($sql);
- $pid = Database::fetch_result($Res2, 0, 0);
- if ($pid == null)
- {
- throw new Exception( _("Aucune période trouvéee !!!"));
- }
+ $pid=Database::fetch_result($Res, 0, 0);
+ /* if all the periode are closed, then we use the last closed period */
+ if ($pid==null)
+ {
+ $sql='select min(p_id) as pid '
+ .'from parm_periode '
+ .'where p_start = (select max(p_start) from parm_periode)';
+ $Res2=$this->db->exec_sql($sql);
+ $pid=Database::fetch_result($Res2, 0, 0);
+ if ($pid==null)
+ {
+ throw new Exception(_("Aucune période trouvéee !!!"));
+ }
- $pid = Database::fetch_result($Res2, 0, 0);
- }
+ $pid=Database::fetch_result($Res2, 0, 0);
+ }
- $sql = sprintf("insert into user_local_pref (user_id,parameter_value,parameter_type)
+ $sql=sprintf("insert into user_local_pref (user_id,parameter_value,parameter_type)
values ('%s','%d','PERIODE')", $this->id, $pid);
- $Res = $this->db->exec_sql($sql);
- }
+ $Res=$this->db->exec_sql($sql);
+ }
- /**
- * \brief Get the default periode from the user's preferences
- *
- * \return the default periode
- *
- *
- */
+ /**
+ * \brief Get the default periode from the user's preferences
+ *
+ * \return the default periode
+ *
+ *
+ */
+ function get_periode()
+ {
- function get_periode()
- {
+ $array=$this->get_preference();
+ if (!isset($array['PERIODE']))
+ {
+ $this->set_default_periode();
+ $array=$this->get_preference();
+ }
+ return $array['PERIODE'];
+ }
- $array = $this->get_preference();
- if (!isset($array['PERIODE']))
- {
- $this->set_default_periode();
- $array = $this->get_preference();
- }
- return $array['PERIODE'];
- }
+ /**
+ *
+ * \brief return the mini rapport to display on the welcome page
+ * \return 0 if nothing if found or the report to display (form_definition.fr_id)
+ */
+ function get_mini_report()
+ {
+ $array=$this->get_preference();
+ $fr_id=(isset($array['MINIREPORT']))?$array['MINIREPORT']:0;
+ return $fr_id;
+ }
- /**
- *
- * \brief return the mini rapport to display on the welcome page
- * \return 0 if nothing if found or the report to display (form_definition.fr_id)
- */
+ /**
+ * \brief set the mini rapport to display on the welcome page
+ */
+ function set_mini_report($p_id)
+ {
+ $count=$this->db->get_value("select count(*) from user_local_pref where user_id=$1 and parameter_type=$2",
+ array($this->id, 'MINIREPORT'));
+ if ($count==1)
+ {
+ $sql="update user_local_pref set parameter_value=$1 where user_id=$2 and parameter_type='MINIREPORT'";
+ $Res=$this->db->exec_sql($sql, array($p_id, $this->id));
+ }
+ else
+ {
+ $sql="insert into user_local_pref (user_id,parameter_type,parameter_value)".
+ "values($1,'MINIREPORT',$2)";
+ $Res=$this->db->exec_sql($sql, array($this->id, $p_id));
+ }
+ }
- function get_mini_report()
- {
- $array = $this->get_preference();
- $fr_id = (isset($array['MINIREPORT'])) ? $array['MINIREPORT'] : 0;
- return $fr_id;
- }
-
- /**
- * \brief set the mini rapport to display on the welcome page
- */
- function set_mini_report($p_id)
- {
- $count = $this->db->get_value("select count(*) from user_local_pref where user_id=$1 and parameter_type=$2", array($this->id, 'MINIREPORT'));
- if ($count == 1)
- {
- $sql = "update user_local_pref set parameter_value=$1 where user_id=$2 and parameter_type='MINIREPORT'";
- $Res = $this->db->exec_sql($sql, array($p_id, $this->id));
- }
- else
- {
- $sql = "insert into user_local_pref (user_id,parameter_type,parameter_value)" .
- "values($1,'MINIREPORT',$2)";
- $Res = $this->db->exec_sql($sql, array($this->id, $p_id));
- }
- }
- /**
- * Save the preference , the scope is global, the settings are saved
- * into account_repository
- * @param $key THEME, LANG , PAGESIZE
- * @param $value value of the key
- */
-
- function save_global_preference($key, $value)
- {
- $repo = new Database();
- $count = $repo->get_value("select count(*)
+ /**
+ * Save the preference , the scope is global, the settings are saved
+ * into account_repository
+ * @param $key THEME, LANG , PAGESIZE
+ * @param $value value of the key
+ */
+ function save_global_preference($key, $value)
+ {
+ $repo=new Database();
+ $count=$repo->get_value("select count(*)
from
user_global_pref
where
parameter_type=$1 and user_id=$2", array($key, $this->login));
- if ($count == 1)
- {
- $repo->exec_sql("update user_global_pref set parameter_value=$1
+ if ($count==1)
+ {
+ $repo->exec_sql("update user_global_pref set parameter_value=$1
where parameter_type=$2 and user_id=$3", array($value, $key, $this->login));
- }
- elseif ($count == 0)
- {
- $repo->exec_sql("insert into user_global_pref(user_id,parameter_type,parameter_value)
+ }
+ elseif ($count==0)
+ {
+ $repo->exec_sql("insert into user_global_pref(user_id,parameter_type,parameter_value)
values($1,$2,$3)", array($this->login, $key, $value));
- }
- }
+ }
+ }
- /**
- * \brief Get the default user's preferences
- * \return array of (parameter_type => parameter_value)
- */
- function get_preference()
- {
- $sql = "select parameter_type,parameter_value from user_local_pref where user_id=$1";
- $Res = $this->db->exec_sql($sql, array($this->id));
- $l_array = array();
- for ($i = 0; $i < Database::num_row($Res); $i++)
- {
- $row = Database::fetch_array($Res, $i);
- $type = $row['parameter_type'];
- $l_array[$type] = $row['parameter_value'];
- }
- $repo=new Database();
- $a_global_pref=$repo->get_array("select parameter_type,parameter_value from user_global_pref
+ /**
+ * \brief Get the default user's preferences
+ * \return array of (parameter_type => parameter_value)
+ */
+ function get_preference()
+ {
+ $sql="select parameter_type,parameter_value from user_local_pref where user_id=$1";
+ $Res=$this->db->exec_sql($sql, array($this->id));
+ $l_array=array();
+ for ($i=0; $iget_array("select parameter_type,parameter_value from user_global_pref
where
- upper(user_id) = upper($1)",[$this->login]);
- $nb_global=count($a_global_pref);
- for ( $i = 0 ;$i< $nb_global ; $i++) {
- $idx=$a_global_pref[$i]['parameter_type'];
- $value=$a_global_pref[$i]['parameter_value'];
- $l_array[$idx]=$value;
- }
+ upper(user_id) = upper($1)", [$this->login]);
+ $nb_global=count($a_global_pref);
+ for ($i=0; $i<$nb_global; $i++)
+ {
+ $idx=$a_global_pref[$i]['parameter_type'];
+ $value=$a_global_pref[$i]['parameter_value'];
+ $l_array[$idx]=$value;
+ }
- return $l_array;
- }
+ return $l_array;
+ }
+ /**
+ * @brief Check if an user can access a module, return 1 if yes, otherwise 0
+ * record in audit log
+ * This function works only if user is connected to a Folder
+ * @param string $p_module menu_ref.me_code
+ * @returns 0 for FORBIDDEN, 1 for GRANTED
+ */
+ function check_module($p_module)
+ {
+ if ( $this->access_mode == "PC") {
- /**
- * Check if an user can access a module, return 1 if yes, otherwise 0
- * record in audit log
- * This function works only if user is connected to a Folder
- * @param string $p_module menu_ref.me_code
- * @returns 0 for FORBIDDEN, 1 for GRANTED
- */
- function check_module($p_module)
- {
- $acc = $this->db->get_value("select count(*) from v_all_menu where p_id = $1
- and me_code=$2", array($this->get_profile(), $p_module));
- if ($acc == 0)
- {
- $this->audit("FAIL", $p_module);
- return 0;
- }
- $this->audit("SUCCESS", $p_module);
- return 1;
- }
-
- /**
- * \brief Check if an user is allowed to do an action
- * \param p_action_id
- * \return
- * - 0 no priv
- * - 1 priv granted
- * @see constant.security.php
- */
-
- function check_action($p_action_id)
- {
- /* save it into the log */
- global $audit;
- if ($this->Admin() == 1)
- return 1;
- if ($this->is_local_admin(dossier::id()) == 1)
- return 1;
- if ( $this->get_status_security_action() == 0)
- return 1;
- $Res = $this->db->exec_sql(
- "select * from user_sec_act where ua_login=$1 and ua_act_id=$2", array($this->login, $p_action_id));
- $Count = Database::num_row($Res);
- if ($Count == 0)
- {
- if (isset($audit) && $audit == true)
- {
- $cn = new Database();
- $sql = "insert into audit_connect (ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
- $cn->exec_sql($sql, array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $p_action_id, $_SERVER['REQUEST_URI'], 'FAIL'));
- }
- return 0;
- }
- if ($Count == 1) return 1;
- echo_error(_("Action invalide"));
- record_log("User:check_action".sprintf("login %s ua_act_id %s",$this->login,$p_action_id));
- exit();
- }
-
- /**
- * \brief Get the global preferences from user_global_pref
- * in the account_repository db
- *
- * \note set $SESSION[g_variable]
- */
-
- function load_global_pref()
- {
- $cn = new Database();
- // Load everything in an array
- $Res = $cn->exec_sql("select parameter_type,parameter_value from
- user_global_pref
- where user_id=$1",[$this->login]);
- $Max = Database::num_row($Res);
- if ($Max == 0)
- {
- $this->insert_default_global_pref();
- $this->load_global_pref();
- return;
- }
- // Load value into array
- $line = array();
- for ($i = 0; $i < $Max; $i++)
- {
- $row = Database::fetch_array($Res, $i);
- $type = $row['parameter_type'];
- $line[$type] = $row['parameter_value'];
- }
- // save array into g_ variable
- $array_pref = array('g_theme' => 'THEME',
- 'g_pagesize' => 'PAGESIZE',
- 'g_topmenu' => 'TOPMENU',
- 'g_lang' => 'LANG',
- 'csv_fieldsep'=>'csv_fieldsep',
- 'csv_decimal'=>'csv_decimal' ,
- 'csv_encoding'=>'csv_encoding',
- 'first_week_day'=>'first_week_day');
-
- foreach ($array_pref as $name => $parameter)
- {
- if (!isset($line[$parameter]))
- {
- $this->insert_default_global_pref($parameter);
- $this->load_global_pref();
- return;
- }
- $_SESSION[SESSION_KEY.$name] = $line[$parameter];
- }
- }
-
- /**
- * \brief insert default pref
- * if no parameter are given insert all the existing
- * parameter otherwise only the requested
- * \param $p_type parameter's type or nothing
- * \param $p_value parameter value
- *
- */
-
- function insert_default_global_pref($p_type = "", $p_value = "")
- {
-
- $default_parameter = array("THEME" => "classic",
- "PAGESIZE" => "50",
- 'TOPMENU' => 'TEXT',
- 'LANG' => 'fr_FR.utf8',
- 'csv_fieldsep'=>'0',
- 'csv_decimal'=>'0',
- 'csv_encoding'=>'utf8',
- 'first_week_day'=>1
- );
- $cn = new Database();
- $sql = "insert into user_global_pref(user_id,parameter_type,parameter_value)
- values ($1,$2,$3)";
- if ($p_type == "")
- {
- foreach ($default_parameter as $name => $value)
- {
- $cn->exec_sql($sql,array($this->login,$name,$value));
- }
- }
- else
- {
- $value = ($p_value == "") ? $default_parameter[$p_type] : $p_value;
- $cn->exec_sql($sql,array($this->login,$p_type,$value));
- }
- }
-
- /**
- * \brief update default pref
- * if value is not given then use the default value
- *
- * \param $p_type parameter's type
- * \param $p_value parameter's value value of the type
- */
-
- function update_global_pref($p_type, $p_value = "")
- {
- $default_parameter = array("THEME" => "classic",
- "PAGESIZE" => "50",
- "LANG" => 'fr_FR.utf8',
- 'TOPMENU' => 'SELECT',
- 'csv_fieldsep'=>'0',
- 'csv_decimal'=>'0',
- 'csv_encoding'=>'utf8',
- 'first_week_day'=>1
- );
- $cn = new Database();
- $Sql = "update user_global_pref set parameter_value=$1
- where parameter_type=$2 and
- user_id=$3";
- $value = ($p_value == "") ? $default_parameter[$p_type] : $p_value;
- $cn->exec_sql($Sql, array($value, $p_type, $this->login));
- }
-
-//end function
- /**\brief Return the year of current Periode
- * it is the parm_periode.p_exercice col
- * if an error occurs return 0
- */
-
- function get_exercice()
- {
- $sql = "select p_exercice from parm_periode where p_id=" . $this->get_periode();
- $Ret = $this->db->exec_sql($sql);
- if (Database::num_row($Ret) == 1)
- {
- $r = Database::fetch_array($Ret, 0);
- return $r['p_exercice'];
- }
- else
- return 0;
- }
-
- /**\brief Check if the user can access
- * otherwise warn and exit
- * \param $p_action requested action
- * \param $p_js = 1 javascript, or 0 just a text or 2 to log it silently
- * \return nothing the program exits automatically
- */
-
- function can_request($p_action, $p_js = 0)
- {
- if ($this->check_action($p_action) == 0)
- {
- $this->audit('FAIL');
- if ($p_js == 1)
- {
- echo create_script("alert_box(content[59])");
- }
- elseif ($p_js == 2) {
- record_log(_("Access invalid").$p_action);
- }
- else
- {
- echo '
',
- htmlspecialchars(_("Cette action ne vous est pas autorisée Contactez votre responsable")),
- '
';
- echo '
';
- }
- exit(-1);
- }
- }
-
- /**
- *@brief Check if the user can print (in menu_ref p_type_display=p)
- * otherwise warn and exit
- * @param $p_action requested action
- * @return nothing the program exits automatically
- */
- function check_print($p_action)
- {
- global $audit, $cn;
- $this->audit('AUDIT', $p_action);
- if ($this->Admin() == 1)
- return 1;
-
- $res = $cn->get_value("select count(*) from profile_menu
- join profile_user using (p_id)
- where user_name=$1 and me_code=$2 ", array($this->login, $p_action));
- return $res;
- }
-
- /**\brief Check if the user can print (in menu_ref p_type_display=p)
- * otherwise warn and exit
- * \param $p_action requested action
- * \return nothing the program exits automatically
- */
- function can_print($p_action, $p_js = 0)
- {
- if ($this->check_print($p_action) == 0)
- {
- $this->audit('FAIL');
- if ($p_js == 1)
- {
- echo create_script("alert_box(content[59])");
- }
- else
- {
- echo '
';
- echo '
',
- htmlspecialchars(_("Cette action ne vous est pas autorisée Contactez votre responsable")),
- '
';
- echo '
';
- }
- exit(-1);
- }
- }
-
- /**
- * \brief Check if an user is an local administrator
- * @deprecated since version 6.7
- *
- *
- * \param $p_dossier : dossier_id
- *
- * \return
- * - 0 if no
- * - 1 if yes
- *
- */
-
- function is_local_admin($p_dossier = -1)
- {
+ $acc=$this->db->get_value("select count(*) from v_all_menu where p_id = $1
+ and me_code=$2", array($this->get_profile(), $p_module));
+ } elseif ($this->access_mode=="MOBILE") {
+ $acc=$this->db->get_value("select count(*) from profile_mobile where p_id=$1 and me_code=$2",
+ array($this->get_profile(), $p_module));
+ } else {
+ throw new Exception("USER:823:ACCESS_MODE INCONNU");
+ }
+ if ($acc==0)
+ {
+ $this->audit("FAIL", $p_module);
return 0;
}
- /**
- *@brief return array of available repository
- *
- * @param $p_access R for read W for write
- * @return an array
- */
- function get_available_repository($p_access='R')
- {
- $profile=$this->get_profile();
- $r=array();
- if ($p_access=='R')
- {
- $r=$this->db->get_array("select distinct u.r_id,r_name
+ $this->audit("SUCCESS", $p_module);
+ return 1;
+ }
+
+ /**
+ * \brief Check if an user is allowed to do an action
+ * \param p_action_id
+ * \return
+ * - 0 no priv
+ * - 1 priv granted
+ * @see constant.security.php
+ */
+ function check_action($p_action_id)
+ {
+ /* save it into the log */
+ global $audit;
+ if ($this->Admin()==1)
+ return 1;
+ if ($this->is_local_admin(dossier::id())==1)
+ return 1;
+ if ($this->get_status_security_action()==0)
+ return 1;
+ $Res=$this->db->exec_sql(
+ "select * from user_sec_act where ua_login=$1 and ua_act_id=$2", array($this->login, $p_action_id));
+ $Count=Database::num_row($Res);
+ if ($Count==0)
+ {
+ if (isset($audit)&&$audit==true)
+ {
+ $cn=new Database();
+ $sql="insert into audit_connect (ac_user,ac_ip,ac_module,ac_url,ac_state) values ($1,$2,$3,$4,$5)";
+ $cn->exec_sql($sql,
+ array($_SESSION[SESSION_KEY.'g_user'], $_SERVER["REMOTE_ADDR"], $p_action_id, $_SERVER['REQUEST_URI'],
+ 'FAIL'));
+ }
+ return 0;
+ }
+ if ($Count==1)
+ return 1;
+ echo_error(_("Action invalide"));
+ record_log("User:check_action".sprintf("login %s ua_act_id %s", $this->login, $p_action_id));
+ exit();
+ }
+
+ /**
+ * \brief Get the global preferences from user_global_pref
+ * in the account_repository db
+ *
+ * \note set $SESSION[g_variable]
+ */
+ function load_global_pref()
+ {
+ $cn=new Database();
+ // Load everything in an array
+ $Res=$cn->exec_sql("select parameter_type,parameter_value from
+ user_global_pref
+ where user_id=$1", [$this->login]);
+ $Max=Database::num_row($Res);
+ if ($Max==0)
+ {
+ $this->insert_default_global_pref();
+ $this->load_global_pref();
+ return;
+ }
+ // Load value into array
+ $line=array();
+ for ($i=0; $i<$Max; $i++)
+ {
+ $row=Database::fetch_array($Res, $i);
+ $type=$row['parameter_type'];
+ $line[$type]=$row['parameter_value'];
+ }
+ // save array into g_ variable
+ $array_pref=array('g_theme'=>'THEME',
+ 'g_pagesize'=>'PAGESIZE',
+ 'g_topmenu'=>'TOPMENU',
+ 'g_lang'=>'LANG',
+ 'csv_fieldsep'=>'csv_fieldsep',
+ 'csv_decimal'=>'csv_decimal',
+ 'csv_encoding'=>'csv_encoding',
+ 'first_week_day'=>'first_week_day');
+
+ foreach ($array_pref as $name=> $parameter)
+ {
+ if (!isset($line[$parameter]))
+ {
+ $this->insert_default_global_pref($parameter);
+ $this->load_global_pref();
+ return;
+ }
+ $_SESSION[SESSION_KEY.$name]=$line[$parameter];
+ }
+ }
+
+ /**
+ * \brief insert default pref
+ * if no parameter are given insert all the existing
+ * parameter otherwise only the requested
+ * \param $p_type parameter's type or nothing
+ * \param $p_value parameter value
+ *
+ */
+ function insert_default_global_pref($p_type="", $p_value="")
+ {
+
+ $default_parameter=array("THEME"=>"classic",
+ "PAGESIZE"=>"50",
+ 'TOPMENU'=>'TEXT',
+ 'LANG'=>'fr_FR.utf8',
+ 'csv_fieldsep'=>'0',
+ 'csv_decimal'=>'0',
+ 'csv_encoding'=>'utf8',
+ 'first_week_day'=>1
+ );
+ $cn=new Database();
+ $sql="insert into user_global_pref(user_id,parameter_type,parameter_value)
+ values ($1,$2,$3)";
+ if ($p_type=="")
+ {
+ foreach ($default_parameter as $name=> $value)
+ {
+ $cn->exec_sql($sql, array($this->login, $name, $value));
+ }
+ }
+ else
+ {
+ $value=($p_value=="")?$default_parameter[$p_type]:$p_value;
+ $cn->exec_sql($sql, array($this->login, $p_type, $value));
+ }
+ }
+
+ /**
+ * \brief update default pref
+ * if value is not given then use the default value
+ *
+ * \param $p_type parameter's type
+ * \param $p_value parameter's value value of the type
+ */
+ function update_global_pref($p_type, $p_value="")
+ {
+ $default_parameter=array("THEME"=>"classic",
+ "PAGESIZE"=>"50",
+ "LANG"=>'fr_FR.utf8',
+ 'TOPMENU'=>'SELECT',
+ 'csv_fieldsep'=>'0',
+ 'csv_decimal'=>'0',
+ 'csv_encoding'=>'utf8',
+ 'first_week_day'=>1
+ );
+ $cn=new Database();
+ $Sql="update user_global_pref set parameter_value=$1
+ where parameter_type=$2 and
+ user_id=$3";
+ $value=($p_value=="")?$default_parameter[$p_type]:$p_value;
+ $cn->exec_sql($Sql, array($value, $p_type, $this->login));
+ }
+
+//end function
+ /* * \brief Return the year of current Periode
+ * it is the parm_periode.p_exercice col
+ * if an error occurs return 0
+ */
+
+ function get_exercice()
+ {
+ $sql="select p_exercice from parm_periode where p_id=".$this->get_periode();
+ $Ret=$this->db->exec_sql($sql);
+ if (Database::num_row($Ret)==1)
+ {
+ $r=Database::fetch_array($Ret, 0);
+ return $r['p_exercice'];
+ }
+ else
+ return 0;
+ }
+
+ /* * \brief Check if the user can access
+ * otherwise warn and exit
+ * \param $p_action requested action
+ * \param $p_js = 1 javascript, or 0 just a text or 2 to log it silently
+ * \return nothing the program exits automatically
+ */
+
+ function can_request($p_action, $p_js=0)
+ {
+ if ($this->check_action($p_action)==0)
+ {
+ $this->audit('FAIL');
+ if ($p_js==1)
+ {
+ echo create_script("alert_box(content[59])");
+ }
+ elseif ($p_js==2)
+ {
+ record_log(_("Access invalid").$p_action);
+ }
+ else
+ {
+ echo '
',
+ htmlspecialchars(_("Cette action ne vous est pas autorisée Contactez votre responsable")),
+ '
';
+ echo '
';
+ }
+ exit(-1);
+ }
+ }
+
+ /**
+ * @brief Check if the user can print (in menu_ref p_type_display=p)
+ * otherwise warn and exit
+ * @param $p_action requested action
+ * @return nothing the program exits automatically
+ */
+ function check_print($p_action)
+ {
+ global $audit, $cn;
+ $this->audit('AUDIT', $p_action);
+ if ($this->Admin()==1)
+ return 1;
+
+ $res=$cn->get_value("select count(*) from profile_menu
+ join profile_user using (p_id)
+ where user_name=$1 and me_code=$2 ", array($this->login, $p_action));
+ return $res;
+ }
+
+ /* * \brief Check if the user can print (in menu_ref p_type_display=p)
+ * otherwise warn and exit
+ * \param $p_action requested action
+ * \return nothing the program exits automatically
+ */
+
+ function can_print($p_action, $p_js=0)
+ {
+ if ($this->check_print($p_action)==0)
+ {
+ $this->audit('FAIL');
+ if ($p_js==1)
+ {
+ echo create_script("alert_box(content[59])");
+ }
+ else
+ {
+ echo '
';
+ echo '
',
+ htmlspecialchars(_("Cette action ne vous est pas autorisée Contactez votre responsable")),
+ '
';
+ echo '
';
+ }
+ exit(-1);
+ }
+ }
+
+ /**
+ * \brief Check if an user is an local administrator
+ * @deprecated since version 6.7
+ *
+ *
+ * \param $p_dossier : dossier_id
+ *
+ * \return
+ * - 0 if no
+ * - 1 if yes
+ *
+ */
+ function is_local_admin($p_dossier=-1)
+ {
+ return 0;
+ }
+
+ /**
+ * @brief return array of available repository
+ *
+ * @param $p_access R for read W for write
+ * @return an array
+ */
+ function get_available_repository($p_access='R')
+ {
+ $profile=$this->get_profile();
+ $r=array();
+ if ($p_access=='R')
+ {
+ $r=$this->db->get_array("select distinct u.r_id,r_name
from
profile_sec_repository as u
join stock_repository as s on(u.r_id=s.r_id)
@@ -1056,204 +1117,201 @@ class User
p_id =$1
and ur_right='W'
order by 2
- ",array($profile));
- }
- if ($p_access == 'W')
- {
- $r=$this->db->get_array("select distinct u.r_id,r_name
+ ", array($profile));
+ }
+ if ($p_access=='W')
+ {
+ $r=$this->db->get_array("select distinct u.r_id,r_name
from
profile_sec_repository as u
join stock_repository as s on(u.r_id=s.r_id)
where
p_id =$1 order by 2
- ",array($profile));
- }
- return $r;
- }
- /**
- * \brief return an array with all the active users who can access
- * $p_dossier including the global admin.
- * The user must be activated
- *
- * \param $p_dossier dossier
- * \return an array of user's object
- * array indices
- * - use_id (id )
- * - use_login (login of the user)
- * - use_name
- * - use_first_name
- *
- * \exception throw an exception if nobody can access
- */
+ ", array($profile));
+ }
+ return $r;
+ }
- static function get_list($p_dossier)
- {
- $sql = "select distinct use_id,use_login,use_first_name,use_name from ac_users
+ /**
+ * \brief return an array with all the active users who can access
+ * $p_dossier including the global admin.
+ * The user must be activated
+ *
+ * \param $p_dossier dossier
+ * \return an array of user's object
+ * array indices
+ * - use_id (id )
+ * - use_login (login of the user)
+ * - use_name
+ * - use_first_name
+ *
+ * \exception throw an exception if nobody can access
+ */
+ static function get_list($p_dossier)
+ {
+ $sql="select distinct use_id,use_login,use_first_name,use_name from ac_users
left outer join jnt_use_dos using (use_id)
where
(dos_id=$1 and use_active=1) or (use_active=1 and use_admin=1)
order by use_login,use_name";
+ $repo=new Database();
+ $array=$repo->get_array($sql, array($p_dossier));
+ if ($repo->size()==0)
+ throw new Exception('Error inaccessible folder');
+ return $array;
+ }
- $repo = new Database();
- $array = $repo->get_array($sql, array($p_dossier));
- if ($repo->size() == 0)
- throw new Exception('Error inaccessible folder');
- return $array;
- }
+ /**
+ * \brief check the access of an user on a ledger
+ *
+ * \param $p_jrn the ledger id
+ * \return
+ * - O only predefined operation
+ * - W write
+ * - R read only
+ * - X no access
+ *
+ */
+ function check_jrn($p_jrn)
+ {
+ return $this->get_ledger_access($p_jrn);
+ }
- /**
- * \brief check the access of an user on a ledger
- *
- * \param $p_jrn the ledger id
- * \return
- * - O only predefined operation
- * - W write
- * - R read only
- * - X no access
- *
- */
+ /**
+ * \brief check if an user can access a folder, if he cannot display a dialog box
+ * and exit
+ * \param the folder if
+ * \param $silent false, echo an error message and exit, true : exit without warning
+ * default is false
+ * \return
+ * - L for administrator (local and global)
+ * - X no access
+ * - R regular user
+ */
+ function check_dossier($p_dossier_id, $silent=false)
+ {
+ $this->Admin();
+ if ($this->admin==1||$this->is_local_admin($p_dossier_id)==1)
+ return 'L';
+ $cn=new Database();
- function check_jrn($p_jrn)
- {
- return $this->get_ledger_access($p_jrn);
- }
+ $dossier=$cn->get_value("select 'R' from jnt_use_dos where dos_id=$1 and use_id=$2",
+ array($p_dossier_id, $this->id));
+ $dossier=($dossier=='')?'X':$dossier;
+ if ($dossier=='X')
+ {
+ $this->audit('FAIL', "Access folder ");
+ if (!$silent)
+ {
+ alert(_('Dossier non accessible'));
+ exit();
+ }
+ }
+ return $dossier;
+ }
- /**
- * \brief check if an user can access a folder, if he cannot display a dialog box
- * and exit
- * \param the folder if
- * \param $silent false, echo an error message and exit, true : exit without warning
- * default is false
- * \return
- * - L for administrator (local and global)
- * - X no access
- * - R regular user
- */
+ /**
+ * @brief return the first date and the last date of the current exercice for the current user
+ * @return and array ([0] => start_date,[1] => end_date)
+ */
+ function get_limit_current_exercice()
+ {
+ $current_exercice=$this->get_exercice();
+ $periode=new Periode($this->db);
+ list($per_start, $per_end)=$periode->get_limit($current_exercice);
+ $start=$per_start->first_day();
+ $end=$per_end->last_day();
+ return array($start, $end);
+ }
- function check_dossier($p_dossier_id, $silent = false)
- {
- $this->Admin();
- if ($this->admin == 1 || $this->is_local_admin($p_dossier_id) == 1)
- return 'L';
- $cn = new Database();
+ /**
+ * \brief Show all the available folder for the users
+ * at the login page. For the special case 'E'
+ * go directly to extension and bypasse the dashboard
+ * \param $p_filtre user
+ *
+ * \return table in HTML
+ *
+ */
+ function show_dossier($p_filtre="")
+ {
+ $p_array=$this->get_available_folder($p_filtre);
- $dossier = $cn->get_value("select 'R' from jnt_use_dos where dos_id=$1 and use_id=$2", array($p_dossier_id, $this->id));
- $dossier = ($dossier == '') ? 'X' : $dossier;
- if ($dossier == 'X')
- {
- $this->audit('FAIL', "Access folder ");
- if (!$silent)
- {
- alert(_('Dossier non accessible'));
- exit();
- }
- }
- return $dossier;
- }
+ $result="";
- /**
- * @brief return the first date and the last date of the current exercice for the current user
- * @return and array ([0] => start_date,[1] => end_date)
- */
- function get_limit_current_exercice()
- {
- $current_exercice = $this->get_exercice();
- $periode = new Periode($this->db);
- list($per_start, $per_end) = $periode->get_limit($current_exercice);
- $start = $per_start->first_day();
- $end = $per_end->last_day();
- return array($start, $end);
- }
+ $result.="
";
+ return $result;
+ }
- /**
- * \brief Show all the available folder for the users
- * at the login page. For the special case 'E'
- * go directly to extension and bypasse the dashboard
- * \param $p_filtre user
- *
- * \return table in HTML
- *
- */
+ for ($i=0; $iget_available_folder($p_filtre);
+ $id=$p_array[$i]['dos_id'];
+ $name=$p_array[$i]['dos_name'];
+ $desc=$p_array[$i]['dos_description'];
+ if ($i%2==0)
+ $tr="odd";
+ else
+ $tr="even";
+ $target="do.php?gDossier=$id";
- $result = "";
-
- $result.="
";
echo '';
echo '';
echo '';
-
+$profile_mobile=Mobile_Device_MTable::build(0,90);
+$profile_mobile->create_js_script();
//*******************************************************
// Show details of the selected profile
diff --git a/include/sql/patch/upgrade163.sql b/include/sql/patch/upgrade163.sql
new file mode 100644
index 000000000..5bc3fdf44
--- /dev/null
+++ b/include/sql/patch/upgrade163.sql
@@ -0,0 +1,22 @@
+begin;
+
+drop table if exists profile_mobile;
+create table profile_mobile (pmo_id serial primary key , me_code text not null , pmo_order int not null, p_id int not null,pmo_default char default '1');
+
+alter table profile_mobile add constraint profile_mobile_profile_fk foreign key (p_id) references profile (p_id);
+alter table profile_mobile add constraint profile_mobile_menu_ref_fk foreign key (me_code) references menu_ref (me_code);
+alter table profile_mobile add constraint profile_mobile_code_uq unique (p_id,me_code);
+
+comment on table profile_mobile is 'Menu for mobile device';
+comment on column profile_mobile.pmo_id is 'primary key';
+comment on column profile_mobile.me_code is 'Code of menu_ref to execute';
+comment on column profile_mobile.pmo_order is 'item order in menu';
+comment on column profile_mobile.p_id is 'Profile id ';
+comment on column profile_mobile.pmo_default is 'possible values are 1 , the default HTML header (javascript,CSS,...) is loaded , 0 nothing is loaded from noalyss ';
+
+insert into profile_mobile (p_id,me_code,pmo_order) select p_id , 'AGENDA',10 from profile;
+insert into profile_mobile (p_id,me_code,pmo_order) select p_id , 'LOGOUT',20 from profile;
+
+
+insert into version (val,v_description) values (164,'Menu for small device : mobile');
+commit ;
diff --git a/include/template/calendar.php b/include/template/calendar.php
index 88effb67f..e402e4e8e 100644
--- a/include/template/calendar.php
+++ b/include/template/calendar.php
@@ -23,7 +23,8 @@ $nDay=$nFirstDay;
for ($i=0;$i<=6;$i++){
echo "