Source for file model.php

Documentation is available at model.php

  1. <?php
  2.  
  3.  
  4. /**
  5.  * Project:     deskweb - the desktop manager for web <br />
  6.  * 
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * This library is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with this library; if not, write to the Free Software
  19.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20.  *
  21.  * You may contact the authors of Deskweb by emial at: <br />
  22.  * io@maxb.net <br />
  23.  *
  24.  * Or, write to: <br />
  25.  * Massimiliano Balestrieri <br />
  26.  * Via Casalis 9 <br />
  27.  * 10143 Torino <br />
  28.  * Italy <br />
  29.  *
  30.  * The latest version of deskweb can be obtained from: <br />
  31.  * http://www.deskweb.org/ <br />
  32.  *
  33.  * @link http://www.deskweb.org/
  34.  * @author Massimiliano Balestrieri <io@maxb.net>
  35.  * @version 0.1
  36.  * @copyright 2005-2006 Massimiliano Balestrieri.
  37.  * @package Core
  38.  */
  39.  
  40. /**
  41.  * Classe Modello Deskweb
  42.  * questa classe contiene i dati che servono a deskweb
  43.  */
  44. class ModelDeskWeb {
  45.  
  46.     /*
  47.      * array menu contenuto nel db
  48.      */
  49.     var $arr_menu = array ();
  50.     /*
  51.      * array menujs contenuto nel db
  52.      */
  53.     var $arr_menujs = array ();
  54.     /*
  55.      * array contenente la navigazione
  56.      */
  57.     var $id_contents = array ();
  58.     /*
  59.      * array contenente i dati delle applicazioni aperte
  60.      */
  61.     var $arr_contents = null;
  62.  
  63.     /*
  64.      * Class constructor
  65.      * la classe istanzia
  66.      * 
  67.      * il menu statico/db
  68.      * le sezioni 
  69.      * 
  70.      */
  71.     function ModelDeskWeb($last false{
  72.  
  73.         global $request$session;
  74.         $this->arr_menu = $this->_loadMenu();
  75.         if ($last{
  76.             $this->id_contents = array ($request->id);
  77.         else {
  78.             $this->id_contents = array_keys($session->getActive());
  79.         }
  80.  
  81.         $this->arr_contents = $this->_loadContents($this->id_contents);
  82.  
  83.         if ($session->getJavascript()) {
  84.             $this->arr_menujs = $this->_loadMenuJs();
  85.         }
  86.  
  87.     }
  88.     /**
  89.      * metodo statico
  90.      * restituisce il parent
  91.      */
  92.     function getParent($id{
  93.  
  94.         $sql "select fk_parent,is_sys from ".PREFIX_DB."node where  id_node='".$id."'";
  95.         $fk MySqlDao :: getDati($sql);
  96.         //echo $id[0]['fk_parent'];
  97.         if (isset ($fk[0]['fk_parent']&& $fk[0]['is_sys'== 0)
  98.             return $fk[0]['fk_parent'];
  99.         else
  100.             return $id;
  101.     }
  102.     /**
  103.      * metodo statico
  104.      * funzione beta per ricavare l'albero partendo da un nodo
  105.      */
  106.     function getTree($id$tree$is_parent false{
  107.  
  108.         if (is_array($id)) {
  109.             for ($x 0$x <= sizeof($id1$x ++{
  110.                 ModelDeskWeb :: getTree($id[$x]$tree);
  111.             }
  112.         }
  113.         //destinazione (pattern per la sostituzione)
  114.         if ($is_parent == false)
  115.             $parent "{destination}";
  116.         else
  117.             $parent "{".$id."}";
  118.         // campi sql
  119.         $fields "node, id_dom, type, application, window, fk_parent, icon, content, fk_menu, order_menu, last_date, is_sys, have_child, permissions, fk_user, fk_group";
  120.         // estraggo il padre o i figli
  121.         if ($is_parent == false)
  122.             $sql "select * from ".PREFIX_DB."node where id_node ='".$id."'";
  123.         else
  124.             $sql "select * from ".PREFIX_DB."node where fk_parent ='".$id."' order by have_child desc";
  125.  
  126.         $temp MySqlDao :: getDati($sql);
  127.         //print_r($temp);die();
  128.         for ($x 0$x <= sizeof($temp1$x ++{
  129.             //setto la destinazione
  130.             $temp[$x]['fk_parent'$parent;
  131.             $values $temp[$x];
  132.             $values MySqlDao :: addSlashes($values);
  133.             //rimuovo id
  134.             unset ($values['id_node']);
  135.  
  136.             $values join(","$values);
  137.             $temp[$x]['clone'"insert into ".PREFIX_DB."node (".$fields.") values(".$values.")";
  138.  
  139.             $temp2 array ('id_node' => $temp[$x]['id_node']'fk_parent' => $temp[$x]['fk_parent']'clone' => $temp[$x]['clone']);
  140.  
  141.             $tree[$temp2;
  142.  
  143.             if ($temp[$x]['have_child'== 1)
  144.                 ModelDeskWeb :: getTree($temp[$x]['id_node']$treetrue);
  145.  
  146.         }
  147.         return $tree;
  148.     }
  149.     /**
  150.      * metodo statico
  151.      * funzione beta per ricavare l'albero partendo da un nodo
  152.      * restituisce solo gli id (serve all'eliminazione)
  153.      */
  154.     function getTreeId($id$tree$is_parent false{
  155.  
  156.         if (is_array($id)) {
  157.             for ($x 0$x <= sizeof($id1$x ++{
  158.                 ModelDeskWeb :: getTreeId($id[$x]$tree);
  159.             }
  160.         }
  161.  
  162.         if ($is_parent == false)
  163.             $sql "select id_node,have_child from ".PREFIX_DB."node where id_node ='".$id."'";
  164.         else
  165.             $sql "select id_node,have_child from ".PREFIX_DB."node where fk_parent ='".$id."' order by have_child desc";
  166.  
  167.         $temp MySqlDao :: getDati($sql);
  168.  
  169.         for ($x 0$x <= sizeof($temp1$x ++{
  170.             $tree[$temp[$x]['id_node'];
  171.             //trovo i figli
  172.             if ($temp[$x]['have_child'== 1)
  173.                 ModelDeskWeb :: getTreeId($temp[$x]['id_node']$treetrue);
  174.         }
  175.         return $tree;
  176.     }
  177.     /**
  178.      * funzione pubblica statica
  179.      * verifica che una sezione sia leggibile
  180.      */
  181.     function isReadable($id_sezione{
  182.         $sql "select id_node from ".PREFIX_DB."node where id_node = '"$id_sezione ."' and".ModelDeskWeb :: _getSqlRealm(true);
  183.         $dati MySqlDao :: getDati($sql);
  184.         if (isset ($dati[0]['id_node']))
  185.             return true;
  186.         else
  187.             return false;
  188.     }
  189.     /**
  190.      * funzione pubblica statica
  191.      * verifica che una sezione sia scrivibile
  192.      */
  193.     function isWriteable($id_sezione{
  194.         
  195.         $sql "select id_node from ".PREFIX_DB."node where id_node = '"$id_sezione ."' and".ModelDeskWeb :: _getSqlRealm($static true$writable true);
  196.         //echo $sql;
  197.         $dati MySqlDao :: getDati($sql);
  198.         if (isset ($dati[0]['id_node']))
  199.             return true;
  200.         else
  201.             return false;
  202.             
  203.         
  204.     }
  205.     /**
  206.      * funzione pubblica statica
  207.      * verifica se l'utente sia il proprietario della sezione
  208.      */
  209.     function isOwner($id_sezione{
  210.         $sql "select id_node,fk_user,is_sys from ".PREFIX_DB."node where id_node ='".$id_sezione."'";
  211.         $temp MySqlDao :: getDati($sql);
  212.  
  213.         global $session;
  214.         $user $session->getCurrentUser();
  215.         if ($user == $temp[0]['fk_user'&& $temp[0]['is_sys'== 0{
  216.             return true;
  217.         else
  218.             return false;
  219.     }
  220.     /*
  221.      * metodi pubblici 
  222.      */
  223.     function is_sys($id_sezione{
  224.         $sql "select is_sys from ".PREFIX_DB."node where id_node='".$id_sezione."'";
  225.         $dati MySqlDao :: getDati($sql);
  226.         return $dati[0]['is_sys'];
  227.     }
  228.     /*
  229.     * carica il menu js
  230.      */
  231.     function _loadMenuJs({
  232.         global $session;
  233.         $idmenu_app 1;
  234.         $idmenu_places 2;
  235.         $idmenu_sys 3;
  236.  
  237.         $user $session->getCurrentUser();
  238.         $group $session->getCurrentGroup();
  239.         // 2 livelli di profondità
  240.         // padri
  241.         $sql "select id_node,node,icon,type,fk_parent,have_child,fk_menu  from ".PREFIX_DB."node where fk_parent in(".$idmenu_app.",".$idmenu_places.",".$idmenu_sys.") and ".$this->_getSqlRealm();
  242.         $padri MySqlDao :: getDati($sql);
  243.         if (is_array($padri)) {
  244.             for ($x 0$x <= sizeof($padri1$x ++{
  245.                 $ids[$padri[$x]['id_node'];
  246.             }
  247.             //print_r($padri);
  248.             $id_padri join($ids",");
  249.             // figli
  250.             $sql "select id_node,node,icon,type,fk_parent,have_child from ".PREFIX_DB."node where fk_parent in(".$id_padri.") and ".$this->_getSqlRealm();
  251.             $figli MySqlDao :: getDati($sql);
  252.             // figli
  253.  
  254.             return $menujs array ('padri' => $padri'figli' => $figli);
  255.         }
  256.     }
  257.     function _getSqlRealm($static false$checkwritable false{
  258.         if (!$static{
  259.             global $session;
  260.             $user $session->getCurrentUser();
  261.             $group $session->getCurrentGroup();
  262.         else {
  263.             $user $_SESSION['AUTH']['USER'];
  264.             $group $_SESSION['AUTH']['GROUP'];
  265.         }
  266.         // compongo l'sql per l'estrazione sicura dei dati
  267.         // 1) is_owner
  268.         $sql_owner " (fk_user = '".$user."')";
  269.         // 2) is_group and is readable from group
  270.         $sql_group " (fk_group = '".$group."' and substring(permissions,4,1) = 'r')";
  271.         // 5) is public readable
  272.         $sql_public_read "(substring(permissions,7,1) = 'r')";
  273.         
  274.         $sql_write "";
  275.         if($checkwritable){
  276.         // and 
  277.         $sql_write .= " and (";
  278.         // 6) is_group writable
  279.         $sql_group_writable " (fk_group = '".$group."' and substring(permissions,5,1) = 'w') ";
  280.         // 7) is_public wirtable 
  281.         $sql_public_writable "(substring(permissions,8,1) = 'w')";
  282.         
  283.         $sql_write .= $sql_owner " or " $sql_group_writable " or ".  $sql_public_writable " )";
  284.         }
  285.         //union policy
  286.         $sql $sql_owner." or ".$sql_group." or ".$sql_public_read;
  287.         return "(".$sql.")".$sql_write;
  288.     }
  289.     /*
  290.      * carica il menu
  291.      */
  292.     function _loadMenu({
  293.         global $session;
  294.         $user $session->getCurrentUser();
  295.         $sql "select id_node,node,icon,type,id_dom,fk_menu from ".PREFIX_DB."node where fk_menu>0 and ".$this->_getSqlRealm();
  296.         //(fk_user = '".$user."' or (fk_user = 0 and fk_group = 0)) order by fk_menu,order_menu";
  297.         return MySqlDao :: getDati($sql);
  298.     }
  299.     /*
  300.      * carica i dati delle applicazioni in memoria
  301.      */
  302.     function _loadContents($id_contents{
  303.         $ids implode(","$id_contents);
  304.         if (strlen($ids0{
  305.             $sql "select id_node,node,type,application,window,icon,permissions,fk_user,fk_group,have_child,last_date,username,groupname from ".PREFIX_DB."node,".PREFIX_DB."users ,".PREFIX_DB."groups where id_user = fk_user and id_group = fk_group and id_node in(".$ids.") and ".$this->_getSqlRealm();
  306.             $dati MySqlDao :: getDati($sql);
  307.  
  308.             //$this->_checkPermissions($dati, "fathers");
  309.  
  310.             for ($x 0$x <= count($dati1$x ++{
  311.                 global $session;
  312.                 $apps $session->getActiveDeskwebApps();
  313.                 $session->addDeskwebApp($dati[$x]['application']);
  314.  
  315.                 if ($dati[$x]['have_child'== 1{
  316.                     $sql "select id_node,node,icon,type,id_dom,permissions,fk_user,fk_group,last_date,username,groupname from ".PREFIX_DB."node ,".PREFIX_DB."users ,".PREFIX_DB."groups where id_user = fk_user and id_group = fk_group and fk_parent ='".$dati[$x]['id_node']."' and ".$this->_getSqlRealm()." order by type,node";
  317.                     $dati[$x]['sons'MySqlDao :: getDati($sql);
  318.                     //$this->_checkPermissions($dati[$x]['sons'], "sons");
  319.                 }
  320.             }
  321.             return $dati;
  322.         }
  323.  
  324.     }
  325.     /*
  326.      * verifica i permessi delle sezioni e restituisce le sezioni che l'utente 
  327.      * è abilitato a vedere
  328.      * 
  329.      * todo:
  330.      * nelle richieste ajax non ricordo se questo metodo venga invocato
  331.      */
  332.     function _checkPermissions($dati$livello{
  333.         if ($this->_isRoot())
  334.             return;
  335.         $arr_uscita array ();
  336.         for ($x 0$x <= count($dati1$x ++{
  337.             if (!$this->_isReadable($dati[$x]$livello))
  338.                 $arr_uscita[$x;
  339.         }
  340.         for ($x 0$x <= count($arr_uscita1$x ++{
  341.             //if ($livello == "ids" && isset ($_SESSION['id_sezioni'][SessionDeskWeb :: pos_array($_SESSION['id_sezioni'], $dati[$arr_uscita[$x]]['id_node'])])) {
  342.             //    session_start();
  343.             //    unset ($_SESSION['id_sezioni'][SessionDeskWeb :: pos_array($_SESSION['id_sezioni'], $dati[$arr_uscita[$x]]['id_node'])]);
  344.             //    session_write_close();
  345.             //}
  346.             //unset ($dati[$arr_uscita[$x]]);
  347.         }
  348.         if (count($dati0);
  349.         //sort($dati);
  350.         if (count($dati== 0)
  351.             $dati null;
  352.     }
  353.     /*
  354.      * verifica se l'utente è root
  355.      * 
  356.      * todo:
  357.      * verificare quale sia l'id da assegnare a root (penso che alla fine sarà 1)
  358.      */
  359.     function _isRoot({
  360.         global $session;
  361.         $user $session->getCurrentUser();
  362.         if ($user == 1)
  363.             return true;
  364.         else
  365.             return false;
  366.     }
  367.     /*
  368.      * verifica se l'utente sia il proprietario della sezione
  369.      */
  370.     function _isOwner($dato{
  371.         global $session;
  372.         $user $session->getCurrentUser();
  373.         if ($user == $dato || $dato == 0{
  374.             return true;
  375.         else
  376.             return false;
  377.     }
  378.     /*
  379.      * verifica se l'utente appartenga al gruppo della sezione
  380.      * 
  381.      * todo:
  382.      * implementare le politiche e la gestione dei gruppi
  383.      */
  384.     function _isGroup($dato{
  385.         global $session;
  386.         $group $session->getCurrentGroup();
  387.         if ($group == $dato || $dato == 0)
  388.             return true;
  389.         else
  390.             return false;
  391.     }
  392.     /*
  393.      * verifica che una sezione sia leggibile
  394.      */
  395.     function _isReadable($dati$livello{
  396.         //se è una directory
  397.         if ($dati['type'== 'dir'{
  398.             if ($dati['permissions'][6== 'r' && $livello == "sons"{
  399.                 return true;
  400.             }
  401.             elseif ($dati['permissions'][8== 'x' && $livello == "fathers"{
  402.                 return true;
  403.             }
  404.             elseif ($dati['permissions'][5== 'x' and $this->_isGroup($dati['fk_group'])) {
  405.                 return true;
  406.             }
  407.             elseif ($dati['permissions'][2== 'x' and $this->_isOwner($dati['fk_user'])) {
  408.                 return true;
  409.             else {
  410.                 return false;
  411.             }
  412.         else {
  413.             if ($dati['permissions'][6== 'r'{
  414.                 return true;
  415.             }
  416.             elseif ($dati['permissions'][3== 'r' and $this->_isGroup($dati['fk_group'])) {
  417.                 return true;
  418.             }
  419.             elseif ($dati['permissions'][0== 'r' and $this->_isOwner($dati['fk_user'])) {
  420.                 return true;
  421.             else {
  422.                 return false;
  423.             }
  424.         }
  425.     }
  426.  
  427. }
  428. ?>

Documentation generated on Sun, 18 Jun 2006 23:16:54 +0200 by phpDocumentor 1.3.0RC6