2008-05-08 02:15:42 +09:00
< ? php
2019-09-11 14:15:16 +09:00
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU social is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with GNU social. If not, see <http://www.gnu.org/licenses/>.
defined ( 'GNUSOCIAL' ) || die ();
2008-09-15 15:56:16 +09:00
2008-05-08 02:15:42 +09:00
/**
* Table Definition for user
*/
2009-03-29 06:42:45 +09:00
2011-08-23 06:52:02 +09:00
class User extends Managed_DataObject
2008-05-08 02:15:42 +09:00
{
2011-03-29 07:13:59 +09:00
const SUBSCRIBE_POLICY_OPEN = 0 ;
const SUBSCRIBE_POLICY_MODERATE = 1 ;
2008-05-08 02:15:42 +09:00
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
public $__table = 'user' ; // table name
public $id ; // int(4) primary_key not_null
2008-05-16 01:28:44 +09:00
public $nickname ; // varchar(64) unique_key
2020-07-26 02:16:21 +09:00
public $password ; // text
2015-02-13 02:18:55 +09:00
public $email ; // varchar(191) unique_key not 255 because utf8mb4 takes more space
public $incomingemail ; // varchar(191) unique_key not 255 because utf8mb4 takes more space
2019-09-11 17:25:39 +09:00
public $emailnotifysub ; // bool default_true
public $emailnotifyfav ; // tinyint(1) default_null
public $emailnotifynudge ; // bool default_true
public $emailnotifymsg ; // bool default_true
public $emailnotifyattn ; // bool default_true
2008-12-12 01:34:34 +09:00
public $language ; // varchar(50)
public $timezone ; // varchar(50)
2019-09-11 17:25:39 +09:00
public $emailpost ; // bool default_true
2008-06-23 00:50:28 +09:00
public $sms ; // varchar(64) unique_key
2008-12-12 01:34:34 +09:00
public $carrier ; // int(4)
2019-09-11 17:25:39 +09:00
public $smsnotify ; // bool default_false
public $smsreplies ; // bool default_false
2015-02-13 02:18:55 +09:00
public $smsemail ; // varchar(191) not 255 because utf8mb4 takes more space
public $uri ; // varchar(191) unique_key not 255 because utf8mb4 takes more space
2019-09-11 17:25:39 +09:00
public $autosubscribe ; // bool default_false
2011-03-29 07:13:59 +09:00
public $subscribe_policy ; // tinyint(1)
2008-11-21 05:54:21 +09:00
public $urlshorteningservice ; // varchar(50) default_ur1.ca
2019-09-11 17:25:39 +09:00
public $private_stream ; // bool default_false
2020-06-29 07:41:46 +09:00
public $created ; // datetime()
public $modified ; // timestamp() not_null default_CURRENT_TIMESTAMP
2008-05-08 02:15:42 +09:00
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
2008-05-21 04:14:12 +09:00
2011-08-23 06:52:02 +09:00
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' ),
2020-07-26 02:16:21 +09:00
'password' => array ( 'type' => 'text' , 'description' => 'salted password, can be null for OpenID users' ),
2015-02-13 02:18:55 +09:00
'email' => array ( 'type' => 'varchar' , 'length' => 191 , 'description' => 'email address for password recovery etc.' ),
'incomingemail' => array ( 'type' => 'varchar' , 'length' => 191 , 'description' => 'email address for post-by-email' ),
2019-09-11 17:25:39 +09:00
'emailnotifysub' => array ( 'type' => 'bool' , 'default' => true , 'description' => 'Notify by email of subscriptions' ),
2014-07-14 00:13:05 +09:00
'emailnotifyfav' => array ( 'type' => 'int' , 'size' => 'tiny' , 'default' => null , 'description' => 'Notify by email of favorites' ),
2019-09-11 17:25:39 +09:00
'emailnotifynudge' => array ( 'type' => 'bool' , 'default' => true , 'description' => 'Notify by email of nudges' ),
'emailnotifymsg' => array ( 'type' => 'bool' , 'default' => true , 'description' => 'Notify by email of direct messages' ),
'emailnotifyattn' => array ( 'type' => 'bool' , 'default' => true , 'description' => 'Notify by email of @-replies' ),
2011-08-23 06:52:02 +09:00
'language' => array ( 'type' => 'varchar' , 'length' => 50 , 'description' => 'preferred language' ),
'timezone' => array ( 'type' => 'varchar' , 'length' => 50 , 'description' => 'timezone' ),
2019-09-11 17:25:39 +09:00
'emailpost' => array ( 'type' => 'bool' , 'default' => true , 'description' => 'Post by email' ),
2011-08-23 06:52:02 +09:00
'sms' => array ( 'type' => 'varchar' , 'length' => 64 , 'description' => 'sms phone number' ),
'carrier' => array ( 'type' => 'int' , 'description' => 'foreign key to sms_carrier' ),
2019-09-11 17:25:39 +09:00
'smsnotify' => array ( 'type' => 'bool' , 'default' => false , 'description' => 'whether to send notices to SMS' ),
'smsreplies' => array ( 'type' => 'bool' , 'default' => false , 'description' => 'whether to send notices to SMS on replies' ),
2015-02-13 02:18:55 +09:00
'smsemail' => array ( 'type' => 'varchar' , 'length' => 191 , 'description' => 'built from sms and carrier' ),
'uri' => array ( 'type' => 'varchar' , 'length' => 191 , 'description' => 'universally unique identifier, usually a tag URI' ),
2019-09-11 17:25:39 +09:00
'autosubscribe' => array ( 'type' => 'bool' , 'default' => false , 'description' => 'automatically subscribe to users who subscribe to us' ),
2011-08-23 06:52:02 +09:00
'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' ),
2019-09-11 17:25:39 +09:00
'private_stream' => array ( 'type' => 'bool' , 'default' => false , 'description' => 'whether to limit all notices to followers only' ),
2020-06-29 07:41:46 +09:00
'created' => array ( 'type' => 'datetime' , 'description' => 'date this record was created' ),
'modified' => array ( 'type' => 'timestamp' , 'not null' => true , 'description' => 'date this record was modified' ),
2011-08-23 06:52:02 +09:00
),
'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 (
2020-07-31 22:36:40 +09:00
'user_carrier_idx' => array ( 'carrier' ),
2020-09-15 22:59:27 +09:00
'user_created_id_idx' => array ( 'created' , 'id' ),
2011-08-23 06:52:02 +09:00
'user_smsemail_idx' => array ( 'smsemail' ),
),
);
}
2014-06-06 07:19:54 +09:00
protected $_profile = array ();
2011-04-08 05:55:32 +09:00
2011-03-22 06:35:29 +09:00
/**
* @ return Profile
2013-10-15 08:00:27 +09:00
*
* @ throws UserNoProfileException if user has no profile
2011-03-22 06:35:29 +09:00
*/
2013-10-15 08:00:27 +09:00
public function getProfile ()
2008-12-24 04:33:23 +09:00
{
2014-06-06 07:19:54 +09:00
if ( ! isset ( $this -> _profile [ $this -> id ])) {
2014-06-06 07:32:07 +09:00
$profile = Profile :: getKV ( 'id' , $this -> id );
if ( ! $profile instanceof Profile ) {
throw new UserNoProfileException ( $this );
}
$this -> _profile [ $this -> id ] = $profile ;
2010-03-18 22:35:10 +09:00
}
2014-06-06 07:19:54 +09:00
return $this -> _profile [ $this -> id ];
}
2011-04-08 05:55:32 +09:00
2015-07-10 19:19:08 +09:00
public function sameAs ( Profile $other )
{
return $this -> getProfile () -> sameAs ( $other );
}
2014-04-28 21:08:42 +09:00
public function getUri ()
{
return $this -> uri ;
}
2014-05-06 23:08:36 +09:00
public function getNickname ()
{
return $this -> getProfile () -> getNickname ();
}
2019-09-11 14:15:16 +09:00
public static function getByNickname ( $nickname )
2015-07-10 07:08:09 +09:00
{
$user = User :: getKV ( 'nickname' , $nickname );
if ( ! $user instanceof User ) {
throw new NoSuchUserException ( array ( 'nickname' => $nickname ));
}
return $user ;
}
2019-09-11 14:15:16 +09:00
public function isSubscribed ( Profile $other )
2008-12-24 04:33:23 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> isSubscribed ( $other );
2008-12-24 04:19:07 +09:00
}
2019-09-11 14:15:16 +09:00
public function hasPendingSubscription ( Profile $other )
2011-03-29 08:12:51 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> hasPendingSubscription ( $other );
2011-03-29 08:12:51 +09:00
}
2010-03-12 04:01:01 +09:00
/**
* Get the most recent notice posted by this user , if any .
*
* @ return mixed Notice or null
*/
2019-09-11 14:15:16 +09:00
public function getCurrentNotice ()
2008-12-24 04:33:23 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> getCurrentNotice ();
2008-12-24 04:19:07 +09:00
}
2019-09-11 14:15:16 +09:00
public function getCarrier ()
2008-12-24 04:33:23 +09:00
{
2013-08-18 20:04:58 +09:00
return Sms_carrier :: getKV ( 'id' , $this -> carrier );
2008-12-24 04:19:07 +09:00
}
2019-09-11 14:15:16 +09:00
public function hasBlocked ( Profile $other )
2008-12-24 04:33:23 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> hasBlocked ( $other );
2008-12-08 12:10:08 +09:00
}
2009-12-16 08:27:03 +09:00
/**
* Register a new user account and profile and set up default subscriptions .
* If a new - user welcome message is configured , this will be sent .
*
* @ param array $fields associative array of optional properties
* string 'bio'
* string 'email'
* bool 'email_confirmed' pass true to mark email as pre - confirmed
* string 'fullname'
* string 'homepage'
* string 'location' informal string description of geolocation
* float 'lat' decimal latitude for geolocation
* float 'lon' decimal longitude for geolocation
* int 'location_id' geoname identifier
* int 'location_ns' geoname namespace to interpret location_id
* string 'nickname' REQUIRED
* string 'password' ( may be missing for eg OpenID registrations )
* string 'code' invite code
* ? string 'uri' permalink to notice ; defaults to local notice URL
2015-03-01 20:36:19 +09:00
* @ return User object
* @ throws Exception on failure
2009-12-16 08:27:03 +09:00
*/
2019-09-11 14:15:16 +09:00
public static function register ( array $fields , $accept_email_fail = false )
{
2009-03-29 06:42:45 +09:00
// MAGICALLY put fields into current scope
2008-12-24 04:19:07 +09:00
extract ( $fields );
2008-08-27 09:19:27 +09:00
2008-12-24 04:19:07 +09:00
$profile = new Profile ();
2008-08-14 09:20:38 +09:00
2013-10-16 20:55:32 +09:00
if ( ! empty ( $email )) {
2009-11-13 10:12:00 +09:00
$email = common_canonical_email ( $email );
}
2015-03-01 20:36:19 +09:00
// Normalize _and_ check whether it is in use. Throw NicknameException on failure.
$profile -> nickname = Nickname :: normalize ( $nickname , true );
2013-10-16 20:55:32 +09:00
$profile -> profileurl = common_profile_url ( $profile -> nickname );
2008-08-27 09:19:27 +09:00
2009-02-18 13:22:56 +09:00
if ( ! empty ( $fullname )) {
2008-12-24 04:19:07 +09:00
$profile -> fullname = $fullname ;
}
2009-02-18 13:22:56 +09:00
if ( ! empty ( $homepage )) {
2008-12-24 04:19:07 +09:00
$profile -> homepage = $homepage ;
}
2009-02-18 13:22:56 +09:00
if ( ! empty ( $bio )) {
2008-12-24 04:19:07 +09:00
$profile -> bio = $bio ;
}
2009-02-18 13:22:56 +09:00
if ( ! empty ( $location )) {
2008-12-24 04:19:07 +09:00
$profile -> location = $location ;
2009-10-24 00:46:44 +09:00
$loc = Location :: fromName ( $location );
if ( ! empty ( $loc )) {
$profile -> lat = $loc -> lat ;
$profile -> lon = $loc -> lon ;
$profile -> location_id = $loc -> location_id ;
$profile -> location_ns = $loc -> location_ns ;
}
2008-12-24 04:19:07 +09:00
}
2008-08-27 09:19:27 +09:00
2008-12-24 04:19:07 +09:00
$profile -> created = common_sql_now ();
2008-08-27 09:19:27 +09:00
2008-12-24 04:19:07 +09:00
$user = new User ();
2008-08-27 09:19:27 +09:00
2013-10-16 20:55:32 +09:00
$user -> nickname = $profile -> nickname ;
2008-08-27 09:19:27 +09:00
2011-05-24 06:25:00 +09:00
$invite = null ;
2009-03-29 06:42:45 +09:00
// Users who respond to invite email have proven their ownership of that address
2008-12-24 04:19:07 +09:00
2009-02-18 13:22:56 +09:00
if ( ! empty ( $code )) {
2013-08-18 20:04:58 +09:00
$invite = Invitation :: getKV ( $code );
2015-01-18 21:06:12 +09:00
if ( $invite instanceof Invitation && $invite -> address && $invite -> address_type == 'email' && $invite -> address == $email ) {
2008-12-24 04:19:07 +09:00
$user -> email = $invite -> address ;
}
}
2019-09-11 14:15:16 +09:00
if ( isset ( $email_confirmed ) && $email_confirmed ) {
2009-11-13 10:12:00 +09:00
$user -> email = $email ;
}
2010-09-21 09:37:21 +09:00
// Set default-on options here, otherwise they'll be disabled
// initially for sites using caching, since the initial encache
// doesn't know about the defaults in the database.
2019-09-11 17:25:39 +09:00
$user -> emailnotifysub = true ;
$user -> emailnotifynudge = true ;
$user -> emailnotifymsg = true ;
$user -> emailnotifyattn = true ;
$user -> emailpost = true ;
2010-09-21 09:37:21 +09:00
2008-12-24 04:19:07 +09:00
$user -> created = common_sql_now ();
2013-09-15 01:36:35 +09:00
if ( Event :: handle ( 'StartUserRegister' , array ( $profile ))) {
2020-06-08 18:25:01 +09:00
$profile -> query ( 'START TRANSACTION' );
2009-12-31 04:06:07 +09:00
2010-01-30 07:54:54 +09:00
$id = $profile -> insert ();
2013-10-19 21:35:04 +09:00
if ( $id === false ) {
2010-01-30 07:54:54 +09:00
common_log_db_error ( $profile , 'INSERT' , __FILE__ );
2015-03-01 20:36:19 +09:00
$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.' ));
2010-01-30 07:54:54 +09:00
}
2016-08-09 13:12:25 +09:00
// Necessary because id has been known to be reissued.
if ( $profile -> hasRole ( Profile_role :: DELETED )) {
2019-09-11 14:15:16 +09:00
$profile -> revokeRole ( Profile_role :: DELETED );
2016-08-09 13:12:25 +09:00
}
2009-12-31 04:06:07 +09:00
2010-01-30 07:54:54 +09:00
$user -> id = $id ;
2010-09-23 01:08:17 +09:00
if ( ! empty ( $uri )) {
$user -> uri = $uri ;
} else {
$user -> uri = common_user_uri ( $user );
}
2010-02-01 14:47:50 +09:00
if ( ! empty ( $password )) { // may not have a password for OpenID users
2015-07-17 08:47:43 +09:00
$user -> password = common_munge_password ( $password );
2010-02-01 14:47:50 +09:00
}
2009-12-31 04:06:07 +09:00
2010-01-30 07:54:54 +09:00
$result = $user -> insert ();
2008-08-14 09:20:38 +09:00
2013-10-19 21:35:04 +09:00
if ( $result === false ) {
2010-01-30 07:54:54 +09:00
common_log_db_error ( $user , 'INSERT' , __FILE__ );
2013-10-16 20:55:32 +09:00
$profile -> query ( 'ROLLBACK' );
2015-03-01 20:36:19 +09:00
// TRANS: User data could not be inserted for some reason.
throw new ServerException ( _m ( 'Could not insert user data for new user.' ));
2010-01-30 07:54:54 +09:00
}
2008-08-27 09:19:27 +09:00
2010-01-30 07:54:54 +09:00
// Everyone is subscribed to themself
2008-08-27 09:19:27 +09:00
2010-01-30 07:54:54 +09:00
$subscription = new Subscription ();
$subscription -> subscriber = $user -> id ;
$subscription -> subscribed = $user -> id ;
$subscription -> created = $user -> created ;
2009-03-29 06:36:39 +09:00
2010-01-30 07:54:54 +09:00
$result = $subscription -> insert ();
2009-03-29 06:36:39 +09:00
2010-01-30 07:54:54 +09:00
if ( ! $result ) {
common_log_db_error ( $subscription , 'INSERT' , __FILE__ );
2013-10-16 20:55:32 +09:00
$profile -> query ( 'ROLLBACK' );
2015-03-01 20:36:19 +09:00
// TRANS: Subscription data could not be inserted for some reason.
throw new ServerException ( _m ( 'Could not insert subscription data for new user.' ));
2010-01-30 07:54:54 +09:00
}
2011-05-24 06:25:00 +09:00
// Mark that this invite was converted
if ( ! empty ( $invite )) {
$invite -> convert ( $user );
}
2016-03-02 22:35:08 +09:00
if ( ! empty ( $email ) && empty ( $user -> email )) {
// The actual email will be sent further down, after the database COMMIT
2010-01-30 07:54:54 +09:00
$confirm = new Confirm_address ();
$confirm -> code = common_confirmation_code ( 128 );
$confirm -> user_id = $user -> id ;
$confirm -> address = $email ;
$confirm -> address_type = 'email' ;
2009-03-29 06:36:39 +09:00
2010-01-30 07:54:54 +09:00
$result = $confirm -> insert ();
2009-03-29 06:36:39 +09:00
2016-03-02 22:35:08 +09:00
if ( $result === false ) {
2010-01-30 07:54:54 +09:00
common_log_db_error ( $confirm , 'INSERT' , __FILE__ );
2013-10-16 20:55:32 +09:00
$profile -> query ( 'ROLLBACK' );
2015-03-01 20:36:19 +09:00
// TRANS: Email confirmation data could not be inserted for some reason.
throw new ServerException ( _m ( 'Could not insert email confirmation data for new user.' ));
2009-03-29 06:36:39 +09:00
}
}
2010-01-30 07:54:54 +09:00
if ( ! empty ( $code ) && $user -> email ) {
$user -> emailChanged ();
}
2008-08-27 09:19:27 +09:00
2010-01-30 07:54:54 +09:00
// Default system subscription
2008-08-27 09:19:27 +09:00
2010-01-30 07:54:54 +09:00
$defnick = common_config ( 'newuser' , 'default' );
2008-08-14 09:20:38 +09:00
2010-01-30 07:54:54 +09:00
if ( ! empty ( $defnick )) {
2013-08-18 20:04:58 +09:00
$defuser = User :: getKV ( 'nickname' , $defnick );
2010-01-30 07:54:54 +09:00
if ( empty ( $defuser )) {
2019-09-11 14:15:16 +09:00
common_log (
LOG_WARNING ,
sprintf ( 'Default user %s does not exist.' , $defnick ),
__FILE__
);
2010-01-30 07:54:54 +09:00
} else {
2015-03-04 19:38:04 +09:00
Subscription :: ensureStart ( $profile , $defuser -> getProfile ());
2010-01-30 07:54:54 +09:00
}
2009-03-29 06:36:39 +09:00
}
2010-01-26 08:08:21 +09:00
2010-01-30 07:54:54 +09:00
$profile -> query ( 'COMMIT' );
2016-03-02 22:35:08 +09:00
if ( ! empty ( $email ) && empty ( $user -> email )) {
2016-01-17 01:20:26 +09:00
try {
2016-03-07 01:27:40 +09:00
$confirm -> sendConfirmation ();
2016-01-17 01:20:26 +09:00
} catch ( EmailException $e ) {
2016-03-02 22:35:08 +09:00
common_log ( LOG_ERR , " Could not send user registration email for user id== { $profile -> getID () } : { $e -> getMessage () } " );
2016-01-17 01:20:26 +09:00
if ( ! $accept_email_fail ) {
throw $e ;
}
}
2010-01-30 07:54:54 +09:00
}
// Welcome message
$welcome = common_config ( 'newuser' , 'welcome' );
if ( ! empty ( $welcome )) {
2013-08-18 20:04:58 +09:00
$welcomeuser = User :: getKV ( 'nickname' , $welcome );
2010-01-30 07:54:54 +09:00
if ( empty ( $welcomeuser )) {
2019-09-11 14:15:16 +09:00
common_log (
LOG_WARNING ,
sprintf ( 'Welcome user %s does not exist.' , $defnick ),
__FILE__
);
2010-01-30 07:54:54 +09:00
} else {
2019-09-11 14:15:16 +09:00
$notice = Notice :: saveNew (
$welcomeuser -> id ,
// TRANS: Notice given on user registration.
// 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' ),
$profile -> getNickname ()
),
'system'
);
2010-01-30 07:54:54 +09:00
}
2009-03-29 06:36:39 +09:00
}
2010-01-30 07:54:54 +09:00
2013-09-15 01:36:35 +09:00
Event :: handle ( 'EndUserRegister' , array ( $profile ));
2009-03-29 06:36:39 +09:00
}
2016-03-02 22:35:08 +09:00
if ( ! $user instanceof User || empty ( $user -> id )) {
2015-03-01 20:36:19 +09:00
throw new ServerException ( 'User could not be registered. Probably an event hook that failed.' );
}
2008-12-24 04:19:07 +09:00
return $user ;
}
2008-08-26 03:41:04 +09:00
2009-03-29 06:42:45 +09:00
// Things we do when the email changes
2019-09-11 14:15:16 +09:00
public function emailChanged ()
2008-12-24 04:33:23 +09:00
{
2008-12-24 04:19:07 +09:00
$invites = new Invitation ();
$invites -> address = $this -> email ;
$invites -> address_type = 'email' ;
2008-08-27 09:19:27 +09:00
2008-12-24 04:19:07 +09:00
if ( $invites -> find ()) {
while ( $invites -> fetch ()) {
2013-09-20 00:20:44 +09:00
try {
2016-03-02 22:35:08 +09:00
$other = Profile :: getByID ( $invites -> user_id );
2013-09-20 00:20:44 +09:00
Subscription :: start ( $other , $this -> getProfile ());
2016-03-02 22:35:08 +09:00
} catch ( NoResultException $e ) {
// profile did not exist
} catch ( AlreadyFulfilledException $e ) {
// already subscribed to this profile
2013-09-20 00:20:44 +09:00
} catch ( Exception $e ) {
2016-03-02 22:35:08 +09:00
common_log ( LOG_ERR , 'On-invitation-completion subscription failed when subscribing ' . _ve ( $invites -> user_id ) . ' to ' . $this -> getProfile () -> getID () . ': ' . _ve ( $e -> getMessage ()));
2013-09-20 00:20:44 +09:00
}
2008-12-24 04:19:07 +09:00
}
}
}
2008-08-27 09:19:27 +09:00
2019-09-11 14:15:16 +09:00
public function mutuallySubscribed ( Profile $other )
2008-12-24 04:33:23 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> mutuallySubscribed ( $other );
2008-12-24 04:19:07 +09:00
}
2008-12-12 01:34:34 +09:00
2019-09-11 14:15:16 +09:00
public function mutuallySubscribedUsers ()
2009-03-29 06:42:45 +09:00
{
2008-12-24 04:19:07 +09:00
$user = new User ();
2019-09-11 14:15:16 +09:00
// 3-way join; probably should get cached
$user -> query ( sprintf (
'SELECT %1$s.* ' .
'FROM subscription AS sub1 INNER JOIN %1$s ON sub1.subscribed = %1$s.id ' .
'INNER JOIN subscription AS sub2 ON %1$s.id = sub2.subscriber ' .
'WHERE sub1.subscriber = %2$d AND sub2.subscribed = %2$d ' .
'ORDER BY %1$s.nickname' ,
$user -> escapedTableName (),
$this -> id
));
2008-12-24 04:19:07 +09:00
return $user ;
}
2019-09-11 14:15:16 +09:00
public function getReplies ( $offset = 0 , $limit = NOTICES_PER_PAGE , $since_id = 0 , $before_id = 0 )
2008-12-24 04:33:23 +09:00
{
2015-07-10 07:08:09 +09:00
return $this -> getProfile () -> getReplies ( $offset , $limit , $since_id , $before_id );
2008-12-24 04:19:07 +09:00
}
2008-12-12 01:34:34 +09:00
2019-09-11 14:15:16 +09:00
public function getTaggedNotices ( $tag , $offset = 0 , $limit = NOTICES_PER_PAGE , $since_id = 0 , $before_id = 0 )
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> getTaggedNotices ( $tag , $offset , $limit , $since_id , $before_id );
2009-05-19 06:18:57 +09:00
}
2019-09-11 14:15:16 +09:00
public function getNotices ( $offset = 0 , $limit = NOTICES_PER_PAGE , $since_id = 0 , $before_id = 0 )
2009-03-29 06:42:45 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> getNotices ( $offset , $limit , $since_id , $before_id );
2008-12-24 04:19:07 +09:00
}
2008-12-12 01:34:34 +09:00
2019-09-11 14:15:16 +09:00
public function block ( Profile $other )
2008-12-24 04:33:23 +09:00
{
2009-03-29 06:42:45 +09:00
// Add a new block record
2008-12-09 03:57:28 +09:00
2009-12-04 10:06:58 +09:00
// no blocking (and thus unsubbing from) yourself
if ( $this -> id == $other -> id ) {
2019-09-11 14:15:16 +09:00
common_log (
LOG_WARNING ,
2009-12-04 10:06:58 +09:00
sprintf (
2010-07-20 11:09:09 +09:00
" Profile ID %d (%s) tried to block themself. " ,
2010-04-01 04:20:16 +09:00
$this -> id ,
$this -> nickname
2009-12-04 10:06:58 +09:00
)
);
return false ;
}
2008-12-09 03:57:28 +09:00
$block = new Profile_block ();
2020-06-08 18:25:01 +09:00
$block -> query ( 'START TRANSACTION' );
2008-12-09 03:57:28 +09:00
$block -> blocker = $this -> id ;
$block -> blocked = $other -> id ;
$result = $block -> insert ();
if ( ! $result ) {
common_log_db_error ( $block , 'INSERT' , __FILE__ );
return false ;
}
2010-04-11 09:52:40 +09:00
$self = $this -> getProfile ();
if ( Subscription :: exists ( $other , $self )) {
Subscription :: cancel ( $other , $self );
}
2010-09-21 07:57:46 +09:00
if ( Subscription :: exists ( $self , $other )) {
Subscription :: cancel ( $self , $other );
}
2008-12-09 03:57:28 +09:00
$block -> query ( 'COMMIT' );
return true ;
}
2019-09-11 14:15:16 +09:00
public function unblock ( Profile $other )
2008-12-24 04:33:23 +09:00
{
2009-03-29 06:42:45 +09:00
// Get the block record
2008-12-09 03:57:28 +09:00
2013-09-10 06:08:43 +09:00
$block = Profile_block :: exists ( $this -> getProfile (), $other );
2008-12-09 03:57:28 +09:00
if ( ! $block ) {
return false ;
}
$result = $block -> delete ();
if ( ! $result ) {
common_log_db_error ( $block , 'DELETE' , __FILE__ );
return false ;
}
return true ;
}
2019-09-11 14:15:16 +09:00
public function isMember ( User_group $group )
2009-01-21 16:22:10 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> isMember ( $group );
2009-01-21 16:22:10 +09:00
}
2019-09-11 14:15:16 +09:00
public function isAdmin ( User_group $group )
2009-01-21 16:22:10 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> isAdmin ( $group );
2009-01-21 16:22:10 +09:00
}
2009-01-22 02:19:23 +09:00
2019-09-11 14:15:16 +09:00
public function getGroups ( $offset = 0 , $limit = null )
2009-01-22 02:19:23 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> getGroups ( $offset , $limit );
2009-01-22 03:00:30 +09:00
}
2011-03-22 06:35:29 +09:00
/**
* Request to join the given group .
* May throw exceptions on failure .
*
* @ param User_group $group
* @ return Group_member
*/
2019-09-11 14:15:16 +09:00
public function joinGroup ( User_group $group )
2011-03-22 06:35:29 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> joinGroup ( $group );
2011-03-22 06:35:29 +09:00
}
/**
* Leave a group that this user is a member of .
*
* @ param User_group $group
*/
2019-09-11 14:15:16 +09:00
public function leaveGroup ( User_group $group )
2011-03-22 06:35:29 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> leaveGroup ( $group );
2011-03-22 06:35:29 +09:00
}
2019-09-11 14:15:16 +09:00
public function getSubscribed ( $offset = 0 , $limit = null )
2009-01-22 03:00:30 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> getSubscribed ( $offset , $limit );
2009-01-22 03:00:30 +09:00
}
2019-09-11 14:15:16 +09:00
public function getSubscribers ( $offset = 0 , $limit = null )
2009-01-22 03:00:30 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> getSubscribers ( $offset , $limit );
2009-01-22 02:19:23 +09:00
}
2009-01-23 07:38:10 +09:00
2019-09-11 14:15:16 +09:00
public function getTaggedSubscribers ( $tag , $offset = 0 , $limit = null )
2009-01-23 07:38:10 +09:00
{
2013-10-15 09:00:27 +09:00
return $this -> getProfile () -> getTaggedSubscribers ( $tag , $offset , $limit );
2009-01-23 07:38:10 +09:00
}
2019-09-11 14:15:16 +09:00
public function getTaggedSubscriptions ( $tag , $offset = 0 , $limit = null )
2009-01-23 07:38:10 +09:00
{
2013-10-15 09:00:27 +09:00
return $this -> getProfile () -> getTaggedSubscriptions ( $tag , $offset , $limit );
2009-01-23 07:38:10 +09:00
}
2009-02-06 01:46:17 +09:00
2019-09-11 14:15:16 +09:00
public function hasRight ( $right )
2009-09-16 04:28:11 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> hasRight ( $right );
2009-09-16 04:28:11 +09:00
}
2009-07-27 04:06:38 +09:00
2019-09-11 14:15:16 +09:00
public function delete ( $useWhere = false )
2009-07-27 04:06:38 +09:00
{
2013-10-17 08:16:03 +09:00
if ( empty ( $this -> id )) {
common_log ( LOG_WARNING , " Ambiguous User->delete(); skipping related tables. " );
2013-10-29 18:20:57 +09:00
return parent :: delete ( $useWhere );
2013-10-17 08:16:03 +09:00
}
2010-03-29 00:58:16 +09:00
try {
2015-07-18 09:16:52 +09:00
if ( ! $this -> hasRole ( Profile_role :: DELETED )) {
$profile = $this -> getProfile ();
$profile -> delete ();
}
2010-03-29 00:58:16 +09:00
} catch ( UserNoProfileException $unp ) {
common_log ( LOG_INFO , " User { $this -> nickname } has no profile; continuing deletion. " );
}
2009-07-27 04:06:38 +09:00
2014-06-28 20:11:03 +09:00
$related = array (
2009-07-27 04:06:38 +09:00
'Confirm_address' ,
'Remember_me' ,
'Foreign_link' ,
'Invitation' ,
);
2010-03-29 00:58:16 +09:00
2009-11-08 22:33:22 +09:00
Event :: handle ( 'UserDeleteRelated' , array ( $this , & $related ));
2009-07-27 04:06:38 +09:00
foreach ( $related as $cls ) {
$inst = new $cls ();
$inst -> user_id = $this -> id ;
$inst -> delete ();
}
$this -> _deleteTags ();
2009-10-03 04:29:57 +09:00
$this -> _deleteBlocks ();
2009-07-27 04:06:38 +09:00
2013-10-29 18:20:57 +09:00
return parent :: delete ( $useWhere );
2009-07-27 04:06:38 +09:00
}
2019-09-11 14:15:16 +09:00
public function _deleteTags ()
2009-07-27 04:06:38 +09:00
{
$tag = new Profile_tag ();
$tag -> tagger = $this -> id ;
$tag -> delete ();
}
2019-09-11 14:15:16 +09:00
public function _deleteBlocks ()
2009-07-27 04:06:38 +09:00
{
$block = new Profile_block ();
$block -> blocker = $this -> id ;
$block -> delete ();
// XXX delete group block? Reset blocker?
}
2009-11-15 23:59:10 +09:00
2019-09-11 14:15:16 +09:00
public function hasRole ( $name )
2009-11-16 23:52:33 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> hasRole ( $name );
2009-11-16 23:52:33 +09:00
}
2019-09-11 14:15:16 +09:00
public function grantRole ( $name )
2009-11-16 23:52:33 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> grantRole ( $name );
2009-11-16 23:52:33 +09:00
}
2019-09-11 14:15:16 +09:00
public function revokeRole ( $name )
2009-11-16 23:52:33 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> revokeRole ( $name );
2009-11-16 23:52:33 +09:00
}
2019-09-11 14:15:16 +09:00
public function isSandboxed ()
2009-11-15 23:59:10 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> isSandboxed ();
2009-11-15 23:59:10 +09:00
}
2019-09-11 14:15:16 +09:00
public function isSilenced ()
2009-11-15 23:59:10 +09:00
{
2013-10-15 09:34:10 +09:00
return $this -> getProfile () -> isSilenced ();
2009-11-15 23:59:10 +09:00
}
2009-12-13 05:35:05 +09:00
2019-09-11 14:15:16 +09:00
public function receivesEmailNotifications ()
2015-02-03 19:41:20 +09:00
{
// We could do this in one large if statement, but that's not as easy to read
// Don't send notifications if we don't know the user's email address or it is
// explicitly undesired by the user's own settings.
if ( empty ( $this -> email ) || ! $this -> emailnotifyattn ) {
return false ;
}
// Don't send notifications to a user who is sandboxed or silenced
if ( $this -> isSandboxed () || $this -> isSilenced ()) {
return false ;
}
return true ;
}
2019-09-11 14:15:16 +09:00
public function repeatedByMe ( $offset = 0 , $limit = 20 , $since_id = null , $max_id = null )
2009-12-13 05:35:05 +09:00
{
2016-03-01 22:51:47 +09:00
// 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 ());
2011-03-24 00:29:55 +09:00
return $stream -> getNotices ( $offset , $limit , $since_id , $max_id );
2009-12-13 05:35:05 +09:00
}
2009-12-13 06:00:27 +09:00
2019-09-11 14:15:16 +09:00
public function repeatsOfMe ( $offset = 0 , $limit = 20 , $since_id = null , $max_id = null )
2009-12-13 06:00:27 +09:00
{
2016-03-01 22:51:47 +09:00
// 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 ());
2011-03-24 00:29:55 +09:00
return $stream -> getNotices ( $offset , $limit , $since_id , $max_id );
2009-12-13 06:00:27 +09:00
}
2019-09-11 14:15:16 +09:00
public function repeatedToMe ( $offset = 0 , $limit = 20 , $since_id = null , $max_id = null )
2009-12-13 06:15:23 +09:00
{
2015-02-18 00:45:26 +09:00
return $this -> getProfile () -> repeatedToMe ( $offset , $limit , $since_id , $max_id );
2009-12-13 06:15:23 +09:00
}
2009-12-29 07:21:07 +09:00
2013-10-01 05:42:20 +09:00
public static function siteOwner ()
2010-01-30 05:15:23 +09:00
{
$owner = self :: cacheGet ( 'user:site_owner' );
if ( $owner === false ) { // cache miss
$pr = new Profile_role ();
$pr -> role = Profile_role :: OWNER ;
2020-09-15 22:59:27 +09:00
$pr -> orderBy ( 'created, profile_id' );
2010-02-01 12:55:07 +09:00
$pr -> limit ( 1 );
2010-01-30 05:15:23 +09:00
2013-10-01 05:42:20 +09:00
if ( ! $pr -> find ( true )) {
throw new NoResultException ( $pr );
2010-01-30 05:15:23 +09:00
}
2013-10-01 05:42:20 +09:00
$owner = User :: getKV ( 'id' , $pr -> profile_id );
2010-01-30 05:15:23 +09:00
self :: cacheSet ( 'user:site_owner' , $owner );
}
2013-10-01 05:42:20 +09:00
if ( $owner instanceof User ) {
return $owner ;
2013-10-01 00:13:03 +09:00
}
2013-10-01 05:42:20 +09:00
throw new ServerException ( _ ( 'No site owner configured.' ));
2010-01-30 05:15:23 +09:00
}
2010-10-21 06:34:25 +09:00
/**
* Pull the primary site account to use in single - user mode .
* If a valid user nickname is listed in 'singleuser' : 'nickname'
* in the config , this will be used ; otherwise the site owner
* account is taken by default .
*
* @ return User
* @ throws ServerException if no valid single user account is present
* @ throws ServerException if called when not in single - user mode
*/
2013-10-01 05:42:20 +09:00
public static function singleUser ()
2010-10-21 06:34:25 +09:00
{
2013-10-01 05:42:20 +09:00
if ( ! common_config ( 'singleuser' , 'enabled' )) {
2010-10-21 08:12:56 +09:00
// TRANS: Server exception.
2010-10-21 06:34:25 +09:00
throw new ServerException ( _ ( 'Single-user mode code called when not enabled.' ));
}
2013-10-01 05:42:20 +09:00
2020-09-08 18:42:51 +09:00
if ( ! empty ( $nickname = common_config ( 'singleuser' , 'nickname' ))) {
2013-10-01 05:42:20 +09:00
$user = User :: getKV ( 'nickname' , $nickname );
if ( $user instanceof User ) {
return $user ;
}
}
// If there was no nickname or no user by that nickname,
// try the site owner. Throws exception if not configured.
return User :: siteOwner ();
2010-10-21 06:34:25 +09:00
}
2010-12-03 03:56:44 +09:00
2010-12-07 05:39:09 +09:00
/**
* This is kind of a hack for using external setup code that ' s trying to
* build single - user sites .
*
* Will still return a username if the config singleuser / nickname is set
* even if the account doesn ' t exist , which normally indicates that the
* site is horribly misconfigured .
*
* At the moment , we need to let it through so that router setup can
* complete , otherwise we won ' t be able to create the account .
*
* This will be easier when we can more easily create the account and
* * then * switch the site to 1 user mode without jumping through hoops .
*
* @ return string
* @ throws ServerException if no valid single user account is present
* @ throws ServerException if called when not in single - user mode
*/
2019-09-11 14:15:16 +09:00
public static function singleUserNickname ()
2010-12-07 05:39:09 +09:00
{
try {
$user = User :: singleUser ();
return $user -> nickname ;
} catch ( Exception $e ) {
if ( common_config ( 'singleuser' , 'enabled' ) && common_config ( 'singleuser' , 'nickname' )) {
2011-08-28 04:42:09 +09:00
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. " );
2010-12-07 05:39:09 +09:00
return common_config ( 'singleuser' , 'nickname' );
}
throw $e ;
}
}
2010-12-07 05:44:19 +09:00
2010-12-03 03:56:44 +09:00
/**
* Find and shorten links in the given text using this user ' s URL shortening
* settings .
*
* By default , links will be left untouched if the text is shorter than the
* configured maximum notice length . Pass true for the $always parameter
* to force all links to be shortened regardless .
*
* Side effects : may save file and file_redirection records for referenced URLs .
*
* @ param string $text
* @ param boolean $always
* @ return string
*/
public function shortenLinks ( $text , $always = false )
{
return common_shorten_links ( $text , $always , $this );
}
2010-12-13 10:37:42 +09:00
/*
2011-01-20 08:52:18 +09:00
* Get a list of OAuth client applications that have access to this
2010-12-13 10:37:42 +09:00
* user ' s account .
*/
2019-09-11 14:15:16 +09:00
public function getConnectedApps ( $offset = 0 , $limit = null )
2010-12-13 10:37:42 +09:00
{
2020-09-15 22:59:27 +09:00
$apps = new Oauth_application_user ();
$apps -> selectAdd ();
$apps -> selectAdd ( 'oauth_application_user.*' );
$apps -> joinAdd ([ 'application_id' , 'oauth_application:id' ]);
$apps -> profile_id = $this -> getID ();
$apps -> whereAdd ( 'oauth_application_user.access_type > 0' );
$apps -> orderBy ( 'oauth_application_user.created DESC, oauth_application.id DESC' );
2010-12-13 10:37:42 +09:00
if ( $offset > 0 ) {
2020-09-15 22:59:27 +09:00
$apps -> limit ( $offset , $limit );
2010-12-13 10:37:42 +09:00
}
2020-09-15 22:59:27 +09:00
$apps -> find ();
2010-12-13 10:37:42 +09:00
return $apps ;
}
2011-04-19 07:23:06 +09:00
/**
* 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 .
*/
2019-09-11 14:15:16 +09:00
public function __sleep ()
2011-04-19 07:23:06 +09:00
{
$vars = parent :: __sleep ();
$skip = array ( '_profile' );
return array_diff ( $vars , $skip );
}
2011-06-08 00:22:19 +09:00
2019-09-11 14:15:16 +09:00
public static function recoverPassword ( $nore )
2011-06-08 00:22:19 +09:00
{
2019-08-23 21:36:02 +09:00
require_once INSTALLDIR . '/lib/util/mail.php' ;
2016-03-02 22:35:08 +09:00
2015-05-31 06:18:17 +09:00
// $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 );
}
2011-06-08 00:22:19 +09:00
}
2015-05-31 06:18:17 +09:00
// No luck finding anyone by that email address.
if ( ! $user instanceof User ) {
2015-05-31 06:29:16 +09:00
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.
2015-05-31 06:18:17 +09:00
throw new ClientException ( _ ( 'No user with that email address exists here.' ));
2011-06-08 00:22:19 +09:00
}
} else {
2015-05-31 06:18:17 +09:00
// This might throw a NicknameException on bad nicknames
$user = User :: getKV ( 'nickname' , common_canonical_nickname ( $nore ));
if ( ! $user instanceof User ) {
2015-05-31 06:29:16 +09:00
// TRANS: Information on password recovery form if no known username was specified.
2015-05-31 06:18:17 +09:00
throw new ClientException ( _ ( 'No user with that nickname exists here.' ));
}
2011-06-08 00:22:19 +09:00
}
// Try to get an unconfirmed email address if they used a user name
2015-05-31 06:18:17 +09:00
if ( empty ( $user -> email ) && $confirm_email === null ) {
2011-06-08 00:22:19 +09:00
$confirm_email = new Confirm_address ();
$confirm_email -> user_id = $user -> id ;
$confirm_email -> address_type = 'email' ;
$confirm_email -> find ();
if ( ! $confirm_email -> fetch ()) {
2015-05-31 06:18:17 +09:00
// Nothing found, so let's reset it to null
2011-06-08 00:22:19 +09:00
$confirm_email = null ;
}
}
2015-05-31 06:18:17 +09:00
if ( empty ( $user -> email ) && ! $confirm_email instanceof Confirm_address ) {
2011-06-08 00:22:19 +09:00
// 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.' ));
}
// 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 ;
2015-05-31 06:18:17 +09:00
$confirm -> address = $user -> email ? : $confirm_email -> address ;
2011-06-08 00:22:19 +09:00
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.' ));
}
2019-09-11 14:15:16 +09:00
// @todo FIXME: needs i18n.
2011-06-08 00:22:19 +09:00
$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 " ;
2019-09-11 14:15:16 +09:00
$body .= " \t " . common_local_url (
'recoverpassword' ,
[ 'code' => $confirm -> code ]
);
2011-06-08 00:22:19 +09:00
$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 );
}
2011-09-24 06:50:38 +09:00
2019-09-11 14:15:16 +09:00
public function streamModeOnly ()
2011-09-24 06:50:38 +09:00
{
2011-09-24 22:46:13 +09:00
if ( common_config ( 'oldschool' , 'enabled' )) {
2013-08-18 20:04:58 +09:00
$osp = Old_school_prefs :: getKV ( 'user_id' , $this -> id );
2011-09-24 22:46:13 +09:00
if ( ! empty ( $osp )) {
return $osp -> stream_mode_only ;
2013-06-03 03:38:00 +09:00
}
2011-09-24 20:12:34 +09:00
}
2011-09-24 22:46:13 +09:00
return false ;
2011-09-24 20:12:34 +09:00
}
2019-09-11 14:15:16 +09:00
public function streamNicknames ()
2011-09-24 20:12:34 +09:00
{
2011-09-24 22:46:13 +09:00
if ( common_config ( 'oldschool' , 'enabled' )) {
2013-08-18 20:04:58 +09:00
$osp = Old_school_prefs :: getKV ( 'user_id' , $this -> id );
2011-09-24 22:46:13 +09:00
if ( ! empty ( $osp )) {
return $osp -> stream_nicknames ;
}
2011-09-24 06:50:38 +09:00
}
2011-09-24 22:46:13 +09:00
return false ;
2011-09-24 06:50:38 +09:00
}
2013-06-03 03:38:00 +09:00
2019-09-11 14:15:16 +09:00
public function registrationActivity ()
2013-06-03 03:38:00 +09:00
{
$profile = $this -> getProfile ();
$service = new ActivityObject ();
2013-06-05 05:30:40 +09:00
$service -> type = ActivityObject :: SERVICE ;
2013-06-05 04:20:00 +09:00
$service -> title = common_config ( 'site' , 'name' );
$service -> link = common_root_url ();
$service -> id = $service -> link ;
2013-06-03 03:38:00 +09:00
$act = new Activity ();
2014-07-03 01:50:28 +09:00
$act -> actor = $profile -> asActivityObject ();
2013-06-03 03:38:00 +09:00
$act -> verb = ActivityVerb :: JOIN ;
2013-06-03 21:55:00 +09:00
2013-06-03 03:38:00 +09:00
$act -> objects [] = $service ;
2019-09-11 14:15:16 +09:00
$act -> id = TagURI :: mint (
'user:register:%d' ,
$this -> id
);
2013-06-03 03:38:00 +09:00
$act -> time = strtotime ( $this -> created );
$act -> title = _ ( " Register " );
2019-09-11 14:15:16 +09:00
$act -> content = sprintf (
_ ( '%1$s joined %2$s.' ),
$profile -> getBestName (),
$service -> title
);
2013-06-03 03:38:00 +09:00
return $act ;
}
2014-07-13 23:30:37 +09:00
2015-02-25 06:59:58 +09:00
public function isPrivateStream ()
{
return $this -> getProfile () -> isPrivateStream ();
}
2015-07-17 08:47:43 +09:00
public function hasPassword ()
{
return ! empty ( $this -> password );
}
2015-12-31 01:44:24 +09:00
public function setPassword ( $password )
{
$orig = clone ( $this );
$this -> password = common_munge_password ( $password , $this -> getProfile ());
2015-12-31 01:49:13 +09:00
if ( $this -> validate () !== true ) {
// TRANS: Form validation error on page where to change password.
throw new ServerException ( _ ( 'Error saving user; invalid.' ));
}
2015-12-31 01:44:24 +09:00
if ( ! $this -> update ( $orig )) {
2015-12-31 01:49:13 +09:00
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.' ));
2015-12-31 01:44:24 +09:00
}
}
2015-01-22 06:59:15 +09:00
public function delPref ( $namespace , $topic )
{
return $this -> getProfile () -> delPref ( $namespace , $topic );
}
2014-07-13 23:30:37 +09:00
public function getPref ( $namespace , $topic , $default = null )
{
return $this -> getProfile () -> getPref ( $namespace , $topic , $default );
}
2015-02-04 06:04:29 +09:00
public function getConfigPref ( $namespace , $topic )
{
return $this -> getProfile () -> getConfigPref ( $namespace , $topic );
}
2014-07-13 23:30:37 +09:00
public function setPref ( $namespace , $topic , $data )
{
return $this -> getProfile () -> setPref ( $namespace , $topic , $data );
}
2008-05-08 02:15:42 +09:00
}