/
gezikoff
/
nes-sib.ru
Обзор
Документация
Войти
/
gezikoff
/
nes-sib.ru
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
get_function.php
836 строк
50 KB
garry
Initial commit
18 фев 2026, 18:53
18 фев 2026, 18:53
33bf375
Код
Авторство
О чём код?
<?php //Подключаем битриксовые классы УДАЛИТЬ ПОТОМ ИХ! require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_class.php"); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php"); //Указываем путь до директории куда будет происходить скачивание //Изменить на свой в будующем $dir = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/"; //Инфа по иконкам $pic['iconF'] = '<div class="icon iconF tooltip" data-tooltip="Присутствует файл в папке обновлений!"></div>'; $pic['keyF'] = '<div class="icon keyF tooltip" data-tooltip="Модуль достуен на ключе!"></div>'; $pic['keyA'] = '<div class="icon keyA tooltip" data-tooltip="Модуль доступен на ключе, но закончился срок получения обновлений!"></div>'; $pic['checkF'] = '<div class="icon checkF tooltip" data-tooltip="Модуль установлен!"></div>'; $pic['empty'] = '<div class="icon"></div>'; $ajaxloading = "<div class='cssload-container'><div class='cssload-shaft1'></div><div class='cssload-shaft2'></div><div class='cssload-shaft3'></div><div class='cssload-shaft4'></div><div class='cssload-shaft5'></div><div class='cssload-shaft6'></div><div class='cssload-shaft7'></div><div class='cssload-shaft8'></div><div class='cssload-shaft9'></div><div class='cssload-shaft10'></div></div>"; //Все функции function clear(){unset($_SESSION['KeyInfo']);unset($_SESSION['k']);unset($_SESSION['Key']);} //Формирует запрос на сервера битрикса $gzip, $step, $type, $module=NULL, $data=NULL, $ver=NUL /* array( 0 utf - поддержка utf 1 gzip - поддержка сжатия 2 step - вид запроса 3 type - тип страницы запроса STEPM|LIST 4 idmodule - идентификатор модуля 5 ver - текущая установленная версия модуля 6 data - остальные данные 7 fname - имя файла ); */ function response($p) { $key = $_SESSION['k']; $str = "utf=".$p['utf']. "&lang=ru". "&stable=Y". "&CANGZIP=".$p['gzip']. "&SUPD_DBS=MYSQL". "&XE=N". "&LICENSE_KEY=".md5($key). "&SUPD_STS=1". "&SUPD_URS=0". "&SUPD_URSA=1". "&TYPENC=E". "&CLIENT_PHPVER=5.5.14". "&dbv=5.5.41"; switch ($p['step']) { case "info_key": $str .= "&fullmoduleinfo=Y&SUPD_SRS=RU&SUPD_CMP=N&product=BSM&verfix=2"; break; case "module_info": $str .= "&reqm=".$p['idmodule']."&lim=Y&SUPD_SRS=RU&SUPD_CMP=N&product=BSM&verfix=2"; break; case "download": $str .= "&reqm=".$p['idmodule']."&lim=Y&SUPD_SRS=RU&SUPD_CMP=N&UFILE=".$p['data']."&USTART=0&product=BSM&verfix=2"; break; case "updates": $str .= "&instm=".$p['data']."&reqm=".$p['idmodule']."&lim=Y&SUPD_SRS=RU&SUPD_CMP=N&product=BSM&verfix=2"; break; } if(GetHTTPBitrix($p['fname'], $p['type'], $str)) return TRUE; else return FALSE; } //////////////////////////////////////////////// // РАБОТАЕМ ИСКЛЮЧИТЕЛЬНО С ИНФОРМАЦИЕЙ О КЛЮЧЕ //Получает информацию о ключе function getKeyInfo($q=FALSE){ if($q) {$result = &$_SESSION['Key']; $key = $_SESSION['k']; $_SESSION['k'] = $_POST["k"];} else $result = &$_SESSION['KeyInfo']; //формируем массив запроса $query = array( 'utf' => 'Y', 'gzip' => 'N', 'step' => 'info_key', 'type' => 'LIST', 'fname' => 'keyinfo'); //Если запрос к серверу вернул ИСТИНУ if(response($query)){ $file = get_tmp_file($query['fname']); $infoKey = file_get_contents($file); unlink($file); $arrInfoKey = Array(); CUpdateClientPartner::__ParseServerData($infoKey, $arrInfoKey, $strError_tmp); //Проверяем на наличие ошибок if(isset($arrInfoKey['DATA']['#']['ERROR'])) $result['ERROR'] = $arrInfoKey['DATA']['#']['ERROR']['0']['#']; else{ //Формируем массив с ответом $result['CLIENT']['NAME'] = $arrInfoKey['DATA']['#']['CLIENT']['0']['@']['NAME']; $result['CLIENT']['DATE_FROM'] = $arrInfoKey['DATA']['#']['CLIENT']['0']['@']['DATE_FROM']; $result['CLIENT']['DATE_TO'] = $arrInfoKey['DATA']['#']['CLIENT']['0']['@']['DATE_TO']; //пробегаемся по модулям если они есть и дергаем информацию foreach($arrInfoKey['DATA']['#']['MODULE'] as $value){ $moduleId = $value['@']['ID']; $result['MODULES'][$moduleId]['ID'] = $moduleId; $result['MODULES'][$moduleId]['NAME'] = $value['@']['NAME']; $result['MODULES'][$moduleId]['DATE_FROM'] = $value['@']['DATE_FROM']; $result['MODULES'][$moduleId]['DATE_TO'] = $value['@']['DATE_TO']; $result['MODULES'][$moduleId]['UPDATE_END'] = $value['@']['UPDATE_END']; $result['MODULES'][$moduleId]['KEY'] = 'Y'; if (!empty($value['#'])) { foreach($value['#']['VERSION'] as $val){ $ver = $val['@']['ID']; $result['MODULES'][$moduleId]['VERSIONS'][$ver]['ID'] = $moduleId; $result['MODULES'][$moduleId]['VERSIONS'][$ver]['UPDATE_VERSION'] = $ver; $result['MODULES'][$moduleId]['VERSIONS'][$ver]['DESC'] = $val['#']['DESCRIPTION']['0']['#']; } } } } if($q) {unset($_SESSION['k']); $_SESSION['k'] = $key;} return $result; } //Иначе ошибка else return $result['ERROR'] = UNKNOWNERROR; } //Добавляет информацию о файлах модуля в сессию function getModuleInfo($moduleId){ //Проверяем на доступность обновлений и информацию хранящююся в сессии $module = &$_SESSION['KeyInfo']['MODULES'][$moduleId]; if( (!$module['UFILE'] || !$module['FSIZE']) && $module['UPDATE_END'] != 'Y'){ $query = array( 'utf' => 'Y', 'gzip' => 'N', 'step' => 'module_info', 'type' => 'STEPM', 'idmodule' => $moduleId, 'fname' => 'info.'.$moduleId); if(response($query)){ $file = get_tmp_file($query['fname']); $infoModule = file_get_contents($file); unlink($file); $arrInfoModule = Array(); CUpdateClientPartner::__ParseServerData($infoModule, $arrInfoModule, $strError_tmp); $module['UFILE'] = $arrInfoModule['DATA']['#']['FILE']['0']['@']['NAME']; $module['FSIZE'] = $arrInfoModule['DATA']['#']['FILE']['0']['@']['SIZE']; }else return $_SESSION['KeyInfo']['ERROR'] = UNKNOWNERROR; } } //////////////////////////////////////////////// //////////////////////////////////////////////// //РАБОТАЕМ ИСКЛЮЧИТЕЛЬНО С ИНФОРМАЦИЕЙ ИЗ ПАПКИ ОБНОВЛЕНИЙ //Добавляет информацию о файлах обновлений в сессию function getMyUpdates(){ //Разбираем файлы в папке global $dir; $result = &$_SESSION['KeyInfo']['MODULES']; $arrDir = scandir($dir); foreach($arrDir as $val){ $arr = infUPD($val); //!!!!!!!!!!!!!! //Добавить поиск имени модуля в файле обновления ////// //Заносим информацию в сессию о доступных обновлениях if($arr['updtype'] == 'mod'){ $result[$arr['mid']]['UPDATE_VERSION'] = $arr['mver']; $result[$arr['mid']]['UPDATE_FILE'] = $arr['fname']; $result[$arr['mid']]['ID'] = $arr['mid']; } elseif($arr['updtype'] == 'delta'){ $result[$arr['mid']]['VERSIONS'][$arr['mver']]['UPDATE_VERSION'] = $arr['mver']; $result[$arr['mid']]['VERSIONS'][$arr['mver']]['UPDATE_FILE'] = $arr['fname']; $result[$arr['mid']]['VERSIONS'][$arr['mver']]['ID'] = $arr['mid']; } } } //разбирает имя файла на массив с данными function infUPD($fupd){ preg_match("/(\w+\.\w+)+\.(\d+\.\d+\.\d+)+\.(mod|delta)+.upd+/", $fupd, $arr); if(is_array($arr)){ $result['fname'] = $arr['0']; $result['mid'] = $arr['1']; $result['mver'] = $arr['2']; $result['updtype'] = $arr['3']; return $result; }else return NULL; } //////////////////////////////////////////////// //////////////////////////////////////////////// //РАБОТАЕМ ИСКЛЮЧИТЕЛЬНО С ИНФОРМАЦИЕ О СИСТЕМЕ //Получает список присутствующих в системе модулей function myModules(){ //Получаем список установленных модулей // Получаем массив установленных версий модулей с версиями $strError_tmp=''; $myModules = CUpdateClientPartner::GetCurrentModules($strError_tmp); //Убираем пример для скрытия модулей unset($myModules['module.name1-not_mine']); unset($myModules['module.name2-not_mine']); unset($myModules['module.name3-not_mine']); //убираем пометку "Не мое" скрывавшую модуль от сервера битрикса foreach($myModules as $key => $value){ $myModules[str_replace('-not_mine','',$key)] = $value; if (strpos($key,'-not_mine')) unset($myModules[$key]); } //Убираем все модули ядра $bitrixModules = array("abtest", "advertising", "b24connector", "bitrix.eshop", "bitrix.sitecommunity", "bitrix.sitecorporate", "bitrix.siteinfoportal", "bitrix.sitepersonal", "bitrixcloud", "bizproc", "bizprocdesigner", "blog", "calendar", "catalog", "clouds", "cluster", "compression", "conversion", "currency", "eshopapp", "fileman", "form", "forum", "highloadblock", "iblock", "idea", "im", "ldap", "learning", "lists", "mail", "main", "mobileapp", "perfmon", "photogallery", "pull", "report", "sale", "scale", "search", "security", "sender", "seo", "socialnetwork", "socialservices", "statistic", "storeassist", "subscribe", "support", "translate", "vote", "webservice", "wiki", "workflow"); foreach($bitrixModules as $value){ if(isset($myModules[$value])) unset($myModules[$value]); } //Получаем имена модулей foreach($myModules as $key => $value){ if(file_exists($lang=$_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/'.$key.'/lang/ru/install/index.php')) require($lang); foreach($MESS as $k => $v){ if(strpos($k, 'MODULE_NAME') or strpos($k,'INSTALL_NAME') or strpos($k,'MOD_NAME')) { $myModules[$key]['NAME'] = $v; } } unset($MESS); } return $myModules; } //Помещает информацию в сессию function getMyModules(){ $myModules = myModules(); foreach($myModules as $moduleId => $value){ $_SESSION['KeyInfo']['MODULES'][$moduleId]['INST_VERSION'] = $value['VERSION']; $_SESSION['KeyInfo']['MODULES'][$moduleId]['IS_DEMO'] = $value['IS_DEMO']; $_SESSION['KeyInfo']['MODULES'][$moduleId]['NAME'] = $value['NAME']; $_SESSION['KeyInfo']['MODULES'][$moduleId]['ID'] = $moduleId; } } //////////////////////////////////////////////// //Перестраивает массив без запроса данных с ключа. function rebuild(){ $_SESSION['KeyInfo'] = $_SESSION['Key']; getMyModules(); getMyUpdates(); } function GetHTTPBitrix($fname, $page, $str, $vfix=FALSE){ $requestIP = COption::GetOptionString("main", "update_site", DEFAULT_UPDATE_SERVER); $requestPort = 80; if($page == "LIST") $page = "smp_updater_list.php"; elseif($page == "STEPM") $page = "smp_updater_modules.php"; $FP = fsockopen($requestIP, $requestPort, $errno, $errstr, 120); if ($FP) { $strRequest = ""; $strRequest .= "POST /bitrix/updates/".$page." HTTP/1.0\r\n"; $strRequest .= "User-Agent: BitrixSMUpdater\r\n"; $strRequest .= "Accept: */*\r\n"; $strRequest .= "Host: ".$requestIP."\r\n"; $strRequest .= "Accept-Language: en\r\n"; $strRequest .= "Content-type: application/x-www-form-urlencoded\r\n"; $strRequest .= "Content-length: ".strlen($str)."\r\n\r\n"; $strRequest .= "$str"; $strRequest .= "\r\n"; fputs($FP, $strRequest); $bChunked = False; while (!feof($FP)){ $line = fgets($FP, 4096); if ($line != "\r\n"){ if (preg_match("/Transfer-Encoding: +chunked/i", $line)) $bChunked = True; }else break; } $content = ""; if ($bChunked){ $maxReadSize = 4096; $length = 0; $line = FGets($FP, $maxReadSize); $line = StrToLower($line); $strChunkSize = ""; $i = 0; while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"))) { $strChunkSize .= $line[$i]; $i++; } $chunkSize = hexdec($strChunkSize); while ($chunkSize > 0){ $processedSize = 0; $readSize = (($chunkSize > $maxReadSize) ? $maxReadSize : $chunkSize); while ($readSize > 0 && $line = fread($FP, $readSize)){ $content .= $line; $processedSize += StrLen($line); $newSize = $chunkSize - $processedSize; $readSize = (($newSize > $maxReadSize) ? $maxReadSize : $newSize); } $length += $chunkSize; $line = FGets($FP, $maxReadSize); $line = FGets($FP, $maxReadSize); $line = StrToLower($line); $strChunkSize = ""; $i = 0; while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"))) { $strChunkSize .= $line[$i]; $i++; } $chunkSize = hexdec($strChunkSize); } }else{ $file = fopen($_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$fname.".upd", "w"); while ($line = fread($FP, 4096)){ fwrite($file,$line); } fclose($file); } fclose($FP); }else return FALSE; return TRUE; } ////////////////////////////////////////////// function get_tmp_file($file,$upd=TRUE){ $str = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$file; if($upd)$str .= ".upd"; return $str; } //Убирает пометку "НЕ МОЕ" с ID модуля function not_mine(){ //Смотрим пропатчен ли апдейтер. Если нет — патчим его $path2 = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php"; $path3 = $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client.php"; $newstr = '/*PATCH*/if(file_exists($ff=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")) require($ff); /*END PATCH*/return $arClientModules;'; $newstr2 = '/*PATCH*/if(file_exists($ff=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")) require($ff);'; $oldstr = '/return\s\$arClientModules;/'; $isPatch = str_search($path2, $newstr); $isPatchToo = str_search($path3, $newstr2); $itsNumber = '/GetCurrentModules\(\S+\s\S+\s\S+\s\S(\S+)=\sarray/'; //ну, как смог... if(!$isPatch){ $arrfile = file($path2); foreach($arrfile as $key => $str){ $arrfile[$key] = preg_replace($oldstr, $newstr, $str); } $fp = fopen($path2, "w+"); // перезаписываем независимо от длины новой строки fwrite($fp,implode("",$arrfile)); fclose($fp); echo "<span style='color:red; font-size:16px;'>Внимание!!!<br><br>Файл /bitrix/modules/main/classes/general/update_client_partner.php пропатчен (искать по слову PATCH).</span><br><br>"; } //пропатчен ли update_client.php if(!$isPatchToo){ $arrfile = file($path3); foreach($arrfile as $key => $str){ preg_match($itsNumber, $str, $itsNumber); $itsNumber = $itsNumber[1]; $oldstr = '/return\s\$'.$itsNumber.';/'; $newstr2 = '/*PATCH*/if(file_exists($ff=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")) require($ff);foreach($arModules as $val){if(isset($'.$itsNumber.'[$val]))unset($'.$itsNumber.'[$val]);} /*END PATCH*/return $'.$itsNumber.';'; $arrfile[$key] = preg_replace($oldstr, $newstr2, $str); } $fp = fopen($path3, "w+"); // перезаписываем независимо от длины новой строки fwrite($fp,implode("",$arrfile)); fclose($fp); echo "<span style='color:red; font-size:16px;'>Внимание!!!<br><br>Файл /bitrix/modules/main/classes/general/update_client.php пропатчен (искать по слову PATCH).</span><br><br>"; } // Проверяем есть ли файл, если да, то не меняем его if(!file_exists($path=$_SERVER["DOCUMENT_ROOT"]."/not_mine.php")){ $fp = fopen($path,"w+"); fwrite ($fp, "<?\r\n//Замените названия module.name1, module.name2, module.name3 и так далее на модули которые хотите скрыть от серверов битрикса\r\n".'$'."arModules = array( \r\n'acrit.export … [Строка слишком длинная. Вы можете скачать файл] fclose($fp); echo "<span style='color:red; font-size:16px;'>Внесите свои даные в файл /not_mine.php находящемся в корне вашего сайта</span><br><br>"; } } // Поиск вхождения строки в файле function str_search($file, $str) { $isPatch = false; if(strpos(file_get_contents($file), $str)){ $isPatch = true; } return $isPatch; } /** Сравнение двух версий в формате XX.XX.XX **/ /** Возвращает 1, если $v1 > $v2 **/ /** Возвращает -1, если $v1 < $v2 **/ /** Возвращает 0, если $v1 == $v2 **/ function compareVer($v1, $v2) { $v1 = Trim($v1); $v2 = Trim($v2); if ($v1 == $v2) return 0; $arrV1 = explode(".", $v1); $arrV2 = explode(".", $v2); if (IntVal($arrV1[0]) > IntVal($arrV2[0]) || IntVal($arrV1[0]) == IntVal($arrV2[0]) && IntVal($arrV1[1]) > IntVal($arrV2[1]) || IntVal($arrV1[0]) == IntVal($arrV2[0]) && IntVal($arrV1[1]) == IntVal($arrV2[1]) && IntVal($arrV1[2]) > IntVal($arrV2[2])) {return 1;} if (IntVal($arrV1[0]) == IntVal($arrV2[0]) && IntVal($arrV1[1]) == IntVal($arrV2[1]) && IntVal($arrV1[2]) == IntVal($arrV2[2])) {return 0;} return -1; } //проверяет возможность установки для модуля function canInstall($moduleId, $verUPD = NULL){ $inf = $_SESSION['KeyInfo']['MODULES'][$moduleId]; //Есть ли установленная версия в системе if(!isset($verUPD)){ if($inf['UPDATE_FILE']){ //Проверяем на установку модуля if($inf['INST_VERSION']){ //сравниваем версии $v = compareVer($inf['INST_VERSION'],$inf['UPDATE_VERSION']); //Если установленная версия больше или равна той что содержится в папке обновлений запрещаем обновления if($v == '1' || $v == '0') return FALSE; else return TRUE; } else return TRUE; } //else return FALSE; }else{ //Проверяем наличие файла обновления if($inf['VERSIONS'][$verUPD]['UPDATE_FILE']){ //Проверяем на установку модуля if($inf['INST_VERSION']){ $v = compareVer($inf['INST_VERSION'],$verUPD);//править if($v == "-1" && $inf['VERSIONS'][$verUPD]['UPDATE_VERSION']) return TRUE; else return FALSE; } //else return FALSE; } } return FALSE; } //Проверяет возможность скачивания function canDownload($moduleId){ $inf = $_SESSION['KeyInfo']['MODULES'][$moduleId]; //Проверям окончилась ли поддержка if($inf['UPDATE_END'] != 'Y' && $inf['KEY'] == 'Y'){ //сравниваем версии return TRUE; }else return FALSE; } //////////////////////////////////// //Отображение информации function sortArray(&$arr){ if (is_array($arr)){ ksort($arr, SORT_NATURAL); } } //Отдаем строку модуля function strModule($infMod){ $str = "<div id=".str_replace('.', '-',$infMod['ID'])." class='module'>"; $str .= "<div class='nameModule'><span id='bx-core-adm-dialog-head-inner'>"; $infMod['NAME'] ? $str .= $infMod['NAME'].' ' : $str .= "(".$infMod['ID'].")"; //$str .= "(".$infMod['ID'].")"; $infMod["DATE_TO"] ? $str .= " поддержка до - ".$infMod["DATE_TO"] : ""; $str .= "</span><a href='http://marketplace.1c-bitrix.ru/solutions/".$infMod['ID']."' target='_blank'><span id='webform-small-button'>Marketplace</span></a></div>"; $str .= "<div class='strModule'>"; $str .= "<div class='inf'><span id='webform-small-button1'>"; $infMod['INST_VERSION'] ? $str .= $infMod['ID']." (".$infMod['INST_VERSION'].")</span></div>" : $str .= $infMod['ID']."</div>"; $str .= infForModule($infMod); $str .= "</div>"; //Есть ли версии и установлен ли модуль if($infMod['VERSIONS'] && $infMod['INST_VERSION']) $prevVer = '0.0.0'; foreach($infMod['VERSIONS'] as $vModId => $infVer){ if($infMod['UPDATE_END'] != 'Y' || $infVer['UPDATE_FILE']) $str .= strDelta($infMod,$infVer,$prevVer); $prevVer = $infVer['UPDATE_VERSION']; } $str .= "</div>"; return $str; } //блок информации и действий для модуля function infForModule($infMod){ global $pic; //Проверяем на возможность скачивания if(canDownload($infMod['ID'])) $isDownloadMod = '<div class=""><a class="isDownload ajax-send-dwl" data-id="'.$infMod['ID'].'" data-type="mod" href="">Скачать</a></div>'; else $isDownloadMod = '<div class="isDownload download no">Скачать</div>'; //Проверяем на возможность установки if(canInstall($infMod['ID'])) $isInstallMod = '<div class="install"><a class="isInstall ajax-send-upd" data-file="'.$infMod['UPDATE_FILE'].'" data-id="'.$infMod['ID'].'" data-type="mod" href="">Установить</a></div>'; else $isInstallMod = '<div class="isInstall install no">Установить</div>'; $str = '<div id="control-'.str_replace('.', '-',$infMod['ID']).'"class="control">'; //Установлен? $infMod["INST_VERSION"] ? $str .= $pic['checkF'] : $str .= $pic['empty']; //Есть файл обновления? $infMod["UPDATE_FILE"] ? $str .= $pic['iconF'] : $str .= $pic['empty']; //Инфа с ключа о поддержке if($infMod["KEY"] == 'Y'){ $infMod["UPDATE_END"] == 'Y' ? $str .= $pic['keyA'] : $str .= $pic['keyF']; }else $str .= $pic['empty']; $str .= $isDownloadMod; $str .= $isInstallMod; $str .= "</div>"; $str .= "<div id='".str_replace('.', '-',$infMod['ID'])."-inf' class='infoAJAX'></div>"; return $str; } //Отдаем строку дельта обновления function strDelta($infMod,$infVer,$prevVer){ $str = "<div class='strUpdate'>"; $str .= "<div class='inf'>"; $str .= $infVer['UPDATE_VERSION']; $str .= "</div>"; $str .= infForDelta($infMod,$infVer,$prevVer); $str .= "</div>"; return $str; } //блок информации и действий для модуля function infForDelta($infMod,$infVer,$prevVer){ global $pic; //Проверяем на возможность скачивания if(canDownload($infMod['ID'])) $isDownloadUpd = '<div class="download"><a class="isDownload ajax-send-dwl" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Скачать</a></div>'; else $isDownloadUpd = '<div class="isDownload download no">Скачать</div>'; if(canDownload($infMod['ID'])) $noDown = NULL; else $noDown ='no'; $isDownloadUpd = '<div class="download '.$noDown.'"><a class="isDownload ajax-send-dwl" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Скачать</a></div>'; //Проверяем на возможность установки if(canInstall($infMod['ID'], $infVer['UPDATE_VERSION'])) $isInstallUpd = '<div class="install"><a class="isInstall ajax-send-upd" data-file="'.$infVer['UPDATE_FILE'].'" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Установить</a></div>'; else $isInstallUpd = '<div class="install no">Установить</div>'; if(canInstall($infMod['ID'], $infVer['UPDATE_VERSION'])) $noUpd = NULL; else $noUpd ='no'; $isInstallUpd = '<div class="install '.$noUpd.'"><a class="isInstall ajax-send-upd" data-file="'.$infVer['UPDATE_FILE'].'" data-id="'.$infVer['ID'].'" data-prevver="'.$prevVer.'" data-ver="'.$infVer['UPDATE_VERSION'].'" data-type="delta" href="">Установить</a></div>'; $str = '<div id="control-'.str_replace('.', '-',$infMod['ID'].'-'.$infVer['UPDATE_VERSION']).'"class="control">'; //Установлено ли обновление? compareVer($infMod["INST_VERSION"],$infVer['UPDATE_VERSION']) != '-1' ? $str .= $pic['checkF'] : $str .= $pic['empty']; $infVer["UPDATE_FILE"] ? $str .= $pic['iconF'] : $str .= $pic['empty']; //Поправка для иконки ключа $str .= $pic['empty']; $str .= $isDownloadUpd; $str .= $isInstallUpd; $str .= "</div>"; $str .= "<div id='".str_replace('.', '-',$infMod['ID'])."-".str_replace('.', '-',$infVer['UPDATE_VERSION'])."-inf' class='infoAJAX'></div>"; return $str; } ////////////////////////////////////////// ////////////////////////////////////////// //Функции для Аякса //Функция скачивания модулей // возвращает строку html после скачивания // возвращает TRUE если файл уже был // возвращает FALSE в случае ошибки function downloadModule($request){ //формируем запрос на получение имени файла для скачивания if($request['type'] == 'mod'){ $query = array( 'utf' => 'Y', 'gzip' => 'N', 'step' => 'download', 'type' => 'STEPM', 'idmodule' => $request['id'], 'fname' => 'dwl.'.$request['id']); }else{ $query = array( 'utf' => 'Y', 'gzip' => 'N', 'step' => 'updates', 'type' => 'STEPM', 'idmodule' => $request['id'], 'data' => $request['id']."%2C".$request['prevver']."%2CN", 'fname' => 'dwl.'.$request['id']); } //отправляем запрос response($query); $file = get_tmp_file($query['fname']); //считываем файл $infFile = file_get_contents($file); unlink($file); $arrInf = Array(); //разбираем в массив CUpdateClientPartner::__ParseServerData($infFile, $arrInf, $strError_tmp); $ufile = $arrInf['DATA']['#']['FILE']['0']['@']['NAME']; $ufile_size = $arrInf['DATA']['#']['FILE']['0']['@']['SIZE']; //ищем уже скаченный файл в папке с таким же размером $nofile = TRUE; global $dir; $arrDir = scandir($dir); foreach($arrDir as $val){ $arr = infUPD($val); $file = str_replace('.upd.upd', '.upd',get_tmp_file($arr['fname'])); //Отладка //echo $arr['mid']." == ".$request['id']." && ".$arr['updtype']." == ".$request['type']." && ".$arr['mver']." == ".$request['ver']." -- ".$ufile_size." == ".filesize($file)."<br>"; if($request['type'] == 'mod'){ if($arr['mid'] == $request['id'] && $arr['updtype'] == $request['type']) if($ufile_size==filesize($file)) $nofile =FALSE; }else{ if($arr['mid'] == $request['id'] && $arr['updtype'] == $request['type'] && $arr['mver'] == $request['ver']) if($ufile_size==filesize($file)) $nofile =FALSE; } } if($nofile){ //Если получено имя файла if($ufile){ //Получаем файл модуля if($request['type'] == 'mod') { $query['data'] = $ufile; $query['fname'] = $request['id'].'.0.0.0.mod'; }else{ $query['data'] .= "&UFILE=".$ufile; $query['fname'] = $request['id'].'.'.$request['ver'].'.'.$request['type']; } response($query); $file = get_tmp_file($query['fname']); //Если размер не совпадает то удаляем if($ufile_size!=filesize($file)){ unlink($file); return FALSE; } //иначе ищим строку с указанием версии модуля elseif($request['type'] == 'mod'){ $handle = fopen($file, "r"); $versionMod = FALSE; while(!$versionMod && ($line = fgets($handle, 4096)) !== FALSE ){ preg_match("/VERSION.[^0-9]*=+>+.[^0-9]*(\d+\.\d+\.\d+)/", $line, $arr); //Если найдена то переименовываем файл и останавливаем цикл if($arr['1']) { rename($file,get_tmp_file($request['id'].'.'.$arr['1'].'.mod')); $versionMod = TRUE;} } //Изменяем данные в сессии в соответствии с полученными данными rebuild(); return infForModule($_SESSION['KeyInfo']['MODULES'][$request['id']]); }elseif($request['type'] == 'delta'){ //Изменяем данные в сессии в соответствии с полученными данными rebuild(); return infForDelta($_SESSION['KeyInfo']['MODULES'][$request['id']],$_SESSION['KeyInfo']['MODULES'][$request['id']]['VERSIONS'][$request['ver']],$request['prevver']); } }else return FALSE; }else return TRUE; } //Функция расспаковки архива обновлений function unarch($file, $isDel=FALSE){ $pathFile = get_tmp_file($file,FALSE); $updatesDir = "update_".$file; $updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir; $f = fopen($pathFile, "r"); $flabel = fread($f, strlen("BITRIX")); if($flabel != 'BITRIX') return FALSE; while (TRUE){ $add_info_size = fread($f, 5); $add_info_size = Trim($add_info_size); if (IntVal($add_info_size) > 0 && IntVal($add_info_size)."!"==$add_info_size."!"){ $add_info_size = IntVal($add_info_size); }else break; $add_info = fread($f, $add_info_size); $add_info_arr = explode("|", $add_info); //Проверяем полученный массив на кол-во элементов if (count($add_info_arr) != 3) break; $size = $add_info_arr[0]; $curpath = $add_info_arr[1]; $crc32 = $add_info_arr[2]; $contents = ""; if (IntVal($size) > 0) $contents = fread($f, $size); //Проверяем контент, контрольная сумма $crc32_new = dechex(crc32($contents)); if ($crc32_new != $crc32) break; else { checkDir($updatesDirFull.$curpath, true); if (!($fp1 = fopen($updatesDirFull.$curpath, "wb")))break; if (strlen($contents) > 0 && !fwrite($fp1, $contents)) { @fclose($fp1); break; } fclose($fp1); //Проверка записанного файла $crc32_new = dechex(crc32(file_get_contents($updatesDirFull.$curpath))); if ($crc32_new != $crc32) break; } } if ($isDel) @unlink($pathFile); return TRUE; } ///////////////////ВЯЗТО ТУПО У БИТРИКСА////////////////////////// /** Создание пути, если его нет, и установка прав писать **/ function checkDir($path, $bPermission = true) { $badDirs = Array(); $path = str_replace("\\", "/", $path); $path = str_replace("//", "/", $path); if ($path[strlen($path)-1] != "/") //отрежем имя файла { $p = strrposbx($path, "/"); $path = substr($path, 0, $p); } while (strlen($path)>1 && $path[strlen($path)-1]=="/") //отрежем / в конце, если есть $path = substr($path, 0, strlen($path)-1); $p = strrposbx($path, "/"); while ($p > 0) { if (file_exists($path) && is_dir($path)) { if ($bPermission) { if (!is_writable($path)) @chmod($path, BX_DIR_PERMISSIONS); } break; } $badDirs[] = substr($path, $p+1); $path = substr($path, 0, $p); $p = strrposbx($path, "/"); } for ($i = count($badDirs)-1; $i>=0; $i--) { $path = $path."/".$badDirs[$i]; @mkdir($path, BX_DIR_PERMISSIONS); } } function strrposbx($haystack, $needle) { $index = strpos(strrev($haystack), strrev($needle)); if($index === false) return false; $index = strlen($haystack) - strlen($needle) - $index; return $index; } //////////////////////////////////////////////////////////////// ?>