2009-11-14 16:38:10 +00:00
2009-04-15 07:38:05 +01:00
< ? php
2009-09-16 00:31:09 +01:00
/**
2009-08-25 23:14:12 +01:00
* StatusNet - the distributed open - source microblogging tool
2009-08-25 23:12:20 +01:00
* Copyright ( C ) 2009 , StatusNet , Inc .
2009-04-15 07:38:05 +01:00
*
* 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 />.
2009-09-16 00:31:09 +01:00
*
2009-09-13 06:43:02 +01:00
* @ category Installation
* @ package Installation
2009-09-16 00:31:09 +01:00
*
2009-09-14 08:19:11 +01:00
* @ author Adrian Lang < mail @ adrianlang . de >
* @ author Brenda Wallace < shiny @ cpan . org >
* @ author Brett Taylor < brett @ webfroot . co . nz >
* @ author Brion Vibber < brion @ pobox . com >
* @ author CiaranG < ciaran @ ciarang . com >
* @ author Craig Andrews < candrews @ integralblue . com >
2009-11-14 16:38:10 +00:00
* @ author Eric Helgeson < helfire @ Erics - MBP . local >
2009-09-16 03:28:59 +01:00
* @ author Evan Prodromou < evan @ status . net >
2009-09-14 08:19:11 +01:00
* @ author Robin Millette < millette @ controlyourself . ca >
2009-09-16 10:14:26 +01:00
* @ author Sarven Capadisli < csarven @ status . net >
2009-09-14 08:19:11 +01:00
* @ author Tom Adams < tom @ holizz . com >
2010-03-04 07:26:45 +00:00
* @ author Zach Copley < zach @ status . net >
2009-09-14 08:19:11 +01:00
* @ license GNU Affero General Public License http :// www . gnu . org / licenses /
2009-10-03 05:36:53 +01:00
* @ version 0.9 . x
2009-09-19 05:01:42 +01:00
* @ link http :// status . net
2009-04-15 07:38:05 +01:00
*/
2009-09-16 00:31:09 +01:00
2009-03-01 04:33:22 +00:00
define ( 'INSTALLDIR' , dirname ( __FILE__ ));
2009-08-27 00:08:30 +01:00
$external_libraries = array (
array (
'name' => 'gettext' ,
'url' => 'http://us.php.net/manual/en/book.gettext.php' ,
'check_function' => 'gettext'
),
array (
'name' => 'PEAR' ,
'url' => 'http://pear.php.net/' ,
'deb' => 'php-pear' ,
'include' => 'PEAR.php' ,
'check_class' => 'PEAR'
),
array (
'name' => 'DB' ,
'pear' => 'DB' ,
'url' => 'http://pear.php.net/package/DB' ,
'deb' => 'php-db' ,
'include' => 'DB/common.php' ,
'check_class' => 'DB_common'
),
array (
'name' => 'DB_DataObject' ,
'pear' => 'DB_DataObject' ,
'url' => 'http://pear.php.net/package/DB_DataObject' ,
'include' => 'DB/DataObject.php' ,
'check_class' => 'DB_DataObject'
),
array (
'name' => 'Console_Getopt' ,
'pear' => 'Console_Getopt' ,
'url' => 'http://pear.php.net/package/Console_Getopt' ,
'include' => 'Console/Getopt.php' ,
'check_class' => 'Console_Getopt'
),
array (
'name' => 'Facebook API' ,
'url' => 'http://developers.facebook.com/' ,
'include' => 'facebook/facebook.php' ,
'check_class' => 'Facebook'
),
array (
'name' => 'htmLawed' ,
'url' => 'http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed' ,
'include' => 'htmLawed/htmLawed.php' ,
'check_function' => 'htmLawed'
),
array (
'name' => 'HTTP_Request' ,
'pear' => 'HTTP_Request' ,
'url' => 'http://pear.php.net/package/HTTP_Request' ,
'deb' => 'php-http-request' ,
'include' => 'HTTP/Request.php' ,
'check_class' => 'HTTP_Request'
),
2009-10-28 19:29:20 +00:00
array (
'name' => 'HTTP_Request2' ,
'pear' => 'HTTP_Request2' ,
'url' => 'http://pear.php.net/package/HTTP_Request2' ,
'include' => 'HTTP/Request2.php' ,
'check_class' => 'HTTP_Request2'
),
2009-08-27 00:08:30 +01:00
array (
'name' => 'Mail' ,
'pear' => 'Mail' ,
'url' => 'http://pear.php.net/package/Mail' ,
'deb' => 'php-mail' ,
'include' => 'Mail.php' ,
'check_class' => 'Mail'
),
array (
'name' => 'Mail_mimeDecode' ,
'pear' => 'Mail_mimeDecode' ,
'url' => 'http://pear.php.net/package/Mail_mimeDecode' ,
'deb' => 'php-mail-mimedecode' ,
'include' => 'Mail/mimeDecode.php' ,
'check_class' => 'Mail_mimeDecode'
),
array (
'name' => 'Mime_Type' ,
'pear' => 'Mime_Type' ,
'url' => 'http://pear.php.net/package/Mime_Type' ,
'include' => 'MIME/Type.php' ,
'check_class' => 'Mime_Type'
),
array (
'name' => 'Net_URL_Mapper' ,
'pear' => 'Net_URL_Mapper' ,
'url' => 'http://pear.php.net/package/Net_URL_Mapper' ,
'include' => 'Net/URL/Mapper.php' ,
'check_class' => 'Net_URL_Mapper'
),
2009-11-04 18:39:56 +00:00
array (
'name' => 'Net_LDAP2' ,
'pear' => 'Net_LDAP2' ,
'url' => 'http://pear.php.net/package/Net_LDAP2' ,
'deb' => 'php-net-ldap2' ,
'include' => 'Net/LDAP2.php' ,
'check_class' => 'Net_LDAP2'
),
2009-08-27 00:08:30 +01:00
array (
'name' => 'Net_Socket' ,
'pear' => 'Net_Socket' ,
'url' => 'http://pear.php.net/package/Net_Socket' ,
'deb' => 'php-net-socket' ,
'include' => 'Net/Socket.php' ,
'check_class' => 'Net_Socket'
),
array (
'name' => 'Net_SMTP' ,
'pear' => 'Net_SMTP' ,
'url' => 'http://pear.php.net/package/Net_SMTP' ,
'deb' => 'php-net-smtp' ,
'include' => 'Net/SMTP.php' ,
'check_class' => 'Net_SMTP'
),
array (
'name' => 'Net_URL' ,
'pear' => 'Net_URL' ,
'url' => 'http://pear.php.net/package/Net_URL' ,
'deb' => 'php-net-url' ,
'include' => 'Net/URL.php' ,
'check_class' => 'Net_URL'
),
array (
'name' => 'Net_URL2' ,
'pear' => 'Net_URL2' ,
'url' => 'http://pear.php.net/package/Net_URL2' ,
'include' => 'Net/URL2.php' ,
'check_class' => 'Net_URL2'
),
array (
'name' => 'Services_oEmbed' ,
'pear' => 'Services_oEmbed' ,
'url' => 'http://pear.php.net/package/Services_oEmbed' ,
'include' => 'Services/oEmbed.php' ,
'check_class' => 'Services_oEmbed'
),
array (
'name' => 'Stomp' ,
'url' => 'http://stomp.codehaus.org/PHP' ,
'include' => 'Stomp.php' ,
'check_class' => 'Stomp'
),
array (
'name' => 'System_Command' ,
'pear' => 'System_Command' ,
'url' => 'http://pear.php.net/package/System_Command' ,
'include' => 'System/Command.php' ,
'check_class' => 'System_Command'
),
array (
'name' => 'XMPPHP' ,
'url' => 'http://code.google.com/p/xmpphp' ,
'include' => 'XMPPHP/XMPP.php' ,
'check_class' => 'XMPPHP_XMPP'
),
array (
'name' => 'PHP Markdown' ,
'url' => 'http://www.michelf.com/projects/php-markdown/' ,
'include' => 'markdown.php' ,
'check_class' => 'Markdown_Parser'
),
array (
'name' => 'OAuth' ,
'url' => 'http://code.google.com/p/oauth-php' ,
'include' => 'OAuth.php' ,
'check_class' => 'OAuthRequest'
),
array (
'name' => 'Validate' ,
'pear' => 'Validate' ,
'url' => 'http://pear.php.net/package/Validate' ,
'include' => 'Validate.php' ,
'check_class' => 'Validate'
)
);
2009-09-14 01:53:15 +01:00
$dbModules = array (
'mysql' => array (
'name' => 'MySQL' ,
'check_module' => 'mysql' , // mysqli?
'installer' => 'mysql_db_installer' ,
),
'pgsql' => array (
'name' => 'PostgreSQL' ,
'check_module' => 'pgsql' ,
'installer' => 'pgsql_db_installer' ,
),
);
2009-08-27 00:08:30 +01:00
2009-09-16 00:31:09 +01:00
/**
2009-09-13 06:44:22 +01:00
* the actual installation .
* If call libraries are present , then install
2009-09-16 00:31:09 +01:00
*
2009-09-13 06:44:22 +01:00
* @ return void
*/
2009-03-01 01:42:27 +00:00
function main ()
{
2009-09-13 06:43:48 +01:00
if ( ! checkPrereqs ()) {
2009-03-01 05:01:33 +00:00
return ;
}
2009-09-16 00:31:09 +01:00
if ( ! empty ( $_GET [ 'checklibs' ])) {
2009-08-27 00:08:30 +01:00
showLibs ();
2009-09-13 06:43:48 +01:00
} else {
2009-08-27 00:08:30 +01:00
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' ) {
handlePost ();
} else {
showForm ();
}
}
}
2009-03-01 05:01:33 +00:00
2009-09-13 07:29:10 +01:00
/**
* checks if an external libary is present
*
* @ param string $external_library Name of library
*
* @ return boolean indicates if library present
*/
2009-08-27 00:08:30 +01:00
function haveExternalLibrary ( $external_library )
{
2009-09-24 22:22:51 +01:00
if ( isset ( $external_library [ 'include' ]) && ! haveIncludeFile ( $external_library [ 'include' ])) {
2009-08-27 00:08:30 +01:00
return false ;
}
2009-09-13 06:43:48 +01:00
if ( isset ( $external_library [ 'check_function' ]) && ! function_exists ( $external_library [ 'check_function' ])) {
2009-08-27 00:08:30 +01:00
return false ;
}
2009-09-13 06:43:48 +01:00
if ( isset ( $external_library [ 'check_class' ]) && ! class_exists ( $external_library [ 'check_class' ])) {
2009-08-27 00:08:30 +01:00
return false ;
2009-03-01 01:42:27 +00:00
}
2009-08-27 00:08:30 +01:00
return true ;
2009-03-01 01:42:27 +00:00
}
2009-09-14 02:15:49 +01:00
// Attempt to include a PHP file and report if it worked, while
// suppressing the annoying warning messages on failure.
function haveIncludeFile ( $filename ) {
$old = error_reporting ( error_reporting () & ~ E_WARNING );
$ok = include_once ( $filename );
error_reporting ( $old );
return $ok ;
}
2009-09-13 07:29:10 +01:00
/**
* Check if all is ready for installation
*
* @ return void
*/
2009-03-01 04:33:22 +00:00
function checkPrereqs ()
{
2009-09-14 08:05:14 +01:00
$pass = true ;
2009-06-19 00:21:03 +01:00
2009-03-01 05:01:33 +00:00
if ( file_exists ( INSTALLDIR . '/config.php' )) {
2009-09-14 08:05:14 +01:00
printf ( '<p class="error">Config file "config.php" already exists.</p>' );
2009-05-20 22:39:08 +01:00
$pass = false ;
2009-03-01 05:01:33 +00:00
}
2009-07-17 22:54:37 +01:00
if ( version_compare ( PHP_VERSION , '5.2.3' , '<' )) {
2009-09-14 08:05:14 +01:00
printf ( '<p class="error">Require PHP version 5.2.3 or greater.</p>' );
$pass = false ;
2009-03-01 05:01:33 +00:00
}
2010-03-05 19:27:48 +00:00
// Look for known library bugs
$str = " abcdefghijklmnopqrstuvwxyz " ;
$replaced = preg_replace ( '/[\p{Cc}\p{Cs}]/u' , '*' , $str );
if ( $str != $replaced ) {
printf ( '<p class="error">PHP is linked to a version of the PCRE library ' .
'that does not support Unicode properties. ' .
'If you are running Red Hat Enterprise Linux / ' .
2010-03-08 21:38:59 +00:00
'CentOS 5.4 or earlier, see <a href="' .
2010-03-05 19:27:48 +00:00
'http://status.net/wiki/Red_Hat_Enterprise_Linux#PCRE_library' .
'">our documentation page</a> on fixing this.</p>' );
$pass = false ;
}
2009-06-23 17:04:28 +01:00
$reqs = array ( 'gd' , 'curl' ,
2009-11-30 16:09:30 +00:00
'xmlwriter' , 'mbstring' , 'xml' , 'dom' , 'simplexml' );
2009-03-01 05:01:33 +00:00
foreach ( $reqs as $req ) {
if ( ! checkExtension ( $req )) {
2009-09-14 08:05:14 +01:00
printf ( '<p class="error">Cannot load required extension: <code>%s</code></p>' , $req );
$pass = false ;
2009-03-01 05:01:33 +00:00
}
2009-09-16 00:31:09 +01:00
}
2009-09-14 01:53:15 +01:00
// Make sure we have at least one database module available
global $dbModules ;
$missingExtensions = array ();
foreach ( $dbModules as $type => $info ) {
if ( ! checkExtension ( $info [ 'check_module' ])) {
$missingExtensions [] = $info [ 'check_module' ];
}
}
2009-09-16 00:31:09 +01:00
2009-09-14 01:53:15 +01:00
if ( count ( $missingExtensions ) == count ( $dbModules )) {
$req = implode ( ', ' , $missingExtensions );
2009-09-16 00:31:09 +01:00
printf ( '<p class="error">Cannot find mysql or pgsql extension. You need one or the other.' );
2009-09-14 08:05:14 +01:00
$pass = false ;
}
2009-09-16 00:31:09 +01:00
2009-09-14 08:05:14 +01:00
if ( ! is_writable ( INSTALLDIR )) {
printf ( '<p class="error">Cannot write config file to: <code>%s</code></p>' , INSTALLDIR );
printf ( '<p>On your server, try this command: <code>chmod a+w %s</code>' , INSTALLDIR );
$pass = false ;
2009-06-23 17:04:28 +01:00
}
2009-03-01 05:01:33 +00:00
2009-09-14 08:05:14 +01:00
// Check the subdirs used for file uploads
$fileSubdirs = array ( 'avatar' , 'background' , 'file' );
foreach ( $fileSubdirs as $fileSubdir ) {
$fileFullPath = INSTALLDIR . " / $fileSubdir / " ;
if ( ! is_writable ( $fileFullPath )) {
printf ( '<p class="error">Cannot write to %s directory: <code>%s</code></p>' , $fileSubdir , $fileFullPath );
printf ( '<p>On your server, try this command: <code>chmod a+w %s</code></p>' , $fileFullPath );
$pass = false ;
}
}
2009-03-01 05:01:33 +00:00
2009-09-14 08:05:14 +01:00
return $pass ;
2009-03-01 05:01:33 +00:00
}
2009-09-13 07:29:10 +01:00
/**
* Checks if a php extension is both installed and loaded
*
* @ param string $name of extension to check
*
* @ return boolean whether extension is installed and loaded
*/
2009-03-01 05:01:33 +00:00
function checkExtension ( $name )
{
2009-09-02 00:04:36 +01:00
if ( extension_loaded ( $name )) {
return true ;
} elseif ( function_exists ( 'dl' ) && ini_get ( 'enable_dl' ) && ! ini_get ( 'safe_mode' )) {
2009-10-03 05:36:53 +01:00
// dl will throw a fatal error if it's disabled or we're in safe mode.
// More fun, it may not even exist under some SAPIs in 5.3.0 or later...
$soname = $name . '.' . PHP_SHLIB_SUFFIX ;
if ( PHP_SHLIB_SUFFIX == 'dll' ) {
$soname = " php_ " . $soname ;
}
return @ dl ( $soname );
2009-09-02 00:04:36 +01:00
} else {
return false ;
2009-03-01 05:01:33 +00:00
}
2009-03-01 04:33:22 +00:00
}
2009-09-13 07:29:10 +01:00
/**
* Show list of libraries
*
* @ return void
*/
2009-08-27 00:08:30 +01:00
function showLibs ()
{
global $external_libraries ;
$present_libraries = array ();
$absent_libraries = array ();
2009-09-13 07:31:44 +01:00
foreach ( $external_libraries as $external_library ) {
2009-09-13 06:43:48 +01:00
if ( haveExternalLibrary ( $external_library )) {
2009-08-27 00:08:30 +01:00
$present_libraries [] = $external_library ;
2009-09-13 06:43:48 +01:00
} else {
2009-08-27 00:08:30 +01:00
$absent_libraries [] = $external_library ;
}
}
echo <<< E_O_T
< div class = " instructions " >
2009-10-13 17:13:11 +01:00
< p > StatusNet comes bundled with a number of libraries required for the application to work . However , it is best that you use PEAR or you distribution to manage
2009-08-27 00:08:30 +01:00
libraries instead , as they tend to provide security updates faster , and may offer improved performance .</ p >
< p > On Debian based distributions , such as Ubuntu , use a package manager ( such as & quot ; aptitude & quot ;, & quot ; apt - get & quot ;, and & quot ; synaptic & quot ;) to install the package listed .</ p >
< p > On RPM based distributions , such as Red Hat , Fedora , CentOS , Scientific Linux , Yellow Dog Linux and Oracle Enterprise Linux , use a package manager ( such as & quot ; yum & quot ;, & quot ; apt - rpm & quot ;, and & quot ; up2date & quot ;) to install the package listed .</ p >
< p > On servers without a package manager ( such as Windows ), or if the library is not packaged for your distribution , you can use PHP ' s PEAR to install the library . Simply run & quot ; pear install & lt ; name & gt ; & quot ; .</ p >
</ div >
< h2 > Absent Libraries </ h2 >
< ul id = " absent_libraries " >
E_O_T ;
2009-09-13 07:31:44 +01:00
foreach ( $absent_libraries as $library ) {
2009-08-27 00:08:30 +01:00
echo '<li>' ;
2009-09-16 00:31:09 +01:00
if ( isset ( $library [ 'url' ])) {
2009-10-13 17:13:11 +01:00
echo '<a href="' . $library [ 'url' ] . '">' . htmlentities ( $library [ 'name' ]) . '</a>' ;
2009-09-13 07:31:44 +01:00
} else {
2009-08-27 00:08:30 +01:00
echo htmlentities ( $library [ 'name' ]);
}
echo '<ul>' ;
2009-09-16 00:31:09 +01:00
if ( isset ( $library [ 'deb' ])) {
2009-08-27 00:08:30 +01:00
echo '<li class="deb package">deb: <a href="apt:' . urlencode ( $library [ 'deb' ]) . '">' . htmlentities ( $library [ 'deb' ]) . '</a></li>' ;
}
2009-09-16 00:31:09 +01:00
if ( isset ( $library [ 'rpm' ])) {
2009-08-27 00:08:30 +01:00
echo '<li class="rpm package">rpm: ' . htmlentities ( $library [ 'rpm' ]) . '</li>' ;
}
2009-09-16 00:31:09 +01:00
if ( isset ( $library [ 'pear' ])) {
2009-08-27 00:08:30 +01:00
echo '<li class="pear package">pear: ' . htmlentities ( $library [ 'pear' ]) . '</li>' ;
}
echo '</ul>' ;
}
echo <<< E_O_T
</ ul >
< h2 > Installed Libraries </ h2 >
< ul id = " present_libraries " >
E_O_T ;
2009-09-13 07:31:44 +01:00
foreach ( $present_libraries as $library ) {
2009-08-27 00:08:30 +01:00
echo '<li>' ;
2009-09-23 14:45:22 +01:00
if ( isset ( $library [ 'url' ])) {
2009-10-13 17:13:11 +01:00
echo '<a href="' . $library [ 'url' ] . '">' . htmlentities ( $library [ 'name' ]) . '</a>' ;
2009-09-13 07:29:10 +01:00
} else {
2009-08-27 00:08:30 +01:00
echo htmlentities ( $library [ 'name' ]);
}
echo '</li>' ;
}
echo <<< E_O_T
</ ul >
E_O_T ;
}
2010-03-04 15:45:26 +00:00
/**
* Helper class for building form
*/
class Posted {
function value ( $name )
{
if ( isset ( $_POST [ $name ])) {
return htmlspecialchars ( strval ( $_POST [ $name ]));
} else {
return '' ;
}
}
}
2009-03-01 01:42:27 +00:00
function showForm ()
{
2009-09-14 01:53:15 +01:00
global $dbModules ;
2010-03-04 15:45:26 +00:00
$post = new Posted ();
2009-09-14 01:53:15 +01:00
$dbRadios = '' ;
2010-03-04 15:45:26 +00:00
if ( isset ( $_POST [ 'dbtype' ])) {
$dbtype = $_POST [ 'dbtype' ];
} else {
$dbtype = null ;
}
2009-09-14 01:53:15 +01:00
foreach ( $dbModules as $type => $info ) {
if ( checkExtension ( $info [ 'check_module' ])) {
2010-03-04 15:45:26 +00:00
if ( $dbtype == null || $dbtype == $type ) {
$checked = 'checked="checked" ' ;
$dbtype = $type ; // if we didn't have one checked, hit the first
} else {
$checked = '' ;
}
2009-09-14 01:53:15 +01:00
$dbRadios .= " <input type= \" radio \" name= \" dbtype \" id= \" dbtype- $type\ " value = \ " $type\ " $checked /> $info [ name ] < br /> \n " ;
}
}
2010-03-09 16:08:21 +00:00
2009-05-17 05:05:07 +01:00
echo <<< E_O_T
2009-05-01 04:50:24 +01:00
</ ul >
</ dd >
</ dl >
< form method = " post " action = " install.php " class = " form_settings " id = " form_install " >
< fieldset >
2010-03-04 16:32:30 +00:00
< fieldset id = " settings_site " >
< legend > Site settings </ legend >
< ul class = " form_data " >
< li >
< label for = " sitename " > Site name </ label >
< input type = " text " id = " sitename " name = " sitename " value = " { $post -> value ( 'sitename' ) } " />
< p class = " form_guide " > The name of your site </ p >
</ li >
< li >
< label for = " fancy-enable " > Fancy URLs </ label >
< input type = " radio " name = " fancy " id = " fancy-enable " value = " enable " checked = 'checked' /> enable < br />
< input type = " radio " name = " fancy " id = " fancy-disable " value = " " /> disable < br />
< p class = " form_guide " id = 'fancy-form_guide' > Enable fancy ( pretty ) URLs . Auto - detection failed , it depends on Javascript .</ p >
</ li >
</ ul >
</ fieldset >
2009-08-27 16:45:53 +01:00
2010-03-04 16:32:30 +00:00
< fieldset id = " settings_db " >
< legend > Database settings </ legend >
< ul class = " form_data " >
2010-03-04 16:35:18 +00:00
< li >
< label for = " host " > Hostname </ label >
< input type = " text " id = " host " name = " host " value = " { $post -> value ( 'host' ) } " />
< p class = " form_guide " > Database hostname </ p >
</ li >
2010-03-04 16:32:30 +00:00
< li >
< label for = " dbtype " > Type </ label >
$dbRadios
< p class = " form_guide " > Database type </ p >
</ li >
< li >
< label for = " database " > Name </ label >
< input type = " text " id = " database " name = " database " value = " { $post -> value ( 'database' ) } " />
< p class = " form_guide " > Database name </ p >
</ li >
< li >
< label for = " dbusername " > DB username </ label >
< input type = " text " id = " dbusername " name = " dbusername " value = " { $post -> value ( 'dbusername' ) } " />
< p class = " form_guide " > Database username </ p >
</ li >
< li >
< label for = " dbpassword " > DB password </ label >
< input type = " password " id = " dbpassword " name = " dbpassword " value = " { $post -> value ( 'dbpassword' ) } " />
< p class = " form_guide " > Database password ( optional ) </ p >
</ li >
</ ul >
</ fieldset >
2009-06-23 17:31:52 +01:00
2010-03-04 16:32:30 +00:00
< fieldset id = " settings_admin " >
< legend > Administrator settings </ legend >
< ul class = " form_data " >
< li >
< label for = " admin_nickname " > Administrator nickname </ label >
< input type = " text " id = " admin_nickname " name = " admin_nickname " value = " { $post -> value ( 'admin_nickname' ) } " />
< p class = " form_guide " > Nickname for the initial StatusNet user ( administrator ) </ p >
</ li >
< li >
< label for = " admin_password " > Administrator password </ label >
< input type = " password " id = " admin_password " name = " admin_password " value = " { $post -> value ( 'admin_password' ) } " />
< p class = " form_guide " > Password for the initial StatusNet user ( administrator ) </ p >
</ li >
< li >
< label for = " admin_password2 " > Confirm password </ label >
< input type = " password " id = " admin_password2 " name = " admin_password2 " value = " { $post -> value ( 'admin_password2' ) } " />
</ li >
< li >
< label for = " admin_email " > Administrator e - mail </ label >
< input id = " admin_email " name = " admin_email " value = " { $post -> value ( 'admin_email' ) } " />
< p class = " form_guide " > Optional email address for the initial StatusNet user ( administrator ) </ p >
</ li >
2010-03-09 16:08:21 +00:00
< li >
< label for = " admin_updates " > Subscribe to announcements </ label >
< input type = " checkbox " id = " admin_updates " name = " admin_updates " value = " true " checked = " checked " />
< p class = " form_guide " > Release and security feed from < a href = " http://update.status.net/ " > update @ status . net </ a > ( recommended ) </ p >
</ li >
2010-03-04 16:32:30 +00:00
</ ul >
</ fieldset >
2009-05-01 04:50:24 +01:00
< input type = " submit " name = " submit " class = " submit " value = " Submit " />
</ fieldset >
2009-03-01 01:42:27 +00:00
</ form >
2009-05-17 05:05:07 +01:00
E_O_T ;
2009-03-01 01:42:27 +00:00
}
2009-03-01 04:33:22 +00:00
function updateStatus ( $status , $error = false )
{
2009-09-19 05:01:42 +01:00
echo '<li' . ( $error ? ' class="error"' : '' ) . " > $status </li> " ;
2009-03-01 04:33:22 +00:00
}
2009-03-01 01:42:27 +00:00
function handlePost ()
{
2009-05-17 05:05:07 +01:00
$host = $_POST [ 'host' ];
2009-06-23 06:37:01 +01:00
$dbtype = $_POST [ 'dbtype' ];
2009-03-01 04:33:22 +00:00
$database = $_POST [ 'database' ];
2010-03-04 15:45:26 +00:00
$username = $_POST [ 'dbusername' ];
$password = $_POST [ 'dbpassword' ];
2009-03-01 04:33:22 +00:00
$sitename = $_POST [ 'sitename' ];
2009-05-17 05:05:07 +01:00
$fancy = ! empty ( $_POST [ 'fancy' ]);
2010-03-04 07:26:45 +00:00
2010-03-09 22:15:55 +00:00
$adminNick = strtolower ( $_POST [ 'admin_nickname' ]);
2010-03-04 07:26:45 +00:00
$adminPass = $_POST [ 'admin_password' ];
2010-03-04 15:45:26 +00:00
$adminPass2 = $_POST [ 'admin_password2' ];
$adminEmail = $_POST [ 'admin_email' ];
2010-03-09 16:08:21 +00:00
$adminUpdates = $_POST [ 'admin_updates' ];
2010-03-04 07:26:45 +00:00
2009-08-07 03:17:55 +01:00
$server = $_SERVER [ 'HTTP_HOST' ];
$path = substr ( dirname ( $_SERVER [ 'PHP_SELF' ]), 1 );
2009-08-27 16:45:53 +01:00
2009-09-13 07:22:32 +01:00
echo <<< STR
2009-05-01 04:50:24 +01:00
< dl class = " system_notice " >
< dt > Page notice </ dt >
< dd >
< ul >
2009-09-13 07:22:32 +01:00
STR ;
$fail = false ;
2009-06-19 00:21:03 +01:00
2009-03-01 18:12:16 +00:00
if ( empty ( $host )) {
updateStatus ( " No hostname specified. " , true );
2009-09-13 07:22:32 +01:00
$fail = true ;
2009-03-01 18:12:16 +00:00
}
if ( empty ( $database )) {
updateStatus ( " No database specified. " , true );
2009-09-13 07:22:32 +01:00
$fail = true ;
2009-03-01 18:12:16 +00:00
}
if ( empty ( $username )) {
updateStatus ( " No username specified. " , true );
2009-09-13 07:22:32 +01:00
$fail = true ;
2009-03-01 18:12:16 +00:00
}
if ( empty ( $sitename )) {
updateStatus ( " No sitename specified. " , true );
2009-09-13 07:31:44 +01:00
$fail = true ;
2009-03-01 18:12:16 +00:00
}
2010-03-04 07:26:45 +00:00
if ( empty ( $adminNick )) {
updateStatus ( " No initial StatusNet user nickname specified. " , true );
$fail = true ;
2010-03-09 22:15:55 +00:00
}
if ( $adminNick && ! preg_match ( '/^[0-9a-z]{1,64}$/' , $adminNick )) {
updateStatus ( 'The user nickname "' . htmlspecialchars ( $adminNick ) .
'" is invalid; should be plain letters and numbers no longer than 64 characters.' , true );
$fail = true ;
}
// @fixme hardcoded list; should use User::allowed_nickname()
// if/when it's safe to have loaded the infrastructure here
$blacklist = array ( 'main' , 'admin' , 'twitter' , 'settings' , 'rsd.xml' , 'favorited' , 'featured' , 'favoritedrss' , 'featuredrss' , 'rss' , 'getfile' , 'api' , 'groups' , 'group' , 'peopletag' , 'tag' , 'user' , 'message' , 'conversation' , 'bookmarklet' , 'notice' , 'attachment' , 'search' , 'index.php' , 'doc' , 'opensearch' , 'robots.txt' , 'xd_receiver.html' , 'facebook' );
if ( in_array ( $adminNick , $blacklist )) {
updateStatus ( 'The user nickname "' . htmlspecialchars ( $adminNick ) .
'" is reserved.' , true );
$fail = true ;
2010-03-04 07:26:45 +00:00
}
if ( empty ( $adminPass )) {
updateStatus ( " No initial StatusNet user password specified. " , true );
$fail = true ;
}
2010-03-04 15:45:26 +00:00
if ( $adminPass != $adminPass2 ) {
updateStatus ( " Administrator passwords do not match. Did you mistype? " , true );
$fail = true ;
}
2010-03-04 07:26:45 +00:00
2009-09-13 07:31:44 +01:00
if ( $fail ) {
showForm ();
2009-03-01 04:33:22 +00:00
return ;
}
2009-08-27 16:45:53 +01:00
2009-09-14 01:53:15 +01:00
global $dbModules ;
2009-09-14 08:08:05 +01:00
$db = call_user_func ( $dbModules [ $dbtype ][ 'installer' ], $host , $database , $username , $password );
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
if ( ! $db ) {
// database connection failed, do not move on to create config file.
return false ;
}
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
updateStatus ( " Writing config file... " );
2009-11-14 16:38:10 +00:00
$res = writeConf ( $sitename , $server , $path , $fancy , $db );
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
if ( ! $res ) {
updateStatus ( " Can't write config file. " , true );
showForm ();
return ;
2009-03-04 13:47:37 +00:00
}
2009-08-27 16:45:53 +01:00
2010-03-04 07:26:45 +00:00
// Okay, cross fingers and try to register an initial user
2010-03-09 16:08:21 +00:00
if ( registerInitialUser ( $adminNick , $adminPass , $adminEmail , $adminUpdates )) {
2010-03-04 07:26:45 +00:00
updateStatus (
" An initial user with the administrator role has been created. "
);
} else {
updateStatus (
" Could not create initial StatusNet user (administrator). " ,
true
);
showForm ();
return ;
}
2009-08-07 03:17:55 +01:00
/*
TODO https needs to be considered
*/
$link = " http:// " . $server . '/' . $path ;
2009-08-27 16:45:53 +01:00
2009-08-25 23:12:20 +01:00
updateStatus ( " StatusNet has been installed at $link " );
2010-03-04 07:26:45 +00:00
updateStatus (
2010-03-04 17:50:54 +00:00
" <strong>DONE!</strong> You can visit your <a href=' $link '>new StatusNet site</a> (login as ' $adminNick '). If this is your first StatusNet install, you may want to poke around our <a href='http://status.net/wiki/Getting_started'>Getting Started guide</a>. "
2010-03-04 07:26:45 +00:00
);
2009-03-01 04:33:22 +00:00
}
2009-09-16 00:31:09 +01:00
function Pgsql_Db_installer ( $host , $database , $username , $password )
2009-09-14 08:08:05 +01:00
{
2009-09-13 07:22:32 +01:00
$connstring = " dbname= $database host= $host user= $username " ;
//No password would mean trust authentication used.
if ( ! empty ( $password )) {
$connstring .= " password= $password " ;
}
updateStatus ( " Starting installation... " );
updateStatus ( " Checking database... " );
$conn = pg_connect ( $connstring );
if ( $conn === false ) {
updateStatus ( " Failed to connect to database: $connstring " );
showForm ();
return false ;
}
//ensure database encoding is UTF8
$record = pg_fetch_object ( pg_query ( $conn , 'SHOW server_encoding' ));
if ( $record -> server_encoding != 'UTF8' ) {
updateStatus ( " StatusNet requires UTF8 character encoding. Your database is " . htmlentities ( $record -> server_encoding ));
showForm ();
return false ;
}
updateStatus ( " Running database script... " );
//wrap in transaction;
pg_query ( $conn , 'BEGIN' );
$res = runDbScript ( INSTALLDIR . '/db/statusnet_pg.sql' , $conn , 'pgsql' );
if ( $res === false ) {
updateStatus ( " Can't run database script. " , true );
showForm ();
return false ;
}
foreach ( array ( 'sms_carrier' => 'SMS carrier' ,
2009-06-23 07:01:03 +01:00
'notice_source' => 'notice source' ,
'foreign_services' => 'foreign service' )
as $scr => $name ) {
2009-09-13 07:22:32 +01:00
updateStatus ( sprintf ( " Adding %s data to database... " , $name ));
$res = runDbScript ( INSTALLDIR . '/db/' . $scr . '.sql' , $conn , 'pgsql' );
if ( $res === false ) {
updateStatus ( sprintf ( " Can't run %d script. " , $name ), true );
showForm ();
return false ;
}
}
pg_query ( $conn , 'COMMIT' );
if ( empty ( $password )) {
$sqlUrl = " pgsql:// $username @ $host / $database " ;
2009-09-13 07:31:44 +01:00
} else {
2009-09-13 07:22:32 +01:00
$sqlUrl = " pgsql:// $username : $password @ $host / $database " ;
}
$db = array ( 'type' => 'pgsql' , 'database' => $sqlUrl );
return $db ;
2009-06-23 06:43:46 +01:00
}
2009-09-16 00:31:09 +01:00
function Mysql_Db_installer ( $host , $database , $username , $password )
2009-09-14 08:08:05 +01:00
{
2009-09-13 07:22:32 +01:00
updateStatus ( " Starting installation... " );
updateStatus ( " Checking database... " );
$conn = mysql_connect ( $host , $username , $password );
if ( ! $conn ) {
updateStatus ( " Can't connect to server ' $host ' as ' $username '. " , true );
showForm ();
return false ;
}
updateStatus ( " Changing to database... " );
$res = mysql_select_db ( $database , $conn );
if ( ! $res ) {
updateStatus ( " Can't change to database. " , true );
showForm ();
return false ;
}
updateStatus ( " Running database script... " );
$res = runDbScript ( INSTALLDIR . '/db/statusnet.sql' , $conn );
if ( $res === false ) {
updateStatus ( " Can't run database script. " , true );
showForm ();
return false ;
}
foreach ( array ( 'sms_carrier' => 'SMS carrier' ,
2009-06-23 06:43:46 +01:00
'notice_source' => 'notice source' ,
'foreign_services' => 'foreign service' )
as $scr => $name ) {
2009-09-13 07:22:32 +01:00
updateStatus ( sprintf ( " Adding %s data to database... " , $name ));
$res = runDbScript ( INSTALLDIR . '/db/' . $scr . '.sql' , $conn );
if ( $res === false ) {
updateStatus ( sprintf ( " Can't run %d script. " , $name ), true );
showForm ();
return false ;
}
}
$sqlUrl = " mysqli:// $username : $password @ $host / $database " ;
$db = array ( 'type' => 'mysql' , 'database' => $sqlUrl );
return $db ;
2009-08-07 03:17:55 +01:00
}
2009-11-14 16:38:10 +00:00
function writeConf ( $sitename , $server , $path , $fancy , $db )
2009-03-01 04:33:22 +00:00
{
2009-08-07 03:17:55 +01:00
// assemble configuration file in a string
$cfg = " <?php \n " .
2009-08-26 15:41:36 +01:00
" if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } \n \n " .
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
// site name
" \$ config['site']['name'] = ' $sitename '; \n \n " .
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
// site location
" \$ config['site']['server'] = ' $server '; \n " .
" \$ config['site']['path'] = ' $path '; \n \n " .
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
// checks if fancy URLs are enabled
( $fancy ? " \$ config['site']['fancy'] = true; \n \n " : '' ) .
2009-08-27 16:45:53 +01:00
2009-08-07 03:17:55 +01:00
// database
" \$ config['db']['database'] = ' { $db [ 'database' ] } '; \n \n " .
2009-08-28 10:04:15 +01:00
( $db [ 'type' ] == 'pgsql' ? " \$ config['db']['quote_identifiers'] = true; \n \n " : '' ) .
2009-10-30 05:53:45 +00:00
" \$ config['db']['type'] = ' { $db [ 'type' ] } '; \n \n " ;
2009-08-07 03:17:55 +01:00
// write configuration file out to install directory
$res = file_put_contents ( INSTALLDIR . '/config.php' , $cfg );
2009-03-01 04:33:22 +00:00
return $res ;
2009-03-01 01:42:27 +00:00
}
2009-03-01 04:33:22 +00:00
2009-09-13 07:22:32 +01:00
/**
* Install schema into the database
*
2009-09-14 08:08:05 +01:00
* @ param string $filename location of database schema file
* @ param dbconn $conn connection to database
* @ param string $type type of database , currently mysql or pgsql
2009-09-16 00:31:09 +01:00
*
2009-09-13 07:22:32 +01:00
* @ return boolean - indicating success or failure
*/
2009-09-14 08:19:11 +01:00
function runDbScript ( $filename , $conn , $type = 'mysqli' )
2009-03-01 04:33:22 +00:00
{
$sql = trim ( file_get_contents ( $filename ));
$stmts = explode ( ';' , $sql );
foreach ( $stmts as $stmt ) {
$stmt = trim ( $stmt );
if ( ! mb_strlen ( $stmt )) {
continue ;
}
2009-08-27 16:58:03 +01:00
// FIXME: use PEAR::DB or PDO instead of our own switch
2009-08-07 03:17:55 +01:00
switch ( $type ) {
2009-09-14 08:19:11 +01:00
case 'mysqli' :
2009-08-07 03:17:55 +01:00
$res = mysql_query ( $stmt , $conn );
2009-08-27 16:58:03 +01:00
if ( $res === false ) {
$error = mysql_error ();
}
2009-08-07 03:17:55 +01:00
break ;
case 'pgsql' :
$res = pg_query ( $conn , $stmt );
2009-08-27 16:58:03 +01:00
if ( $res === false ) {
$error = pg_last_error ();
}
2009-08-07 03:17:55 +01:00
break ;
default :
updateStatus ( " runDbScript() error: unknown database type " . $type . " provided. " );
2009-06-23 07:01:03 +01:00
}
2009-03-01 04:33:22 +00:00
if ( $res === false ) {
2009-08-27 16:58:03 +01:00
updateStatus ( " ERROR ( $error ) for SQL ' $stmt ' " );
2009-03-01 04:33:22 +00:00
return $res ;
}
}
return true ;
}
2010-03-09 16:08:21 +00:00
function registerInitialUser ( $nickname , $password , $email , $adminUpdates )
2010-03-04 07:26:45 +00:00
{
define ( 'STATUSNET' , true );
define ( 'LACONICA' , true ); // compatibility
require_once INSTALLDIR . '/lib/common.php' ;
2010-03-04 15:45:26 +00:00
$data = array ( 'nickname' => $nickname ,
'password' => $password ,
'fullname' => $nickname );
if ( $email ) {
$data [ 'email' ] = $email ;
}
$user = User :: register ( $data );
2010-03-04 07:26:45 +00:00
if ( empty ( $user )) {
return false ;
}
// give initial user carte blanche
$user -> grantRole ( 'owner' );
$user -> grantRole ( 'moderator' );
$user -> grantRole ( 'administrator' );
2010-03-04 19:00:02 +00:00
// Attempt to do a remote subscribe to update@status.net
// Will fail if instance is on a private network.
2010-03-09 16:08:21 +00:00
if ( class_exists ( 'Ostatus_profile' ) && $adminUpdates ) {
2010-03-04 19:00:02 +00:00
try {
$oprofile = Ostatus_profile :: ensureProfile ( 'http://update.status.net/' );
Subscription :: start ( $user -> getProfile (), $oprofile -> localProfile ());
updateStatus ( " Set up subscription to <a href='http://update.status.net/'>update@status.net</a>. " );
} catch ( Exception $e ) {
updateStatus ( " Could not set up subscription to <a href='http://update.status.net/'>update@status.net</a>. " );
}
}
2010-03-04 07:26:45 +00:00
return true ;
}
2009-03-01 01:42:27 +00:00
?>
2009-05-01 04:50:24 +01:00
< ? php echo " <? " ; ?> xml version="1.0" encoding="UTF-8" <?php echo "?>"; ?>
<! DOCTYPE html
PUBLIC " -//W3C//DTD XHTML 1.0 Strict//EN "
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd " >
< html xmlns = " http://www.w3.org/1999/xhtml " xml : lang = " en_US " lang = " en_US " >
< head >
2009-08-25 23:12:20 +01:00
< title > Install StatusNet </ title >
2009-05-22 17:38:06 +01:00
< link rel = " shortcut icon " href = " favicon.ico " />
2010-03-04 07:59:10 +00:00
< link rel = " stylesheet " type = " text/css " href = " theme/default/css/display.css " media = " screen, projection, tv " />
<!-- [ if IE ] >< link rel = " stylesheet " type = " text/css " href = " theme/base/css/ie.css " /><! [ endif ] -->
<!-- [ if lte IE 6 ] >< link rel = " stylesheet " type = " text/css " theme / base / css / ie6 . css " /><![endif]-->
<!-- [ if IE ] >< link rel = " stylesheet " type = " text/css " href = " theme/default/css/ie.css " /><! [ endif ] -->
2009-05-22 17:38:06 +01:00
< script src = " js/jquery.min.js " ></ script >
< script src = " js/install.js " ></ script >
2009-05-01 04:50:24 +01:00
</ head >
< body id = " install " >
< div id = " wrap " >
< div id = " header " >
< address id = " site_contact " class = " vcard " >
< a class = " url home bookmark " href = " . " >
2009-08-25 23:12:20 +01:00
< img class = " logo photo " src = " theme/default/logo.png " alt = " StatusNet " />
< span class = " fn org " > StatusNet </ span >
2009-05-01 04:50:24 +01:00
</ a >
</ address >
</ div >
< div id = " core " >
< div id = " content " >
2010-03-04 07:59:10 +00:00
< div id = " content_inner " >
< h1 > Install StatusNet </ h1 >
2009-04-15 07:38:05 +01:00
< ? php main (); ?>
2010-03-04 07:59:10 +00:00
</ div >
2009-05-01 04:50:24 +01:00
</ div >
</ div >
</ div >
</ body >
2009-04-15 07:38:05 +01:00
</ html >