Exemplo n.º 1
0
 private static function create($token_)
 {
     Logger::debug('main', 'Starting Abstract_Token::create for \'' . $token_->id . '\'');
     if (Abstract_Token::exists($token_->id)) {
         Logger::error('main', 'Abstract_Token::create(\'' . $token_->id . '\') token already exists');
         return false;
     }
     $SQL = SQL::getInstance();
     $SQL->DoQuery('INSERT INTO @1 (@2) VALUES (%3)', $SQL->prefix . 'tokens', 'id', $token_->id);
     return true;
 }
Exemplo n.º 2
0
/**
 * Copyright (C) 2008-2013 Ulteo SAS
 * http://www.ulteo.com
 * Author Julien LANGLOIS <*****@*****.**> 2008-2013
 * Author Laurent CLOUET <*****@*****.**> 2008-2011
 * Author Jeremy DESVAGES <*****@*****.**> 2008-2011
 * Author Vincent ROULLIER <*****@*****.**> 2013
 * Author David LECHEVALIER <*****@*****.**> 2012
 * Author David PHAM-VAN <*****@*****.**> 2013
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; version 2
 * of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 **/
function init_db($prefs_)
{
    // prefs must be valid
    Logger::debug('main', 'init_db');
    $modules_enable = $prefs_->get('general', 'module_enable');
    foreach ($modules_enable as $module_name) {
        if (!is_null($prefs_->get($module_name, 'enable'))) {
            $enable = $prefs_->get($module_name, 'enable');
            if (is_string($enable)) {
                $mod_name = $module_name . '_' . $enable;
                $ret_eval = call_user_func(array($mod_name, 'init'), $prefs_);
                if ($ret_eval !== true) {
                    Logger::error('main', 'init_db init module \'' . $mod_name . '\' failed');
                    return false;
                }
            } elseif (is_array($enable)) {
                foreach ($enable as $sub_module) {
                    $mod_name = $module_name . '_' . $sub_module;
                    $ret_eval = call_user_func(array($mod_name, 'init'), $prefs_);
                    if ($ret_eval !== true) {
                        Logger::error('main', 'init_db init module \'' . $mod_name . '\' failed');
                        return false;
                    }
                }
            }
        }
    }
    Logger::debug('main', 'init_db modules inited');
    // Init of Abstract
    Abstract_Server::init($prefs_);
    Abstract_ServersGroup::init($prefs_);
    Abstract_Session::init($prefs_);
    Abstract_Token::init($prefs_);
    Abstract_News::init($prefs_);
    Abstract_Script::init($prefs_);
    Abstract_Liaison::init($prefs_);
    if (class_exists("PremiumManager")) {
        PremiumManager::initdb($prefs_);
    }
    Abstract_Task::init($prefs_);
    Abstract_ReportServer::init($prefs_);
    Abstract_ReportSession::init($prefs_);
    Abstract_User_Preferences::init($prefs_);
    Abstract_UserGroup_Preferences::init($prefs_);
    Abstract_UserGroup_Rule::init($prefs_);
    Abstract_VDI::init($prefs_);
    Abstract_Network_Folder::init($prefs_);
    Abstract_AdminAction::init($prefs_);
    return true;
}
Exemplo n.º 3
0
 public static function delete($id_)
 {
     Logger::debug('main', 'Starting Abstract_Session::delete for \'' . $id_ . '\'');
     $SQL = SQL::getInstance();
     $id = $id_;
     $SQL->DoQuery('SELECT 1 FROM @1 WHERE @2 = %3 LIMIT 1', $SQL->prefix . 'sessions', 'id', $id);
     $total = $SQL->NumRows();
     if ($total == 0) {
         Logger::error('main', "Abstract_Session::delete({$id_}) session does not exist (NumRows == 0)");
         return false;
     }
     $SQL->DoQuery('DELETE FROM @1 WHERE @2 = %3 LIMIT 1', $SQL->prefix . 'sessions', 'id', $id);
     Abstract_Liaison::delete('ServerSession', NULL, $id_);
     $tokens = Abstract_Token::load_by_session($id_);
     foreach ($tokens as $token) {
         Abstract_Token::delete($token->id);
     }
     return true;
 }
Exemplo n.º 4
0
         }
         if (!$server->orderFSAccessEnable($user_login_fs, $user_password_fs, $v)) {
             Logger::error('main', '(client/start) Cannot enable FS access for User \'' . $user->getAttribute('login') . '\' on Server \'' . $server->fqdn . '\', aborting');
             $session->orderDeletion(true, Session::SESSION_END_STATUS_ERROR);
             throw_response(INTERNAL_ERROR);
         }
     }
 }
 $prepare_servers = array();
 if ($session->mode == Session::MODE_DESKTOP) {
     if ($session->mode == Session::MODE_DESKTOP && isset($remote_desktop_settings) && array_key_exists('allow_external_applications', $remote_desktop_settings) && $remote_desktop_settings['allow_external_applications'] == 1 && count($session->servers[Server::SERVER_ROLE_APS]) > 1) {
         $external_apps_token = new Token(gen_unique_string());
         $external_apps_token->type = 'external_apps';
         $external_apps_token->link_to = $session->id;
         $external_apps_token->valid_until = 0;
         Abstract_Token::save($external_apps_token);
     }
     $prepare_servers[] = $session->server;
 }
 if ($session->mode == Session::MODE_APPLICATIONS || $session->mode == Session::MODE_DESKTOP && isset($remote_desktop_settings) && array_key_exists('allow_external_applications', $remote_desktop_settings) && $remote_desktop_settings['allow_external_applications'] == 1) {
     foreach ($session->servers[Server::SERVER_ROLE_APS] as $fqdn => $data) {
         if ($session->mode == Session::MODE_DESKTOP && isset($remote_desktop_settings) && array_key_exists('allow_external_applications', $remote_desktop_settings) && $remote_desktop_settings['allow_external_applications'] == 1 && $fqdn == $session->server) {
             continue;
         }
         $prepare_servers[] = $fqdn;
     }
 }
 $count_prepare_servers = 0;
 foreach ($prepare_servers as $prepare_server) {
     $count_prepare_servers++;
     $server = Abstract_Server::load($prepare_server);
Exemplo n.º 5
0
function return_error($errno_, $errstr_)
{
    header('Content-Type: text/xml; charset=utf-8');
    $dom = new DomDocument('1.0', 'utf-8');
    $node = $dom->createElement('error');
    $node->setAttribute('id', $errno_);
    $node->setAttribute('message', $errstr_);
    $dom->appendChild($node);
    Logger::error('main', "(client/remote_apps) return_error({$errno_}, {$errstr_})");
    return $dom->saveXML();
}
if (!array_key_exists('token', $_REQUEST)) {
    echo return_error(1, 'Usage: missing "token" $_REQUEST parameter');
    die;
}
$token = Abstract_Token::load($_REQUEST['token']);
if (!$token) {
    echo return_error(2, 'No such token: ' . $_REQUEST['token']);
    die;
}
if ($token->type != 'external_apps') {
    echo return_error(3, 'Token "' . $_REQUEST['token'] . '" is invalid');
    die;
}
$session = Abstract_Session::load($token->link_to);
if (!$session) {
    echo return_error(4, 'No such session: ' . $token->link_to);
    die;
}
$userDB = UserDB::getInstance();
$user = $userDB->import($session->user_login);
Exemplo n.º 6
0
 public function prepareAPSAccess($session_)
 {
     $remote_desktop_settings = $this->user->getSessionSettings('remote_desktop_settings');
     $default_settings = $this->user->getSessionSettings('session_settings_defaults');
     $prepare_servers = array();
     # No_desktop option management
     if (isset($this->no_desktop) && $this->no_desktop === true) {
         if ($authorize_no_desktop === true) {
             $no_desktop_process = 1;
         } else {
             Logger::warning('main', 'SessionManagement::prepareAPSAccess - Cannot apply no_desktop parameter because policy forbid it');
         }
     }
     if ($default_settings['use_known_drives'] == 1) {
         $use_known_drives = 'true';
     }
     $profile_mode = $default_settings['profile_mode'];
     $use_local_ime = $session_->settings['use_local_ime'];
     $desktop_icons = $remote_desktop_settings['desktop_icons'];
     $need_valid_profile = $default_settings['start_without_profile'] == 0;
     $user_login_aps = $session_->settings['aps_access_login'];
     $user_password_aps = $session_->settings['aps_access_password'];
     $user_login_fs = $session_->settings['fs_access_login'];
     $user_password_fs = $session_->settings['fs_access_password'];
     $remote_desktop_settings = $this->user->getSessionSettings('remote_desktop_settings');
     $allow_external_applications = array_key_exists('allow_external_applications', $remote_desktop_settings) && $remote_desktop_settings['allow_external_applications'] == 1;
     if (isset($this->language)) {
         $locale = locale2unix($this->language);
     } else {
         $locale = $this->user->getLocale();
     }
     if (isset($this->timezone) && $this->timezone != '') {
         $timezone = $this->timezone;
     }
     if ($session_->mode == Session::MODE_DESKTOP) {
         $have_external_apps = false;
         if (array_key_exists(Server::SERVER_ROLE_APS, $session_->servers)) {
             $have_external_apps |= count($session_->servers[Server::SERVER_ROLE_APS]) > 1;
         }
         if (array_key_exists(Server::SERVER_ROLE_WEBAPPS, $session_->servers)) {
             $have_external_apps |= count($session_->servers[Server::SERVER_ROLE_WEBAPPS]) > 0;
         }
         if ($session_->mode == Session::MODE_DESKTOP && $allow_external_applications && $have_external_apps) {
             $external_apps_token = new Token(gen_unique_string());
             $external_apps_token->type = 'external_apps';
             $external_apps_token->link_to = $session_->id;
             $external_apps_token->valid_until = 0;
             Abstract_Token::save($external_apps_token);
         }
         $prepare_servers[] = $session_->server;
     }
     if ($session_->mode == Session::MODE_APPLICATIONS || $session_->mode == Session::MODE_DESKTOP && $allow_external_applications) {
         foreach ($session_->servers[Server::SERVER_ROLE_APS] as $server_id => $data) {
             if ($session_->mode == Session::MODE_DESKTOP && $allow_external_applications && $server_id == $session_->server) {
                 continue;
             }
             $prepare_servers[] = $server_id;
         }
     }
     $count_prepare_servers = 0;
     foreach ($prepare_servers as $prepare_server) {
         $count_prepare_servers++;
         $server = Abstract_Server::load($prepare_server);
         if (!$server) {
             continue;
         }
         if (!array_key_exists(Server::SERVER_ROLE_APS, $server->getRoles())) {
             continue;
         }
         $server_applications = $server->getApplications();
         if (!is_array($server_applications)) {
             $server_applications = array();
         }
         $available_applications = array();
         foreach ($server_applications as $server_application) {
             $available_applications[] = $server_application->getAttribute('id');
         }
         $dom = new DomDocument('1.0', 'utf-8');
         $session_node = $dom->createElement('session');
         $session_node->setAttribute('id', $session_->id);
         $session_node->setAttribute('mode', $session_->mode == Session::MODE_DESKTOP && $count_prepare_servers == 1 ? Session::MODE_DESKTOP : Session::MODE_APPLICATIONS);
         // OvdShell Configuration
         $shell_node = $dom->createElement('shell');
         $session_node->appendChild($shell_node);
         if (isset($external_apps_token)) {
             $setting_node = $dom->createElement('setting');
             $setting_node->setAttribute('name', 'external_apps_token');
             $setting_node->setAttribute('value', $external_apps_token->id);
             $shell_node->appendChild($setting_node);
         }
         if (isset($this->start_apps) && is_array($this->start_apps)) {
             $start_apps = $this->start_apps;
             $applicationDB = ApplicationDB::getInstance();
             foreach ($start_apps as $start_app) {
                 $app = $applicationDB->import($start_app['id']);
                 if (!is_object($app)) {
                     Logger::error('main', 'SessionManagement::prepareAPSAccess - No such application for id \'' . $start_app['id'] . '\'');
                     throw_response(SERVICE_NOT_AVAILABLE);
                 }
                 $apps = $session_->getPublishedApplications();
                 $ok = false;
                 foreach ($apps as $user_app) {
                     if ($user_app->getAttribute('id') == $start_app['id']) {
                         $ok = true;
                         break;
                     }
                 }
                 if ($ok === false) {
                     Logger::error('main', 'SessionManagement::prepareAPSAccess - Application not available for user \'' . $user->getAttribute('login') . '\' id \'' . $start_app['id'] . '\'');
                     return false;
                 }
             }
         }
         foreach (array('no_desktop_process', 'use_known_drives', 'profile_mode', 'use_local_ime') as $parameter) {
             if (!isset(${$parameter})) {
                 continue;
             }
             $setting_node = $dom->createElement('setting');
             $setting_node->setAttribute('name', $parameter);
             $setting_node->setAttribute('value', ${$parameter});
             $shell_node->appendChild($setting_node);
         }
         foreach (array('desktop_icons', 'locale', 'timezone', 'need_valid_profile') as $parameter) {
             if (!isset(${$parameter})) {
                 continue;
             }
             $parameter_node = $dom->createElement('parameter');
             $parameter_node->setAttribute('name', $parameter);
             $parameter_node->setAttribute('value', ${$parameter});
             $session_node->appendChild($parameter_node);
         }
         $scripts = $this->user->scripts();
         if (is_array($scripts)) {
             $scripts_node = $dom->createElement('scripts');
             foreach ($scripts as $script) {
                 $script_node = $dom->createElement('script');
                 $script_node->setAttribute('id', $script->getAttribute('id'));
                 $script_node->setAttribute('type', $script->getAttribute('type'));
                 $script_node->setAttribute('name', $script->getAttribute('name'));
                 $scripts_node->appendChild($script_node);
             }
             $shell_node->appendChild($scripts_node);
         }
         $user_node = $dom->createElement('user');
         $user_node->setAttribute('login', $user_login_aps);
         $user_node->setAttribute('password', $user_password_aps);
         $user_node->setAttribute('displayName', $this->user->getAttribute('displayname'));
         $session_node->appendChild($user_node);
         if (array_key_exists(Server::SERVER_ROLE_FS, $session_->servers)) {
             foreach ($session_->servers[Server::SERVER_ROLE_FS] as $server_id => $netfolders) {
                 $fs_server = Abstract_Server::load($server_id);
                 foreach ($netfolders as $netfolder) {
                     $uri = 'cifs://' . $fs_server->getExternalName() . '/' . $netfolder['dir'];
                     $netfolder_node = $dom->createElement($netfolder['type']);
                     $netfolder_node->setAttribute('rid', $netfolder['rid']);
                     $netfolder_node->setAttribute('uri', $uri);
                     if ($netfolder['type'] == 'profile') {
                         $netfolder_node->setAttribute('profile_mode', $profile_mode);
                     }
                     if ($netfolder['type'] == 'sharedfolder') {
                         $netfolder_node->setAttribute('name', $netfolder['name']);
                         $netfolder_node->setAttribute('mode', $netfolder['mode']);
                     }
                     $netfolder_node->setAttribute('login', $user_login_fs);
                     $netfolder_node->setAttribute('password', $user_password_fs);
                     $session_node->appendChild($netfolder_node);
                 }
             }
         }
         foreach ($this->forced_sharedfolders as $share) {
             $sharedfolder_node = $dom->createElement('sharedfolder');
             $sharedfolder_node->setAttribute('rid', $share['rid']);
             $sharedfolder_node->setAttribute('uri', $share['uri']);
             $sharedfolder_node->setAttribute('name', $share['name']);
             if (array_key_exists('login', $share) && array_key_exists('password', $share)) {
                 $sharedfolder_node->setAttribute('login', $share['login']);
                 $sharedfolder_node->setAttribute('password', $share['password']);
             }
             $session_node->appendChild($sharedfolder_node);
         }
         // Pass custom shared folders to the server
         foreach (Plugin::dispatch('getSharedFolders', $server) as $plugin => $results) {
             foreach ($results as $sharedfolder) {
                 $sharedfolder_ok = true;
                 $sharedfolder_node = $dom->createElement('sharedfolder');
                 foreach (array('uri', 'name', 'rid') as $key) {
                     if (array_key_exists($key, $sharedfolder)) {
                         $sharedfolder_node->setAttribute($key, $sharedfolder[$key]);
                     } else {
                         Logger::error('main', 'SharedFolder is missing ' . $key . ' parameter in ' . $plugin);
                         $sharedfolder_ok = false;
                     }
                 }
                 foreach (array('login', 'password') as $key) {
                     if (array_key_exists($key, $sharedfolder)) {
                         $sharedfolder_node->setAttribute($key, $sharedfolder[$key]);
                     }
                 }
                 if (($have_login = array_key_exists('login', $sharedfolder)) != array_key_exists('password', $sharedfolder) && $have_login) {
                     Logger::error('main', 'SharedFolder login and password are both required if one is present in ' . $plugin);
                     $sharedfolder_ok = false;
                 }
                 if ($sharedfolder_ok) {
                     $session_node->appendChild($sharedfolder_node);
                 }
             }
         }
         foreach ($session_->getPublishedApplications() as $application) {
             if ($application->getAttribute('type') != $server->getAttribute('type')) {
                 continue;
             }
             if (!in_array($application->getAttribute('id'), $available_applications)) {
                 continue;
             }
             $application_node = $dom->createElement('application');
             $application_node->setAttribute('id', $application->getAttribute('id'));
             $application_node->setAttribute('name', $application->getAttribute('name'));
             if (!$application->getAttribute('static')) {
                 $application_node->setAttribute('mode', 'local');
             } else {
                 $application_node->setAttribute('mode', 'static');
             }
             $session_node->appendChild($application_node);
         }
         if (isset($start_apps) && is_array($start_apps)) {
             $start_node = $dom->createElement('start');
             foreach ($start_apps as $start_app) {
                 $application_node = $dom->createElement('application');
                 $application_node->setAttribute('app_id', $start_app['id']);
                 if (array_key_exists('arg', $start_app) && !is_null($start_app['arg'])) {
                     $application_node->setAttribute('arg', $start_app['arg']);
                 }
                 if (array_key_exists('file', $start_app)) {
                     $file_node = $dom->createElement('file');
                     $file_node->setAttribute('type', $start_app['file']['type']);
                     $file_node->setAttribute('location', $start_app['file']['location']);
                     $file_node->setAttribute('path', $start_app['file']['path']);
                     $application_node->appendChild($file_node);
                 }
                 $start_node->appendChild($application_node);
             }
             $session_node->appendChild($start_node);
         }
         $dom->appendChild($session_node);
         $this->appendToSessionCreateXML($dom);
         $xml = $dom->saveXML();
         $session_create_xml = query_url_post_xml($server->getBaseURL() . '/aps/session/create', $xml);
         $ret = $this->parseSessionCreate($session_create_xml);
         if (!$ret) {
             Logger::critical('main', 'SessionManagement::prepareAPSAccess - Unable to create Session \'' . $session->id . '\' for User \'' . $session->user_login . '\' on Server \'' . $server->fqdn . '\', aborting');
             $session->orderDeletion(true, Session::SESSION_END_STATUS_ERROR);
             return false;
         }
     }
     return true;
 }