时间:2021-07-01 10:21:17 帮助过:26人阅读
接下来介绍Elastix1.5.2-2的主index.php,这里主要是对该文件的源码标注,大家看后应该会对系统的整个框架会有大体上的认识。 ?php /* 包含 misc.lib.php 文件。该文件包含提供了一些基本的函数接口,这些接口的功能有获取系统信息(内存信息、 CPU 信息、硬
接下来介绍Elastix1.5.2-2的主index.php,这里主要是对该文件的源码标注,大家看后应该会对系统的整个框架会有大体上的认识。
/* 包含 misc.lib.php 文件。该文件包含提供了一些基本的函数接口,这些接口的功能有获取系统信息(内存信息、 CPU 信息、硬盘信息)、构建合法的 URL 、转换日期格式(如将 1 Apr 2010 转化为 2010-4-1 )、获取或修改数据表 ettings 的字段值、获取 elastix 版本信息、加载显示的主题、加载用户选择的语言、获取所有菜单、获取语言种类等等。 */
include_once ( "libs/misc.lib.php" );
/* 包含 default.conf.php 文件。该文件中包含了一个全局数组 $arrConf ,数组中存储了系统主目录、系统运行用到的目录、系统的主题属性、系统默认所使用的语言种类等信息。使用该数组时,包含之即可。 */
include_once "configs/default.conf.php" ;
/* 包含文件 paloSantoNavigation.class.php 文件。该文件中定义了一个名为 paloSantoNavigation 的类。该类主要是对一些 menu 操作的封装,包括获取菜单、显示菜单、内容显示、获取服务器名、获取服务器 IP 。其中该类中有一个成员函数名为 showConent(), index.php 文件,若存在此文件则执行该文件中的 _moduleContent() 函数。各个模块的特有内容显示就交由各个模块负责。 */
include_once "libs/paloSantoNavigation.class.php" ;
/* 包含 paloSantoDB.class.php 文件。该文件中定义了一个名为 paloDB 的类。该类封装了一些数据库操作的方法,为用户访问数据提供了接口。该类的方法支持对 sqlite 和 MySQL 两种数据库类型的操作。 */
include_once "libs/paloSantoDB.class.php" ;
/* 包含 paloSantoACL.class.php 文件。该文件中定义了一个名为 paloACL 的类。该类主要对系统用户的访问操作级别进行了划分。默认情况下, elastix 用户被分为四个组( Administrator 、 Operador 、 Extension 及 Tel-manger ),管理员还可以创建新的用户组并为各组指定可以访问的菜单,可以新建用户,删除组,删除用户,给各组划分权限等。 */
include_once ( "libs/paloSantoACL.class.php" ); // Don activate unless you know what you are doing. Too risky!
// 开发人员开发时使用的开关。当 $developerMode=true 时,不需身份认证可以进入系统并显示所有的菜单。
$developerMode = false ;
// 设置当前 session 的名字为 elastixSessin ,用在 session_start() 之前
session_name( "elastixSession" );
//session_start() 有两个作用
//1. 创建一个新的 session;
//2. 恢复当前的 session ,该 session 是由 GET 方法、 POST 请求或 COOKIE 的 session 标识符来确定的
// 另外,在使用基于 cookie 的 session 时,必须把 session_start() 放在向浏览器输出的动作之前。
session_start(); // 只要连接到服务器,就开始 session
// GET 方法得到的是 logout 操作
if ( isset ( $_GET [ 'logout' ]) && $_GET [ 'logout' ]== 'yes' ) {
session_destroy(); // 销毁所有与当前 session 有关的数据
session_name( "elastixSession" ); // 重新设置 session 的名字
session_start(); // 创建新的 session ,回到登录界面,重新开始 session
}
//cargar el archivo de idioma
//$lang=isset($arrConf['language'])?$arrConf['language']:"en";
//include_once("lang/".$lang.".lang");
// 获取系统显示所使用的语言包。该函数定义在 misc.lib.php 文件中。 load_language() 在加载使用的语言时,先检查 settings 数据表中 key 字段为 language 的值,若该值存在,则加载该语言包;若该值为空,则查看全局数组中 $arrConf[‘language’] 是否被设置,若设置了,则调用相应的语言包;若没有设置则使用默认的英语语言包。
load_language();
// 实例化一个 paloDB 对象,设置使用的数据源为 acl.db 。 $arrConf['elastix_dsn']['acl'] 的值
//是 "sqlite3:////var/www/db/acl.db" 。 acl.db 数据包含了 9 个数据表。
$pDB = new paloDB( $arrConf [ 'elastix_dsn' ][ 'acl' ]);
// 若在实例化 paloDB 对象时,数据库产生错误,则输出错误信息
if (! empty ( $pDB ->errMsg)) {
echo
"ERROR DE DB:
$pDB
->errMsg
"
;
}
// 以 $pDB 为参数实例化一个 paloACL 对象 $pACL
$pACL = new paloACL( $pDB );
// 若在实例化 paloACL 过程中产生错误,则输出错误信息
if (! empty ( $pACL ->errMsg)) {
echo
"ERROR DE DB:
$pACL
->errMsg
"
;
}
// Load smarty
require_once ( "libs/smarty/libs/Smarty.class.php" ); // 包含 Smarty 类文件
$smarty = new Smarty(); // 实例化一个 Smarty 类的对象 $smarty
// 给 $smarty 的一些变量赋值。设置模板所在的目录
$smarty ->template_dir = "themes/" . $arrConf [ 'mainTheme' ];
// 若发现系统中任何 tpl 文件有改动,则需要对其进行重新编译,编译后放在 /var/www/html/var/templates_c/ 目录下
$smarty ->compile_dir = "var/templates_c/" ;
// 设置配置文件所在的目录,文件名一般以 .conf.php 结尾,保存一些变量等信息
$smarty ->config_dir = "configs/" ;
// 设置保存缓冲文件的目录
$smarty ->cache_dir = "var/cache/" ;
//$smarty->debugging = true;
//- 1) SUBMIT. Si se hizo submit en el formulario de ingreso
//- autentico al usuario y lo ingreso a la sesion
// 若点击了提交按钮且用户名非空
if ( isset ( $_POST [ 'submit_login' ]) and ! empty ( $_POST [ 'input_user' ])) {
$pass_md5 = md5( $_POST [ 'input_pass' ]); // 把用户输入的密码用 MD5 加密赋值给 $pass_md5
// 若经验证时 elastix 的合法用户且密码正确,则做一些赋值操作
if ( $pACL ->authenticateUser( $_POST [ 'input_user' ], $pass_md5 )) {
// 将用户名赋值给 session 的一个变量中,以便以后用来确定登录的用户
$_SESSION [ 'elastix_user' ] = $_POST [ 'input_user' ];
// 将用户登录使用的密码存储在 session 的变量中
$_SESSION [ 'elastix_pass' ] = $pass_md5 ;
} else {
// 若用户验证没通过, DO NOTHING!!!!! 此处可以不作处理,也可以输出一些提示信息,要求用户重新输入用户名和密码。/因 为只有两种情况下程序才能走到这里:只输入了用户名(不论该用户是否存在)而没有输入密码、输入了错误的用户名和密码。
// Debo hacer algo aqu 铆 ?
}
}
// 实例化一个 paloDB 对象,使用的数据库是 menu.db 。 menu.db 中只有一个数据表 menu ,该表中存储了所有的菜单项
$pDBMenu = new paloDB( $arrConf [ 'elastix_dsn' ][ 'menu' ]);
// 加载菜单表的内容,并把菜单结构赋值给 $arrMenu ,此时 $arrMenu 里保存了所有菜单的结构, cargar_menu() 函数的定义 在 misc.lib.php 文件里,负责把 menu 表中的内容以数组的形式读出来。
$arrMenu = cargar_menu( $pDBMenu ) ;
// 判定是否是正宗的用户,包括验证用户名和密码;或者是否处于开发状态
// 2) Autentico usuario
if ( isset ( $_SESSION [ 'elastix_user' ]) && isset ( $_SESSION [ 'elastix_pass' ]) && $pACL ->authenticateUser( $_SESSION [ 'elastix_user' ], $_SESSION [ 'elastix_pass' ]) or $developerMode == true ) { //$developerMode==true 是开发时用的开关,此时无需身份验证即可登录。
// 搜索登录用户在 acl_user 表中对应的 id ,保存为 $idUser 。 acl_user 表在数据库 acl.db 中。
$idUser = $pACL ->getIdUser( $_SESSION [ 'elastix_user' ]);
// 检查 $_SESSION['elastix_user_permission']) 是否被赋值。如果是全新的登录,则该变量是未被赋值的,该判断为真,进入 if 内部,经过一些操作,将该登录用户可以访问的菜单赋值给该变量。
if (! isset ( $_SESSION [ 'elastix_user_permission' ])){
if ( $developerMode != true ) { // 不是出于开发模式, $developerMode 为真时,开发人员可以访问所有 menu 。
// 声明 $arrMenuFiltered 是数组类型变量,用来存储登录用户能访问的所有 menu
$arrMenuFiltered = array ();
//- TODO : Mejorar el siguiente bloque. Seguro debe de haber una forma mas
//-
eficiente de hacerlo
//
安全必须是一个做更有效的方法
//- Primero me barro todos los submenus 首先,我扫了所有子菜单
$arrSubmenu = array (); // 声明 $arrSubMenu 是数组类型变量,用于暂存登录用户有访问权限的 menu
// 下面是获取所有子菜单
foreach ( $arrMenu as $idMenu => $arrMenuItem ) { // 遍历加载的 menu 数组
if (! empty ( $arrMenuItem [ 'IdParent' ])) { // 如果当前 menu 不是顶级 menu
// 如果登录的用户对当前遍历到的菜单有 access 的权限
if ( $pACL ->isUserAuthorizedById( $idUser , "access" , $idMenu )) {
// 把 $arrMenuItem 数组赋值给 $arrSubmenu[$idMenu] 并赋值给 $arrMenuFiltered[$idMenu] 。第一个赋值是为了后面 子菜单寻找其父菜单用;第二个赋值是将整个 menu 数组存储在 $arrMenuFiltered 数组中,包括父菜单和子菜单。
$arrSubmenu [ $idMenu ] = $arrMenuItem ;
$arrMenuFiltered [ $idMenu ] = $arrMenuItem ;
}
}
}
// 获取顶级菜单
//- Ahora me barro el menu principal 现在我打扫主菜单
foreach ( $arrMenu as $idMenu => $arrMenuItem ) {
if ( empty ( $arrMenuItem [ 'IdParent' ])) { // 父菜单项为空,表明是顶级菜单
// 遍历所有 menu 以便获取各个子 menu 的父 menu 是谁
foreach ( $arrSubmenu as $idSubMenu => $arrSubMenuItem ) {
// 找出各个父 menu 拥有的子 menu ,将子 menu 归类到父 menu
if ( $arrSubMenuItem [ 'IdParent' ]== $idMenu ) {
$arrMenuFiltered [ $idMenu ] = $arrMenuItem ;
}
}
}
}
} else { // 若是开发模式,则把所有的菜单赋值给筛选用的变量
$arrMenuFiltered = $arrMenu ;
}
//Guardo en la session los menus q tiene con permisos el usuario logoneado, esto se implement 贸 para mejorar
//el proceso del httpd ya que consumia mucho recurso. Reportado por Ana Vivar
//Una vez q exista en la session solo se lo sacara de ahi y no se vovera a consultar a la base.
// 将筛选后的菜单赋值给全局变量 $_SESSION[‘elastix_user_permission’] ,在整个 session 期间可以直接使
//用该变量
$_SESSION [ 'elastix_user_permission' ]= $arrMenuFiltered ;
}
// 若 $_SESSION[‘elastix_user_permission’] 不为空,则将其赋值给 $arrMenuFiltered 数组。此处应加
// else ,当用户 第一次登录时,此赋值多余
$arrMenuFiltered = $_SESSION [ 'elastix_user_permission' ];
//traducir el menu al idioma correspondiente
// 按照本地语言配置,将当前用户可见的菜单名称翻译为用户选择的本地语言
foreach ( $arrMenuFiltered as $idMenu => $arrMenuItem ) {
$arrMenuFiltered [ $idMenu ][ 'Name' ]= isset ( $arrLang [ $arrMenuItem [ 'Name' ]])? $arrLang [ $arrMenuItem [ 'Name' ]]: $arrMenuItem [ 'Name' ];
//$arrLang 在 default.conf.php 有定义。 $arrLang 数组定义了使用到的数据源、 elastix 主目录、显示主题、默认显示语 言、系统备份目录等信息。
}
// 实例化一个 paloSantoNavigation 对象 $oPn, 把准备好的变量作为参数。其中, $arrConf 定义在 default.conf.php 文件 中; $arrMenuFiltered 存储的是登陆用户有访问权限的 menu 数组; $smarty 是 Smart 类的一个对象,通过其成员函数 assign() 给一些 smarty 变量赋值。
$oPn = new paloSantoNavigation( $arrConf , $arrMenuFiltered , $smarty );
// 通过 smarty 的 assign 函数对 tpl 模板文件用到的基本变量赋值; THEMENAME 是用户登录后显示主题的变量; ABOUT_ELASTIX , ABOUT_ELASTIX_CONTENT , LOGOUT 等都会以相应的翻译后的值。 $arrLang 是 global 变量。 该变量在用户选择的语言包(如 cn.lang )里面定义的,每个 .lang 文件都有定义。
$smarty ->assign( "THEMENAME" , $arrConf [ 'mainTheme' ]);
$smarty ->assign( "ABOUT_ELASTIX" , $arrLang [ 'About Elastix' ]. " " . $arrConf [ 'elastix_version' ]);
$smarty ->assign( "ABOUT_ELASTIX_CONTENT" , $arrLang [ 'About Elastix Content' ]);
$smarty ->assign( "ABOUT_CLOSED" , $arrLang [ 'About Elastix Closed' ]);
$smarty ->assign( "LOGOUT" , $arrLang [ 'Logout' ]);
//$menu= (isset($_GET['menu']))?$_GET['menu']:'';
if ( isset ( $_GET [ 'menu' ])) $menu = $_GET [ 'menu' ]; // 获取 URL 的 menu 参数值
elseif ( empty ( $menu ) and ! empty ( $_SESSION [ 'menu' ])) $menu = $_SESSION [ 'menu' ];
else $menu = '' ;
// 把菜单存储到 $_SESSION[‘menu’] 中,在 session 中保持该值
$_SESSION [ 'menu' ]= $menu ;
// 若得到可访问的菜单,则把 menu 赋值给 MENU ,将来会通过 smarty 模板显示 $MENU
if (count( $arrMenuFiltered )> 0 )
$smarty ->assign( "MENU" , $oPn ->showMenu( $menu ));
else // 若没有可以显示的菜单,则会输出 ”No modules”
$smarty ->assign( "MENU" , "No modules" );
// rawmode es un modo de operacion que pasa directamente a la pantalla la salida
// del modulo. Esto es util en ciertos casos.
//rawmode 是一种显示模式,该模式下的显示已经去除了背景、样式、以及其他 MENU 等信息,直接显示子 MENU 的内容。 在页面上没有与其对应的按钮或链接,但是可以在进入菜单后通过手工修改浏览器地址栏的 URL 来查看; 形式如: http://192.168.1.183/?rawmode=yes ;猜测:通常用于带宽不够的情况下。 所以,在这种情况下直接 showContent 而不是采用 smart 模板;否则采用 smarty 模板
if ( isset ( $_GET [ 'rawmode' ]) && $_GET [ 'rawmode' ]== 'yes' ) {
// Autorizacion
if ( $pACL ->isUserAuthorizedById( $idUser , "access" , $oPn ->currSubMenu) or $developerMode == true ) {
echo $oPn ->showContent();
}
} else {
// Autorizacion // 如果登录的用户对子目录有访问权限,则将子目录的内容赋值给 CONTENT
if ( $pACL ->isUserAuthorizedById( $idUser , "access" , $oPn ->currSubMenu) or $developerMode == true ) {
$smarty ->assign( "CONTENT" , $oPn ->showContent());
}
// 用 smarty 的 display 函数显示 index.tpl 的内容, $MENU 和 $CONTENT 已经有值
$smarty ->display( "_common/index.tpl" );
}
// 若登录不成功,则要求重新登录
} else {
$smarty ->assign( "PAGE_NAME" , $arrLang [ 'Login page' ]);
$smarty ->assign( "WELCOME" , $arrLang [ 'Welcome to Elastix' ]);
$smarty ->assign( "ENTER_USER_PASSWORD" , $arrLang [ 'Please enter your username and password' ]);
$smarty ->assign( "USERNAME" , $arrLang [ 'Username' ]);
$smarty ->assign( "PASSWORD" , $arrLang [ 'Password' ]);
$smarty ->assign( "SUBMIT" , $arrLang [ 'Submit' ]);
// 赋值完成后,通过 login.tpl 模板显示出来
$smarty ->display( "_common/login.tpl" );
}
?>