remote = "https://codiad.telaaedifex.com/update/?v={VER}&o={OS}&p={PHP}&w={WEB}&a={ACT}"; $this->commits = "https://gitlab.telaaedifex.com/xevidos/codiad/commits/master"; $this->archive = "https://gitlab.telaaedifex.com/xevidos/codiad/-/archive/master/codiad-master.zip"; $this->type = ""; } ////////////////////////////////////////////////////////////////// // Set Initial Version ////////////////////////////////////////////////////////////////// public function Init() { $version = array(); if(!file_exists(DATA ."/version.php")) { if(file_exists(BASE_PATH."/.git/HEAD")) { $remote = $this->getRemoteVersion("install_git", $this->type); $local = $this->getLocalVersion(); $version[] = array("version"=>$local[0]['version'],"time"=>time(),"optout"=>"true","name"=>""); saveJSON('version.php',$version); } else { $remote = $this->getRemoteVersion("install_man", $this->type); $version[] = array("version"=>$remote[0]["commit"]["sha"],"time"=>time(),"optout"=>"true","name"=>""); saveJSON('version.php',$version); } } else { $local = $this->getLocalVersion(); if(file_exists(BASE_PATH."/.git/HEAD")) { $current = getJSON('version.php'); if($local[0]['version'] != $current[0]['version']) { $remote = $this->getRemoteVersion("update_git", $this->type, $local[0]['version']); $version[] = array("version"=>$local[0]['version'],"time"=>time(),"optout"=>"true","name"=>""); saveJSON('version.php',$version); } } else { if($local[0]['version'] == '' && $local[0]['name'] == $_SESSION['user']) { $remote = $this->getRemoteVersion("update_man", $this->type, $local[0]['version']); $version[] = array("version"=>$remote[0]["commit"]["sha"],"time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); saveJSON('version.php',$version); } } $local = $this->getLocalVersion(); if(!isset($local[0]['optout'])) { $remote = $this->getRemoteVersion("optout", $this->type, $local[0]['version']); $this->OptOut(); } } if(!file_exists(DATA."/config/".get_called_class().".php")) { mkdir(DATA."/config"); $settings = array("type"=>"stable"); saveJSON("/config/".get_called_class().".php",$settings); } } ////////////////////////////////////////////////////////////////// // Clear Version ////////////////////////////////////////////////////////////////// public function Clear() { $version[] = array("version"=>"","time"=>time(),"optout"=>"true","name"=>$_SESSION['user']); saveJSON('version.php',$version); } ////////////////////////////////////////////////////////////////// // Clear Version ////////////////////////////////////////////////////////////////// public function OptOut() { $current = getJSON('version.php'); $version[] = array("version"=>$current[0]['version'],"time"=>$current[0]['time'],"optout"=>"true","name"=>$current[0]['name']); saveJSON('version.php',$version); } ////////////////////////////////////////////////////////////////// // Check Version ////////////////////////////////////////////////////////////////// public function Check() { if($this->type == 'undefined' || $this->type == '') { $data = getJSON("/config/".get_called_class().".php"); $this->type = $data['type']; } $local = $this->getLocalVersion(); $remote = $this->getRemoteVersion("check", $this->type, $local[0]['version']); $settings = array("type"=>$this->type); saveJSON("/config/".get_called_class().".php",$settings); $nightly = true; $archive = Common::getConstant('ARCHIVEURL', $this->archive); $latestversion = ''; $latestname = ''; if(file_exists(BASE_PATH."/.git/FETCH_HEAD")) { $autoupdate = '-1'; } else { if(is_writeable(BASE_PATH) && is_writeable(COMPONENTS) && is_writeable(THEMES)) { if(extension_loaded('zip') && extension_loaded('openssl') && ini_get('allow_url_fopen') == 1) { $autoupdate = '1'; } else { $autoupdate = '-1'; } } else { $autoupdate = '0'; } } $local[0]['tag'] = $local[0]['version']; foreach($remote as $tag) { if($latestversion == '') { if($tag['name'] != 'latest') { $latestname = $tag["name"]; } else { $latestname = 'Latest Commit from Repository'; } $latestversion = $tag["commit"]["sha"]; $archive = $tag["zipball_url"]; } if($local[0]['version'] == $tag["commit"]["sha"]) { if($tag['name'] != 'latest') { $local[0]['tag'] = $tag["name"]; } $nightly = false; break; } } $search = array("\r\n", "\n", "\r"); $replace = array(" ", " ", " "); $message = ''; $merge = ''; $commits = json_decode(file_get_contents(Common::getConstant('COMMITURL', $this->commits)),true); foreach($commits as $commit) { if($local[0]['version'] != $commit["sha"]) { if(strpos($commit["commit"]["message"],"Merge") === false) { $message .= '- '.str_replace($search,$replace,$commit["commit"]["message"]).'
'; } else { $merge .= '- '.str_replace($search,$replace,$commit["commit"]["message"]).'
'; } } else { break; } } if($message == '') { $message = $merge; } return "[".formatJSEND("success",array("currentname"=>$local[0]['tag'], "currentversion"=>$local[0]['version'],"remoteversion"=>$latestversion,"remotename"=>$latestname,"message"=>$message,"archive"=>$archive,"nightly"=>$nightly,"autoupdate"=>$autoupdate,"name"=>$local[0]['name']))."]"; } ////////////////////////////////////////////////////////////////// // Get Local Version ////////////////////////////////////////////////////////////////// public function getLocalVersion() { if(file_exists(BASE_PATH."/.git/HEAD")) { $tmp = file_get_contents(BASE_PATH."/.git/HEAD"); if (strpos($tmp,"ref:") === false) { $data[0]['version'] = trim($tmp); } else { $data[0]['version'] = trim(file_get_contents(BASE_PATH."/.git/".trim(str_replace('ref: ', '', $tmp)))); } $data[0]['name'] = ""; } else { $data = getJSON('version.php'); } return $data; } ////////////////////////////////////////////////////////////////// // Get Remote Version ////////////////////////////////////////////////////////////////// public function getRemoteVersion($action, $type, $localversion = "") { $remoteurl = Common::getConstant('UPDATEURL', $this->remote); $remoteurl = str_replace("{OS}", PHP_OS, $remoteurl); $remoteurl = str_replace("{PHP}", phpversion(), $remoteurl); $remoteurl = str_replace("{VER}", $localversion, $remoteurl); $remoteurl = str_replace("{WEB}", urlencode($_SERVER['SERVER_SOFTWARE']), $remoteurl); $remoteurl = str_replace("{ACT}", $action, $remoteurl); if($type == 'latest') { $remoteurl = $remoteurl.'&l'; } return json_decode(file_get_contents($remoteurl),true); } ////////////////////////////////////////////////////////////////// // Download Version ////////////////////////////////////////////////////////////////// public function Download() { if(file_exists('../../'.$this->commit.'.zip')) { unlink('../../'.$this->commit.'.zip'); } file_put_contents('../../'.$this->commit.'.zip', fopen(str_replace('master', $this->commit, $this->archive), 'r')); $data = 'commit.'"; function delTree($dir) { $files = array_diff(scandir($dir), array(".","..")); foreach ($files as $file) { (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); } return rmdir($dir); } function cpy($source, $dest, $ign, $frc){ if(is_dir($source)) { $dir_handle=opendir($source); while($file=readdir($dir_handle)){ if(!in_array($file, array(".",".."))) { if(!in_array($file, $ign) || in_array($file, $frc)){ if(is_dir($source."/".$file)){ if(!file_exists($dest."/".$file)) { @mkdir($dest."/".$file); } cpy($source."/".$file, $dest."/".$file, $ign, $frc); rmdir($source."/".$file); } else { copy($source."/".$file, $dest."/".$file); unlink($source."/".$file); } } else { if(array_key_exists($file, $frc)) { if(is_dir($source."/".$file)){ if(!file_exists($dest."/".$file)) { @mkdir($dest."/".$file); } cpy($source."/".$file."/".$frc[$file], $dest."/".$file."/".$frc[$file], $ign, $frc); } else { copy($source."/".$file, $dest."/".$file); unlink($source."/".$file); } } } } } closedir($dir_handle); } else { copy($source, $dest); unlink($source); } } // Getting current codiad path $path = rtrim(str_replace($commit.".php", "", $_SERVER["SCRIPT_FILENAME"]),"/"); $ignore = array(".git", "config.json", "data", "workspace", "plugins", "themes", "backup", "config.php", $commit.".php",$commit.".zip", "Codiad-".$commit); $force = array("themes" => "default", "themes" => "README.md"); $zip = new ZipArchive; $res = $zip->open($path."/".$commit.".zip"); // open downloaded archive if ($res === TRUE) { // extract archive if($zip->extractTo($path) === true) { // delete old files except some directories and files if(!file_exists($path."/backup")) { mkdir($path."/backup"); } cpy($path, $path."/backup", $ignore, $force); // move extracted files to path cpy($path."/Codiad-".$commit, $path, array(), array()); // store current commit to version.json $version = array(); $version[] = array("version"=>$commit,"optout"=>"true","name"=>"'.$_SESSION['user'].'","time"=>"'.time().'"); file_put_contents($path."/data/version.php", ""); // cleanup and restart codiad @$zip->close(); delTree($path."/backup"); rmdir($path."/Codiad-".$commit); unlink($path."/".$commit.".zip"); unlink($path."/".$commit.".php"); header("Location: ".str_replace($commit.".php","",$_SERVER["SCRIPT_NAME"])); } else { echo "Unable to extract ".$path."/".$commit.".zip to path ".$path; } $zip->close(); } else { echo "Unable to open ".$path."/".$commit.".zip"; } ?>'; $write = fopen('../../'.$this->commit.'.php', 'w') or die("can't open file"); fwrite($write, $data); fclose($write); @session_unset(); @session_destroy(); session_start(); echo formatJSEND("success",null); } }