admin.class.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. $session_storage = 'session_'.pc_base::load_config('system','session_storage');
  4. pc_base::load_sys_class($session_storage);
  5. if(param::get_cookie('sys_lang')) {
  6. define('SYS_STYLE',param::get_cookie('sys_lang'));
  7. } else {
  8. define('SYS_STYLE','zh-cn');
  9. }
  10. //定义在后台
  11. define('IN_ADMIN',true);
  12. class admin {
  13. public $userid;
  14. public $username;
  15. public function __construct() {
  16. self::check_admin();
  17. self::check_priv();
  18. pc_base::load_app_func('global','admin');
  19. if (!module_exists(ROUTE_M)) showmessage(L('module_not_exists'));
  20. self::manage_log();
  21. self::check_ip();
  22. self::lock_screen();
  23. self::check_hash();
  24. if(pc_base::load_config('system','admin_url') && $_SERVER["HTTP_HOST"]!= pc_base::load_config('system','admin_url')) {
  25. Header("http/1.1 403 Forbidden");
  26. exit('No permission resources.');
  27. }
  28. }
  29. /**
  30. * 判断用户是否已经登陆
  31. */
  32. final public function check_admin() {
  33. if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'public_card'))) {
  34. return true;
  35. } else {
  36. $userid = param::get_cookie('userid');
  37. if(!isset($_SESSION['userid']) || !isset($_SESSION['roleid']) || !$_SESSION['userid'] || !$_SESSION['roleid'] || $userid != $_SESSION['userid']) showmessage(L('admin_login'),'?m=admin&c=index&a=login');
  38. }
  39. }
  40. /**
  41. * 加载后台模板
  42. * @param string $file 文件名
  43. * @param string $m 模型名
  44. */
  45. final public static function admin_tpl($file, $m = '') {
  46. $m = empty($m) ? ROUTE_M : $m;
  47. if(empty($m)) return false;
  48. return PC_PATH.'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$file.'.tpl.php';
  49. }
  50. /**
  51. * 按父ID查找菜单子项
  52. * @param integer $parentid 父菜单ID
  53. * @param integer $with_self 是否包括他自己
  54. */
  55. final public static function admin_menu($parentid, $with_self = 0) {
  56. $parentid = intval($parentid);
  57. $menudb = pc_base::load_model('menu_model');
  58. $site_model = param::get_cookie('site_model');
  59. $where = array('parentid'=>$parentid,'display'=>1);
  60. if ($site_model && $parentid) {
  61. $where[$site_model] = 1;
  62. }
  63. $result =$menudb->select($where,'*',1000,'listorder ASC');
  64. if($with_self) {
  65. $result2[] = $menudb->get_one(array('id'=>$parentid));
  66. $result = array_merge($result2,$result);
  67. }
  68. //权限检查
  69. if($_SESSION['roleid'] == 1) return $result;
  70. $array = array();
  71. $privdb = pc_base::load_model('admin_role_priv_model');
  72. $siteid = param::get_cookie('siteid');
  73. foreach($result as $v) {
  74. $action = $v['a'];
  75. if(preg_match('/^public_/',$action)) {
  76. $array[] = $v;
  77. } else {
  78. if(preg_match('/^ajax_([a-z]+)_/',$action,$_match)) $action = $_match[1];
  79. $r = $privdb->get_one(array('m'=>$v['m'],'c'=>$v['c'],'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));
  80. if($r) $array[] = $v;
  81. }
  82. }
  83. return $array;
  84. }
  85. /**
  86. * 获取菜单 头部菜单导航
  87. *
  88. * @param $parentid 菜单id
  89. */
  90. final public static function submenu($parentid = '', $big_menu = false) {
  91. if(empty($parentid)) {
  92. $menudb = pc_base::load_model('menu_model');
  93. $r = $menudb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>ROUTE_A));
  94. $parentid = $_GET['menuid'] = $r['id'];
  95. }
  96. $array = self::admin_menu($parentid,1);
  97. $numbers = count($array);
  98. if($numbers==1 && !$big_menu) return '';
  99. $string = '';
  100. $pc_hash = $_SESSION['pc_hash'];
  101. foreach($array as $_value) {
  102. if (!isset($_GET['s'])) {
  103. $classname = ROUTE_M == $_value['m'] && ROUTE_C == $_value['c'] && ROUTE_A == $_value['a'] ? 'class="on"' : '';
  104. } else {
  105. $_s = !empty($_value['data']) ? str_replace('=', '', strstr($_value['data'], '=')) : '';
  106. $classname = ROUTE_M == $_value['m'] && ROUTE_C == $_value['c'] && ROUTE_A == $_value['a'] && $_GET['s'] == $_s ? 'class="on"' : '';
  107. }
  108. if($_value['parentid'] == 0 || $_value['m']=='') continue;
  109. if($classname) {
  110. $string .= "<a href='javascript:;' $classname><em>".L($_value['name'])."</em></a><span>|</span>";
  111. } else {
  112. $string .= "<a href='?m=".$_value['m']."&c=".$_value['c']."&a=".$_value['a']."&menuid=$parentid&pc_hash=$pc_hash".'&'.$_value['data']."' $classname><em>".L($_value['name'])."</em></a><span>|</span>";
  113. }
  114. }
  115. $string = substr($string,0,-14);
  116. return $string;
  117. }
  118. /**
  119. * 当前位置
  120. *
  121. * @param $id 菜单id
  122. */
  123. final public static function current_pos($id) {
  124. $menudb = pc_base::load_model('menu_model');
  125. $r =$menudb->get_one(array('id'=>$id),'id,name,parentid');
  126. $str = '';
  127. if($r['parentid']) {
  128. $str = self::current_pos($r['parentid']);
  129. }
  130. return $str.L($r['name']).' > ';
  131. }
  132. /**
  133. * 获取当前的站点ID
  134. */
  135. final public static function get_siteid() {
  136. return get_siteid();
  137. }
  138. /**
  139. * 获取当前站点信息
  140. * @param integer $siteid 站点ID号,为空时取当前站点的信息
  141. * @return array
  142. */
  143. final public static function get_siteinfo($siteid = '') {
  144. if ($siteid == '') $siteid = self::get_siteid();
  145. if (empty($siteid)) return false;
  146. $sites = pc_base::load_app_class('sites', 'admin');
  147. return $sites->get_by_id($siteid);
  148. }
  149. final public static function return_siteid() {
  150. $sites = pc_base::load_app_class('sites', 'admin');
  151. $siteid = explode(',',$sites->get_role_siteid($_SESSION['roleid']));
  152. return current($siteid);
  153. }
  154. /**
  155. * 权限判断
  156. */
  157. final public function check_priv() {
  158. if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'init', 'public_card'))) return true;
  159. if($_SESSION['roleid'] == 1) return true;
  160. $siteid = param::get_cookie('siteid');
  161. $action = ROUTE_A;
  162. $privdb = pc_base::load_model('admin_role_priv_model');
  163. if(preg_match('/^public_/',ROUTE_A)) return true;
  164. if(preg_match('/^ajax_([a-z]+)_/',ROUTE_A,$_match)) {
  165. $action = $_match[1];
  166. }
  167. $r =$privdb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));
  168. // 2020年8月20日10:40:42 yf 调整
  169. //获取 站点管理员 的删除栏目权限
  170. if(ROUTE_C == 'category'){
  171. $catid = $_GET['catid'] ? $_GET['catid'] : $_POST['catid'];
  172. //获取角色当前权限设置
  173. pc_base::load_app_class('role_cat', '', 0);
  174. $priv = role_cat::get_roleid($_SESSION['roleid'], $siteid);
  175. if($priv[$catid][$action]) $r = true;
  176. }
  177. // 修改完成
  178. if(!$r) showmessage('您没有权限操作该项','blank');
  179. }
  180. /**
  181. *
  182. * 记录日志
  183. */
  184. final private function manage_log() {
  185. //判断是否记录
  186. $setconfig = pc_base::load_config('system');
  187. extract($setconfig);
  188. if($admin_log==1){
  189. $action = ROUTE_A;
  190. if($action == '' || strchr($action,'public') || $action == 'init' || $action=='public_current_pos') {
  191. return false;
  192. }else {
  193. $ip = ip();
  194. $log = pc_base::load_model('log_model');
  195. $username = param::get_cookie('admin_username');
  196. $userid = isset($_SESSION['userid']) ? $_SESSION['userid'] : '';
  197. $time = date('Y-m-d H-i-s',SYS_TIME);
  198. $url = '?m='.ROUTE_M.'&c='.ROUTE_C.'&a='.ROUTE_A;
  199. $log->insert(array('module'=>ROUTE_M,'username'=>$username,'userid'=>$userid,'action'=>ROUTE_C, 'querystring'=>$url,'time'=>$time,'ip'=>$ip));
  200. }
  201. }
  202. }
  203. /**
  204. *
  205. * 后台IP禁止判断 ...
  206. */
  207. final private function check_ip(){
  208. $this->ipbanned = pc_base::load_model('ipbanned_model');
  209. $this->ipbanned->check_ip();
  210. }
  211. /**
  212. * 检查锁屏状态
  213. */
  214. final private function lock_screen() {
  215. if(isset($_SESSION['lock_screen']) && $_SESSION['lock_screen']==1) {
  216. if(preg_match('/^public_/', ROUTE_A) || (ROUTE_M == 'content' && ROUTE_C == 'create_html') || (ROUTE_M == 'release') || (ROUTE_A == 'login') || (ROUTE_M == 'search' && ROUTE_C == 'search_admin' && ROUTE_A=='createindex')) return true;
  217. showmessage(L('admin_login'),'?m=admin&c=index&a=login');
  218. }
  219. }
  220. /**
  221. * 检查hash值,验证用户数据安全性
  222. */
  223. final private function check_hash() {
  224. if(preg_match('/^public_/', ROUTE_A) || ROUTE_M =='admin' && ROUTE_C =='index' || in_array(ROUTE_A, array('login'))) {
  225. return true;
  226. }
  227. if(isset($_GET['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_GET['pc_hash'])) {
  228. return true;
  229. } elseif(isset($_POST['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_POST['pc_hash'])) {
  230. return true;
  231. } else {
  232. showmessage(L('hash_check_false'),HTTP_REFERER);
  233. }
  234. }
  235. /**
  236. * 后台信息列表模板
  237. * @param string $id 被选中的模板名称
  238. * @param string $str form表单中的属性名
  239. */
  240. final public function admin_list_template($id = '', $str = '') {
  241. $templatedir = PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.'content'.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR;
  242. $pre = 'content_list';
  243. $templates = glob($templatedir.$pre.'*.tpl.php');
  244. if(empty($templates)) return false;
  245. $files = @array_map('basename', $templates);
  246. $templates = array();
  247. if(is_array($files)) {
  248. foreach($files as $file) {
  249. $key = substr($file, 0, -8);
  250. $templates[$key] = $file;
  251. }
  252. }
  253. ksort($templates);
  254. return form::select($templates, $id, $str,L('please_select'));
  255. }
  256. }