]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Make site profiles work
authorZach Copley <zach@status.net>
Sat, 27 Aug 2011 04:10:24 +0000 (21:10 -0700)
committerZach Copley <zach@status.net>
Sat, 27 Aug 2011 04:10:24 +0000 (21:10 -0700)
install.php
lib/installer.php
lib/siteprofile.php [new file with mode: 0644]
lib/statusnet.php

index fdcbce84c91b41f9b9931455acb754f7dc152167..054be3d8d723a66783d612f893154af51115f9fb 100644 (file)
@@ -249,11 +249,11 @@ class WebInstaller extends Installer
                 </ul>
             </fieldset>
             <fieldset id="settings_profile">
-                <legend>Installation profile</legend>
+                <legend>Site profile</legend>
                 <ul class="form_data">
                     <li>
-                        <label for="profile">Profile</label>
-                        <select id="profile" name="profile">
+                        <label for="site_profile">Type of site</label>
+                        <select id="site_profile" name="site_profile">
                             <option value="private">Private</option>
                             <option value="community">Community</option>
                             <option value ="public">Public</option>
@@ -298,7 +298,7 @@ STR;
     /**
      * Read and validate input data.
      * May output side effects.
-     * 
+     *
      * @return boolean success
      */
     function prepare()
@@ -318,6 +318,8 @@ STR;
         $this->adminEmail   = $post->string('admin_email');
         $this->adminUpdates = $post->string('admin_updates');
 
+        $this->siteProfile = $post->string('site_profile');
+
         $this->server = $_SERVER['HTTP_HOST'];
         $this->path = substr(dirname($_SERVER['PHP_SELF']), 1);
 
@@ -329,12 +331,16 @@ STR;
         if (!$this->validateAdmin()) {
             $fail = true;
         }
-        
+
         if ($this->adminPass != $adminPass2) {
             $this->updateStatus("Administrator passwords do not match. Did you mistype?", true);
             $fail = true;
         }
-        
+
+        if (!$this->validateSiteProfile()) {
+            $fail = true;
+        }
+
         return !$fail;
     }
 
@@ -373,11 +379,11 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
               <div id="content_wrapper">
                <div id="site_nav_local_views_wrapper">
                 <div id="site_nav_local_views"></div>
-                
+
                 <div id="content">
                      <div id="content_inner">
                         <h1>Install StatusNet</h1>
-<?php 
+<?php
 $installer = new WebInstaller();
 $installer->main();
 ?>
index 6f58b247b53a9e4ed6b7362b3a484eac9ae98f06..0f6af0237830ae28bcb0923e23404b522dec7cc1 100644 (file)
@@ -42,7 +42,7 @@
 abstract class Installer
 {
     /** Web site info */
-    public $sitename, $server, $path, $fancy;
+    public $sitename, $server, $path, $fancy, $siteProfile;
     /** DB info */
     public $host, $database, $dbtype, $username, $password, $db;
     /** Administrator info */
@@ -73,7 +73,7 @@ abstract class Installer
         error_reporting($old);
         return $ok;
     }
-    
+
     /**
      * Check if all is ready for installation
      *
@@ -185,7 +185,7 @@ abstract class Installer
     /**
      * Basic validation on the database paramters
      * Side effects: error output if not valid
-     * 
+     *
      * @return boolean success
      */
     function validateDb()
@@ -218,7 +218,7 @@ abstract class Installer
     /**
      * Basic validation on the administrator user paramters
      * Side effects: error output if not valid
-     * 
+     *
      * @return boolean success
      */
     function validateAdmin()
@@ -251,10 +251,29 @@ abstract class Installer
         return !$fail;
     }
 
+    /**
+     * Make sure a site profile was selected
+     *
+     * @return type boolean success
+     */
+    function validateSiteProfile()
+    {
+        $fail = false;
+
+        $sprofile = $this->siteProfile;
+
+        if (empty($sprofile))  {
+            $this->updateStatus("No site profile selected.", true);
+            $fail = true;
+        }
+
+        return !$fail;
+    }
+
     /**
      * Set up the database with the appropriate function for the selected type...
      * Saves database info into $this->db.
-     * 
+     *
      * @fixme escape things in the connection string in case we have a funny pass etc
      * @return mixed array of database connection params on success, false on failure
      */
@@ -316,7 +335,7 @@ abstract class Installer
      * Open a connection to the database.
      *
      * @param <type> $dsn
-     * @return <type> 
+     * @return <type>
      */
     function connectDatabase($dsn)
     {
@@ -384,7 +403,7 @@ abstract class Installer
      * Write a stock configuration file.
      *
      * @return boolean success
-     * 
+     *
      * @fixme escape variables in output in case we have funny chars, apostrophes etc
      */
     function writeConf()
@@ -395,6 +414,7 @@ abstract class Installer
             'path' => $this->path,
             'db_database' => $this->db['database'],
             'db_type' => $this->db['type'],
+            'site_profile' => $this->siteProfile
         ));
 
         // assemble configuration file in a string
@@ -414,7 +434,10 @@ abstract class Installer
                 // database
                 "\$config['db']['database'] = {$vals['db_database']};\n\n".
                 ($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
-                "\$config['db']['type'] = {$vals['db_type']};\n\n";
+                "\$config['db']['type'] = {$vals['db_type']};\n\n".
+
+                // site profile
+                "\$config['site']['profile'] = {$vals['site_profile']};\n\n";
 
         // Normalize line endings for Windows servers
         $cfg = str_replace("\n", PHP_EOL, $cfg);
@@ -479,7 +502,7 @@ abstract class Installer
         $user->grantRole('owner');
         $user->grantRole('moderator');
         $user->grantRole('administrator');
-        
+
         // Attempt to do a remote subscribe to update@status.net
         // Will fail if instance is on a private network.
 
@@ -499,9 +522,9 @@ abstract class Installer
     /**
      * The beef of the installer!
      * Create database, config file, and admin user.
-     * 
+     *
      * Prerequisites: validation of input data.
-     * 
+     *
      * @return boolean success
      */
     function doInstall()
diff --git a/lib/siteprofile.php b/lib/siteprofile.php
new file mode 100644 (file)
index 0000000..53e6482
--- /dev/null
@@ -0,0 +1,264 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * A site profile is a set of default settings for a particular style of
+ * StatusNet site: public, private, community, etc.
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Installation
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2011 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+/**
+ * Helper class for getting the settings for a particular site profile
+ */
+class SiteProfile
+{
+    /**
+     * Returns the config settings for a site profile by name
+     *
+     * @param  string $name name of a site profile
+     * @return array  config settings
+     */
+    static public function getSettings($name)
+    {
+        $sprofileClass = ucfirst($name) . "Site";
+
+        if (class_exists($sprofileClass)) {
+            return $sprofileClass::getSettings();
+        } else {
+            common_log(
+                LOG_ERR,
+                "Unknown site profile '{$name}' specified in config file.",
+                __FILE__
+            );
+            return array();
+        }
+    }
+}
+
+/**
+ * Site profile settings contain the list of the default settings (and
+ * possibly other information for a particular flavor of StatusNet
+ * installation). These will overwrite base defaults in $config global.
+ *
+ * @category Installation
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+abstract class SiteProfileSettings
+{
+    abstract static function getSettings();
+}
+
+/**
+ * Settings for a 'public' site
+ */
+class PublicSite extends SiteProfileSettings
+{
+    /**
+     * Get the settings for this site profile
+     *
+     * @return type array   an array of settings
+     */
+    static function getSettings() {
+        return array(
+            'site' => array(
+                'inviteonly' => false,
+                'private'    => false
+                ),
+            'plugins' => array(
+                'default' => array(
+                    'Activity'                => null,
+                    'Bookmark'                => null,
+                    'ClientSideShorten'       => null,
+                    'Directory'               => null,
+                    'Event'                   => null,
+                    'ExtendedProfile'         => null,
+                    'Geonames'                => null,
+                    'Gravatar'                => null,
+                    'OpenID'                  => null,
+                    'OStatus'                 => null,
+                    'Poll'                    => null,
+                    'QnA'                     => null,
+                    'SearchSub'               => null,
+                    'StrictTransportSecurity' => null,
+                    'TagSub'                  => null
+                ),
+            'discovery' =>
+                array('cors' => true) // Allow Cross-Origin Resource Sharing for service discovery (host-meta, XRD, etc.)
+            )
+        );
+    }
+}
+
+/**
+ * Settings for a 'private' site
+ *
+ * // XXX Too business oriented?
+ */
+class PrivateSite extends SiteProfileSettings
+{
+    /**
+     * Get the settings for this site profile
+     *
+     * @return type array  an array of settings
+     */
+    static function getSettings() {
+        return array(
+            'site' => array(
+                'inviteonly' => true,
+                'private'    => true
+                ),
+            'plugins' => array(
+                'default' => array(
+                    'Activity'                => null,
+                    'Bookmark'                => null,
+                    'ClientSideShorten'       => null,
+                    'Directory'               => null,
+                    'Event'                   => null,
+                    'ExtendedProfile'         => null,
+                    'EmailRegistration'       => null,
+                    'Geonames'                => null,
+                    'Gravatar'                => null,
+                    'NewMenu'                 => null,
+                    'MobileProfile'           => null,
+                    'OpenID'                  => null,
+                    'Poll'                    => null,
+                    'QnA'                     => null,
+                    'SearchSub'               => null,
+                    'StrictTransportSecurity' => null,
+                    'TagSub'                  => null
+                )
+             ),
+            'profile'       => array('delete' => 'true'),
+            'license'       => array('type'   => 'private'),
+            'attachments'   => array(
+                // Only allow uploads of pictures and MS Office files
+                'supported' => array(
+                    'image/png',
+                    'image/jpeg',
+                    'image/gif',
+                    'image/svg+xml',
+                    'application/pdf',
+                    'application/msword',
+                    'application/vnd.ms-office',
+                    'application/vnd.ms-excel',
+                    'application/vnd.ms-powerpoint',
+                    'application/ogg'
+                )
+             ),
+            'discovery' => array('cors'   => false) // Allow Cross-Origin Resource Sharing for service discovery (host-meta, XRD, etc.)
+        );
+    }
+}
+
+/**
+ * Settings for a 'community' site
+ */
+class CommunitySite extends SiteProfileSettings
+{
+    /**
+     * Get the settings for this site profile
+     *
+     * @return type array  an array of settings
+     */
+    static function getSettings() {
+        return array(
+            'site' => array(
+                'inviteonly' => true,
+                'private'    => false
+                ),
+            'plugins' => array(
+                'default' => array(
+                    'Activity'                => null,
+                    'Bookmark'                => null,
+                    'ClientSideShorten'       => null,
+                    'Directory'               => null,
+                    'Event'                   => null,
+                    'Geonames'                => null,
+                    'Gravatar'                => null,
+                    'OpenID'                  => null,
+                    'OStatus'                 => null,
+                    'Poll'                    => null,
+                    'QnA'                     => null,
+                    'SearchSub'               => null,
+                    'StrictTransportSecurity' => null,
+                    'TagSub'                  => null
+                ),
+            'discovery' =>
+                array('cors' => true) // Allow Cross-Origin Resource Sharing for service discovery (host-meta, XRD, etc.)
+            )
+        );
+    }
+
+}
+
+/**
+ * Settings for a 'singleuser' site
+ */
+class SingleuserSite extends SiteProfileSettings
+{
+    /**
+     * Get the settings for this site profile
+     *
+     * @return type array  an array of settings
+     */
+    static function getSettings() {
+        return array(
+            'singleuser' => array('enabled' => true),
+            'site' => array(
+                'private'    => false,
+                'closed'     => true,
+                ),
+            'plugins' => array(
+                'default' => array(
+                    'Activity'                => null,
+                    'Bookmark'                => null,
+                    'ClientSideShorten'       => null,
+                    'Event'                   => null,
+                    'Geonames'                => null,
+                    'NewMenu'                 => null,
+                    'MobileProfile'           => null,
+                    'OpenID'                  => null,
+                    'OStatus'                 => null,
+                    'Poll'                    => null,
+                    'QnA'                     => null,
+                    'SearchSub'               => null,
+                    'StrictTransportSecurity' => null,
+                    'TagSub'                  => null,
+                    'TwitterBridge'           => null,
+                    'FacebookBridge'          => null
+                ),
+            'discovery' =>
+                array('cors' => true) // Allow Cross-Origin Resource Sharing for service discovery (host-meta, XRD, etc.)
+            )
+        );
+    }
+
+}
index ce0d41e51e7e94afac47a3b22a93574f54e4843a..846d525c385a395a3331d5cefa80a953c0c0ba43 100644 (file)
@@ -113,6 +113,10 @@ class StatusNet
         StatusNet::initDefaults($server, $path);
         StatusNet::loadConfigFile($conffile);
 
+        $sprofile = common_config('site', 'profile');
+        if (!empty($sprofile)) {
+            StatusNet::loadSiteProfile($sprofile);
+        }
         // Load settings from database; note we need autoload for this
         Config::loadSettings();
 
@@ -302,6 +306,13 @@ class StatusNet
         }
     }
 
+    public static function loadSiteProfile($name)
+    {
+        global $config;
+        $settings = SiteProfile::getSettings($name);
+        $config = array_replace_recursive($config, $settings);
+    }
+
     protected function _sn_to_path($sn)
     {
         $past_root = substr($sn, 1);