owncloud/core

View on GitHub
apps/federatedfilesharing/lib/Address.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * @author Viktar Dubiniuk <dubiniuk@owncloud.com>
 *
 * @copyright Copyright (c) 2018, ownCloud GmbH
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program 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, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 */

namespace OCA\FederatedFileSharing;

/**
 * Class Address
 *
 * @package OCA\FederatedFileSharing
 */
class Address {
    /**
     * @var string
     */
    protected $cloudId;

    /**
     * @var string
     */
    protected $displayName;

    /**
     * Address constructor.
     *
     * @param string $cloudId
     * @param string $displayName
     */
    public function __construct($cloudId, $displayName = '') {
        $this->cloudId = $cloudId;
        $this->displayName = $displayName;
    }

    /**
     * Get user federated id
     *
     * @return string
     */
    public function getCloudId() {
        $origin = $this->getOrigin();
        $userId = $this->getUserId();
        return "{$userId}@{$origin}";
    }

    /**
     * Get user id
     *
     * @return string
     */
    public function getUserId() {
        // userId is everything except the last part
        $parts = \explode('@', $this->cloudId);
        \array_pop($parts);
        return \implode('@', $parts);
    }

    /**
     * Get user host without protocol, index.php and a trailing slash
     *
     * @return string
     */
    public function getHostName() {
        // hostname is the last part
        $origin = $this->getCleanOrigin();

        // replace all characters before :// and :// itself
        return \preg_replace('|^(.*?://)|', '', $origin);
    }

    /**
     * Get user host with protocol but without trailing slash and index.php
     *
     * @return string
     */
    public function getOrigin() {
        return $this->getCleanOrigin();
    }

    /**
     * Get user display name, fallback to userId if it is empty
     *
     * @return string
     */
    public function getDisplayName() {
        return ($this->displayName !== '') ? $this->displayName : $this->getUserId();
    }

    /**
     * Checks if the user and host is the same with another address
     *
     * @param Address $address
     *
     * @return bool
     */
    public function equalTo(Address $address) {
        $thisUserId = $this->translateUid($this->getUserId());
        $otherUserId = $this->translateUid($address->getUserId());
        return $this->getHostName() === $address->getHostName()
            && $thisUserId === $otherUserId;
    }

    /**
     * Some kind of ancient magic that was copypasted here and there
     *
     * @return mixed
     */
    public function toLocalUid() {
        return $this->translateUid($this->getUserId());
    }

    /**
     * Cut index.php and trailing slash from remote URL
     *
     * @return string
     */
    protected function getCleanOrigin() {
        //Origin is the last part
        $parts = \explode('@', $this->cloudId);
        $rawOrigin = \array_pop($parts);
        // cut query and|or anchor part off
        $rawOrigin = \strtok($rawOrigin, '?#');
        if ($fileNamePosition = \strpos($rawOrigin, '/index.php')) {
            $rawOrigin = \substr($rawOrigin, 0, $fileNamePosition);
        }

        $normalizedOrigin = \rtrim(
            \strtolower($rawOrigin),
            '/'
        );

        return $normalizedOrigin;
    }

    /**
     * @param string $uid
     * @return mixed
     */
    protected function translateUid($uid) {
        // FIXME this should be a method in the user management instead
        // Move to a helper instead of C&P meanwhile?
        $handled = false;
        // the $handled var will be sent as reference so the listeners can use it as a flag
        // in order to know if the event has been processed already or not.
        \OCP\Util::emitHook(
            '\OCA\Files_Sharing\API\Server2Server',
            'preLoginNameUsedAsUserName',
            ['uid' => &$uid, 'hasBeenHandled' => &$handled]
        );
        return $uid;
    }
}