国内流行的内容管理系统(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.

314 lines
10KB

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