addon.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. <?php
  2. namespace MGModule\DNSManager2;
  3. use MGModule\DNSManager2 as main;
  4. use MGModule\DNSManager2\mgLibs\custom\manager\GlobalSettingHelper;
  5. use MGModule\DNSManager2\models\custom\globalsetting\GlobalSettingEnum;
  6. use MGModule\DNSManager2\mgLibs\custom\dns\exceptions\DNSSubmoduleException;
  7. use MGModule\DNSManager2\mgLibs\custom\dns\SubmoduleExceptionCodes;
  8. use MGModule\DNSManager2\mgLibs\custom\AjaxResponse;
  9. use MGModule\DNSManager2\mgLibs\lang;
  10. use MGModule\DNSManager2\mgLibs\custom\helpers\HTML5Pattern;
  11. /**
  12. * Description of Addon
  13. *
  14. * @author Michal Czech <michael@modulesgarden.com>
  15. */
  16. class addon extends main\mgLibs\process\abstractMainDriver{
  17. /**
  18. * Load Addon WHMCS Configuration
  19. *
  20. *
  21. */
  22. function loadAddonConfiguration(){
  23. $result = mgLibs\MySQL\query::select(
  24. array(
  25. 'setting'
  26. ,'value'
  27. )
  28. , 'tbladdonmodules'
  29. ,array(
  30. 'module' => $this->configuration()->systemName
  31. )
  32. );
  33. while($row = $result->fetch())
  34. {
  35. $this->configuration()->{$row['setting']} = $row['value'];
  36. }
  37. }
  38. /**
  39. * Return Tempalates Path
  40. *
  41. * @param boolean $relative
  42. * @return string
  43. */
  44. static function getModuleTemplatesDir($relative = false){
  45. $dir = ($relative)?'':(__DIR__.DS);
  46. $dir .= 'templates'.DS;
  47. if(self::I()->isAdmin())
  48. {
  49. return $dir.'admin';
  50. }
  51. else
  52. {
  53. $template = GlobalSettingHelper::getSetting(GlobalSettingEnum::DEFAULT_TEMPLATE)?:'default';
  54. if(file_exists(__DIR__.DS.'templates'.DS.'clientarea'.DS.$template))
  55. {
  56. return $dir.'clientarea'.DS.$template;
  57. }
  58. else
  59. {
  60. return $dir.'clientarea'.DS.'default';
  61. }
  62. }
  63. }
  64. public function getAssetsURL() {
  65. if($this->isAdmin())
  66. {
  67. return '../modules/addons/'.$this->configuration()->systemName.'/templates/admin/assets';
  68. }
  69. else
  70. {
  71. return 'modules/addons/'.$this->configuration()->systemName.'/'.str_replace('\\','/',self::getModuleTemplatesDir(true)).'/assets';
  72. }
  73. }
  74. public function getType() {
  75. return 'addon';
  76. }
  77. public static function getMainDIR() {
  78. return __DIR__;
  79. }
  80. static function getUrl($page = null,$action=null,$params = array()){
  81. if(self::I()->isAdmin())
  82. {
  83. $url = 'addonmodules.php?module='.self::I()->configuration()->systemName;
  84. }
  85. else
  86. {
  87. $url = 'index.php?m='.self::I()->configuration()->systemName;
  88. }
  89. if($page)
  90. {
  91. $url .= '&mg-page='.$page;
  92. if($action){
  93. $url .= '&mg-action='.$action;
  94. }
  95. if($params)
  96. {
  97. $url .= '&'.http_build_query($params);
  98. }
  99. }
  100. return $url;
  101. }
  102. static function genCustomPageUrl($page = null,$action=null,$params = array()){
  103. if(self::I()->isAdmin())
  104. {
  105. $url = 'addonmodules.php?module='.self::I()->configuration()->systemName.'&customPage=1';
  106. }
  107. else
  108. {
  109. $url = 'index.php?m='.self::I()->configuration()->systemName.'&customPage=1';
  110. }
  111. if($page)
  112. {
  113. $url .= '&mg-page='.$page;
  114. }
  115. if($action){
  116. $url .= '&mg-action='.$action;
  117. }
  118. if($params)
  119. {
  120. $url .= '&'.http_build_query($params);
  121. }
  122. return $url;
  123. }
  124. static function genJSONUrl($page){
  125. if(self::I()->isAdmin())
  126. {
  127. return 'addonmodules.php?module='.self::I()->configuration()->systemName.'&json=1&mg-page='.$page;
  128. }
  129. else
  130. {
  131. return 'index.php?m='.self::I()->configuration()->systemName.'&json=1&mg-page='.$page;
  132. }
  133. }
  134. static function config(){
  135. return array
  136. (
  137. 'name' => self::I()->configuration()->name
  138. ,'description' => self::I()->configuration()->description
  139. ,'version' => self::I()->configuration()->version
  140. ,'author' => self::I()->configuration()->author
  141. ,'fields' => self::I()->configuration()->getAddonWHMCSConfig()
  142. );
  143. }
  144. static function activate(){
  145. try{
  146. self::I()->configuration()->activate();
  147. return array(
  148. 'status'=>'success'
  149. );
  150. } catch (\Exception $ex) {
  151. return array(
  152. 'status' => 'error'
  153. ,'description' => $ex->getMessage()
  154. );
  155. }
  156. }
  157. static function deactivate(){
  158. self::I()->configuration()->deactivate();
  159. }
  160. static function upgrade($vars){
  161. $moduleVersion = isset($vars['version']) ? $vars['version'] : $vars[self::I()->configuration()->systemName]['version'];
  162. self::I()->configuration()->upgrade($moduleVersion);
  163. }
  164. static function getHTMLAdminCustomPage($input)
  165. {
  166. try{
  167. self::I()->isAdmin(true);
  168. self::I()->setMainLangContext();
  169. $page = empty($input['mg-page'])?'dashboard':$input['mg-page'];
  170. $action = empty($input['mg-action'])?'index':$input['mg-action'];
  171. list($content) = self::I()->runControler($page,$action,$input,'CustomHTML');
  172. return $content;
  173. } catch (\Exception $ex) {
  174. self::dump($ex);
  175. mgLibs\smarty::I()->setTemplateDir(self::I()->getModuleTemplatesDir());
  176. $message = $ex->getMessage();
  177. if(method_exists($ex, 'getToken'))
  178. {
  179. $message .= mgLibs\lang::absoluteT('token').$ex->getToken();
  180. }
  181. return mgLibs\smarty::I()->view('fatal',array(
  182. 'message' => $message
  183. ));
  184. }
  185. }
  186. static function getHTMLAdminPage($input){
  187. try{
  188. self::I()->isAdmin(true);
  189. self::I()->setMainLangContext();
  190. if(self::I()->isDebug())
  191. {
  192. self::I()->configuration()->activate();
  193. }
  194. $menu = array();
  195. foreach(self::I()->configuration()->getAddonMenu() as $catName => $category)
  196. {
  197. if(isset($category['submenu']))
  198. {
  199. foreach($category['submenu'] as $subName => &$subPage)
  200. {
  201. if(empty($subPage['url']))
  202. {
  203. $subPage['url'] = self::getUrl($catName,$subName);
  204. }
  205. }
  206. }
  207. $category['url'] = self::getUrl($catName);
  208. $menu[$catName] = $category;
  209. }
  210. $page = empty($input['mg-page'])?'dashboard':$input['mg-page'];
  211. $action = empty($input['mg-action'])?'index':$input['mg-action'];
  212. $vars = array(
  213. 'assetsURL' => self::I()->getAssetsURL()
  214. ,'mainURL' => self::I()->getUrl()
  215. ,'mainName' => self::I()->configuration()->name
  216. ,'menu' => $menu
  217. ,'JSONCurrentUrl' => self::I()->genJSONUrl($page)
  218. ,'currentPageName' => $page
  219. ,'Addon' => self::I()
  220. ,'patterns' => HTML5Pattern::getPatternsArray()
  221. );
  222. try{
  223. list($content,$success,$error) = self::I()->runControler($page,$action,$input,'HTML');
  224. $vars['content'] = $content;
  225. $vars['success'] = $success;
  226. $vars['error'] = $error;
  227. } catch (\Exception $ex) {
  228. self::dump($ex);
  229. main\mgLibs\error\register::register($ex);
  230. $vars['error'] = $ex->getMessage();
  231. if(method_exists($ex, 'getToken'))
  232. {
  233. $vars['error'] .= mgLibs\lang::absoluteT('token').$ex->getToken();
  234. }
  235. }
  236. mgLibs\smarty::I()->setTemplateDir(self::I()->getModuleTemplatesDir());
  237. $html = mgLibs\smarty::I()->view('main',$vars);
  238. if(self::I()->isDebug())
  239. {
  240. $tmp = '<div style="color: #a94442;background-color: #f2dede;border-color: #dca7a7;font-size:20px;padding:10px;"><strong>Module is under development Mode!!!!!!!!!!!!!!!</strong></div>';
  241. if($langs = mgLibs\lang::getMissingLangs())
  242. {
  243. $tmp .= '<pre>';
  244. foreach($langs as $lk => $lang)
  245. {
  246. $tmp .= $lk." = ".$lang."\n";
  247. }
  248. $tmp .= '</pre>';
  249. }
  250. $html = $tmp.$html;
  251. }
  252. return $html;
  253. } catch (\Exception $ex) {
  254. self::dump($ex);
  255. main\mgLibs\error\register::register($ex);
  256. mgLibs\smarty::I()->setTemplateDir(self::I()->getModuleTemplatesDir());
  257. $message = $ex->getMessage();
  258. if(method_exists($ex, 'getToken'))
  259. {
  260. $message .= mgLibs\lang::absoluteT('token').$ex->getToken();
  261. }
  262. return mgLibs\smarty::I()->view('fatal',array(
  263. 'message' => $message
  264. ,'assetsURL' => self::I()->getAssetsURL()
  265. ));
  266. }
  267. }
  268. function getHTMLClientAreaPage($input){
  269. $output = array(
  270. 'pagetitle' => mgLibs\lang::absoluteT(self::I()->configuration()->systemName,'ClientAreaPageTitle'),
  271. 'templatefile' => self::I()->getModuleTemplatesDir(true).'/main',
  272. 'requirelogin' => isset($_SESSION['uid']) ? false : true,
  273. );
  274. $breadcrumb = [self::I()->getUrl() => mgLibs\lang::absoluteT(self::I()->configuration()->systemName,'ClientAreaBreadcrumbTitle')];
  275. try{
  276. self::I()->setMainLangContext();
  277. $page = 'dashboard';
  278. if(!empty($input['mg-page']))
  279. {
  280. $page = $input['mg-page'];
  281. $url = self::I()->getUrl($input['mg-page']);
  282. $breadcrumb[$url] = $input['mg-page'];
  283. }
  284. $action = empty($input['mg-action'])?'index':$input['mg-action'];
  285. $vars = array(
  286. 'assetsURL' => self::I()->getAssetsURL()
  287. ,'mainURL' => self::I()->getUrl()
  288. ,'mainName' => self::I()->configuration()->clientareaName
  289. ,'mainJSONURL' => self::I()->genJSONUrl($page)
  290. ,'currentPageName' => $page
  291. ,'patterns' => HTML5Pattern::getPatternsArray()
  292. );
  293. try{
  294. try {
  295. list($content,$success,$error) = self::I()->runControler($page,$action,$input,'HTML');
  296. } catch (DNSSubmoduleException $exc) {
  297. $error = self::I()->parseDNSException($exc);
  298. }
  299. $vars['MGLANG'] = mgLibs\lang::getInstance();
  300. if(self::I()->isDebug())
  301. {
  302. $html = '<div style="color: #a94442;background-color: #f2dede;border-color: #dca7a7;font-size:20px;padding:10px;"><strong>Module is under development Mode!!!!!!!!!!!!!!!</strong></div>';
  303. if($langs = mgLibs\lang::getMissingLangs())
  304. {
  305. $html .= '<pre>';
  306. foreach($langs as $lk => $lang)
  307. {
  308. $html .= $lk." = ".$lang."\n";
  309. }
  310. $html .= '</pre>';
  311. }
  312. $content = $html.$content;
  313. }
  314. $vars['mgcontent'] = $content;
  315. $vars['success'] = $success;
  316. $vars['error'] = $error;
  317. } catch (\Exception $ex) {
  318. self::dump($ex);
  319. main\mgLibs\error\register::register($ex);
  320. $vars['error'] = mgLibs\lang::absoluteT('generalError');
  321. if(method_exists($ex, 'getToken'))
  322. {
  323. $vars['error'] .= mgLibs\lang::absoluteT('token').$ex->getToken();
  324. }
  325. }
  326. } catch (\Exception $ex) {
  327. self::dump($ex);
  328. main\mgLibs\error\register::register($ex);
  329. $vars['error'] = mgLibs\lang::absoluteT('generalError');
  330. if(method_exists($ex, 'getToken'))
  331. {
  332. $vars['error'] .= mgLibs\lang::absoluteT('token').$ex->getToken();
  333. }
  334. }
  335. $output['breadcrumb'] = $breadcrumb;
  336. $output['vars'] = $vars;
  337. return $output;
  338. }
  339. public static function getJSONAdminPage($input){
  340. $content = array();
  341. $page = 'dashboard';
  342. if(!empty($input['mg-page']))
  343. {
  344. $page = $input['mg-page'];
  345. }
  346. $action = empty($input['mg-action'])?'index':$input['mg-action'];
  347. try{
  348. self::I()->isAdmin(true);
  349. self::I()->setMainLangContext();
  350. try {
  351. list($result,$success,$error) = self::I()->runControler($page,$action,$input,'JSON');
  352. } catch (DNSSubmoduleException $exc) {
  353. AjaxResponse::I()->addRawError(self::I()->parseDNSException($exc, false));
  354. $result = AjaxResponse::I()->toArray();
  355. }
  356. if($error)
  357. {
  358. $content['error'] = $error;
  359. $content['result'] = 'error';
  360. }
  361. elseif($success)
  362. {
  363. $content['success'] = $success;
  364. $content['result'] = 'success';
  365. }
  366. if($langs = mgLibs\lang::getMissingLangs())
  367. {
  368. $html = '<pre>';
  369. foreach($langs as $lk => $lang)
  370. {
  371. $html .= $lk." = ".$lang."\n";
  372. }
  373. $html .= '</pre>';
  374. $content['error'] = $html;
  375. $content['result'] = 'error';
  376. }
  377. $content['data'] = $result;
  378. } catch (\Exception $ex) {
  379. self::dump($ex);
  380. main\mgLibs\error\register::register($ex);
  381. $content['result'] = 'error';
  382. $content['error'] = $ex->getMessage();
  383. if(method_exists($ex, 'getToken'))
  384. {
  385. $content['error'] .= mgLibs\lang::absoluteT('token').$ex->getToken();
  386. }
  387. }
  388. $content['data'] = mb_convert_encoding($content['data'], 'UTF-8','UTF-8');
  389. return 'JSONRESPONSE#'.json_encode($content, JSON_HEX_QUOT | JSON_HEX_TAG).'#ENDJSONRESPONSE';
  390. }
  391. private function parseDNSException($exc, $isCA = true) {
  392. switch($exc->getCode()) {
  393. case SubmoduleExceptionCodes::CONNECTION_PROBLEM:
  394. $message = lang::absoluteT($isCA?'addonCA':'addonAA', 'dns_submodule_connection_problem') . ' ' . ($isCA?'':' Reason: ' . $exc->getMessage());
  395. break;
  396. case SubmoduleExceptionCodes::COMMAND_ERROR:
  397. $message = lang::absoluteT($isCA?'addonCA':'addonAA', 'dns_submodule_command_error') . ' ' . $exc->getMessage();
  398. break;
  399. case SubmoduleExceptionCodes::INVALID_PARAMETERS:
  400. $message = lang::absoluteT($isCA?'addonCA':'addonAA', 'dns_submodule_invalid_parameters') . ' ' . $exc->getMessage();
  401. break;
  402. case SubmoduleExceptionCodes::INVALID_RESPONSE:
  403. $message = lang::absoluteT($isCA?'addonCA':'addonAA', 'dns_submodule_invalid_response') . ' ' . $exc->getMessage();
  404. break;
  405. }
  406. return $message;
  407. }
  408. function getJSONClientAreaPage($input)
  409. {
  410. $content = array();
  411. $page = 'dashboard';
  412. if(!empty($input['page']))
  413. {
  414. $page = $input['page'];
  415. }
  416. $action = empty($input['mg-action'])?'index':$input['mg-action'];
  417. try{
  418. self::I()->setMainLangContext();
  419. try {
  420. list($result,$success,$error) = self::I()->runControler($page,$action,$input,'JSON');
  421. } catch (DNSSubmoduleException $exc) {
  422. AjaxResponse::I()->addRawError($this->parseDNSException($exc));
  423. $result = AjaxResponse::I()->toArray();
  424. }
  425. if($error)
  426. {
  427. $content['error'] = $error;
  428. $content['result'] = 'error';
  429. }
  430. elseif($success)
  431. {
  432. $content['success'] = $success;
  433. $content['result'] = 'success';
  434. }
  435. if($langs = mgLibs\lang::getMissingLangs())
  436. {
  437. $html = '<pre>';
  438. foreach($langs as $lk => $lang)
  439. {
  440. $html .= $lk." = ".$lang."\n";
  441. }
  442. $html .= '</pre>';
  443. $content['error'] = $html;
  444. $content['result'] = 'error';
  445. }
  446. $content['data'] = $result;
  447. } catch (\Exception $ex) {
  448. self::dump($ex);
  449. $content['result'] = 'error';
  450. main\mgLibs\error\register::register($ex);
  451. $content['error'] = mgLibs\lang::absoluteT('generalError');
  452. if(method_exists($ex, 'getToken'))
  453. {
  454. $content['error'] .= mgLibs\lang::absoluteT('token').$ex->getToken();
  455. }
  456. }
  457. return 'JSONRESPONSE#'.json_encode($content, JSON_HEX_QUOT | JSON_HEX_TAG).'#ENDJSONRESPONSE';
  458. }
  459. static function cron(){
  460. try{
  461. self::I()->isAdmin(true);
  462. self::I()->setMainLangContext();
  463. self::I()->runControler('cron','index',array(),'CRON');
  464. } catch (\Exception $ex) {
  465. self::dump($ex);
  466. main\mgLibs\error\register::register($ex);
  467. }
  468. }
  469. static function localAPI($action,$arguments){
  470. $output = array(
  471. 'action' => $action
  472. );
  473. try{
  474. self::I()->isAdmin(true);
  475. self::I()->setMainLangContext();
  476. list($result,$success,$error) = self::I()->runControler('localAPI',$action,$arguments,'API');
  477. $output['success'] = $result;
  478. } catch (\Exception $ex) {
  479. self::dump($ex);
  480. main\mgLibs\error\register::register($ex);
  481. $output['error'] = array(
  482. 'message' => $ex->getMessage()
  483. ,'code' => $ex->getCode()
  484. );
  485. }
  486. return $output;
  487. }
  488. }