Danya Опубликовано 21 ноября, 2013 Жалоба Поделиться Опубликовано 21 ноября, 2013 Добавил поле под email 1. файл api/Managers.php <?php require_once('Simpla.php'); class Managers extends Simpla { public $permissions_list = array('products', 'categories', 'brands', 'features', 'orders', 'labels', 'users', 'groups', 'pages', 'blog', 'comments', 'feedbacks', 'import', 'export', 'backup', 'stats', 'design', 'settings', 'currency', 'delivery', 'payment', 'managers'); public $passwd_file = "simpla/.passwd"; public function __construct() { // Для совсестимости с режимом CGI if (isset($_SERVER['REDIRECT_REMOTE_USER']) && empty($_SERVER['PHP_AUTH_USER'])) { $_SERVER['PHP_AUTH_USER'] = $_SERVER['REDIRECT_REMOTE_USER']; } } public function get_managers() { $lines = explode("\n", @file_get_contents($this->passwd_file)); $managers = array(); foreach($lines as $line) { if(!empty($line)) { $manager = null; $fields = explode(":", $line); $manager = new stdClass(); $manager->login = trim($fields[0]); $manager->email = trim($fields[2]); $manager->permissions = array(); if(isset($fields[3])) { $manager->permissions = explode(",", $fields[3]); foreach($manager->permissions as &$permission) $permission = trim($permission); } else $manager->permissions = $this->permissions_list; $managers[] = $manager; } } return $managers; } public function count_managers($filter = array()) { return count($this->get_managers()); } public function get_manager($login = null) { // Если не запрашивается по логину, отдаём текущего менеджера или false if(empty($login)) if(!empty($_SERVER['PHP_AUTH_USER'])) $login = $_SERVER['PHP_AUTH_USER']; else { // Тестовый менеджер, если отключена авторизация $m->login = 'manager'; $m->email = 'manager@site.com'; $m->permissions = $this->permissions_list; return $m; } foreach($this->get_managers() as $manager) { if($manager->login == $login) return $manager; } return false; } public function add_manager($manager) { $manager = (object)$manager; if(!empty($manager->login)) $m[0] = $manager->login; if(!empty($manager->password)) { // захешировать пароль $m[1] = $this->crypt_apr1_md5($manager->password); } else { $m[1] = ""; } if(!empty($manager->email)) $m[2] = $manager->email; if(is_array($manager->permissions)) { if(count(array_diff($this->permissions_list, $manager->permissions))>0) { $m[3] = implode(",", $manager->permissions); } else { unset($m[3]); } } $line = implode(":", $m); file_put_contents($this->passwd_file, @file_get_contents($this->passwd_file)."\n".$line); if($m = $this->get_manager($manager->login)) return $m->login; else return false; } public function update_manager($login, $manager) { $manager = (object)$manager; // Не допускаем двоеточия в логине if(!empty($manager->login)) $manager->login = str_replace(":", "", $manager->login); if(!empty($manager->email)) $manager->email = str_replace(":", "", $manager->email); $lines = explode("\n", @file_get_contents($this->passwd_file)); $updated_flag = false; foreach($lines as &$line) { $m = explode(":", $line); if($m[0] == $login) { if(!empty($manager->login)) $m[0] = $manager->login; if(!empty($manager->password)) { // захешировать пароль $m[1] = $this->crypt_apr1_md5($manager->password); } if(!empty($manager->email)) $m[2] = $manager->email; if(isset($manager->permissions) && is_array($manager->permissions)) { if(count(array_diff($this->permissions_list, $manager->permissions))>0) { $m[3] = implode(",", array_intersect($this->permissions_list, $manager->permissions)); } else { unset($m[3]); } } $line = implode(":", $m); $updated_flag = true; } } if($updated_flag) { file_put_contents($this->passwd_file, implode("\n", $lines)); if($m = $this->get_manager($manager->login)) return $m->login; } return false; } public function delete_manager($login) { $lines = explode("\n", @file_get_contents($this->passwd_file)); foreach($lines as $i=>$line) { $m = explode(":", $line); if($m[0] == $login) unset($lines[$i]); } file_put_contents($this->passwd_file, implode("\n", $lines)); return true; } private function crypt_apr1_md5($plainpasswd) { $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8); $len = strlen($plainpasswd); $text = $plainpasswd.'$apr1$'.$salt; $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd)); for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); } for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; } $bin = pack("H32", md5($text)); for($i = 0; $i < 1000; $i++) { $new = ($i & 1) ? $plainpasswd : $bin; if ($i % 3) $new .= $salt; if ($i % 7) $new .= $plainpasswd; $new .= ($i & 1) ? $bin : $plainpasswd; $bin = pack("H32", md5($new)); } $tmp = ''; for ($i = 0; $i < 5; $i++) { $k = $i + 6; $j = $i + 12; if ($j == 16) $j = 5; $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp; } $tmp = chr(0).chr(0).$bin[11].$tmp; $tmp = strtr(strrev(substr(base64_encode($tmp), 2)), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); return "$"."apr1"."$".$salt."$".$tmp; } public function access($module) { $manager = $this->get_manager(); if(is_array($manager->permissions)) return in_array($module, $manager->permissions); else return false; } } 2. файл simpla/ManagerAdmin.php <?PHP require_once('api/Simpla.php'); class ManagerAdmin extends Simpla { public function fetch() { if($this->request->method('post')) { $manager = new stdClass(); $manager->old_login = $this->request->post('old_login'); $manager->login = $this->request->post('login'); $manager->email = $this->request->post('email'); if(!is_writable($this->managers->passwd_file)) { $this->design->assign('message_error', 'not_writable'); } elseif(empty($manager->login)) { $this->design->assign('message_error', 'empty_login'); } elseif($this->managers->get_manager($manager->login) && $manager->login!=$manager->old_login) { $manager->login = $manager->old_login; $manager->permissions = (array)$this->request->post('permissions'); $this->design->assign('message_error', 'login_exists'); } elseif(empty($manager->email)) { $this->design->assign('message_error', 'empty_email'); } else { if($this->request->post('password') != "") $manager->password = $this->request->post('password'); // Обновляем права только другим менеджерам $current_manager = $this->managers->get_manager(); if($manager->old_login != $current_manager->login) $manager->permissions = (array)$this->request->post('permissions'); if(empty($manager->old_login)) { $manager->login = $this->managers->add_manager($manager); $this->design->assign('message_success', 'added'); } else { $manager->login = $this->managers->update_manager($manager->old_login, $manager); $this->design->assign('message_success', 'updated'); } $manager = $this->managers->get_manager($manager->login); } } else { $login = $this->request->get('login'); if(!empty($login)) $manager = $this->managers->get_manager($login); } if(!empty($manager)) { $this->design->assign('m', $manager); } return $this->design->fetch('manager.tpl'); } } 3. файл simpla/design/html/managers.tplзаменить <div class="user_email cell"> <a href="mailto:{$user->name|escape}<{$user->email|escape}>">{$user->email|escape}</a> </div> на <div class="user_email cell"> <a href="mailto:{$m->name|escape}<{$m->email|escape}>">{$m->email|escape}</a> </div> 4. файл simpla/design/html/manager.tplзаменить {if $message_error=='login_exists'}Менеджер с таким логином уже существует {elseif $message_error=='empty_login'}Введите логин {elseif $message_error=='not_writable'}Установите права на запись для файла /simpla/.passwd {else}{$message_error|escape}{/if} на {if $message_error=='login_exists'}Менеджер с таким логином уже существует {elseif $message_error=='empty_login'}Введите логин {elseif $message_error=='empty_email'}Введите email {elseif $message_error=='not_writable'}Установите права на запись для файла /simpla/.passwd {else}{$message_error|escape}{/if} ниже после <input class="name" name="login" type="text" value="{$m->login|escape}" maxlength="32"/> добавить <input name="email" class="name" type="text" value="{$m->email|escape}" /> 5. в файле simpla/.passwdнужно отсортировать положение содержимого: 0 - логин 1 - пароль 2 - email 3 - права доступа пример admin:$apr2$tad31c5n$m8qE.pkzKS3RrJGkHHtk3.:admin@site.com:products,categories,brands,features,orders,labels,users,groups,pages,blog,comments,feedbacks,import,export,backup,stats,design,settings,currency,delivery,payment,managers список менеджеров редактирование менеджера Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.