tbrehm
2013-08-22 ec571625a4dee99acff1a2cef75a48aa57df82cb
interface/lib/classes/remoting.inc.php
@@ -1,7 +1,7 @@
<?php
/*
Copyright (c) 2007, Till Brehm, projektfarm Gmbh
Copyright (c) 2007 - 2011, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -26,6 +26,12 @@
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--UPDATED 08.2009--
Full SOAP support for ISPConfig 3.1.4 b
Updated by Arkadiusz Roch & Artur Edelman
Copyright (c) Tri-Plex technology
*/
class remoting {
@@ -33,8 +39,12 @@
   //* remote session timeout in seconds
   private $session_timeout = 600;
   
   private $server;
   public $oldDataRecord;
   public $dataRecord;
   public $id;
   
    private $_methods = array();
   /*
   These variables shall stay global. 
   Please do not make them private variables.
@@ -43,30 +53,44 @@
    private $conf;
    */
    public function __construct()
    public function __construct($methods = array())
    {
        global $server;
        $this->server = $server;
        global $app;
        $app->uses('remoting_lib');
        $this->_methods = $methods;
      /*
        $this->app = $app;
        $this->conf = $conf;
      */
    }
   //* remote login function
    //* remote login function
   public function login($username, $password)
    {
      global $app, $conf, $server;
      global $app, $conf;
      // Maintenance mode
      $app->uses('ini_parser,getconf');
      $server_config_array = $app->getconf->get_global_config('misc');
      if($server_config_array['maintenance_mode'] == 'y'){
         throw new SoapFault('maintenance_mode', 'This ISPConfig installation is currently under maintenance. We should be back shortly. Thank you for your patience.');
         return false;
      }
      
      if(empty($username)) {
         $this->server->fault('login_username_empty', 'The login username is empty');
         throw new SoapFault('login_username_empty', 'The login username is empty.');
         return false;
      }
      
      if(empty($password)) {
         $this->server->fault('login_password_empty', 'The login password is empty');
         throw new SoapFault('login_password_empty', 'The login password is empty.');
         return false;
      }
      //* Delete old remoting sessions
      $sql = "DELETE FROM remote_session WHERE tstamp < ".time();
      $app->db->query($sql);
      
      $username = $app->db->quote($username);
      $password = $app->db->quote($password);
@@ -86,7 +110,7 @@
         $app->db->query($sql);
         return $remote_session;
      } else {
         $this->server->fault('login_failed', 'The login failed. Username or password wrong.');
         throw new SoapFault('login_failed', 'The login failed. Username or password wrong.');
         return false;
      }
      
@@ -98,7 +122,7 @@
      global $app;
      
      if(empty($session_id)) {
         $this->server->fault('session_id_empty', 'The SessionID is empty.');
         throw new SoapFault('session_id_empty', 'The SessionID is empty.');
         return false;
      }
      
@@ -109,163 +133,246 @@
        return ($app->db->affectedRows() == 1);
   }
   
   //* Get mail domain details
   public function mail_domain_get($session_id, $domain_id)
   //** protected functions -----------------------------------------------------------------------------------
   protected function klientadd($formdef_file, $reseller_id, $params)
    {
      if(!$this->checkPerm($session_id, 'mail_domain_get')) {
         $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
      global $app;
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      //* load the user profile of the client
      $app->remoting_lib->loadUserProfile($reseller_id);
      //* Get the SQL query
      $sql = $app->remoting_lib->getSQL($params,'INSERT',0);
      //* Check if no system user with that username exists
      $username = $app->db->quote($params["username"]);
      $tmp = $app->db->queryOneRecord("SELECT count(userid) as number FROM sys_user WHERE username = '$username'");
      if($tmp['number'] > 0) $app->remoting_lib->errorMessage .= "Duplicate username<br />";
      //* Stop on error while preparing the sql query
      if($app->remoting_lib->errorMessage != '') {
         throw new SoapFault('data_processing_error', $app->remoting_lib->errorMessage);
         return false;
      }
      $app->uses('remoting_lib');
      $app->remoting_lib->loadFormDef('../mail/form/mail_domain.tform.php');
      return $app->remoting_lib->getDataRecord($domain_id);
   }
   //* Add a mail domain
   public function mail_domain_add($session_id, $client_id, $params)
    {
      if(!$this->checkPerm($session_id, 'mail_domain_add')) {
         $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
      //* Execute the SQL query
      $app->db->query($sql);
      $insert_id = $app->db->insertID();
      //* Stop on error while executing the sql query
      if($app->remoting_lib->errorMessage != '') {
         throw new SoapFault('data_processing_error', $app->remoting_lib->errorMessage);
         return false;
      }
      $domain_id = $this->insertQuery('../mail/form/mail_domain.tform.php',$client_id,$params);
      return $domain_id;
   }
   //* Update a mail domain
   public function mail_domain_update($session_id, $client_id, $domain_id, $params)
    {
      if(!$this->checkPerm($session_id, 'mail_domain_update')) {
         $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
      $this->id = $insert_id;
      $this->dataRecord = $params;
      $app->plugin->raiseEvent('client:' . (isset($params['limit_client']) && $params['limit_client'] > 0 ? 'reseller' : 'client') . ':on_after_insert',$this);
      /*
      if($app->db->errorMessage != '') {
         throw new SoapFault('database_error', $app->db->errorMessage . ' '.$sql);
         return false;
      }
      $affected_rows = $this->updateQuery('../mail/form/mail_domain.tform.php',$client_id,$domain_id,$params);
      return $affected_rows;
   }
   //* Delete a mail domain
   public function mail_domain_delete($session_id, $domain_id)
    {
      if(!$this->checkPerm($session_id, 'mail_domain_delete')) {
         $this->server->fault('permission_denied', 'You do not have the permissions to access this function.');
         return false;
      */
        /* copied from the client_edit php */
      exec('ssh-keygen -t rsa -C '.$username.'-rsa-key-'.time().' -f /tmp/id_rsa -N ""');
      $app->db->query("UPDATE client SET created_at = ".time().", id_rsa = '".$app->db->quote(@file_get_contents('/tmp/id_rsa'))."', ssh_rsa = '".$app->db->quote(@file_get_contents('/tmp/id_rsa.pub'))."' WHERE client_id = ".$this->id);
      exec('rm -f /tmp/id_rsa /tmp/id_rsa.pub');
      //$app->uses('tform');
      //* Save changes to Datalog
      if($app->remoting_lib->formDef["db_history"] == 'yes') {
         $new_rec = $app->remoting_lib->getDataRecord($insert_id);
         $app->remoting_lib->datalogSave('INSERT',$primary_id,array(),$new_rec);
         $app->remoting_lib->ispconfig_sysuser_add($params,$insert_id);
            if($reseller_id) {
                $client_group = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = ".$insert_id);
                $reseller_user = $app->db->queryOneRecord("SELECT * FROM sys_user WHERE client_id = ".$reseller_id);
                $app->auth->add_group_to_user($reseller_user['userid'], $client_group['groupid']);
                $app->db->query("UPDATE client SET parent_client_id = ".$reseller_id." WHERE client_id = ".$insert_id);
            }
      }
      $affected_rows = $this->updateQuery('../mail/form/mail_domain.tform.php',$domain_id);
      return $affected_rows;
      return $insert_id;
   }
   //** private functions -----------------------------------------------------------------------------------
   private function insertQuery($formdef_file, $client_id, $params)
    protected function insertQuery($formdef_file, $client_id, $params,$event_identifier = '')
    {
        $sql = $this->insertQueryPrepare($formdef_file, $client_id, $params);
        if($sql !== false) return $this->insertQueryExecute($sql, $params,$event_identifier);
        else return false;
    }
   protected function insertQueryPrepare($formdef_file, $client_id, $params)
    {
      global $app;
      
      $app->uses('remoting_lib');
      
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      //* load the user profile of the client
      $app->remoting_lib->loadUserProfile($client_id);
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      
      //* Get the SQL query
      $sql = $app->remoting_lib->getSQL($params,'INSERT',0);
      if($app->remoting_lib->errorMessage != '') {
         $this->server->fault('data_processing_error', $app->remoting_lib->errorMessage);
         throw new SoapFault('data_processing_error', $app->remoting_lib->errorMessage);
         return false;
      }
      $app->log('Executed insertQueryPrepare', LOGLEVEL_DEBUG);
        return $sql;
   }
   protected function insertQueryExecute($sql, $params,$event_identifier = '')
    {
      global $app;
      
      $app->uses('remoting_lib');
      $app->db->query($sql);
      
      if($app->db->errorMessage != '') {
         $this->server->fault('database_error', $app->db->errorMessage . ' '.$sql);
         throw new SoapFault('database_error', $app->db->errorMessage . ' '.$sql);
         return false;
      }
      
      $insert_id = $app->db->insertID();
      
      // set a few values for compatibility with tform actions, mostly used by plugins
      $this->id = $insert_id;
      $this->dataRecord = $params;
      $app->log('Executed insertQueryExecute, raising events now if any: ' . $event_identifier, LOGLEVEL_DEBUG);
      if($event_identifier != '') $app->plugin->raiseEvent($event_identifier,$this);
      //$app->uses('tform');
      //* Save changes to Datalog
      if($app->remoting_lib->formDef["db_history"] == 'yes') {
         $new_rec = $app->remoting_lib->getDataRecord($insert_id);
         $app->tform->datalogSave('INSERT',$primary_id,array(),$new_rec);
      }
         $app->remoting_lib->datalogSave('INSERT',$primary_id,array(),$new_rec);
      }
      return $insert_id;
   }
   protected function updateQuery($formdef_file, $client_id, $primary_id, $params, $event_identifier = '')
    {
      global $app;
      $sql = $this->updateQueryPrepare($formdef_file, $client_id, $primary_id, $params);
        if($sql !== false) return $this->updateQueryExecute($sql, $primary_id, $params,$event_identifier);
        else return false;
   }
   
   private function updateQuery($formdef_file, $client_id, $primary_id, $params)
   protected function updateQueryPrepare($formdef_file, $client_id, $primary_id, $params)
    {
      global $app;
      
      $app->uses('remoting_lib');
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      
      //* load the user profile of the client
      $app->remoting_lib->loadUserProfile($client_id);
      
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      //* Get the SQL query
      $sql = $app->remoting_lib->getSQL($params,'UPDATE',$primary_id);
      // throw new SoapFault('debug', $sql);
      if($app->remoting_lib->errorMessage != '') {
         $this->server->fault('data_processing_error', $app->remoting_lib->errorMessage);
         throw new SoapFault('data_processing_error', $app->remoting_lib->errorMessage);
         return false;
      }
      
      $old_rec = $app->remoting_lib->getDataRecord($primary_id);
      $app->db->query($sql);
      if($app->db->errorMessage != '') {
         $this->server->fault('database_error', $app->db->errorMessage . ' '.$sql);
         return false;
      }
      $affected_rows = $app->db->affectedRows();
      //* Save changes to Datalog
      if($app->remoting_lib->formDef["db_history"] == 'yes') {
         $new_rec = $app->remoting_lib->getDataRecord($primary_id);
         $app->tform->datalogSave('UPDATE',$primary_id,$old_rec,$new_rec);
      }
      return $affected_rows;
        return $sql;
   }
   private function deleteQuery($formdef_file, $primary_id)
   protected function updateQueryExecute($sql, $primary_id, $params, $event_identifier = '')
    {
      global $app;
      
      $app->uses('remoting_lib');
      
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      $old_rec = $app->remoting_lib->getDataRecord($primary_id);
      
      //* Get the SQL query
      $sql = $app->remoting_lib->getDeleteSQL($primary_id);
      // set a few values for compatibility with tform actions, mostly used by plugins
      $this->oldDataRecord = $old_rec;
      $this->id = $primary_id;
      $this->dataRecord = $params;
      
      $app->db->query($sql);
      
      if($app->db->errorMessage != '') {
         $this->server->fault('database_error', $app->db->errorMessage . ' '.$sql);
         throw new SoapFault('database_error', $app->db->errorMessage . ' '.$sql);
         return false;
      }
      
      $affected_rows = $app->db->affectedRows();
      $app->log('Executed updateQueryExecute, raising events now if any: ' . $event_identifier, LOGLEVEL_DEBUG);
      if($event_identifier != '') $app->plugin->raiseEvent($event_identifier,$this);
      
      //* Save changes to Datalog
      if($app->remoting_lib->formDef["db_history"] == 'yes') {
         $rec = $app->remoting_lib->getDataRecord($primary_id);
         $app->tform->datalogSave('DELETE',$primary_id,$rec,array());
         $new_rec = $app->remoting_lib->getDataRecord($primary_id);
         $app->remoting_lib->datalogSave('UPDATE',$primary_id,$old_rec,$new_rec);
      }
      return $affected_rows;
   }
   protected function deleteQuery($formdef_file, $primary_id, $event_identifier = '')
    {
      global $app;
      $app->uses('remoting_lib');
      //* load the user profile of the client
      $app->remoting_lib->loadUserProfile(0);
      //* Load the form definition
      $app->remoting_lib->loadFormDef($formdef_file);
      $old_rec = $app->remoting_lib->getDataRecord($primary_id);
      // set a few values for compatibility with tform actions, mostly used by plugins
      $this->oldDataRecord = $old_rec;
      $this->id = $primary_id;
      $this->dataRecord = $old_rec;
      $app->log('Executed deleteQuery, raising events now if any: ' . $event_identifier, LOGLEVEL_DEBUG);
      //$this->dataRecord = $params;
      //* Get the SQL query
      $sql = $app->remoting_lib->getDeleteSQL($primary_id);
      $app->db->errorMessage = '';
      $app->db->query($sql);
      $affected_rows = $app->db->affectedRows();
      if($app->db->errorMessage != '') {
         throw new SoapFault('database_error', $app->db->errorMessage . ' '.$sql);
         return false;
      }
      if($event_identifier != '') {
         $app->plugin->raiseEvent($event_identifier,$this);
      }
      //* Save changes to Datalog
      if($app->remoting_lib->formDef["db_history"] == 'yes') {
         $app->remoting_lib->datalogSave('DELETE',$primary_id,$old_rec,array());
      }
      
      
@@ -273,22 +380,30 @@
   }
   
   
   private function checkPerm($session_id, $function_name)
   protected function checkPerm($session_id, $function_name)
    {
      $session = $this->getSession($session_id);
        global $app;
   $dobre=array();
   $session = $this->getSession($session_id);
        if(!$session){
            return false;
        }
      return in_array($function_name, explode(',', $session['remote_functions']) );
      $dobre= str_replace(';',',',$session['remote_functions']);
      $check = in_array($function_name, explode(',', $dobre) );
      if(!$check) {
        $app->log("REMOTE-LIB DENY: ".$session_id ." /". $function_name, LOGLEVEL_WARN);
      }
      return $check;
   }
   
   
   private function getSession($session_id)
   protected function getSession($session_id)
    {   
      global $app;
      
      if(empty($session_id)) {
         $this->server->fault('session_id_empty','The SessionID is empty.');
         throw new SoapFault('session_id_empty','The SessionID is empty.');
         return false;
      }
      
@@ -300,10 +415,26 @@
      if($session['remote_userid'] > 0) {
         return $session;
      } else {
         $this->server->fault('session_does_not_exist','The Session is expired or does not exist.');
         throw new SoapFault('session_does_not_exist','The Session is expired or does not exist.');
         return false;
      }
   }
   /**
      * Get a list of functions
      * @param    int      session id
      * @return   mixed   array of the available functions
    * @author   Julio Montoya <gugli100@gmail.com> BeezNest 2010
    */
    public function get_function_list($session_id)
    {
        if(!$this->checkPerm($session_id, 'get_function_list')) {
         throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
         return false;
        }
        return $this->_methods;
    }
}
?>
?>