2012-11-21 07:17:05 +00:00
< ? php
class AccountController extends Zend_Controller_Action
{
function indexAction ()
{
$this -> _redirect ( '/' );
}
function init ()
{
$this -> messenger = $this -> _helper -> getHelper ( 'FlashMessenger' );
}
function postDispatch ()
{
//$this->view->messages = $this->messenger->getMessages();
}
function preDispatch ()
{
$this -> view -> config = Zend_Registry :: get ( 'config' );
$this -> _request -> setParam ( 'return' , $this -> _request -> getServer ( 'REQUEST_URI' ));
$this -> db = Zend_Registry :: get ( 'db' );
$this -> view -> messages = $this -> messenger -> getMessages ();
}
function registerAction ()
{
$reg = $this -> _request -> getParam ( 'submit' );
if ( ! empty ( $reg ))
{
$this -> _helper -> layout -> disableLayout ();
$this -> _helper -> viewRenderer -> setNoRender ();
try {
$username = mb_substr ( trim ( $this -> _request -> getParam ( 'username' )), 0 , 100 , 'utf-8' );
$name = mb_substr ( trim ( $this -> _request -> getParam ( 'name' )), 0 , 100 , 'utf-8' );
$email = mb_substr ( trim ( $this -> _request -> getParam ( 'email' )), 0 , 100 , 'utf-8' );
$phone = mb_substr ( trim ( $this -> _request -> getParam ( 'phone' )), 0 , 100 , 'utf-8' );
$postcode = mb_substr ( trim ( $this -> _request -> getParam ( 'postcode' )), 0 , 10 , 'utf-8' );
$unit = mb_substr ( trim ( $this -> _request -> getParam ( 'employer' )), 0 , 200 , 'utf-8' );
$address = mb_substr ( trim ( $this -> _request -> getParam ( 'address' )), 0 , 250 , 'utf-8' );
$project = mb_substr ( trim ( $this -> _request -> getParam ( 'project' )), 0 , 500 , 'utf-8' );
$password = mb_substr ( trim ( $this -> _request -> getParam ( 'password' )), 0 , 22 , 'utf-8' );
$password_confirm = mb_substr ( trim ( $this -> _request -> getParam ( 'password_confirm' )), 0 , 22 , 'utf-8' );
$vdcode = strtolower ( substr ( trim ( $this -> _request -> getParam ( 'vdcode' )), 0 , 4 ));
include_once ( 'ajax/box.php' );
if ( strlen ( $username ) < 6 )
{
echo box :: warning ( '用户名不能少于6个字符' );
exit ();
}
if ( strlen ( $username ) > 20 )
{
echo box :: warning ( '用户名不能超过20个字符' );
exit ();
}
if ( ! preg_match ( " /^[a-zA-Z][a-zA-Z0-9_] { 4,19} $ / " , $username ))
{
echo box :: warning ( " 用户名只能包含英文字母及数字 " );
exit ();
}
if ( strlen ( $name ) < 2 )
{
echo box :: warning ( " 姓名太短 " );
exit ();
}
if ( strlen ( $name ) > 32 )
{
echo box :: warning ( " 姓名太长 " );
exit ();
}
if ( preg_match ( " /[ \" |'|~|!|#| \$ |%| \ ^| \ &| \ *| \ +| \ { | \ }| \ [| \ ]|:|;|<|>| \ ?| \ /]/ " , $name ))
{
echo box :: warning ( " 姓名中包含非法字符 " );
exit ();
}
if ( ! preg_match ( " / \ w+([-+.] \ w+)*@ \ w+([-.] \ w+)* \ . \ w+([-.] \ w+)*/i " , $email ))
{
echo box :: warning ( " 请输入正确的Email地址 " );
exit ();
}
if ( ! empty ( $phone ) && preg_match ( " /[ \" |'|~|!|#| \$ |%| \ ^| \ &| \ *| \ { | \ }| \ [| \ ]|:|;|<|>| \ ?| \ /]/ " , $phone ))
{
echo box :: warning ( " 请输入正确的电话号码 " );
exit ();
}
if ( ! empty ( $postcode ) && ! is_numeric ( $postcode ))
{
echo box :: warning ( " 请输入正确的邮政编码 " );
exit ();
}
if ( ! empty ( $unit ) && preg_match ( " /[ \" |'|~|!|#| \$ |%| \ ^| \ &| \ *| \ { | \ }| \ [| \ ]|:|;|<|>| \ ?| \ /]/ " , $unit ))
{
echo box :: warning ( " 输入的内容中包含非法字符 " );
exit ();
}
if ( ! empty ( $address ) && preg_match ( " /[ \" |'|~|!| \$ |%| \ ^| \ &| \ *| \ { | \ }| \ ?| \ /]/ " , $address ))
{
echo box :: warning ( " 地址中包含非法字符 " );
exit ();
}
$match = " /[ \" |'| \\ \ ]/i " ;
if ( preg_match ( $match , $password ) || preg_match ( $match , $password_confirm ))
{
echo box :: warning ( " 密码中包含非法字符,请重新输入 " );
exit ();
}
if ( empty ( $password ))
{
echo box :: warning ( " 请输入密码 " );
exit ();
}
if ( strlen ( $password ) < 6 )
{
echo box :: warning ( " 密码太短 " );
exit ();
}
if ( strlen ( $password ) > 20 )
{
echo box :: warning ( " 密码长度不能超过20个字符 " );
exit ();
}
if ( $password !== $password_confirm )
{
echo box :: warning ( " 两次输入的密码不同 " );
exit ();
}
$sql = " select id from users where username like '% $username %' " ;
$rs = $this -> db -> query ( $sql );
$row = $rs -> fetch ();
if ( $row [ 'id' ] > 0 )
{
echo box :: warning ( " 该用户名已经被占用,请更换 " );
exit ();
}
$sql = " select id from users where email like '% $email %' " ;
$rs = $this -> db -> query ( $sql );
$row = $rs -> fetch ();
if ( $row [ 'id' ] > 0 )
{
echo box :: warning ( " 该Email已经被使用, 请更换 " );
exit ();
}
if ( $vdcode != $_SESSION [ 'vdcodes' ])
{
echo box :: warning ( " 验证码错误 " );
exit ();
}
$sql = " INSERT INTO users (username,password,email,realname,unit,address,project,phone,postcode,usertype)
VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) " ;
$sth = $this -> db -> prepare ( $sql );
$ec = $sth -> execute ( array ( $username , md5 ( $password ), $email , $name , $unit , $address , $project , $phone , $postcode , 'member' ));
//$sql = "INSERT INTO users (username,password,usertype,email,realname,unit,address,project,phone)
// VALUES ('$username','".md5($password)."','member','$email','$name','$unit','$address','$project','$phone')";
//$ec = $this->db->exec($sql);
if ( $ec )
{
$this -> login ( $username , md5 ( $password ));
echo box :: success ( " <script> $ ('#signup').hide(); $ ('#info').html('注册成功!<br /><a href= \" \ / \" >网站首页</a> <a href= \" \ /account \ /edit \" >我的帐号</a>')</script> " );
exit ();
}
else
{
echo box :: warning ( " 处理中发生错误,请重试 " );
exit ();
}
} catch ( Exception $e ){
echo box :: warning ( " 发生错误: " . $e -> getMessage ());
exit ();
}
} //ajax 注册
}
function editAction ()
{
$auth = Zend_Auth :: getInstance ();
if ( $auth -> hasIdentity ())
{
$user = $auth -> getIdentity ();
$username = $user -> username ;
$sql = " select * from users where username=' $username ' " ;
$rs = $this -> db -> query ( $sql );
$rows = $rs -> fetch ();
$this -> view -> user = $rows ;
}
}
function saveoptAction ()
{
$this -> _helper -> layout -> disableLayout ();
$this -> _helper -> viewRenderer -> setNoRender ();
$opt = $this -> _request -> getParam ( 'opt' );
include_once ( 'ajax/box.php' );
$auth = Zend_Auth :: getInstance ();
if ( $auth -> hasIdentity ())
{
$user = $auth -> getIdentity ();
$username = $user -> username ;
$sql = " select * from users where username=' $username ' " ;
$rs = $this -> db -> query ( $sql );
$rows = $rs -> fetch ();
$this -> view -> user = $rows ;
}
else
{
echo " You must log in " ;
exit ();
}
if ( $opt == 'general' )
{
$realname = mb_substr ( trim ( $this -> _request -> getParam ( 'name' )), 0 , 100 , 'utf-8' );
$phone = mb_substr ( trim ( $this -> _request -> getParam ( 'phone' )), 0 , 100 , 'utf-8' );
$unit = mb_substr ( trim ( $this -> _request -> getParam ( 'employer' )), 0 , 200 , 'utf-8' );
$address = mb_substr ( trim ( $this -> _request -> getParam ( 'address' )), 0 , 250 , 'utf-8' );
$project = mb_substr ( trim ( $this -> _request -> getParam ( 'project' )), 0 , 500 , 'utf-8' );
$postcode = mb_substr ( trim (( int ) $this -> _request -> getParam ( 'postcode' )), 0 , 10 , 'utf-8' );
try {
if ( empty ( $realname ))
{
echo box :: warning ( " 请输入姓名 " );
exit ();
}
$sql = " UPDATE users SET realname=' $realname ',phone=' $phone ',unit=' $unit ',address=' $address ',project=' $project ',postcode=' $postcode ' WHERE id=' { $rows [ 'id' ] } ' " ;
if ( $this -> db -> query ( $sql ))
{
echo box :: success ( " 保存成功 " );
exit ();
} else {
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
} catch ( Exception $e ){
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
}
else if ( $opt == 'email' )
{
$email = substr ( trim ( $this -> _request -> getParam ( 'email' )), 0 , 100 );
$password = trim ( $this -> _request -> getParam ( 'password' ));
try {
if ( empty ( $email ))
{
echo box :: warning ( " 请输入电子邮件地址 " );
exit ();
}
if ( empty ( $password ))
{
echo box :: warning ( " 请输入密码 " );
exit ();
}
if ( ! preg_match ( " / \ w+([-+.] \ w+)*@ \ w+([-.] \ w+)* \ . \ w+([-.] \ w+)*/i " , $email ))
{
echo box :: warning ( " 请输入正确的电子邮件地址 " );
exit ();
}
if ( md5 ( $password ) !== $rows [ 'password' ]){
echo box :: warning ( " 密码错误 " );
exit ();
}
$sql = " UPDATE users SET email=' $email ' where id=' { $rows [ 'id' ] } ' " ;
if ( $this -> db -> query ( $sql ))
{
echo box :: success ( " 修改成功 " );
exit ();
} else {
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
} catch ( Exception $e ){
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
}
else if ( $opt == 'password' )
{
$password = trim ( $this -> _request -> getParam ( 'password' ));
$password_new = trim ( $this -> _request -> getParam ( 'password_new' ));
$password_confirm = trim ( $this -> _request -> getParam ( 'password_confirm' ));
$match = " /[ \" |'| \\ \ ]/i " ;
if ( empty ( $password ))
{
echo box :: warning ( " 请输入当前密码 " );
exit ();
}
if ( empty ( $password_new ))
{
echo box :: warning ( " 请输入新密码 " );
exit ();
}
if ( $password == $password_new )
{
echo box :: warning ( " 新密码不能与当前的密码相同 " );
exit ();
}
if ( empty ( $password_confirm ))
{
echo box :: warning ( " 请再次输入新密码 " );
exit ();
}
if ( preg_match ( $match , $password ) || preg_match ( $match , $password_new ) || preg_match ( $match , $password_confirm ) || $rows [ 'password' ] !== md5 ( $password ))
{
echo box :: warning ( " 您输入的内容中包含非法字符 " );
exit ();
}
if ( strlen ( $password_new ) < 6 )
{
echo box :: warning ( " 新密码太短 " );
exit ();
}
if ( strlen ( $password_new ) > 20 )
{
echo box :: warning ( " 新密码太长 " );
exit ();
}
if ( md5 ( $password_new ) !== md5 ( $password_confirm ))
{
echo box :: warning ( " 您两次输入的新密码不同 " );
exit ();
}
try {
$sql = " UPDATE users SET password=' " . md5 ( $password_new ) . " ' WHERE username=' $username ' " ;
if ( $this -> db -> query ( $sql ))
{
echo box :: success ( " 修改成功 " );
exit ();
} else {
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
} catch ( Exception $e ){
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
}
else
{
exit ();
}
} //saveopt ajax修改用户信息
function loginAction ()
{
$auth = Zend_Auth :: getInstance ();
if ( $auth -> hasIdentity ())
$this -> _redirect ( '/account' );
$href = $this -> _getParam ( 'href' );
if ( ! empty ( $href ))
{
$this -> view -> href = $href ;
}
if ( $_SERVER [ 'REQUEST_URI' ] != '/account/login' )
{
$this -> view -> href = $_SERVER [ 'REQUEST_URI' ];
}
}
function dologinAction (){
$this -> _helper -> layout -> disableLayout ();
$this -> _helper -> viewRenderer -> setNoRender ();
$submit = $this -> _request -> getParam ( 'submit' );
if ( ! empty ( $submit ))
{
$success = false ;
$message = '' ;
$username = trim ( $this -> _request -> getParam ( 'username' ));
$password = trim ( $this -> _request -> getParam ( 'password' ));
$vdcode = strtolower ( substr ( trim ( $this -> _request -> getParam ( 'vdcode' )), 0 , 4 ));
include_once ( 'ajax/box.php' );
if ( empty ( $username ))
{
echo box :: warning ( '请输入用户名' );
exit ();
}
if ( empty ( $password ))
{
echo box :: warning ( '请输入密码' );
exit ();
}
if ( empty ( $vdcode ))
{
echo box :: warning ( '请输入验证码' );
exit ();
}
if ( $vdcode != $_SESSION [ 'vdcodes' ])
{
echo box :: warning ( " 验证码错误 " );
exit ();
}
if ( ! $this -> login ( $username , $password ))
{
echo box :: error ( '用户名或密码错误' );
exit ();
}
else
{
$href = $this -> _getParam ( 'href' );
if ( ! empty ( $href ))
{
$tohref = $href ;
} else {
$tohref = " / " ;
}
echo box :: success ( '登录成功,<a href="' . $tohref . '">如果页面没有跳转请点击这里</a><script>var t = setTimeout("self.location=\'' . $tohref . '\';",2000);</script>' );
exit ();
}
}
}
function logoutAction ()
{
$this -> _helper -> layout -> disableLayout ();
$this -> _helper -> viewRenderer -> setNoRender ();
$auth = Zend_Auth :: getInstance ();
if ( $auth -> hasIdentity ())
{
$auth -> clearIdentity ();
require_once 'member.php' ;
member :: flushcookie ();
$this -> _redirect ( '/' );
}
}
private function default_login ( $u , $p )
{
$auth = Zend_Auth :: getInstance ();
$db = Zend_Registry :: get ( 'db' );
$authAdapter = new Zend_Auth_Adapter_DbTable ( $db );
$authAdapter -> setTableName ( 'users' )
-> setIdentityColumn ( 'username' )
-> setCredentialColumn ( 'password' );
$authAdapter -> setIdentity ( $u ) -> setCredential ( md5 ( $p ));
$result = $auth -> authenticate ( $authAdapter );
if ( $result -> isValid ()) {
// success: store database row to auth's storage
$data = $authAdapter -> getResultRowObject ( null , 'password' );
$auth -> getStorage () -> write ( $data );
$db -> query ( $db -> quoteInto ( " update users set ts_last_login=now() where username=? " , $u ));
if ( $this -> _request -> getParam ( 'remember' )) {
require_once 'member.php' ;
$mb = new member ();
$mb -> putcookie ( $u , md5 ( $p ));
}
return true ;
}
return false ;
}
private function aspnet_login ( $p , $salt , $password )
{
$p1 = implode ( " \x00 " , str_split ( $p )) . " \x00 " ;
$ball = base64_decode ( $salt ) . $p1 ;
return trim ( $password ) == base64_encode ( sha1 ( $ball , true ));
}
// 首先判断是否存在salt
// 若有salt, 则按照aspnet membership加密算法进行判断
function login ( $u , $p )
{
$db = Zend_Registry :: get ( 'db' );
$sql = " select password,salt from users where username=? " ;
$uq = $db -> query ( $sql , array ( $u ));
if ( $urow = $uq -> fetchObject ())
{
if ( empty ( $urow -> salt ))
return $this -> default_login ( $u , $p );
else {
//进行判断并进行转换到默认
if ( $this -> aspnet_login ( $p , $urow -> salt , $urow -> password ))
{
$sql = " update users set password=md5(?),salt='' where username=? " ;
$db -> query ( $sql , array ( $p , $u ));
return $this -> default_login ( $u , $p );
} else
return false ;
}
} else {
//没有对应的用户,登录失败
return false ;
}
}
function fetchpwdAction ()
{
$this -> _helper -> layout -> disableLayout ();
$this -> _helper -> viewRenderer -> setNoRender ();
$auth = Zend_Auth :: getInstance ();
if ( $auth -> hasIdentity ())
$this -> _redirect ( '/account' );
$email = $this -> _request -> getParam ( 'email' );
include_once ( 'ajax/box.php' );
if ( empty ( $email ))
{
echo box :: warning ( '请输入要找回密码的账户所对应的Email地址' );
exit ();
}
if ( ! preg_match ( " / \ w+([-+.] \ w+)*@ \ w+([-.] \ w+)* \ . \ w+([-.] \ w+)*/i " , $email ))
{
echo box :: warning ( " 请输入正确的Email地址 " );
exit ();
}
$sql = " SELECT * FROM users WHERE email=? " ;
$sth = $this -> db -> prepare ( $sql );
$sth -> execute ( array ( $email ));
$row = $sth -> fetch ();
if ( $row [ 'id' ] == '' )
{
echo box :: error ( " 未找到对应用户 " );
exit ();
}
//email the url to user
$username = $row [ 'username' ];
$sql = " update users set activation=? where email=? " ;
$uid = uniqid ();
$link = " http:// " . $_SERVER [ 'HTTP_HOST' ] . " /account/getpasswd?a= $uid &u= $username " ;
$this -> db -> query ( $sql , array ( $uid , $email ));
$mail = new WestdcMailer ( $this -> view -> config -> smtp );
$mailtp = new EmailText ( $this -> db ,
'member-fetchpwd' ,
array ( 'link' => $link )
);
$mail -> setBodyText ( $mailtp -> getBody ());
$mail -> setFrom ( $this -> view -> config -> service -> email , $this -> view -> config -> service -> poster );
$mail -> setSubject ( $mailtp -> getSubject ());
$mail -> addTo ( $email );
@ $mail -> send ();
echo box :: success ( '请查看已经发送至您邮箱中的激活链接' );
exit ();
} // function fetchpwdAction()
function getpasswdAction (){
$ac = $this -> _getParam ( 'ac' );
$activation = $this -> _getParam ( 'a' );
$uid = $this -> _getParam ( 'u' );
if ( empty ( $ac ))
{
$this -> view -> resetid = $activation ;
$this -> view -> uid = $uid ;
}
//echo $ac.$activation.$uid;exit();
if ( $ac == 'set' && ! empty ( $activation ) && ! empty ( $uid ))
{
$this -> _helper -> layout -> disableLayout ();
$this -> _helper -> viewRenderer -> setNoRender ();
$sql = " SELECT * FROM users WHERE activation=? AND username=? " ;
$sth = $this -> db -> prepare ( $sql );
$sth -> execute ( array ( $activation , $uid ));
$row = $sth -> fetch ();
if ( empty ( $row [ 'id' ]))
{
echo box :: warning ( " 操作失败,您的访问中出现问题 " );
exit ();
}
else
{
$password_new = trim ( $this -> _request -> getParam ( 'password_new' ));
$password_confirm = trim ( $this -> _request -> getParam ( 'password_confirm' ));
include_once ( " ajax/box.php " );
$match = " /[ \" |'| \\ \ ]/i " ;
if ( empty ( $password_new ))
{
echo box :: warning ( " 请输入新密码 " );
exit ();
}
if ( empty ( $password_confirm ))
{
echo box :: warning ( " 请再次输入新密码 " );
exit ();
}
if ( preg_match ( $match , $password_new ) || preg_match ( $match , $password_confirm ))
{
echo box :: warning ( " 您输入的内容中包含非法字符 " );
exit ();
}
if ( strlen ( $password_new ) < 6 )
{
echo box :: warning ( " 新密码太短 " );
exit ();
}
if ( strlen ( $password_new ) > 20 )
{
echo box :: warning ( " 新密码太长 " );
exit ();
}
if ( md5 ( $password_new ) !== md5 ( $password_confirm ))
{
echo box :: warning ( " 您两次输入的新密码不同 " );
exit ();
}
try {
$sql = " UPDATE users SET password=' " . md5 ( $password_new ) . " ' WHERE username=' $uid ' AND activation=' $activation ' " ;
if ( $this -> db -> query ( $sql ))
{
$sql = " UPDATE users SET activation='' WHERE username=' $uid ' AND activation=' $activation ' " ;
$this -> db -> query ( $sql );
echo box :: success ( " 修改成功 " );
exit ();
} else {
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
} catch ( Exception $e ){
echo box :: error ( " 修改失败,请重试 " );
exit ();
}
}
}
}
}