2025-06-24 21:05:13 +02:00
< ? php global $session ;
2025-06-20 19:10:23 +02:00
/**
2025-06-23 19:41:29 +02:00
* Project : BeCast WebEngine - simple site engine
2025-06-20 19:10:23 +02:00
* File : / admin / versions . apnl . php
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library 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
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
2025-06-23 19:41:29 +02:00
* @ link http :// www . becast . at
* @ copyright 2009 - 2025 becast . at
2025-06-20 19:10:23 +02:00
* @ author Bernhard Jaud < bernhard at becast dot at >
2025-06-23 19:41:29 +02:00
* @ package BcWe core
2025-06-20 19:10:23 +02:00
* @ license http :// opensource . org / licenses / gpl - license . php GNU Public License
* @ version $Id $
2025-06-23 19:41:29 +02:00
*/
If ( ! defined ( " IN_BCWE_ADMIN " )) {
2025-06-20 19:10:23 +02:00
die ( " Dieses Script kann nicht ausserhalb des Frameworks laufen! " );
}
$addnav [ " right " ] = FALSE ;
$session -> page_begin ( " Version " , True );
$subnav_item = " <a href= \" /management.html \" >Verwaltung</a> » <a>Systemstatus</a> " ;
class versions_panel extends admin_module {
function output (){
global $module , $config , $db , $panel , $admin , $module , $root , $core ;
$files = $this -> listdir ( $root . '/modules' );
foreach ( $files as $file ){
$file_object = array (
'name' => substr ( $file , strlen ( $root . '/modules/' )),
'size' => $this -> byteConvert ( filesize ( $file )),
'time' => date ( " d.m.Y, H:i:s " , filemtime ( $file )));
$dir_objects [] = $file_object ;
}
2025-06-24 21:05:13 +02:00
$url = " https://webengine.becast.at/index.php?task=versioncheck " ;
$out = xml2array ( $url );
if ( ! empty ( $out )){
2025-06-20 19:10:23 +02:00
$i = 0 ;
2025-06-24 21:05:13 +02:00
$max = count ( $out [ 'release' ][ " mod " ]);
2025-06-20 19:10:23 +02:00
while ( $i <= $max ){
2025-06-24 21:05:13 +02:00
$versions [ $i ][ " name " ] = $out [ 'release' ][ " mod " ][ $i ][ " name " ];
$versions [ $i ][ " ver " ] = $out [ 'release' ][ " mod " ][ $i ][ " ver " ];
$versions [ $i ][ " file " ] = $out [ 'release' ][ " mod " ][ $i ][ " file " ];
2025-06-20 19:10:23 +02:00
$i ++ ;
}
$vers = $core -> ver_major . " . " . $core -> ver_minor . " . " . $core -> ver_rev ;
$panel -> title = " Moduleversionen " ;
2025-06-24 21:05:13 +02:00
$panel -> content .= " <table style= \" width='80%'; \" >
2025-06-20 19:10:23 +02:00
< tr >
2025-06-24 21:05:13 +02:00
< th style = \ " text-align='center'; \" >Modul</th>
< th style = \ " text-align='center'; \" >Version</th>
< th style = \ " text-align='center'; \" >Update</th>
2025-06-20 19:10:23 +02:00
</ tr > " ;
2025-06-24 21:05:13 +02:00
if ( $out [ " release " ][ " version " ] > $vers ){
$panel -> content .= " <tr><td colspan= \" 3 \" >Diese Version ist nicht mehr aktuell.<br />Besuche <a href= \" https://webengine.becast.at \" >die Projektseite</a> für ein Update</td></tr> " ;
2025-06-20 19:10:23 +02:00
} else {
2025-06-24 21:05:13 +02:00
foreach ( $module as $mod ){
$panel -> content .= " <tr>
< td style = \ " text-align='center'; \" > " . $mod [ " name " ] . " </td>
< td style = \ " text-align='center'; \" > " . $mod [ " ver " ] . " </td> " ;
foreach ( $versions as $v ){
if ( $v [ " name " ] == $mod [ " name " ]){
if ( $mod [ " ver " ] < $v [ " ver " ]){
$panel -> content .= " <td style= \" text-align='center'; \" ><a href= \" https://code.ehwurscht.at/genuineparts/BeCastWebEngine/src/branch/main/inc/ " . urlencode ( $v [ " file " ]) . " \" >Neue Version verfügbar!</a></td> " ;
} elseif ( $mod [ " ver " ] == $v [ " ver " ]){
$panel -> content .= " <td style= \" text-align='center'; \" >Aktuell</td> " ;
} else {
$panel -> content .= " <td style= \" text-align='center'; \" >Modified file?</td> " ;
2025-06-20 19:10:23 +02:00
}
}
2025-06-24 21:05:13 +02:00
}
$panel -> content .= " </tr> " ;
}
foreach ( $core -> mod_ as $mod ){
$panel -> content .= " <tr>
< td align = \ " center \" ><a href= \" " . $mod [ " url " ] . " \" > " . $mod [ " name " ] . " <a></td>
< td align = \ " center \" > " . $mod [ " version " ] . " </td> " ;
foreach ( $versions as $v ){
if ( $v [ " name " ] == $mod [ " name " ]){
if ( $mod [ " version " ] < $v [ " ver " ]){
$panel -> content .= " <td style= \" text-align='center'; \" ><a href= \" http://projectx.becast.at/get_file.php?file= " . urlencode ( $v [ " name " ]) . " \" >Neue Version verfügbar!</a></td> " ;
} elseif ( $mod [ " version " ] == $v [ " ver " ]){
$panel -> content .= " <td style= \" text-align='center'; \" >Aktuell</td> " ;
} else {
$panel -> content .= " <td style= \" text-align='center'; \" >Modified file?</td> " ;
2025-06-20 19:10:23 +02:00
}
}
2025-06-24 21:05:13 +02:00
}
$panel -> content .= " </tr> " ;
2025-06-20 19:10:23 +02:00
}
}
2025-06-24 21:05:13 +02:00
$panel -> content .= " </table><br /> " ;
$panel -> parse_page ();
} else {
$panel -> title = " Moduleversionen " ;
$panel -> content .= " Die Versionprüfung ist fehlgeschlagen. " ;
$panel -> content .= " <table style= \" width='80%'; \" >
< tr >
< th style = \ " text-align='center'; \" >Modul</th>
< th style = \ " text-align='center'; \" >Version</th>
</ tr > " ;
foreach ( $module as $mod ){
$panel -> content .= " <tr>
< td style = \ " text-align='center'; \" > " . $mod [ " name " ] . " </td>
< td style = \ " text-align='center'; \" > " . $mod [ " ver " ] . " </td> " ;
$panel -> content .= " </tr> " ;
}
$panel -> content .= " </table><br /> " ;
$panel -> parse_page ();
}
$panel -> title = " Datei Infos " ;
$panel -> content .= " <table style= \" width='80%'; \" >
< tr >
< th style = \ " text-align='center'; \" >Datei</th>
< th style = \ " text-align='center'; \" >Größe</th>
< th style = \ " text-align='center'; \" >zuletzt Geändert</th>
</ tr > " ;
foreach ( $dir_objects as $files ){
$panel -> content .= " <tr>
< td style = \ " text-align='center'; \" > " . $files [ " name " ] . " </td>
< td style = \ " text-align='center'; \" > " . $files [ " size " ] . " </td>
< td style = \ " text-align='center'; \" > " . $files [ " time " ] . " </td>
</ tr > " ;
}
2025-06-20 19:10:23 +02:00
2025-06-24 21:05:13 +02:00
$panel -> content .= " </table> " ;
2025-06-20 19:10:23 +02:00
}
function byteConvert ( $bytes ) {
if ( $bytes <= 0 )
return '0 Byte' ;
$convention = 1000 ; //[1000->10^x|1024->2^x]
$s = array ( 'B' , 'kB' , 'MB' , 'GB' , 'TB' , 'PB' , 'EB' , 'ZB' );
$e = floor ( log ( $bytes , $convention ));
return round ( $bytes / pow ( $convention , $e ), 2 ) . ' ' . $s [ $e ];
}
function listdir ( $start_dir = '.' ) {
$files = array ();
if ( is_dir ( $start_dir )) {
$fh = opendir ( $start_dir );
while (( $file = readdir ( $fh )) !== false ) {
# loop through the files, skipping . and .., and recursing if necessary
if ( strcmp ( $file , '.' ) == 0 || strcmp ( $file , '..' ) == 0 ) continue ;
$filepath = $start_dir . '/' . $file ;
if ( is_dir ( $filepath ) )
$files = array_merge ( $files , $this -> listdir ( $filepath ));
else
array_push ( $files , $filepath );
}
closedir ( $fh );
} else {
# false if the function was called with an invalid non-directory argument
$files = false ;
}
return $files ;
}
}
2025-06-24 21:05:13 +02:00
function xml2array ( $url , $get_attributes = 1 , $priority = 'tag' )
{
$contents = " " ;
if ( ! function_exists ( 'xml_parser_create' ))
{
return array ();
2025-06-20 19:10:23 +02:00
}
2025-06-24 21:05:13 +02:00
$parser = xml_parser_create ( '' );
if ( ! ( $fp = @ fopen ( $url , 'rb' )))
{
return array ();
2025-06-20 19:10:23 +02:00
}
2025-06-24 21:05:13 +02:00
while ( ! feof ( $fp ))
{
$contents .= fread ( $fp , 8192 );
2025-06-20 19:10:23 +02:00
}
2025-06-24 21:05:13 +02:00
fclose ( $fp );
xml_parser_set_option ( $parser , XML_OPTION_TARGET_ENCODING , " UTF-8 " );
xml_parser_set_option ( $parser , XML_OPTION_CASE_FOLDING , 0 );
xml_parser_set_option ( $parser , XML_OPTION_SKIP_WHITE , 1 );
xml_parse_into_struct ( $parser , trim ( $contents ), $xml_values );
xml_parser_free ( $parser );
if ( ! $xml_values )
return ; //Hmm...
$xml_array = array ();
$parents = array ();
$opened_tags = array ();
$arr = array ();
$current = & $xml_array ;
$repeated_tag_index = array ();
foreach ( $xml_values as $data )
{
unset ( $attributes , $value );
extract ( $data );
$result = array ();
$attributes_data = array ();
if ( isset ( $value ))
{
if ( $priority == 'tag' )
$result = $value ;
2025-06-20 19:10:23 +02:00
else
2025-06-24 21:05:13 +02:00
$result [ 'value' ] = $value ;
2025-06-20 19:10:23 +02:00
}
2025-06-24 21:05:13 +02:00
if ( isset ( $attributes ) and $get_attributes )
{
foreach ( $attributes as $attr => $val )
{
if ( $priority == 'tag' )
$attributes_data [ $attr ] = $val ;
else
$result [ 'attr' ][ $attr ] = $val ; //Set all the attributes in a array called 'attr'
2025-06-20 19:10:23 +02:00
}
}
2025-06-24 21:05:13 +02:00
if ( $type == " open " )
{
$parent [ $level - 1 ] = & $current ;
if ( ! is_array ( $current ) or ( ! in_array ( $tag , array_keys ( $current ))))
{
$current [ $tag ] = $result ;
if ( $attributes_data )
$current [ $tag . '_attr' ] = $attributes_data ;
$repeated_tag_index [ $tag . '_' . $level ] = 1 ;
$current = & $current [ $tag ];
}
2025-06-20 19:10:23 +02:00
else
2025-06-24 21:05:13 +02:00
{
if ( isset ( $current [ $tag ][ 0 ]))
{
$current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ]] = $result ;
$repeated_tag_index [ $tag . '_' . $level ] ++ ;
}
2025-06-20 19:10:23 +02:00
else
2025-06-24 21:05:13 +02:00
{
$current [ $tag ] = array (
$current [ $tag ],
$result
);
$repeated_tag_index [ $tag . '_' . $level ] = 2 ;
if ( isset ( $current [ $tag . '_attr' ]))
{
$current [ $tag ][ '0_attr' ] = $current [ $tag . '_attr' ];
unset ( $current [ $tag . '_attr' ]);
}
}
$last_item_index = $repeated_tag_index [ $tag . '_' . $level ] - 1 ;
$current = & $current [ $tag ][ $last_item_index ];
}
}
elseif ( $type == " complete " )
{
if ( ! isset ( $current [ $tag ]))
{
$current [ $tag ] = $result ;
$repeated_tag_index [ $tag . '_' . $level ] = 1 ;
if ( $priority == 'tag' and $attributes_data )
$current [ $tag . '_attr' ] = $attributes_data ;
2025-06-20 19:10:23 +02:00
}
else
2025-06-24 21:05:13 +02:00
{
if ( isset ( $current [ $tag ][ 0 ]) and is_array ( $current [ $tag ]))
{
$current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ]] = $result ;
if ( $priority == 'tag' and $get_attributes and $attributes_data )
{
$current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ] . '_attr' ] = $attributes_data ;
}
$repeated_tag_index [ $tag . '_' . $level ] ++ ;
}
else
{
$current [ $tag ] = array (
$current [ $tag ],
$result
);
$repeated_tag_index [ $tag . '_' . $level ] = 1 ;
if ( $priority == 'tag' and $get_attributes )
{
if ( isset ( $current [ $tag . '_attr' ]))
{
$current [ $tag ][ '0_attr' ] = $current [ $tag . '_attr' ];
unset ( $current [ $tag . '_attr' ]);
}
if ( $attributes_data )
{
$current [ $tag ][ $repeated_tag_index [ $tag . '_' . $level ] . '_attr' ] = $attributes_data ;
}
}
$repeated_tag_index [ $tag . '_' . $level ] ++ ; //0 and 1 index is already taken
}
}
}
elseif ( $type == 'close' )
{
$current = & $parent [ $level - 1 ];
2025-06-20 19:10:23 +02:00
}
}
2025-06-24 21:05:13 +02:00
return ( $xml_array );
2025-06-20 19:10:23 +02:00
}