Нещодавно зайнявся написанням мультіпользовательской сервісу wap-cms, тобто CMS орієнтованих на створення мобільних сайтів, але не вимагають від власника ніяких знань в програмуванні. Таке рішення з коробки, наприклад як UCOZ тільки під wap.
Природно попередньо вирішив вивчити вже готові рішення, шукав щось крім усім відомих говно-движків wap-motor, johnCMS, DCMS. Натрапив на такий цікавий і молодий проект MobileCMS. Звичайно відразу цікаво було глянути код, тим більше що описи були багатообіцяючими: код заснований на ООП HMVC, веб інтерфейс адмінки, модульність, установка і управління модулями з адмінки, відкритий вихідний код.
Відразу скажу, що на момент написання статті я вивчав MobileCMS v1.5.
Ну що ж, пробуємо ставити на / localhost / і відразу ж бачимо помилку: "На сервері не встановлено ionCube Loader, зверніться в технічну підтримку вашого хостинг провайдера з проханням встановити даний модуль."
Закінчили установку, ніяких проблем. Намагаємося відкрити сайт і бачимо помилку:
Site error: the file Q: \ home \ localhost \ www \ MobileCMS \ libraries \ template.php requires the ionCube PHP Loader ioncube_loader_win_5.2.dll to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.
Так так так..так ось де значить потрібен ionCube, файл "libraries / template.php" закодований. Після читання інформації на сайті розробника з'ясувалося що система має платну ліцензію (99wmr :))) яка дозволяє автоматично прибрати авторські права MobileCMS з усіх сторінок сайту. Причому читаючи інформацію з купівлі ліцензії сказано: "Протягом деякого часу копірайт забереться автоматично.". Значить система зняття копірайтів автоматично прописана в движку, або що ще гірше можливо є в скриптах чорний-хід для розробника, за допомогою якої він може віддалено знімати авторські права (не просто ж так закодований файл template.php).
Перерва всі вихідні, і не знайшовши в них нічого що постачається з відповідною ліцензією, а так само подивившись код шаблонів footer.tpl не знайшов в них коду, звідки б могла взятися рядок "Powered by MobileCMS", але вона все-таки є.
Щось я розтягнув оповідання, перейду відразу до справи. Щоб запустити CMS довелося все-таки поставити її на сервер де є ionCube і подивитися що буде після запуску.
1. Помітив поява 2х файлів в папці / cache / file_cache /, це
/ Cache / file_cache / b / b81755a649ad357a44526821a64432a0
і
/ Cache / file_cache / f / f7c69042a56ced3e29af3ce2a911d68a
Другий файл вдавав із себе звичайний серіалізовані масив з кешем шаблону головної сторінки. А ось перший файл був дуже цікавий. Дивимося що в ньому
Найбільш уважні вже напевно помітили, що тут є значення [licensed] => 0, і так, скажу відразу, якщо замінити "0" на "1" авторські права зникнуть, але не на завжди, тому що через деякий час (10800 секунд = 3 години) файл знову відновиться і авторські права повернуться на місце. Спробуємо вирішити цю проблему.
Спосіб # 2
Все точно так-же як в способі # 1 але замість установки CHMOD ми можемо змінити час модифікації файлу. Це можна зробити PHP-функцією touch () приблизно так. Цим ми виставляємо час модифікації в далеке майбутнє, мовляв файл останній раз редагувався в 2099 році. Навіщо? Я говорив що файл відновлюється кожні 3 години? Так ось 3 години, цей час життя файлу в кеші, а вивчивши вихідні кешируючого класу, ми можемо побачити що кеш чиститься на основі даних mtime (modification time) виставивши яке в майбутнє, ми зробимо файл вічно-живим в кеші.
return FALSE;
>
?>
І до речі, хоч файл template.php закодований, ми можемо дізнатися ім'я ключа за яким кешируєтся ліцензія, це рядок "license_data" тобто md5 ( "license_data") = b81755a649ad357a44526821a64432a0 так що можна ставити обробник-виняток і на неї, а не на md5-рядок.
function parse ($ filename. $ params = array ())
if (! strstr ($ filename. '.tpl'))
$ Filename. = '.tpl';
>
foreach ($ params as $ var => $ var_value)
$ This -> vars [$ var] = $ var_value;
>
if (strpos ($ this -> theme, 'admin') === 0)
$ Alternative_theme = 'admin';
>
else
$ Alternative_theme = 'default';
>
if (file_exists (ROOT. 'modules /'. ROUTE_MODULE. '/ views /'. $ this -> theme. '/'. $ filename))
$ This -> template_file = ROOT. 'Modules /'. ROUTE_MODULE. '/ Views /'. $ This -> theme. '/'. $ Filename;
>
else
if (file_exists (ROOT. 'modules /'. ROUTE_MODULE. '/ views /'. $ alternative_theme. '/'. $ filename))
$ This -> template_file = ROOT. 'Modules /'. ROUTE_MODULE. '/ Views /'. $ Alternative_theme. '/'. $ Filename;
>
else
if (file_exists (ROOT. '/ views /'. $ this -> theme. '/'. $ filename))
$ This -> template_file = ROOT. '/ Views /'. $ This -> theme. '/'. $ Filename;
>
else
exit ( 'Файл '. $ Filename. ' не є шаблоном або не найден. ' );
>
>
>
extract ($ this -> vars, EXTR_REFS);
ob_start ();
include $ this -> template_file;
$ Page_content = $ this -> add_code (ob_get_clean ());
return $ page_content;
>
function display ($ filename. $ params = array ())
echo $ this -> parse ($ filename. $ params);
>
function assign ($ param1. $ param2 = NULL)
if ((! $ param2 AND is_array ($ param1)))
foreach ($ param1 as $ key => $ value)
$ This -> vars [$ key] = $ value;
>
if ($ param2)
$ This -> vars [$ param1] = $ param2;
return TRUE;
>
function add_code ($ buffer)
if ((! $ this -> code_added AND strpos ($ this -> theme, 'admin')! == 0))
if (! class_exists ( 'File_Cache'))
a_import ( 'libraries / file_cache');
>
$ License_data = array ( 'licensed' => 0. 'template' => ''. 'License_place' => '