public function RCall($values = null, $code = null, $resume_from_last_template = false) { if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- R call initiated #" . session_id()); } //resume from last template if ($resume_from_last_template) { $response = array("data" => array("HEAD" => $this->head, "HASH" => $this->hash, "TIME_LIMIT" => $this->time_limit, "HTML" => $this->HTML, "TEST_ID" => $this->Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => TestSession::TEST_SESSION_STATUS_TEMPLATE, "TEMPLATE_ID" => $this->Template_id, "LOADER_TEMPLATE_ID" => $this->loader_Template_id, "FINISHED" => 0, "EFFECT_SHOW" => $this->effect_show, "EFFECT_HIDE" => $this->effect_hide, "EFFECT_SHOW_OPTIONS" => $this->effect_show_options, "EFFECT_HIDE_OPTIONS" => $this->effect_hide_options, "LOADER_HTML" => $this->loader_HTML, "LOADER_HEAD" => $this->loader_head, "LOADER_EFFECT_SHOW" => $this->loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $this->loader_effect_show_options, "LOADER_EFFECT_HIDE" => $this->loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $this->loader_effect_hide_options, "LOADER_HTML" => $this->loader_HTML, "LOADER_HEAD" => $this->loader_head, "LOADER_EFFECT_SHOW" => $this->loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $this->loader_effect_show_options, "LOADER_EFFECT_HIDE" => $this->loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $this->loader_effect_hide_options)); return $response; } //R server connection $command_obj = json_encode(array("workspace_id" => $this->UserWorkspace_id, "session_id" => $this->id, "hash" => $this->hash, "values" => $values, "code" => $code, "type" => 0, "IP" => $_SERVER["REMOTE_ADDR"])); if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- checking for server"); } if (TestServer::get_server_status() == TestServer::SERVER_STATUS_STOPPED) { TestServer::start_process(); TestServer::wait_until_started(); } else { if (TestServer::get_server_status() == TestServer::SERVER_STATUS_STARTING) { TestServer::wait_until_started(); } } if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- server found, trying to send"); } $response = TestServer::send($command_obj); $result = json_decode(trim($response)); if (Ini::$log_server_events) { TestServer::log_debug("TestSession->RCall --- sent and recieved response"); } $status = TestSession::TEST_SESSION_STATUS_ERROR; $removed = false; $release = 0; $html = ""; $head = ""; $Template_id = 0; $debug = 0; $hash = ""; $time_limit = 0; $Test_id = 0; $finished = 0; $loader_Template_id = 0; $loader_HTML = ""; $loader_head = ""; $loader_effect_show = "none"; $loader_effect_hide = "none"; $loader_effect_show_options = ""; $loader_effect_hide_options = ""; $effect_show = "none"; $effect_hide = "none"; $effect_show_options = ""; $effect_hide_options = ""; $state = "[]"; $output = ""; $thisSession = TestSession::from_mysql_id($this->id); $return = $result->return; if ($thisSession != null) { $output = $thisSession->output; $error_output = $thisSession->error_output; $state = $thisSession->state; $status = $thisSession->status; $release = $thisSession->release; $html = $thisSession->HTML; $head = $thisSession->head; $Template_id = $thisSession->Template_id; $debug = $thisSession->debug; $hash = $thisSession->hash; $time_limit = $thisSession->time_limit; $Test_id = $thisSession->Test_id; $loader_Template_id = $thisSession->loader_Template_id; $loader_HTML = $thisSession->loader_HTML; $loader_head = $thisSession->loader_head; $loader_effect_hide = $thisSession->loader_effect_hide; $loader_effect_hide_options = $thisSession->loader_effect_hide_options; $loader_effect_show = $thisSession->loader_effect_show; $loader_effect_show_options = $thisSession->loader_effect_show_options; $effect_hide = $thisSession->effect_hide; $effect_hide_options = $thisSession->effect_hide_options; $effect_show = $thisSession->effect_show; $effect_show_options = $thisSession->effect_show_options; if ($return != 0) { $status = TestSession::TEST_SESSION_STATUS_ERROR; } if ($status == TestSession::TEST_SESSION_STATUS_WORKING && $release == 1) { $status = TestSession::TEST_SESSION_STATUS_COMPLETED; } $thisSession->status = $status; $thisSession->mysql_save(); switch ($status) { case TestSession::TEST_SESSION_STATUS_COMPLETED: if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); } break; case TestSession::TEST_SESSION_STATUS_ERROR: if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); if (Ini::$log_r_errors) { $thisSession->log_error(nl2br(htmlspecialchars($error_output, ENT_QUOTES))); } } break; case TestSession::TEST_SESSION_STATUS_TAMPERED: if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); } break; case TestSession::TEST_SESSION_STATUS_TEMPLATE: if ($release) { if ($debug) { TestSession::unregister($thisSession->UserWorkspace_id . "-" . $thisSession->id, $thisSession->UserWorkspace_id); $removed = true; } else { $thisSession->close(); } } break; } } else { $removed = true; } $debug_data = false; $logged_user = User::get_logged_user(); if ($logged_user != null) { $debug_data = true; } if ($release == 1 || $status == TestSession::TEST_SESSION_STATUS_COMPLETED || $status == TestSession::TEST_SESSION_STATUS_ERROR || $status == TestSession::TEST_SESSION_STATUS_TAMPERED) { $finished = 1; } $response = array("data" => array("HEAD" => $head, "HASH" => $hash, "TIME_LIMIT" => $time_limit, "HTML" => $html, "TEST_ID" => $Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => $status, "TEMPLATE_ID" => $Template_id, "FINISHED" => $finished, "LOADER_TEMPLATE_ID" => $loader_Template_id, "LOADER_HTML" => $loader_HTML, "LOADER_HEAD" => $loader_head, "LOADER_EFFECT_SHOW" => $loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $loader_effect_show_options, "LOADER_EFFECT_HIDE" => $loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $loader_effect_hide_options, "EFFECT_SHOW" => $effect_show, "EFFECT_HIDE" => $effect_hide, "EFFECT_SHOW_OPTIONS" => $effect_show_options, "EFFECT_HIDE_OPTIONS" => $effect_hide_options)); if ($debug_data) { if (!is_array($response)) { $response = array(); } if ($output != null) { if (strpos(trim($output), ">") !== 0 && strpos(trim($output), "[") !== 0) { $output = "> " . trim($output); } } if ($debug) { $state = json_decode($state, true); if ($state != null) { foreach ($state as $k => $v) { $state[$k] = htmlspecialchars($v, ENT_QUOTES); } $state = json_encode($state); } else { $state = "[]"; } $response["debug"] = array("return" => $return, "output" => nl2br(htmlspecialchars($output, ENT_QUOTES)), "error_output" => nl2br(htmlspecialchars($error_output, ENT_QUOTES)), "state" => nl2br($state)); } } if (Ini::$timer_tamper_prevention && !$removed) { $sql = sprintf("UPDATE `%s` SET `time_tamper_prevention`=%d WHERE `id`=%d", TestSession::get_mysql_table(), time(), $this->id); mysql_query($sql); } return $response; }
public function RCall($code, $include_ini_code = false, $close = false, $debug_syntax = false) { $command = ""; if (!$debug_syntax) { if ($include_ini_code) { $command = $this->get_ini_RCode(); } else { $command .= $this->get_next_ini_RCode(); } } $command .= $code; if (!$debug_syntax) { $command .= $this->get_post_RCode(); } $output = array(); $return = -999; $command_obj = json_encode(array("session_id" => $this->id, "code" => $command, "close" => 0)); if (TestServer::$debug) { TestServer::log_debug("TestSession->RCall --- checking for server"); } if (!TestServer::is_running()) { TestServer::start_process(); } if (TestServer::$debug) { TestServer::log_debug("TestSession->RCall --- server found, trying to send"); } $response = TestServer::send($command_obj); $result = json_decode(trim($response)); if (TestServer::$debug) { TestServer::log_debug("TestSession->RCall --- sent and recieved response"); } $output = explode("\n", $result->output); $return = $result->return; $thisSession = null; $status = TestSession::TEST_SESSION_STATUS_ERROR; $removed = false; $release = 0; $html = ""; $head = ""; $Template_id = 0; $debug = 0; $hash = ""; $time_limit = 0; $Test_id = 0; $finished = 0; $loader_HTML = ""; $loader_head = ""; $loader_effect_show = "none"; $loader_effect_hide = "none"; $loader_effect_show_options = ""; $loader_effect_hide_options = ""; $effect_show = "none"; $effect_hide = "none"; $effect_show_options = ""; $effect_hide_options = ""; if (!$debug_syntax) { $thisSession = TestSession::from_mysql_id($this->id); if ($thisSession != null) { $status = $thisSession->status; $release = $thisSession->release; $html = $thisSession->HTML; $Template_id = $thisSession->Template_id; $debug = $thisSession->debug; $hash = $thisSession->hash; $time_limit = $thisSession->time_limit; $Test_id = $thisSession->Test_id; $loader_HTML = $thisSession->loader_HTML; $loader_head = $thisSession->loader_head; $loader_effect_hide = $thisSession->loader_effect_hide; $loader_effect_hide_options = $thisSession->loader_effect_hide_options; $loader_effect_show = $thisSession->loader_effect_show; $loader_effect_show_options = $thisSession->loader_effect_show_options; $effect_hide = $thisSession->effect_hide; $effect_hide_options = $thisSession->effect_hide_options; $effect_show = $thisSession->effect_show; $effect_show_options = $thisSession->effect_show_options; if ($return != 0) { $status = TestSession::TEST_SESSION_STATUS_ERROR; } if ($status == TestSession::TEST_SESSION_STATUS_WORKING && $release == 1 || $close) { $status = TestSession::TEST_SESSION_STATUS_COMPLETED; } $thisSession->status = $status; $thisSession->mysql_save(); switch ($status) { case TestSession::TEST_SESSION_STATUS_COMPLETED: if ($debug) { TestSession::unregister($thisSession->id); $removed = true; } else { $thisSession->serialize(); } break; case TestSession::TEST_SESSION_STATUS_ERROR: case TestSession::TEST_SESSION_STATUS_TAMPERED: if ($debug) { TestSession::unregister($thisSession->id); $removed = true; } else { $thisSession->close(); } break; case TestSession::TEST_SESSION_STATUS_TEMPLATE: if ($debug) { $html = Template::strip_html($html); if ($release) { TestSession::unregister($thisSession->id); } } else { $head = Template::from_mysql_id($Template_id)->head; if ($release) { $thisSession->serialize(); } } break; } } else { $removed = true; } } $test = Test::from_mysql_id($this->Test_id); $debug_data = false; $logged_user = User::get_logged_user(); if ($logged_user != null) { $debug_data = $logged_user->is_object_readable($test); } if ($release == 1 || $status == TestSession::TEST_SESSION_STATUS_COMPLETED || $status == TestSession::TEST_SESSION_STATUS_ERROR || $status == TestSession::TEST_SESSION_STATUS_TAMPERED) { $finished = 1; } if (!$debug_syntax) { $response = array("data" => array("HEAD" => $head, "HASH" => $hash, "TIME_LIMIT" => $time_limit, "HTML" => $html, "TEST_ID" => $Test_id, "TEST_SESSION_ID" => $this->id, "STATUS" => $status, "TEMPLATE_ID" => $Template_id, "FINISHED" => $finished, "LOADER_HTML" => $loader_HTML, "LOADER_HEAD" => $loader_head, "LOADER_EFFECT_SHOW" => $loader_effect_show, "LOADER_EFFECT_SHOW_OPTIONS" => $loader_effect_show_options, "LOADER_EFFECT_HIDE" => $loader_effect_hide, "LOADER_EFFECT_HIDE_OPTIONS" => $loader_effect_hide_options, "EFFECT_SHOW" => $effect_show, "EFFECT_HIDE" => $effect_hide, "EFFECT_SHOW_OPTIONS" => $effect_show_options, "EFFECT_HIDE_OPTIONS" => $effect_hide_options)); } if ($debug_data) { for ($i = 0; $i < count($output); $i++) { if (strpos($output[$i], "CONCERTO_DB_PASSWORD <-") !== false) { $output[$i] = "[hidden]"; } $output[$i] = htmlspecialchars($output[$i], ENT_QUOTES); } $command_lines = explode("\n", $command); for ($i = 0; $i < count($command_lines); $i++) { if (strpos($command_lines[$i], "CONCERTO_DB_PASSWORD <-") !== false) { $command_lines[$i] = "[hidden]"; } } $command = implode("\n", $command_lines); $command = htmlspecialchars($command, ENT_QUOTES); if (!is_array($response)) { $response = array(); } $response["debug"] = array("code" => $command, "return" => $return, "output" => $output); } if (Ini::$timer_tamper_prevention && !$debug_syntax && !$removed) { $sql = sprintf("UPDATE `%s` SET `time_tamper_prevention`=%d WHERE `id`=%d", TestSession::get_mysql_table(), time(), $this->id); mysql_query($sql); } return $response; }
<?php /* Concerto Platform - Online Adaptive Testing Platform Copyright (C) 2011-2013, The Psychometrics Centre, Cambridge University 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, and not any of the later versions. 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. */ if (!isset($ini)) { require_once '../Ini.php'; $ini = new Ini(); } $file_name = "client_side.log"; if ($_POST['type'] == "unload") { $file_name = "unload.log"; } TestServer::log_debug($_SERVER['REMOTE_ADDR'] . ": " . $_POST['message'], true, $file_name);
public function run($code, $variables = null, $reset_responses = true) { TestSession::change_db($this->UserWorkspace_id); $session = TestSession::from_mysql_id($this->TestSession_id); $this->pending_variables = $variables; $is_new = false; $send_code = ""; $change_status = false; switch ($session->status) { case TestSession::TEST_SESSION_STATUS_NEW: $is_new = true; $change_status = true; $send_code .= $this->get_ini_code(); break; case TestSession::TEST_SESSION_STATUS_SERIALIZED: $is_new = true; $change_status = true; $send_code .= $this->get_ini_code(true); break; case TestSession::TEST_SESSION_STATUS_TEMPLATE: $change_status = true; break; } if ($change_status) { $session->status = TestSession::TEST_SESSION_STATUS_WORKING; $session->mysql_save(); } if ($code != null) { $send_code .= $code; } else { if ($is_new) { if ($session->debug == 0) { $test = Test::from_mysql_id($session->Test_id); if ($test != null) { //URL params if ($variables != null) { $params = $test->get_parameter_TestVariables(); $params_declaration = ""; $variables = json_encode($variables); $variables = json_decode($variables, true); foreach ($params as $param) { foreach ($variables as $var_k => $var_v) { if ($var_k == $param->name) { $params_declaration .= $var_k . " <- '" . addcslashes($var_v, "'") . "'\n"; } } } $send_code .= $params_declaration; } $send_code .= $test->code . $this->get_final_code(); } } } } if (Ini::$log_server_events) { TestServer::log_debug("TestInstance->run()--- Sending " . strlen($send_code) . " data to test instance #" . $this->UserWorkspace_id . ":" . $this->TestSession_id); } $this->last_action_time = time(); $this->last_execution_time = time(); $lines = explode("\n", $send_code); $code = ""; $i = -1; foreach ($lines as $line) { $i++; $line = trim($line); if ($line == "") { continue; } $code .= $line . "\n"; } $this->code = $code; if ($reset_responses) { $this->response = ""; $this->error_response = ""; } $bytes = fwrite($this->pipes[0], $code); if (Ini::$log_server_events) { TestServer::log_debug("TestInstance->run()--- " . $bytes . " written to test instance #" . $this->UserWorkspace_id . ":" . $this->TestSession_id); } $this->is_working = true; $this->is_data_ready = false; }
public function read() { $this->code_execution_halted = false; $this->last_action_time = time(); $result = ""; $error = ""; while ($append = fread($this->pipes[1], 4096)) { $result .= $append; } if (strpos($result, '"CODE EXECUTION FINISHED"') !== false) { $this->is_data_ready = true; } if (strpos($result, '"SESSION SERIALIZATION FINISHED"') !== false) { $this->is_serialized = true; } while ($append = fread($this->pipes[2], 4096)) { $error .= $append; } if (strpos($error, 'Execution halted') !== false) { $result .= $error; $this->code_execution_halted = true; $this->is_data_ready = true; if (TestServer::$debug) { TestServer::log_debug("TestInstance->read() --- Fatal test exception encountered on #" . $this->session_id . ": "); TestServer::log_debug("\n" . $error . "\n", false); } } $this->response .= $result; if (strlen($this->response) > TestServer::$response_limit) { $this->response = "( ... )\n " . substr($this->response, strlen($this->response) - TestServer::$response_limit); } if ($this->is_data_ready) { return $this->response; } else { if ($this->is_execution_timedout()) { $this->code_execution_halted = true; $this->is_data_ready = true; return $this->response . "\n TIMEOUT"; } } return null; }