<?php
class UserController extends Zend_Controller_Action {
private $db;
public function init() {
$this->db = Zend_Db_Table::getDefaultAdapter();
}
public function postDispatch()
{
$this->view->messages = $this->_helper->flashMessenger->getMessages();
$this->_helper->flashMessenger->clearMessages();
}
public function indexAction()
{
if (!Zend_Auth::getInstance()->hasIdentity()) {
$this->_redirect('/');
}
if($this->_request->isPost()) {
// Init Form
$form = new Zend_Form;
$vfsize = new Zend_Validate_File_FilesSize(5 * 1024 *1024); // 5Mb
$vfsize->setMessage('Выберите файл меньше 5 мб');
$mimetype = array(
'image/png',
'image/gif',
'image/jpeg',
);
$vType = new Zend_Validate_File_IsImage($mimetype);
$vType->setMessage('Только jpeg, gif and png можно загружать');
$file = new Zend_Form_Element_File('file');
$file
-> addValidator($vfsize)
-> setRequired(true)
-> setDestination('userfiles/avatars/tmp/')
;
$form->addElement($file);
$values = $form->getValues();
try {
// uploading here!
if(!$form->isValid($values)) {
throw new Exception(print_r($form->getValues(), true));
}
$form_fname = $file->getName();
$file_info = $file->getTransferAdapter()->getFileInfo($form_fname);
$file_name = $file_info[$form_fname]['name'];
$time_factor = mktime();
$new_fname = $time_factor . '.jpg';
$new_file_full = FS_PATH . '/userfiles/avatars/' . $new_fname;
$new_file_full_24 = FS_PATH . '/userfiles/avatars/24_' . $new_fname;
rename(FS_PATH . '/userfiles/avatars/tmp/' . $file_name, $new_file_full);
$image = new Images($new_file_full);
$image->ResizeWcopy($new_file_full_24, 24, 24);
$image->resize(100, 100);
$usersModel = new Users;
$usersModel->update(array('avatar' => $time_factor), 'uid = ' . Zend_Auth::getInstance()->getIdentity()->uid);
Zend_Auth::getInstance()->getIdentity()->avatar = $time_factor;
}catch (Exception $e) {
$this->_helper->FlashMessenger->addMessage(array('error' => $e->getMessage()));
}
$this->_redirect('/user');
}
}
public function joinAction()
{
if ($this->_request->isPost()) {
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout->disableLayout();
$error = null;
try {
$form = new RegisterForm;
$post = $this->_request->getPost();
if (!$post['email'] || !$post['login'] || !$post['pwd']) {
throw new Exception('Заполните все поля');
}
if (!$form->isValidPartial($post)) {
$messages = $form->getMessages();
$message_str = '';
foreach ($messages as $element_name => $descr) {
if (is_array($descr)) {
foreach ($descr as $code => $err_descr) {
$message_str .= $form->$element_name->getLabel() . ": $err_descr<br/>";
}
}
}
$this->_response->appendBody(Zend_Json_Encoder::encode(array('error' => $message_str)));
return;
}
$values = $form->getValues();
$prepared = array();
$prepared['permiss'] = 1;
$prepared['ulogin'] = $values['login'];
$prepared['upassword'] = sha1($values['pwd']);
$prepared['email'] = $values['email'];
$prepared['adddate'] = new Zend_Db_Expr('CURDATE()');
$users = new Users;
$userID = $users->insert($prepared);
$activityModel = new Activity;
$activityModel->add("JOIN: {$prepared['ulogin']} from {$prepared['email']}", null, $userID);
}catch (Exception $e) {
$error = $e->getMessage();
}catch (Zend_Db_Exception $e) {
$error = $e->getMessage();
}
if ($error) {
$this->_response->appendBody(Zend_Json_Encoder::encode(array('error' => $error)));
return;
}
$this->_request->setParam('email', $values['email']);
$this->_request->setParam('pwd', $values['pwd']);
$this->_forward('login', 'User');
}
}
public function loginAction()
{
if ($this->_request->isPost()) {
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout->disableLayout();
$email = $this->_request->getParam('email');
$password = $this->_request->getParam('pwd');
$storeSession = $this->_request->getParam('storeSession', false);
if ($storeSession) {
Zend_Session::rememberMe(864000);
}
try {
if (empty($email) || empty($password)) {
throw new Exception('Заполните поля');
}
$filter = new Zend_Filter_StringTrim();
$email = $filter->filter($email);
$password = $filter->filter($password);
$authAdapter = new Zend_Auth_Adapter_DbTable($this->db);
$authAdapter->setTableName(DB_PREFIX . 'users')
->setIdentityColumn('email')
->setCredentialColumn('upassword');
$authAdapter->setIdentity($email)
->setCredential(SHA1($password));
// Perform the authentication query, saving the result
$result = $authAdapter->authenticate();
$user_info = $authAdapter->getResultRowObject();
$code = $result->getCode();
switch ($code) {
default:
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
throw new Exception('Неверный емайл');
break;
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
throw new Exception('Неверный пароль');
break;
case Zend_Auth_Result::SUCCESS:
Zend_Auth::getInstance()->getStorage()->write($authAdapter->getResultRowObject(null, array('upassword', 'confirm_code')));
// Uppdate last Login
$usersModel = new Users;
$usersModel->update(array('lastlogin' => new Zend_Db_Expr('NOW()')), 'uid = ' . $user_info->uid);
$usersModel->IncUserLogins($user_info->uid);
break;
}
}catch (Exception $e) {
$this->getResponse()->appendBody(Zend_Json_Encoder::encode(array('error' => $e->getMessage())));
return;
}
if ($storeSession) {
Zend_Session::rememberMe(864000);
}
$this->getResponse()->appendBody(Zend_Json_Encoder::encode(array('done' => Zend_Auth::getInstance()->getIdentity()->ulogin)));
}
}
public function logoutAction()
{
$this->_helper->viewRenderer->setNoRender();
Zend_Auth::getInstance()->clearIdentity();
$this->_redirect('/');
}
public function forgotAction()
{
if ($this->_request->isPost()) {
$this->_helper->viewRenderer->setNoRender();
$this->_helper->layout->disableLayout();
$error = null;
try {
$form = new RecoverForm;
$post = $this->_request->getPost();
if (!$post['email']) {
throw new Exception('Введите емайл');
}
if (!$form->isValidPartial($post)) {
$messages = $form->getMessages();
$message_str = '';
foreach ($messages as $element_name => $descr) {
if (is_array($descr)) {
foreach ($descr as $code => $err_descr) {
$message_str .= $err_descr . "\r\n";
}
}
}
$this->_response->appendBody(Zend_Json_Encoder::encode(array('error' => $message_str)));
return;
}
$values = $form->getValues();
$new_password = self::GeneratePassword(6);
$users = new Users;
$result = $users->update(array('upassword' => new Zend_Db_Expr("SHA1('$new_password')")),
'email = ' . $this->db->quote($values['email']));
$activityModel = new Activity;
$activityModel->add("Recovered password for from: {$values['email']}");
// Send mail
$config = Zend_Registry::get('config');
$mail = new Zend_Mail('utf-8');
$mail->addTo($values['email']);
$mail->setSubject($config->emails->recover->subject);
$mail->setFrom($config->forms->site->email_from, $config->forms->site->email_email);
$body_plain = array();
$body_plain[] = 'Доброго времени суток.';
$body_plain[] = 'Вы запросили пароль с сайта: ' . $config->general->site->path;
$body_plain[] = 'Ваш новый пароль: ' . $new_password;
$mail->setBodyText(implode("\r\n", $body_plain));
$return = $mail->send();
$this->_response->appendBody(Zend_Json_Encoder::encode(array('done' => $result)));
}catch (Exception $e) {
$error = $e->getMessage();
}catch (Zend_Db_Exception $e) {
$error = $e->getMessage();
}
if ($error) {
$this->_response->appendBody(Zend_Json_Encoder::encode(array('error' => $error)));
return;
}
}
}
/**
* Generate Random Password
*
* @param integer $length - Password length
* @return string - password
*/
static function GeneratePassword($length = 7) {
srand((double)microtime()*1000000);
$vowels = array('a', 'e', 'i', 'o', 'u', '0', '3', '4');
$cons = array('b', 'c', 'd', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'u', 'v', 'w', 'tr', 'cr', 'br', 'fr', 'th', 'dr', 'ch', 'ph', 'wr', 'st', 'sp', 'sw', 'pr', 'sl', 'cl');
$password = 0;
$num_vowels = count($vowels);
$num_cons = count($cons);
for($i = 0; $i < (int)$length; $i++){
$password .= $cons[rand(0, $num_cons - 1)] . $vowels[rand(0, $num_vowels - 1)];
}
return substr($password, 0, (int)$length);
}
}