public $emailnotifynudge; // tinyint(1) default_1
public $emailnotifymsg; // tinyint(1) default_1
public $emailnotifyattn; // tinyint(1) default_1
- public $emailmicroid; // tinyint(1) default_1
public $language; // varchar(50)
public $timezone; // varchar(50)
public $emailpost; // tinyint(1) default_1
'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'),
return $this->_profile[$this->id];
}
+ public function sameAs(Profile $other)
+ {
+ return $this->getProfile()->sameAs($other);
+ }
+
public function getUri()
{
return $this->uri;
return $this->getProfile()->getNickname();
}
+ static function getByNickname($nickname)
+ {
+ $user = User::getKV('nickname', $nickname);
+ if (!$user instanceof User) {
+ throw new NoSuchUserException(array('nickname' => $nickname));
+ }
+
+ return $user;
+ }
+
function isSubscribed(Profile $other)
{
return $this->getProfile()->isSubscribed($other);
* string 'password' (may be missing for eg OpenID registrations)
* string 'code' invite code
* ?string 'uri' permalink to notice; defaults to local notice URL
- * @return mixed User object or false on failure
+ * @return User object
+ * @throws Exception on failure
*/
static function register(array $fields) {
$email = common_canonical_email($email);
}
- 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;
- }
+ // Normalize _and_ check whether it is in use. Throw NicknameException on failure.
+ $profile->nickname = Nickname::normalize($nickname, true);
$profile->profileurl = common_profile_url($profile->nickname);
$user->emailnotifynudge = 1;
$user->emailnotifymsg = 1;
$user->emailnotifyattn = 1;
- $user->emailmicroid = 1;
$user->emailpost = 1;
- $user->jabbermicroid = 1;
$user->created = common_sql_now();
$id = $profile->insert();
if ($id === false) {
common_log_db_error($profile, 'INSERT', __FILE__);
- return false;
+ $profile->query('ROLLBACK');
+ // TRANS: Profile data could not be inserted for some reason.
+ throw new ServerException(_m('Could not insert profile data for new user.'));
}
$user->id = $id;
}
if (!empty($password)) { // may not have a password for OpenID users
- $user->password = common_munge_password($password, $id);
+ $user->password = common_munge_password($password);
}
$result = $user->insert();
if ($result === false) {
common_log_db_error($user, 'INSERT', __FILE__);
$profile->query('ROLLBACK');
- return false;
+ // TRANS: User data could not be inserted for some reason.
+ throw new ServerException(_m('Could not insert user data for new user.'));
}
// Everyone is subscribed to themself
if (!$result) {
common_log_db_error($subscription, 'INSERT', __FILE__);
$profile->query('ROLLBACK');
- return false;
+ // TRANS: Subscription data could not be inserted for some reason.
+ throw new ServerException(_m('Could not insert subscription data for new user.'));
}
// Mark that this invite was converted
if (!$result) {
common_log_db_error($confirm, 'INSERT', __FILE__);
$profile->query('ROLLBACK');
- return false;
+ // TRANS: Email confirmation data could not be inserted for some reason.
+ throw new ServerException(_m('Could not insert email confirmation data for new user.'));
}
}
common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick),
__FILE__);
} else {
- Subscription::start($profile, $defuser->getProfile());
+ Subscription::ensureStart($profile, $defuser->getProfile());
}
}
Event::handle('EndUserRegister', array($profile));
}
+ if (!$user instanceof User) {
+ throw new ServerException('User could not be registered. Probably an event hook that failed.');
+ }
+
return $user;
}
function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
{
- return Reply::stream($this->id, $offset, $limit, $since_id, $before_id);
+ return $this->getProfile()->getReplies($offset, $limit, $since_id, $before_id);
}
function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
return $this->getProfile()->getNotices($offset, $limit, $since_id, $before_id);
}
- function getSelfTags()
- {
- return Profile_tag::getTagsArray($this->id, $this->id, $this->id);
- }
-
- function setSelfTags($newtags, $privacy)
- {
- return Profile_tag::setTags($this->id, $this->id, $newtags, $privacy);
- }
-
function block(Profile $other)
{
// Add a new block record
}
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.");
}
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
+ // $confirm_email will be used as a fallback if our user doesn't have a confirmed email
+ $confirm_email = null;
+
+ if (common_is_email($nore)) {
+ $user = User::getKV('email', common_canonical_email($nore));
+
+ // See if it's an unconfirmed email address
+ if (!$user instanceof 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';
+ if ($confirm_email->find(true)) {
+ $user = User::getKV('id', $confirm_email->user_id);
+ }
}
- }
- // 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;
+ // No luck finding anyone by that email address.
+ if (!$user instanceof User) {
+ if (common_config('site', 'fakeaddressrecovery')) {
+ // Return without actually doing anything! We fake address recovery
+ // to avoid revealing which email addresses are registered with the site.
+ return;
+ }
+ // TRANS: Information on password recovery form if no known e-mail address was specified.
+ throw new ClientException(_('No user with that email address exists here.'));
}
} 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;
+ // This might throw a NicknameException on bad nicknames
+ $user = User::getKV('nickname', common_canonical_nickname($nore));
+ if (!$user instanceof User) {
+ // TRANS: Information on password recovery form if no known username was specified.
+ throw new ClientException(_('No user with that nickname exists here.'));
+ }
}
// Try to get an unconfirmed email address if they used a user name
-
- if (!$user->email && !$confirm_email) {
+ if (empty($user->email) && $confirm_email === null) {
$confirm_email = new Confirm_address();
$confirm_email->user_id = $user->id;
$confirm_email->address_type = 'email';
$confirm_email->find();
if (!$confirm_email->fetch()) {
+ // Nothing found, so let's reset it to null
$confirm_email = null;
}
}
- if (!$user->email && !$confirm_email) {
+ if (empty($user->email) && !$confirm_email instanceof Confirm_address) {
// 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->code = common_confirmation_code(128);
$confirm->address_type = 'recover';
$confirm->user_id = $user->id;
- $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address;
+ $confirm->address = $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.
return $this->getProfile()->isPrivateStream();
}
+ public function hasPassword()
+ {
+ return !empty($this->password);
+ }
+
public function delPref($namespace, $topic)
{
return $this->getProfile()->delPref($namespace, $topic);