123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589 |
- <?php
- /**
- * A Site entity.
- *
- * \ElggSite represents a single site entity.
- *
- * An \ElggSite object is an \ElggEntity child class with the subtype
- * of "site." It is created upon installation and holds information about a site:
- * - name
- * - description
- * - url
- *
- * Every \ElggEntity belongs to a site.
- *
- * @note Internal: \ElggSite represents a single row from the sites_entity
- * table, as well as the corresponding \ElggEntity row from the entities table.
- *
- * @warning Multiple site support isn't fully developed.
- *
- * @package Elgg.Core
- * @subpackage DataMode.Site
- * @link http://learn.elgg.org/en/stable/design/database.html
- *
- * @property string $name The name or title of the website
- * @property string $description A motto, mission statement, or description of the website
- * @property string $url The root web address for the site, including trailing slash
- */
- class ElggSite extends \ElggEntity {
- /**
- * Initialize the attributes array.
- * This is vital to distinguish between metadata and base attributes.
- *
- * @return void
- */
- protected function initializeAttributes() {
- parent::initializeAttributes();
- $this->attributes['type'] = "site";
- $this->attributes += self::getExternalAttributes();
- $this->tables_split = 2;
- }
- /**
- * Get default values for attributes stored in a separate table
- *
- * @return array
- * @access private
- *
- * @see \Elgg\Database\EntityTable::getEntities
- */
- final public static function getExternalAttributes() {
- return [
- 'name' => null,
- 'description' => null,
- 'url' => null,
- ];
- }
- /**
- * Create a new \ElggSite.
- *
- * Plugin developers should only use the constructor to create a new entity.
- * To retrieve entities, use get_entity() and the elgg_get_entities* functions.
- *
- * @param \stdClass $row Database row result. Default is null to create a new site.
- *
- * @throws IOException If cannot load remaining data from db
- * @throws InvalidParameterException If not passed a db result
- */
- public function __construct($row = null) {
- $this->initializeAttributes();
- // compatibility for 1.7 api.
- $this->initialise_attributes(false);
- if (!empty($row)) {
- // Is $row is a DB entity table row
- if ($row instanceof \stdClass) {
- // Load the rest
- if (!$this->load($row)) {
- $msg = "Failed to load new " . get_class() . " for GUID:" . $row->guid;
- throw new \IOException($msg);
- }
- } else if ($row instanceof \ElggSite) {
- // $row is an \ElggSite so this is a copy constructor
- elgg_deprecated_notice('This type of usage of the \ElggSite constructor was deprecated. Please use the clone method.', 1.7);
- foreach ($row->attributes as $key => $value) {
- $this->attributes[$key] = $value;
- }
- } else if (strpos($row, "http") !== false) {
- // url so retrieve by url
- elgg_deprecated_notice("Passing URL to constructor is deprecated. Use get_site_by_url()", 1.9);
- $row = get_site_by_url($row);
- foreach ($row->attributes as $key => $value) {
- $this->attributes[$key] = $value;
- }
- } else if (is_numeric($row)) {
- // $row is a GUID so load
- elgg_deprecated_notice('Passing a GUID to constructor is deprecated. Use get_entity()', 1.9);
- if (!$this->load($row)) {
- throw new \IOException("Failed to load new " . get_class() . " from GUID:" . $row);
- }
- } else {
- throw new \InvalidParameterException("Unrecognized value passed to constuctor.");
- }
- }
- }
- /**
- * Loads the full \ElggSite when given a guid.
- *
- * @param mixed $guid GUID of \ElggSite entity or database row object
- *
- * @return bool
- * @throws InvalidClassException
- */
- protected function load($guid) {
- $attr_loader = new \Elgg\AttributeLoader(get_class(), 'site', $this->attributes);
- $attr_loader->requires_access_control = !($this instanceof \ElggPlugin);
- $attr_loader->secondary_loader = 'get_site_entity_as_row';
- $attrs = $attr_loader->getRequiredAttributes($guid);
- if (!$attrs) {
- return false;
- }
- $this->attributes = $attrs;
- $this->tables_loaded = 2;
- $this->loadAdditionalSelectValues($attr_loader->getAdditionalSelectValues());
- _elgg_cache_entity($this);
- return true;
- }
- /**
- * {@inheritdoc}
- */
- protected function create() {
- global $CONFIG;
- $guid = parent::create();
- $name = sanitize_string($this->attributes['name']);
- $description = sanitize_string($this->attributes['description']);
- $url = sanitize_string($this->attributes['url']);
- $query = "INSERT into {$CONFIG->dbprefix}sites_entity
- (guid, name, description, url) values ($guid, '$name', '$description', '$url')";
- $result = $this->getDatabase()->insertData($query);
- if ($result === false) {
- // TODO(evan): Throw an exception here?
- return false;
- }
- // make sure the site guid is set to self if not already set
- if (!$this->site_guid) {
- $this->site_guid = $guid;
- $this->getDatabase()->updateData("UPDATE {$CONFIG->dbprefix}entities
- SET site_guid = $guid WHERE guid = $guid");
- }
- return $guid;
- }
- /**
- * {@inheritdoc}
- */
- protected function update() {
- global $CONFIG;
- if (!parent::update()) {
- return false;
- }
- $guid = (int)$this->guid;
- $name = sanitize_string($this->name);
- $description = sanitize_string($this->description);
- $url = sanitize_string($this->url);
- $query = "UPDATE {$CONFIG->dbprefix}sites_entity
- SET name='$name', description='$description', url='$url' WHERE guid=$guid";
- return $this->getDatabase()->updateData($query) !== false;
- }
- /**
- * Delete the site.
- *
- * @note You cannot delete the current site.
- *
- * @return bool
- * @throws SecurityException
- */
- public function delete() {
- global $CONFIG;
- if ($CONFIG->site->getGUID() == $this->guid) {
- throw new \SecurityException('You cannot delete the current site');
- }
- return parent::delete();
- }
- /**
- * Disable the site
- *
- * @note You cannot disable the current site.
- *
- * @param string $reason Optional reason for disabling
- * @param bool $recursive Recursively disable all contained entities?
- *
- * @return bool
- * @throws SecurityException
- */
- public function disable($reason = "", $recursive = true) {
- global $CONFIG;
- if ($CONFIG->site->getGUID() == $this->guid) {
- throw new \SecurityException('You cannot disable the current site');
- }
- return parent::disable($reason, $recursive);
- }
-
- /**
- * Returns the URL for this site
- *
- * @return string The URL
- */
- public function getURL() {
- return $this->url;
- }
- /**
- * {@inheritdoc}
- */
- public function getDisplayName() {
- return $this->name;
- }
- /**
- * {@inheritdoc}
- */
- public function setDisplayName($displayName) {
- $this->name = $displayName;
- }
- /**
- * Gets an array of \ElggUser entities who are members of the site.
- *
- * @param array $options An associative array for key => value parameters
- * accepted by elgg_get_entities(). Common parameters
- * include 'limit', and 'offset'.
- * Note: this was $limit before version 1.8
- * @param int $offset Offset @deprecated parameter
- *
- * @return array of \ElggUsers
- * @deprecated 1.9 Use \ElggSite::getEntities()
- */
- public function getMembers($options = array(), $offset = 0) {
- elgg_deprecated_notice('\ElggSite::getMembers() is deprecated. Use \ElggSite::getEntities()', 1.9);
- if (!is_array($options)) {
- elgg_deprecated_notice("\ElggSite::getMembers uses different arguments!", 1.8);
- $options = array(
- 'limit' => $options,
- 'offset' => $offset,
- );
- }
- $defaults = array(
- 'site_guids' => ELGG_ENTITIES_ANY_VALUE,
- 'relationship' => 'member_of_site',
- 'relationship_guid' => $this->getGUID(),
- 'inverse_relationship' => true,
- 'type' => 'user',
- );
- $options = array_merge($defaults, $options);
- return elgg_get_entities_from_relationship($options);
- }
- /**
- * List the members of this site
- *
- * @param array $options An associative array for key => value parameters
- * accepted by elgg_list_entities(). Common parameters
- * include 'full_view', 'limit', and 'offset'.
- *
- * @return string
- * @since 1.8.0
- * @deprecated 1.9 Use elgg_list_entities_from_relationship()
- */
- public function listMembers($options = array()) {
- elgg_deprecated_notice('\ElggSite::listMembers() is deprecated. Use elgg_list_entities_from_relationship()', 1.9);
- $defaults = array(
- 'site_guids' => ELGG_ENTITIES_ANY_VALUE,
- 'relationship' => 'member_of_site',
- 'relationship_guid' => $this->getGUID(),
- 'inverse_relationship' => true,
- 'type' => 'user',
- );
- $options = array_merge($defaults, $options);
- return elgg_list_entities_from_relationship($options);
- }
- /**
- * Adds an entity to the site.
- *
- * This adds a 'member_of_site' relationship between between the entity and
- * the site. It does not change the site_guid of the entity.
- *
- * @param \ElggEntity $entity User, group, or object entity
- *
- * @return bool
- */
- public function addEntity(\ElggEntity $entity) {
- if (elgg_instanceof($entity, 'site')) {
- return false;
- }
- return add_entity_relationship($entity->guid, "member_of_site", $this->guid);
- }
- /**
- * Removes an entity from this site
- *
- * @param \ElggEntity $entity User, group, or object entity
- *
- * @return bool
- */
- public function removeEntity($entity) {
- if (elgg_instanceof($entity, 'site')) {
- return false;
- }
- return remove_entity_relationship($entity->guid, "member_of_site", $this->guid);
- }
- /**
- * Get an array of entities that belong to the site.
- *
- * This only returns entities that have been explicitly added to the
- * site through addEntity().
- *
- * @param array $options Options array for elgg_get_entities_from_relationship()
- * Parameters set automatically by this method:
- * 'relationship', 'relationship_guid', 'inverse_relationship'
- * @return array
- */
- public function getEntities(array $options = array()) {
- $options['relationship'] = 'member_of_site';
- $options['relationship_guid'] = $this->guid;
- $options['inverse_relationship'] = true;
- if (!isset($options['site_guid']) || !isset($options['site_guids'])) {
- $options['site_guids'] = ELGG_ENTITIES_ANY_VALUE;
- }
- return elgg_get_entities_from_relationship($options);
- }
- /**
- * Adds a user to the site.
- *
- * @param int $user_guid GUID
- *
- * @return bool
- * @deprecated 1.9 Use \ElggSite::addEntity()
- */
- public function addUser($user_guid) {
- elgg_deprecated_notice('\ElggSite::addUser() is deprecated. Use \ElggEntity::addEntity()', 1.9);
- return add_site_user($this->getGUID(), $user_guid);
- }
- /**
- * Removes a user from the site.
- *
- * @param int $user_guid GUID
- *
- * @return bool
- * @deprecated 1.9 Use \ElggSite::removeEntity()
- */
- public function removeUser($user_guid) {
- elgg_deprecated_notice('\ElggSite::removeUser() is deprecated. Use \ElggEntity::removeEntity()', 1.9);
- return remove_site_user($this->getGUID(), $user_guid);
- }
- /**
- * Returns an array of \ElggObject entities that belong to the site.
- *
- * @warning This only returns objects that have been explicitly added to the
- * site through addObject()
- *
- * @param string $subtype Entity subtype
- * @param int $limit Limit
- * @param int $offset Offset
- *
- * @return array
- * @deprecated 1.9 Use \ElggSite:getEntities()
- */
- public function getObjects($subtype = "", $limit = 10, $offset = 0) {
- elgg_deprecated_notice('\ElggSite::getObjects() is deprecated. Use \ElggSite::getEntities()', 1.9);
- return get_site_objects($this->getGUID(), $subtype, $limit, $offset);
- }
- /**
- * Adds an object to the site.
- *
- * @param int $object_guid GUID
- *
- * @return bool
- * @deprecated 1.9 Use \ElggSite::addEntity()
- */
- public function addObject($object_guid) {
- elgg_deprecated_notice('\ElggSite::addObject() is deprecated. Use \ElggEntity::addEntity()', 1.9);
- return add_site_object($this->getGUID(), $object_guid);
- }
- /**
- * Remvoes an object from the site.
- *
- * @param int $object_guid GUID
- *
- * @return bool
- * @deprecated 1.9 Use \ElggSite::removeEntity()
- */
- public function removeObject($object_guid) {
- elgg_deprecated_notice('\ElggSite::removeObject() is deprecated. Use \ElggEntity::removeEntity()', 1.9);
- return remove_site_object($this->getGUID(), $object_guid);
- }
- /**
- * Get the collections associated with a site.
- *
- * @param string $subtype Subtype
- * @param int $limit Limit
- * @param int $offset Offset
- *
- * @return mixed
- * @deprecated 1.8 Was never implemented
- */
- public function getCollections($subtype = "", $limit = 10, $offset = 0) {
- elgg_deprecated_notice("ElggSite::getCollections() is deprecated", 1.8);
- get_site_collections($this->getGUID(), $subtype, $limit, $offset);
- }
- /**
- * {@inheritdoc}
- */
- protected function prepareObject($object) {
- $object = parent::prepareObject($object);
- $object->name = $this->getDisplayName();
- $object->description = $this->description;
- unset($object->read_access);
- return $object;
- }
- /*
- * EXPORTABLE INTERFACE
- */
- /**
- * Return an array of fields which can be exported.
- *
- * @return array
- * @deprecated 1.9 Use toObject()
- */
- public function getExportableValues() {
- return array_merge(parent::getExportableValues(), array(
- 'name',
- 'description',
- 'url',
- ));
- }
- /**
- * Get the domain for this site
- *
- * @return string
- * @since 1.9
- */
- public function getDomain() {
- $breakdown = parse_url($this->url);
- return $breakdown['host'];
- }
- /**
- * Halts bootup and redirects to the site front page
- * if site is in walled garden mode, no user is logged in,
- * and the URL is not a public page.
- *
- * @return void
- * @since 1.8.0
- */
- public function checkWalledGarden() {
- global $CONFIG;
- // command line calls should not invoke the walled garden check
- if (PHP_SAPI === 'cli') {
- return;
- }
- if ($CONFIG->walled_garden) {
- if ($CONFIG->default_access == ACCESS_PUBLIC) {
- $CONFIG->default_access = ACCESS_LOGGED_IN;
- }
- _elgg_services()->hooks->registerHandler(
- 'access:collections:write',
- 'all',
- '_elgg_walled_garden_remove_public_access',
- 9999);
- if (!_elgg_services()->session->isLoggedIn()) {
- // override the front page
- elgg_register_page_handler('', '_elgg_walled_garden_index');
- if (!$this->isPublicPage()) {
- if (!elgg_is_xhr()) {
- _elgg_services()->session->set('last_forward_from', current_page_url());
- }
- register_error(_elgg_services()->translator->translate('loggedinrequired'));
- forward('', 'walled_garden');
- }
- }
- }
- }
- /**
- * Returns if a URL is public for this site when in Walled Garden mode.
- *
- * Pages are registered to be public by {@elgg_plugin_hook public_pages walled_garden}.
- *
- * @param string $url Defaults to the current URL.
- *
- * @return bool
- * @since 1.8.0
- */
- public function isPublicPage($url = '') {
- global $CONFIG;
- if (empty($url)) {
- $url = current_page_url();
- // do not check against URL queries
- if ($pos = strpos($url, '?')) {
- $url = substr($url, 0, $pos);
- }
- }
- // always allow index page
- if ($url == _elgg_services()->config->getSiteUrl($this->guid)) {
- return true;
- }
- // default public pages
- $defaults = array(
- 'walled_garden/.*',
- 'action/.*',
- 'login',
- 'register',
- 'forgotpassword',
- 'changepassword',
- 'refresh_token',
- 'ajax/view/js/languages',
- 'upgrade\.php',
- 'css/.*',
- 'js/.*',
- 'cache/[0-9]+/\w+/js|css/.*',
- 'cron/.*',
- 'services/.*',
- );
- // include a hook for plugin authors to include public pages
- $plugins = _elgg_services()->hooks->trigger('public_pages', 'walled_garden', null, array());
- // allow public pages
- foreach (array_merge($defaults, $plugins) as $public) {
- $pattern = "`^{$CONFIG->url}$public/*$`i";
- if (preg_match($pattern, $url)) {
- return true;
- }
- }
- // non-public page
- return false;
- }
- }
|