]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/User.php
function delete in dataobjects now don't break strict syntax
[quix0rs-gnu-social.git] / classes / User.php
index e8e06a2d40b9d00f17f512bb980343dbad2e0d38..24a03b62fd0d0d82941e72a481cc3fa2f8906119 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * Table Definition for user
  */
 
-require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
-require_once 'Validate.php';
-
 class User extends Managed_DataObject
 {
     const SUBSCRIBE_POLICY_OPEN = 0;
@@ -120,16 +115,18 @@ class User extends Managed_DataObject
         );
     }
 
-    protected $_profile = -1;
+    protected $_profile = null;
 
     /**
      * @return Profile
+     *
+     * @throws UserNoProfileException if user has no profile
      */
-    function getProfile()
+    public function getProfile()
     {
-        if (is_int($this->_profile) && $this->_profile == -1) { // invalid but distinct from null
+        if (!($this->_profile instanceof Profile)) {
             $this->_profile = Profile::getKV('id', $this->id);
-            if (empty($this->_profile)) {
+            if (!($this->_profile instanceof Profile)) {
                 throw new UserNoProfileException($this);
             }
         }
@@ -139,14 +136,12 @@ class User extends Managed_DataObject
 
     function isSubscribed($other)
     {
-        $profile = $this->getProfile();
-        return $profile->isSubscribed($other);
+        return $this->getProfile()->isSubscribed($other);
     }
 
     function hasPendingSubscription($other)
     {
-        $profile = $this->getProfile();
-        return $profile->hasPendingSubscription($other);
+        return $this->getProfile()->hasPendingSubscription($other);
     }
 
     // 'update' won't write key columns, so we have to do it ourselves.
@@ -155,7 +150,7 @@ class User extends Managed_DataObject
     {
         $this->_connect();
         $parts = array();
-        foreach (array('nickname', 'email', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
+        foreach (array('nickname', 'email', 'incomingemail', 'sms', 'carrier', 'smsemail') as $k) {
             if (strcmp($this->$k, $orig->$k) != 0) {
                 $parts[] = $k . ' = ' . $this->_quote($this->$k);
             }
@@ -177,38 +172,6 @@ class User extends Managed_DataObject
         return $result;
     }
 
-    /**
-     * Check whether the given nickname is potentially usable, or if it's
-     * excluded by any blacklists on this system.
-     *
-     * WARNING: INPUT IS NOT VALIDATED OR NORMALIZED. NON-NORMALIZED INPUT
-     * OR INVALID INPUT MAY LEAD TO FALSE RESULTS.
-     *
-     * @param string $nickname
-     * @return boolean true if clear, false if blacklisted
-     */
-    static function allowed_nickname($nickname)
-    {
-        // XXX: should already be validated for size, content, etc.
-        $blacklist = common_config('nickname', 'blacklist');
-
-        //all directory and file names should be blacklisted
-        $d = dir(INSTALLDIR);
-        while (false !== ($entry = $d->read())) {
-            $blacklist[]=$entry;
-        }
-        $d->close();
-
-        //all top level names in the router should be blacklisted
-        $router = Router::get();
-        foreach(array_keys($router->m->getPaths()) as $path){
-            if(preg_match('/^\/(.*?)[\/\?]/',$path,$matches)){
-                $blacklist[]=$matches[1];
-            }
-        }
-        return !in_array($nickname, $blacklist);
-    }
-
     /**
      * Get the most recent notice posted by this user, if any.
      *
@@ -216,8 +179,7 @@ class User extends Managed_DataObject
      */
     function getCurrentNotice()
     {
-        $profile = $this->getProfile();
-        return $profile->getCurrentNotice();
+        return $this->getProfile()->getCurrentNotice();
     }
 
     function getCarrier()
@@ -227,8 +189,7 @@ class User extends Managed_DataObject
 
     function hasBlocked($other)
     {
-        $profile = $this->getProfile();
-        return $profile->hasBlocked($other);
+        return $this->getProfile()->hasBlocked($other);
     }
 
     /**
@@ -260,19 +221,18 @@ class User extends Managed_DataObject
 
         $profile = new Profile();
 
-        if(!empty($email))
-        {
+        if (!empty($email)) {
             $email = common_canonical_email($email);
         }
 
-        $nickname = common_canonical_nickname($nickname);
-        $profile->nickname = $nickname;
-        if(! User::allowed_nickname($nickname)){
-            common_log(LOG_WARNING, sprintf("Attempted to register a nickname that is not allowed: %s", $profile->nickname),
-                       __FILE__);
+        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;
         }
-        $profile->profileurl = common_profile_url($nickname);
+
+        $profile->profileurl = common_profile_url($profile->nickname);
 
         if (!empty($fullname)) {
             $profile->fullname = $fullname;
@@ -300,7 +260,7 @@ class User extends Managed_DataObject
 
         $user = new User();
 
-        $user->nickname = $nickname;
+        $user->nickname = $profile->nickname;
 
         $invite = null;
 
@@ -335,13 +295,12 @@ class User extends Managed_DataObject
 
         $user->created = common_sql_now();
 
-        if (Event::handle('StartUserRegister', array(&$user, &$profile))) {
+        if (Event::handle('StartUserRegister', array($profile))) {
 
             $profile->query('BEGIN');
 
             $id = $profile->insert();
-
-            if (empty($id)) {
+            if ($id === false) {
                 common_log_db_error($profile, 'INSERT', __FILE__);
                 return false;
             }
@@ -360,8 +319,9 @@ class User extends Managed_DataObject
 
             $result = $user->insert();
 
-            if (!$result) {
+            if ($result === false) {
                 common_log_db_error($user, 'INSERT', __FILE__);
+                $profile->query('ROLLBACK');
                 return false;
             }
 
@@ -390,6 +350,7 @@ class User extends Managed_DataObject
 
             if (!$result) {
                 common_log_db_error($subscription, 'INSERT', __FILE__);
+                $profile->query('ROLLBACK');
                 return false;
             }
 
@@ -411,6 +372,7 @@ class User extends Managed_DataObject
 
                 if (!$result) {
                     common_log_db_error($confirm, 'INSERT', __FILE__);
+                    $profile->query('ROLLBACK');
                     return false;
                 }
             }
@@ -459,7 +421,7 @@ class User extends Managed_DataObject
                 }
             }
 
-            Event::handle('EndUserRegister', array(&$profile, &$user));
+            Event::handle('EndUserRegister', array($profile));
         }
 
         return $user;
@@ -475,22 +437,27 @@ class User extends Managed_DataObject
 
         if ($invites->find()) {
             while ($invites->fetch()) {
-                $other = User::getKV($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;
+                }
             }
         }
     }
 
     function hasFave($notice)
     {
-        $profile = $this->getProfile();
-        return $profile->hasFave($notice);
+        return $this->getProfile()->hasFave($notice);
     }
 
     function mutuallySubscribed($other)
     {
-        $profile = $this->getProfile();
-        return $profile->mutuallySubscribed($other);
+        return $this->getProfile()->mutuallySubscribed($other);
     }
 
     function mutuallySubscribedUsers()
@@ -514,19 +481,17 @@ class User extends Managed_DataObject
     }
 
     function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
-        $profile = $this->getProfile();
-        return $profile->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id);
+        return $this->getProfile()->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id);
     }
 
     function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
     {
-        $profile = $this->getProfile();
-        return $profile->getNotices($offset, $limit, $since_id, $before_id);
+        return $this->getProfile()->getNotices($offset, $limit, $since_id, $before_id);
     }
 
     function favoriteNotices($own=false, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
     {
-        return Fave::stream($this->id, $offset, $limit, $own, $since_id, $max_id);
+        return $this->getProfile()->favoriteNotices($own, $offset, $limit, $since_id, $max_id);
     }
 
     function noticeInbox($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
@@ -572,8 +537,7 @@ class User extends Managed_DataObject
 
     function blowFavesCache()
     {
-        $profile = $this->getProfile();
-        $profile->blowFavesCache();
+        $this->getProfile()->blowFavesCache();
     }
 
     function getSelfTags()
@@ -632,11 +596,11 @@ class User extends Managed_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;
@@ -654,20 +618,17 @@ class User extends Managed_DataObject
 
     function isMember($group)
     {
-        $profile = $this->getProfile();
-        return $profile->isMember($group);
+        return $this->getProfile()->isMember($group);
     }
 
     function isAdmin($group)
     {
-        $profile = $this->getProfile();
-        return $profile->isAdmin($group);
+        return $this->getProfile()->isAdmin($group);
     }
 
     function getGroups($offset=0, $limit=null)
     {
-        $profile = $this->getProfile();
-        return $profile->getGroups($offset, $limit);
+        return $this->getProfile()->getGroups($offset, $limit);
     }
 
     /**
@@ -679,8 +640,7 @@ class User extends Managed_DataObject
      */
     function joinGroup(User_group $group)
     {
-        $profile = $this->getProfile();
-        return $profile->joinGroup($group);
+        return $this->getProfile()->joinGroup($group);
     }
 
     /**
@@ -690,76 +650,41 @@ class User extends Managed_DataObject
      */
     function leaveGroup(User_group $group)
     {
-        $profile = $this->getProfile();
-        return $profile->leaveGroup($group);
+        return $this->getProfile()->leaveGroup($group);
     }
 
-    function getSubscriptions($offset=0, $limit=null)
+    function getSubscribed($offset=0, $limit=null)
     {
-        $profile = $this->getProfile();
-        return $profile->getSubscriptions($offset, $limit);
+        return $this->getProfile()->getSubscribed($offset, $limit);
     }
 
     function getSubscribers($offset=0, $limit=null)
     {
-        $profile = $this->getProfile();
-        return $profile->getSubscribers($offset, $limit);
+        return $this->getProfile()->getSubscribers($offset, $limit);
     }
 
     function getTaggedSubscribers($tag, $offset=0, $limit=null)
     {
-        $qry =
-          'SELECT profile.* ' .
-          'FROM profile JOIN subscription ' .
-          'ON profile.id = subscription.subscriber ' .
-          'JOIN profile_tag ON (profile_tag.tagged = subscription.subscriber ' .
-          'AND profile_tag.tagger = subscription.subscribed) ' .
-          'WHERE subscription.subscribed = %d ' .
-          "AND profile_tag.tag = '%s' " .
-          'AND subscription.subscribed != subscription.subscriber ' .
-          'ORDER BY subscription.created DESC ';
-
-        if ($offset) {
-            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-        }
-
-        $profile = new Profile();
-
-        $cnt = $profile->query(sprintf($qry, $this->id, $profile->escape($tag)));
-
-        return $profile;
+        return $this->getProfile()->getTaggedSubscribers($tag, $offset, $limit);
     }
 
     function getTaggedSubscriptions($tag, $offset=0, $limit=null)
     {
-        $qry =
-          'SELECT profile.* ' .
-          'FROM profile JOIN subscription ' .
-          'ON profile.id = subscription.subscribed ' .
-          'JOIN profile_tag on (profile_tag.tagged = subscription.subscribed ' .
-          'AND profile_tag.tagger = subscription.subscriber) ' .
-          'WHERE subscription.subscriber = %d ' .
-          "AND profile_tag.tag = '%s' " .
-          'AND subscription.subscribed != subscription.subscriber ' .
-          'ORDER BY subscription.created DESC ';
-
-        $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-
-        $profile = new Profile();
-
-        $profile->query(sprintf($qry, $this->id, $profile->escape($tag)));
-
-        return $profile;
+        return $this->getProfile()->getTaggedSubscriptions($tag, $offset, $limit);
     }
 
     function hasRight($right)
     {
-        $profile = $this->getProfile();
-        return $profile->hasRight($right);
+        return $this->getProfile()->hasRight($right);
     }
 
-    function delete()
+    function delete($useWhere=false)
     {
+        if (empty($this->id)) {
+            common_log(LOG_WARNING, "Ambiguous User->delete(); skipping related tables.");
+            return parent::delete($useWhere);
+        }
+
         try {
             $profile = $this->getProfile();
             $profile->delete();
@@ -785,7 +710,7 @@ class User extends Managed_DataObject
         $this->_deleteTags();
         $this->_deleteBlocks();
 
-        parent::delete();
+        return parent::delete($useWhere);
     }
 
     function _deleteTags()
@@ -805,32 +730,27 @@ class User extends Managed_DataObject
 
     function hasRole($name)
     {
-        $profile = $this->getProfile();
-        return $profile->hasRole($name);
+        return $this->getProfile()->hasRole($name);
     }
 
     function grantRole($name)
     {
-        $profile = $this->getProfile();
-        return $profile->grantRole($name);
+        return $this->getProfile()->grantRole($name);
     }
 
     function revokeRole($name)
     {
-        $profile = $this->getProfile();
-        return $profile->revokeRole($name);
+        return $this->getProfile()->revokeRole($name);
     }
 
     function isSandboxed()
     {
-        $profile = $this->getProfile();
-        return $profile->isSandboxed();
+        return $this->getProfile()->isSandboxed();
     }
 
     function isSilenced()
     {
-        $profile = $this->getProfile();
-        return $profile->isSilenced();
+        return $this->getProfile()->isSilenced();
     }
 
     function repeatedByMe($offset=0, $limit=20, $since_id=null, $max_id=null)
@@ -854,53 +774,31 @@ class User extends Managed_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 = common_config('location', 'sharedefault');
-
-            // Check if user has a personal setting for this
-            $prefs = User_location_prefs::getKV('user_id', $this->id);
-
-            if (!empty($prefs)) {
-                $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::getKV('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.'));
     }
 
     /**
@@ -913,35 +811,23 @@ class User extends Managed_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::getKV('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();
     }
 
     /**