Controllo degli aggiornamenti (#302)
This commit is contained in:
parent
fed810525f
commit
d8609a9ead
|
@ -1398,10 +1398,34 @@ function getCookie(cname) {
|
|||
/**
|
||||
* Funzione per controllare se un file esiste
|
||||
*/
|
||||
|
||||
function UrlExists(url) {
|
||||
var http = new XMLHttpRequest();
|
||||
http.open('HEAD', url, false);
|
||||
http.send();
|
||||
return http.status != 404;
|
||||
}
|
||||
|
||||
function buttonLoading(button) {
|
||||
var $this = $(button);
|
||||
|
||||
var result = [
|
||||
$this.html(),
|
||||
$this.attr("class")
|
||||
];
|
||||
|
||||
$this.html('<i class="fa fa-spinner fa-pulse fa-fw"></i> Attendere...');
|
||||
$this.addClass("btn-warning");
|
||||
$this.prop("disabled", true);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function buttonRestore(button, loadingResult) {
|
||||
var $this = $(button);
|
||||
|
||||
$this.html(loadingResult[0]);
|
||||
|
||||
$this.attr("class", "");
|
||||
$this.addClass(loadingResult[1]);
|
||||
$this.prop("disabled", false);
|
||||
}
|
||||
|
|
210
lib/util.php
210
lib/util.php
|
@ -127,6 +127,21 @@ if (!function_exists('str_to_upper')) {
|
|||
}
|
||||
}
|
||||
|
||||
if (!function_exists('replace')) {
|
||||
/**
|
||||
* Sostituisce gli elementi dell'array all'interno della stringa.
|
||||
*
|
||||
* @param string $string
|
||||
* @param array $array
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function replace($string, $array)
|
||||
{
|
||||
return str_replace(array_keys($array), array_values($array), $string);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('random_string')) {
|
||||
/**
|
||||
* Generates a string of random characters.
|
||||
|
@ -466,17 +481,198 @@ if (!function_exists('readSQLFile')) {
|
|||
}
|
||||
}
|
||||
|
||||
if (!function_exists('replace')) {
|
||||
if (!function_exists('get_remote_data')) {
|
||||
/**
|
||||
* Sostituisce gli elementi dell'array all'interno della stringa.
|
||||
* echo get_remote_data("http://example.com/"); // GET request
|
||||
* echo get_remote_data("http://example.com/", "var2=something&var3=blabla" ); // POST request.
|
||||
*
|
||||
* @param string $string
|
||||
* @param array $array
|
||||
* Automatically handles FOLLOWLOCATION problem;
|
||||
* Using 'replace_src'=>true, it fixes domain-relative urls (i.e.: src="./file.jpg" -----> src="http://example.com/file.jpg" )
|
||||
* Using 'schemeless'=>true, it converts urls in schemeless (i.e.: src="http://exampl.. -----> src="//exampl... )\
|
||||
*
|
||||
* @return string
|
||||
* @source tazotodua/useful-php-scripts
|
||||
*/
|
||||
function replace($string, $array)
|
||||
function get_remote_data($url, $post_paramtrs = false, $extra = ['schemeless' => true, 'replace_src' => true, 'return_array' => false])
|
||||
{
|
||||
return str_replace(array_keys($array), array_values($array), $string);
|
||||
// start curl
|
||||
$c = curl_init();
|
||||
curl_setopt($c, CURLOPT_URL, $url);
|
||||
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
|
||||
//if parameters were passed to this function, then transform into POST method.. (if you need GET request, then simply change the passed URL)
|
||||
if ($post_paramtrs) {
|
||||
curl_setopt($c, CURLOPT_POST, true);
|
||||
curl_setopt($c, CURLOPT_POSTFIELDS, (is_array($post_paramtrs) ? http_build_query($post_paramtrs) : $post_paramtrs));
|
||||
}
|
||||
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
|
||||
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($c, CURLOPT_COOKIE, 'CookieName1=Value;');
|
||||
$headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:76.0) Gecko/20100101 Firefox/76.0';
|
||||
$headers[] = 'Pragma: ';
|
||||
$headers[] = 'Cache-Control: max-age=0';
|
||||
if (!empty($post_paramtrs) && !is_array($post_paramtrs) && is_object(json_decode($post_paramtrs))) {
|
||||
$headers[] = 'Content-Type: application/json';
|
||||
$headers[] = 'Content-Length: '.strlen($post_paramtrs);
|
||||
}
|
||||
curl_setopt($c, CURLOPT_HTTPHEADER, $headers);
|
||||
curl_setopt($c, CURLOPT_MAXREDIRS, 10);
|
||||
//if SAFE_MODE or OPEN_BASEDIR is set,then FollowLocation cant be used.. so...
|
||||
$follow_allowed = (ini_get('open_basedir') || ini_get('safe_mode')) ? false : true;
|
||||
if ($follow_allowed) {
|
||||
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
|
||||
}
|
||||
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 9);
|
||||
curl_setopt($c, CURLOPT_REFERER, $url);
|
||||
curl_setopt($c, CURLOPT_TIMEOUT, 60);
|
||||
curl_setopt($c, CURLOPT_AUTOREFERER, true);
|
||||
curl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');
|
||||
curl_setopt($c, CURLOPT_HEADER, !empty($extra['return_array']));
|
||||
$data = curl_exec($c);
|
||||
if (!empty($extra['return_array'])) {
|
||||
preg_match("/(.*?)\r\n\r\n((?!HTTP\/\d\.\d).*)/si", $data, $x);
|
||||
preg_match_all('/(.*?): (.*?)\r\n/i', trim('head_line: '.$x[1]), $headers_, PREG_SET_ORDER);
|
||||
foreach ($headers_ as $each) {
|
||||
$header[$each[1]] = $each[2];
|
||||
}
|
||||
$data = trim($x[2]);
|
||||
}
|
||||
$status = curl_getinfo($c);
|
||||
curl_close($c);
|
||||
// if redirected, then get that redirected page
|
||||
if ($status['http_code'] == 301 || $status['http_code'] == 302) {
|
||||
//if we FOLLOWLOCATION was not allowed, then re-get REDIRECTED URL
|
||||
//p.s. WE dont need "else", because if FOLLOWLOCATION was allowed, then we wouldnt have come to this place, because 301 could already auto-followed by curl :)
|
||||
if (!$follow_allowed) {
|
||||
//if REDIRECT URL is found in HEADER
|
||||
if (empty($redirURL)) {
|
||||
if (!empty($status['redirect_url'])) {
|
||||
$redirURL = $status['redirect_url'];
|
||||
}
|
||||
}
|
||||
//if REDIRECT URL is found in RESPONSE
|
||||
if (empty($redirURL)) {
|
||||
preg_match('/(Location:|URI:)(.*?)(\r|\n)/si', $data, $m);
|
||||
if (!empty($m[2])) {
|
||||
$redirURL = $m[2];
|
||||
}
|
||||
}
|
||||
//if REDIRECT URL is found in OUTPUT
|
||||
if (empty($redirURL)) {
|
||||
preg_match('/moved\s\<a(.*?)href\=\"(.*?)\"(.*?)here\<\/a\>/si', $data, $m);
|
||||
if (!empty($m[1])) {
|
||||
$redirURL = $m[1];
|
||||
}
|
||||
}
|
||||
//if URL found, then re-use this function again, for the found url
|
||||
if (!empty($redirURL)) {
|
||||
$t = debug_backtrace();
|
||||
|
||||
return call_user_func($t[0]['function'], trim($redirURL), $post_paramtrs);
|
||||
}
|
||||
}
|
||||
}
|
||||
// if not redirected,and nor "status 200" page, then error..
|
||||
elseif ($status['http_code'] != 200) {
|
||||
$data = "ERRORCODE22 with $url<br/><br/>Last status codes:".json_encode($status)."<br/><br/>Last data got:$data";
|
||||
}
|
||||
//URLS correction
|
||||
if (function_exists('url_corrections_for_content_HELPER')) {
|
||||
$data = url_corrections_for_content_HELPER($data, $status['url'], ['schemeless' => !empty($extra['schemeless']), 'replace_src' => !empty($extra['replace_src']), 'rawgit_replace' => !empty($extra['rawgit_replace'])]);
|
||||
}
|
||||
$answer = (!empty($extra['return_array']) ? ['data' => $data, 'header' => $header, 'info' => $status] : $data);
|
||||
|
||||
return $answer;
|
||||
}
|
||||
function url_corrections_for_content_HELPER($content = false, $url = false, $extra_opts = ['schemeless' => false, 'replace_src' => false, 'rawgit_replace' => false])
|
||||
{
|
||||
$GLOBALS['rdgr']['schemeless'] = $extra_opts['schemeless'];
|
||||
$GLOBALS['rdgr']['replace_src'] = $extra_opts['replace_src'];
|
||||
$GLOBALS['rdgr']['rawgit_replace'] = $extra_opts['rawgit_replace'];
|
||||
if ($GLOBALS['rdgr']['schemeless'] || $GLOBALS['rdgr']['replace_src']) {
|
||||
if ($url) {
|
||||
$GLOBALS['rdgr']['parsed_url'] = parse_url($url);
|
||||
$GLOBALS['rdgr']['urlparts']['domain_X'] = $GLOBALS['rdgr']['parsed_url']['scheme'].'://'.$GLOBALS['rdgr']['parsed_url']['host'];
|
||||
$GLOBALS['rdgr']['urlparts']['path_X'] = stripslashes(dirname($GLOBALS['rdgr']['parsed_url']['path']).'/');
|
||||
$GLOBALS['rdgr']['all_protocols'] = ['adc', 'afp', 'amqp', 'bacnet', 'bittorrent', 'bootp', 'camel', 'dict', 'dns', 'dsnp', 'dhcp', 'ed2k', 'empp', 'finger', 'ftp', 'gnutella', 'gopher', 'http', 'https', 'imap', 'irc', 'isup', 'javascript', 'ldap', 'mime', 'msnp', 'map', 'modbus', 'mosh', 'mqtt', 'nntp', 'ntp', 'ntcip', 'openadr', 'pop3', 'radius', 'rdp', 'rlogin', 'rsync', 'rtp', 'rtsp', 'ssh', 'sisnapi', 'sip', 'smtp', 'snmp', 'soap', 'smb', 'ssdp', 'stun', 'tup', 'telnet', 'tcap', 'tftp', 'upnp', 'webdav', 'xmpp'];
|
||||
}
|
||||
$GLOBALS['rdgr']['ext_array'] = [
|
||||
'src' => ['audio', 'embed', 'iframe', 'img', 'input', 'script', 'source', 'track', 'video'],
|
||||
'srcset' => ['source'],
|
||||
'data' => ['object'],
|
||||
'href' => ['link', 'area', 'a'],
|
||||
'action' => ['form'],
|
||||
//'param', 'applet' and 'base' tags are exclusion, because of a bit complex structure
|
||||
];
|
||||
$content = preg_replace_callback(
|
||||
'/<(((?!<).)*?)>/si', //avoids unclosed & closing tags
|
||||
function ($matches_A) {
|
||||
$content_A = $matches_A[0];
|
||||
$tagname = preg_match('/((.*?)(\s|$))/si', $matches_A[1], $n) ? $n[2] : '';
|
||||
foreach ($GLOBALS['rdgr']['ext_array'] as $key => $value) {
|
||||
if (in_array($tagname, $value)) {
|
||||
preg_match('/ '.$key.'=(\'|\")/i', $content_A, $n);
|
||||
if (!empty($n[1])) {
|
||||
$GLOBALS['rdgr']['aphostrope_type'] = $n[1];
|
||||
$content_A = preg_replace_callback(
|
||||
'/( '.$key.'='.$GLOBALS['rdgr']['aphostrope_type'].')(.*?)('.$GLOBALS['rdgr']['aphostrope_type'].')/i',
|
||||
function ($matches_B) {
|
||||
$full_link = $matches_B[2];
|
||||
//correction to files/urls
|
||||
if (!empty($GLOBALS['rdgr']['replace_src'])) {
|
||||
//if not schemeless url
|
||||
if (substr($full_link, 0, 2) != '//') {
|
||||
$replace_src_allow = true;
|
||||
//check if the link is a type of any special protocol
|
||||
foreach ($GLOBALS['rdgr']['all_protocols'] as $each_protocol) {
|
||||
//if protocol found - dont continue
|
||||
if (substr($full_link, 0, strlen($each_protocol) + 1) == $each_protocol.':') {
|
||||
$replace_src_allow = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($replace_src_allow) {
|
||||
$full_link = $GLOBALS['rdgr']['urlparts']['domain_X'].(str_replace('//', '/', $GLOBALS['rdgr']['urlparts']['path_X'].$full_link));
|
||||
}
|
||||
}
|
||||
}
|
||||
//replace http(s) with sheme-less urls
|
||||
if (!empty($GLOBALS['rdgr']['schemeless'])) {
|
||||
$full_link = str_replace(['https://', 'http://'], '//', $full_link);
|
||||
}
|
||||
//replace github mime
|
||||
if (!empty($GLOBALS['rdgr']['rawgit_replace'])) {
|
||||
$full_link = str_replace('//raw.github'.'usercontent.com/', '//rawgit.com/', $full_link);
|
||||
}
|
||||
$matches_B[2] = $full_link;
|
||||
unset($matches_B[0]);
|
||||
$content_B = '';
|
||||
foreach ($matches_B as $each) {
|
||||
$content_B .= $each;
|
||||
}
|
||||
|
||||
return $content_B;
|
||||
},
|
||||
$content_A
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $content_A;
|
||||
},
|
||||
$content
|
||||
);
|
||||
$content = preg_replace_callback(
|
||||
'/style="(.*?)background(\-image|)(.*?|)\:(.*?|)url\((\'|\"|)(.*?)(\'|\"|)\)/i',
|
||||
function ($matches_A) {
|
||||
$url = $matches_A[7];
|
||||
$url = (substr($url, 0, 2) == '//' || substr($url, 0, 7) == 'http://' || substr($url, 0, 8) == 'https://' ? $url : '#');
|
||||
|
||||
return 'style="'.$matches_A[1].'background'.$matches_A[2].$matches_A[3].':'.$matches_A[4].'url('.$url.')'; //$matches_A[5] is url taged ,7 is url
|
||||
},
|
||||
$content
|
||||
);
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,20 @@ include_once __DIR__.'/../../core.php';
|
|||
$id = post('id');
|
||||
|
||||
switch (post('op')) {
|
||||
case 'check':
|
||||
$api = json_decode(get_remote_data('https://api.github.com/repos/devcode-it/openstamanager/releases'), true);
|
||||
|
||||
$version = ltrim($api[0]['tag_name'], 'v');
|
||||
$current = Update::getVersion();
|
||||
|
||||
if (version_compare($current, $version) < 0) {
|
||||
echo $version;
|
||||
} else {
|
||||
echo 'none';
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'upload':
|
||||
include $docroot.'/modules/aggiornamenti/upload_modules.php';
|
||||
|
||||
|
|
|
@ -39,9 +39,13 @@ if (setting('Attiva aggiornamenti')) {
|
|||
}
|
||||
|
||||
echo '
|
||||
<div class="box box-success">
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="box box-success">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Carica un aggiornamento').' <span class="tip" title="'.tr('Form di caricamento per aggiornamenti del gestionale e innesti di moduli e plugin').'"><i class="fa fa-question-circle-o"></i></span></h3>
|
||||
<h3 class="box-title">
|
||||
'.tr('Carica un aggiornamento').' <span class="tip" title="'.tr('Form di caricamento per aggiornamenti del gestionale e innesti di moduli e plugin').'"><i class="fa fa-question-circle-o"></i></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<form action="'.ROOTDIR.'/controller.php?id_module='.$id_module.'" method="post" enctype="multipart/form-data" class="form-inline" id="update">
|
||||
|
@ -54,6 +58,50 @@ if (setting('Attiva aggiornamenti')) {
|
|||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<script>
|
||||
function search(button) {
|
||||
buttonLoading(button);
|
||||
|
||||
$.ajax({
|
||||
url: globals.rootdir + "/actions.php",
|
||||
type: "post",
|
||||
data: {
|
||||
id_module: globals.id_module,
|
||||
op: "check",
|
||||
},
|
||||
success: function(data){
|
||||
if (data == "none") {
|
||||
$("#update-search").html("'.tr("Nessun aggiornamento presente").'.");
|
||||
} else {
|
||||
$("#update-search").html("'.tr("E' stato individuato un nuovo aggiornamento").': " + data + ".<br>'.tr('Scaricalo ora: _LINK_', [
|
||||
'_LINK_' => "<a href='https://github.com/devcode-it/openstamanager/releases'>https://github.com/devcode-it/openstamanager/releases</a>"
|
||||
]).'");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>';
|
||||
|
||||
echo '
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="box box-info">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">
|
||||
'.tr('Ricerca aggiornamenti').' <span class="tip" title="'.tr('Controllo automatica sulla presenza di aggiornamenti del gestionale').'"><i class="fa fa-question-circle-o"></i></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="box-body" id="update-search">
|
||||
<button type="button" class="btn btn-info btn-block" onclick="search(this)">
|
||||
<i class="fa fa-search"></i> '.tr('Ricerca').'
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@ $('#id_record').change( function(){
|
|||
});
|
||||
|
||||
$( "#example" ).click(function(event) {
|
||||
|
||||
var module = $('#id_record').find(':selected').data('text').toLowerCase();
|
||||
var dir = "<?php echo ROOTDIR; ?>/modules/"+module+"/import.php";
|
||||
var file = "<?php echo ROOTDIR; ?>/files/"+module+"/"+module+".csv";
|
||||
|
@ -52,7 +51,9 @@ $( "#example" ).click(function(event) {
|
|||
$.ajax({
|
||||
url: dir,
|
||||
type: 'post',
|
||||
data: {op: 'example', module: module},
|
||||
data: {
|
||||
op: 'example', module: module
|
||||
},
|
||||
success: function(data){
|
||||
window.location = file;
|
||||
$('#main_loading').fadeOut();
|
||||
|
|
Loading…
Reference in New Issue