X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=classes%2FUser.php;h=9ad9a4a61f9afe2d2af5843394ab8daba17725d1;hb=59744937077b51c8ff1e43d9cc386a90fb06463d;hp=2d1253b7f7ad19f362bee8b2f22c007e4c74fe9c;hpb=331d8a99ba432cb7a9b5d3184b1ed97410a4d15a;p=quix0rs-gnu-social.git diff --git a/classes/User.php b/classes/User.php index 2d1253b7f7..9ad9a4a61f 100644 --- a/classes/User.php +++ b/classes/User.php @@ -28,7 +28,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { 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,18 +61,65 @@ 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 + 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 = -1; /** @@ -81,7 +128,7 @@ class User extends Memcached_DataObject function getProfile() { if (is_int($this->_profile) && $this->_profile == -1) { // invalid but distinct from null - $this->_profile = Profile::staticGet('id', $this->id); + $this->_profile = Profile::getKV('id', $this->id); if (empty($this->_profile)) { throw new UserNoProfileException($this); } @@ -175,15 +222,7 @@ class User extends Memcached_DataObject 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) @@ -213,7 +252,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 @@ -268,7 +307,7 @@ class User extends Memcached_DataObject // 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; } @@ -293,11 +332,10 @@ 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'); @@ -386,12 +424,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()); } } @@ -406,7 +444,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__); @@ -421,7 +459,7 @@ class User extends Memcached_DataObject } } - Event::handle('EndUserRegister', array(&$profile, &$user)); + Event::handle('EndUserRegister', array($profile)); } return $user; @@ -437,8 +475,15 @@ 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; + } } } } @@ -548,7 +593,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 @@ -594,11 +639,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; @@ -656,10 +701,10 @@ class User extends Memcached_DataObject return $profile->leaveGroup($group); } - function getSubscriptions($offset=0, $limit=null) + function getSubscribed($offset=0, $limit=null) { $profile = $this->getProfile(); - return $profile->getSubscriptions($offset, $limit); + return $profile->getSubscribed($offset, $limit); } function getSubscribers($offset=0, $limit=null) @@ -687,7 +732,7 @@ class User extends Memcached_DataObject $profile = new Profile(); - $cnt = $profile->query(sprintf($qry, $this->id, $tag)); + $cnt = $profile->query(sprintf($qry, $this->id, $profile->escape($tag))); return $profile; } @@ -709,16 +754,11 @@ class User extends Memcached_DataObject $profile = new Profile(); - $profile->query(sprintf($qry, $this->id, $tag)); + $profile->query(sprintf($qry, $this->id, $profile->escape($tag))); return $profile; } - function getDesign() - { - return Design::staticGet('id', $this->design_id); - } - function hasRight($right) { $profile = $this->getProfile(); @@ -830,13 +870,12 @@ class User extends Memcached_DataObject } else if ($cfg == 'never') { return false; } else { // user - $share = true; + $share = common_config('location', 'sharedefault'); - $prefs = User_location_prefs::staticGet('user_id', $this->id); + // Check if user has a personal setting for this + $prefs = User_location_prefs::getKV('user_id', $this->id); - if (empty($prefs)) { - $share = common_config('location', 'sharedefault'); - } else { + if (!empty($prefs)) { $share = $prefs->share_location; $prefs->free(); } @@ -845,30 +884,31 @@ class User extends Memcached_DataObject } } - 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.')); } /** @@ -881,35 +921,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(); } /** @@ -937,7 +965,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; @@ -1011,11 +1039,11 @@ class User extends Memcached_DataObject static function recoverPassword($nore) { - $user = User::staticGet('email', common_canonical_email($nore)); + $user = User::getKV('email', common_canonical_email($nore)); if (!$user) { try { - $user = User::staticGet('nickname', common_canonical_nickname($nore)); + $user = User::getKV('nickname', common_canonical_nickname($nore)); } catch (NicknameException $e) { // invalid } @@ -1032,7 +1060,7 @@ class User extends Memcached_DataObject $confirm_email->address_type = 'email'; $confirm_email->find(); if ($confirm_email->fetch()) { - $user = User::staticGet($confirm_email->user_id); + $user = User::getKV($confirm_email->user_id); } else { $confirm_email = null; } @@ -1042,7 +1070,7 @@ class User extends Memcached_DataObject if (!$user) { // TRANS: Information on password recovery form if no known username or e-mail address was specified. - throw new ClientError(_('No user with that email address or username.')); + throw new ClientException(_('No user with that email address or username.')); return; } @@ -1101,4 +1129,70 @@ class User extends Memcached_DataObject // 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; + } }