+
+ /**
+ * Magic function called at serialize() time.
+ *
+ * We use this to drop a couple process-specific references
+ * from DB_DataObject which can cause trouble in future
+ * processes.
+ *
+ * @return array of variable names to include in serialization.
+ */
+
+ function __sleep()
+ {
+ $vars = parent::__sleep();
+ $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;
+ }