国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

364 lines
11KB

  1. <?php
  2. /**
  3. * 生成模块
  4. *
  5. * @version $Id: module_make.php 1 14:17 2010年7月20日Z tianya $
  6. * @package DedeCMS.Administrator
  7. * @copyright Copyright (c) 2020, DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. @set_time_limit(0);
  12. require_once(dirname(__FILE__)."/config.php");
  13. require_once(dirname(__FILE__)."/../include/dedemodule.class.php");
  14. CheckPurview('sys_module');
  15. if(empty($action)) $action = '';
  16. if($action=='')
  17. {
  18. $modules = array();
  19. require_once(dirname(__FILE__)."/templets/module_make.htm");
  20. exit();
  21. }
  22. /*-------------
  23. //生成项目
  24. function Makemodule()
  25. --------------*/
  26. else if($action=='make')
  27. {
  28. require_once(DEDEINC.'/dedehttpdown.class.php');
  29. // 校验私钥,确定开发者身份
  30. $devURL = DEDECDNURL."/developers/$dev_id.json";
  31. $dhd = new DedeHttpDown();
  32. $dhd->OpenUrl($devURL);
  33. $devContent = $dhd->GetHtml();
  34. $devInfo = (array)json_decode($devContent);
  35. if (($devInfo['auth_at']+60*60*24*365) < time()) {
  36. ShowMsg("您的开发者账号已经过期,请登录www.dedebiz.com重新申请!","-1");
  37. exit();
  38. }
  39. $filelist = str_replace("\r", "\n", trim($filelist));
  40. $filelist = trim(preg_replace("#[\n]{1,}#", "\n", $filelist));
  41. if($filelist=='')
  42. {
  43. ShowMsg("对不起,你没有指定模块的文件列表,因此不能创建项目!","-1");
  44. exit();
  45. }
  46. if (empty($dev_id)) {
  47. ShowMsg("开发者ID不能为空!","-1");
  48. exit();
  49. }
  50. if (empty($priv)) {
  51. ShowMsg("请填写开发者私钥信息","-1");
  52. exit();
  53. }
  54. if (strlen($modulname) > 150) {
  55. ShowMsg("模块名称过长","-1");
  56. exit();
  57. }
  58. // 校验私钥合法性
  59. $enstr = json_encode(array(
  60. "module_name" => $modulname,
  61. "dev_id" => $devInfo['dev_id'],
  62. ));
  63. // 私钥加密模块信息
  64. openssl_private_encrypt($enstr,$encotent,$priv);
  65. $moduleInfo = base64url_encode($encotent);
  66. openssl_public_decrypt($encotent,$decontent,$devInfo['pub_key']);
  67. $minfo = (array)json_decode($decontent);
  68. if ($minfo['module_name'] != $modulname || $minfo['dev_id'] != $devInfo['dev_id']) {
  69. ShowMsg("开发者私钥校验失败,请确保填写正确的开发者私钥","-1");
  70. exit();
  71. }
  72. //去除转义
  73. foreach($_POST as $k=>$v) $$k = stripslashes($v);
  74. if(!isset($autosetup)) $autosetup = 0;
  75. if(!isset($autodel)) $autodel = 0;
  76. $mdir = DEDEDATA.'/module';
  77. $hashcode = md5($modulname.$devInfo['dev_id']);
  78. $moduleFilename = $mdir.'/'.$hashcode.'.xml';
  79. $menustring = base64_encode($menustring);
  80. $indexurl = str_replace('=', '**', $indexurl);
  81. $dm = new DedeModule($mdir);
  82. if($dm->HasModule($hashcode))
  83. {
  84. $dm->Clear();
  85. ShowMsg("对不起,你指定同名模块已经存在,因此不能创建项目!<br>如果你要更新这个模块,请先删除:module/{$hashcode}.xml","-1");
  86. exit();
  87. }
  88. $readmef = $setupf = $uninstallf = '';
  89. if(empty($readmetxt))
  90. {
  91. move_uploaded_file($readme, $mdir."/{$hashcode}-r.html") or die("你没填写说明或上传说明文件!");
  92. $readmef = $dm->GetEncodeFile($mdir."/{$hashcode}-r.html", TRUE);
  93. }
  94. else
  95. {
  96. $readmetxt = "<p style='line-height:150%'>".$readmetxt;
  97. $readmetxt = preg_replace("#[\r\n]{1,}#", "<br />\r\n", $readmetxt);
  98. $readmetxt .= "</p>";
  99. $readmef = base64_encode(trim($readmetxt));
  100. }
  101. if($autosetup==0)
  102. {
  103. move_uploaded_file($setup,$mdir."/{$hashcode}-s.php") or die("你没上传,或系统无法把setup文件移动到 module 目录!");
  104. $setupf = $dm->GetEncodeFile($mdir."/{$hashcode}-s.php",TRUE);
  105. }
  106. if($autodel==0)
  107. {
  108. move_uploaded_file($uninstall, $mdir."/{$hashcode}-u.php") or die("你没上传,或系统无法把uninstall文件移动到 module 目录!");
  109. $uninstallf = $dm->GetEncodeFile($mdir."/{$hashcode}-u.php", TRUE);
  110. }
  111. if(trim($setupsql40)=='') $setupsql40 = '';
  112. else $setupsql40 = base64_encode(trim($setupsql40));
  113. //if(trim($setupsql41)=='') $setupsql41 = '';
  114. //else $setupsql41 = base64_encode(trim($setupsql41));
  115. if(trim($delsql)=='') $delsql = '';
  116. else $delsql = base64_encode(trim($delsql));
  117. $modulinfo = "<module>
  118. <baseinfo>
  119. name={$modulname}
  120. dev_id={$devInfo['dev_id']}
  121. info={$moduleInfo}
  122. time={$mtime}
  123. hash={$hashcode}
  124. indexname={$indexname}
  125. indexurl={$indexurl}
  126. ismember={$ismember}
  127. autosetup={$autosetup}
  128. autodel={$autodel}
  129. lang=utf-8
  130. moduletype={$moduletype}
  131. </baseinfo>
  132. <systemfile>
  133. <menustring>
  134. $menustring
  135. </menustring>
  136. <readme>
  137. {$readmef}
  138. </readme>
  139. <setupsql40>
  140. $setupsql40
  141. </setupsql40>
  142. <delsql>
  143. $delsql
  144. </delsql>
  145. <setup>
  146. {$setupf}
  147. </setup>
  148. <uninstall>
  149. {$uninstallf}
  150. </uninstall>
  151. <oldfilelist>
  152. $filelist
  153. </oldfilelist>
  154. </systemfile>
  155. ";
  156. $filelists = explode("\n", $filelist);
  157. foreach($filelists as $v)
  158. {
  159. $v = trim($v);
  160. if(!empty($v)) $dm->MakeEncodeFileTest(dirname(__FILE__), $v);
  161. }
  162. //测试无误后编译安装包
  163. $fp = fopen($moduleFilename, 'w');
  164. fwrite($fp, $modulinfo);
  165. fwrite($fp, "<modulefiles>\r\n");
  166. foreach($filelists as $v)
  167. {
  168. $v = trim($v);
  169. if(!empty($v)) $dm->MakeEncodeFile(dirname(__FILE__), $v, $fp);
  170. }
  171. fwrite($fp, "</modulefiles>\r\n");
  172. fwrite($fp, "</module>\r\n");
  173. fclose($fp);
  174. ShowMsg("成功对一个新模块进行编译!", "module_main.php");
  175. exit();
  176. }
  177. /*-------------
  178. //修改项目
  179. function editModule()
  180. --------------*/
  181. else if($action=='edit')
  182. {
  183. $filelist = str_replace("\r", "\n", trim($filelist));
  184. $filelist = trim(preg_replace("#[\n]{1,}#", "\n", $filelist));
  185. if($filelist=="")
  186. {
  187. ShowMsg("对不起,你没有指定模块的文件列表,因此不能创建项目!","-1");
  188. exit();
  189. }
  190. if (empty($dev_id)) {
  191. ShowMsg("开发者ID不能为空!","-1");
  192. exit();
  193. }
  194. if (empty($priv)) {
  195. ShowMsg("请填写开发者私钥信息","-1");
  196. exit();
  197. }
  198. // 校验私钥,确定开发者身份
  199. $devURL = DEDECDNURL."/developers/$dev_id.json";
  200. $dhd = new DedeHttpDown();
  201. $dhd->OpenUrl($devURL);
  202. $devContent = $dhd->GetHtml();
  203. $devInfo = (array)json_decode($devContent);
  204. if (($devInfo['auth_at']+60*60*24*365) < time()) {
  205. ShowMsg("您的开发者账号已经过期,请登录www.dedebiz.com重新申请!","-1");
  206. exit();
  207. }
  208. if (strlen($modulname) > 150) {
  209. ShowMsg("模块名称过长","-1");
  210. exit();
  211. }
  212. // 校验私钥合法性
  213. $enstr = json_encode(array(
  214. "module_name" => $modulname,
  215. "dev_id" => $devInfo['dev_id'],
  216. ));
  217. // 私钥加密模块信息
  218. openssl_private_encrypt($enstr,$encotent,$priv);
  219. $moduleInfo = base64url_encode($encotent);
  220. openssl_public_decrypt($encotent,$decontent,$devInfo['pub_key']);
  221. $minfo = (array)json_decode($decontent);
  222. if ($minfo['module_name'] != $modulname || $minfo['dev_id'] != $devInfo['dev_id']) {
  223. ShowMsg("开发者私钥校验失败,请确保填写正确的开发者私钥","-1");
  224. exit();
  225. }
  226. //已经去除转义
  227. foreach($_POST as $k=>$v) $$k = stripslashes($v);
  228. if(!isset($autosetup)) $autosetup = 0;
  229. if(!isset($autodel)) $autodel = 0;
  230. $mdir = DEDEDATA.'/module';
  231. $hashcode = $hash;
  232. $moduleFilename = $mdir.'/'.$hashcode.'.xml';
  233. $modulname = str_replace('=', '', $modulname);
  234. $indexurl = str_replace('=', '**', $indexurl);
  235. $menustring = base64_encode($menustring);
  236. $dm = new DedeModule($mdir);
  237. $readmef = base64_encode($readmetxt);
  238. $setupf = $uninstallf = '';
  239. //编译setup文件
  240. if(is_uploaded_file($setup))
  241. {
  242. move_uploaded_file($setup, $mdir."/{$hashcode}-s.php") or die("你没上传,或系统无法把setup文件移动到 module 目录!");
  243. $setupf = $dm->GetEncodeFile($mdir."/{$hashcode}-s.php", TRUE);
  244. } else {
  245. if($autosetup==0) $setupf = base64_encode($dm->GetSystemFile($hashcode, 'setup'));
  246. }
  247. //编译uninstall文件
  248. if(is_uploaded_file($uninstall))
  249. {
  250. move_uploaded_file($uninstall,$mdir."/{$hashcode}-u.php") or die("你没上传,或系统无法把uninstall文件移动到 module 目录!");
  251. $uninstallf = $dm->GetEncodeFile($mdir."/{$hashcode}-u.php",true);
  252. } else {
  253. if($autodel==0) $uninstallf = base64_encode($dm->GetSystemFile($hashcode,'uninstall'));
  254. }
  255. if(trim($setupsql40)=='') $setupsql40 = '';
  256. else $setupsql40 = base64_encode(htmlspecialchars_decode(trim($setupsql40)));
  257. //if(trim($setupsql41)=='') $setupsql41 = '';
  258. //else $setupsql41 = base64_encode(trim($setupsql41));
  259. if(trim($delsql)=='') $delsql = '';
  260. else $delsql = base64_encode(strip_tags(trim($delsql)));
  261. $modulinfo = "<module>
  262. <baseinfo>
  263. name={$modulname}
  264. dev_id={$devInfo['dev_id']}
  265. info={$moduleInfo}
  266. time={$mtime}
  267. hash={$hashcode}
  268. indexname={$indexname}
  269. indexurl={$indexurl}
  270. ismember={$ismember}
  271. autosetup={$autosetup}
  272. autodel={$autodel}
  273. lang=utf-8
  274. moduletype={$moduletype}
  275. </baseinfo>
  276. <systemfile>
  277. <menustring>
  278. $menustring
  279. </menustring>
  280. <readme>
  281. {$readmef}
  282. </readme>
  283. <setupsql40>
  284. $setupsql40
  285. </setupsql40>
  286. <delsql>
  287. $delsql
  288. </delsql>
  289. <setup>
  290. {$setupf}
  291. </setup>
  292. <uninstall>
  293. {$uninstallf}
  294. </uninstall>
  295. <oldfilelist>
  296. $filelist
  297. </oldfilelist>
  298. </systemfile>
  299. ";
  300. if($rebuild=='yes')
  301. {
  302. $filelists = explode("\n", $filelist);
  303. foreach($filelists as $v)
  304. {
  305. $v = trim($v);
  306. if(!empty($v)) $dm->MakeEncodeFileTest(dirname(__FILE__),$v);
  307. }
  308. //测试无误后编译安装包
  309. $fp = fopen($moduleFilename, 'w');
  310. fwrite($fp, $modulinfo."\r\n");
  311. fwrite($fp, "<modulefiles>\r\n");
  312. foreach($filelists as $v)
  313. {
  314. $v = trim($v);
  315. if(!empty($v)) $dm->MakeEncodeFile(dirname(__FILE__),$v,$fp);
  316. }
  317. fwrite($fp,"</modulefiles>\r\n");
  318. fwrite($fp,"</module>\r\n");
  319. fclose($fp);
  320. } else {
  321. $fxml = $dm->GetFileXml($hashcode);
  322. $fp = fopen($moduleFilename, 'w');
  323. fwrite($fp, $modulinfo."\r\n");
  324. fwrite($fp, $fxml);
  325. fclose($fp);
  326. }
  327. ShowMsg("成功对模块重新编译!", "module_main.php");
  328. exit();
  329. }
  330. //ClearAllLink();