return $this->uri;
}
+ static function getByUri($uri)
+ {
+ $user = new User();
+ $user->uri = $uri;
+ if (!$user->find(true)) {
+ throw new NoResultException($user);
+ }
+ return $user;
+ }
+
public function getNickname()
{
return $this->getProfile()->getNickname();
return Sms_carrier::getKV('id', $this->carrier);
}
- function hasBlocked($other)
+ function hasBlocked(Profile $other)
{
return $this->getProfile()->hasBlocked($other);
}
* @return User object
* @throws Exception on failure
*/
- static function register(array $fields) {
+ static function register(array $fields, $accept_email_fail=false) {
// MAGICALLY put fields into current scope
$invite->convert($user);
}
- if (!empty($email) && !$user->email) {
+ if (!empty($email) && empty($user->email)) {
+ // The actual email will be sent further down, after the database COMMIT
$confirm = new Confirm_address();
$confirm->code = common_confirmation_code(128);
$result = $confirm->insert();
- if (!$result) {
+ if ($result===false) {
common_log_db_error($confirm, 'INSERT', __FILE__);
$profile->query('ROLLBACK');
// TRANS: Email confirmation data could not be inserted for some reason.
$profile->query('COMMIT');
- if (!empty($email) && !$user->email) {
- mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
+ if (!empty($email) && empty($user->email)) {
+ try {
+ $confirm->sendConfirmation();
+ } catch (EmailException $e) {
+ common_log(LOG_ERR, "Could not send user registration email for user id=={$profile->getID()}: {$e->getMessage()}");
+ if (!$accept_email_fail) {
+ throw $e;
+ }
+ }
}
// Welcome message
// TRANS: %1$s is the sitename, $2$s is the registering user's nickname.
sprintf(_('Welcome to %1$s, @%2$s!'),
common_config('site', 'name'),
- $user->nickname),
+ $profile->getNickname()),
'system');
}
}
Event::handle('EndUserRegister', array($profile));
}
- if (!$user instanceof User) {
+ if (!$user instanceof User || empty($user->id)) {
throw new ServerException('User could not be registered. Probably an event hook that failed.');
}
if ($invites->find()) {
while ($invites->fetch()) {
try {
- $other = Profile::getKV('id', $invites->user_id);
- if (!($other instanceof Profile)) { // remove when getKV throws exceptions
- continue;
- }
+ $other = Profile::getByID($invites->user_id);
Subscription::start($other, $this->getProfile());
+ } catch (NoResultException $e) {
+ // profile did not exist
+ } catch (AlreadyFulfilledException $e) {
+ // already subscribed to this profile
} catch (Exception $e) {
- continue;
+ common_log(LOG_ERR, 'On-invitation-completion subscription failed when subscribing '._ve($invites->user_id).' to '.$this->getProfile()->getID().': '._ve($e->getMessage()));
}
}
}
}
try {
- $profile = $this->getProfile();
- $profile->delete();
+ if (!$this->hasRole(Profile_role::DELETED)) {
+ $profile = $this->getProfile();
+ $profile->delete();
+ }
} catch (UserNoProfileException $unp) {
common_log(LOG_INFO, "User {$this->nickname} has no profile; continuing deletion.");
}
function repeatedByMe($offset=0, $limit=20, $since_id=null, $max_id=null)
{
- $stream = new RepeatedByMeNoticeStream($this);
+ // FIXME: Use another way to get Profile::current() since we
+ // want to avoid confusion between session user and queue processing.
+ $stream = new RepeatedByMeNoticeStream($this->getProfile(), Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
function repeatsOfMe($offset=0, $limit=20, $since_id=null, $max_id=null)
{
- $stream = new RepeatsOfMeNoticeStream($this);
-
+ // FIXME: Use another way to get Profile::current() since we
+ // want to avoid confusion between session user and queue processing.
+ $stream = new RepeatsOfMeNoticeStream($this->getProfile(), Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
static function recoverPassword($nore)
{
+ require_once(INSTALLDIR . '/lib/mail.php');
+
// $confirm_email will be used as a fallback if our user doesn't have a confirmed email
$confirm_email = null;
return !empty($this->password);
}
+ public function setPassword($password)
+ {
+ $orig = clone($this);
+ $this->password = common_munge_password($password, $this->getProfile());
+
+ if ($this->validate() !== true) {
+ // TRANS: Form validation error on page where to change password.
+ throw new ServerException(_('Error saving user; invalid.'));
+ }
+
+ if (!$this->update($orig)) {
+ common_log_db_error($this, 'UPDATE', __FILE__);
+ // TRANS: Server error displayed on page where to change password when password change
+ // TRANS: could not be made because of a server error.
+ throw new ServerException(_('Cannot save new password.'));
+ }
+ }
+
public function delPref($namespace, $topic)
{
return $this->getProfile()->delPref($namespace, $topic);