Пытаюсь анализировать исходный код с целью восстановить ожидаемую системой структуру файла репозитария. Буду описывать как информация движется по функциям...
Кнопка в файле admin_menu.php
code:$amenu->iadd('images/common/rep.gif',_SYSTEM_REP,'admin.php?
com_option=system&option=updates','',_SYSTEM);
Функция new_updates в файле admin.system.html.php
code:$xml = new MiniXMLDoc();
создаем объект из класса, описание класса в файле doc.inc.php
code:$xml_data=get_url($lm_updates);
получает данные из файла в переменную $xml_data
code:$xml->fromString($xml_data);
обрабатываем полученные данные в функции fromString
Внутри функция fromString определяет формат полученного файла (MINIXML_SIMPLE_REGEX или MINIXML_COMPLETE_REGEX). Второй вариант я даже не буду анализировать - сконцентрируюсь на MINIXML_SIMPLE_REGEX.
После определения формата данные похоже разбиваются на подстроки функцией fromSubString
Вот здесь похоже и зарыт формат...
Спойлер (Показать)function fromSubString (&$parentElement, &$XMLString, &$regex)
{
//$this->time('fromSubStr');
if (is_null($parentElement) || preg_match('/^\s*$/', $XMLString))
{return;}
if (MINIXML_DEBUG > 0)
{_MiniXMLLog("Called fromSubString() with parent '" . $parentElement->name() . "'\n");}
$matches = array();
if (preg_match_all( $regex, $XMLString, $matches))
{
// $this->time('a match');
$mcp = $matches;
$numMatches = count($mcp[0]);
_MiniXMLLog ("Got $numMatches parsing regex matches: ". $mcp[0][0]);
for($i=0; $i < $numMatches; $i++)
{
_MiniXMLLog ("Got $numMatches CHEKKING: ". $mcp[0][$i] . "\n");
// $this->time('a match');
$uname = $mcp[$this->xRegexIndex['uname']][$i];
$comment = $mcp[$this->xRegexIndex['comment']][$i];
if ($this->xuseSimpleRegex)
{
$cdata = NULL;
$doctypecont = NULL;
$entityname = NULL;
}
else
{
$cdata = $mcp[$this->xRegexIndex['cdata']][$i];
$doctypecont = $mcp[$this->xRegexIndex['doctypecont']][$i];
$entityname = $mcp[$this->xRegexIndex['entityname']][$i];
}
$plaintext = $mcp[$this->xRegexIndex['plaintxt']][$i];
if ($uname)
{
_MiniXMLLog ("Got unary $uname");
$ufinaltxt = $mcp[$this->xRegexIndex['uendtxt']][$i];
$newElement =& $parentElement->createChild($uname);
$this->_extractAttributesFromString($newElement, $mcp[$this->xRegexIndex['uattr']][$i]);
if ($ufinaltxt)
{$parentElement->createNode($ufinaltxt);}
}
elseif ($comment)
{
//_MiniXMLLog ("Got comment $comment");
$parentElement->comment($comment);
}
elseif ($cdata)
{
//_MiniXMLLog ("Got cdata $cdata");
$newElement = new MiniXMLElementCData($cdata);
$parentElement->appendChild($newElement);
}
elseif ($doctypecont)
{
//_MiniXMLLog ("Got doctype $doctypedef '" . $mcp[11][$i] . "'");
$newElement = new MiniXMLElementDocType($mcp[$this->xRegexIndex['doctypedef']][$i]);
$appendedChild =& $parentElement->appendChild($newElement);
$this->fromSubString($appendedChild, $doctypecont, $regex);
}
elseif ($entityname )
{
//_MiniXMLLog ("Got entity $entityname");
$newElement = new MiniXMLElementEntity ($entityname, $mcp[$this->xRegexIndex['entitydef']][$i]);
$parentElement->appendChild($newElement);
}
elseif ($plaintext)
{
//_MiniXMLLog ("Got $plaintext plaintext");
$afterTxt = $mcp[$this->xRegexIndex['plainrest']][$i];
if (! preg_match('/^\s+$/', $plaintext))
{$parentElement->createNode($plaintext);}
if ($afterTxt && ! preg_match('/^\s*$/', $afterTxt))
{$this->fromSubString($parentElement, $afterTxt, $regex);}
}
elseif($mcp[$this->xRegexIndex['biname']])
{
$nencl = $mcp[$this->xRegexIndex['biencl']][$i];
$finaltxt = $mcp[$this->xRegexIndex['biendtxt']][$i];
$otherTags = $mcp[$this->xRegexIndex['birest']][$i];
$newElement =& $parentElement->createChild($mcp[$this->xRegexIndex['biname']][$i]);
$this->_extractAttributesFromString($newElement, $mcp[$this->xRegexIndex['biattr']][$i]);
$plaintxtMatches = array();
if (preg_match("/^\s*([^\s<][^<]*)/", $nencl, $plaintxtMatches))
{
$txt = $plaintxtMatches[1];
$newElement->createNode($txt);
$nencl = preg_replace("/^\s*([^<]+)/", "", $nencl);
}
if ($nencl && !preg_match('/^\s*$/', $nencl))
{$this->fromSubString($newElement, $nencl, $regex);}
if ($finaltxt)
{$parentElement->createNode($finaltxt);}
if ($otherTags && !preg_match('/^\s*$/',$otherTags))
{$this->fromSubString($parentElement, $otherTags, $regex);}
} /* end switch over type of match */
} /* end loop over all matches */
} /* end if there was a match */
} /* end method fromSubString */
/* getValue() ** Utility function, call the root MiniXMLElement's getValue() */ |