3 * Copyright (C) 2010 Roland Mas, Olaf Lenz
5 * This file is part of FusionForge.
7 * FusionForge is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * FusionForge is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 /** This contains the local settings for Mediawiki as used in the
23 * Mediawiki plugin of FusionForge.
26 /* C style inclusion guard. Yes, I know. Don’t comment on it. */
27 if (!isset($fusionforge_plugin_mediawiki_LocalSettings_included)) {
28 $fusionforge_plugin_mediawiki_LocalSettings_included = true;
30 require_once dirname(__FILE__) . '/../../../www/env.inc.php';
31 require_once $gfcommon.'include/pre.php';
32 require_once $gfcommon.'include/RBACEngine.class.php';
33 sysdebug_lazymode(true);
35 $IP = forge_get_config('master_path', 'mediawiki');
37 if (!isset ($fusionforgeproject)) {
39 $fusionforgeproject=$gr->getUnixName();
42 $exppath = explode ('/', $_SERVER['PHP_SELF']) ;
44 # determine $fusionforgeproject from the URL
45 while (count ($exppath) >= 4) {
46 if (($exppath[0] == 'plugins') &&
47 ($exppath[1] == 'mediawiki') &&
48 ($exppath[2] == 'wiki') &&
49 (($exppath[4] == 'index.php') || ($exppath[4] == 'api.php'))
51 $fusionforgeproject = $exppath[3] ;
54 array_shift ($exppath) ;
58 $gconfig_dir = forge_get_config('mwdata_path', 'mediawiki');
59 $project_dir = forge_get_config('projects_path', 'mediawiki') . "/"
60 . $fusionforgeproject ;
62 if (!is_dir($project_dir)) {
63 exit_error (sprintf(_('Mediawiki for project %s not created yet, please wait for a few minutes.'), $fusionforgeproject.':'.$project_dir)) ;
67 $path = array( $IP, "$IP/includes", "$IP/languages" );
68 set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() );
70 require_once( "$IP/includes/AutoLoader.php" );
71 require_once( "$IP/includes/Defines.php" );
72 require_once( "$IP/includes/DefaultSettings.php" );
74 if ( $wgCommandLineMode ) {
75 if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
76 die( "This script must be run from the command line\n" );
80 class DatabaseForge extends DatabasePostgres {
81 function __construct($server=false, $user=false, $password=false,
82 $dbName=false, $failFunction=false, $flags=0) {
85 $wgDBtype = "postgres";
86 return parent::__construct($server, $user,
87 $password, $dbName, $failFunction, $flags);
90 function fieldInfo($table, $field) {
95 return DatabasePostgres::fieldInfo($table, $field);
100 $save_wgDBmwschema = $wgDBmwschema;
101 $wgDBmwschema = 'public';
102 $v = DatabasePostgres::fieldInfo($table, $field);
103 $wgDBmwschema = $save_wgDBmwschema;
107 function open($server, $user, $password, $dbName) {
108 $v = DatabasePostgres::open($server, $user, $password, $dbName);
110 global $wgDBmwschema;
111 if ($this->schemaExists($wgDBmwschema)) {
112 $safeschema = $this->addIdentifierQuotes($wgDBmwschema);
113 $this->doQuery("SET search_path TO $safeschema,public");
119 function query($sql, $fname='', $tempIgnore=false) {
121 $chk = "ALTER TABLE interwiki ";
123 if (substr($sql, 0, $csz) == $chk) {
124 $sql = "ALTER TABLE public.interwiki " .
127 return DatabasePostgres::query($sql, $fname,$tempIgnore);
130 function tableName($name, $format='quoted') {
131 global $wgDBmwschema;
137 return DatabasePostgres::tableName($name, $format);
140 if ($wgDBmwschema != 'public') {
147 $g = group_get_object_by_name($fusionforgeproject) ;
148 $wgSitename = $g->getPublicName() . " Wiki";
149 $wgScriptPath = "/plugins/mediawiki/wiki/$fusionforgeproject" ;
151 $wgEmergencyContact = forge_get_config('admin_email');
152 $wgPasswordSender = forge_get_config('admin_email');
155 $wgDBserver = forge_get_config('database_host') ;
156 if (forge_get_config('mw_dbtype', 'mediawiki')=='mysql'){
157 // At the time writing schema in mysql is synonym for database
158 $wgDBname = 'plugin_mediawiki_'.$fusionforgeproject;
161 $wgDBname = forge_get_config('database_name');
163 $wgDBuser = forge_get_config('database_user') ;
164 $wgDBpassword = forge_get_config('database_password') ;
165 $wgDBadminuser = forge_get_config('database_user') ;
166 $wgDBadminpassword = forge_get_config('database_password') ;
167 $wgDBport = forge_get_config('database_port') ;
168 $wgDBmwschema = str_replace ('-', '_', "plugin_mediawiki_$fusionforgeproject") ;
169 $wgDBts2schema = str_replace ('-', '_', "plugin_mediawiki_$fusionforgeproject") ;
170 $wgMainCacheType = CACHE_NONE;
171 $wgMemCachedServers = array();
173 $wgEnableUploads = forge_get_config('enable_uploads', 'mediawiki');
174 $wgUploadDirectory = "$project_dir/images";
175 $wgUseImageMagick = true;
176 $wgImageMagickConvertCommand = "/usr/bin/convert";
177 $wgLocalInterwiki = $wgSitename;
178 $wgShowExceptionDetails = true ;
180 $wgLanguageCode = strtolower(forge_get_config('default_country_code'));
182 $wgDefaultSkin = 'fusionforge';
185 $wgDebugLogFile = '/tmp/wiki.log';
186 $wgDebugLogPrefix = '';
187 $wgDebugRedirects = true;
188 $wgDebugRawPage = true;
189 $wgDebugComments = true;
190 $wgLogQueries = true;
191 $wgDebugDumpSql = true;
192 $wgDebugLogGroups = array();
194 $wgSpecialVersionShowHooks = true;
195 $wgShowSQLErrors = true;
196 $wgColorErrors = true;
197 $wgShowExceptionDetails = true;
198 $wgShowHostnames = true;
202 $GLOBALS['sys_dbhost'] = forge_get_config('database_host') ;
203 $GLOBALS['sys_dbport'] = forge_get_config('database_port') ;
204 $GLOBALS['sys_dbname'] = forge_get_config('database_name') ;
205 $GLOBALS['sys_dbuser'] = forge_get_config('database_user') ;
206 $GLOBALS['sys_dbpasswd'] = forge_get_config('database_password') ;
207 $GLOBALS['sys_plugins_path'] = forge_get_config('plugins_path') ;
208 $GLOBALS['sys_urlprefix'] = forge_get_config('url_prefix') ;
209 $GLOBALS['sys_use_ssl'] = forge_get_config('use_ssl') ;
210 $GLOBALS['sys_default_domain'] = forge_get_config('web_host') ;
211 $GLOBALS['sys_custom_path'] = forge_get_config('custom_path') ;
212 $GLOBALS['gfwww'] = $gfwww ;
213 $GLOBALS['gfplugins'] = $gfplugins ;
214 $GLOBALS['sys_lang'] = forge_get_config('default_language') ;
215 $GLOBALS['sys_urlroot'] = forge_get_config('url_root');
216 $GLOBALS['sys_session_key'] = forge_get_config('session_key');
217 $GLOBALS['sys_session_expire'] = forge_get_config('session_expire');
218 $GLOBALS['REMOTE_ADDR'] = getStringFromServer('REMOTE_ADDR') ;
219 $GLOBALS['HTTP_USER_AGENT'] = getStringFromServer('HTTP_USER_AGENT') ;
221 require_once("$IP/includes/Exception.php");
222 require_once("$IP/includes/db/Database.php");
223 if (forge_get_config('mw_dbtype', 'mediawiki')=='mysql'){
224 require_once("DatabaseForgeMysql.php");
226 require_once("DatabaseForgePgsql.php");
229 function FusionForgeRoleToMediawikiGroupName ($role, $project) {
230 if ($role instanceof RoleAnonymous) {
232 } elseif ($role instanceof RoleLoggedIn) {
234 } elseif ($role->getHomeProject() == NULL) {
235 return sprintf ('ForgeRole:%s [global]',
237 } elseif ($role->getHomeProject()->getID() != $project->getID()) {
238 return sprintf ('ForgeRole:%s [project %s]',
240 $role->getHomeProject()->getUnixName()) ;
242 return sprintf ('ForgeRole:%s',
247 function FusionForgeMWAuth( $user, &$result ) {
248 global $fusionforgeproject, $wgGroupPermissions ;
252 if (session_loggedin()) {
253 $u = session_get_user();
254 $g = group_get_object_by_name ($fusionforgeproject) ;
256 $mwname = ucfirst($u->getUnixName ()) ;
257 $mwu = User::newFromName ($mwname);
258 if($mwu->getID() == 0) {
259 $mwu->addToDatabase ();
260 $mwu->setPassword (User::randomPassword());
261 $mwu->setRealName ($u->getRealName ()) ;
263 $mwu->loadFromDatabase ();
265 $user->mId=$mwu->getID();
266 $user->loadFromId() ;
268 $user->loadGroups() ;
269 $current_groups = $user->getGroups() ;
271 $available_roles = RBACEngine::getInstance()->getAvailableRoles() ;
273 foreach ($available_roles as $r) {
274 $linked_projects = $r->getLinkedProjects () ;
276 if ($r->hasGlobalPermission('forge_admin')) {
281 foreach ($linked_projects as $lp) {
282 if ($lp->getID() == $g->getID()) {
289 // Sync MW groups for current user with FF roles
291 foreach ($rs as $r) {
292 $rnames[] = FusionForgeRoleToMediawikiGroupName ($r, $g) ;
294 $role_groups = preg_grep ("/^ForgeRole:/", $current_groups) ;
296 foreach ($rnames as $rname) {
297 if (!in_array ($rname, $current_groups)) {
298 $user->addGroup ($rname) ;
301 foreach ($role_groups as $cg) {
302 if (!in_array ($cg, $rnames)) {
303 $user->removeGroup ($cg) ;
307 $user->setCookies ();
308 $user->saveSettings ();
318 function SetupPermissionsFromRoles () {
319 global $fusionforgeproject, $wgGroupPermissions ;
321 $g = group_get_object_by_name ($fusionforgeproject) ;
322 // Setup rights for all roles referenced by project
323 $rids = $g->getRolesID() ;
324 $e = RBACEngine::getInstance();
325 $grs = $e->getGlobalRoles();
326 foreach ($grs as $r) {
327 $rids[] = $r->getID();
329 $rids = array_unique($rids);
331 foreach ($rids as $rid) {
332 $rs[] = $e->getRoleById($rid);
335 foreach ($rs as $r) {
336 $gr = FusionForgeRoleToMediawikiGroupName ($r, $g) ;
339 $wgGroupPermissions[$gr]['read'] = $r->hasPermission ('plugin_mediawiki_read', $g->getID()) ;
341 // Day-to-day edit privileges
342 $wgGroupPermissions[$gr]['edit'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editexisting') ;
343 $wgGroupPermissions[$gr]['writeapi'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editexisting') ;
344 $wgGroupPermissions[$gr]['createpage'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editnew') ;
345 $wgGroupPermissions[$gr]['createtalk'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editnew') ;
346 $wgGroupPermissions[$gr]['minoredit'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editnew') ;
347 $wgGroupPermissions[$gr]['move'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
348 $wgGroupPermissions[$gr]['move-subpages'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
349 $wgGroupPermissions[$gr]['move-rootuserpages'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
350 $wgGroupPermissions[$gr]['delete'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
351 $wgGroupPermissions[$gr]['undelete'] = $r->hasPermission ('plugin_mediawiki_edit', $g->getID(), 'editmove') ;
353 // File upload privileges
354 $wgGroupPermissions[$gr]['upload'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'upload') ;
355 $wgGroupPermissions[$gr]['reupload-own'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'upload') ;
356 $wgGroupPermissions[$gr]['reupload'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'reupload') ;
357 $wgGroupPermissions[$gr]['reupload-shared'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'reupload') ;
358 $wgGroupPermissions[$gr]['upload_by_url'] = $r->hasPermission ('plugin_mediawiki_upload', $g->getID(), 'reupload') ;
360 // Administrative tasks
361 $wgGroupPermissions[$gr]['editinterface'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
362 $wgGroupPermissions[$gr]['import'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
363 $wgGroupPermissions[$gr]['importupload'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
364 $wgGroupPermissions[$gr]['siteadmin'] = $r->hasPermission ('plugin_mediawiki_admin', $g->getID()) ;
366 // Interwiki management restricted to forge admins
367 $wgGroupPermissions[$gr]['interwiki'] = $r->hasGlobalPermission ('forge_admin') ;
371 function NoLinkOnMainPage(&$personal_urls){
372 unset($personal_urls['anonlogin']);
373 unset($personal_urls['anontalk']);
374 unset($personal_urls['logout']);
375 unset($personal_urls['login']);
378 $wgHooks['PersonalUrls'][]='NoLinkOnMainPage';
380 if (isset($_SERVER['SERVER_SOFTWARE'])) {
381 class SpecialForgeRedir extends SpecialPage {
382 var $dstappendself = false;
384 function getTitle($subpage="") {
385 return 'SpecialForgeRedir';
388 function getRedirect($subpage="") {
392 function getRedirectQuery() {
396 function getFullUrl() {
398 if ($this->dstappendself) {
399 $u .= urlencode(getStringFromServer('REQUEST_URI'));
401 return util_make_url($u);
405 class SpecialForgeRedirLogin extends SpecialForgeRedir {
406 var $dstappendself = true;
407 var $dst = '/account/login.php?return_to=';
410 class SpecialForgeRedirCreateAccount extends SpecialForgeRedir {
411 var $dst = '/account/register.php';
414 class SpecialForgeRedirResetPass extends SpecialForgeRedir {
415 var $dst = '/account/lostpw.php';
418 class SpecialForgeRedirLogout extends SpecialForgeRedir {
419 var $dstappendself = true;
420 var $dst = '/account/logout.php?return_to=';
423 function DisableLogInOut(&$mList) {
424 $mList['Userlogin'] = 'SpecialForgeRedirLogin';
425 $mList['CreateAccount'] = 'SpecialForgeRedirCreateAccount';
426 $mList['Resetpass'] = 'SpecialForgeRedirResetPass';
427 $mList['Userlogout'] = 'SpecialForgeRedirLogout';
430 $GLOBALS['wgHooks']['SpecialPage_initList'][] = 'DisableLogInOut';
433 $GLOBALS['wgHooks']['UserLoadFromSession'][]='FusionForgeMWAuth';
435 $zeroperms = array ('read', 'writeapi', 'edit', 'move-subpages', 'move-rootuserpages', 'reupload-shared', 'createaccount');
437 foreach ($zeroperms as $i) {
438 $wgGroupPermissions['user'][$i] = false;
439 $wgGroupPermissions['*'][$i] = false;
442 SetupPermissionsFromRoles();
444 $wgFavicon = '/images/icon.png' ;
445 $wgBreakFrames = false ;
446 ini_set ('memory_limit', '100M') ;
448 // LOAD THE SITE-WIDE AND PROJECT-SPECIFIC EXTRA-SETTINGS
449 if (is_file(forge_get_config('config_path')."/plugins/mediawiki/LocalSettings.php")) {
450 include(forge_get_config('config_path')."/plugins/mediawiki/LocalSettings.php");
453 // debian style system-wide mediawiki extensions
454 if (is_file("/etc/mediawiki-extensions/extensions.php")) {
455 include( "/etc/mediawiki-extensions/extensions.php" );
458 if (file_exists("$wgUploadDirectory/.wgLogo.png")) {
459 $wgLogo = "$wgScriptPath/images/.wgLogo.png";
462 // forge global settings
463 if (is_file("$gconfig_dir/ForgeSettings.php")) {
464 include ("$gconfig_dir/ForgeSettings.php") ;
466 // project specific settings
467 if (is_file("$project_dir/ProjectSettings.php")) {
468 include ("$project_dir/ProjectSettings.php") ;
473 // c-file-style: "bsd"
476 /* !isset($fusionforge_plugin_mediawiki_LocalSettings_included) */