Файл: base-sys/base/bol/user_service.php
Строк: 1790
<?php
final class BOL_UserService
{
const CREATE_USER_INVALID_USERNAME = -1;
const CREATE_USER_INVALID_EMAIL = -2;
const CREATE_USER_INVALID_PASSWORD = -3;
const CREATE_USER_DUPLICATE_USERNAME = -4;
const CREATE_USER_DUPLICATE_EMAIL = -5;
const PERMISSIONS_ANYONE_CAN_JOIN = 1;
const PERMISSIONS_JOIN_BY_INVITATIONS = 2;
const PERMISSIONS_MEMBERS_CAN_INVITE = 1;
const PERMISSIONS_ADMIN_CAN_INVITE = 2;
const PERMISSIONS_GUESTS_CAN_VIEW = 1;
const PERMISSIONS_GUESTS_CANT_VIEW = 2;
const PERMISSIONS_GUESTS_PASSWORD_VIEW = 3;
const CONFIG_JOIN_DISPLAY_PHOTO_UPLOAD = 'display';
const CONFIG_JOIN_DISPLAY_AND_SET_REQUIRED_PHOTO_UPLOAD = 'display_and_required';
const CONFIG_JOIN_NOT_DISPLAY_PHOTO_UPLOAD = 'not_display';
const USER_CONTEXT_DESKTOP = BOL_UserOnlineDao::CONTEXT_VAL_DESKTOP;
const USER_CONTEXT_MOBILE = BOL_UserOnlineDao::CONTEXT_VAL_MOBILE;
const USER_CONTEXT_API = BOL_UserOnlineDao::CONTEXT_VAL_API;
const PASSWORD_RESET_CODE_EXPIRATION_TIME = 3600;
const PASSWORD_RESET_CODE_UPDATE_TIME = 600;
/**
* @var BOL_UserDao
*/
private $userDao;
/**
* @var BOL_LoginCookieDao
*/
private $loginCookieDao;
/**
*
* @var BOL_UserFeaturedDao
*/
private $userFeaturedDao;
/**
* @var BOL_UserOnlineDao
*/
private $userOnlineDao;
/**
* @var BOL_UserSuspendDao
*/
private $userSuspendDao;
/**
* @var BOL_UserApproveDao
*/
private $userApproveDao;
/**
* @var BOL_RestrictedUsernamesDao
*/
private $restrictedUsernamesDao;
/**
* @var BOL_InviteCodeDao
*/
private $inviteCodeDao;
/**
* @var BOL_UserApproveDao
*/
private $approveDao;
/**
* @var BOL_UserResetPasswordDao
*/
private $resetPasswordDao;
/**
* @var BOL_UserBlockDao
*/
private $userBlockDao;
/**
* @var BOL_AuthTokenDao
*/
private $tokenDao;
/**
* @var BOL_UserService
*/
private static $classInstance;
/**
* Returns an instance of class (singleton pattern implementation).
*
* @return BOL_UserService
*/
public static function getInstance()
{
if ( self::$classInstance === null )
{
self::$classInstance = new self();
}
return self::$classInstance;
}
/**
* Constructor.
*/
private function __construct()
{
$this->userDao = BOL_UserDao::getInstance();
$this->loginCookieDao = BOL_LoginCookieDao::getInstance();
$this->userFeaturedDao = BOL_UserFeaturedDao::getInstance();
$this->userOnlineDao = BOL_UserOnlineDao::getInstance();
$this->userSuspendDao = BOL_UserSuspendDao::getInstance();
$this->userApproveDao = BOL_UserApproveDao::getInstance();
$this->restrictedUsernamesDao = BOL_RestrictedUsernamesDao::getInstance();
$this->inviteCodeDao = BOL_InviteCodeDao::getInstance();
$this->approveDao = BOL_UserApproveDao::getInstance();
$this->resetPasswordDao = BOL_UserResetPasswordDao::getInstance();
$this->userBlockDao = BOL_UserBlockDao::getInstance();
$this->tokenDao = BOL_AuthTokenDao::getInstance();
}
/**
* @param string $var
* @param string $password
* @return BOL_User
*/
public function findUserForStandardAuth( $var )
{
return $this->userDao->findUserByUsernameOrEmail($var);
}
/**
* Finds user by id.
*
* @param integer $id
* @return BOL_User
*/
public function findUserById( $id )
{
return $this->userDao->findById((int) $id);
}
/**
* Finds user by id.
*
* @param integer $id
* @return BOL_User
*/
public function findByIdWithoutCache( $id )
{
return $this->userDao->findByIdWithoutCache((int) $id);
}
/**
* Returns display name for provided user id.
*
* @param integer $userId
* @return string
*/
public function getDisplayName( $userId )
{
$questionName = PEEP::getConfig()->getValue('base', 'display_name_question');
$questionValue = BOL_QuestionService::getInstance()->getQuestionData(array($userId), array($questionName));
$displayName = isset($questionValue[$userId]) ? ( isset($questionValue[$userId][$questionName]) ? $questionValue[$userId][$questionName] : '' ) : PEEP::getLanguage()->text('base', 'deleted_user');
return strip_tags($displayName);
}
/**
* Returns display names for provided list of user ids.
*
* @param array $userIdList
* @return array
*/
public function getDisplayNamesForList( array $userIdList )
{
$userIdList = array_unique($userIdList);
$questionName = PEEP::getConfig()->getValue('base', 'display_name_question');
$questionValues = BOL_QuestionService::getInstance()->getQuestionData($userIdList, array($questionName));
$resultArray = array();
foreach ( $userIdList as $value )
{
$resultArray[$value] = PEEP::getLanguage()->text('base', 'deleted_user');
if ( isset($questionValues[$value]) )
{
$resultArray[$value] = isset($questionValues[$value][$questionName]) ? htmlspecialchars($questionValues[$value][$questionName]) : '';
}
}
return $resultArray;
}
public function getUserName( $userId )
{
$user = $this->findUserById($userId);
return ( $user === null ? null : $user->getUsername() );
}
public function getUserNamesForList( array $userIdList )
{
$userIdList = array_unique($userIdList);
$userList = $this->userDao->findByIdList($userIdList);
$resultArray = array();
/* @var $user BOL_User */
foreach ( $userList as $user )
{
$resultArray[$user->getId()] = $user->getUsername();
}
$returnArray = array();
foreach ( $userIdList as $id )
{
$returnArray[$id] = isset($resultArray[$id]) ? $resultArray[$id] : null; //todo check and replace with lang value
}
return $returnArray;
}
public function getUserUrl( $id )
{
$user = $this->findUserById($id);
return $this->getUserUrlForUsername(($user === null ? 'deleted-user' : $user->getUsername()));
}
public function getUserUrlForUsername( $username )
{
if ( empty($username) )
{
$username = 'deleted-user';
}
return PEEP::getRouter()->urlForRoute('base_user_profile', array('username' => $username));
}
public function getUserUrlsForList( array $userIdList )
{
$userIdList = array_unique($userIdList);
$userList = $this->userDao->findByIdList($userIdList);
$resultArray = array();
/* @var $user BOL_User */
foreach ( $userList as $user )
{
$resultArray[$user->getId()] = $this->getUserUrlForUsername($user->getUsername());
}
$returnArray = array();
foreach ( $userIdList as $id )
{
$returnArray[$id] = isset($resultArray[$id]) ? $resultArray[$id] : $this->getUserUrlForUsername('deleted-user');
}
return $returnArray;
}
public function getUserUrlsListForUsernames( array $usernamesList )
{
$usernamesList = array_unique($usernamesList);
$returnArray = array();
foreach ( $usernamesList as $key => $value )
{
$returnArray[$key] = $this->getUserUrlForUsername($value);
}
return $returnArray;
}
public function findByUsername( $username )
{
return $this->userDao->findByUsername($username);
}
public function findRestrictedUsername( $username )
{
return $this->restrictedUsernamesDao->findRestrictedUsername($username);
}
/**
*
* @param string $email
* @return BOL_User
*/
public function findByEmail( $email )
{
return $this->userDao->findByUseEmail($email);
}
/**
* Creates and saves login cookie.
*
* @param integer $userId
* @return BOL_LoginCookie
*/
public function saveLoginCookie( $userId )
{
$loginCookie = $this->loginCookieDao->findByUserId($userId);
if ( $loginCookie === null )
{
$loginCookie = new BOL_LoginCookie();
}
$loginCookie->setUserId($userId);
$loginCookie->setCookie(hash_hmac('md5', time(), $userId));
$this->loginCookieDao->save($loginCookie);
return $loginCookie;
}
public function findUserIdByCookie( $cookie )
{
$obj = $this->loginCookieDao->findByCookie($cookie);
return ( $obj === null ? null : $obj->getUserId() );
}
/**
*
* @param integer $userId
* @return BOL_LoginCookie
*/
public function findLoginCookieByUserId( $userId )
{
return $this->loginCookieDao->findByUserId($userId);
}
public function findList( $first, $count, $isAdmin = false )
{
return $this->userDao->findList($first, $count, $isAdmin);
}
public function findRecentlyActiveList( $first, $count, $isAdmin = false )
{
return $this->userDao->findRecentlyActiveList($first, $count, $isAdmin);
}
public function getRecentlyActiveOrderedIdList( $userIdList )
{
return $this->userDao->getRecentlyActiveOrderedIdList($userIdList);
}
public function findOnlineList( $first, $count )
{
$onlineList = $this->userDao->findOnlineList($first, $count);
$list = array();
$userIdList = array();
foreach ( $onlineList as $id => $user )
{
$userIdList[] = $user->id;
}
// Check privacy permissions
$eventParams = array(
'action' => 'base_view_my_presence_on_site',
'ownerIdList' => $userIdList,
'viewerId' => PEEP::getUser()->getId()
);
$permission = PEEP::getEventManager()->getInstance()->call('privacy_check_permission_for_user_list', $eventParams);
foreach ( $onlineList as $user )
{
$show = true;
if ( isset($permission[$user->id]['blocked']) && $permission[$user->id]['blocked'] == true )
{
$show = false;
continue;
}
if ( $show )
{
$list[] = $user;
}
}
return $list;
}
public function findOnlineUserById( $userId )
{
// Check privacy permissions
$eventParams = array(
'action' => 'base_view_my_presence_on_site',
'ownerId' => $userId,
'viewerId' => PEEP::getUser()->getId()
);
try
{
PEEP::getEventManager()->getInstance()->call('privacy_check_permission', $eventParams);
}
catch ( RedirectException $e )
{
return null;
}
return $this->userOnlineDao->findByUserId($userId);
}
public function countOnline()
{
return (int) $this->userDao->countOnline();
}
public function count( $isAdmin = false )
{
return (int) $this->userDao->count($isAdmin);
}
public function findSuspendedList( $first, $count )
{
return $this->userDao->findSuspendedList($first, $count);
}
public function countSuspended()
{
return $this->userDao->countSuspended();
}
public function findUnverifiedList( $first, $count )
{
return $this->userDao->findUnverifiedList($first, $count);
}
public function countUnverified()
{
return $this->userDao->countUnverified();
}
public function findUnapprovedList( $first, $count )
{
return $this->userDao->findUnapprovedList($first, $count);
}
public function countUnapproved()
{
return $this->userDao->countUnapproved();
}
public function saveOrUpdate( BOL_User $user )
{
$event = new PEEP_Event('base.before_save_user', array('dto' => $user));
PEEP::getEventManager()->trigger($event);
$this->userDao->save($user);
if ( !empty($this->cachedUsers[$user->getId()]) )
{
unset($this->cachedUsers[$user->getId()]);
}
}
public function isExistUserName( $value )
{
if ( $value === null )
{
return false;
}
$user = $this->findByUsername(trim($value));
if ( isset($user) )
{
return true;
}
return false;
}
public function isRestrictedUsername( $value )
{
if ( $value === null )
{
return false;
}
$user = $this->findRestrictedUsername(trim($value));
if ( isset($user) )
{
return true;
}
return false;
}
public function isExistEmail( $value )
{
if ( $value === null )
{
return false;
}
$email = $this->findByEmail(trim($value));
if ( isset($email) )
{
return true;
}
return false;
}
public function isValidPassword( $userId, $value )
{
$user = $this->findUserById($userId);
if ( $value === null || $user === null )
{
return false;
}
$password = $this->hashPassword($value);
if ( $user->password === $password )
{
return true;
}
return false;
}
public function markAsFeatured( $userId )
{
$dto = new BOL_UserFeatured();
$dto->setUserId($userId);
$result = $this->userFeaturedDao->save($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_MARK_FEATURED, array('userId' => $userId));
PEEP::getEventManager()->trigger($event);
return $result;
}
public function cancelFeatured( $userId )
{
$this->userFeaturedDao->deleteByUserId($userId);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_UNMARK_FEATURED, array('userId' => $userId));
PEEP::getEventManager()->trigger($event);
}
public function isUserFeatured( $id )
{
$dto = $this->userFeaturedDao->findByUserId($id);
return !empty($dto);
}
public function isBlocked( $id, $byUserId = null )
{
if ( $byUserId === null )
{
$byUserId = PEEP::getUser()->getId();
}
$dto = $this->userBlockDao->findBlockedUser($byUserId, $id);
return !empty($dto);
}
public function findBlockedListByUserIdList( $userId, array $userIdList )
{
if ( !$userId )
{
return null;
}
$list = $this->userBlockDao->findBlockedList($userId, $userIdList);
$users = array();
if ( $list )
{
foreach ( $list as $user )
{
$users[$user->blockedUserId] = $user;
}
}
$blockList = array();
foreach ( $userIdList as $blockedUserId )
{
$blockList[$blockedUserId] = array_key_exists($blockedUserId, $users);
}
return $blockList;
}
public function findFeaturedList( $first, $count )
{
return $this->userDao->findFeaturedList($first, $count);
}
public function countFeatured()
{
return $this->userDao->countFeatured();
}
public function onLogin( $userId, $context )
{
$this->updateActivityStamp($userId, $context);
}
public function onLogout( $userId )
{
if ( (int) $userId < 1 )
{
return;
}
$user = $this->userDao->findById($userId);
$userOnline = $this->userOnlineDao->findByUserId($userId);
if ( $user === null || $userOnline === null )
{
return;
}
$user->setActivityStamp($userOnline->getActivityStamp());
$this->userDao->save($user);
$this->userOnlineDao->deleteById($userOnline->getId());
}
public function updateActivityStamp( $userId, $context )
{
if ( !$userId )
{
return;
}
$user = $this->userDao->findById((int) $userId);
if ( $user === null )
{
return;
}
$activityStamp = time();
$userOnline = $this->userOnlineDao->findByUserId($userId);
if ( $userOnline === null )
{
$userOnline = new BOL_UserOnline();
$userOnline->setUserId($userId);
}
$userOnline->setActivityStamp($activityStamp);
$userOnline->setContext($context);
$this->userOnlineDao->saveDelayed($userOnline);
/* @var $user BOL_User */
$user->setActivityStamp($activityStamp);
$this->userDao->saveDelayed($user);
}
public function findUserListByIdList( array $idList )
{
$idList = array_unique($idList);
return $this->userDao->findByIdList($idList);
}
public function findUserIdListByIdList( array $idList )
{
$idList = array_unique($idList);
return $this->userDao->findIdListByIdList($idList);
}
public function findOnlineStatusForUserList( $idList )
{
$onlineUsers = $this->userOnlineDao->findOnlineUserIdListFromIdList($idList);
$onlineUsersArr = array();
foreach ( $onlineUsers as $item )
{
$onlineUsersArr[$item['userId']] = $item['context'];
}
$resultArray = array();
foreach ( $idList as $userId )
{
$resultArray[$userId] = array_key_exists($userId, $onlineUsersArr) ? $onlineUsersArr[$userId] : false;
}
return $resultArray;
}
public function deleteUser( $userId, $deleteContent = true )
{
$event = new PEEP_Event(PEEP_EventManager::ON_USER_UNREGISTER, array('userId' => $userId, 'deleteContent' => $deleteContent));
PEEP::getEventManager()->trigger($event);
BOL_QuestionService::getInstance()->deleteQuestionDataByUserId((int) $userId);
BOL_AvatarService::getInstance()->deleteUserAvatar($userId);
$this->userSuspendDao->deleteById($userId);
$this->userBlockDao->deleteByUserId($userId);
$this->userDao->deleteById($userId);
return true;
}
public function addRestrictedUsername( $username )
{
$this->restrictedUsernamesDao->addRestrictedUsername($username);
}
public function getRestrictedUsername( $username )
{
return $this->restrictedUsernamesDao->getRestrictedUsername($username);
}
public function getRestrictedUsernameList()
{
return $this->restrictedUsernamesDao->getRestrictedUsernameList();
}
public function replaceAccountTypeForUsers( $oldType, $newType )
{
$this->userDao->replaceAccountTypeForUsers($oldType, $newType);
}
public function findMassMailingUsers( $start, $count, $ignoreUnsubscribe = false, $roles = array() )
{
return $this->userDao->findMassMailingUsers($start, $count, $ignoreUnsubscribe, $roles);
}
public function findMassMailingUserCount( $ignoreUnsubscribe = false, $roles = array() )
{
return $this->userDao->findMassMailingUserCount($ignoreUnsubscribe, $roles);
}
public function updateEmail( $userId, $email )
{
if ( UTIL_Validator::isEmailValid($email) )
{
$this->userDao->updateEmail((int) $userId, $email);
}
else
{
throw new InvalidArgumentException('Invalid email!');
}
}
public function updatePassword( $userId, $password )
{
if ( !empty($password) )
{
$this->userDao->updatePassword((int) $userId, $this->hashPassword($password));
}
else
{
throw new InvalidArgumentException('Invalid password!');
}
}
public function suspend( $userId, $message )
{
if ( $this->isSuspended($userId) )
{
return;
}
$dto = new BOL_UserSuspend();
$dto->setUserId($userId)
->setTimestamp(time())->setMessage($message);
$this->userSuspendDao->save($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_SUSPEND, array('userId' => $userId, 'message' => $message));
PEEP::getEventManager()->trigger($event);
}
public function unsuspend( $userId )
{
if ( !$this->isSuspended($userId) )
{
return;
}
$dto = $this->userSuspendDao->findByUserId($userId);
$this->userSuspendDao->delete($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_UNSUSPEND, array('userId' => $userId));
PEEP::getEventManager()->trigger($event);
}
public function block( $userId )
{
if ( $this->isBlocked($userId) )
{
return;
}
$dto = new BOL_UserBlock();
$dto->setUserId(PEEP::getUser()->getId());
$dto->setBlockedUserId($userId);
$this->userBlockDao->save($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_BLOCK, array('userId' => PEEP::getUser()->getId(), 'blockedUserId' => $userId));
PEEP::getEventManager()->trigger($event);
}
public function unblock( $userId )
{
if ( !$this->isBlocked($userId) )
{
return;
}
$dto = $this->userBlockDao->findBlockedUser(PEEP::getUser()->getId(), $userId);
$this->userBlockDao->delete($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_UNBLOCK, array('userId' => PEEP::getUser()->getId(), 'blockedUserId' => $userId));
PEEP::getEventManager()->trigger($event);
}
public function isSuspended( $userId )
{
return $this->userSuspendDao->findByUserId($userId) !== null;
}
public function hashPassword( $password )
{
return hash('sha256', PEEP_PASSWORD_SALT . $password);
}
public function findListByRoleId( $roleId, $first, $count )
{
return $this->userDao->findListByRoleId($roleId, $first, $count);
}
public function countByRoleId( $roleId )
{
return $this->userDao->countByRoleId($roleId);
}
public function deleteExpiredOnlineUsers()
{
$timestamp = PEEP::getConfig()->configExists('base', 'user_expired_time') ? time() - PEEP::getConfig()->getValue('base', 'user_expired_time') * 60 : time() - 30 * 60;
$this->userOnlineDao->deleteExpired($timestamp);
}
public function findListByEmailList( $emailList )
{
return $this->userDao->findListByEmailList($emailList);
}
public function createUser( $username, $password, $email, $accountType = null, $emailVerify = false )
{
if ( !UTIL_Validator::isEmailValid($email) )
{
throw new InvalidArgumentException('Invalid email!', self::CREATE_USER_INVALID_EMAIL);
}
if ( !UTIL_Validator::isUserNameValid($username) )
{
throw new InvalidArgumentException('Invalid username!', self::CREATE_USER_INVALID_USERNAME);
}
if ( !isset($password) || strlen($password) === 0 )
{
throw new InvalidArgumentException('Invalid password!', self::CREATE_USER_INVALID_PASSWORD);
}
if ( $this->isExistUserName($username) )
{
throw new LogicException('Duplicate username!', self::CREATE_USER_DUPLICATE_USERNAME);
}
if ( $this->isExistEmail($email) )
{
throw new LogicException('Duplicate email!', self::CREATE_USER_DUPLICATE_EMAIL);
}
$userAccountType = $accountType;
if ( $userAccountType === null )
{
$userAccountType = '';
$accountTypes = BOL_QuestionService::getInstance()->findAllAccountTypes();
if ( count($accountTypes) === 1 )
{
$userAccountType = $accountTypes[0]->name;
}
}
$user = new BOL_User();
$user->username = trim($username);
$user->password = BOL_UserService::getInstance()->hashPassword($password);
$user->email = trim($email);
$user->joinStamp = time();
$user->activityStamp = time();
$user->accountType = $userAccountType;
$user->joinIp = ip2long(PEEP::getRequest()->getRemoteAddress());
if ( $emailVerify === true )
{
$user->emailVerify = true;
}
$this->saveOrUpdate($user);
BOL_AuthorizationService::getInstance()->assignDefaultRoleToUser($user->id);
return $user;
}
/**
*
* @param string $code
* @return BOL_InviteCode
*/
public function findInvitationInfo( $code )
{
return $this->inviteCodeDao->findByCode($code);
}
public function deleteInvitationCode( $code )
{
return $this->inviteCodeDao->deleteByCode($code);
}
public function sendAdminInvitation( $email )
{
$inviteCodeDto = new BOL_InviteCode();
$inviteCodeDto->setCode(UTIL_String::getRandomString(20));
$inviteCodeDto->setUserId(0);
$inviteCodeDto->setExpiration_stamp(time() + 3600 * 24 * 30);
$this->inviteCodeDao->save($inviteCodeDto);
$inviteUrl = PEEP::getRequest()->buildUrlQueryString(PEEP::getRouter()->urlForRoute('base_join'), array('code' => $inviteCodeDto->getCode()));
$mail = PEEP::getMailer()->createMail();
$mail->addRecipientEmail($email);
$mail->setSubject(PEEP::getLanguage()->text('base', 'mail_template_admin_invite_user_subject'));
$mail->setHtmlContent(PEEP::getLanguage()->text('base', 'mail_template_admin_invite_user_content_html', array('url' => $inviteUrl)));
$mail->setTextContent(PEEP::getLanguage()->text('base', 'mail_template_admin_invite_user_content_text', array('url' => $inviteUrl)));
PEEP::getMailer()->addToQueue($mail);
}
public function saveUserInvitation( $userId, $code )
{
$dto = new BOL_InviteCode();
$dto->setCode($code);
$dto->setUserId($userId);
$dto->setExpiration_stamp(time() + 3600 * 24 * 30);
$this->inviteCodeDao->save($dto);
}
/**
*
* @param int $userId
*/
public function disapprove( $userId )
{
if ( empty($userId) )
{
throw new InvalidArgumentException('invalid $userId param');
}
$dto = $this->approveDao->findByUserId($userId);
if ( !empty($dto) )
{
return;
}
$dto = new BOL_UserDisapprove();
$dto->setUserId($userId);
$this->approveDao->save($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_DISAPPROVE, array('userId' => $userId));
PEEP::getEventManager()->trigger($event);
}
/**
*
* @param int $userId
*/
public function approve( $userId )
{
if ( empty($userId) )
{
throw new InvalidArgumentException('invalid $userId param');
}
$dto = $this->approveDao->findByUserId($userId);
if ( empty($dto) )
{
throw new Exception('User already approved');
}
$this->approveDao->delete($dto);
$event = new PEEP_Event(PEEP_EventManager::ON_USER_APPROVE, array('userId' => $userId));
PEEP::getEventManager()->trigger($event);
}
public function sendApprovalNotification( $userId )
{
if ( !$userId )
{
return false;
}
$user = $this->findUserById($userId);
if ( !$user )
{
return false;
}
$language = PEEP::getLanguage();
$mail = PEEP::getMailer()->createMail();
$vars = array('user_name' => $this->getDisplayName($userId));
$mail->addRecipientEmail($user->getEmail());
$mail->setSubject($language->text('base', 'user_approved_mail_subject', $vars));
$mail->setTextContent($language->text('base', 'user_approved_mail_txt', $vars));
$mail->setHtmlContent($language->text('base', 'user_approved_mail_html', $vars));
PEEP::getMailer()->send($mail);
return true;
}
public function isApproved( $userId = null )
{
if ( $userId == null )
{
$userId = PEEP::getUser()->getId();
}
return null === $this->approveDao->findByUserId($userId);
}
public function findDisapprovedList( $first, $count )
{
return $this->userDao->findDisapprovedList($first, $count);
}
public function countDisapproved()
{
return $this->userDao->countDisapproved();
}
public function deleteDisaproveByUserId( $userId )
{
if ( empty($userId) )
{
return;
}
$this->approveDao->deleteByUserId($userId);
}
public function findSupsendStatusForUserList( $idList )
{
$onlineUsers = $this->userSuspendDao->findSupsendStatusForUserList($idList);
$resultArray = array();
foreach ( $idList as $userId )
{
$resultArray[$userId] = in_array($userId, $onlineUsers) ? true : false;
}
return $resultArray;
}
/**
*
* @param int $userId
* return array<BOL_User>
*
*/
public function findUserListByQuestionValues( $questionValues, $first, $count, $isAdmin = false )
{
return $this->userDao->findUserListByQuestionValues($questionValues, $first, $count, $isAdmin);
}
public function countUsersByQuestionValues( $questionValues, $isAdmin = false )
{
return $this->userDao->countUsersByQuestionValues($questionValues, $isAdmin);
}
public function findUnverifiedStatusForUserList( $idList )
{
$unverifiedUsers = $this->userDao->findUnverifyStatusForUserList($idList);
$resultArray = array();
foreach ( $idList as $userId )
{
$resultArray[$userId] = in_array($userId, $unverifiedUsers) ? true : false;
}
return $resultArray;
}
public function findUserIdListByQuestionValues( $questionValues, $first, $count, $isAdmin = false, $aditionalParams = array() )
{
$first = (int) $first;
$count = (int) $count;
$data = array(
'data' => $questionValues,
'first' => $first,
'count' => $count,
'isAdmin' => $isAdmin,
'aditionalParams' => $aditionalParams
);
$event = new PEEP_Event("base.question.before_user_search", $data, $data);
PEEP_EventManager::getInstance()->trigger($event);
$data = $event->getData();
return $this->userDao->findUserIdListByQuestionValues($data['data'], $data['first'], $data['count'], $data['isAdmin'], $data['aditionalParams']);
}
public function findSearchResultList( $listId, $first, $count )
{
return $this->userDao->findSearchResultList($listId, $first, $count);
}
public function findUnapprovedStatusForUserList( $idList )
{
$unapprovedUsers = $this->userApproveDao->findUnapproveStatusForUserList($idList);
$resultArray = array();
foreach ( $idList as $userId )
{
$resultArray[$userId] = in_array($userId, $unapprovedUsers) ? true : false;
}
return $resultArray;
}
/**
* @deprecated
*/
public function findListByBirthdayPeriod( $start, $end, $first, $count )
{
return array();
}
/**
* @deprecated
*/
public function countByBirthdayPeriod( $start, $end )
{
return 0;
}
/**
* @deprecated
*/
public function findListByBirthdayPeriodAndUserIdList( $start, $end, $first, $count, $idList )
{
return array();
}
/**
* @deprecated
*/
public function countByBirthdayPeriodAndUserIdList( $start, $end, $idList )
{
return 0;
}
/**
* @param integer $userId
* @return BOL_UserResetPassword
*/
public function findResetPasswordByUserId( $userId )
{
return $this->resetPasswordDao->findByUserId($userId);
}
/**
* @param integer $userId
* @return BOL_UserResetPassword
*/
public function getNewResetPassword( $userId )
{
$resetPassword = new BOL_UserResetPassword();
$resetPassword->setUserId($userId);
$resetPassword->setExpirationTimeStamp(( time() + self::PASSWORD_RESET_CODE_EXPIRATION_TIME));
$resetPassword->setUpdateTimeStamp(time() + self::PASSWORD_RESET_CODE_UPDATE_TIME);
$resetPassword->setCode(md5(UTIL_String::getRandomString(8, 5)));
$this->resetPasswordDao->save($resetPassword);
return $resetPassword;
}
/**
* @param string $code
* @return BOL_UserResetPassword
*/
public function findResetPasswordByCode( $code )
{
return $this->resetPasswordDao->findByCode($code);
}
public function deleteExpiredResetPasswordCodes()
{
$this->resetPasswordDao->deleteExpiredEntities();
}
public function deleteResetCode( $resetCodeId )
{
$this->resetPasswordDao->deleteById($resetCodeId);
}
public function sendWellcomeLetter( BOL_User $user )
{
if ( $user === null )
{
return;
}
if ( PEEP::getConfig()->getValue('base', 'confirm_email') && $user->emailVerify != true )
{
return;
}
$vars = array(
'username' => $this->getDisplayName($user->id),
);
$language = PEEP::getLanguage();
$subject = !($language->text('base', 'welcome_letter_subject', $vars)) ? 'base+welcome_letter_subject' : $language->text('base', 'welcome_letter_subject', $vars);
$template_html = !($language->text('base', 'welcome_letter_template_html', $vars)) ? 'base+welcome_letter_template_html' : $language->text('base', 'welcome_letter_template_html', $vars);
$template_text = !($language->text('base', 'welcome_letter_template_text', $vars)) ? 'base+welcome_letter_template_text' : $language->text('base', 'welcome_letter_template_text', $vars);
$mail = PEEP::getMailer()->createMail();
$mail->addRecipientEmail($user->email);
$mail->setSubject($subject);
$mail->setHtmlContent($template_html);
$mail->setTextContent($template_text);
try
{
PEEP::getMailer()->send($mail);
}
catch ( phpmailerException $e )
{
$user->emailVerify = false;
$this->saveOrUpdate($user);
}
BOL_PreferenceService::getInstance()->savePreferenceValue('send_wellcome_letter', 0, $user->id);
}
public function cronSendWellcomeLetter()
{
$preferenceValues = array('send_wellcome_letter' => 1);
$userIdList = $this->userDao->findUserIdListByPreferenceValues($preferenceValues);
if ( empty($userIdList) )
{
return;
}
$users = $this->findUserListByIdList($userIdList);
foreach ( $users as $user )
{
$this->sendWellcomeLetter($user);
}
}
/**
* @param string $formName
* @param string $submitDecorator
* @return Form
*/
public function getSignInForm( $formName = 'sign-in', $submitDecorator = 'button' )
{
$form = new Form($formName);
$username = new TextField('identity');
$username->setRequired(true);
$username->setHasInvitation(true);
$username->setInvitation(PEEP::getLanguage()->text('base', 'component_sign_in_login_invitation'));
$form->addElement($username);
$password = new PasswordField('password');
$password->setHasInvitation(true);
$password->setInvitation('password');
$password->setRequired(true);
$form->addElement($password);
$remeberMe = new CheckboxField('remember');
$remeberMe->setLabel(PEEP::getLanguage()->text('base', 'sign_in_remember_me_label'));
$remeberMe->setValue(true);
$form->addElement($remeberMe);
$submit = new Submit('submit', $submitDecorator);
$submit->setValue(PEEP::getLanguage()->text('base', 'sign_in_submit_label'));
$form->addElement($submit);
return $form;
}
/**
*
* @param string $identity
* @param string $password
* @param bool $rememberMe
* @return PEEP_AuthResult
*/
public function processSignIn( $identity, $password, $rememberMe = false )
{
if ( empty($identity) || empty($password) )
{
throw new LogicException("Invalid auth attrs");
}
$result = PEEP::getUser()->authenticate(new BASE_CLASS_StandardAuth($identity, $password));
if ( $result->isValid() )
{
if ( $rememberMe )
{
$loginCookie = $this->saveLoginCookie(PEEP::getUser()->getId());
setcookie('peep_login', $loginCookie->getCookie(), (time() + 86400 * 7), '/', null, null, true);
}
}
return $result;
}
public function getResetForm( $formName = 'forgot-password' )
{
$language = PEEP::getLanguage();
$form = new Form($formName);
$email = new TextField('email');
$email->setRequired(true);
$email->addValidator(new EmailValidator());
$email->setHasInvitation(true);
$email->setInvitation($language->text('base', 'forgot_password_email_invitation_message'));
$form->addElement($email);
$submit = new Submit('submit');
$submit->setValue($language->text('base', 'forgot_password_submit_label'));
$form->addElement($submit);
return $form;
}
public function processResetForm( $data )
{
$language = PEEP::getLanguage();
$email = trim($data['email']);
$user = $this->findByEmail($email);
if ( $user === null )
{
throw new LogicException($language->text('base', 'forgot_password_no_user_error_message'));
}
$resetPassword = $this->findResetPasswordByUserId($user->getId());
if ( $resetPassword !== null )
{
if ( $resetPassword->getUpdateTimeStamp() > time() )
{
throw new LogicException($language->text('base', 'forgot_password_request_exists_error_message'));
}
else
{
$resetPassword->setUpdateTimeStamp($resetPassword->getUpdateTimeStamp() + self::PASSWORD_RESET_CODE_UPDATE_TIME);
$this->resetPasswordDao->save($resetPassword);
}
}
else
{
$resetPassword = $this->getNewResetPassword($user->getId());
}
$vars = array('code' => $resetPassword->getCode(), 'username' => $user->getUsername(), 'requestUrl' => PEEP::getRouter()->urlForRoute('base.reset_user_password_request'),
'resetUrl' => PEEP::getRouter()->urlForRoute('base.reset_user_password', array('code' => $resetPassword->getCode())));
$mail = PEEP::getMailer()->createMail();
$mail->addRecipientEmail($email);
$mail->setSubject($language->text('base', 'reset_password_mail_template_subject'));
$mail->setTextContent($language->text('base', 'reset_password_mail_template_content_txt', $vars));
$mail->setHtmlContent($language->text('base', 'reset_password_mail_template_content_html', $vars));
PEEP::getMailer()->send($mail);
}
public function getResetPasswordRequestFrom( $formName = 'reset-password-request' )
{
$language = PEEP::getLanguage();
$form = new Form($formName);
$code = new TextField('code');
$code->setLabel($language->text('base', 'reset_password_request_code_field_label'));
$code->setRequired();
$form->addElement($code);
$submit = new Submit('submit');
$submit->setValue($language->text('base', 'reset_password_request_submit_label'));
$form->addElement($submit);
return $form;
}
public function getResetPasswordForm( $formName = 'reset-password' )
{
$language = PEEP::getLanguage();
$form = new Form($formName);
$pass = new PasswordField('password');
$pass->setRequired();
$pass->setLabel($language->text('base', 'reset_password_field_label'));
$form->addElement($pass);
$repeatPass = new PasswordField('repeatPassword');
$repeatPass->setRequired();
$repeatPass->setLabel($language->text('base', 'reset_password_repeat_field_label'));
$form->addElement($repeatPass);
$submit = new Submit('submit');
$submit->setValue($language->text('base', 'reset_password_submit_label'));
$form->addElement($submit);
return $form;
}
public function processResetPasswordForm( $data, BOL_User $user, $resetCode )
{
$language = PEEP::getLanguage();
if ( trim($data['password']) !== trim($data['repeatPassword']) )
{
throw new LogicException($language->text('base', 'reset_password_not_equal_error_message'));
}
if ( strlen(trim($data['password'])) > UTIL_Validator::PASSWORD_MAX_LENGTH || strlen(trim($data['password'])) < UTIL_Validator::PASSWORD_MIN_LENGTH )
{
throw new LogicException(PEEP::getLanguage()->text('base', 'reset_password_length_error_message', array('min' => UTIL_Validator::PASSWORD_MIN_LENGTH, 'max' => UTIL_Validator::PASSWORD_MAX_LENGTH)));
}
$user->setPassword($this->hashPassword($data['password']));
$this->saveOrUpdate($user);
$this->deleteResetCode($resetCode->getId());
}
public function getDataForUsersList( $listKey, $first, $count )
{
switch ( $listKey )
{
case 'latest':
return array(
$this->findList($first, $count),
$this->count()
);
case 'online':
return array(
$this->findOnlineList($first, $count),
$this->countOnline()
);
case 'featured':
return array(
$this->findFeaturedList($first, $count),
$this->countFeatured()
);
case 'waiting-for-approval':
return array(
$this->findDisapprovedList($first, $count),
$this->countDisapproved()
);
default:
$event = new BASE_CLASS_EventCollector('base.add_user_list');
PEEP::getEventManager()->trigger($event);
$data = $event->getData();
foreach ( $data as $value )
{
if ( $value['key'] == $listKey )
{
return call_user_func_array($value['dataProvider'], array($first, $count));
}
}
return array(array(), 0);
}
}
/**
* @param string $token
* @return int
*/
public function findUserIdByAuthToken( $token )
{
return (int) $this->tokenDao->findUserIdByToken($token);
}
/**
* @param integer $userId
* @return string
*/
public function addTokenForUser( $userId )
{
$token = new BOL_AuthToken();
$token->setUserId($userId);
$token->setTimeStamp(time());
$token->setToken(uniqid($userId));
$this->tokenDao->deleteByUserId($userId);
$this->tokenDao->save($token);
return $token->getToken();
}
/**
* @param integer $userId
*/
public function deleteTokenForUser( $userId )
{
$this->tokenDao->deleteByUserId($userId);
}
public function getUserViewQuestions( $userId, $adminMode = false, $questionNames = array(), $sectionNames = null )
{
$questionService = BOL_QuestionService::getInstance();
$user = BOL_UserService::getInstance()->findUserById($userId);
$accountType = $user->accountType;
$language = PEEP::getLanguage();
if ( empty($questionNames) )
{
if ( $adminMode )
{
$questions = $questionService->findAllQuestionsForAccountType($accountType);
}
else
{
$questions = $questionService->findViewQuestionsForAccountType($accountType);
}
}
else
{
$questions = $questionService->findQuestionByNameList($questionNames);
foreach ( $questions as &$q )
{
$q = (array) $q;
}
}
$section = null;
$questionArray = array();
$questionNameList = array();
foreach ( $questions as $sort => $question )
{
if ( !empty($sectionNames) && !in_array($question['sectionName'], $sectionNames) )
{
continue;
}
if ( $section !== $question['sectionName'] )
{
$section = $question['sectionName'];
}
$questions[$sort]['hidden'] = false;
if ( !$questions[$sort]['onView'] )
{
$questions[$sort]['hidden'] = true;
}
$questionArray[$section][$sort] = $questions[$sort];
$questionNameList[] = $questions[$sort]['name'];
}
$questionData = $questionService->getQuestionData(array($userId), $questionNameList);
$questionLabelList = array();
// add form fields
foreach ( $questionArray as $sectionKey => $section )
{
foreach ( $section as $questionKey => $question )
{
$event = new PEEP_Event('base.questions_field_get_label', array(
'presentation' => $question['presentation'],
'fieldName' => $question['name'],
'configs' => $question['custom'],
'type' => 'view'
));
PEEP::getEventManager()->trigger($event);
$label = $event->getData();
$questionLabelList[$question['name']] = !empty($label) ? $label : BOL_QuestionService::getInstance()->getQuestionLang($question['name']);
$event = new PEEP_Event('base.questions_field_get_value', array(
'presentation' => $question['presentation'],
'fieldName' => $question['name'],
'value' => empty($questionData[$userId][$question['name']]) ? null : $questionData[$userId][$question['name']],
'questionInfo' => $question,
'userId' => $userId
));
PEEP::getEventManager()->trigger($event);
$eventValue = $event->getData();
if ( !empty($eventValue) )
{
$questionData[$userId][$question['name']] = $eventValue;
continue;
}
if ( !empty($questionData[$userId][$question['name']]) )
{
switch ( $question['presentation'] )
{
case BOL_QuestionService::QUESTION_PRESENTATION_CHECKBOX:
if ( (int) $questionData[$userId][$question['name']] === 1 )
{
$questionData[$userId][$question['name']] = PEEP::getLanguage()->text('base', 'yes');
}
else
{
unset($questionArray[$sectionKey][$questionKey]);
}
break;
case BOL_QuestionService::QUESTION_PRESENTATION_DATE:
$format = PEEP::getConfig()->getValue('base', 'date_field_format');
$value = 0;
switch ( $question['type'] )
{
case BOL_QuestionService::QUESTION_VALUE_TYPE_DATETIME:
$date = UTIL_DateTime::parseDate($questionData[$userId][$question['name']], UTIL_DateTime::MYSQL_DATETIME_DATE_FORMAT);
if ( isset($date) )
{
$format = PEEP::getConfig()->getValue('base', 'date_field_format');
$value = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);
}
break;
case BOL_QuestionService::QUESTION_VALUE_TYPE_SELECT:
$value = (int) $questionData[$userId][$question['name']];
break;
}
if ( isset($criteria['birthdate']) )
{
$range = explode('-', $criteria['birthdate']);
if ( !empty($range[0]) && !empty($range[1]) )
{
$criteria['birthdate'] = array('from' => $range[0], 'to' => $range[1]);
}
else
{
unset($criteria['birthdate']);
}
}
if ( $format === 'dmy' )
{
$questionData[$userId][$question['name']] = date("d/m/Y", $value);
}
else
{
$questionData[$userId][$question['name']] = date("m/d/Y", $value);
}
break;
case BOL_QuestionService::QUESTION_PRESENTATION_BIRTHDATE:
$date = UTIL_DateTime::parseDate($questionData[$userId][$question['name']], UTIL_DateTime::MYSQL_DATETIME_DATE_FORMAT);
$questionData[$userId][$question['name']] = UTIL_DateTime::formatBirthdate($date['year'], $date['month'], $date['day']);
break;
case BOL_QuestionService::QUESTION_PRESENTATION_AGE:
$date = UTIL_DateTime::parseDate($questionData[$userId][$question['name']], UTIL_DateTime::MYSQL_DATETIME_DATE_FORMAT);
$questionData[$userId][$question['name']] = UTIL_DateTime::getAge($date['year'], $date['month'], $date['day']) . " " . $language->text('base', 'questions_age_year_old');
break;
case BOL_QuestionService::QUESTION_PRESENTATION_RANGE:
$range = explode('-', $questionData[$userId][$question['name']]);
$questionData[$userId][$question['name']] = $language->text('base', 'form_element_from') . " " . $range[0] . " " . $language->text('base', 'form_element_to') . " " . $range[1];
break;
case BOL_QuestionService::QUESTION_PRESENTATION_SELECT:
case BOL_QuestionService::QUESTION_PRESENTATION_RADIO:
case BOL_QuestionService::QUESTION_PRESENTATION_MULTICHECKBOX:
$value = "";
$multicheckboxValue = (int) $questionData[$userId][$question['name']];
$parentName = $question['name'];
if ( !empty($question['parent']) )
{
$parent = BOL_QuestionService::getInstance()->findQuestionByName($question['parent']);
if ( !empty($parent) )
{
$parentName = $parent->name;
}
}
$questionValues = BOL_QuestionService::getInstance()->findQuestionValues($parentName);
$value = array();
foreach ( $questionValues as $val )
{
/* @var $val BOL_QuestionValue */
if ( ( (int) $val->value ) & $multicheckboxValue )
{
/* if ( strlen($value) > 0 )
{
$value .= ', ';
}
$value .= $language->text('base', 'questions_question_' . $parentName . '_value_' . ($val->value)); */
$value[$val->value] = BOL_QuestionService::getInstance()->getQuestionValueLang($val->questionName, $val->value);
}
}
if ( !empty($value) )
{
$questionData[$userId][$question['name']] = $value;
}
else
{
unset($questionArray[$sectionKey][$questionKey]);
}
break;
case BOL_QuestionService::QUESTION_PRESENTATION_URL:
case BOL_QuestionService::QUESTION_PRESENTATION_TEXT:
case BOL_QuestionService::QUESTION_PRESENTATION_TEXTAREA:
if ( !is_string($questionData[$userId][$question['name']]) )
{
break;
}
$value = trim($questionData[$userId][$question['name']]);
if ( strlen($value) > 0 )
{
$questionData[$userId][$question['name']] = UTIL_HtmlTag::autoLink(nl2br($value));
}
else
{
unset($questionArray[$sectionKey]);
}
break;
default:
unset($questionArray[$sectionKey][$questionKey]);
}
}
else
{
unset($questionArray[$sectionKey][$questionKey]);
}
}
if ( isset($questionArray[$sectionKey]) && count($questionArray[$sectionKey]) === 0 )
{
unset($questionArray[$sectionKey]);
}
}
return array('questions' => $questionArray, 'data' => $questionData, 'labels' => $questionLabelList);
}
}