You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

307 lines
10 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
require_once('../tiki-setup.php');
require_once('lib/diff/difflib.php');
if ($prefs['feature_tikitests'] != 'y') {
$smarty->assign('msg', tra('This feature is disabled') . ': feature_tikitests');
$smarty->display('error.tpl');
die;
}
if ($tiki_p_admin_tikitests != 'y' and $tiki_p_play_tikitests != 'y') {
$smarty->assign('msg', tra('You do not have permission to do that'));
$smarty->display('error.tpl');
die;
}
if (! extension_loaded('http') and ! extension_loaded('curl')) {
$smarty->assign('msg', tra('The pecl HTTP extension or the Curl extension is needed to replay the TikiTest'));
$smarty->display('error.tpl');
die;
}
$smarty->assign('tidy', extension_loaded('tidy'));
$smarty->assign('http', extension_loaded('http'));
$smarty->assign('curl', extension_loaded('curl'));
/**
* @param $element
* @return array|null
*/
function get_from_dom($element)
{
if ($element === null) {
return null;
}
$es = $element->getElementsByTagName('*');
$a = [];
foreach ($es as $e) {
$a[$e->tagName] = $e->nodeValue;
}
return $a;
}
/**
* @param $url
* @param bool $use_tidy
* @return array
*/
function verif_url($url, $use_tidy = true)
{
global $cookies;
static $purifier;
static $loaded = false;
$smarty = TikiLib::lib('smarty');
$result = [];
$get = get_from_dom($url->getElementsByTagName('get')->item(0));
$post = get_from_dom($url->getElementsByTagName('post')->item(0));
$xpath = $url->getElementsByTagName('xpath')->item(0)->textContent;
$data = $url->getElementsByTagName('data')->item(0)->textContent;
$urlstr = $url->getAttribute('src');
if (extension_loaded('http')) {
$options['timeout'] = 2;
$options['connecttimeout'] = 2;
$options['url'] = $url->getAttribute('src');
$options['referer'] = $url->getAttribute('referer');
$options['redirect'] = 0;
$options['cookies'] = $cookies ;
$options['cookiestore'] = tempnam('/tmp/', 'tiki-tests');
// Close the session to avoid timeout
session_write_close();
switch (strtolower($url->getAttribute('method'))) {
case 'get':
$buffer = http_get($urlstr, $options, $info);
break;
case 'post':
$buffer = http_post_fields($urlstr, $post, null, $options, $info);
}
$headers = http_parse_headers($buffer);
if (isset($headers['Set-Cookie'])) {
foreach ($headers['Set-Cookie'] as $c) {
parse_str($c, $cookies);
}
}
$buffer = http_parse_message($buffer)->body;
} elseif (extension_loaded('curl')) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $urlstr);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl, CURLOPT_TIMEOUT, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_REFERER, $url->getAttribute('referer'));
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_USERAGENT, 'TikiTest');
// We deal with the cookies
$cookies_string = '';
foreach ($cookies as $c => $v) {
$cookies_string .= "$c=$v; path=/;";
}
curl_setopt($curl, CURLOPT_COOKIE, $cookies_string);
switch (strtolower($url->getAttribute('method'))) {
case 'get':
curl_setopt($curl, CURLOPT_HTTPGET, true);
break;
case 'post':
curl_setopt($curl, CURLOPT_POST, true);
$post_string = '';
foreach ($post as $p => $v) {
if ($post_string != '') {
$post_string .= '&';
}
$post_string .= "$p=$v";
}
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_string);
}
// Close the session to avoid timeout
session_write_close();
$http_response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($http_response, 0, $header_size);
$body = substr($http_response, $header_size);
preg_match_all('|Set-Cookie: (.*);|U', $header, $cookies_array);
foreach ($cookies_array[1] as $c) {
$cookies_tmp .= "&$c";
}
parse_str($cookies_tmp, $cookies_titi);
if (! is_array($cookies)) {
$cookies = [];
}
$cookies = array_merge($cookies, $cookies_titi);
$buffer = $body;
curl_close($curl);
}
if (extension_loaded('tidy')) {
$data = tidy_parse_string($data, [], 'utf8');
$buffer = tidy_parse_string($buffer, [], 'utf8');
if ($use_tidy) {
tidy_diagnose($data);
$result['ref_error_count'] = tidy_error_count($data);
$result['ref_error_msg'] = tidy_get_error_buffer($data);
tidy_diagnose($buffer);
$result['replay_error_count'] = tidy_error_count($buffer);
$result['replay_error_msg'] = tidy_get_error_buffer($buffer);
}
} else {
if (! $loaded) {
require_once('lib/htmlpurifier_tiki/HTMLPurifier.tiki.php');
$config = getHTMLPurifierTikiConfig();
$purifier = new HTMLPurifier($config);
$loaded = true;
}
if ($purifier) {
$data = '<html><body>' . $purifier->purify($data) . '</body></html>';
$buffer = '<html><body>' . $purifier->purify($buffer) . '</body></html>';
}
$result['ref_error_msg'] = tra('The Tidy extension is not present');
$result['replay_error_msg'] = tra('The Tidy extension is not present');
}
// If we have a XPath then we extract the new DOM and print it in HTML
if (trim($xpath) != '') {
$dom_ref = DOMDocument::loadHTML($data);
$xp_ref = new DomXPath($dom_ref);
$res_ref = $xp_ref->query($xpath);
$new_data = new DOMDocument('1.0');
$root = $new_data->createElement('html');
$root = $new_data->appendChild($root);
$body = $new_data->createElement('html');
$body = $root->appendChild($body);
foreach ($res_ref as $ref) {
$tmp = $new_data->importNode($ref, true);
$body->appendChild($tmp);
}
$data = $new_data->saveHTML();
$dom_buffer = DOMDocument::loadHTML($buffer);
$xp_buffer = new DomXPath($dom_buffer);
$res_buffer = $xp_buffer->query($xpath);
$new_buffer = new DOMDocument('1.0');
$root = $new_buffer->createElement('html');
$root = $new_buffer->appendChild($root);
$body = $new_buffer->createElement('html');
$body = $root->appendChild($body);
foreach ($res_buffer as $ref) {
$tmp = $new_buffer->importNode($ref, true);
$body->appendChild($tmp);
}
$buffer = $new_buffer->saveHTML();
}
$tmp = diff2($data, $buffer, "htmldiff");
if (trim($xpath) != '') {
$result['html'] = preg_replace(
["/<html>/", "/<\/html>/"],
["<div style='overflow: auto; width:500px; text-align: center'> ", "</div>"],
$tmp
);
} else {
$result['html'] = preg_replace(
["/<html.*<body/U", "/<\/body><\/html>/U"],
["<div style='overflow: auto; width:500px; text-align: center' ", "</div>"],
$tmp
);
}
$result['url'] = $urlstr;
$result['method'] = $url->getAttribute('method');
if (strtolower($result['method']) == 'post') {
$result['post'] = $post;
}
return $result;
}
if (isset($_REQUEST['filename'])) {
$_REQUEST['filename'] = str_replace('<x>', '', $_REQUEST['filename']);
}
if (isset($_REQUEST['action'])) {
$smarty->assign('filename', $_REQUEST['filename']);
$xml = file_get_contents('tiki_tests/tests/' . $_REQUEST['filename']);
if ($xml == '') {
$smarty->assign('msg', tra('The TikiTest Replay File is Empty'));
$smarty->display('error.tpl');
die();
} else {
$dom = DOMDocument::loadXML($xml);
$element_test = $dom->getElementsByTagName('test')->item(0);
if ($element_test == null) {
$smarty->assign('msg', tra('The TikiTest Replay File is Empty'));
$smarty->display('error.tpl');
die();
}
}
$result = [];
$urls = $dom->getElementsByTagName('url');
$options = [];
foreach ($dom->getElementsByTagName('options') as $o) {
$es = $o->getElementsByTagName('*');
foreach ($es as $e) {
$options[$e->tagName] = $e->nodeValue;
}
}
if ($options['current_session'] == 'y') {
$cookies = $_COOKIE;
}
if (strtolower($_REQUEST['action']) == strtolower(tra('Replay'))) {
$options['use_tidy'] = $_REQUEST['show_tidy'];
$options['show_page'] = $_REQUEST['show_page'];
$options['show_post'] = $_REQUEST['show_post'];
$options['summary'] = $_REQUEST['summary'];
$options['current_session'] = $_REQUEST['current_session'];
$test_success = $test_failure = $test_count = 0;
foreach ($urls as $url) {
$tmp = verif_url($url, $options['use_tidy'] == 'y');
$result[] = $tmp;
if ($options['summary']) {
$test_count++;
if ($tmp['html'] == '') {
$test_success++;
} else {
$test_failure++;
}
}
}
$smarty->assign_by_ref('result', $result);
}
$smarty->assign('filename', $_REQUEST['filename']);
$smarty->assign('show_page', $options['show_page']);
$smarty->assign('show_post', $options['show_post']);
$smarty->assign('show_tidy', $options['use_tidy']);
$smarty->assign('current_session', $options['current_session']);
$smarty->assign('summary', $options['summary']);
$smarty->assign('test_count', $test_count);
$smarty->assign('test_failure', $test_failure);
$smarty->assign('test_success', $test_success);
$smarty->assign('mid', 'tiki-tests_replay.tpl');
$smarty->assign('title', tra('TikiTest Replay'));
$smarty->display('tiki.tpl');
} else {
header('Location: tiki-tests_list.php');
}