X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FUser.php;h=aaf5f91526e778e5ad78668e886b50198ec88f89;hb=3cab5b36c14085617e41bbf1313593e4a1336906;hp=8642c78c273c15308b4f2c5c2f32c597656edadd;hpb=138ca38b6f39eb01d4b84030d634796077ade7d4;p=quix0rs-gnu-social.git diff --git a/classes/User.php b/classes/User.php index 8642c78c27..aaf5f91526 100644 --- a/classes/User.php +++ b/classes/User.php @@ -17,18 +17,13 @@ * along with this program. If not, see . */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Table Definition for user */ -require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -require_once 'Validate.php'; - -class User extends Memcached_DataObject +class User extends Managed_DataObject { const SUBSCRIBE_POLICY_OPEN = 0; const SUBSCRIBE_POLICY_MODERATE = 1; @@ -61,28 +56,77 @@ class User extends Memcached_DataObject public $subscribe_policy; // tinyint(1) public $urlshorteningservice; // varchar(50) default_ur1.ca public $inboxed; // tinyint(1) - public $design_id; // int(4) - public $viewdesigns; // tinyint(1) default_1 public $private_stream; // tinyint(1) default_0 public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP - /* Static get */ - function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User',$k,$v); } - /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - protected $_profile = -1; + public static function schemaDef() + { + return array( + 'description' => 'local users', + 'fields' => array( + 'id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), + 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname or username, duped in profile'), + 'password' => array('type' => 'varchar', 'length' => 255, 'description' => 'salted password, can be null for OpenID users'), + 'email' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for password recovery etc.'), + 'incomingemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for post-by-email'), + 'emailnotifysub' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of subscriptions'), + 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of favorites'), + 'emailnotifynudge' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of nudges'), + 'emailnotifymsg' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of direct messages'), + 'emailnotifyattn' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of @-replies'), + 'emailmicroid' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'whether to publish email microid'), + 'language' => array('type' => 'varchar', 'length' => 50, 'description' => 'preferred language'), + 'timezone' => array('type' => 'varchar', 'length' => 50, 'description' => 'timezone'), + 'emailpost' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Post by email'), + 'sms' => array('type' => 'varchar', 'length' => 64, 'description' => 'sms phone number'), + 'carrier' => array('type' => 'int', 'description' => 'foreign key to sms_carrier'), + 'smsnotify' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS'), + 'smsreplies' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS on replies'), + 'smsemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'built from sms and carrier'), + 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'), + 'autosubscribe' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'), + 'subscribe_policy' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => '0 = anybody can subscribe; 1 = require approval'), + 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), + 'inboxed' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'has an inbox been created for this user?'), + 'private_stream' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to limit all notices to followers only'), + + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'user_nickname_key' => array('nickname'), + 'user_email_key' => array('email'), + 'user_incomingemail_key' => array('incomingemail'), + 'user_sms_key' => array('sms'), + 'user_uri_key' => array('uri'), + ), + 'foreign keys' => array( + 'user_id_fkey' => array('profile', array('id' => 'id')), + 'user_carrier_fkey' => array('sms_carrier', array('carrier' => 'id')), + ), + 'indexes' => array( + 'user_smsemail_idx' => array('smsemail'), + ), + ); + } + + protected $_profile = null; /** * @return Profile + * + * @throws UserNoProfileException if user has no profile */ - function getProfile() + public function getProfile() { - if (is_int($this->_profile) && $this->_profile == -1) { // invalid but distinct from null - $this->_profile = Profile::staticGet('id', $this->id); - if (empty($this->_profile)) { + if (!($this->_profile instanceof Profile)) { + $this->_profile = Profile::getKV('id', $this->id); + if (!($this->_profile instanceof Profile)) { throw new UserNoProfileException($this); } } @@ -92,14 +136,12 @@ class User extends Memcached_DataObject function isSubscribed($other) { - $profile = $this->getProfile(); - return $profile->isSubscribed($other); + return $this->getProfile()->isSubscribed($other); } function hasPendingSubscription($other) { - $profile = $this->getProfile(); - return $profile->hasPendingSubscription($other); + return $this->getProfile()->hasPendingSubscription($other); } // 'update' won't write key columns, so we have to do it ourselves. @@ -108,7 +150,7 @@ class User extends Memcached_DataObject { $this->_connect(); $parts = array(); - foreach (array('nickname', 'email', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) { + foreach (array('nickname', 'email', 'incomingemail', 'sms', 'carrier', 'smsemail') as $k) { if (strcmp($this->$k, $orig->$k) != 0) { $parts[] = $k . ' = ' . $this->_quote($this->$k); } @@ -130,38 +172,6 @@ class User extends Memcached_DataObject return $result; } - /** - * Check whether the given nickname is potentially usable, or if it's - * excluded by any blacklists on this system. - * - * WARNING: INPUT IS NOT VALIDATED OR NORMALIZED. NON-NORMALIZED INPUT - * OR INVALID INPUT MAY LEAD TO FALSE RESULTS. - * - * @param string $nickname - * @return boolean true if clear, false if blacklisted - */ - static function allowed_nickname($nickname) - { - // XXX: should already be validated for size, content, etc. - $blacklist = common_config('nickname', 'blacklist'); - - //all directory and file names should be blacklisted - $d = dir(INSTALLDIR); - while (false !== ($entry = $d->read())) { - $blacklist[]=$entry; - } - $d->close(); - - //all top level names in the router should be blacklisted - $router = Router::get(); - foreach(array_keys($router->m->getPaths()) as $path){ - if(preg_match('/^\/(.*?)[\/\?]/',$path,$matches)){ - $blacklist[]=$matches[1]; - } - } - return !in_array($nickname, $blacklist); - } - /** * Get the most recent notice posted by this user, if any. * @@ -169,27 +179,17 @@ class User extends Memcached_DataObject */ function getCurrentNotice() { - $profile = $this->getProfile(); - return $profile->getCurrentNotice(); + return $this->getProfile()->getCurrentNotice(); } function getCarrier() { - return Sms_carrier::staticGet('id', $this->carrier); - } - - /** - * @deprecated use Subscription::start($sub, $other); - */ - function subscribeTo($other) - { - return Subscription::start($this->getProfile(), $other); + return Sms_carrier::getKV('id', $this->carrier); } function hasBlocked($other) { - $profile = $this->getProfile(); - return $profile->hasBlocked($other); + return $this->getProfile()->hasBlocked($other); } /** @@ -213,7 +213,7 @@ class User extends Memcached_DataObject * ?string 'uri' permalink to notice; defaults to local notice URL * @return mixed User object or false on failure */ - static function register($fields) { + static function register(array $fields) { // MAGICALLY put fields into current scope @@ -221,19 +221,18 @@ class User extends Memcached_DataObject $profile = new Profile(); - if(!empty($email)) - { + if (!empty($email)) { $email = common_canonical_email($email); } - $nickname = common_canonical_nickname($nickname); - $profile->nickname = $nickname; - if(! User::allowed_nickname($nickname)){ - common_log(LOG_WARNING, sprintf("Attempted to register a nickname that is not allowed: %s", $profile->nickname), - __FILE__); + try { + $profile->nickname = Nickname::normalize($nickname, true); + } catch (NicknameException $e) { + common_log(LOG_WARNING, sprintf('Bad nickname during User registration for %s: %s', $nickname, $e->getMessage()), __FILE__); return false; } - $profile->profileurl = common_profile_url($nickname); + + $profile->profileurl = common_profile_url($profile->nickname); if (!empty($fullname)) { $profile->fullname = $fullname; @@ -261,12 +260,14 @@ class User extends Memcached_DataObject $user = new User(); - $user->nickname = $nickname; + $user->nickname = $profile->nickname; + + $invite = null; // Users who respond to invite email have proven their ownership of that address if (!empty($code)) { - $invite = Invitation::staticGet($code); + $invite = Invitation::getKV($code); if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) { $user->email = $invite->address; } @@ -291,17 +292,15 @@ class User extends Memcached_DataObject $user->emailmicroid = 1; $user->emailpost = 1; $user->jabbermicroid = 1; - $user->viewdesigns = 1; $user->created = common_sql_now(); - if (Event::handle('StartUserRegister', array(&$user, &$profile))) { + if (Event::handle('StartUserRegister', array($profile))) { $profile->query('BEGIN'); $id = $profile->insert(); - - if (empty($id)) { + if ($id === false) { common_log_db_error($profile, 'INSERT', __FILE__); return false; } @@ -320,8 +319,9 @@ class User extends Memcached_DataObject $result = $user->insert(); - if (!$result) { + if ($result === false) { common_log_db_error($user, 'INSERT', __FILE__); + $profile->query('ROLLBACK'); return false; } @@ -350,9 +350,16 @@ class User extends Memcached_DataObject if (!$result) { common_log_db_error($subscription, 'INSERT', __FILE__); + $profile->query('ROLLBACK'); return false; } + // Mark that this invite was converted + + if (!empty($invite)) { + $invite->convert($user); + } + if (!empty($email) && !$user->email) { $confirm = new Confirm_address(); @@ -365,6 +372,7 @@ class User extends Memcached_DataObject if (!$result) { common_log_db_error($confirm, 'INSERT', __FILE__); + $profile->query('ROLLBACK'); return false; } } @@ -378,12 +386,12 @@ class User extends Memcached_DataObject $defnick = common_config('newuser', 'default'); if (!empty($defnick)) { - $defuser = User::staticGet('nickname', $defnick); + $defuser = User::getKV('nickname', $defnick); if (empty($defuser)) { common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick), __FILE__); } else { - Subscription::start($user, $defuser); + Subscription::start($profile, $defuser->getProfile()); } } @@ -398,7 +406,7 @@ class User extends Memcached_DataObject $welcome = common_config('newuser', 'welcome'); if (!empty($welcome)) { - $welcomeuser = User::staticGet('nickname', $welcome); + $welcomeuser = User::getKV('nickname', $welcome); if (empty($welcomeuser)) { common_log(LOG_WARNING, sprintf("Welcome user %s does not exist.", $defnick), __FILE__); @@ -413,7 +421,7 @@ class User extends Memcached_DataObject } } - Event::handle('EndUserRegister', array(&$profile, &$user)); + Event::handle('EndUserRegister', array($profile)); } return $user; @@ -429,22 +437,27 @@ class User extends Memcached_DataObject if ($invites->find()) { while ($invites->fetch()) { - $other = User::staticGet($invites->user_id); - subs_subscribe_to($other, $this); + try { + $other = Profile::getKV('id', $invites->user_id); + if (!($other instanceof Profile)) { // remove when getKV throws exceptions + continue; + } + Subscription::start($other, $this->getProfile()); + } catch (Exception $e) { + continue; + } } } } function hasFave($notice) { - $profile = $this->getProfile(); - return $profile->hasFave($notice); + return $this->getProfile()->hasFave($notice); } function mutuallySubscribed($other) { - $profile = $this->getProfile(); - return $profile->mutuallySubscribed($other); + return $this->getProfile()->mutuallySubscribed($other); } function mutuallySubscribedUsers() @@ -468,19 +481,17 @@ class User extends Memcached_DataObject } function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { - $profile = $this->getProfile(); - return $profile->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id); + return $this->getProfile()->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id); } function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { - $profile = $this->getProfile(); - return $profile->getNotices($offset, $limit, $since_id, $before_id); + return $this->getProfile()->getNotices($offset, $limit, $since_id, $before_id); } function favoriteNotices($own=false, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0) { - return Fave::stream($this->id, $offset, $limit, $own, $since_id, $max_id); + return $this->getProfile()->favoriteNotices($own, $offset, $limit, $since_id, $max_id); } function noticeInbox($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) @@ -526,8 +537,7 @@ class User extends Memcached_DataObject function blowFavesCache() { - $profile = $this->getProfile(); - $profile->blowFavesCache(); + $this->getProfile()->blowFavesCache(); } function getSelfTags() @@ -540,7 +550,7 @@ class User extends Memcached_DataObject return Profile_tag::setTags($this->id, $this->id, $newtags, $privacy); } - function block($other) + function block(Profile $other) { // Add a new block record @@ -586,11 +596,11 @@ class User extends Memcached_DataObject return true; } - function unblock($other) + function unblock(Profile $other) { // Get the block record - $block = Profile_block::get($this->id, $other->id); + $block = Profile_block::exists($this->getProfile(), $other); if (!$block) { return false; @@ -608,20 +618,17 @@ class User extends Memcached_DataObject function isMember($group) { - $profile = $this->getProfile(); - return $profile->isMember($group); + return $this->getProfile()->isMember($group); } function isAdmin($group) { - $profile = $this->getProfile(); - return $profile->isAdmin($group); + return $this->getProfile()->isAdmin($group); } function getGroups($offset=0, $limit=null) { - $profile = $this->getProfile(); - return $profile->getGroups($offset, $limit); + return $this->getProfile()->getGroups($offset, $limit); } /** @@ -633,8 +640,7 @@ class User extends Memcached_DataObject */ function joinGroup(User_group $group) { - $profile = $this->getProfile(); - return $profile->joinGroup($group); + return $this->getProfile()->joinGroup($group); } /** @@ -644,81 +650,41 @@ class User extends Memcached_DataObject */ function leaveGroup(User_group $group) { - $profile = $this->getProfile(); - return $profile->leaveGroup($group); + return $this->getProfile()->leaveGroup($group); } - function getSubscriptions($offset=0, $limit=null) + function getSubscribed($offset=0, $limit=null) { - $profile = $this->getProfile(); - return $profile->getSubscriptions($offset, $limit); + return $this->getProfile()->getSubscribed($offset, $limit); } function getSubscribers($offset=0, $limit=null) { - $profile = $this->getProfile(); - return $profile->getSubscribers($offset, $limit); + return $this->getProfile()->getSubscribers($offset, $limit); } function getTaggedSubscribers($tag, $offset=0, $limit=null) { - $qry = - 'SELECT profile.* ' . - 'FROM profile JOIN subscription ' . - 'ON profile.id = subscription.subscriber ' . - 'JOIN profile_tag ON (profile_tag.tagged = subscription.subscriber ' . - 'AND profile_tag.tagger = subscription.subscribed) ' . - 'WHERE subscription.subscribed = %d ' . - "AND profile_tag.tag = '%s' " . - 'AND subscription.subscribed != subscription.subscriber ' . - 'ORDER BY subscription.created DESC '; - - if ($offset) { - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - } - - $profile = new Profile(); - - $cnt = $profile->query(sprintf($qry, $this->id, $tag)); - - return $profile; + return $this->getProfile()->getTaggedSubscribers($tag, $offset, $limit); } function getTaggedSubscriptions($tag, $offset=0, $limit=null) { - $qry = - 'SELECT profile.* ' . - 'FROM profile JOIN subscription ' . - 'ON profile.id = subscription.subscribed ' . - 'JOIN profile_tag on (profile_tag.tagged = subscription.subscribed ' . - 'AND profile_tag.tagger = subscription.subscriber) ' . - 'WHERE subscription.subscriber = %d ' . - "AND profile_tag.tag = '%s' " . - 'AND subscription.subscribed != subscription.subscriber ' . - 'ORDER BY subscription.created DESC '; - - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - - $profile = new Profile(); - - $profile->query(sprintf($qry, $this->id, $tag)); - - return $profile; - } - - function getDesign() - { - return Design::staticGet('id', $this->design_id); + return $this->getProfile()->getTaggedSubscriptions($tag, $offset, $limit); } function hasRight($right) { - $profile = $this->getProfile(); - return $profile->hasRight($right); + return $this->getProfile()->hasRight($right); } function delete() { + if (empty($this->id)) { + common_log(LOG_WARNING, "Ambiguous User->delete(); skipping related tables."); + return parent::delete(); + } + try { $profile = $this->getProfile(); $profile->delete(); @@ -764,32 +730,27 @@ class User extends Memcached_DataObject function hasRole($name) { - $profile = $this->getProfile(); - return $profile->hasRole($name); + return $this->getProfile()->hasRole($name); } function grantRole($name) { - $profile = $this->getProfile(); - return $profile->grantRole($name); + return $this->getProfile()->grantRole($name); } function revokeRole($name) { - $profile = $this->getProfile(); - return $profile->revokeRole($name); + return $this->getProfile()->revokeRole($name); } function isSandboxed() { - $profile = $this->getProfile(); - return $profile->isSandboxed(); + return $this->getProfile()->isSandboxed(); } function isSilenced() { - $profile = $this->getProfile(); - return $profile->isSilenced(); + return $this->getProfile()->isSilenced(); } function repeatedByMe($offset=0, $limit=20, $since_id=null, $max_id=null) @@ -813,54 +774,31 @@ class User extends Memcached_DataObject throw new Exception(_('Not implemented since inbox change.')); } - function shareLocation() - { - $cfg = common_config('location', 'share'); - - if ($cfg == 'always') { - return true; - } else if ($cfg == 'never') { - return false; - } else { // user - $share = true; - - $prefs = User_location_prefs::staticGet('user_id', $this->id); - - if (empty($prefs)) { - $share = common_config('location', 'sharedefault'); - } else { - $share = $prefs->share_location; - $prefs->free(); - } - - return $share; - } - } - - static function siteOwner() + public static function siteOwner() { $owner = self::cacheGet('user:site_owner'); if ($owner === false) { // cache miss $pr = new Profile_role(); - $pr->role = Profile_role::OWNER; - $pr->orderBy('created'); - $pr->limit(1); - if ($pr->find(true)) { - $owner = User::staticGet('id', $pr->profile_id); - } else { - $owner = null; + if (!$pr->find(true)) { + throw new NoResultException($pr); } + $owner = User::getKV('id', $pr->profile_id); + self::cacheSet('user:site_owner', $owner); } - return $owner; + if ($owner instanceof User) { + return $owner; + } + + throw new ServerException(_('No site owner configured.')); } /** @@ -873,35 +811,23 @@ class User extends Memcached_DataObject * @throws ServerException if no valid single user account is present * @throws ServerException if called when not in single-user mode */ - static function singleUser() + public static function singleUser() { - if (common_config('singleuser', 'enabled')) { - - $user = null; - - $nickname = common_config('singleuser', 'nickname'); - - if (!empty($nickname)) { - $user = User::staticGet('nickname', $nickname); - } - - // if there was no nickname or no user by that nickname, - // try the site owner. - - if (empty($user)) { - $user = User::siteOwner(); - } + if (!common_config('singleuser', 'enabled')) { + // TRANS: Server exception. + throw new ServerException(_('Single-user mode code called when not enabled.')); + } - if (!empty($user)) { + if ($nickname = common_config('singleuser', 'nickname')) { + $user = User::getKV('nickname', $nickname); + if ($user instanceof User) { return $user; - } else { - // TRANS: Server exception. - throw new ServerException(_('No single user defined for single-user mode.')); } - } else { - // TRANS: Server exception. - throw new ServerException(_('Single-user mode code called when not enabled.')); } + + // If there was no nickname or no user by that nickname, + // try the site owner. Throws exception if not configured. + return User::siteOwner(); } /** @@ -929,7 +855,7 @@ class User extends Memcached_DataObject return $user->nickname; } catch (Exception $e) { if (common_config('singleuser', 'enabled') && common_config('singleuser', 'nickname')) { - common_log(LOG_WARN, "Warning: code attempting to pull single-user nickname when the account does not exist. If this is not setup time, this is probably a bug."); + common_log(LOG_WARNING, "Warning: code attempting to pull single-user nickname when the account does not exist. If this is not setup time, this is probably a bug."); return common_config('singleuser', 'nickname'); } throw $e; @@ -1000,4 +926,163 @@ class User extends Memcached_DataObject $skip = array('_profile'); return array_diff($vars, $skip); } + + static function recoverPassword($nore) + { + $user = User::getKV('email', common_canonical_email($nore)); + + if (!$user) { + try { + $user = User::getKV('nickname', common_canonical_nickname($nore)); + } catch (NicknameException $e) { + // invalid + } + } + + // See if it's an unconfirmed email address + + if (!$user) { + // Warning: it may actually be legit to have multiple folks + // who have claimed, but not yet confirmed, the same address. + // We'll only send to the first one that comes up. + $confirm_email = new Confirm_address(); + $confirm_email->address = common_canonical_email($nore); + $confirm_email->address_type = 'email'; + $confirm_email->find(); + if ($confirm_email->fetch()) { + $user = User::getKV($confirm_email->user_id); + } else { + $confirm_email = null; + } + } else { + $confirm_email = null; + } + + if (!$user) { + // TRANS: Information on password recovery form if no known username or e-mail address was specified. + throw new ClientException(_('No user with that email address or username.')); + return; + } + + // Try to get an unconfirmed email address if they used a user name + + if (!$user->email && !$confirm_email) { + $confirm_email = new Confirm_address(); + $confirm_email->user_id = $user->id; + $confirm_email->address_type = 'email'; + $confirm_email->find(); + if (!$confirm_email->fetch()) { + $confirm_email = null; + } + } + + if (!$user->email && !$confirm_email) { + // TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address. + throw new ClientException(_('No registered email address for that user.')); + return; + } + + // Success! We have a valid user and a confirmed or unconfirmed email address + + $confirm = new Confirm_address(); + $confirm->code = common_confirmation_code(128); + $confirm->address_type = 'recover'; + $confirm->user_id = $user->id; + $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address; + + if (!$confirm->insert()) { + common_log_db_error($confirm, 'INSERT', __FILE__); + // TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form. + throw new ServerException(_('Error saving address confirmation.')); + return; + } + + // @todo FIXME: needs i18n. + $body = "Hey, $user->nickname."; + $body .= "\n\n"; + $body .= 'Someone just asked for a new password ' . + 'for this account on ' . common_config('site', 'name') . '.'; + $body .= "\n\n"; + $body .= 'If it was you, and you want to confirm, use the URL below:'; + $body .= "\n\n"; + $body .= "\t".common_local_url('recoverpassword', + array('code' => $confirm->code)); + $body .= "\n\n"; + $body .= 'If not, just ignore this message.'; + $body .= "\n\n"; + $body .= 'Thanks for your time, '; + $body .= "\n"; + $body .= common_config('site', 'name'); + $body .= "\n"; + + $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname); + // TRANS: Subject for password recovery e-mail. + mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); + } + + function streamModeOnly() + { + if (common_config('oldschool', 'enabled')) { + $osp = Old_school_prefs::getKV('user_id', $this->id); + if (!empty($osp)) { + return $osp->stream_mode_only; + } + } + + return false; + } + + function conversationTree() + { + if (common_config('oldschool', 'enabled')) { + $osp = Old_school_prefs::getKV('user_id', $this->id); + if (!empty($osp)) { + return $osp->conversation_tree; + } + } + + return false; + } + + function streamNicknames() + { + if (common_config('oldschool', 'enabled')) { + $osp = Old_school_prefs::getKV('user_id', $this->id); + if (!empty($osp)) { + return $osp->stream_nicknames; + } + } + return false; + } + + function registrationActivity() + { + $profile = $this->getProfile(); + + $service = new ActivityObject(); + + $service->type = ActivityObject::SERVICE; + $service->title = common_config('site', 'name'); + $service->link = common_root_url(); + $service->id = $service->link; + + $act = new Activity(); + + $act->actor = ActivityObject::fromProfile($profile); + $act->verb = ActivityVerb::JOIN; + + $act->objects[] = $service; + + $act->id = TagURI::mint('user:register:%d', + $this->id); + + $act->time = strtotime($this->created); + + $act->title = _("Register"); + + $act->content = sprintf(_('%1$s joined %2$s.'), + $profile->getBestName(), + $service->title); + return $act; + } }