]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/User.php
Moved shareLocation preference check to Profile class
[quix0rs-gnu-social.git] / classes / User.php
index d15c2c0ae6979c3fe96f5a553d1d8378eba07da4..e9f1d1b2cfc0499caafe8e4688084cbf2154bccd 100644 (file)
@@ -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;
@@ -65,12 +65,61 @@ class User extends Memcached_DataObject
     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;
 
     /**
@@ -79,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);
             }
@@ -173,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)
@@ -211,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
 
@@ -266,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;
             }
@@ -294,7 +335,7 @@ class User extends Memcached_DataObject
 
         $user->created = common_sql_now();
 
-        if (Event::handle('StartUserRegister', array(&$user, &$profile))) {
+        if (Event::handle('StartUserRegister', array($profile))) {
 
             $profile->query('BEGIN');
 
@@ -383,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());
                 }
             }
 
@@ -403,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__);
@@ -418,7 +459,7 @@ class User extends Memcached_DataObject
                 }
             }
 
-            Event::handle('EndUserRegister', array(&$profile, &$user));
+            Event::handle('EndUserRegister', array($profile));
         }
 
         return $user;
@@ -434,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;
+                }
             }
         }
     }
@@ -545,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
 
@@ -591,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;
@@ -653,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)
@@ -684,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;
     }
@@ -706,7 +754,7 @@ 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;
     }
@@ -813,54 +861,31 @@ class User extends Memcached_DataObject
         throw new Exception(_('Not implemented since inbox change.'));
     }
 
-    function shareLocation()
-    {
-        $cfg = common_config('location', 'share');
-
-        if ($cfg == 'always') {
-            return true;
-        } else if ($cfg == 'never') {
-            return false;
-        } else { // user
-            $share = true;
-
-            $prefs = User_location_prefs::staticGet('user_id', $this->id);
-
-            if (empty($prefs)) {
-                $share = common_config('location', 'sharedefault');
-            } else {
-                $share = $prefs->share_location;
-                $prefs->free();
-            }
-
-            return $share;
-        }
-    }
-
-    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.'));
     }
 
     /**
@@ -873,35 +898,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();
     }
 
     /**
@@ -929,7 +942,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;
@@ -1003,11 +1016,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
             }
@@ -1024,7 +1037,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;
             }
@@ -1034,7 +1047,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;
         }
 
@@ -1093,4 +1106,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;
+    }
 }